diff src/popupwin.c @ 16986:03f3a9ca2770 v8.1.1493

patch 8.1.1493: redrawing with popups is slow and causes flicker commit https://github.com/vim/vim/commit/33796b39b9f00b42ca57fa00dbbb52316d9d38ff Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jun 8 16:01:13 2019 +0200 patch 8.1.1493: redrawing with popups is slow and causes flicker Problem: Redrawing with popups is slow and causes flicker. Solution: Avoid clearing and redrawing using a zindex mask.
author Bram Moolenaar <Bram@vim.org>
date Sat, 08 Jun 2019 16:15:04 +0200
parents df06694b761b
children 0f2663c087cd
line wrap: on
line diff
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -185,8 +185,12 @@ apply_options(win_T *wp, buf_T *buf UNUS
     get_pos_options(wp, dict);
 
     wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");
+    if (wp->w_zindex < 1)
+	wp->w_zindex = POPUPWIN_DEFAULT_ZINDEX;
+    if (wp->w_zindex > 32000)
+	wp->w_zindex = 32000;
 
-#if defined(FEAT_TIMERS)
+# if defined(FEAT_TIMERS)
     // Add timer to close the popup after some time.
     nr = dict_get_number(dict, (char_u *)"time");
     if (nr > 0)
@@ -204,7 +208,7 @@ apply_options(win_T *wp, buf_T *buf UNUS
 	    clear_tv(&tv);
 	}
     }
-#endif
+# endif
 
     // Option values resulting in setting an option.
     str = dict_get_string(dict, (char_u *)"highlight", FALSE);
@@ -330,6 +334,8 @@ apply_options(win_T *wp, buf_T *buf UNUS
 	else
 	    semsg(_(e_invarg2), tv_get_string(&di->di_tv));
     }
+
+    popup_mask_refresh = TRUE;
 }
 
 /*
@@ -435,6 +441,10 @@ popup_adjust_position(win_T *wp)
     int		left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3];
     int		extra_height = top_extra + bot_extra;
     int		extra_width = left_extra + right_extra;
+    int		org_winrow = wp->w_winrow;
+    int		org_wincol = wp->w_wincol;
+    int		org_width = wp->w_width;
+    int		org_height = wp->w_height;
 
     wp->w_winrow = 0;
     wp->w_wincol = 0;
@@ -554,6 +564,16 @@ popup_adjust_position(win_T *wp)
     }
 
     wp->w_popup_last_changedtick = CHANGEDTICK(wp->w_buffer);
+
+    // Need to update popup_mask if the position or size changed.
+    if (org_winrow != wp->w_winrow
+	    || org_wincol != wp->w_wincol
+	    || org_width != wp->w_width
+	    || org_height != wp->w_height)
+    {
+	redraw_all_later(NOT_VALID);
+	popup_mask_refresh = TRUE;
+    }
 }
 
 typedef enum
@@ -565,7 +585,7 @@ typedef enum
 /*
  * popup_create({text}, {options})
  * popup_atcursor({text}, {options})
- * When called from f_popup_atcursor() "atcursor" is TRUE.
+ * When called from f_popup_atcursor() "type" is TYPE_ATCURSOR.
  */
     static void
 popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
@@ -675,18 +695,18 @@ popup_create(typval_T *argvars, typval_T
 	set_moved_columns(wp, FIND_STRING);
     }
 
+    // set default values
+    wp->w_zindex = POPUPWIN_DEFAULT_ZINDEX;
+
     // Deal with options.
     apply_options(wp, buf, argvars[1].vval.v_dict);
 
-    // set default values
-    if (wp->w_zindex == 0)
-	wp->w_zindex = 50;
-
     popup_adjust_position(wp);
 
     wp->w_vsep_width = 0;
 
     redraw_all_later(NOT_VALID);
+    popup_mask_refresh = TRUE;
 }
 
 /*
@@ -815,6 +835,7 @@ f_popup_hide(typval_T *argvars, typval_T
 	wp->w_popup_flags |= POPF_HIDDEN;
 	--wp->w_buffer->b_nwindows;
 	redraw_all_later(NOT_VALID);
+	popup_mask_refresh = TRUE;
     }
 }
 
@@ -832,6 +853,7 @@ f_popup_show(typval_T *argvars, typval_T
 	wp->w_popup_flags &= ~POPF_HIDDEN;
 	++wp->w_buffer->b_nwindows;
 	redraw_all_later(NOT_VALID);
+	popup_mask_refresh = TRUE;
     }
 }
 
@@ -843,6 +865,7 @@ popup_free(win_T *wp)
 	clear_cmdline = TRUE;
     win_free_popup(wp);
     redraw_all_later(NOT_VALID);
+    popup_mask_refresh = TRUE;
 }
 
 /*
@@ -944,7 +967,6 @@ f_popup_move(typval_T *argvars, typval_T
     if (wp->w_winrow + wp->w_height >= cmdline_row)
 	clear_cmdline = TRUE;
     popup_adjust_position(wp);
-    redraw_all_later(NOT_VALID);
 }
 
 /*
@@ -984,7 +1006,7 @@ f_popup_getpos(typval_T *argvars, typval
 }
 
 /*
- * f_popup_getoptions({id})
+ * popup_getoptions({id})
  */
     void
 f_popup_getoptions(typval_T *argvars, typval_T *rettv)