# HG changeset patch # User Bram Moolenaar # Date 1558890004 -7200 # Node ID 5f98d80d116ab6d9b58d32e1d68463479a426714 # Parent 39a8595200a613b3c5cdeb58834e356ff48334e9 patch 8.1.1400: using global pointer for tab-local popups is clumsy commit https://github.com/vim/vim/commit/9c27b1c6d140ca824a78654c1cb70a43a69b4ec6 Author: Bram Moolenaar 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. diff --git a/src/eval.c b/src/eval.c --- 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; diff --git a/src/globals.h b/src/globals.h --- 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 diff --git a/src/popupwin.c b/src/popupwin.c --- 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 diff --git a/src/screen.c b/src/screen.c --- 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) { diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/window.c b/src/window.c --- 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);