The command to resize a floating window now checks the minimum and maximum size.
This commit is contained in:
parent
d2b533328d
commit
f41fa1baa1
@ -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.
|
||||
|
@ -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) {
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user