From e0fa57d21c83bbfe87b15224f699bc24628fd89f Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 4 Jun 2003 17:16:50 +0000 Subject: [PATCH] allow focus_fallback to query if a client can be focused without changing the focus order on it --- openbox/client.c | 20 ++++++++++++++++++++ openbox/client.h | 4 ++++ openbox/focus.c | 6 +++++- 3 files changed, 29 insertions(+), 1 deletion(-) 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 #include +#include 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; + } } } -- 2.45.2