client_startup_stack_size = 0;
if (focus_new)
- focus_fallback(FALSE);
+ focus_fallback(Fallback_NoFocus);
}
void client_manage(Window window)
}
}
- focus_fallback(FALSE);
+ client_unfocus(self);
/* remove from its group */
if (self->group) {
{
g_assert(focus_client == self);
g_message("client_unfocus");
- focus_fallback(FALSE);
+ focus_fallback(Fallback_Unfocusing);
}
gboolean client_focused(Client *self)
/* secret magic way of event_process telling us that no client
was found for the FocusIn event. ^_^ */
if (!isfo && fi.xfocus.window == None)
- focus_fallback(FALSE);
+ focus_fallback(Fallback_NoFocus);
if (fi.xfocus.window == e->xfocus.window)
return;
} else
- focus_fallback(FALSE);
+ focus_fallback(Fallback_NoFocus);
}
break;
case EnterNotify:
return FALSE;
}
-void focus_fallback(gboolean switching_desks)
+void focus_fallback(FallbackType type)
{
GList *it;
Client *old = NULL;
*/
focus_set_client(NULL);
- if (switching_desks) {
- /* don't skip any windows when switching desktops */
- old = NULL;
- }
-
- if (!(switching_desks ? focus_last_on_desktop : focus_last)) {
+ if (!(type == Fallback_Desktop ? focus_last_on_desktop : focus_last)) {
if (focus_follow) focus_under_pointer();
return;
}
- if (old && old->transient_for) {
+ if (type == Fallback_Unfocusing && old && old->transient_for) {
if (old->transient_for == TRAN_GROUP) {
for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
GSList *sit;
return;
}
} else {
- if (client_focus(old->transient_for))
- return;
+ if (client_normal(old->transient_for))
+ if (client_focus(old->transient_for))
+ return;
}
}
for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
- if (it->data != old && client_normal(it->data))
- if (client_focus(it->data))
+ if (type != Fallback_Unfocusing || it->data != old)
+ if (client_normal(it->data) && client_focus(it->data))
return;
/* nothing to focus */
}
ft = client_focus_target(it->data);
if (ft == it->data && focus_client != ft && client_normal(ft) &&
- client_focusable(ft)) {
- if (client_focus(ft)) {
- noreorder++; /* avoid reordering the focus_order */
- return ft;
- }
+ client_focus(ft)) {
+ noreorder++; /* avoid reordering the focus_order */
+ return ft;
}
} while (it != start);
return NULL;
send focus anywhere, its called by the Focus event handlers */
void focus_set_client(struct Client *client);
+typedef enum {
+ Fallback_Desktop, /* switching desktops */
+ Fallback_Unfocusing, /* forcefully remove focus from the curernt window */
+ Fallback_NoFocus /* nothing has focus for some reason */
+} FallbackType;
+
/*! Call this when you need to focus something! */
-void focus_fallback(gboolean switching_desks);
+void focus_fallback(FallbackType type);
/*! Cycle focus amongst windows
Returns the Client to which focus has been cycled, or NULL if none. */
from the switch so it doesnt mess with the focus */
XSync(ob_display, FALSE);
while (XCheckTypedEvent(ob_display, EnterNotify, &e));
- focus_fallback(TRUE);
+ focus_fallback(Fallback_Desktop);
dispatch_ob(Event_Ob_Desktop, num, old);
}