From 0cfd92ab9e56d8f790c92b83436e981fa46efe20 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 4 Aug 2007 13:29:13 -0400 Subject: [PATCH] don't make omnipresent windows lose focus when changing desktops. this is done by allowing focus_fallback to specify if focus has been lost or not. usually if you're call it, focus is lost, but not always. --- openbox/actions/unfocus.c | 2 +- openbox/event.c | 15 ++++++++------- openbox/focus.c | 5 +++-- openbox/focus.h | 3 ++- openbox/screen.c | 6 ++++-- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/openbox/actions/unfocus.c b/openbox/actions/unfocus.c index 70384f4d..0527d2a0 100644 --- a/openbox/actions/unfocus.c +++ b/openbox/actions/unfocus.c @@ -12,6 +12,6 @@ void action_unfocus_startup() static gboolean run_func(ObActionsData *data, gpointer options) { if (data->client && data->client == focus_client) - focus_fallback(FALSE, FALSE, TRUE); + focus_fallback(FALSE, FALSE, TRUE, FALSE); return FALSE; } diff --git a/openbox/event.c b/openbox/event.c index 148d152e..9c47c04a 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -489,7 +489,7 @@ static void event_process(const XEvent *ec, gpointer data) focus_left_screen = FALSE; - focus_fallback(FALSE, config_focus_under_mouse, TRUE); + focus_fallback(FALSE, config_focus_under_mouse, TRUE, TRUE); /* We don't get a FocusOut for this case, because it's just moving from our Inferior up to us. This happens when iconifying a @@ -498,10 +498,10 @@ static void event_process(const XEvent *ec, gpointer data) /* focus_set_client(NULL) has already been called */ client_calc_layer(client); } - if (e->xfocus.detail == NotifyPointerRoot || - e->xfocus.detail == NotifyDetailNone || - e->xfocus.detail == NotifyInferior || - e->xfocus.detail == NotifyNonlinear) + else if (e->xfocus.detail == NotifyPointerRoot || + e->xfocus.detail == NotifyDetailNone || + e->xfocus.detail == NotifyInferior || + e->xfocus.detail == NotifyNonlinear) { XEvent ce; @@ -541,7 +541,8 @@ static void event_process(const XEvent *ec, gpointer data) */ if (!focus_left_screen) - focus_fallback(FALSE, config_focus_under_mouse, TRUE); + focus_fallback(FALSE, config_focus_under_mouse, + TRUE, TRUE); } } else if (!client) @@ -597,7 +598,7 @@ static void event_process(const XEvent *ec, gpointer data) ob_debug_type(OB_DEBUG_FOCUS, "Focus went to an unmanaged window 0x%x !\n", ce.xfocus.window); - focus_fallback(TRUE, config_focus_under_mouse, TRUE); + focus_fallback(TRUE, config_focus_under_mouse, TRUE, TRUE); } } diff --git a/openbox/focus.c b/openbox/focus.c index 0dafd799..b056db7e 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -159,7 +159,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus, } ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer, - gboolean allow_omnipresent) + gboolean allow_omnipresent, gboolean focus_lost) { ObClient *new; ObClient *old = focus_client; @@ -167,7 +167,8 @@ ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer, /* unfocus any focused clients.. they can be focused by Pointer events and such, and then when we try focus them, we won't get a FocusIn event at all for them. */ - focus_nothing(); + if (focus_lost) + focus_nothing(); new = focus_fallback_target(allow_refocus, allow_pointer, allow_omnipresent, old); diff --git a/openbox/focus.h b/openbox/focus.h index 93fe6183..b8f89994 100644 --- a/openbox/focus.h +++ b/openbox/focus.h @@ -46,7 +46,8 @@ void focus_nothing(); /*! Call this when you need to focus something! */ struct _ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer, - gboolean allow_omnipresent); + gboolean allow_omnipresent, + gboolean focus_lost); /*! Add a new client into the focus order */ void focus_order_add_new(struct _ObClient *c); diff --git a/openbox/screen.c b/openbox/screen.c index 7e04d4dc..93ec57f5 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -560,7 +560,9 @@ static void screen_fallback_focus() do this before hiding the windows so if helper windows are coming with us, they don't get hidden */ - if ((c = focus_fallback(TRUE, !config_focus_last, allow_omni))) { + if ((c = focus_fallback(TRUE, !config_focus_last, allow_omni, + !allow_omni))) + { /* only do the flicker reducing stuff ahead of time if we are going to call xsetinputfocus on the window ourselves. otherwise there is no guarantee the window will actually take focus.. */ @@ -1137,7 +1139,7 @@ void screen_show_desktop(gboolean show, ObClient *show_only) else if (!show_only) { ObClient *c; - if ((c = focus_fallback(TRUE, FALSE, TRUE))) { + if ((c = focus_fallback(TRUE, FALSE, TRUE, FALSE))) { /* only do the flicker reducing stuff ahead of time if we are going to call xsetinputfocus on the window ourselves. otherwise there is no guarantee the window will actually take focus.. */ -- 2.39.2