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;
}
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
/* 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;
*/
if (!focus_left_screen)
- focus_fallback(FALSE, config_focus_under_mouse, TRUE);
+ focus_fallback(FALSE, config_focus_under_mouse,
+ TRUE, TRUE);
}
}
else if (!client)
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);
}
}
}
ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer,
- gboolean allow_omnipresent)
+ gboolean allow_omnipresent, gboolean focus_lost)
{
ObClient *new;
ObClient *old = focus_client;
/* 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);
/*! 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);
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.. */
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.. */