The command to resize a floating window now checks the minimum and maximum size.

next
Adrien \"schischi\" Schildknecht 2012-11-22 05:15:49 +01:00 committed by Michael Stapelberg
parent d2b533328d
commit f41fa1baa1
4 changed files with 100 additions and 37 deletions

View 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.

View 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) {

View 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. */

View 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;