]> git.sur5r.net Git - i3/i3/commitdiff
Merge branch 'master' into next
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 4 Aug 2012 14:10:37 +0000 (16:10 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 4 Aug 2012 14:10:37 +0000 (16:10 +0200)
src/commands.c
src/floating.c
src/randr.c

index a1ef3bbf195d8949d961a3e2f3f5cd12460b2e22..44e6a23d4533f275b6ddffd15c96dd905c3899ea 100644 (file)
@@ -1028,9 +1028,14 @@ void cmd_move_workspace_to_output(I3_CMD, char *name) {
     TAILQ_FOREACH(current, &owindows, owindows) {
         Output *current_output = get_output_containing(current->con->rect.x,
                                                        current->con->rect.y);
+        if (!current_output) {
+            ELOG("Cannot get current output. This is a bug in i3.\n");
+            ysuccess(false);
+            return;
+        }
         Output *output = get_output_from_string(current_output, name);
         if (!output) {
-            LOG("No such output\n");
+            ELOG("Could not get output from string \"%s\"\n", name);
             ysuccess(false);
             return;
         }
index 90c4d5607c26ff9fc7c838de77719909b51eb183..0bc5f6d65aac466814b08c62350c5c4d6fe18d3b 100644 (file)
@@ -608,19 +608,24 @@ void floating_reposition(Con *con, Rect newrect) {
  *
  */
 void floating_fix_coordinates(Con *con, Rect *old_rect, Rect *new_rect) {
-    DLOG("Fixing coordinates of floating window %p\n", con);
+    DLOG("Fixing coordinates of floating window %p (rect (%d, %d), %d x %d)\n",
+         con, con->rect.x, con->rect.y, con->rect.width, con->rect.height);
+    DLOG("old_rect = (%d, %d), %d x %d\n",
+         old_rect->x, old_rect->y, old_rect->width, old_rect->height);
+    DLOG("new_rect = (%d, %d), %d x %d\n",
+         new_rect->x, new_rect->y, new_rect->width, new_rect->height);
     /* First we get the x/y coordinates relative to the x/y coordinates
      * of the output on which the window is on */
-    uint32_t rel_x = (con->rect.x - old_rect->x);
-    uint32_t rel_y = (con->rect.y - old_rect->y);
+    int32_t rel_x = (con->rect.x - old_rect->x);
+    int32_t rel_y = (con->rect.y - old_rect->y);
     /* Then we calculate a fraction, for example 0.63 for a window
      * which is at y = 1212 of a 1920 px high output */
     DLOG("rel_x = %d, rel_y = %d, fraction_x = %f, fraction_y = %f, output->w = %d, output->h = %d\n",
           rel_x, rel_y, (double)rel_x / old_rect->width, (double)rel_y / old_rect->height,
           old_rect->width, old_rect->height);
     /* Here we have to multiply at first. Or we will lose precision when not compiled with -msse2 */
-    con->rect.x = new_rect->x + (double)(rel_x * new_rect->width)  / old_rect->width;
-    con->rect.y = new_rect->y + (double)(rel_y * new_rect->height) / old_rect->height;
+    con->rect.x = (int32_t)new_rect->x + (double)(rel_x * (int32_t)new_rect->width)  / (int32_t)old_rect->width;
+    con->rect.y = (int32_t)new_rect->y + (double)(rel_y * (int32_t)new_rect->height) / (int32_t)old_rect->height;
     DLOG("Resulting coordinates: x = %d, y = %d\n", con->rect.x, con->rect.y);
 }
 
index f69d15a8cc97a38a329bf48f2c44f8f988e333bb..b691a3326a42640b2b0082399f8efd19310a7d01 100644 (file)
@@ -358,6 +358,19 @@ void init_ws_for_output(Output *output, Con *content) {
             workspace_show(previous);
         }
 
+        /* Render the output on which the workspace was to get correct Rects.
+         * Then, we need to work with the "content" container, since we cannot
+         * be sure that the workspace itself was rendered at all (in case it’s
+         * invisible, it won’t be rendered). */
+        render_con(workspace_out, false);
+        Con *ws_out_content = output_get_content(workspace_out);
+
+        Con *floating_con;
+        TAILQ_FOREACH(floating_con, &(workspace->floating_head), floating_windows)
+            /* NB: We use output->con here because content is not yet rendered,
+             * so it has a rect of {0, 0, 0, 0}. */
+            floating_fix_coordinates(floating_con, &(ws_out_content->rect), &(output->con->rect));
+
         con_detach(workspace);
         con_attach(workspace, content, false);
 
@@ -681,7 +694,7 @@ void randr_query_outputs(void) {
                     DLOG("Fixing the coordinates of floating containers\n");
                     Con *floating_con;
                     TAILQ_FOREACH(floating_con, &(current->floating_head), floating_windows)
-                        floating_fix_coordinates(floating_con, &(old_content->rect), &(first_content->rect));
+                        floating_fix_coordinates(floating_con, &(output->con->rect), &(first->con->rect));
                     DLOG("Done, next\n");
                 }
                 DLOG("re-attached all workspaces\n");