From: Dana Jansens Date: Tue, 8 Apr 2003 06:14:53 +0000 (+0000) Subject: add more options for focus fallback, use an enum for all the types of fallbacks. X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=c99bb4a049d29d2546074365ab76cecad4d1f65b;p=chaz%2Fopenbox add more options for focus fallback, use an enum for all the types of fallbacks. --- diff --git a/openbox/client.c b/openbox/client.c index 68e1e098..22db6738 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -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) diff --git a/openbox/event.c b/openbox/event.c index 3a8f96b6..04174af0 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -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: diff --git a/openbox/focus.c b/openbox/focus.c index d0886a50..8afbdcb6 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -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; diff --git a/openbox/focus.h b/openbox/focus.h index 4c8d4c98..3ad60682 100644 --- a/openbox/focus.h +++ b/openbox/focus.h @@ -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. */ diff --git a/openbox/screen.c b/openbox/screen.c index 3145a63c..4b551b7e 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -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); }