1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-26 07:33:47 +00:00

Fix grab view persisting on Haiku after popup menu closes

* 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.
This commit is contained in:
Po Lu 2022-07-28 13:24:10 +00:00
parent b8fdef7aa6
commit 977aed9f79
3 changed files with 27 additions and 4 deletions

View File

@ -1930,11 +1930,14 @@ class EmacsView : public BView
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 ();
}
}

View 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
}

View 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;