X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=32a715ef6fbe1090361c3cf283c33bee9ec34d9a;hb=73b490f614e4dda2849274ca75ab09325a71362e;hp=07ac963c3a4fc5ee41488e3e68e0b17fd8cd8478;hpb=83d987d9abb9e15b7c6f41fdb29e4f6a0bf200f9;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 07ac963c..32a715ef 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, @@ -158,18 +158,16 @@ void focus_set_client(ObClient *client) Window active; ObClient *old; -#ifdef DEBUG_FOCUS - ob_debug("focus_set_client 0x%lx\n", client ? client->window : 0); -#endif + ob_debug_type(OB_DEBUG_FOCUS, + "focus_set_client 0x%lx\n", client ? client->window : 0); /* uninstall the old colormap, and install the new one */ screen_install_colormap(focus_client, FALSE); screen_install_colormap(client, TRUE); if (client == NULL) { -#ifdef DEBUG_FOCUS - ob_debug("actively focusing NONWINDOW\n"); -#endif + ob_debug_type(OB_DEBUG_FOCUS, "actively focusing NONWINDOW\n"); + /* when nothing will be focused, send focus to the backup target */ XSetInputFocus(ob_display, screen_support_win, RevertToNone, event_curtime); @@ -180,7 +178,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; @@ -207,14 +205,13 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old) ObClient *target = NULL; ObClient *desktop = NULL; - ob_debug("trying pointer stuff\n"); + ob_debug_type(OB_DEBUG_FOCUS, "trying pointer stuff\n"); if (config_focus_follow && !config_focus_last) { if ((target = client_under_pointer())) if (allow_refocus || target != old) - if (client_normal(target) && client_can_focus(target) && - client_validate(target)) { - ob_debug("found in pointer stuff\n"); + if (client_normal(target) && client_can_focus(target)) { + ob_debug_type(OB_DEBUG_FOCUS, "found in pointer stuff\n"); return target; } } @@ -233,7 +230,12 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old) } #endif - ob_debug("trying the focus order\n"); + ob_debug_type(OB_DEBUG_FOCUS, "trying omnipresentness\n"); + if (allow_refocus && old && old->desktop == DESKTOP_ALL) + return old; + + + ob_debug_type(OB_DEBUG_FOCUS, "trying the focus order\n"); for (it = focus_order; it; it = g_list_next(it)) if (allow_refocus || it->data != old) { ObClient *c = it->data; @@ -249,11 +251,11 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old) a splashscreen or a desktop window (save the desktop as a backup fallback though) */ - if (client_can_focus(c) && client_validate(c) && - c->desktop == screen_desktop && !c->iconic) + if (client_can_focus(c) && c->desktop == screen_desktop && + !c->iconic) { if (client_normal(c)) { - ob_debug("found in focus order\n"); + ob_debug_type(OB_DEBUG_FOCUS, "found in focus order\n"); return it->data; } else if (c->type == OB_CLIENT_TYPE_DESKTOP && !desktop) desktop = c; @@ -261,7 +263,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; } @@ -280,6 +282,9 @@ void focus_fallback(gboolean allow_refocus) */ focus_set_client(NULL); + /* If some delayed focusing is going on, cancel it */ + event_halt_focus_delay(); + if ((new = focus_fallback_target(allow_refocus, old))) client_focus(new); } @@ -492,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; @@ -553,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; @@ -570,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; @@ -616,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;