diff options
author | Po Lu <luangruo@yahoo.com> | 2022-04-17 07:15:17 +0000 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2022-04-17 08:14:05 +0000 |
commit | e8b0808e20797f84fb2a720e38f315bfab39bde4 (patch) | |
tree | c0ecf223452c66c107d500b08b27a42841ee5ddf /src/haikumenu.c | |
parent | 3dc73569b405d80e89c2965daba31ea4ee6664f0 (diff) | |
download | emacs-e8b0808e20797f84fb2a720e38f315bfab39bde4.tar.gz emacs-e8b0808e20797f84fb2a720e38f315bfab39bde4.tar.bz2 emacs-e8b0808e20797f84fb2a720e38f315bfab39bde4.zip |
Fix hangs when clicking on Haiku menu bar to activate frame
* src/haiku_io.c (haiku_len): Handle new event `MENU_BAR_CLICK'.
* src/haiku_support.cc (class EmacsWindow): Remove most of the
menu bar cv stuff.
(MessageReceived): Handle REPLAY_MENU_BAR message.
(EmacsWindow_signal_menu_update_complete): Delete function.
(be_replay_menu_bar_event): New function.
* src/haiku_support.h (enum haiku_event_type): New event type
`MENU_BAR_CLICK'.
(struct haiku_menu_bar_click_event): New struct.
* src/haikumenu.c (haiku_activate_menubar): New function.
* src/haikuterm.c (haiku_read_socket): Save a
MENU_BAR_ACTIVATE_EVENT and the menu bar click event instead of
handling the menu bar update synchronously.
(haiku_create_terminal): Set `activate_menubar_hook'.
(syms_of_haikuterm): Remove extraneous newline.
* src/haikuterm.h (struct haiku_output): New field
`saved_menu_event'.
Diffstat (limited to 'src/haikumenu.c')
-rw-r--r-- | src/haikumenu.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/haikumenu.c b/src/haikumenu.c index 22e9c4ecad3..8aced5f9d43 100644 --- a/src/haikumenu.c +++ b/src/haikumenu.c @@ -775,6 +775,39 @@ the position of the last non-menu event instead. */) } void +haiku_activate_menubar (struct frame *f) +{ + int rc; + + if (!FRAME_HAIKU_MENU_BAR (f)) + return; + + set_frame_menubar (f, true); + + 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); + xfree (FRAME_OUTPUT_DATA (f)->saved_menu_event); + FRAME_OUTPUT_DATA (f)->saved_menu_event = NULL; + unblock_input (); + } + else + { + block_input (); + rc = BMenuBar_start_tracking (FRAME_HAIKU_MENU_BAR (f)); + unblock_input (); + + if (!rc) + return; + + FRAME_OUTPUT_DATA (f)->menu_bar_open_p = 1; + popup_activated_p += 1; + } +} + +void syms_of_haikumenu (void) { DEFSYM (Qdebug_on_next_call, "debug-on-next-call"); |