comparison 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
comparison
equal deleted inserted replaced
16985:914898e347fe 16986:03f3a9ca2770
183 wp->w_maxheight = dict_get_number(dict, (char_u *)"maxheight"); 183 wp->w_maxheight = dict_get_number(dict, (char_u *)"maxheight");
184 184
185 get_pos_options(wp, dict); 185 get_pos_options(wp, dict);
186 186
187 wp->w_zindex = dict_get_number(dict, (char_u *)"zindex"); 187 wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");
188 188 if (wp->w_zindex < 1)
189 #if defined(FEAT_TIMERS) 189 wp->w_zindex = POPUPWIN_DEFAULT_ZINDEX;
190 if (wp->w_zindex > 32000)
191 wp->w_zindex = 32000;
192
193 # if defined(FEAT_TIMERS)
190 // Add timer to close the popup after some time. 194 // Add timer to close the popup after some time.
191 nr = dict_get_number(dict, (char_u *)"time"); 195 nr = dict_get_number(dict, (char_u *)"time");
192 if (nr > 0) 196 if (nr > 0)
193 { 197 {
194 char_u cbbuf[50]; 198 char_u cbbuf[50];
202 wp->w_popup_timer = create_timer(nr, 0); 206 wp->w_popup_timer = create_timer(nr, 0);
203 wp->w_popup_timer->tr_callback = get_callback(&tv); 207 wp->w_popup_timer->tr_callback = get_callback(&tv);
204 clear_tv(&tv); 208 clear_tv(&tv);
205 } 209 }
206 } 210 }
207 #endif 211 # endif
208 212
209 // Option values resulting in setting an option. 213 // Option values resulting in setting an option.
210 str = dict_get_string(dict, (char_u *)"highlight", FALSE); 214 str = dict_get_string(dict, (char_u *)"highlight", FALSE);
211 if (str != NULL) 215 if (str != NULL)
212 set_string_option_direct_in_win(wp, (char_u *)"wincolor", -1, 216 set_string_option_direct_in_win(wp, (char_u *)"wincolor", -1,
328 wp->w_popup_maxcol = tv_get_number(&l->lv_first->li_next->li_tv); 332 wp->w_popup_maxcol = tv_get_number(&l->lv_first->li_next->li_tv);
329 } 333 }
330 else 334 else
331 semsg(_(e_invarg2), tv_get_string(&di->di_tv)); 335 semsg(_(e_invarg2), tv_get_string(&di->di_tv));
332 } 336 }
337
338 popup_mask_refresh = TRUE;
333 } 339 }
334 340
335 /* 341 /*
336 * Add lines to the popup from a list of strings. 342 * Add lines to the popup from a list of strings.
337 */ 343 */
433 int right_extra = wp->w_popup_border[1] + wp->w_popup_padding[1]; 439 int right_extra = wp->w_popup_border[1] + wp->w_popup_padding[1];
434 int bot_extra = wp->w_popup_border[2] + wp->w_popup_padding[2]; 440 int bot_extra = wp->w_popup_border[2] + wp->w_popup_padding[2];
435 int left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3]; 441 int left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3];
436 int extra_height = top_extra + bot_extra; 442 int extra_height = top_extra + bot_extra;
437 int extra_width = left_extra + right_extra; 443 int extra_width = left_extra + right_extra;
444 int org_winrow = wp->w_winrow;
445 int org_wincol = wp->w_wincol;
446 int org_width = wp->w_width;
447 int org_height = wp->w_height;
438 448
439 wp->w_winrow = 0; 449 wp->w_winrow = 0;
440 wp->w_wincol = 0; 450 wp->w_wincol = 0;
441 if (wp->w_popup_pos == POPPOS_CENTER) 451 if (wp->w_popup_pos == POPPOS_CENTER)
442 { 452 {
552 // not enough space, make top aligned 562 // not enough space, make top aligned
553 wp->w_winrow = wp->w_wantline + 1; 563 wp->w_winrow = wp->w_wantline + 1;
554 } 564 }
555 565
556 wp->w_popup_last_changedtick = CHANGEDTICK(wp->w_buffer); 566 wp->w_popup_last_changedtick = CHANGEDTICK(wp->w_buffer);
567
568 // Need to update popup_mask if the position or size changed.
569 if (org_winrow != wp->w_winrow
570 || org_wincol != wp->w_wincol
571 || org_width != wp->w_width
572 || org_height != wp->w_height)
573 {
574 redraw_all_later(NOT_VALID);
575 popup_mask_refresh = TRUE;
576 }
557 } 577 }
558 578
559 typedef enum 579 typedef enum
560 { 580 {
561 TYPE_NORMAL, 581 TYPE_NORMAL,
563 } create_type_T; 583 } create_type_T;
564 584
565 /* 585 /*
566 * popup_create({text}, {options}) 586 * popup_create({text}, {options})
567 * popup_atcursor({text}, {options}) 587 * popup_atcursor({text}, {options})
568 * When called from f_popup_atcursor() "atcursor" is TRUE. 588 * When called from f_popup_atcursor() "type" is TYPE_ATCURSOR.
569 */ 589 */
570 static void 590 static void
571 popup_create(typval_T *argvars, typval_T *rettv, create_type_T type) 591 popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
572 { 592 {
573 win_T *wp; 593 win_T *wp;
673 wp->w_wantcol = screen_screencol() + 1; 693 wp->w_wantcol = screen_screencol() + 1;
674 set_moved_values(wp); 694 set_moved_values(wp);
675 set_moved_columns(wp, FIND_STRING); 695 set_moved_columns(wp, FIND_STRING);
676 } 696 }
677 697
698 // set default values
699 wp->w_zindex = POPUPWIN_DEFAULT_ZINDEX;
700
678 // Deal with options. 701 // Deal with options.
679 apply_options(wp, buf, argvars[1].vval.v_dict); 702 apply_options(wp, buf, argvars[1].vval.v_dict);
680 703
681 // set default values
682 if (wp->w_zindex == 0)
683 wp->w_zindex = 50;
684
685 popup_adjust_position(wp); 704 popup_adjust_position(wp);
686 705
687 wp->w_vsep_width = 0; 706 wp->w_vsep_width = 0;
688 707
689 redraw_all_later(NOT_VALID); 708 redraw_all_later(NOT_VALID);
709 popup_mask_refresh = TRUE;
690 } 710 }
691 711
692 /* 712 /*
693 * popup_create({text}, {options}) 713 * popup_create({text}, {options})
694 */ 714 */
813 if (wp != NULL && (wp->w_popup_flags & POPF_HIDDEN) == 0) 833 if (wp != NULL && (wp->w_popup_flags & POPF_HIDDEN) == 0)
814 { 834 {
815 wp->w_popup_flags |= POPF_HIDDEN; 835 wp->w_popup_flags |= POPF_HIDDEN;
816 --wp->w_buffer->b_nwindows; 836 --wp->w_buffer->b_nwindows;
817 redraw_all_later(NOT_VALID); 837 redraw_all_later(NOT_VALID);
838 popup_mask_refresh = TRUE;
818 } 839 }
819 } 840 }
820 841
821 /* 842 /*
822 * popup_show({id}) 843 * popup_show({id})
830 if (wp != NULL && (wp->w_popup_flags & POPF_HIDDEN) != 0) 851 if (wp != NULL && (wp->w_popup_flags & POPF_HIDDEN) != 0)
831 { 852 {
832 wp->w_popup_flags &= ~POPF_HIDDEN; 853 wp->w_popup_flags &= ~POPF_HIDDEN;
833 ++wp->w_buffer->b_nwindows; 854 ++wp->w_buffer->b_nwindows;
834 redraw_all_later(NOT_VALID); 855 redraw_all_later(NOT_VALID);
856 popup_mask_refresh = TRUE;
835 } 857 }
836 } 858 }
837 859
838 static void 860 static void
839 popup_free(win_T *wp) 861 popup_free(win_T *wp)
841 wp->w_buffer->b_locked = FALSE; 863 wp->w_buffer->b_locked = FALSE;
842 if (wp->w_winrow + wp->w_height >= cmdline_row) 864 if (wp->w_winrow + wp->w_height >= cmdline_row)
843 clear_cmdline = TRUE; 865 clear_cmdline = TRUE;
844 win_free_popup(wp); 866 win_free_popup(wp);
845 redraw_all_later(NOT_VALID); 867 redraw_all_later(NOT_VALID);
868 popup_mask_refresh = TRUE;
846 } 869 }
847 870
848 /* 871 /*
849 * Close a popup window by Window-id. 872 * Close a popup window by Window-id.
850 * Does not invoke the callback. 873 * Does not invoke the callback.
942 get_pos_options(wp, d); 965 get_pos_options(wp, d);
943 966
944 if (wp->w_winrow + wp->w_height >= cmdline_row) 967 if (wp->w_winrow + wp->w_height >= cmdline_row)
945 clear_cmdline = TRUE; 968 clear_cmdline = TRUE;
946 popup_adjust_position(wp); 969 popup_adjust_position(wp);
947 redraw_all_later(NOT_VALID);
948 } 970 }
949 971
950 /* 972 /*
951 * popup_getpos({id}) 973 * popup_getpos({id})
952 */ 974 */
982 win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0); 1004 win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0);
983 } 1005 }
984 } 1006 }
985 1007
986 /* 1008 /*
987 * f_popup_getoptions({id}) 1009 * popup_getoptions({id})
988 */ 1010 */
989 void 1011 void
990 f_popup_getoptions(typval_T *argvars, typval_T *rettv) 1012 f_popup_getoptions(typval_T *argvars, typval_T *rettv)
991 { 1013 {
992 dict_T *dict; 1014 dict_T *dict;