floating_maximum_size: change default behavior

This changes the way zero (which is the default) is interpreted for both
the width and height of `floating_maximum_size`. It now refers to the
width and height of the entire output layout, which matches i3's
behavior.

This also removes duplicated code to calculate the floating constraints
in three files. Before this, `container_init_floating` used two-thirds
of the workspace width/height as the max and the entire workspace
width/height was used everywhere else. Now, all callers use a single
function `floating_calculate_constraints`.
This commit is contained in:
Brian Ashworth 2019-03-02 02:29:28 -05:00 committed by Drew DeVault
parent e0cdcad9a7
commit a3b9f2dcfa
5 changed files with 53 additions and 99 deletions

View file

@ -611,56 +611,78 @@ size_t container_titlebar_height(void) {
return config->font_height + config->titlebar_v_padding * 2;
}
void container_init_floating(struct sway_container *con) {
struct sway_workspace *ws = con->workspace;
int min_width, min_height;
int max_width, max_height;
void floating_calculate_constraints(int *min_width, int *max_width,
int *min_height, int *max_height) {
if (config->floating_minimum_width == -1) { // no minimum
min_width = 0;
*min_width = 0;
} else if (config->floating_minimum_width == 0) { // automatic
min_width = 75;
*min_width = 75;
} else {
min_width = config->floating_minimum_width;
*min_width = config->floating_minimum_width;
}
if (config->floating_minimum_height == -1) { // no minimum
min_height = 0;
*min_height = 0;
} else if (config->floating_minimum_height == 0) { // automatic
min_height = 50;
*min_height = 50;
} else {
min_height = config->floating_minimum_height;
*min_height = config->floating_minimum_height;
}
struct wlr_box *box = wlr_output_layout_get_box(root->output_layout, NULL);
if (config->floating_maximum_width == -1) { // no maximum
max_width = INT_MAX;
*max_width = INT_MAX;
} else if (config->floating_maximum_width == 0) { // automatic
max_width = ws->width * 0.6666;
*max_width = box->width;
} else {
max_width = config->floating_maximum_width;
*max_width = config->floating_maximum_width;
}
if (config->floating_maximum_height == -1) { // no maximum
max_height = INT_MAX;
*max_height = INT_MAX;
} else if (config->floating_maximum_height == 0) { // automatic
max_height = ws->height * 0.6666;
*max_height = box->height;
} else {
max_height = config->floating_maximum_height;
*max_height = config->floating_maximum_height;
}
}
void container_init_floating(struct sway_container *con) {
struct sway_workspace *ws = con->workspace;
int min_width, max_width, min_height, max_height;
floating_calculate_constraints(&min_width, &max_width,
&min_height, &max_height);
if (!con->view) {
con->width = max_width;
con->height = max_height;
con->x = ws->x + (ws->width - con->width) / 2;
con->y = ws->y + (ws->height - con->height) / 2;
if (con->width > ws->width || con->height > ws->height) {
struct wlr_box *ob = wlr_output_layout_get_box(root->output_layout,
ws->output->wlr_output);
con->x = ob->x + (ob->width - con->width) / 2;
con->y = ob->y + (ob->height - con->height) / 2;
} else {
con->x = ws->x + (ws->width - con->width) / 2;
con->y = ws->y + (ws->height - con->height) / 2;
}
} else {
struct sway_view *view = con->view;
con->content_width =
fmax(min_width, fmin(view->natural_width, max_width));
con->content_height =
fmax(min_height, fmin(view->natural_height, max_height));
con->content_x = ws->x + (ws->width - con->content_width) / 2;
con->content_y = ws->y + (ws->height - con->content_height) / 2;
if (con->content_width > ws->width
|| con->content_height > ws->height) {
struct wlr_box *ob = wlr_output_layout_get_box(root->output_layout,
ws->output->wlr_output);
con->content_x = ob->x + (ob->width - con->content_width) / 2;
con->content_y = ob->y + (ob->height - con->content_height) / 2;
} else {
con->content_x = ws->x + (ws->width - con->content_width) / 2;
con->content_y = ws->y + (ws->height - con->content_height) / 2;
}
// If the view's border is B_NONE then these properties are ignored.
con->border_top = con->border_bottom = true;