aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-04-18 00:50:15 +0000
committerPo Lu2022-04-18 00:50:15 +0000
commit29bf6e64fdad648642a79915d63fe543fdeaff8b (patch)
tree22a4e52b8057a4a70ad0fd04e0122a982bfbd063 /src
parent4b2b3c45d39721a60f8ed63c2a3e3ec9ff7e5004 (diff)
downloademacs-29bf6e64fdad648642a79915d63fe543fdeaff8b.tar.gz
emacs-29bf6e64fdad648642a79915d63fe543fdeaff8b.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/haiku_support.cc22
-rw-r--r--src/haiku_support.h2
-rw-r--r--src/haikumenu.c10
3 files changed, 27 insertions, 7 deletions
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 673ae02ac9c..1feea6c4502 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -1335,7 +1335,7 @@ public:
1335 1335
1336 window->menus_begun = &menus_begun; 1336 window->menus_begun = &menus_begun;
1337 set_mouse_position (pt.x, pt.y); 1337 set_mouse_position (pt.x, pt.y);
1338 MouseDown (l); 1338 BMenuBar::MouseDown (l);
1339 window->menus_begun = NULL; 1339 window->menus_begun = NULL;
1340 1340
1341 if (!menus_begun) 1341 if (!menus_begun)
@@ -1345,8 +1345,19 @@ public:
1345 } 1345 }
1346 else if (msg->what == REPLAY_MENU_BAR) 1346 else if (msg->what == REPLAY_MENU_BAR)
1347 { 1347 {
1348 window = (EmacsWindow *) Window ();
1349 menus_begun = false;
1350 window->menus_begun = &menus_begun;
1351
1348 if (msg->FindPoint ("emacs:point", &pt) == B_OK) 1352 if (msg->FindPoint ("emacs:point", &pt) == B_OK)
1349 BMenuBar::MouseDown (pt); 1353 BMenuBar::MouseDown (pt);
1354
1355 window->menus_begun = NULL;
1356
1357 if (!menus_begun)
1358 msg->SendReply (msg);
1359 else
1360 msg->SendReply (BE_MENU_BAR_OPEN);
1350 } 1361 }
1351 else 1362 else
1352 BMenuBar::MessageReceived (msg); 1363 BMenuBar::MessageReceived (msg);
@@ -4261,14 +4272,17 @@ be_drag_and_drop_in_progress (void)
4261 return drag_and_drop_in_progress; 4272 return drag_and_drop_in_progress;
4262} 4273}
4263 4274
4264void 4275/* Replay the menu bar click event EVENT. Return whether or not the
4276 menu bar actually opened. */
4277bool
4265be_replay_menu_bar_event (void *menu_bar, 4278be_replay_menu_bar_event (void *menu_bar,
4266 struct haiku_menu_bar_click_event *event) 4279 struct haiku_menu_bar_click_event *event)
4267{ 4280{
4268 BMenuBar *m = (BMenuBar *) menu_bar; 4281 BMenuBar *m = (BMenuBar *) menu_bar;
4269 BMessenger messenger (m); 4282 BMessenger messenger (m);
4270 BMessage msg (REPLAY_MENU_BAR); 4283 BMessage reply, msg (REPLAY_MENU_BAR);
4271 4284
4272 msg.AddPoint ("emacs:point", BPoint (event->x, event->y)); 4285 msg.AddPoint ("emacs:point", BPoint (event->x, event->y));
4273 messenger.SendMessage (&msg); 4286 messenger.SendMessage (&msg, &reply);
4287 return reply.what == BE_MENU_BAR_OPEN;
4274} 4288}
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 6b285cf3e0a..4718be4f84a 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),
636 bool (*) (void)); 636 bool (*) (void));
637extern bool be_drag_and_drop_in_progress (void); 637extern bool be_drag_and_drop_in_progress (void);
638 638
639extern void be_replay_menu_bar_event (void *, struct haiku_menu_bar_click_event *); 639extern bool be_replay_menu_bar_event (void *, struct haiku_menu_bar_click_event *);
640 640
641#ifdef __cplusplus 641#ifdef __cplusplus
642extern void *find_appropriate_view_for_draw (void *); 642extern void *find_appropriate_view_for_draw (void *);
diff --git a/src/haikumenu.c b/src/haikumenu.c
index 46dde6496bb..54ee3f160f6 100644
--- a/src/haikumenu.c
+++ b/src/haikumenu.c
@@ -783,11 +783,17 @@ haiku_activate_menubar (struct frame *f)
783 if (FRAME_OUTPUT_DATA (f)->saved_menu_event) 783 if (FRAME_OUTPUT_DATA (f)->saved_menu_event)
784 { 784 {
785 block_input (); 785 block_input ();
786 be_replay_menu_bar_event (FRAME_HAIKU_MENU_BAR (f), 786 rc = be_replay_menu_bar_event (FRAME_HAIKU_MENU_BAR (f),
787 FRAME_OUTPUT_DATA (f)->saved_menu_event); 787 FRAME_OUTPUT_DATA (f)->saved_menu_event);
788 xfree (FRAME_OUTPUT_DATA (f)->saved_menu_event); 788 xfree (FRAME_OUTPUT_DATA (f)->saved_menu_event);
789 FRAME_OUTPUT_DATA (f)->saved_menu_event = NULL; 789 FRAME_OUTPUT_DATA (f)->saved_menu_event = NULL;
790 unblock_input (); 790 unblock_input ();
791
792 if (!rc)
793 return;
794
795 FRAME_OUTPUT_DATA (f)->menu_bar_open_p = 1;
796 popup_activated_p += 1;
791 } 797 }
792 else 798 else
793 { 799 {