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);
- }
}
}
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)
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()
{
event_curtime) == Success;
if (!ret)
--kgrabs;
- else
+ else {
+ passive_count = 0;
grab_time = event_curtime;
+ }
} else
ret = TRUE;
} else if (kgrabs > 0) {
{
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;
+ }
+}
{
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)