X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=6652c5deb069b750cb819a96eb0d0eac298f5d70;hb=d20f84f5ded581c57df5904c6fa550dac05ad036;hp=4be187b9a7682d8ed13a5edaee3da32dd56eed31;hpb=c80b496bf407d73bea169058abfcda44effad0dd;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 4be187b9..6652c5de 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -59,7 +59,7 @@ static void focus_cycle_destructor(ObClient *client, gpointer data) 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, @@ -180,7 +180,7 @@ void focus_set_client(ObClient *client) 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; @@ -233,6 +233,11 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old) } #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) { @@ -242,13 +247,15 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *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)) + c->desktop == screen_desktop && !c->iconic) { if (client_normal(c)) { ob_debug("found in focus order\n"); @@ -259,7 +266,7 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old) } /* 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; } @@ -490,7 +497,7 @@ static gboolean valid_focus_target(ObClient *ft) } 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; @@ -551,7 +558,7 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean interactive, 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; @@ -568,8 +575,7 @@ done_cycle: } 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; @@ -614,7 +620,7 @@ void focus_directional_cycle(ObDirection dir, gboolean interactive, 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;