]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Set focus to the client which was previously focused instead of the next...
authorMichael Stapelberg <michael+x200@stapelberg.de>
Tue, 7 Apr 2009 14:48:42 +0000 (16:48 +0200)
committerMichael Stapelberg <michael+x200@stapelberg.de>
Tue, 7 Apr 2009 14:48:42 +0000 (16:48 +0200)
This fixes ticket #21

src/commands.c

index 258d5a0925d00baf5e1751609b1d23b93628d30a..bc3f277cceb88c2d8397e646e23685d53092cd19 100644 (file)
@@ -171,12 +171,22 @@ static void move_current_window(xcb_connection_t *conn, direction_t direction) {
             container->currently_focused->dock)
                 return;
 
-        /* As soon as the client is moved away, the next client in the old
+        /* As soon as the client is moved away, the last focused client in the old
          * container needs to get focus, if any. Therefore, we save it here. */
         Client *current_client = container->currently_focused;
-        Client *to_focus = CIRCLEQ_NEXT_OR_NULL(&(container->clients), current_client, clients);
-        if (to_focus == NULL)
-                to_focus = CIRCLEQ_PREV_OR_NULL(&(container->clients), current_client, clients);
+        Client *to_focus = NULL, *client_loop;
+
+        SLIST_FOREACH(client_loop, &(container->workspace->focus_stack), focus_clients)
+                if ((client_loop->container == container) && (client_loop != current_client)) {
+                        to_focus = client_loop;
+                        break;
+                }
+
+        if (to_focus == NULL) {
+                to_focus = CIRCLEQ_NEXT_OR_NULL(&(container->clients), current_client, clients);
+                if (to_focus == NULL)
+                        to_focus = CIRCLEQ_PREV_OR_NULL(&(container->clients), current_client, clients);
+        }
 
         switch (direction) {
                 case D_LEFT: