ignore crossing events while an interactive grab is going on.

when a menu is open, use the crossing events for the menu only.
This commit is contained in:
Dana Jansens 2007-04-22 02:12:32 +00:00
parent 05d1a86eff
commit a5caab959c
2 changed files with 9 additions and 10 deletions

View file

@ -387,9 +387,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client)
switch(e->type) {
case EnterNotify:
case LeaveNotify:
if (e->xcrossing.detail == NotifyInferior)
return TRUE;
break;
return keyboard_interactively_grabbed();
case FocusIn:
case FocusOut:
/* I don't think this should ever happen with our event masks, but
@ -473,7 +471,13 @@ static void event_process(const XEvent *ec, gpointer data)
ed->ignored = FALSE;
/* deal with it in the kernel */
if (group)
if (menu_frame_visible &&
(e->type == EnterNotify || e->type == LeaveNotify))
{
/* crossing events for menu */
event_handle_menu(e);
} else if (group)
event_handle_group(group, e);
else if (client)
event_handle_client(client, e);
@ -506,11 +510,6 @@ static void event_process(const XEvent *ec, gpointer data)
xerror_set_ignore(FALSE);
}
/* crossing events for menu */
if (e->type == EnterNotify || e->type == LeaveNotify)
if (menu_frame_visible)
event_handle_menu(e);
/* user input (action-bound) events */
if (e->type == ButtonPress || e->type == ButtonRelease ||
e->type == MotionNotify || e->type == KeyPress ||

View file

@ -72,7 +72,7 @@ gboolean grab_keyboard(gboolean grab)
if (grab) {
if (kgrabs++ == 0) {
ret = XGrabKeyboard(ob_display, RootWindow(ob_display, ob_screen),
FALSE, GrabModeAsync, GrabModeAsync,
False, GrabModeAsync, GrabModeAsync,
event_curtime) == Success;
if (!ret)
--kgrabs;