From f41fa1baa1043c59519f5376f65dd4804edb2183 Mon Sep 17 00:00:00 2001 From: "Adrien \\\"schischi\\\" Schildknecht" Date: Thu, 22 Nov 2012 05:15:49 +0100 Subject: [PATCH] The command to resize a floating window now checks the minimum and maximum size. --- include/floating.h | 8 +++ src/commands.c | 3 + src/floating.c | 78 ++++++++++++++------------ testcases/t/189-floating-constraints.t | 48 ++++++++++++++++ 4 files changed, 100 insertions(+), 37 deletions(-) diff --git a/include/floating.h b/include/floating.h index 884d3cf1..e07897a0 100644 --- a/include/floating.h +++ b/include/floating.h @@ -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. diff --git a/src/commands.c b/src/commands.c index cb53a31e..0bfc4689 100644 --- a/src/commands.c +++ b/src/commands.c @@ -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) { diff --git a/src/floating.c b/src/floating.c index b884a182..b72e7fc0 100644 --- a/src/floating.c +++ b/src/floating.c @@ -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. */ diff --git a/testcases/t/189-floating-constraints.t b/testcases/t/189-floating-constraints.t index a3ce8476..d907ddcc 100644 --- a/testcases/t/189-floating-constraints.t +++ b/testcases/t/189-floating-constraints.t @@ -128,4 +128,52 @@ is($rect->{height}, 2048, 'height = 2048'); exit_gracefully($pid); +################################################################################ +# 5: check floating_minimum_size with cmd_resize +################################################################################ + +$config = < [ 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 = < [ 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;