GList *focus_order = NULL;
ObClient *focus_cycle_target = NULL;
-/*! This variable is used for focus fallback. If we fallback to a window, we
- set this to the window. And when focus goes somewhere after that, it will
- be set to NULL. If between falling back to that window and something
- getting focused, the window gets unmanaged, then if there are no incoming
- FocusIn events, we fallback again because focus has just gotten itself lost.
- */
-static ObClient *focus_tried = NULL;
-
struct {
InternalWindow top;
InternalWindow left;
gboolean dock_windows,
gboolean desktop_windows);
static void focus_cycle_destroy_notify(ObClient *client, gpointer data);
-static void focus_tried_hide_notify(ObClient *client, gpointer data);
static Window createWindow(Window parent, gulong mask,
XSetWindowAttributes *attrib)
XSetWindowAttributes attr;
client_add_destroy_notify(focus_cycle_destroy_notify, NULL);
- client_add_destroy_notify(focus_tried_hide_notify, NULL);
- client_add_hide_notify(focus_tried_hide_notify, NULL);
/* start with nothing focused */
focus_nothing();
if (!reconfig) {
client_remove_destroy_notify(focus_cycle_destroy_notify);
- client_remove_destroy_notify(focus_tried_hide_notify);
- client_remove_hide_notify(focus_tried_hide_notify);
/* reset focus to root */
XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
PROP_SET32(RootWindow(ob_display, ob_screen),
net_active_window, window, active);
}
-
-
- focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
}
static ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
event at all for them. */
focus_nothing();
- if (new) {
+ if (new)
client_focus(new);
- /* remember that we tried to send focus here */
- focus_tried = new;
- }
return new;
}
focus_client = NULL;
*/
- focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
-
/* 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
and ignore them !
}
return NULL;
}
-
-static void focus_tried_hide_notify(ObClient *client, gpointer data)
-{
- XEvent ce;
-
- if (client == focus_tried) {
- /* we were trying to focus this window but it's gone */
-
- focus_tried = NULL;
-
- ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
- "is being unmanaged:\n");
- if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client,NULL))
- {
- XPutBackEvent(ob_display, &ce);
- ob_debug_type(OB_DEBUG_FOCUS, " but another FocusIn is coming\n");
- } else {
- ob_debug_type(OB_DEBUG_FOCUS, " so falling back focus again.\n");
- focus_fallback(TRUE);
- }
- }
-}