1) listen for inferiornotify. that way when iconify animating reverts to parent, we see it.
2) set client to null when falling back and update the root window property
3) get rid of the "focus didnt move anywhere" business, and just process the envents in the right order.
if (!w || !WINDOW_IS_CLIENT(w))
return FALSE;
}
if (!w || !WINDOW_IS_CLIENT(w))
return FALSE;
}
+ else {
+ /* This means focus reverted to parent from the client (this
+ happens often during iconify animation) */
+ if (detail == NotifyInferior)
+ return TRUE;
+ }
/* This means focus moved from the root window to a client */
if (detail == NotifyVirtual)
/* This means focus moved from the root window to a client */
if (detail == NotifyVirtual)
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none or"
+ " the frame window\n");
/* If another FocusIn is in the queue then don't fallback yet. This
fixes the fun case of:
/* If another FocusIn is in the queue then don't fallback yet. This
fixes the fun case of:
ob_debug_type(OB_DEBUG_FOCUS,
" but another FocusIn is coming\n");
} else {
ob_debug_type(OB_DEBUG_FOCUS,
" but another FocusIn is coming\n");
} else {
- /* Focus has been reverted to the root window or nothing.
+ /* Focus has been reverted.
FocusOut events come after UnmapNotify, so we don't need to
worry about focusing an invalid window
FocusOut events come after UnmapNotify, so we don't need to
worry about focusing an invalid window
gboolean nomove = FALSE;
XEvent ce;
gboolean nomove = FALSE;
XEvent ce;
+ if (client) {
+ frame_adjust_focus(client->frame, FALSE);
+ /* focus_set_client(NULL) has already been called in this
+ section or by focus_fallback */
+ client_calc_layer(client);
+ }
+
/* Look for the followup FocusIn */
if (!XCheckIfEvent(ob_display, &ce, event_look_for_focusin, NULL)) {
/* There is no FocusIn, this means focus went to a window that
/* Look for the followup FocusIn */
if (!XCheckIfEvent(ob_display, &ce, event_look_for_focusin, NULL)) {
/* There is no FocusIn, this means focus went to a window that
xerror_set_ignore(FALSE);
/* nothing is focused */
focus_set_client(NULL);
xerror_set_ignore(FALSE);
/* nothing is focused */
focus_set_client(NULL);
- } else if (ce.xany.window == e->xany.window) {
- ob_debug_type(OB_DEBUG_FOCUS, "Focus didn't go anywhere\n");
- /* If focus didn't actually move anywhere, there is nothing to do*/
- nomove = TRUE;
- /* Focus did move, so process the FocusIn event */
+ /* Focus moved, so process the FocusIn event */
ObEventData ed = { .ignored = FALSE };
event_process(&ce, &ed);
if (ed.ignored) {
ObEventData ed = { .ignored = FALSE };
event_process(&ce, &ed);
if (ed.ignored) {
focus_fallback(TRUE);
}
}
focus_fallback(TRUE);
}
}
-
- if (client && !nomove) {
- frame_adjust_focus(client->frame, FALSE);
- if (client == focus_client)
- focus_set_client(NULL);
- client_calc_layer(client);
- }
} else if (timewinclients)
event_handle_user_time_window_clients(timewinclients, e);
else if (client)
} else if (timewinclients)
event_handle_user_time_window_clients(timewinclients, e);
else if (client)
screen_install_colormap(NULL, TRUE);
}
screen_install_colormap(NULL, TRUE);
}
- /* Don't set focus_client to NULL here. It will be set to NULL when the
- FocusOut event comes. Otherwise, if we focus nothing and then focus the
- same window again, The focus code says nothing changed, but focus_client
- ends up being NULL anyways.
- focus_client = NULL;
- */
+ /* nothing is focused, update the colormap and _the root property_ */
+ focus_set_client(NULL);
/* if there is a grab going on, then we need to cancel it. if we move
focus during the grab, applications will get NotifyWhileGrabbed events
/* if there is a grab going on, then we need to cancel it. if we move
focus during the grab, applications will get NotifyWhileGrabbed events