From ac5c2fcf19934bcdff5c7caa5dab072a74e4e0c3 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 26 May 2009 16:46:50 +0200 Subject: [PATCH] Bugfix: Fix fullscreen for floating clients, fix window name updates for floating clients --- src/handlers.c | 4 ++-- src/util.c | 33 +++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/handlers.c b/src/handlers.c index 10dd16fb..bd8d0f9a 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -635,7 +635,7 @@ int handle_windowname_change(void *data, xcb_connection_t *conn, uint8_t state, if (client->dock) return 1; - if (client->container->mode == MODE_STACK) + if (client->container != NULL && client->container->mode == MODE_STACK) render_container(conn, client->container); else decorate_window(conn, client, client->frame, client->titlegc, 0); xcb_flush(conn); @@ -703,7 +703,7 @@ int handle_windowname_change_legacy(void *data, xcb_connection_t *conn, uint8_t if (client->dock) return 1; - if (client->container->mode == MODE_STACK) + if (client->container != NULL && client->container->mode == MODE_STACK) render_container(conn, client->container); else decorate_window(conn, client, client->frame, client->titlegc, 0); xcb_flush(conn); diff --git a/src/util.c b/src/util.c index 44f25fb8..5174c91c 100644 --- a/src/util.c +++ b/src/util.c @@ -447,10 +447,10 @@ void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode) * */ void toggle_fullscreen(xcb_connection_t *conn, Client *client) { - /* clients without a container (docks) cannot be focused */ - assert(client->container != NULL); + /* dock clients cannot enter fullscreen mode */ + assert(!client->dock); - Workspace *workspace = client->container->workspace; + Workspace *workspace = client->workspace; if (!client->fullscreen) { if (workspace->fullscreen_client != NULL) { @@ -461,10 +461,10 @@ void toggle_fullscreen(xcb_connection_t *conn, Client *client) { workspace->fullscreen_client = client; LOG("Entering fullscreen mode...\n"); /* We just entered fullscreen mode, let’s configure the window */ - uint32_t mask = XCB_CONFIG_WINDOW_X | - XCB_CONFIG_WINDOW_Y | - XCB_CONFIG_WINDOW_WIDTH | - XCB_CONFIG_WINDOW_HEIGHT; + uint32_t mask = XCB_CONFIG_WINDOW_X | + XCB_CONFIG_WINDOW_Y | + XCB_CONFIG_WINDOW_WIDTH | + XCB_CONFIG_WINDOW_HEIGHT; uint32_t values[4] = {workspace->rect.x, workspace->rect.y, workspace->rect.width, @@ -491,11 +491,20 @@ void toggle_fullscreen(xcb_connection_t *conn, Client *client) { LOG("leaving fullscreen mode\n"); client->fullscreen = false; workspace->fullscreen_client = NULL; - /* 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; - /* We left fullscreen mode, redraw the whole layout to ensure enternotify events are disabled */ - render_layout(conn); + if (client->floating) { + /* For floating clients it’s enough if we just reconfigure that window (in fact, + * re-rendering the layout will not update the client.) */ + reposition_client(conn, client); + resize_client(conn, client); + /* redecorate_window flushes */ + redecorate_window(conn, client); + } else { + /* 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; + /* We left fullscreen mode, redraw the whole layout to ensure enternotify events are disabled */ + render_layout(conn); + } } xcb_flush(conn); -- 2.39.5