add more options for focus fallback, use an enum for all the types of fallbacks.
This commit is contained in:
parent
40bfb2b6e5
commit
c99bb4a049
5 changed files with 24 additions and 24 deletions
|
@ -139,7 +139,7 @@ void client_manage_all()
|
|||
client_startup_stack_size = 0;
|
||||
|
||||
if (focus_new)
|
||||
focus_fallback(FALSE);
|
||||
focus_fallback(Fallback_NoFocus);
|
||||
}
|
||||
|
||||
void client_manage(Window window)
|
||||
|
@ -312,7 +312,7 @@ void client_unmanage(Client *self)
|
|||
}
|
||||
}
|
||||
|
||||
focus_fallback(FALSE);
|
||||
client_unfocus(self);
|
||||
|
||||
/* remove from its group */
|
||||
if (self->group) {
|
||||
|
@ -2080,7 +2080,7 @@ void client_unfocus(Client *self)
|
|||
{
|
||||
g_assert(focus_client == self);
|
||||
g_message("client_unfocus");
|
||||
focus_fallback(FALSE);
|
||||
focus_fallback(Fallback_Unfocusing);
|
||||
}
|
||||
|
||||
gboolean client_focused(Client *self)
|
||||
|
|
|
@ -277,11 +277,11 @@ void event_process(XEvent *e)
|
|||
/* 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:
|
||||
|
|
|
@ -163,7 +163,7 @@ static gboolean focus_under_pointer()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
void focus_fallback(gboolean switching_desks)
|
||||
void focus_fallback(FallbackType type)
|
||||
{
|
||||
GList *it;
|
||||
Client *old = NULL;
|
||||
|
@ -176,17 +176,12 @@ void focus_fallback(gboolean switching_desks)
|
|||
*/
|
||||
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;
|
||||
|
@ -196,14 +191,15 @@ void focus_fallback(gboolean switching_desks)
|
|||
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 */
|
||||
|
@ -249,11 +245,9 @@ Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
|
|||
}
|
||||
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;
|
||||
|
|
|
@ -27,8 +27,14 @@ void focus_shutdown();
|
|||
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. */
|
||||
|
|
|
@ -290,7 +290,7 @@ void screen_set_desktop(guint num)
|
|||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue