]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Don’t move floating windows when their size constraints forbid resizing ...
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 27 Nov 2012 08:26:31 +0000 (09:26 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 27 Nov 2012 08:26:31 +0000 (09:26 +0100)
fixes #883

src/commands.c
testcases/t/189-floating-constraints.t

index 0f36cd38bd36e9880e039b747ef89740ac0e377c..2ca8387c91e7387ec0835672c4a5866caa28c89e 100644 (file)
@@ -576,19 +576,30 @@ void cmd_move_con_to_workspace_number(I3_CMD, char *which) {
 
 static void cmd_resize_floating(I3_CMD, char *way, char *direction, Con *floating_con, int px) {
     LOG("floating resize\n");
+    Rect old_rect = floating_con->rect;
+
     if (strcmp(direction, "up") == 0) {
-        floating_con->rect.y -= px;
         floating_con->rect.height += px;
     } else if (strcmp(direction, "down") == 0 || strcmp(direction, "height") == 0) {
         floating_con->rect.height += px;
     } else if (strcmp(direction, "left") == 0) {
-        floating_con->rect.x -= px;
         floating_con->rect.width += px;
     } else {
         floating_con->rect.width += px;
     }
 
     floating_check_size(floating_con);
+
+    /* Did we actually resize anything or did the size constraints prevent us?
+     * If we could not resize, exit now to not move the window. */
+    if (memcmp(&old_rect, &(floating_con->rect), sizeof(Rect)) == 0)
+        return;
+
+    if (strcmp(direction, "up") == 0) {
+        floating_con->rect.y -= px;
+    } else if (strcmp(direction, "left") == 0) {
+        floating_con->rect.x -= px;
+    }
 }
 
 static bool cmd_resize_tiling_direction(I3_CMD, Con *current, char *way, char *direction, int ppt) {
index d907ddcc8830a3b0d5948341af183a24cfae4f18..0d3d226808a782479c90bf0906431d5c194bb442 100644 (file)
@@ -174,6 +174,13 @@ $rect = $window->rect;
 is($rect->{width}, 100, 'width = 100');
 is($rect->{height}, 100, 'height = 100');
 
+my $old_x = $rect->{x};
+my $old_y = $rect->{y};
+cmd 'resize grow up 10px or 10ppt';
+$rect = $window->rect;
+is($rect->{x}, $old_x, 'window did not move when trying to resize');
+is($rect->{y}, $old_y, 'window did not move when trying to resize');
+
 exit_gracefully($pid);
 
 done_testing;