# HG changeset patch # User Bram Moolenaar # Date 1368378041 -7200 # Node ID a2f03b41dca7024da5e702d016ae52fe7f51594c # Parent b6df5640cd64d0af25b778ecc88b37c5a9653c7f updated for version 7.3.938 Problem: Python: not easy to get to window number. Solution: Add vim.window.number. (ZyX) diff --git a/runtime/doc/if_pyth.txt b/runtime/doc/if_pyth.txt --- a/runtime/doc/if_pyth.txt +++ b/runtime/doc/if_pyth.txt @@ -396,6 +396,10 @@ Window attributes are: |python-options|. If option is |global-local| and local value is missing getting it will return None. + number (read-only) Window number. The first window has number 1. + This is zero in case it cannot be determined + (e.g. when the window object belongs to other + 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. diff --git a/src/if_py_both.h b/src/if_py_both.h --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -1848,9 +1848,11 @@ WindowAttr(WindowObject *this, char *nam else if (strcmp(name, "options") == 0) 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)); else if (strcmp(name,"__members__") == 0) return Py_BuildValue("[ssssss]", "buffer", "cursor", "height", "vars", - "options"); + "options", "number"); else return NULL; } @@ -1974,17 +1976,13 @@ WindowRepr(PyObject *self) } else { - int i = 0; - win_T *w; - - for (w = firstwin; w != NULL && w != this->win; w = W_NEXT(w)) - ++i; - - if (w == NULL) + int w = get_win_number(this->win); + + if (w == 0) vim_snprintf(repr, 100, _(""), (self)); else - vim_snprintf(repr, 100, _(""), i); + vim_snprintf(repr, 100, _(""), w - 1); return PyString_FromString(repr); } diff --git a/src/proto/window.pro b/src/proto/window.pro --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -74,4 +74,5 @@ int match_add __ARGS((win_T *wp, char_u int match_delete __ARGS((win_T *wp, int id, int perr)); void clear_matches __ARGS((win_T *wp)); matchitem_T *get_match __ARGS((win_T *wp, int id)); +int get_win_number __ARGS((win_T *wp)); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 938, +/**/ 937, /**/ 936, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -6731,3 +6731,20 @@ get_match(wp, id) return cur; } #endif + +#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) || defined(PROTO) + int +get_win_number(win_T *wp) +{ + int i = 1; + win_T *w; + + for (w = firstwin; w != NULL && w != wp; w = W_NEXT(w)) + ++i; + + if (w == NULL) + return 0; + else + return i; +} +#endif