Mercurial > vim
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; |