From f278ec41e4c310da218563e7d443df32783e26e4 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 8 Apr 2003 01:03:26 +0000 Subject: [PATCH] fallback to transients' parents when possible. return the Client* which was focused from focus_cycle --- openbox/focus.c | 23 ++++++++++++++++++++--- openbox/focus.h | 7 ++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/openbox/focus.c b/openbox/focus.c index cf6e7b51..b0cd735d 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -3,6 +3,7 @@ #include "client.h" #include "frame.h" #include "screen.h" +#include "group.h" #include "prop.h" #include "dispatch.h" #include "focus.h" @@ -185,6 +186,21 @@ void focus_fallback(gboolean switching_desks) return; } + if (old && old->transient_for) { + if (old->transient_for == TRAN_GROUP) { + for (it = focus_order[screen_desktop]; it != NULL; it = it->next) { + GSList *sit; + + for (sit = old->group->members; sit; sit = sit->next) + if (sit->data == it->data && client_focus(sit->data)) + return; + } + } else { + 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)) @@ -194,7 +210,7 @@ void focus_fallback(gboolean switching_desks) focus_set_client(NULL); } -void focus_cycle(gboolean forward, gboolean linear, gboolean done, +Client *focus_cycle(gboolean forward, gboolean linear, gboolean done, gboolean cancel) { static Client *first = NULL; @@ -235,15 +251,16 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean done, if (ft == it->data && focus_client != ft && client_focusable(ft)) { if (client_focus(ft)) { noreorder++; /* avoid reordering the focus_order */ - break; + return ft; } } } while (it != start); - return; + return NULL; done_cycle: t = NULL; first = NULL; g_list_free(order); order = NULL; + return NULL; } diff --git a/openbox/focus.h b/openbox/focus.h index 6a86965a..4c8d4c98 100644 --- a/openbox/focus.h +++ b/openbox/focus.h @@ -30,8 +30,9 @@ void focus_set_client(struct Client *client); /*! Call this when you need to focus something! */ void focus_fallback(gboolean switching_desks); -/*! Cycle focus amongst windows */ -void focus_cycle(gboolean forward, gboolean linear, gboolean done, - gboolean cancel); +/*! Cycle focus amongst windows + Returns the Client to which focus has been cycled, or NULL if none. */ +struct Client *focus_cycle(gboolean forward, gboolean linear, gboolean done, + gboolean cancel); #endif -- 2.45.2