changeset 16796:5f98d80d116a v8.1.1400

patch 8.1.1400: using global pointer for tab-local popups is clumsy commit https://github.com/vim/vim/commit/9c27b1c6d140ca824a78654c1cb70a43a69b4ec6 Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 26 18:48:13 2019 +0200 patch 8.1.1400: using global pointer for tab-local popups is clumsy Problem: Using global pointer for tab-local popups is clumsy. Solution: Use the pointer in tabpage_T.
author Bram Moolenaar <Bram@vim.org>
date Sun, 26 May 2019 19:00:04 +0200
parents 39a8595200a6
children 72e56d63f9d6
files src/eval.c src/globals.h src/popupwin.c src/screen.c src/version.c src/window.c
diffstat 6 files changed, 17 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -5589,12 +5589,8 @@ garbage_collect(int testing)
     for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
 	abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
 								  NULL, NULL);
-    for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next)
-	abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
-								  NULL, NULL);
     FOR_ALL_TABPAGES(tp)
-	if (tp != curtab)
-	    for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+	for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
 		abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
 								  NULL, NULL);
 #endif
@@ -8816,12 +8812,11 @@ find_win_by_nr(
     if (nr >= LOWEST_WIN_ID)
     {
 #ifdef FEAT_TEXT_PROP
-	// popup windows are in a separate list
-	for (wp = (tp == NULL || tp == curtab)
-		? first_tab_popupwin : tp->tp_first_popupwin;
-						   wp != NULL; wp = wp->w_next)
+	// check tab-local popup windows
+	for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
 	    if (wp->w_id == nr)
 		return wp;
+	// check global popup windows
 	for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
 	    if (wp->w_id == nr)
 		return wp;
--- a/src/globals.h
+++ b/src/globals.h
@@ -582,7 +582,6 @@ EXTERN win_T	*aucmd_win;	/* window used 
 EXTERN int	aucmd_win_used INIT(= FALSE);	/* aucmd_win is being used */
 
 #ifdef FEAT_TEXT_PROP
-EXTERN win_T    *first_tab_popupwin;	// first popup window local to tab page
 EXTERN win_T    *first_popupwin;	// first global popup window
 #endif
 
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -85,8 +85,8 @@ f_popup_create(typval_T *argvars, typval
     if (nr == 0)
     {
 	// popup on current tab
-	wp->w_next = first_tab_popupwin;
-	first_tab_popupwin = wp;
+	wp->w_next = curtab->tp_first_popupwin;
+	curtab->tp_first_popupwin = wp;
     }
     else if (nr < 0)
     {
@@ -212,13 +212,9 @@ popup_close(int id)
 popup_close_tabpage(tabpage_T *tp, int id)
 {
     win_T	*wp;
-    win_T	**root;
+    win_T	**root = &tp->tp_first_popupwin;
     win_T	*prev = NULL;
 
-    if (tp == curtab)
-	root = &first_tab_popupwin;
-    else
-	root = &tp->tp_first_popupwin;
     for (wp = *root; wp != NULL; prev = wp, wp = wp->w_next)
 	if (wp->w_id == id)
 	{
@@ -237,8 +233,8 @@ close_all_popups(void)
 {
     while (first_popupwin != NULL)
 	popup_close(first_popupwin->w_id);
-    while (first_tab_popupwin != NULL)
-	popup_close(first_tab_popupwin->w_id);
+    while (curtab->tp_first_popupwin != NULL)
+	popup_close(curtab->tp_first_popupwin->w_id);
 }
 
     void
--- a/src/screen.c
+++ b/src/screen.c
@@ -610,7 +610,7 @@ update_screen(int type_arg)
     }
 #ifdef FEAT_TEXT_PROP
     // TODO: avoid redrawing everything when there is a popup window.
-    if (first_popupwin != NULL || first_tab_popupwin != NULL)
+    if (first_popupwin != NULL || curtab->tp_first_popupwin != NULL)
 	type = NOT_VALID;
 #endif
 
@@ -1000,7 +1000,7 @@ update_popups(void)
     // Reset all the VALID_POPUP flags.
     for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
 	wp->w_valid &= ~VALID_POPUP;
-    for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next)
+    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
 	wp->w_valid &= ~VALID_POPUP;
 
     // TODO: don't redraw every popup every time.
@@ -1018,7 +1018,7 @@ update_popups(void)
 		lowest_zindex = wp->w_zindex;
 		lowest_wp = wp;
 	    }
-	for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next)
+	for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
 	    if ((wp->w_valid & VALID_POPUP) == 0
 					       && wp->w_zindex < lowest_zindex)
 	    {
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1400,
+/**/
     1399,
 /**/
     1398,
--- a/src/window.c
+++ b/src/window.c
@@ -1371,7 +1371,7 @@ win_valid_popup(win_T *win UNUSED)
     for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
 	if (wp == win)
 	    return TRUE;
-    for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next)
+    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
 	if (wp == win)
 	    return TRUE;
 #endif
@@ -3673,13 +3673,8 @@ free_tabpage(tabpage_T *tp)
     {
 	win_T *wp;
 
-	for (;;)
-	{
-	    wp = tp == curtab ? first_tab_popupwin : tp->tp_first_popupwin;
-	    if (wp == NULL)
-		break;
-	    popup_close_tabpage(tp, wp->w_id);
-	}
+	while (tp->tp_first_popupwin != NULL)
+	    popup_close_tabpage(tp, tp->tp_first_popupwin->w_id);
     }
 #endif
     for (idx = 0; idx < SNAP_COUNT; ++idx)
@@ -3973,10 +3968,6 @@ leave_tabpage(
     tp->tp_prevwin = prevwin;
     tp->tp_firstwin = firstwin;
     tp->tp_lastwin = lastwin;
-#ifdef FEAT_TEXT_PROP
-    tp->tp_first_popupwin = first_tab_popupwin;
-    first_tab_popupwin = NULL;
-#endif
     tp->tp_old_Rows = Rows;
     tp->tp_old_Columns = Columns;
     firstwin = NULL;
@@ -4004,9 +3995,6 @@ enter_tabpage(
     firstwin = tp->tp_firstwin;
     lastwin = tp->tp_lastwin;
     topframe = tp->tp_topframe;
-#ifdef FEAT_TEXT_PROP
-    first_tab_popupwin = tp->tp_first_popupwin;
-#endif
 
     /* We would like doing the TabEnter event first, but we don't have a
      * valid current window yet, which may break some commands.
@@ -6513,15 +6501,9 @@ switch_win(
 	{
 	    curtab->tp_firstwin = firstwin;
 	    curtab->tp_lastwin = lastwin;
-#ifdef FEAT_TEXT_PROP
-	    curtab->tp_first_popupwin = first_tab_popupwin ;
-#endif
 	    curtab = tp;
 	    firstwin = curtab->tp_firstwin;
 	    lastwin = curtab->tp_lastwin;
-#ifdef FEAT_TEXT_PROP
-	    first_tab_popupwin = curtab->tp_first_popupwin;
-#endif
 	}
 	else
 	    goto_tabpage_tp(tp, FALSE, FALSE);
@@ -6550,15 +6532,9 @@ restore_win(
 	{
 	    curtab->tp_firstwin = firstwin;
 	    curtab->tp_lastwin = lastwin;
-#ifdef FEAT_TEXT_PROP
-	    curtab->tp_first_popupwin = first_tab_popupwin ;
-#endif
 	    curtab = save_curtab;
 	    firstwin = curtab->tp_firstwin;
 	    lastwin = curtab->tp_lastwin;
-#ifdef FEAT_TEXT_PROP
-	    first_tab_popupwin = curtab->tp_first_popupwin;
-#endif
 	}
 	else
 	    goto_tabpage_tp(save_curtab, FALSE, FALSE);