Select the menu item under the mouse when the mouse is moved (Fix bug 5237)

This commit is contained in:
Dana Jansens 2011-10-14 20:48:54 -04:00
parent 8f988b2bef
commit efc9d9708e
3 changed files with 17 additions and 2 deletions

View file

@ -2006,6 +2006,20 @@ static void event_handle_menu(ObMenuFrame *frame, XEvent *ev)
ObMenuEntryFrame *e; ObMenuEntryFrame *e;
switch (ev->type) { switch (ev->type) {
case MotionNotify:
// We need to catch MotionNotify in addition to EnterNotify because
// it is possible for the menu to be opened under the mouse cursor, and
// moving the mouse should select the item.
if ((e = g_hash_table_lookup(menu_frame_map, &ev->xmotion.window))) {
if (e->ignore_enters)
--e->ignore_enters;
else if (!(f = find_active_menu()) ||
f == e->frame ||
f->parent == e->frame ||
f->child == e->frame)
menu_frame_select(e->frame, e, FALSE);
}
break;
case EnterNotify: case EnterNotify:
if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) { if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) {
if (e->ignore_enters) if (e->ignore_enters)

View file

@ -38,7 +38,8 @@
#define FRAME_EVENTMASK (ButtonPressMask |ButtonMotionMask | EnterWindowMask |\ #define FRAME_EVENTMASK (ButtonPressMask |ButtonMotionMask | EnterWindowMask |\
LeaveWindowMask) LeaveWindowMask)
#define ENTRY_EVENTMASK (EnterWindowMask | LeaveWindowMask | \ #define ENTRY_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
ButtonPressMask | ButtonReleaseMask) ButtonPressMask | ButtonReleaseMask | \
PointerMotionMask)
GList *menu_frame_visible; GList *menu_frame_visible;
GHashTable *menu_frame_map; GHashTable *menu_frame_map;

View file

@ -121,7 +121,7 @@ void menu_frame_move_on_screen(ObMenuFrame *self, gint x, gint y,
gint *dx, gint *dy); gint *dx, gint *dy);
gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y, gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y,
gint button); gboolean mouse);
gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent, gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent,
ObMenuEntryFrame *parent_entry); ObMenuEntryFrame *parent_entry);