only xungrabkeyboard when we actually have a passive grab on it
This commit is contained in:
parent
8deaf1c239
commit
124303ab72
4 changed files with 41 additions and 13 deletions
|
@ -1828,10 +1828,9 @@ 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);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue