diff --git a/runtime/doc/if_pyth.txt b/runtime/doc/if_pyth.txt index a6bb55c82b..bf21f8cc49 100644 --- 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 index cf0f50b053..f8b51b7a32 100644 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -1848,9 +1848,11 @@ WindowAttr(WindowObject *this, char *name) 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; + int w = get_win_number(this->win); - for (w = firstwin; w != NULL && w != this->win; w = W_NEXT(w)) - ++i; - - if (w == NULL) + 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 index 0a7448927a..a77da59c25 100644 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -74,4 +74,5 @@ int match_add __ARGS((win_T *wp, char_u *grp, char_u *pat, int prio, int id)); 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 index 884b5c6c50..f6d3840d84 100644 --- a/src/version.c +++ b/src/version.c @@ -728,6 +728,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 938, /**/ 937, /**/ diff --git a/src/window.c b/src/window.c index 4616c803d4..035471490b 100644 --- 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