]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: correctly translate coordinates for floating windows when outputs change
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 24 Mar 2010 15:09:43 +0000 (16:09 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 24 Mar 2010 15:09:43 +0000 (16:09 +0100)
src/layout.c
src/randr.c

index 202f5601d09fdf5da7233efddabf7c22a3f64c84..b13380403731f3a3ebdb4ce54e51eee9ba3bc85d 100644 (file)
@@ -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);
index dac3c0105dee8e73128aa06be7d0773c67236798..f9e2a416aa779bb219828f1e4c26a73437a87801 100644 (file)
@@ -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");