summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-04-08 01:03:26 +0000
committerDana Jansens <danakj@orodu.net>2003-04-08 01:03:26 +0000
commitf278ec41e4c310da218563e7d443df32783e26e4 (patch)
tree4132f4bebfacfb7b0956fbe49a7185f909197ac9 /openbox
parentfc32577766755a84ac883b4d862fab3c5e681642 (diff)
fallback to transients' parents when possible.
return the Client* which was focused from focus_cycle
Diffstat (limited to 'openbox')
-rw-r--r--openbox/focus.c23
-rw-r--r--openbox/focus.h7
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