]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix selection dialog display on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Sun, 8 May 2022 06:24:29 +0000 (09:24 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sun, 8 May 2022 06:24:29 +0000 (09:24 +0300)
* src/w32fns.c (w32_wnd_proc) <WM_PAINT>: Update the frame from
the back buffer when double-buffering is in effect and a selection
dialog is open.
(w32_dialog_in_progress): Indicate to 'w32_wnd_proc' that a
selection dialog is open.  (Bug#55208)

src/w32fns.c

index 0f25c1a594a027700ec707cde4e4f3e17e745002..e5becb5d64f2c48ce20ac6aa01b7cb1a89b1ce0d 100644 (file)
@@ -247,6 +247,8 @@ static HWND w32_visible_system_caret_hwnd;
 
 static int w32_unicode_gui;
 
+static bool w32_selection_dialog_open;
+
 /* From w32menu.c  */
 int menubar_in_use = 0;
 
@@ -4184,6 +4186,16 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                       update_rect.left, update_rect.top,
                       update_rect.right, update_rect.bottom));
 #endif
+           /* Under double-buffering, update the frame from the back
+              buffer, to prevent a "ghost" of the selection dialog to
+              be left on display while the user selects in the dialog.  */
+           if (w32_selection_dialog_open
+               && !w32_disable_double_buffering
+               && FRAME_OUTPUT_DATA (f)->paint_dc)
+             BitBlt (FRAME_OUTPUT_DATA (f)->paint_buffer_handle,
+                     0, 0, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f),
+                     FRAME_OUTPUT_DATA (f)->paint_dc, 0, 0, SRCCOPY);
+
            EndPaint (hwnd, &paintStruct);
            leave_crit ();
 
@@ -7755,6 +7767,15 @@ w32_dialog_in_progress (Lisp_Object in_progress)
 {
   Lisp_Object frames, frame;
 
+  /* Indicate to w32_wnd_proc that the selection dialog is about to be
+     open (or was closed, if IN_PROGRESS is nil).  */
+  if (!w32_disable_double_buffering)
+    {
+      enter_crit ();
+      w32_selection_dialog_open = !NILP (in_progress);
+      leave_crit ();
+    }
+
   /* Don't let frames in `above' z-group obscure dialog windows.  */
   FOR_EACH_FRAME (frames, frame)
     {