summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-05-17 16:18:33 +0200
committerBram Moolenaar <Bram@vim.org>2013-05-17 16:18:33 +0200
commitcabf80ff2f20ff6e7da237daf8c2a0cc358592eb (patch)
tree55c18c253da96281fc7a8612e349094facb300b8
parent105bc355a6713b5c09b52776bf8f92a15a81f49c (diff)
updated for version 7.3.964v7.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)
-rw-r--r--runtime/doc/if_pyth.txt5
-rw-r--r--src/if_py_both.h75
-rw-r--r--src/if_python.c5
-rw-r--r--src/if_python3.c3
-rw-r--r--src/testdir/test86.ok8
-rw-r--r--src/testdir/test87.ok8
-rw-r--r--src/version.c2
7 files changed, 60 insertions, 46 deletions
diff --git a/runtime/doc/if_pyth.txt b/runtime/doc/if_pyth.txt
index c560367442..051dfacaf3 100644
--- a/runtime/doc/if_pyth.txt
+++ b/runtime/doc/if_pyth.txt
@@ -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
diff --git a/src/if_py_both.h b/src/if_py_both.h
index 9539943ede..f78391c9f3 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -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)
diff --git a/src/if_python.c b/src/if_python.c
index 134e7f9326..baa8cab878 100644
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -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
diff --git a/src/if_python3.c b/src/if_python3.c
index 18987b7aa8..7ceb13d932 100644
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -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;
diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok
index 2f0d496efd..8defc5a0c7 100644
--- a/src/testdir/test86.ok
+++ b/src/testdir/test86.ok
@@ -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)
diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok
index 6997b7a320..ccf4a6cf63 100644
--- a/src/testdir/test87.ok
+++ b/src/testdir/test87.ok
@@ -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)
diff --git a/src/version.c b/src/version.c
index b20a4f596d..4fc77b200c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 964,
+/**/
963,
/**/
962,