]> git.sur5r.net Git - i3/i3/commitdiff
The command to resize a floating window now checks the minimum and maximum size.
authorAdrien \"schischi\" Schildknecht <adrien+dev@schischi.me>
Thu, 22 Nov 2012 04:15:49 +0000 (05:15 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 25 Nov 2012 19:52:56 +0000 (20:52 +0100)
include/floating.h
src/commands.c
src/floating.c
testcases/t/189-floating-constraints.t

index 884d3cf1fe9df848a5ffdb2f2b9dd8f4e70de1b9..e07897a01bd9d760d24e45ddbe073849f5936b29 100644 (file)
@@ -99,6 +99,14 @@ void floating_drag_window(Con *con, const xcb_button_press_event_t *event);
  */
 void floating_resize_window(Con *con, const bool proportional, const xcb_button_press_event_t *event);
 
+/**
+ * Called when the windows is created or resized
+ * This function resize the windows if is size if higher or lower to the
+ * limits.
+ *
+ */
+void floating_checkSize(Con *floating_con);
+
 #if 0
 /**
  * Changes focus in the given direction for floating clients.
index cb53a31ec3ccc9d19621dda51cd761a7d4f047cc..0bfc4689f90b33cc82577cd38e2a3fea2b9efc91 100644 (file)
@@ -575,6 +575,7 @@ 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");
     if (strcmp(direction, "up") == 0) {
         floating_con->rect.y -= px;
@@ -587,6 +588,8 @@ static void cmd_resize_floating(I3_CMD, char *way, char *direction, Con *floatin
     } else {
         floating_con->rect.width += px;
     }
+
+    floating_checkSize(floating_con);
 }
 
 static bool cmd_resize_tiling_direction(I3_CMD, Con *current, char *way, char *direction, int ppt) {
index b884a1820bbeb834853f2ea301b8e362c89adf88..b72e7fc043f19987c8643e244743aac92185922c 100644 (file)
@@ -28,6 +28,46 @@ static Rect total_outputs_dimensions(void) {
     return outputs_dimensions;
 }
 
+void floating_checkSize(Con *floating_con) {
+
+    /* Define reasonable minimal and maximal sizes for floating windows */
+    const int floating_sane_min_height = 50;
+    const int floating_sane_min_width = 75;
+    Rect floating_sane_max_dimensions;
+
+    /* Unless user requests otherwise (-1), ensure width/height do not exceed
+     * configured maxima or, if unconfigured, limit to combined width of all
+     * outputs */
+    if (config.floating_minimum_height != -1) {
+        if (config.floating_minimum_height == 0)
+            floating_con->rect.height = max(floating_con->rect.height, floating_sane_min_height);
+        else
+            floating_con->rect.height = max(floating_con->rect.height, config.floating_minimum_height);
+    }
+    if (config.floating_minimum_width != -1) {
+        if (config.floating_minimum_width == 0)
+            floating_con->rect.width = max(floating_con->rect.width, floating_sane_min_width);
+        else
+            floating_con->rect.width = max(floating_con->rect.width, config.floating_minimum_width);
+    }
+
+    /* Unless user requests otherwise (-1), raise the width/height to
+     * reasonable minimum dimensions */
+    floating_sane_max_dimensions = total_outputs_dimensions();
+    if (config.floating_maximum_height != -1) {
+        if (config.floating_maximum_height == 0)
+            floating_con->rect.height = min(floating_con->rect.height, floating_sane_max_dimensions.height);
+        else
+            floating_con->rect.height = min(floating_con->rect.height, config.floating_maximum_height);
+    }
+    if (config.floating_maximum_width != -1) {
+        if (config.floating_maximum_width == 0)
+            floating_con->rect.width = min(floating_con->rect.width, floating_sane_max_dimensions.width);
+        else
+            floating_con->rect.width = min(floating_con->rect.width, config.floating_maximum_width);
+    }
+}
+
 void floating_enable(Con *con, bool automatic) {
     bool set_focus = (con == focused);
 
@@ -138,43 +178,7 @@ void floating_enable(Con *con, bool automatic) {
         }
     }
 
-    /* Define reasonable minimal and maximal sizes for floating windows */
-    const int floating_sane_min_height = 50;
-    const int floating_sane_min_width = 75;
-
-    Rect floating_sane_max_dimensions;
-    floating_sane_max_dimensions = total_outputs_dimensions();
-
-    /* Unless user requests otherwise (-1), ensure width/height do not exceed
-     * configured maxima or, if unconfigured, limit to combined width of all
-     * outputs */
-    if (config.floating_maximum_height != -1) {
-        if (config.floating_maximum_height == 0)
-            nc->rect.height = min(nc->rect.height, floating_sane_max_dimensions.height);
-        else
-            nc->rect.height = min(nc->rect.height, config.floating_maximum_height);
-    }
-    if (config.floating_maximum_width != -1) {
-        if (config.floating_maximum_width == 0)
-            nc->rect.width = min(nc->rect.width, floating_sane_max_dimensions.width);
-        else
-            nc->rect.width = min(nc->rect.width, config.floating_maximum_width);
-    }
-
-    /* Unless user requests otherwise (-1), raise the width/height to
-     * reasonable minimum dimensions */
-    if (config.floating_minimum_height != -1) {
-        if (config.floating_minimum_height == 0)
-            nc->rect.height = max(nc->rect.height, floating_sane_min_height);
-        else
-            nc->rect.height = max(nc->rect.height, config.floating_minimum_height);
-    }
-    if (config.floating_minimum_width != -1) {
-        if (config.floating_minimum_width == 0)
-            nc->rect.width = max(nc->rect.width, floating_sane_min_width);
-        else
-            nc->rect.width = max(nc->rect.width, config.floating_minimum_width);
-    }
+    floating_checkSize(nc);
 
     /* 3: attach the child to the new parent container. We need to do this
      * because con_border_style_rect() needs to access con->parent. */
index a3ce84762dc9d8848ffddae3fd1e49b59ab8113d..d907ddcc8830a3b0d5948341af183a24cfae4f18 100644 (file)
@@ -128,4 +128,52 @@ is($rect->{height}, 2048, 'height = 2048');
 
 exit_gracefully($pid);
 
+################################################################################
+# 5: check floating_minimum_size with cmd_resize
+################################################################################
+
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# Test with different dimensions than the i3 default.
+floating_minimum_size 60 x 50
+EOT
+
+$pid = launch_with_config($config);
+
+$window = open_floating_window(rect => [ 0, 0, 100, 100 ]);
+cmd 'border none';
+cmd 'resize shrink height 80px or 80ppt';
+cmd 'resize shrink width 80px or 80ppt';
+$rect = $window->rect;
+is($rect->{width}, 60, 'width = 60');
+is($rect->{height}, 50, 'height = 50');
+
+exit_gracefully($pid);
+
+################################################################################
+# 6: check floating_maximum_size with cmd_resize
+################################################################################
+
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# Test with different dimensions than the i3 default.
+floating_maximum_size 100 x 100
+EOT
+
+$pid = launch_with_config($config);
+
+$window = open_floating_window(rect => [ 200, 200, 50, 50 ]);
+cmd 'border none';
+cmd 'resize grow height 100px or 100ppt';
+cmd 'resize grow width 100px or 100ppt';
+$rect = $window->rect;
+is($rect->{width}, 100, 'width = 100');
+is($rect->{height}, 100, 'height = 100');
+
+exit_gracefully($pid);
+
 done_testing;