From: Dana Jansens Date: Tue, 12 Jun 2007 15:53:14 +0000 (+0000) Subject: only xungrabkeyboard when we actually have a passive grab on it X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=124303ab7233734273eeccbc7c7507b09ddb2675;p=chaz%2Fopenbox only xungrabkeyboard when we actually have a passive grab on it --- diff --git a/openbox/event.c b/openbox/event.c index 9dd78c17..12ecdac0 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -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) diff --git a/openbox/grab.c b/openbox/grab.c index ac91a6bc..85027d5d 100644 --- a/openbox/grab.c +++ b/openbox/grab.c @@ -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; + } +} diff --git a/openbox/grab.h b/openbox/grab.h index 8a654c8b..30c4b709 100644 --- a/openbox/grab.h +++ b/openbox/grab.h @@ -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 diff --git a/openbox/keyboard.c b/openbox/keyboard.c index e62f5011..9fd38def 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -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)