all repos — openbox @ c99bb4a049d29d2546074365ab76cecad4d1f65b

openbox fork - make it a bit more like ryudo

add more options for focus fallback, use an enum for all the types of fallbacks.
Dana Jansens danakj@orodu.net
commit

c99bb4a049d29d2546074365ab76cecad4d1f65b

parent

40bfb2b6e5249608f6f7d0c8012ca44f67883843

5 files changed, 24 insertions(+), 24 deletions(-)

jump to
M openbox/client.copenbox/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.copenbox/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.copenbox/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.hopenbox/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.copenbox/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); }