aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/tree/container.h3
-rw-r--r--sway/commands/resize.c45
-rw-r--r--sway/input/seatop_resize_floating.c37
-rw-r--r--sway/sway.5.scd3
-rw-r--r--sway/tree/container.c64
5 files changed, 53 insertions, 99 deletions
diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h
index f7a4ac3..d250899 100644
--- a/include/sway/tree/container.h
+++ b/include/sway/tree/container.h
@@ -212,6 +212,9 @@ void container_update_representation(struct sway_container *container);
*/
size_t container_titlebar_height(void);
+void floating_calculate_constraints(int *min_width, int *max_width,
+ int *min_height, int *max_height);
+
/**
* Resize and center the container in its workspace.
*/
diff --git a/sway/commands/resize.c b/sway/commands/resize.c
index c926153..440937f 100644
--- a/sway/commands/resize.c
+++ b/sway/commands/resize.c
@@ -66,45 +66,6 @@ static int parse_resize_amount(int argc, char **argv,
return 2;
}
-static void calculate_constraints(int *min_width, int *max_width,
- int *min_height, int *max_height) {
- struct sway_container *con = config->handler_context.container;
-
- if (config->floating_minimum_width == -1) { // no minimum
- *min_width = 0;
- } else if (config->floating_minimum_width == 0) { // automatic
- *min_width = 75;
- } else {
- *min_width = config->floating_minimum_width;
- }
-
- if (config->floating_minimum_height == -1) { // no minimum
- *min_height = 0;
- } else if (config->floating_minimum_height == 0) { // automatic
- *min_height = 50;
- } else {
- *min_height = config->floating_minimum_height;
- }
-
- if (config->floating_maximum_width == -1 ||
- container_is_scratchpad_hidden(con)) { // no max
- *max_width = INT_MAX;
- } else if (config->floating_maximum_width == 0) { // automatic
- *max_width = con->workspace->width;
- } else {
- *max_width = config->floating_maximum_width;
- }
-
- if (config->floating_maximum_height == -1 ||
- container_is_scratchpad_hidden(con)) { // no max
- *max_height = INT_MAX;
- } else if (config->floating_maximum_height == 0) { // automatic
- *max_height = con->workspace->height;
- } else {
- *max_height = config->floating_maximum_height;
- }
-}
-
static uint32_t parse_resize_axis(const char *axis) {
if (strcasecmp(axis, "width") == 0 || strcasecmp(axis, "horizontal") == 0) {
return AXIS_HORIZONTAL;
@@ -258,7 +219,8 @@ static struct cmd_results *resize_adjust_floating(uint32_t axis,
// Make sure we're not adjusting beyond floating min/max size
int min_width, max_width, min_height, max_height;
- calculate_constraints(&min_width, &max_width, &min_height, &max_height);
+ floating_calculate_constraints(&min_width, &max_width,
+ &min_height, &max_height);
if (con->width + grow_width < min_width) {
grow_width = min_width - con->width;
} else if (con->width + grow_width > max_width) {
@@ -383,7 +345,8 @@ static struct cmd_results *resize_set_tiled(struct sway_container *con,
static struct cmd_results *resize_set_floating(struct sway_container *con,
struct resize_amount *width, struct resize_amount *height) {
int min_width, max_width, min_height, max_height, grow_width = 0, grow_height = 0;
- calculate_constraints(&min_width, &max_width, &min_height, &max_height);
+ floating_calculate_constraints(&min_width, &max_width,
+ &min_height, &max_height);
if (width->amount) {
switch (width->unit) {
diff --git a/sway/input/seatop_resize_floating.c b/sway/input/seatop_resize_floating.c
index bf6c7ab..18c6db7 100644
--- a/sway/input/seatop_resize_floating.c
+++ b/sway/input/seatop_resize_floating.c
@@ -17,41 +17,6 @@ struct seatop_resize_floating_event {
double ref_con_lx, ref_con_ly; // container's x/y at start of op
};
-static void calculate_floating_constraints(struct sway_container *con,
- int *min_width, int *max_width, int *min_height, int *max_height) {
- if (config->floating_minimum_width == -1) { // no minimum
- *min_width = 0;
- } else if (config->floating_minimum_width == 0) { // automatic
- *min_width = 75;
- } else {
- *min_width = config->floating_minimum_width;
- }
-
- if (config->floating_minimum_height == -1) { // no minimum
- *min_height = 0;
- } else if (config->floating_minimum_height == 0) { // automatic
- *min_height = 50;
- } else {
- *min_height = config->floating_minimum_height;
- }
-
- if (config->floating_maximum_width == -1) { // no maximum
- *max_width = INT_MAX;
- } else if (config->floating_maximum_width == 0) { // automatic
- *max_width = con->workspace->width;
- } else {
- *max_width = config->floating_maximum_width;
- }
-
- if (config->floating_maximum_height == -1) { // no maximum
- *max_height = INT_MAX;
- } else if (config->floating_maximum_height == 0) { // automatic
- *max_height = con->workspace->height;
- } else {
- *max_height = config->floating_maximum_height;
- }
-}
-
static void handle_motion(struct sway_seat *seat, uint32_t time_msec) {
struct seatop_resize_floating_event *e = seat->seatop_data;
struct sway_container *con = e->con;
@@ -85,7 +50,7 @@ static void handle_motion(struct sway_seat *seat, uint32_t time_msec) {
double width = e->ref_width + grow_width;
double height = e->ref_height + grow_height;
int min_width, max_width, min_height, max_height;
- calculate_floating_constraints(con, &min_width, &max_width,
+ floating_calculate_constraints(&min_width, &max_width,
&min_height, &max_height);
width = fmax(min_width, fmin(width, max_width));
height = fmax(min_height, fmin(height, max_height));
diff --git a/sway/sway.5.scd b/sway/sway.5.scd
index 8f8b7e3..4f4522f 100644
--- a/sway/sway.5.scd
+++ b/sway/sway.5.scd
@@ -430,7 +430,8 @@ The default colors are:
*floating_maximum_size* <width> x <height>
Specifies the maximum size of floating windows. -1 x -1 removes the upper
- limit.
+ limit. The default is 0 x 0, which will use the width and height of the
+ entire output layout as the maximums
*floating_minimum_size* <width> x <height>
Specifies the minimum size of floating windows. The default is 75 x 50.
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;