summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-06-04 17:16:50 +0000
committerDana Jansens <danakj@orodu.net>2003-06-04 17:16:50 +0000
commite0fa57d21c83bbfe87b15224f699bc24628fd89f (patch)
tree1f8710e396b5369453232f7c91a0c9d0b0f1ebbd /openbox
parent9232682ad64c6ee0956a748312b9ca8136434bf3 (diff)
allow focus_fallback to query if a client can be focused without changing the focus order on it
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c20
-rw-r--r--openbox/client.h4
-rw-r--r--openbox/focus.c6
3 files changed, 29 insertions, 1 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 9e56de05..40b0836e 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -2239,10 +2239,30 @@ Client *client_focus_target(Client *self)
return self;
}
+gboolean client_can_focus(Client *self)
+{
+ /* same code as in client_focus */
+
+ /* choose the correct target */
+ self = client_focus_target(self);
+
+ if (!self->frame->visible)
+ return FALSE;
+
+ if (!((self->can_focus || self->focus_notify) &&
+ (self->desktop == screen_desktop ||
+ self->desktop == DESKTOP_ALL) &&
+ !self->iconic))
+ return FALSE;
+ return TRUE;
+}
+
gboolean client_focus(Client *self)
{
XEvent ev;
+ /* same code as in client_can_focus */
+
/* choose the correct target */
self = client_focus_target(self);
diff --git a/openbox/client.h b/openbox/client.h
index 5d84df0b..ad8f506b 100644
--- a/openbox/client.h
+++ b/openbox/client.h
@@ -430,6 +430,10 @@ void client_set_state(Client *self, Atom action, long data1, long data2);
Client passed to it or another Client if appropriate. */
Client *client_focus_target(Client *self);
+/*! Returns what client_focus would return if passed the same client, but
+ without focusing it or modifying the focus order lists. */
+gboolean client_can_focus(Client *self);
+
/*! Attempt to focus the client window */
gboolean client_focus(Client *self);
diff --git a/openbox/focus.c b/openbox/focus.c
index de98d63b..5909ca77 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -15,6 +15,7 @@
#include <X11/Xlib.h>
#include <glib.h>
+#include <assert.h>
Client *focus_client = NULL;
GList **focus_order = NULL; /* these lists are created when screen_startup
@@ -213,8 +214,11 @@ void focus_fallback(FallbackType type)
for (sit = old->group->members; sit; sit = sit->next)
if (sit->data == it->data)
if (sit->data != old && client_normal(sit->data))
- if (client_focus(sit->data))
+ if (client_can_focus(sit->data)) {
+ gboolean r = client_focus(sit->data);
+ assert(r);
return;
+ }
}
}