From 7eea1067f89822d87d42e61204f5f43f4f187b2e Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 24 Mar 2010 16:09:43 +0100 Subject: [PATCH] Bugfix: correctly translate coordinates for floating windows when outputs change --- src/layout.c | 16 ++++++++++++++++ src/randr.c | 18 +++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/layout.c b/src/layout.c index 202f5601..b1338040 100644 --- a/src/layout.c +++ b/src/layout.c @@ -225,6 +225,12 @@ void reposition_client(xcb_connection_t *conn, Client *client) { return; } + if (output->current_workspace == NULL) { + DLOG("Boundary checking deferred, no current workspace on output\n"); + client->force_reconfigure = true; + return; + } + DLOG("Client is on workspace %p with output %p\n", client->workspace, client->workspace->output); DLOG("but output at %d, %d is %p\n", client->rect.x, client->rect.y, output); floating_assign_to_workspace(client, output->current_workspace); @@ -737,6 +743,16 @@ void render_workspace(xcb_connection_t *conn, Output *output, Workspace *r_ws) { yoffset[cols] += single_height; } + /* Reposition all floating clients with force_reconfigure == true */ + TAILQ_FOREACH(client, &(r_ws->floating_clients), floating_clients) { + if (!client->force_reconfigure) + continue; + + client->force_reconfigure = false; + reposition_client(conn, client); + resize_client(conn, client); + } + ignore_enter_notify_forall(conn, r_ws, false); render_bars(conn, r_ws, width, &height); diff --git a/src/randr.c b/src/randr.c index dac3c010..f9e2a416 100644 --- a/src/randr.c +++ b/src/randr.c @@ -35,6 +35,7 @@ #include "log.h" #include "ewmh.h" #include "ipc.h" +#include "client.h" /* While a clean namespace is usually a pretty good thing, we really need * to use shorter names than the whole xcb_randr_* default names. */ @@ -247,12 +248,23 @@ static void output_change_mode(xcb_connection_t *conn, Output *output) { if (ws->output != output) continue; + SLIST_FOREACH(client, &(ws->focus_stack), focus_clients) { + client->force_reconfigure = true; + if (!client_is_floating(client)) + continue; + /* For floating clients we need to translate the + * coordinates (old workspace to new workspace) */ + DLOG("old: (%x, %x)\n", client->rect.x, client->rect.y); + client->rect.x -= ws->rect.x; + client->rect.y -= ws->rect.y; + client->rect.x += ws->output->rect.x; + client->rect.y += ws->output->rect.y; + DLOG("new: (%x, %x)\n", client->rect.x, client->rect.y); + } + /* Update dimensions from output */ memcpy(&(ws->rect), &(ws->output->rect), sizeof(Rect)); - SLIST_FOREACH(client, &(ws->focus_stack), focus_clients) - client->force_reconfigure = true; - /* Update the dimensions of a fullscreen client, if any */ if (ws->fullscreen_client != NULL) { DLOG("Updating fullscreen client size\n"); -- 2.39.5