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,11 +1828,10 @@ static void event_handle_user_input(ObClient *client, XEvent *e)
in the case where it is animating before disappearing */ in the case where it is animating before disappearing */
if (!client || !frame_iconify_animating(client->frame)) if (!client || !frame_iconify_animating(client->frame))
mouse_event(client, e); mouse_event(client, e);
} else if (e->type == KeyPress) { } else
keyboard_event((focus_cycle_target ? focus_cycle_target : keyboard_event((focus_cycle_target ? focus_cycle_target :
(client ? client : focus_client)), e); (client ? client : focus_client)), e);
} }
}
} }
static void focus_delay_dest(gpointer data) static void focus_delay_dest(gpointer data)
@ -1920,20 +1919,20 @@ static gboolean is_enter_focus_event_ignored(XEvent *e)
void event_cancel_all_key_grabs() void event_cancel_all_key_grabs()
{ {
if (keyboard_interactively_grabbed()) if (keyboard_interactively_grabbed()) {
keyboard_interactive_cancel(); keyboard_interactive_cancel();
else if (menu_frame_visible) ob_debug("KILLED interactive event\n");
}
else if (menu_frame_visible) {
menu_frame_hide_all(); menu_frame_hide_all();
else if (grab_on_keyboard()) ob_debug("KILLED open menus\n");
}
else if (grab_on_keyboard()) {
ungrab_keyboard(); ungrab_keyboard();
ob_debug("KILLED active grab on keyboard\n");
}
else else
/* If we don't have the keyboard grabbed, then ungrab it with ungrab_passive_key();
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);
} }
gboolean event_time_after(Time t1, Time t2) gboolean event_time_after(Time t1, Time t2)

View file

@ -39,6 +39,7 @@ static guint kgrabs = 0;
static guint pgrabs = 0; static guint pgrabs = 0;
/*! The time at which the last grab was made */ /*! The time at which the last grab was made */
static Time grab_time = CurrentTime; static Time grab_time = CurrentTime;
static gint passive_count = 0;
static Time ungrab_time() static Time ungrab_time()
{ {
@ -78,8 +79,10 @@ gboolean grab_keyboard_full(gboolean grab)
event_curtime) == Success; event_curtime) == Success;
if (!ret) if (!ret)
--kgrabs; --kgrabs;
else else {
passive_count = 0;
grab_time = event_curtime; grab_time = event_curtime;
}
} else } else
ret = TRUE; ret = TRUE;
} else if (kgrabs > 0) { } else if (kgrabs > 0) {
@ -207,3 +210,20 @@ void ungrab_all_keys(Window win)
{ {
XUngrabKey(ob_display, AnyKey, AnyModifier, 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 ungrab_all_keys(Window win);
void grab_key_passive_count(int change);
void ungrab_passive_key();
#endif #endif

View file

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