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.

This commit is contained in:
Dana Jansens 2007-08-04 13:29:13 -04:00
parent ac59dd4fe5
commit 0cfd92ab9e
5 changed files with 18 additions and 13 deletions

View file

@ -12,6 +12,6 @@ void action_unfocus_startup()
static gboolean run_func(ObActionsData *data, gpointer options) static gboolean run_func(ObActionsData *data, gpointer options)
{ {
if (data->client && data->client == focus_client) if (data->client && data->client == focus_client)
focus_fallback(FALSE, FALSE, TRUE); focus_fallback(FALSE, FALSE, TRUE, FALSE);
return FALSE; return FALSE;
} }

View file

@ -489,7 +489,7 @@ static void event_process(const XEvent *ec, gpointer data)
focus_left_screen = FALSE; 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 /* 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 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 */ /* focus_set_client(NULL) has already been called */
client_calc_layer(client); client_calc_layer(client);
} }
if (e->xfocus.detail == NotifyPointerRoot || else if (e->xfocus.detail == NotifyPointerRoot ||
e->xfocus.detail == NotifyDetailNone || e->xfocus.detail == NotifyDetailNone ||
e->xfocus.detail == NotifyInferior || e->xfocus.detail == NotifyInferior ||
e->xfocus.detail == NotifyNonlinear) e->xfocus.detail == NotifyNonlinear)
{ {
XEvent ce; XEvent ce;
@ -541,7 +541,8 @@ static void event_process(const XEvent *ec, gpointer data)
*/ */
if (!focus_left_screen) if (!focus_left_screen)
focus_fallback(FALSE, config_focus_under_mouse, TRUE); focus_fallback(FALSE, config_focus_under_mouse,
TRUE, TRUE);
} }
} }
else if (!client) else if (!client)
@ -597,7 +598,7 @@ static void event_process(const XEvent *ec, gpointer data)
ob_debug_type(OB_DEBUG_FOCUS, ob_debug_type(OB_DEBUG_FOCUS,
"Focus went to an unmanaged window 0x%x !\n", "Focus went to an unmanaged window 0x%x !\n",
ce.xfocus.window); ce.xfocus.window);
focus_fallback(TRUE, config_focus_under_mouse, TRUE); focus_fallback(TRUE, config_focus_under_mouse, TRUE, TRUE);
} }
} }

View file

@ -159,7 +159,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
} }
ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer, ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer,
gboolean allow_omnipresent) gboolean allow_omnipresent, gboolean focus_lost)
{ {
ObClient *new; ObClient *new;
ObClient *old = focus_client; 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 /* 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 and such, and then when we try focus them, we won't get a FocusIn
event at all for them. */ event at all for them. */
focus_nothing(); if (focus_lost)
focus_nothing();
new = focus_fallback_target(allow_refocus, allow_pointer, new = focus_fallback_target(allow_refocus, allow_pointer,
allow_omnipresent, old); allow_omnipresent, old);

View file

@ -46,7 +46,8 @@ void focus_nothing();
/*! Call this when you need to focus something! */ /*! Call this when you need to focus something! */
struct _ObClient* focus_fallback(gboolean allow_refocus, struct _ObClient* focus_fallback(gboolean allow_refocus,
gboolean allow_pointer, gboolean allow_pointer,
gboolean allow_omnipresent); gboolean allow_omnipresent,
gboolean focus_lost);
/*! Add a new client into the focus order */ /*! Add a new client into the focus order */
void focus_order_add_new(struct _ObClient *c); void focus_order_add_new(struct _ObClient *c);

View file

@ -560,7 +560,9 @@ static void screen_fallback_focus()
do this before hiding the windows so if helper windows are coming do this before hiding the windows so if helper windows are coming
with us, they don't get hidden 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 /* only do the flicker reducing stuff ahead of time if we are going
to call xsetinputfocus on the window ourselves. otherwise there is to call xsetinputfocus on the window ourselves. otherwise there is
no guarantee the window will actually take focus.. */ 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) { else if (!show_only) {
ObClient *c; 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 /* only do the flicker reducing stuff ahead of time if we are going
to call xsetinputfocus on the window ourselves. otherwise there to call xsetinputfocus on the window ourselves. otherwise there
is no guarantee the window will actually take focus.. */ is no guarantee the window will actually take focus.. */