summaryrefslogtreecommitdiff
path: root/sway/tree/container.c
diff options
context:
space:
mode:
authorBrian Ashworth <[email protected]>2019-03-02 02:29:28 -0500
committeremersion <[email protected]>2019-03-02 09:10:26 +0100
commit430359519c1cb9583020fc8da04f5ecc31b0e914 (patch)
treea2b8287babeb96e63953de8d4bb68bc422029fe9 /sway/tree/container.c
parent37f0e1f1a2cc8e072c8e01e0769c62c536b8295b (diff)
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`.
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 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;