diff --git a/7.3.964 b/7.3.964 new file mode 100644 index 0000000..e037ad7 --- /dev/null +++ b/7.3.964 @@ -0,0 +1,405 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.964 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.964 +Problem: Python: not so easy to access tab pages. +Solution: Add window.tabpage, make window.number work with non-current tab + pages. (ZyX) +Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python3.c, + src/if_python.c, src/testdir/test86.ok, src/testdir/test87.ok + + +*** ../vim-7.3.963/runtime/doc/if_pyth.txt 2013-05-15 18:28:08.000000000 +0200 +--- runtime/doc/if_pyth.txt 2013-05-17 16:07:16.000000000 +0200 +*************** +*** 433,440 **** + This is zero in case it cannot be determined + (e.g. when the window object belongs to other + tab page). +! row, col (read-only) On-screen window position in display cells. + First position is zero. + + The height attribute is writable only if the screen is split horizontally. + The width attribute is writable only if the screen is split vertically. +--- 433,441 ---- + This is zero in case it cannot be determined + (e.g. when the window object belongs to other + tab page). +! row, col (read-only) On-screen window position in display cells. + First position is zero. ++ tabpage (read-only) Window tab page. + + The height attribute is writable only if the screen is split horizontally. + The width attribute is writable only if the screen is split vertically. +*************** +*** 490,496 **** + < *:py3file* + The |:py3file| command works similar to |:pyfile|. + +! *:py3do* + :[range]py3do {body} Execute Python function "def _vim_pydo(line, linenr): + {body}" for each line in the [range], with the + function arguments being set to the text of each line +--- 491,497 ---- + < *:py3file* + The |:py3file| command works similar to |:pyfile|. + +! *:py3do* *E863* + :[range]py3do {body} Execute Python function "def _vim_pydo(line, linenr): + {body}" for each line in the [range], with the + function arguments being set to the text of each line +*** ../vim-7.3.963/src/if_py_both.h 2013-05-17 16:03:53.000000000 +0200 +--- src/if_py_both.h 2013-05-17 16:07:16.000000000 +0200 +*************** +*** 31,36 **** +--- 31,39 ---- + + static int ConvertFromPyObject(PyObject *, typval_T *); + static int _ConvertFromPyObject(PyObject *, typval_T *, PyObject *); ++ static PyObject *WindowNew(win_T *, tabpage_T *); ++ static PyObject *BufferNew (buf_T *); ++ static PyObject *LineToString(const char *); + + static PyInt RangeStart; + static PyInt RangeEnd; +*************** +*** 1670,1678 **** + /* For current tab window.c does not bother to set or update tp_curwin + */ + if (this->tab == curtab) +! return WindowNew(curwin); + else +! return WindowNew(this->tab->tp_curwin); + } + return NULL; + } +--- 1673,1681 ---- + /* For current tab window.c does not bother to set or update tp_curwin + */ + if (this->tab == curtab) +! return WindowNew(curwin, curtab); + else +! return WindowNew(this->tab->tp_curwin, this->tab); + } + return NULL; + } +*************** +*** 1754,1759 **** +--- 1757,1763 ---- + { + PyObject_HEAD + win_T *win; ++ TabPageObject *tabObject; + } WindowObject; + + static PyTypeObject WindowType; +*************** +*** 1771,1777 **** + } + + static PyObject * +! WindowNew(win_T *win) + { + /* We need to handle deletion of windows underneath us. + * If we add a "w_python*_ref" field to the win_T structure, +--- 1775,1781 ---- + } + + static PyObject * +! WindowNew(win_T *win, tabpage_T *tab) + { + /* We need to handle deletion of windows underneath us. + * If we add a "w_python*_ref" field to the win_T structure, +*************** +*** 1804,1809 **** +--- 1808,1815 ---- + WIN_PYTHON_REF(win) = self; + } + ++ self->tabObject = ((TabPageObject *)(TabPageNew(tab))); ++ + return (PyObject *)(self); + } + +*************** +*** 1815,1823 **** +--- 1821,1849 ---- + if (this->win && this->win != INVALID_WINDOW_VALUE) + WIN_PYTHON_REF(this->win) = NULL; + ++ Py_DECREF(((PyObject *)(this->tabObject))); ++ + DESTRUCTOR_FINISH(self); + } + ++ static win_T * ++ get_firstwin(TabPageObject *tabObject) ++ { ++ if (tabObject) ++ { ++ if (CheckTabPage(tabObject)) ++ return NULL; ++ /* For current tab window.c does not bother to set or update tp_firstwin ++ */ ++ else if (tabObject->tab == curtab) ++ return firstwin; ++ else ++ return tabObject->tab->tp_firstwin; ++ } ++ else ++ return firstwin; ++ } ++ + static PyObject * + WindowAttr(WindowObject *this, char *name) + { +*************** +*** 1847,1856 **** + return OptionsNew(SREQ_WIN, this->win, (checkfun) CheckWindow, + (PyObject *) this); + else if (strcmp(name, "number") == 0) +! return PyLong_FromLong((long) get_win_number(this->win, firstwin)); + else if (strcmp(name,"__members__") == 0) +! return Py_BuildValue("[ssssssss]", "buffer", "cursor", "height", "vars", +! "options", "number", "row", "col"); + else + return NULL; + } +--- 1873,1892 ---- + return OptionsNew(SREQ_WIN, this->win, (checkfun) CheckWindow, + (PyObject *) this); + else if (strcmp(name, "number") == 0) +! { +! if (CheckTabPage(this->tabObject)) +! return NULL; +! return PyLong_FromLong((long) +! get_win_number(this->win, get_firstwin(this->tabObject))); +! } +! else if (strcmp(name, "tabpage") == 0) +! { +! Py_INCREF(this->tabObject); +! return (PyObject *)(this->tabObject); +! } + else if (strcmp(name,"__members__") == 0) +! return Py_BuildValue("[sssssssss]", "buffer", "cursor", "height", +! "vars", "options", "number", "row", "col", "tabpage"); + else + return NULL; + } +*************** +*** 2016,2046 **** + DESTRUCTOR_FINISH(self); + } + +- static win_T * +- get_firstwin(WinListObject *this) +- { +- if (this->tabObject) +- { +- if (CheckTabPage(this->tabObject)) +- return NULL; +- /* For current tab window.c does not bother to set or update tp_firstwin +- */ +- else if (this->tabObject->tab == curtab) +- return firstwin; +- else +- return this->tabObject->tab->tp_firstwin; +- } +- else +- return firstwin; +- } +- + static PyInt + WinListLength(PyObject *self) + { + win_T *w; + PyInt n = 0; + +! if (!(w = get_firstwin((WinListObject *)(self)))) + return -1; + + while (w != NULL) +--- 2052,2064 ---- + DESTRUCTOR_FINISH(self); + } + + static PyInt + WinListLength(PyObject *self) + { + win_T *w; + PyInt n = 0; + +! if (!(w = get_firstwin(((WinListObject *)(self))->tabObject))) + return -1; + + while (w != NULL) +*************** +*** 2055,2068 **** + static PyObject * + WinListItem(PyObject *self, PyInt n) + { + win_T *w; + +! if (!(w = get_firstwin((WinListObject *)(self)))) + return NULL; + + for (; w != NULL; w = W_NEXT(w), --n) + if (n == 0) +! return WindowNew(w); + + PyErr_SetString(PyExc_IndexError, _("no such window")); + return NULL; +--- 2073,2087 ---- + static PyObject * + WinListItem(PyObject *self, PyInt n) + { ++ WinListObject *this = ((WinListObject *)(self)); + win_T *w; + +! if (!(w = get_firstwin(this->tabObject))) + return NULL; + + for (; w != NULL; w = W_NEXT(w), --n) + if (n == 0) +! return WindowNew(w, this->tabObject? this->tabObject->tab: curtab); + + PyErr_SetString(PyExc_IndexError, _("no such window")); + return NULL; +*************** +*** 3227,3233 **** + if (strcmp(name, "buffer") == 0) + return (PyObject *)BufferNew(curbuf); + else if (strcmp(name, "window") == 0) +! return (PyObject *)WindowNew(curwin); + else if (strcmp(name, "tabpage") == 0) + return (PyObject *)TabPageNew(curtab); + else if (strcmp(name, "line") == 0) +--- 3246,3252 ---- + if (strcmp(name, "buffer") == 0) + return (PyObject *)BufferNew(curbuf); + else if (strcmp(name, "window") == 0) +! return (PyObject *)WindowNew(curwin, curtab); + else if (strcmp(name, "tabpage") == 0) + return (PyObject *)TabPageNew(curtab); + else if (strcmp(name, "line") == 0) +*** ../vim-7.3.963/src/if_python3.c 2013-05-15 19:44:35.000000000 +0200 +--- src/if_python3.c 2013-05-17 16:07:16.000000000 +0200 +*************** +*** 611,619 **** + } + #endif /* DYNAMIC_PYTHON3 */ + +- static PyObject *BufferNew (buf_T *); +- static PyObject *WindowNew(win_T *); +- static PyObject *LineToString(const char *); + static PyObject *BufferDir(PyObject *, PyObject *); + + static int py3initialised = 0; +--- 611,616 ---- +*** ../vim-7.3.963/src/if_python.c 2013-05-15 17:49:00.000000000 +0200 +--- src/if_python.c 2013-05-17 16:07:16.000000000 +0200 +*************** +*** 610,620 **** + } + #endif /* DYNAMIC_PYTHON */ + +- static PyObject *BufferNew (buf_T *); +- static PyObject *WindowNew(win_T *); +- static PyObject *DictionaryNew(dict_T *); +- static PyObject *LineToString(const char *); +- + static int initialised = 0; + #define PYINITIALISED initialised + +--- 610,615 ---- +*** ../vim-7.3.963/src/testdir/test86.ok 2013-05-17 16:03:53.000000000 +0200 +--- src/testdir/test86.ok 2013-05-17 16:10:26.000000000 +0200 +*************** +*** 333,346 **** + Current tab pages: + (1): 1 windows, current is + Windows: +! (0): displays buffer ; cursor is at (954, 0) + (2): 1 windows, current is + Windows: +! (0): displays buffer ; cursor is at (1, 0) + (3): 2 windows, current is + Windows: +! (0): displays buffer ; cursor is at (1, 0) +! (0): displays buffer ; cursor is at (1, 0) + (4): 4 windows, current is + Windows: + (1): displays buffer ; cursor is at (1, 0) +--- 333,346 ---- + Current tab pages: + (1): 1 windows, current is + Windows: +! (1): displays buffer ; cursor is at (954, 0) + (2): 1 windows, current is + Windows: +! (1): displays buffer ; cursor is at (1, 0) + (3): 2 windows, current is + Windows: +! (1): displays buffer ; cursor is at (1, 0) +! (2): displays buffer ; cursor is at (1, 0) + (4): 4 windows, current is + Windows: + (1): displays buffer ; cursor is at (1, 0) +*** ../vim-7.3.963/src/testdir/test87.ok 2013-05-17 13:37:57.000000000 +0200 +--- src/testdir/test87.ok 2013-05-17 16:07:16.000000000 +0200 +*************** +*** 322,335 **** + Current tab pages: + (1): 1 windows, current is + Windows: +! (0): displays buffer ; cursor is at (930, 0) + (2): 1 windows, current is + Windows: +! (0): displays buffer ; cursor is at (1, 0) + (3): 2 windows, current is + Windows: +! (0): displays buffer ; cursor is at (1, 0) +! (0): displays buffer ; cursor is at (1, 0) + (4): 4 windows, current is + Windows: + (1): displays buffer ; cursor is at (1, 0) +--- 322,335 ---- + Current tab pages: + (1): 1 windows, current is + Windows: +! (1): displays buffer ; cursor is at (930, 0) + (2): 1 windows, current is + Windows: +! (1): displays buffer ; cursor is at (1, 0) + (3): 2 windows, current is + Windows: +! (1): displays buffer ; cursor is at (1, 0) +! (2): displays buffer ; cursor is at (1, 0) + (4): 4 windows, current is + Windows: + (1): displays buffer ; cursor is at (1, 0) +*** ../vim-7.3.963/src/version.c 2013-05-17 16:03:53.000000000 +0200 +--- src/version.c 2013-05-17 16:11:15.000000000 +0200 +*************** +*** 730,731 **** +--- 730,733 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 964, + /**/ + +-- +ARTHUR: Go on, Bors, chop its head off. +BORS: Right. Silly little bleeder. One rabbit stew coming up. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///