be used
*/
if (focus_cycle_target == client)
- focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
}
static Window createWindow(Window parent, gulong mask,
be used.
*/
if (focus_cycle_target)
- focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
old = focus_client;
focus_client = client;
{
if ((target = client_under_pointer()))
if (allow_refocus || target != old)
- if (client_normal(target) && client_can_focus(target) &&
- client_validate(target)) {
+ if (client_normal(target) && client_can_focus(target)) {
ob_debug("found in pointer stuff\n");
return target;
}
}
#endif
+ ob_debug("trying omnipresentness\n");
+ if (allow_refocus && old && old->desktop == DESKTOP_ALL)
+ return old;
+
+
ob_debug("trying the focus order\n");
for (it = focus_order; it; it = g_list_next(it))
if (allow_refocus || it->data != old) {
focus off to nothing
2. it is validated. if the window is about to disappear, then
don't try focus it.
- 3. it is visible on the screen right now.
- 4. it is a normal type window, don't fall back onto a dock or
+ 3. it is visible on the current desktop. this ignores
+ omnipresent windows, which are problematic in their own rite.
+ 4. it's not iconic
+ 5. it is a normal type window, don't fall back onto a dock or
a splashscreen or a desktop window (save the desktop as a
backup fallback though)
*/
- if (client_can_focus(c) && client_validate(c) &&
- client_should_show(c))
+ if (client_can_focus(c) && c->desktop == screen_desktop &&
+ !c->iconic)
{
if (client_normal(c)) {
ob_debug("found in focus order\n");
}
/* as a last resort fallback to the desktop window if there is one.
- (if there's more than one, then the one last focused.)
+ (if there's more than one, then the one most recently focused.)
*/
return desktop;
}
}
void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
- gboolean dialog, gboolean done, gboolean cancel, Time time)
+ gboolean dialog, gboolean done, gboolean cancel)
{
static ObClient *first = NULL;
static ObClient *t = NULL;
done_cycle:
if (done && focus_cycle_target)
- client_activate(focus_cycle_target, FALSE, TRUE, time);
+ client_activate(focus_cycle_target, FALSE, TRUE);
t = NULL;
first = NULL;
}
void focus_directional_cycle(ObDirection dir, gboolean interactive,
- gboolean dialog, gboolean done, gboolean cancel,
- Time time)
+ gboolean dialog, gboolean done, gboolean cancel)
{
static ObClient *first = NULL;
ObClient *ft = NULL;
done_cycle:
if (done && focus_cycle_target)
- client_activate(focus_cycle_target, FALSE, TRUE, time);
+ client_activate(focus_cycle_target, FALSE, TRUE);
first = NULL;
focus_cycle_target = NULL;