From 5d14dca41d4b1a4a494f7481957ee7d1b6108254 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 5 Aug 2009 19:59:58 +0200 Subject: [PATCH] Implement correct rendering of floating windows (decoration color) --- src/layout.c | 20 ++++++++++++++------ src/util.c | 10 +++++----- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/layout.c b/src/layout.c index 44ce1b1d..9cc41a0c 100644 --- a/src/layout.c +++ b/src/layout.c @@ -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 diff --git a/src/util.c b/src/util.c index ff98bb31..d09dafe2 100644 --- a/src/util.c +++ b/src/util.c @@ -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); }