]> granicus.if.org Git - vim/commitdiff
patch 9.0.0317: when updating the whole screen a popup may not be redrawn v9.0.0317
authorBram Moolenaar <Bram@vim.org>
Mon, 29 Aug 2022 12:44:28 +0000 (13:44 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 29 Aug 2022 12:44:28 +0000 (13:44 +0100)
Problem:    When updating the whole screen a popup may not be redrawn.
Solution:   Mark the screen and windows for redraw also when not clearing.
            Also mark popup windows for redraw.

src/drawscreen.c
src/popupwin.c
src/proto/popupwin.pro
src/proto/screen.pro
src/screen.c
src/testdir/dumps/Test_popupwin_win_execute.dump
src/version.c

index 529792f06cff0edd579a57a6346e424003ecbb0e..a0801e5865474b81606d28d0540e2bc0cc705be5 100644 (file)
@@ -173,13 +173,19 @@ update_screen(int type_arg)
        if (type != UPD_CLEAR)
        {
            if (msg_scrolled > Rows - 5)            // redrawing is faster
+           {
                type = UPD_NOT_VALID;
+               redraw_as_cleared();
+           }
            else
            {
                check_for_delay(FALSE);
                if (screen_ins_lines(0, 0, msg_scrolled, (int)Rows, 0, NULL)
                                                                       == FAIL)
+               {
                    type = UPD_NOT_VALID;
+                   redraw_as_cleared();
+               }
                FOR_ALL_WINDOWS(wp)
                {
                    if (wp->w_winrow < msg_scrolled)
index 8e74e4201023fac33274b30698506bcbdbb77418..0240994bef0a86cc42a3e042f7f8b950cd56521f 100644 (file)
@@ -1937,6 +1937,20 @@ popup_terminal_exists(void)
 }
 #endif
 
+/*
+ * Mark all popup windows in the current tab and global for redrawing.
+ */
+    void
+popup_redraw_all(void)
+{
+    win_T      *wp;
+
+    FOR_ALL_POPUPWINS(wp)
+       wp->w_redr_type = UPD_NOT_VALID;
+    FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
+       wp->w_redr_type = UPD_NOT_VALID;
+}
+
 /*
  * Set the color for a notification window.
  */
index a12cb3eb299fc7da5c35274c60ffae2d0015ddd2..4d669ef868b344e14fa5df9366236d7843b01376 100644 (file)
@@ -15,6 +15,7 @@ int parse_previewpopup(win_T *wp);
 int parse_completepopup(win_T *wp);
 void popup_set_wantpos_cursor(win_T *wp, int width, dict_T *d);
 void popup_set_wantpos_rowcol(win_T *wp, int row, int col);
+void popup_redraw_all(void);
 void f_popup_clear(typval_T *argvars, typval_T *rettv);
 void f_popup_create(typval_T *argvars, typval_T *rettv);
 void f_popup_atcursor(typval_T *argvars, typval_T *rettv);
index 81e5e101c1b040cea1ccc7cb15e555ed72bee2db..2b775372bdeeedbc954129761de6278b973de547 100644 (file)
@@ -31,6 +31,7 @@ int screen_valid(int doclear);
 void screenalloc(int doclear);
 void free_screenlines(void);
 void screenclear(void);
+void redraw_as_cleared(void);
 void line_was_clobbered(int screen_lnum);
 int can_clear(char_u *p);
 void screen_start(void);
index a1741ca5f203b164efbeb8b66355fce4d8a10115..eb01fdbd333a04c6819fb767b43cb46595e3fb36 100644 (file)
@@ -49,7 +49,7 @@
 static int     screen_attr = 0;
 
 static void screen_char_2(unsigned off, int row, int col);
-static void screenclear2(void);
+static void screenclear2(int doclear);
 static void lineclear(unsigned off, int width, int attr);
 static void lineinvalid(unsigned off, int width);
 static int win_do_lines(win_T *wp, int row, int line_count, int mayclear, int del, int clear_attr);
@@ -2906,7 +2906,7 @@ give_up:
 
     set_must_redraw(UPD_CLEAR);        // need to clear the screen later
     if (doclear)
-       screenclear2();
+       screenclear2(TRUE);
 #ifdef FEAT_GUI
     else if (gui.in_use
            && !gui.starting
@@ -2969,16 +2969,30 @@ free_screenlines(void)
 #endif
 }
 
+/*
+ * Clear the screen.
+ * May delay if there is something the user should read.
+ * Allocated the screen for resizing if needed.
+ */
     void
 screenclear(void)
 {
     check_for_delay(FALSE);
     screenalloc(FALSE);            // allocate screen buffers if size changed
-    screenclear2();        // clear the screen
+    screenclear2(TRUE);            // clear the screen
+}
+
+/*
+ * Do not clear the screen but mark everything for redraw.
+ */
+    void
+redraw_as_cleared(void)
+{
+    screenclear2(FALSE);
 }
 
     static void
-screenclear2(void)
+screenclear2(int doclear)
 {
     int            i;
 
@@ -3007,7 +3021,7 @@ screenclear2(void)
        LineWraps[i] = FALSE;
     }
 
-    if (can_clear(T_CL))
+    if (doclear && can_clear(T_CL))
     {
        out_str(T_CL);          // clear the display
        clear_cmdline = FALSE;
@@ -3023,7 +3037,10 @@ screenclear2(void)
 
     screen_cleared = TRUE;     // can use contents of ScreenLines now
 
-    win_rest_invalid(firstwin);
+    win_rest_invalid(firstwin);        // redraw all regular windows
+#ifdef FEAT_PROP_POPUP
+    popup_redraw_all();                // redraw all popup windows
+#endif
     redraw_cmdline = TRUE;
     redraw_tabline = TRUE;
     if (must_redraw == UPD_CLEAR)      // no need to clear again
index f5548591c7e78ecc0b997b248ef42c9727ad629f..b890a28a61d525a5a7bf6ff5bfeb0907b8f01b16 100644 (file)
@@ -2,7 +2,7 @@
 |~+0#4040ff13&| @73
 |~| @73
 |~| @73
-|~| @31| +0#0000000&@8| +0#4040ff13&@32
+|~| @31|s+0#0000001#ffd7ff255|o|m|e| |t|e|x|t| +0#4040ff13#ffffff0@32
 |~| @73
 |~| @73
 |~| @73
index 4dbe10080fb7d82dd9a7a1844114d230c36593d1..6cd7bd28b9c36a6f9d1746dfcd416034832cb250 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    317,
 /**/
     316,
 /**/