g_assert(self != NULL);
frame_hide(self->frame);
+ /* sync to send the hide to the server quickly, and to get back the enter
+ events */
XSync(ob_display, FALSE);
if (focus_client == self) {
NULL, g_direct_equal, NULL);
if (e->type == ButtonPress || e->type == ButtonRelease ||
- e->type == MotionNotify)
- mouse_event(client, e);
- else if (e->type == KeyPress) {
+ e->type == MotionNotify) {
+ if (!keyboard_interactively_grabbed())
+ mouse_event(client, e);
+ } else if (e->type == KeyPress) {
keyboard_event((focus_cycle_target ? focus_cycle_target :
(focus_hilite ? focus_hilite : client)),
e);
frame_adjust_state(client->frame);
break;
case OB_FRAME_CONTEXT_FRAME:
+ if (keyboard_interactively_grabbed())
+ break;
if (config_focus_follow && config_focus_delay)
ob_main_loop_timeout_remove_data(ob_main_loop,
focus_delay_func,
frame_adjust_state(client->frame);
break;
case OB_FRAME_CONTEXT_FRAME:
+ if (keyboard_interactively_grabbed())
+ break;
if (e->xcrossing.mode == NotifyGrab ||
e->xcrossing.mode == NotifyUngrab)
{
void focus_cycle_draw_indicator()
{
if (!focus_cycle_target) {
+ XEvent e;
+
XUnmapWindow(ob_display, focus_indicator.top.win);
XUnmapWindow(ob_display, focus_indicator.left.win);
XUnmapWindow(ob_display, focus_indicator.right.win);
XUnmapWindow(ob_display, focus_indicator.bottom.win);
+
+ /* kill enter events cause by this unmapping */
+ XSync(ob_display, FALSE);
+ while (XCheckTypedEvent(ob_display, EnterNotify, &e));
} else {
/*
if (focus_cycle_target)
g_assert(action->data.any.interactive);
if (!interactive_states) {
- if (!grab_keyboard(TRUE))
- return FALSE;
- if (!grab_pointer(TRUE, FALSE, OB_CURSOR_NONE)) {
- grab_keyboard(FALSE);
+ if (!grab_keyboard(TRUE)) {
+ ob_debug("grab KEYBOARD failed\n");
return FALSE;
}
}
if (!interactive_states) {
grab_keyboard(FALSE);
- grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
keyboard_reset_chains();
}
}
void popup_hide(ObPopup *self)
{
if (self->mapped) {
+ XEvent e;
+
XUnmapWindow(ob_display, self->bg);
self->mapped = FALSE;
+
+ /* kill enter events cause by this unmapping */
+ XSync(ob_display, FALSE);
+ while (XCheckTypedEvent(ob_display, EnterNotify, &e));
}
}