]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix grab view persisting on Haiku after popup menu closes
authorPo Lu <luangruo@yahoo.com>
Thu, 28 Jul 2022 13:24:10 +0000 (13:24 +0000)
committerPo Lu <luangruo@yahoo.com>
Thu, 28 Jul 2022 13:25:06 +0000 (13:25 +0000)
* src/haiku_support.cc (BasicMouseUp): Improve handling of
wait_for_release_message.
(be_clear_grab_view): New function.
* src/haiku_support.h: Update prototypes.
* src/haikumenu.c (haiku_menu_show): Call it here.

src/haiku_support.cc
src/haiku_support.h
src/haikumenu.c

index cb378d2d8103e0d256076d13752775479d3c0fbb..b7590f68a487d455ea8874df005b4d066a907ccf 100644 (file)
@@ -1930,11 +1930,14 @@ public:
     button = (grabbed_buttons & ~buttons);
     grabbed_buttons = buttons;
 
-    if (!grabbed_buttons && wait_for_release_message)
+    if (wait_for_release_message)
       {
-       wait_for_release_message->SendReply (wait_for_release_message);
-       delete wait_for_release_message;
-       wait_for_release_message = NULL;
+       if (!grabbed_buttons)
+         {
+           wait_for_release_message->SendReply (wait_for_release_message);
+           delete wait_for_release_message;
+           wait_for_release_message = NULL;
+         }
 
        return;
       }
@@ -5457,3 +5460,17 @@ be_get_explicit_workarea (int *x, int *y, int *width, int *height)
 
   return true;
 }
+
+/* Clear the grab view.  This has to be called manually from some
+   places, since we don't get B_MOUSE_UP messages after a popup menu
+   is run.  */
+
+void
+be_clear_grab_view (void)
+{
+  if (grab_view_locker.Lock ())
+    {
+      grab_view = NULL;
+      grab_view_locker.Unlock ();
+    }
+}
index 5577d2f151f5cc80e63f89a090e928c06317027c..76fe071f2c9af746887e94161b9aa8189fb1bbd0 100644 (file)
@@ -727,6 +727,7 @@ extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode);
 extern void be_lock_window (void *);
 extern void be_unlock_window (void *);
 extern bool be_get_explicit_workarea (int *, int *, int *, int *);
+extern void be_clear_grab_view (void);
 #ifdef __cplusplus
 }
 
index 929ed952105a65052541be1ec1e9fbc2bae1d409..69bb56c124e1dd8509e19035ff4d39b8fc0bbb4a 100644 (file)
@@ -432,6 +432,11 @@ haiku_menu_show (struct frame *f, int x, int y, int menuflags,
 
   FRAME_DISPLAY_INFO (f)->grabbed = 0;
 
+  /* Clear the grab view manually.  There is a race condition here if
+     the window thread receives a button press between here and the
+     end of BMenu_run.  */
+  be_clear_grab_view ();
+
   if (menu_item_selection)
     {
       prefix = entry = Qnil;