]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid races between the tooltip and compositor on X and Android
authorPo Lu <luangruo@yahoo.com>
Wed, 19 Jun 2024 02:57:07 +0000 (10:57 +0800)
committerEshel Yaron <me@eshelyaron.com>
Wed, 19 Jun 2024 08:43:28 +0000 (10:43 +0200)
* java/org/gnu/emacs/EmacsView.java (onLayout): Don't send
exposure events when the window is still to be attached.

* src/androidfns.c (Fx_show_tip):

* src/xfns.c (Fx_show_tip): Block async input around initial
frame update.

(cherry picked from commit 5fceb53856583384e7adeab52494d1afc6eae666)

java/org/gnu/emacs/EmacsView.java
src/androidfns.c
src/xfns.c

index 2ea54217837466cb30ec5666a541e31dfe3145e5..82792c3fcca414d46fa11ef318ff9cd18ff33753 100644 (file)
@@ -425,7 +425,7 @@ public final class EmacsView extends ViewGroup
        window.viewLayout (left, top, right, bottom);
       }
 
-    if (needExpose)
+    if (needExpose && isAttachedToWindow)
       EmacsNative.sendExpose (this.window.handle, 0, 0,
                              right - left, bottom - top);
   }
index 4246f6d2be480cdd5b92f8ed292fb821dd1c9f74..84558350dc0bfd27b65398b418eb89147f004f40 100644 (file)
@@ -2564,9 +2564,16 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
   /* Garbage the tip frame too.  */
   SET_FRAME_GARBAGED (tip_f);
 
+  /* Block input around `update_single_window' and `flush_frame', lest a
+     ConfigureNotify and Expose event arrive during the update, and set
+     flags, e.g. garbaged_p, that are cleared once the update completes,
+     leaving the requested exposure or configuration outstanding.  */
+  block_input ();
   w->must_be_updated_p = true;
   update_single_window (w);
   flush_frame (tip_f);
+  unblock_input ();
+
   set_buffer_internal_1 (old_buffer);
   unbind_to (count_1, Qnil);
   windows_or_buffers_changed = old_windows_or_buffers_changed;
index c48fa24b6bebff5e6e793f02fa33f7c86adbc2b6..4fdcf07e8fb183aa59294f5e8205eabb882a2271 100644 (file)
@@ -9299,9 +9299,19 @@ Text larger than the specified size is clipped.  */)
   x_cr_update_surface_desired_size (tip_f, width, height);
 #endif /* USE_CAIRO */
 
+  /* Garbage the tip frame too.  */
+  SET_FRAME_GARBAGED (tip_f);
+
+  /* Block input around `update_single_window' and `flush_frame', lest a
+     ConfigureNotify and Expose event arrive during the update, and set
+     flags, e.g. garbaged_p, that are cleared once the update completes,
+     leaving the requested exposure or configuration outstanding.  */
+  block_input ();
   w->must_be_updated_p = true;
   update_single_window (w);
   flush_frame (tip_f);
+  unblock_input ();
+
   set_buffer_internal_1 (old_buffer);
   unbind_to (count_1, Qnil);
   windows_or_buffers_changed = old_windows_or_buffers_changed;