To: vim_dev@googlegroups.com
Subject: Patch 7.3.964
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
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:
    <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)
    <tabpage 1>(2): 1 windows, current is <window object (unknown)>
    Windows:
!     <window object (unknown)>(0): 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)
    <tabpage 3>(4): 4 windows, current is <window 0>
    Windows:
      <window 0>(1): displays buffer <buffer c.2>; cursor is at (1, 0)
--- 333,346 ----
  Current tab pages:
    <tabpage 0>(1): 1 windows, current is <window object (unknown)>
    Windows:
!     <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)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
    <tabpage 2>(3): 2 windows, current is <window object (unknown)>
    Windows:
!     <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)
*** ../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:
    <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)
    <tabpage 1>(2): 1 windows, current is <window object (unknown)>
    Windows:
!     <window object (unknown)>(0): 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)
    <tabpage 3>(4): 4 windows, current is <window 0>
    Windows:
      <window 0>(1): displays buffer <buffer c.2>; cursor is at (1, 0)
--- 322,335 ----
  Current tab pages:
    <tabpage 0>(1): 1 windows, current is <window object (unknown)>
    Windows:
!     <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)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
    <tabpage 2>(3): 2 windows, current is <window object (unknown)>
    Windows:
!     <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)
*** ../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    ///
