summaryrefslogtreecommitdiff
path: root/src/haikumenu.c
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-04-17 07:15:17 +0000
committerPo Lu <luangruo@yahoo.com>2022-04-17 08:14:05 +0000
commite8b0808e20797f84fb2a720e38f315bfab39bde4 (patch)
treec0ecf223452c66c107d500b08b27a42841ee5ddf /src/haikumenu.c
parent3dc73569b405d80e89c2965daba31ea4ee6664f0 (diff)
downloademacs-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.c33
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");