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.
diff --git a/src/eval.c b/src/eval.c
index fb417c8..7fbd770 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -5589,12 +5589,8 @@
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 @@
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;
diff --git a/src/globals.h b/src/globals.h
index 7d250f4..43ad8e9 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -582,7 +582,6 @@
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
diff --git a/src/popupwin.c b/src/popupwin.c
index 294f3b1..5439c64 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -85,8 +85,8 @@
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_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 @@
{
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
diff --git a/src/screen.c b/src/screen.c
index 00894ce..30e1bb2 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -610,7 +610,7 @@
}
#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 @@
// 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 @@
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)
{
diff --git a/src/version.c b/src/version.c
index 78a932e..4f87663 100644
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1400,
+/**/
1399,
/**/
1398,
diff --git a/src/window.c b/src/window.c
index ffff756..bc8dac0 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1371,7 +1371,7 @@
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 @@
{
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 @@
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 @@
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 @@
{
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 @@
{
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);