]> git.sur5r.net Git - i3/i3/commitdiff
Implement correct rendering of floating windows (decoration color)
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 5 Aug 2009 17:59:58 +0000 (19:59 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 5 Aug 2009 17:59:58 +0000 (19:59 +0200)
src/layout.c
src/util.c

index 44ce1b1d747f3f18b2b9e15d25552c3ecaf40737..9cc41a0c2572e3c64954e8700da4fbad25ec430e 100644 (file)
@@ -103,19 +103,27 @@ void decorate_window(xcb_connection_t *conn, Client *client, xcb_drawable_t draw
         i3Font *font = load_font(conn, config.font);
         int decoration_height = font->height + 2 + 2;
         struct Colortriple *color;
+        Client *last_focused;
 
         /* Clients without a container (docks) won’t get decorated */
         if (client->dock)
                 return;
 
         LOG("redecorating child %08x\n", client->child);
-        if (client_is_floating(client) || client->container->currently_focused == client) {
-                /* Distinguish if the window is currently focused… */
-                if (client_is_floating(client) || CUR_CELL->currently_focused == client)
+        last_focused = SLIST_FIRST(&(client->workspace->focus_stack));
+        if (client_is_floating(client)) {
+                if (last_focused == client)
                         color = &(config.client.focused);
-                /* …or if it is the focused window in a not focused container */
-                else color = &(config.client.focused_inactive);
-        } else color = &(config.client.unfocused);
+                else color = &(config.client.unfocused);
+        } else {
+                if (client->container->currently_focused == client) {
+                        /* Distinguish if the window is currently focused… */
+                        if (last_focused == client)
+                                color = &(config.client.focused);
+                        /* …or if it is the focused window in a not focused container */
+                        else color = &(config.client.focused_inactive);
+                } else color = &(config.client.unfocused);
+        }
 
         /* Our plan is the following:
            - Draw a rect around the whole client in color->background
index ff98bb3107fb12e0d99e63f6c6b373ba9a505a6e..d09dafe2a48566c2426c5c3a47a207a3bee9d3ef 100644 (file)
@@ -348,11 +348,6 @@ void set_focus(xcb_connection_t *conn, Client *client, bool set_anyways) {
                         redecorate_window(conn, last_focused);
         }
 
-        /* If we’re in stacking mode, this renders the container to update changes in the title
-           bars and to raise the focused client */
-        if ((old_client != NULL) && (old_client != client) && !old_client->dock)
-                redecorate_window(conn, old_client);
-
         /* If the last client was a floating client, we need to go to the next
          * tiling client in stack and re-decorate it. */
         if (old_client != NULL && client_is_floating(old_client)) {
@@ -372,6 +367,11 @@ void set_focus(xcb_connection_t *conn, Client *client, bool set_anyways) {
         SLIST_REMOVE(&(client->workspace->focus_stack), client, Client, focus_clients);
         SLIST_INSERT_HEAD(&(client->workspace->focus_stack), client, focus_clients);
 
+        /* If we’re in stacking mode, this renders the container to update changes in the title
+           bars and to raise the focused client */
+        if ((old_client != NULL) && (old_client != client) && !old_client->dock)
+                redecorate_window(conn, old_client);
+
         /* redecorate_window flushes, so we don’t need to */
         redecorate_window(conn, client);
 }