[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 29bf6e64fd: Fix Haiku menu bars when redisplay happens immediatel
From: |
Po Lu |
Subject: |
master 29bf6e64fd: Fix Haiku menu bars when redisplay happens immediately after activation |
Date: |
Sun, 17 Apr 2022 20:52:18 -0400 (EDT) |
branch: master
commit 29bf6e64fdad648642a79915d63fe543fdeaff8b
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Fix Haiku menu bars when redisplay happens immediately after activation
* src/haiku_support.cc (MessageReceived): Make `REPLAY_MENU_BAR'
messages synchronous.
(be_replay_menu_bar_event): Return whether or not the menu bar
really opened.
* src/haiku_support.h: Update prototypes.
* src/haikumenu.c (haiku_activate_menubar): Immediately activate
menu bar after replaying event.
---
src/haiku_support.cc | 22 ++++++++++++++++++----
src/haiku_support.h | 2 +-
src/haikumenu.c | 10 ++++++++--
3 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 673ae02ac9..1feea6c450 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -1335,7 +1335,7 @@ public:
window->menus_begun = &menus_begun;
set_mouse_position (pt.x, pt.y);
- MouseDown (l);
+ BMenuBar::MouseDown (l);
window->menus_begun = NULL;
if (!menus_begun)
@@ -1345,8 +1345,19 @@ public:
}
else if (msg->what == REPLAY_MENU_BAR)
{
+ window = (EmacsWindow *) Window ();
+ menus_begun = false;
+ window->menus_begun = &menus_begun;
+
if (msg->FindPoint ("emacs:point", &pt) == B_OK)
BMenuBar::MouseDown (pt);
+
+ window->menus_begun = NULL;
+
+ if (!menus_begun)
+ msg->SendReply (msg);
+ else
+ msg->SendReply (BE_MENU_BAR_OPEN);
}
else
BMenuBar::MessageReceived (msg);
@@ -4261,14 +4272,17 @@ be_drag_and_drop_in_progress (void)
return drag_and_drop_in_progress;
}
-void
+/* Replay the menu bar click event EVENT. Return whether or not the
+ menu bar actually opened. */
+bool
be_replay_menu_bar_event (void *menu_bar,
struct haiku_menu_bar_click_event *event)
{
BMenuBar *m = (BMenuBar *) menu_bar;
BMessenger messenger (m);
- BMessage msg (REPLAY_MENU_BAR);
+ BMessage reply, msg (REPLAY_MENU_BAR);
msg.AddPoint ("emacs:point", BPoint (event->x, event->y));
- messenger.SendMessage (&msg);
+ messenger.SendMessage (&msg, &reply);
+ return reply.what == BE_MENU_BAR_OPEN;
}
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 6b285cf3e0..4718be4f84 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -636,7 +636,7 @@ extern bool be_drag_message (void *, void *, bool, void (*)
(void),
bool (*) (void));
extern bool be_drag_and_drop_in_progress (void);
-extern void be_replay_menu_bar_event (void *, struct
haiku_menu_bar_click_event *);
+extern bool be_replay_menu_bar_event (void *, struct
haiku_menu_bar_click_event *);
#ifdef __cplusplus
extern void *find_appropriate_view_for_draw (void *);
diff --git a/src/haikumenu.c b/src/haikumenu.c
index 46dde6496b..54ee3f160f 100644
--- a/src/haikumenu.c
+++ b/src/haikumenu.c
@@ -783,11 +783,17 @@ haiku_activate_menubar (struct frame *f)
if (FRAME_OUTPUT_DATA (f)->saved_menu_event)
{
block_input ();
- be_replay_menu_bar_event (FRAME_HAIKU_MENU_BAR (f),
- FRAME_OUTPUT_DATA (f)->saved_menu_event);
+ rc = be_replay_menu_bar_event (FRAME_HAIKU_MENU_BAR (f),
+ FRAME_OUTPUT_DATA (f)->saved_menu_event);
xfree (FRAME_OUTPUT_DATA (f)->saved_menu_event);
FRAME_OUTPUT_DATA (f)->saved_menu_event = NULL;
unblock_input ();
+
+ if (!rc)
+ return;
+
+ FRAME_OUTPUT_DATA (f)->menu_bar_open_p = 1;
+ popup_activated_p += 1;
}
else
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 29bf6e64fd: Fix Haiku menu bars when redisplay happens immediately after activation,
Po Lu <=