From 278bacad691f4d5ba05b55c83e3e8ccd7f524e59 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 29 Jan 2022 07:35:48 +0000 Subject: [PATCH] Write a dummy event on each popup menu event * src/haiku_io.c (haiku_len): Add new event. * src/haiku_support.cc (be_popup_menu_thread_entry): (Highlight): Write a dummy event to the event port. * src/haiku_support.h (enum haiku_event_type): New `DUMMY_EVENT' type. (struct haiku_dummy_event): New structure. * src/haikuterm.c (haiku_read_socket): Handle dummy events. --- src/haiku_io.c | 2 ++ src/haiku_support.cc | 17 ++++++++++------- src/haiku_support.h | 8 +++++++- src/haikuterm.c | 1 + 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/haiku_io.c b/src/haiku_io.c index 109aca782ad..185bd5e9ff2 100644 --- a/src/haiku_io.c +++ b/src/haiku_io.c @@ -94,6 +94,8 @@ haiku_len (enum haiku_event_type type) return sizeof (struct haiku_refs_event); case APP_QUIT_REQUESTED_EVENT: return sizeof (struct haiku_app_quit_requested_event); + case DUMMY_EVENT: + return sizeof (struct haiku_dummy_event); } emacs_abort (); diff --git a/src/haiku_support.cc b/src/haiku_support.cc index 05bc410eb28..2284953517f 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc @@ -149,6 +149,7 @@ static int32 be_popup_menu_thread_entry (void *thread_data) { struct be_popup_menu_data *data; + struct haiku_dummy_event dummy; BMenuItem *it; data = (struct be_popup_menu_data *) thread_data; @@ -160,6 +161,7 @@ be_popup_menu_thread_entry (void *thread_data) else popup_track_message = NULL; + haiku_write (DUMMY_EVENT, &dummy); return 0; } @@ -1697,6 +1699,7 @@ public: Highlight (bool highlight_p) { struct haiku_menu_bar_help_event rq; + struct haiku_dummy_event dummy; BMenu *menu = Menu (); BRect r; BPoint pt; @@ -1719,7 +1722,10 @@ public: if (menu_bar_id > 0) haiku_write (MENU_BAR_HELP_EVENT, &rq); else - haiku_write_without_signal (MENU_BAR_HELP_EVENT, &rq, true); + { + haiku_write_without_signal (MENU_BAR_HELP_EVENT, &rq, true); + haiku_write (DUMMY_EVENT, &dummy); + } } } @@ -2490,16 +2496,13 @@ BMenu_run (void *menu, int x, int y, while (true) { + process_pending_signals_function (); + if ((stat = wait_for_objects_etc ((object_wait_info *) &infos, 2, B_RELATIVE_TIMEOUT, 10000)) < B_OK) { - if (stat == B_INTERRUPTED) + if (stat == B_INTERRUPTED || stat == B_TIMED_OUT) continue; - else if (stat == B_TIMED_OUT) - { - process_pending_signals_function (); - continue; - } else gui_abort ("Failed to wait for popup"); } diff --git a/src/haiku_support.h b/src/haiku_support.h index 4b0456168d0..b98fa56415b 100644 --- a/src/haiku_support.h +++ b/src/haiku_support.h @@ -86,7 +86,8 @@ enum haiku_event_type MENU_BAR_HELP_EVENT, ZOOM_EVENT, REFS_EVENT, - APP_QUIT_REQUESTED_EVENT + APP_QUIT_REQUESTED_EVENT, + DUMMY_EVENT }; struct haiku_quit_requested_event @@ -123,6 +124,11 @@ struct haiku_app_quit_requested_event char dummy; }; +struct haiku_dummy_event +{ + char dummy; +}; + #define HAIKU_MODIFIER_ALT (1) #define HAIKU_MODIFIER_CTRL (1 << 1) #define HAIKU_MODIFIER_SHIFT (1 << 2) diff --git a/src/haikuterm.c b/src/haikuterm.c index 11b75fdde25..c6c92227b8d 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c @@ -3263,6 +3263,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) } case APP_QUIT_REQUESTED_EVENT: case KEY_UP: + case DUMMY_EVENT: default: break; } -- 2.39.5