* 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.
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 ();
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
ZOOM_EVENT,
REFS_EVENT,
APP_QUIT_REQUESTED_EVENT,
- DUMMY_EVENT
+ DUMMY_EVENT,
+ MENU_BAR_LEFT
};
struct haiku_quit_requested_event
bigtime_t time;
};
+struct haiku_menu_bar_left_event
+{
+ void *window;
+ int x, y;
+};
+
struct haiku_button_event
{
void *window;
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:
}
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);