add more options for focus fallback, use an enum for all the types of fallbacks.
Dana Jansens danakj@orodu.net
5 files changed,
24 insertions(+),
24 deletions(-)
M
openbox/client.c
→
openbox/client.c
@@ -139,7 +139,7 @@ client_startup_stack_order = NULL;
client_startup_stack_size = 0; if (focus_new) - focus_fallback(FALSE); + focus_fallback(Fallback_NoFocus); } void client_manage(Window window)@@ -312,7 +312,7 @@ client_calc_layer(it->data);
} } - 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)
M
openbox/event.c
→
openbox/event.c
@@ -277,11 +277,11 @@
/* 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:
M
openbox/focus.c
→
openbox/focus.c
@@ -163,7 +163,7 @@ }
return FALSE; } -void focus_fallback(gboolean switching_desks) +void focus_fallback(FallbackType type) { GList *it; Client *old = NULL;@@ -176,17 +176,12 @@ at all for them.
*/ 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 @@ if (sit->data == it->data && client_focus(sit->data))
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 @@ if (it == NULL) it = g_list_last(list);
} 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;
M
openbox/focus.h
→
openbox/focus.h
@@ -27,8 +27,14 @@ /*! Specify which client is currently focused, this doesn't actually
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. */
M
openbox/screen.c
→
openbox/screen.c
@@ -290,7 +290,7 @@ /* focus the last focused window on the desktop, and ignore enter events
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); }