emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master e14317eec4 2/2: Don't auto-lower when moving onto a menu bar on H


From: Po Lu
Subject: master e14317eec4 2/2: Don't auto-lower when moving onto a menu bar on Haiku
Date: Wed, 16 Feb 2022 20:28:14 -0500 (EST)

branch: master
commit e14317eec4461e86a93906973ff99527e7dfa4df
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    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 f47ba00d5f..cade69f338 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 ced680d2e5..eb78afc6cb 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 c9035d3dc0..67fbd8c5e0 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 f4e2452a6c..f0361c9dbe 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);
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]