]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix display updating inside the minibuffer on MS Windows
authorPo Lu <luangruo@yahoo.com>
Sat, 30 Apr 2022 10:54:34 +0000 (18:54 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 30 Apr 2022 10:54:34 +0000 (18:54 +0800)
* src/minibuf.c (read_minibuf): Call `w32_flip_buffers_if_dirty'
after changing the cursor position and redisplaying instead of
`flush_frame'.  (bug#55193)

* src/w32term.c (w32_flip_buffers_if_dirty): New function.
* src/w32term.h: Update prototypes.

src/minibuf.c
src/w32term.c
src/w32term.h

index dacfd1255bae669853618036f160e14227c6e201..df82bcb121a8e10b57f7ca625b041d7dc0e30574 100644 (file)
@@ -34,6 +34,10 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include "systty.h"
 #include "pdumper.h"
 
+#ifdef HAVE_NTGUI
+#include "w32term.h"
+#endif
+
 /* List of buffers for use as minibuffers.
    The first element of the list is used for the outermost minibuffer
    invocation, the next element is used for a recursive minibuffer
@@ -916,7 +920,17 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
       XWINDOW (minibuf_window)->cursor.x = 0;
       XWINDOW (minibuf_window)->must_be_updated_p = true;
       update_frame (XFRAME (selected_frame), true, true);
+#ifndef HAVE_NTGUI
       flush_frame (XFRAME (XWINDOW (minibuf_window)->frame));
+#else
+      /* The reason this function isn't `flush_display' in the RIF is
+        that `flush_frame' is also called in many other circumstances
+        when some code wants X requests to be sent to the X server,
+        but there is no corresponding "flush" concept on MS Windows,
+        and flipping buffers every time `flush_frame' is called
+        causes flicker.  */
+      w32_flip_buffers_if_dirty (XFRAME (XWINDOW (minibuf_window)->frame));
+#endif
     }
 
   /* Make minibuffer contents into a string.  */
index 0c16dc1eef4184b7f952062b0c028234d359803f..11675085fccdeee7807e43df3cf49810fb00de17 100644 (file)
@@ -774,6 +774,19 @@ w32_buffer_flipping_unblocked_hook (struct frame *f)
     w32_show_back_buffer (f);
 }
 
+/* Flip buffers on F if drawing has happened.  This function is not
+   called to flush the display connection of a frame (which doesn't
+   exist on MS Windows), but also called in some situations in
+   minibuf.c to make the contents of the back buffer visible.  */
+void
+w32_flip_buffers_if_dirty (struct frame *f)
+{
+  if (FRAME_OUTPUT_DATA (f)->paint_buffer
+      && FRAME_OUTPUT_DATA (f)->paint_buffer_dirty
+      && !f->garbaged && !buffer_flipping_blocked_p ())
+    w32_show_back_buffer (f);
+}
+
 /* Draw truncation mark bitmaps, continuation mark bitmaps, overlay
    arrow bitmaps, or clear the fringes if no bitmaps are required
    before DESIRED_ROW is made current.  This function is called from
index 2dcc43fc59f71637cf6fb823a67e8a6100028114..88b7ec22bd1ae4cbc445275569048b25f413c35e 100644 (file)
@@ -898,6 +898,7 @@ typedef char guichar_t;
 extern Lisp_Object w32_popup_dialog (struct frame *, Lisp_Object, Lisp_Object);
 extern void w32_arrow_cursor (void);
 extern void w32_release_paint_buffer (struct frame *);
+extern void w32_flip_buffers_if_dirty (struct frame *);
 
 extern void syms_of_w32term (void);
 extern void syms_of_w32menu (void);