diff options
-rw-r--r-- | include/sway/tree/container.h | 3 | ||||
-rw-r--r-- | sway/commands/resize.c | 45 | ||||
-rw-r--r-- | sway/input/seatop_resize_floating.c | 37 | ||||
-rw-r--r-- | sway/sway.5.scd | 3 | ||||
-rw-r--r-- | sway/tree/container.c | 64 |
5 files changed, 53 insertions, 99 deletions
diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h index f7a4ac37..d2508994 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); | |||
212 | */ | 212 | */ |
213 | size_t container_titlebar_height(void); | 213 | size_t container_titlebar_height(void); |
214 | 214 | ||
215 | void floating_calculate_constraints(int *min_width, int *max_width, | ||
216 | int *min_height, int *max_height); | ||
217 | |||
215 | /** | 218 | /** |
216 | * Resize and center the container in its workspace. | 219 | * Resize and center the container in its workspace. |
217 | */ | 220 | */ |
diff --git a/sway/commands/resize.c b/sway/commands/resize.c index c9261535..440937f0 100644 --- a/sway/commands/resize.c +++ b/sway/commands/resize.c | |||
@@ -66,45 +66,6 @@ static int parse_resize_amount(int argc, char **argv, | |||
66 | return 2; | 66 | return 2; |
67 | } | 67 | } |
68 | 68 | ||
69 | static void calculate_constraints(int *min_width, int *max_width, | ||
70 | int *min_height, int *max_height) { | ||
71 | struct sway_container *con = config->handler_context.container; | ||
72 | |||
73 | if (config->floating_minimum_width == -1) { // no minimum | ||
74 | *min_width = 0; | ||
75 | } else if (config->floating_minimum_width == 0) { // automatic | ||
76 | *min_width = 75; | ||
77 | } else { | ||
78 | *min_width = config->floating_minimum_width; | ||
79 | } | ||
80 | |||
81 | if (config->floating_minimum_height == -1) { // no minimum | ||
82 | *min_height = 0; | ||
83 | } else if (config->floating_minimum_height == 0) { // automatic | ||
84 | *min_height = 50; | ||
85 | } else { | ||
86 | *min_height = config->floating_minimum_height; | ||
87 | } | ||
88 | |||
89 | if (config->floating_maximum_width == -1 || | ||
90 | container_is_scratchpad_hidden(con)) { // no max | ||
91 | *max_width = INT_MAX; | ||
92 | } else if (config->floating_maximum_width == 0) { // automatic | ||
93 | *max_width = con->workspace->width; | ||
94 | } else { | ||
95 | *max_width = config->floating_maximum_width; | ||
96 | } | ||
97 | |||
98 | if (config->floating_maximum_height == -1 || | ||
99 | container_is_scratchpad_hidden(con)) { // no max | ||
100 | *max_height = INT_MAX; | ||
101 | } else if (config->floating_maximum_height == 0) { // automatic | ||
102 | *max_height = con->workspace->height; | ||
103 | } else { | ||
104 | *max_height = config->floating_maximum_height; | ||
105 | } | ||
106 | } | ||
107 | |||
108 | static uint32_t parse_resize_axis(const char *axis) { | 69 | static uint32_t parse_resize_axis(const char *axis) { |
109 | if (strcasecmp(axis, "width") == 0 || strcasecmp(axis, "horizontal") == 0) { | 70 | if (strcasecmp(axis, "width") == 0 || strcasecmp(axis, "horizontal") == 0) { |
110 | return AXIS_HORIZONTAL; | 71 | return AXIS_HORIZONTAL; |
@@ -258,7 +219,8 @@ static struct cmd_results *resize_adjust_floating(uint32_t axis, | |||
258 | 219 | ||
259 | // Make sure we're not adjusting beyond floating min/max size | 220 | // Make sure we're not adjusting beyond floating min/max size |
260 | int min_width, max_width, min_height, max_height; | 221 | int min_width, max_width, min_height, max_height; |
261 | calculate_constraints(&min_width, &max_width, &min_height, &max_height); | 222 | floating_calculate_constraints(&min_width, &max_width, |
223 | &min_height, &max_height); | ||
262 | if (con->width + grow_width < min_width) { | 224 | if (con->width + grow_width < min_width) { |
263 | grow_width = min_width - con->width; | 225 | grow_width = min_width - con->width; |
264 | } else if (con->width + grow_width > max_width) { | 226 | } else if (con->width + grow_width > max_width) { |
@@ -383,7 +345,8 @@ static struct cmd_results *resize_set_tiled(struct sway_container *con, | |||
383 | static struct cmd_results *resize_set_floating(struct sway_container *con, | 345 | static struct cmd_results *resize_set_floating(struct sway_container *con, |
384 | struct resize_amount *width, struct resize_amount *height) { | 346 | struct resize_amount *width, struct resize_amount *height) { |
385 | int min_width, max_width, min_height, max_height, grow_width = 0, grow_height = 0; | 347 | int min_width, max_width, min_height, max_height, grow_width = 0, grow_height = 0; |
386 | calculate_constraints(&min_width, &max_width, &min_height, &max_height); | 348 | floating_calculate_constraints(&min_width, &max_width, |
349 | &min_height, &max_height); | ||
387 | 350 | ||
388 | if (width->amount) { | 351 | if (width->amount) { |
389 | switch (width->unit) { | 352 | switch (width->unit) { |
diff --git a/sway/input/seatop_resize_floating.c b/sway/input/seatop_resize_floating.c index bf6c7ab4..18c6db73 100644 --- a/sway/input/seatop_resize_floating.c +++ b/sway/input/seatop_resize_floating.c | |||
@@ -17,41 +17,6 @@ struct seatop_resize_floating_event { | |||
17 | double ref_con_lx, ref_con_ly; // container's x/y at start of op | 17 | double ref_con_lx, ref_con_ly; // container's x/y at start of op |
18 | }; | 18 | }; |
19 | 19 | ||
20 | static void calculate_floating_constraints(struct sway_container *con, | ||
21 | int *min_width, int *max_width, int *min_height, int *max_height) { | ||
22 | if (config->floating_minimum_width == -1) { // no minimum | ||
23 | *min_width = 0; | ||
24 | } else if (config->floating_minimum_width == 0) { // automatic | ||
25 | *min_width = 75; | ||
26 | } else { | ||
27 | *min_width = config->floating_minimum_width; | ||
28 | } | ||
29 | |||
30 | if (config->floating_minimum_height == -1) { // no minimum | ||
31 | *min_height = 0; | ||
32 | } else if (config->floating_minimum_height == 0) { // automatic | ||
33 | *min_height = 50; | ||
34 | } else { | ||
35 | *min_height = config->floating_minimum_height; | ||
36 | } | ||
37 | |||
38 | if (config->floating_maximum_width == -1) { // no maximum | ||
39 | *max_width = INT_MAX; | ||
40 | } else if (config->floating_maximum_width == 0) { // automatic | ||
41 | *max_width = con->workspace->width; | ||
42 | } else { | ||
43 | *max_width = config->floating_maximum_width; | ||
44 | } | ||
45 | |||
46 | if (config->floating_maximum_height == -1) { // no maximum | ||
47 | *max_height = INT_MAX; | ||
48 | } else if (config->floating_maximum_height == 0) { // automatic | ||
49 | *max_height = con->workspace->height; | ||
50 | } else { | ||
51 | *max_height = config->floating_maximum_height; | ||
52 | } | ||
53 | } | ||
54 | |||
55 | static void handle_motion(struct sway_seat *seat, uint32_t time_msec) { | 20 | static void handle_motion(struct sway_seat *seat, uint32_t time_msec) { |
56 | struct seatop_resize_floating_event *e = seat->seatop_data; | 21 | struct seatop_resize_floating_event *e = seat->seatop_data; |
57 | struct sway_container *con = e->con; | 22 | struct sway_container *con = e->con; |
@@ -85,7 +50,7 @@ static void handle_motion(struct sway_seat *seat, uint32_t time_msec) { | |||
85 | double width = e->ref_width + grow_width; | 50 | double width = e->ref_width + grow_width; |
86 | double height = e->ref_height + grow_height; | 51 | double height = e->ref_height + grow_height; |
87 | int min_width, max_width, min_height, max_height; | 52 | int min_width, max_width, min_height, max_height; |
88 | calculate_floating_constraints(con, &min_width, &max_width, | 53 | floating_calculate_constraints(&min_width, &max_width, |
89 | &min_height, &max_height); | 54 | &min_height, &max_height); |
90 | width = fmax(min_width, fmin(width, max_width)); | 55 | width = fmax(min_width, fmin(width, max_width)); |
91 | height = fmax(min_height, fmin(height, max_height)); | 56 | height = fmax(min_height, fmin(height, max_height)); |
diff --git a/sway/sway.5.scd b/sway/sway.5.scd index 8f8b7e3d..4f4522fb 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd | |||
@@ -430,7 +430,8 @@ The default colors are: | |||
430 | 430 | ||
431 | *floating_maximum_size* <width> x <height> | 431 | *floating_maximum_size* <width> x <height> |
432 | Specifies the maximum size of floating windows. -1 x -1 removes the upper | 432 | Specifies the maximum size of floating windows. -1 x -1 removes the upper |
433 | limit. | 433 | limit. The default is 0 x 0, which will use the width and height of the |
434 | entire output layout as the maximums | ||
434 | 435 | ||
435 | *floating_minimum_size* <width> x <height> | 436 | *floating_minimum_size* <width> x <height> |
436 | Specifies the minimum size of floating windows. The default is 75 x 50. | 437 | 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 d448df22..33043941 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c | |||
@@ -611,56 +611,78 @@ size_t container_titlebar_height(void) { | |||
611 | return config->font_height + config->titlebar_v_padding * 2; | 611 | return config->font_height + config->titlebar_v_padding * 2; |
612 | } | 612 | } |
613 | 613 | ||
614 | void container_init_floating(struct sway_container *con) { | 614 | void floating_calculate_constraints(int *min_width, int *max_width, |
615 | struct sway_workspace *ws = con->workspace; | 615 | int *min_height, int *max_height) { |
616 | int min_width, min_height; | ||
617 | int max_width, max_height; | ||
618 | |||
619 | if (config->floating_minimum_width == -1) { // no minimum | 616 | if (config->floating_minimum_width == -1) { // no minimum |
620 | min_width = 0; | 617 | *min_width = 0; |
621 | } else if (config->floating_minimum_width == 0) { // automatic | 618 | } else if (config->floating_minimum_width == 0) { // automatic |
622 | min_width = 75; | 619 | *min_width = 75; |
623 | } else { | 620 | } else { |
624 | min_width = config->floating_minimum_width; | 621 | *min_width = config->floating_minimum_width; |
625 | } | 622 | } |
626 | 623 | ||
627 | if (config->floating_minimum_height == -1) { // no minimum | 624 | if (config->floating_minimum_height == -1) { // no minimum |
628 | min_height = 0; | 625 | *min_height = 0; |
629 | } else if (config->floating_minimum_height == 0) { // automatic | 626 | } else if (config->floating_minimum_height == 0) { // automatic |
630 | min_height = 50; | 627 | *min_height = 50; |
631 | } else { | 628 | } else { |
632 | min_height = config->floating_minimum_height; | 629 | *min_height = config->floating_minimum_height; |
633 | } | 630 | } |
634 | 631 | ||
632 | struct wlr_box *box = wlr_output_layout_get_box(root->output_layout, NULL); | ||
633 | |||
635 | if (config->floating_maximum_width == -1) { // no maximum | 634 | if (config->floating_maximum_width == -1) { // no maximum |
636 | max_width = INT_MAX; | 635 | *max_width = INT_MAX; |
637 | } else if (config->floating_maximum_width == 0) { // automatic | 636 | } else if (config->floating_maximum_width == 0) { // automatic |
638 | max_width = ws->width * 0.6666; | 637 | *max_width = box->width; |
639 | } else { | 638 | } else { |
640 | max_width = config->floating_maximum_width; | 639 | *max_width = config->floating_maximum_width; |
641 | } | 640 | } |
642 | 641 | ||
643 | if (config->floating_maximum_height == -1) { // no maximum | 642 | if (config->floating_maximum_height == -1) { // no maximum |
644 | max_height = INT_MAX; | 643 | *max_height = INT_MAX; |
645 | } else if (config->floating_maximum_height == 0) { // automatic | 644 | } else if (config->floating_maximum_height == 0) { // automatic |
646 | max_height = ws->height * 0.6666; | 645 | *max_height = box->height; |
647 | } else { | 646 | } else { |
648 | max_height = config->floating_maximum_height; | 647 | *max_height = config->floating_maximum_height; |
649 | } | 648 | } |
650 | 649 | ||
650 | } | ||
651 | |||
652 | void container_init_floating(struct sway_container *con) { | ||
653 | struct sway_workspace *ws = con->workspace; | ||
654 | int min_width, max_width, min_height, max_height; | ||
655 | floating_calculate_constraints(&min_width, &max_width, | ||
656 | &min_height, &max_height); | ||
657 | |||
651 | if (!con->view) { | 658 | if (!con->view) { |
652 | con->width = max_width; | 659 | con->width = max_width; |
653 | con->height = max_height; | 660 | con->height = max_height; |
654 | con->x = ws->x + (ws->width - con->width) / 2; | 661 | if (con->width > ws->width || con->height > ws->height) { |
655 | con->y = ws->y + (ws->height - con->height) / 2; | 662 | struct wlr_box *ob = wlr_output_layout_get_box(root->output_layout, |
663 | ws->output->wlr_output); | ||
664 | con->x = ob->x + (ob->width - con->width) / 2; | ||
665 | con->y = ob->y + (ob->height - con->height) / 2; | ||
666 | } else { | ||
667 | con->x = ws->x + (ws->width - con->width) / 2; | ||
668 | con->y = ws->y + (ws->height - con->height) / 2; | ||
669 | } | ||
656 | } else { | 670 | } else { |
657 | struct sway_view *view = con->view; | 671 | struct sway_view *view = con->view; |
658 | con->content_width = | 672 | con->content_width = |
659 | fmax(min_width, fmin(view->natural_width, max_width)); | 673 | fmax(min_width, fmin(view->natural_width, max_width)); |
660 | con->content_height = | 674 | con->content_height = |
661 | fmax(min_height, fmin(view->natural_height, max_height)); | 675 | fmax(min_height, fmin(view->natural_height, max_height)); |
662 | con->content_x = ws->x + (ws->width - con->content_width) / 2; | 676 | if (con->content_width > ws->width |
663 | con->content_y = ws->y + (ws->height - con->content_height) / 2; | 677 | || con->content_height > ws->height) { |
678 | struct wlr_box *ob = wlr_output_layout_get_box(root->output_layout, | ||
679 | ws->output->wlr_output); | ||
680 | con->content_x = ob->x + (ob->width - con->content_width) / 2; | ||
681 | con->content_y = ob->y + (ob->height - con->content_height) / 2; | ||
682 | } else { | ||
683 | con->content_x = ws->x + (ws->width - con->content_width) / 2; | ||
684 | con->content_y = ws->y + (ws->height - con->content_height) / 2; | ||
685 | } | ||
664 | 686 | ||
665 | // If the view's border is B_NONE then these properties are ignored. | 687 | // If the view's border is B_NONE then these properties are ignored. |
666 | con->border_top = con->border_bottom = true; | 688 | con->border_top = con->border_bottom = true; |