aboutsummaryrefslogtreecommitdiff
path: root/sway/tree/container.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree/container.c')
-rw-r--r--sway/tree/container.c64
1 files changed, 43 insertions, 21 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c
index d448df2..3304394 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;