From e14317eec4461e86a93906973ff99527e7dfa4df Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 17 Feb 2022 01:26:14 +0000 Subject: [PATCH] Don't auto-lower when moving onto a menu bar on Haiku * src/haiku_io.c (haiku_len): Handle `MENU_BAR_LEFT'. * src/haiku_support.cc (EmacsMenuBar::MouseMoved): New function. * src/haiku_support.h (enum haiku_event_type): New event `MENU_BAR_LEFT'. (struct haiku_menu_bar_left_event): New structure. * src/haikuterm.c (haiku_read_socket): Don't auto-lower when the mouse exits the frame view onto the menu bar and handle MENU_BAR_LEFT events. --- src/haiku_io.c | 2 ++ src/haiku_support.cc | 21 +++++++++++++++++++++ src/haiku_support.h | 9 ++++++++- src/haikuterm.c | 28 +++++++++++++++++++++++++++- 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/haiku_io.c b/src/haiku_io.c index f47ba00d5fb..cade69f3387 100644 --- a/src/haiku_io.c +++ b/src/haiku_io.c @@ -96,6 +96,8 @@ haiku_len (enum haiku_event_type type) return sizeof (struct haiku_app_quit_requested_event); case DUMMY_EVENT: return sizeof (struct haiku_dummy_event); + case MENU_BAR_LEFT: + return sizeof (struct haiku_menu_bar_left_event); } emacs_abort (); diff --git a/src/haiku_support.cc b/src/haiku_support.cc index ced680d2e53..eb78afc6cbb 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc @@ -1169,6 +1169,27 @@ public: haiku_write (MENU_BAR_RESIZE, &rq); BMenuBar::FrameResized (newWidth, newHeight); } + + void + MouseMoved (BPoint point, uint32 transit, const BMessage *msg) + { + struct haiku_menu_bar_left_event rq; + + if (transit == B_EXITED_VIEW) + { + rq.x = std::lrint (point.x); + rq.y = std::lrint (point.y); + rq.window = this->Window (); + + if (movement_locker.Lock ()) + { + haiku_write (MENU_BAR_LEFT, &rq); + movement_locker.Unlock (); + } + } + + BMenuBar::MouseMoved (point, transit, msg); + } }; class EmacsView : public BView diff --git a/src/haiku_support.h b/src/haiku_support.h index c9035d3dc0d..67fbd8c5e01 100644 --- a/src/haiku_support.h +++ b/src/haiku_support.h @@ -87,7 +87,8 @@ enum haiku_event_type ZOOM_EVENT, REFS_EVENT, APP_QUIT_REQUESTED_EVENT, - DUMMY_EVENT + DUMMY_EVENT, + MENU_BAR_LEFT }; struct haiku_quit_requested_event @@ -160,6 +161,12 @@ struct haiku_mouse_motion_event bigtime_t time; }; +struct haiku_menu_bar_left_event +{ + void *window; + int x, y; +}; + struct haiku_button_event { void *window; diff --git a/src/haikuterm.c b/src/haikuterm.c index f4e2452a6c9..f0361c9dbea 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c @@ -2726,6 +2726,23 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) XSETFRAME (inev.frame_or_window, f); } + break; + } + case MENU_BAR_LEFT: + { + struct haiku_menu_bar_left_event *b = buf; + struct frame *f = haiku_window_to_frame (b->window); + + if (!f) + continue; + + if (b->y > 0 && b->y <= FRAME_PIXEL_HEIGHT (f) + && b->x > 0 && b->x <= FRAME_PIXEL_WIDTH (f)) + break; + + if (f->auto_lower && !popup_activated_p) + haiku_frame_raise_lower (f, 0); + break; } case MOUSE_MOTION: @@ -2776,7 +2793,16 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) } if (f->auto_lower && !popup_activated_p) - haiku_frame_raise_lower (f, 0); + { + /* If we're leaving towards the menu bar, don't + auto-lower here, and wait for a exit + notification from the menu bar instead. */ + if (b->x > FRAME_PIXEL_WIDTH (f) + || b->y >= FRAME_MENU_BAR_HEIGHT (f) + || b->x < 0 + || b->y < 0) + haiku_frame_raise_lower (f, 0); + } haiku_new_focus_frame (x_display_list->focused_frame); -- 2.39.5