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:
parent
05d1a86eff
commit
a5caab959c
2 changed files with 9 additions and 10 deletions
|
@ -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 ||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue