From fe7c0798e879c54f660cc0371fa3ef0fd063a77a Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 24 Feb 2022 03:35:25 +0000 Subject: [PATCH] Fix auto-lower when the mouse moves onto a scrollbar on Haiku * src/haiku_support.cc (MouseMoved): (BView_inside_scroll_bar): New functions. * src/haiku_support.h: Update prototypes. * src/haikuterm.c (haiku_read_socket): Don't auto-lower if the pointer left the view for a scroll bar. --- src/haiku_support.cc | 41 +++++++++++++++++++++++++++++++++++++++++ src/haiku_support.h | 3 +++ src/haikuterm.c | 5 ++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/haiku_support.cc b/src/haiku_support.cc index 4f6a96568cb..9aeb03c4c90 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc @@ -1607,6 +1607,30 @@ public: haiku_write (SCROLL_BAR_DRAG_EVENT, &rq); BScrollBar::MouseUp (pt); } + + void + MouseMoved (BPoint point, uint32 transit, const BMessage *msg) + { + struct haiku_menu_bar_left_event rq; + BPoint conv; + + if (transit == B_EXITED_VIEW) + { + conv = ConvertToParent (point); + + rq.x = std::lrint (conv.x); + rq.y = std::lrint (conv.y); + rq.window = this->Window (); + + if (movement_locker.Lock ()) + { + haiku_write (MENU_BAR_LEFT, &rq); + movement_locker.Unlock (); + } + } + + BScrollBar::MouseMoved (point, transit, msg); + } }; class EmacsTitleMenuItem : public BMenuItem @@ -2266,6 +2290,23 @@ BView_forget_scroll_bar (void *view, int x, int y, int width, int height) } } +bool +BView_inside_scroll_bar (void *view, int x, int y) +{ + EmacsView *vw = (EmacsView *) view; + bool val; + + if (vw->LockLooper ()) + { + val = vw->sb_region.Contains (BPoint (x, y)); + vw->UnlockLooper (); + } + else + val = false; + + return val; +} + void BView_get_mouse (void *view, int *x, int *y) { diff --git a/src/haiku_support.h b/src/haiku_support.h index ef433514fe7..1deb867c5f7 100644 --- a/src/haiku_support.h +++ b/src/haiku_support.h @@ -666,6 +666,9 @@ extern "C" extern void BView_forget_scroll_bar (void *view, int x, int y, int width, int height); + extern bool + BView_inside_scroll_bar (void *view, int x, int y); + extern void BView_get_mouse (void *view, int *x, int *y); diff --git a/src/haikuterm.c b/src/haikuterm.c index c184501a207..83330b5f638 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c @@ -2799,7 +2799,10 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) need_flush = 1; } - if (f->auto_lower && !popup_activated_p) + if (f->auto_lower && !popup_activated_p + /* Don't do this if the mouse entered a scroll bar. */ + && !BView_inside_scroll_bar (FRAME_HAIKU_VIEW (f), + b->x, b->y)) { /* If we're leaving towards the menu bar, don't auto-lower here, and wait for a exit -- 2.39.5