all repos — openbox @ 124303ab7233734273eeccbc7c7507b09ddb2675

openbox fork - make it a bit more like ryudo

only xungrabkeyboard when we actually have a passive grab on it
Dana Jansens danakj@orodu.net
commit

124303ab7233734273eeccbc7c7507b09ddb2675

parent

8deaf1c239bf65221918ac06c77ea6fdec04b27c

4 files changed, 41 insertions(+), 13 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -1828,10 +1828,9 @@ /* the frame may not be "visible" but they can still click on it

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 @@ }

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)
M openbox/grab.copenbox/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 @@ False, GrabModeAsync, GrabModeAsync,

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; + } +}
M openbox/grab.hopenbox/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
M openbox/keyboard.copenbox/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)