Don't auto-lower when moving onto a menu bar on Haiku
authorPo Lu <luangruo@yahoo.com>
Thu, 17 Feb 2022 01:26:14 +0000 (01:26 +0000)
committerPo Lu <luangruo@yahoo.com>
Thu, 17 Feb 2022 01:26:14 +0000 (01:26 +0000)
* 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
src/haiku_support.cc
src/haiku_support.h
src/haikuterm.c

index f47ba00d5fbc22279abc8b3c77bad6ab3cdae231..cade69f3387b97930e5cf9e3d97cd456ed1111dc 100644 (file)
@@ -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 ();
index ced680d2e53efef2142c51f6cfcb28d5c85f292e..eb78afc6cbb174c0099e8732b8d07394bc14679c 100644 (file)
@@ -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
index c9035d3dc0dd9bb5df094a3f357035db14f2c1c0..67fbd8c5e01b8f263b5c02653453431897a0c663 100644 (file)
@@ -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;
index f4e2452a6c97802f18c21059715b8484c5fe5ecb..f0361c9dbea12b8dcc7f7dd981f32520374fcc68 100644 (file)
@@ -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);