From 8e19f8dabfea60fcf34a6f5e5966278747121948 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 19 Jun 2009 23:18:43 +0200 Subject: [PATCH] =?utf8?q?floating:=20Don=E2=80=99t=20let=20clients=20beco?= =?utf8?q?me=20hidden=20under=20stack=20windows=20or=20fulscreen=20clients?= =?utf8?q?=20(Thanks=20Mirko)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- include/client.h | 8 ++++++++ src/client.c | 19 +++++++++++++++++++ src/floating.c | 8 +------- src/layout.c | 9 +++++++-- src/manage.c | 8 +------- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/include/client.h b/include/client.h index 252f3619..068a364a 100644 --- a/include/client.h +++ b/include/client.h @@ -52,4 +52,12 @@ bool client_matches_class_name(Client *client, char *to_class, char *to_title, */ void client_toggle_fullscreen(xcb_connection_t *conn, Client *client); +/** + * Sets the position of the given client in the X stack to the highest (tiling layer is always + * on the same position, so this doesn’t matter) below the first floating client, so that + * floating windows are always on top. + * + */ +void client_set_below_floating(xcb_connection_t *conn, Client *client); + #endif diff --git a/src/client.c b/src/client.c index a7a6e3e8..18126a1a 100644 --- a/src/client.c +++ b/src/client.c @@ -23,6 +23,7 @@ #include "util.h" #include "queue.h" #include "layout.h" +#include "client.h" /* * Removes the given client from the container, either because it will be inserted into another @@ -194,6 +195,8 @@ void client_toggle_fullscreen(xcb_connection_t *conn, Client *client) { /* redecorate_window flushes */ redecorate_window(conn, client); } else { + client_set_below_floating(conn, client); + /* Because the coordinates of the window haven’t changed, it would not be re-configured if we don’t set the following flag */ client->force_reconfigure = true; @@ -204,3 +207,19 @@ void client_toggle_fullscreen(xcb_connection_t *conn, Client *client) { xcb_flush(conn); } + +/* + * Sets the position of the given client in the X stack to the highest (tiling layer is always + * on the same position, so this doesn’t matter) below the first floating client, so that + * floating windows are always on top. + * + */ +void client_set_below_floating(xcb_connection_t *conn, Client *client) { + /* Ensure that it is below all floating clients */ + Client *first_floating = TAILQ_FIRST(&(client->workspace->floating_clients)); + if (first_floating != TAILQ_END(&(client->workspace->floating_clients))) { + LOG("Setting below floating\n"); + uint32_t values[] = { first_floating->frame, XCB_STACK_MODE_BELOW }; + xcb_configure_window(conn, client->frame, XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, values); + } +} diff --git a/src/floating.c b/src/floating.c index f416160a..f4b22823 100644 --- a/src/floating.c +++ b/src/floating.c @@ -78,13 +78,7 @@ void toggle_floating_mode(xcb_connection_t *conn, Client *client, bool automatic LOG("Re-inserted the client into the matrix.\n"); con->currently_focused = client; - /* Ensure that it is below all floating clients */ - Client *first_floating = TAILQ_FIRST(&(client->workspace->floating_clients)); - if (first_floating != TAILQ_END(&(client->workspace->floating_clients))) { - LOG("Setting below floating\n"); - uint32_t values[] = { first_floating->frame, XCB_STACK_MODE_BELOW }; - xcb_configure_window(conn, client->frame, XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, values); - } + client_set_below_floating(conn, client); render_container(conn, con); xcb_flush(conn); diff --git a/src/layout.c b/src/layout.c index 426dd027..952f3d60 100644 --- a/src/layout.c +++ b/src/layout.c @@ -327,8 +327,13 @@ void render_container(xcb_connection_t *conn, Container *container) { XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | XCB_CONFIG_WINDOW_STACK_MODE; - /* If there is no fullscreen client, we raise the stack window */ - if (container->workspace->fullscreen_client != NULL) { + /* Raise the stack window, but keep it below the first floating client + * and below the fullscreen client (if any) */ + Client *first_floating = TAILQ_FIRST(&(container->workspace->floating_clients)); + if (first_floating != TAILQ_END(&(container->workspace->floating_clients))) { + mask |= XCB_CONFIG_WINDOW_SIBLING; + values[4] = first_floating->frame; + } else if (container->workspace->fullscreen_client != NULL) { mask |= XCB_CONFIG_WINDOW_SIBLING; values[4] = container->workspace->fullscreen_client->frame; } diff --git a/src/manage.c b/src/manage.c index 827c05ca..948e9aba 100644 --- a/src/manage.c +++ b/src/manage.c @@ -373,13 +373,7 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child, SLIST_INSERT_HEAD(&(new->container->workspace->focus_stack), new, focus_clients); - /* Ensure that it is below all floating clients */ - Client *first_floating = TAILQ_FIRST(&(new->workspace->floating_clients)); - if (first_floating != TAILQ_END(&(new->workspace->floating_clients))) { - LOG("Setting below floating\n"); - uint32_t values[] = { first_floating->frame, XCB_STACK_MODE_BELOW }; - xcb_configure_window(conn, new->frame, XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, values); - } + client_set_below_floating(conn, new); } if (new->floating >= FLOATING_AUTO_ON) { -- 2.39.5