diff options
Diffstat (limited to 'sway/tree')
-rw-r--r-- | sway/tree/container.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c index d448df22..33043941 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -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; |