]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.964 v7.3.964
authorBram Moolenaar <Bram@vim.org>
Fri, 17 May 2013 14:18:33 +0000 (16:18 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 17 May 2013 14:18:33 +0000 (16:18 +0200)
Problem:    Python: not so easy to access tab pages.
Solution:   Add window.tabpage, make window.number work with non-current tab
            pages. (ZyX)

runtime/doc/if_pyth.txt
src/if_py_both.h
src/if_python.c
src/if_python3.c
src/testdir/test86.ok
src/testdir/test87.ok
src/version.c

index c560367442ea5e8252d3dbe3d9b45a9d07557f9a..051dfacaf33a99b39e000008ae9d1df4b581003a 100644 (file)
@@ -433,8 +433,9 @@ Window attributes are:
                                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.
+       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,7 +491,7 @@ if the `:py3` command is working: >
 <                                                      *:py3file*
 The |:py3file| command works similar to |:pyfile|.
 
-                                                       *:py3do*
+                                                       *: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
index 9539943edee46b3184afa1aec52aeb04092722f7..f78391c9f3789f55fc16242f30fe8d642c835ec4 100644 (file)
@@ -31,6 +31,9 @@ typedef int Py_ssize_t;  /* Python 2.4 and earlier don't have this type. */
 
 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,9 +1673,9 @@ TabPageAttr(TabPageObject *this, char *name)
        /* For current tab window.c does not bother to set or update tp_curwin
         */
        if (this->tab == curtab)
-           return WindowNew(curwin);
+           return WindowNew(curwin, curtab);
        else
-           return WindowNew(this->tab->tp_curwin);
+           return WindowNew(this->tab->tp_curwin, this->tab);
     }
     return NULL;
 }
@@ -1754,6 +1757,7 @@ typedef struct
 {
     PyObject_HEAD
     win_T      *win;
+    TabPageObject      *tabObject;
 } WindowObject;
 
 static PyTypeObject WindowType;
@@ -1771,7 +1775,7 @@ CheckWindow(WindowObject *this)
 }
 
     static PyObject *
-WindowNew(win_T *win)
+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,6 +1808,8 @@ WindowNew(win_T *win)
        WIN_PYTHON_REF(win) = self;
     }
 
+    self->tabObject = ((TabPageObject *)(TabPageNew(tab)));
+
     return (PyObject *)(self);
 }
 
@@ -1815,9 +1821,29 @@ WindowDestructor(PyObject *self)
     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,10 +1873,20 @@ WindowAttr(WindowObject *this, char *name)
        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));
+    {
+       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("[ssssssss]", "buffer", "cursor", "height", "vars",
-               "options", "number", "row", "col");
+       return Py_BuildValue("[sssssssss]", "buffer", "cursor", "height",
+               "vars", "options", "number", "row", "col", "tabpage");
     else
        return NULL;
 }
@@ -2016,31 +2052,13 @@ WinListDestructor(PyObject *self)
     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))))
+    if (!(w = get_firstwin(((WinListObject *)(self))->tabObject)))
        return -1;
 
     while (w != NULL)
@@ -2055,14 +2073,15 @@ WinListLength(PyObject *self)
     static PyObject *
 WinListItem(PyObject *self, PyInt n)
 {
+    WinListObject      *this = ((WinListObject *)(self));
     win_T *w;
 
-    if (!(w = get_firstwin((WinListObject *)(self))))
+    if (!(w = get_firstwin(this->tabObject)))
        return NULL;
 
     for (; w != NULL; w = W_NEXT(w), --n)
        if (n == 0)
-           return WindowNew(w);
+           return WindowNew(w, this->tabObject? this->tabObject->tab: curtab);
 
     PyErr_SetString(PyExc_IndexError, _("no such window"));
     return NULL;
@@ -3227,7 +3246,7 @@ CurrentGetattr(PyObject *self UNUSED, char *name)
     if (strcmp(name, "buffer") == 0)
        return (PyObject *)BufferNew(curbuf);
     else if (strcmp(name, "window") == 0)
-       return (PyObject *)WindowNew(curwin);
+       return (PyObject *)WindowNew(curwin, curtab);
     else if (strcmp(name, "tabpage") == 0)
        return (PyObject *)TabPageNew(curtab);
     else if (strcmp(name, "line") == 0)
index 134e7f932691b4d82fdcdc2cc1cda7bc3093978c..baa8cab878112633d866626a63a03eb9feba786e 100644 (file)
@@ -610,11 +610,6 @@ get_exceptions(void)
 }
 #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
 
index 18987b7aa89bb7b0ff0c2f3e491c2b589694ee5f..7ceb13d932d01c08590f24f21481652e2281be8b 100644 (file)
@@ -611,9 +611,6 @@ get_py3_exceptions()
 }
 #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;
index 2f0d496efdaed5623d7a72898e1975266a1a1334..8defc5a0c756027e105d22e7fbbbec9769864d8d 100644 (file)
@@ -333,14 +333,14 @@ Number of tabs: 4
 Current tab pages:
   <tabpage 0>(1): 1 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(0): displays buffer <buffer test86.in>; cursor is at (954, 0)
+    <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (954, 0)
   <tabpage 1>(2): 1 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(0): displays buffer <buffer 0>; cursor is at (1, 0)
+    <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
   <tabpage 2>(3): 2 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(0): displays buffer <buffer a.1>; cursor is at (1, 0)
-    <window object (unknown)>(0): displays buffer <buffer 1>; cursor is at (1, 0)
+    <window object (unknown)>(1): displays buffer <buffer a.1>; cursor is at (1, 0)
+    <window object (unknown)>(2): displays buffer <buffer 1>; cursor is at (1, 0)
   <tabpage 3>(4): 4 windows, current is <window 0>
   Windows:
     <window 0>(1): displays buffer <buffer c.2>; cursor is at (1, 0)
index 6997b7a32027e4f9ba699005b69e4d38ced56a1e..ccf4a6cf63bf8ba30c9ad832ea1115f8a706b6ed 100644 (file)
@@ -322,14 +322,14 @@ Number of tabs: 4
 Current tab pages:
   <tabpage 0>(1): 1 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(0): displays buffer <buffer test87.in>; cursor is at (930, 0)
+    <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (930, 0)
   <tabpage 1>(2): 1 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(0): displays buffer <buffer 0>; cursor is at (1, 0)
+    <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
   <tabpage 2>(3): 2 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(0): displays buffer <buffer a.1>; cursor is at (1, 0)
-    <window object (unknown)>(0): displays buffer <buffer 1>; cursor is at (1, 0)
+    <window object (unknown)>(1): displays buffer <buffer a.1>; cursor is at (1, 0)
+    <window object (unknown)>(2): displays buffer <buffer 1>; cursor is at (1, 0)
   <tabpage 3>(4): 4 windows, current is <window 0>
   Windows:
     <window 0>(1): displays buffer <buffer c.2>; cursor is at (1, 0)
index b20a4f596d147a701826ceef723e1b042fb7f341..4fc77b200cbd495d0a777fe70c17b81c4ce73797 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    964,
 /**/
     963,
 /**/