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;
|
client_startup_stack_size = 0;
|
||||||
|
|
||||||
if (focus_new)
|
if (focus_new)
|
||||||
focus_fallback(FALSE);
|
focus_fallback(Fallback_NoFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void client_manage(Window window)
|
void client_manage(Window window)
|
||||||
|
@ -312,7 +312,7 @@ void client_unmanage(Client *self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
focus_fallback(FALSE);
|
client_unfocus(self);
|
||||||
|
|
||||||
/* remove from its group */
|
/* remove from its group */
|
||||||
if (self->group) {
|
if (self->group) {
|
||||||
|
@ -2080,7 +2080,7 @@ void client_unfocus(Client *self)
|
||||||
{
|
{
|
||||||
g_assert(focus_client == self);
|
g_assert(focus_client == self);
|
||||||
g_message("client_unfocus");
|
g_message("client_unfocus");
|
||||||
focus_fallback(FALSE);
|
focus_fallback(Fallback_Unfocusing);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean client_focused(Client *self)
|
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
|
/* secret magic way of event_process telling us that no client
|
||||||
was found for the FocusIn event. ^_^ */
|
was found for the FocusIn event. ^_^ */
|
||||||
if (!isfo && fi.xfocus.window == None)
|
if (!isfo && fi.xfocus.window == None)
|
||||||
focus_fallback(FALSE);
|
focus_fallback(Fallback_NoFocus);
|
||||||
if (fi.xfocus.window == e->xfocus.window)
|
if (fi.xfocus.window == e->xfocus.window)
|
||||||
return;
|
return;
|
||||||
} else
|
} else
|
||||||
focus_fallback(FALSE);
|
focus_fallback(Fallback_NoFocus);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EnterNotify:
|
case EnterNotify:
|
||||||
|
|
|
@ -163,7 +163,7 @@ static gboolean focus_under_pointer()
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void focus_fallback(gboolean switching_desks)
|
void focus_fallback(FallbackType type)
|
||||||
{
|
{
|
||||||
GList *it;
|
GList *it;
|
||||||
Client *old = NULL;
|
Client *old = NULL;
|
||||||
|
@ -176,17 +176,12 @@ void focus_fallback(gboolean switching_desks)
|
||||||
*/
|
*/
|
||||||
focus_set_client(NULL);
|
focus_set_client(NULL);
|
||||||
|
|
||||||
if (switching_desks) {
|
if (!(type == Fallback_Desktop ? focus_last_on_desktop : focus_last)) {
|
||||||
/* don't skip any windows when switching desktops */
|
|
||||||
old = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(switching_desks ? focus_last_on_desktop : focus_last)) {
|
|
||||||
if (focus_follow) focus_under_pointer();
|
if (focus_follow) focus_under_pointer();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old && old->transient_for) {
|
if (type == Fallback_Unfocusing && old && old->transient_for) {
|
||||||
if (old->transient_for == TRAN_GROUP) {
|
if (old->transient_for == TRAN_GROUP) {
|
||||||
for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
|
for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
|
||||||
GSList *sit;
|
GSList *sit;
|
||||||
|
@ -196,14 +191,15 @@ void focus_fallback(gboolean switching_desks)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (client_focus(old->transient_for))
|
if (client_normal(old->transient_for))
|
||||||
return;
|
if (client_focus(old->transient_for))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
|
for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
|
||||||
if (it->data != old && client_normal(it->data))
|
if (type != Fallback_Unfocusing || it->data != old)
|
||||||
if (client_focus(it->data))
|
if (client_normal(it->data) && client_focus(it->data))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* nothing to focus */
|
/* nothing to focus */
|
||||||
|
@ -249,11 +245,9 @@ Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
|
||||||
}
|
}
|
||||||
ft = client_focus_target(it->data);
|
ft = client_focus_target(it->data);
|
||||||
if (ft == it->data && focus_client != ft && client_normal(ft) &&
|
if (ft == it->data && focus_client != ft && client_normal(ft) &&
|
||||||
client_focusable(ft)) {
|
client_focus(ft)) {
|
||||||
if (client_focus(ft)) {
|
noreorder++; /* avoid reordering the focus_order */
|
||||||
noreorder++; /* avoid reordering the focus_order */
|
return ft;
|
||||||
return ft;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} while (it != start);
|
} while (it != start);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -27,8 +27,14 @@ void focus_shutdown();
|
||||||
send focus anywhere, its called by the Focus event handlers */
|
send focus anywhere, its called by the Focus event handlers */
|
||||||
void focus_set_client(struct Client *client);
|
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! */
|
/*! Call this when you need to focus something! */
|
||||||
void focus_fallback(gboolean switching_desks);
|
void focus_fallback(FallbackType type);
|
||||||
|
|
||||||
/*! Cycle focus amongst windows
|
/*! Cycle focus amongst windows
|
||||||
Returns the Client to which focus has been cycled, or NULL if none. */
|
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 */
|
from the switch so it doesnt mess with the focus */
|
||||||
XSync(ob_display, FALSE);
|
XSync(ob_display, FALSE);
|
||||||
while (XCheckTypedEvent(ob_display, EnterNotify, &e));
|
while (XCheckTypedEvent(ob_display, EnterNotify, &e));
|
||||||
focus_fallback(TRUE);
|
focus_fallback(Fallback_Desktop);
|
||||||
|
|
||||||
dispatch_ob(Event_Ob_Desktop, num, old);
|
dispatch_ob(Event_Ob_Desktop, num, old);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue