only xungrabkeyboard when we actually have a passive grab on it

This commit is contained in:
Dana Jansens 2007-06-12 15:53:14 +00:00
parent 8deaf1c239
commit 124303ab72
4 changed files with 41 additions and 13 deletions

View file

@ -1828,10 +1828,9 @@ static void event_handle_user_input(ObClient *client, XEvent *e)
in the case where it is animating before disappearing */
if (!client || !frame_iconify_animating(client->frame))
mouse_event(client, e);
} else if (e->type == KeyPress) {
} else
keyboard_event((focus_cycle_target ? focus_cycle_target :
(client ? client : focus_client)), e);
}
}
}
@ -1920,20 +1919,20 @@ static gboolean is_enter_focus_event_ignored(XEvent *e)
void event_cancel_all_key_grabs()
{
if (keyboard_interactively_grabbed())
if (keyboard_interactively_grabbed()) {
keyboard_interactive_cancel();
else if (menu_frame_visible)
ob_debug("KILLED interactive event\n");
}
else if (menu_frame_visible) {
menu_frame_hide_all();
else if (grab_on_keyboard())
ob_debug("KILLED open menus\n");
}
else if (grab_on_keyboard()) {
ungrab_keyboard();
ob_debug("KILLED active grab on keyboard\n");
}
else
/* If we don't have the keyboard grabbed, then ungrab it with
XUngrabKeyboard, so that there is not a passive grab left
on from the KeyPress. If the grab is left on, and focus
moves during that time, it will be NotifyWhileGrabbed, and
applications like to ignore those! */
XUngrabKeyboard(ob_display, CurrentTime);
ungrab_passive_key();
}
gboolean event_time_after(Time t1, Time t2)

View file

@ -39,6 +39,7 @@ static guint kgrabs = 0;
static guint pgrabs = 0;
/*! The time at which the last grab was made */
static Time grab_time = CurrentTime;
static gint passive_count = 0;
static Time ungrab_time()
{
@ -78,8 +79,10 @@ gboolean grab_keyboard_full(gboolean grab)
event_curtime) == Success;
if (!ret)
--kgrabs;
else
else {
passive_count = 0;
grab_time = event_curtime;
}
} else
ret = TRUE;
} else if (kgrabs > 0) {
@ -207,3 +210,20 @@ void ungrab_all_keys(Window win)
{
XUngrabKey(ob_display, AnyKey, AnyModifier, win);
}
void grab_key_passive_count(int change)
{
if (grab_on_keyboard()) return;
passive_count += change;
if (passive_count < 0) passive_count = 0;
}
void ungrab_passive_key()
{
ob_debug("ungrabbing %d passive grabs\n", passive_count);
if (passive_count) {
/* kill out passive grab */
XUngrabKeyboard(ob_display, event_curtime);
passive_count = 0;
}
}

View file

@ -49,4 +49,7 @@ void grab_key(guint keycode, guint state, Window win, gint keyboard_mode);
void ungrab_all_keys(Window win);
void grab_key_passive_count(int change);
void ungrab_passive_key();
#endif

View file

@ -276,7 +276,13 @@ void keyboard_event(ObClient *client, const XEvent *e)
{
KeyBindingTree *p;
if (e->type == KeyRelease) {
grab_key_passive_count(-1);
return;
}
g_assert(e->type == KeyPress);
grab_key_passive_count(1);
if (e->xkey.keycode == config_keyboard_reset_keycode &&
e->xkey.state == config_keyboard_reset_state)