diff options
| author | Po Lu | 2022-04-18 00:50:15 +0000 |
|---|---|---|
| committer | Po Lu | 2022-04-18 00:50:15 +0000 |
| commit | 29bf6e64fdad648642a79915d63fe543fdeaff8b (patch) | |
| tree | 22a4e52b8057a4a70ad0fd04e0122a982bfbd063 /src | |
| parent | 4b2b3c45d39721a60f8ed63c2a3e3ec9ff7e5004 (diff) | |
| download | emacs-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.cc | 22 | ||||
| -rw-r--r-- | src/haiku_support.h | 2 | ||||
| -rw-r--r-- | src/haikumenu.c | 10 |
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 | ||
| 4264 | void | 4275 | /* Replay the menu bar click event EVENT. Return whether or not the |
| 4276 | menu bar actually opened. */ | ||
| 4277 | bool | ||
| 4265 | be_replay_menu_bar_event (void *menu_bar, | 4278 | be_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)); |
| 637 | extern bool be_drag_and_drop_in_progress (void); | 637 | extern bool be_drag_and_drop_in_progress (void); |
| 638 | 638 | ||
| 639 | extern void be_replay_menu_bar_event (void *, struct haiku_menu_bar_click_event *); | 639 | extern bool be_replay_menu_bar_event (void *, struct haiku_menu_bar_click_event *); |
| 640 | 640 | ||
| 641 | #ifdef __cplusplus | 641 | #ifdef __cplusplus |
| 642 | extern void *find_appropriate_view_for_draw (void *); | 642 | extern 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 | { |