aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/container.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-03-23 17:24:53 -0400
committerLibravatar emersion <contact@emersion.fr>2019-03-23 23:39:42 +0200
commitcd8b4ace926bd5a5289a5d5d6f6dddc1e4732287 (patch)
treec6923a5abb407b59dea0e42364ee988a6c39c3ff /sway/tree/container.c
parentcriteria: fix __focused__ when no focus or unset (diff)
downloadsway-cd8b4ace926bd5a5289a5d5d6f6dddc1e4732287.tar.gz
sway-cd8b4ace926bd5a5289a5d5d6f6dddc1e4732287.tar.zst
sway-cd8b4ace926bd5a5289a5d5d6f6dddc1e4732287.zip
fix opening a floating view on the NOOP output
Since the NOOP output has no size, the minimum floating size is greater than the workspace size for the NOOP output. In this case, the floater gets centered in the output instead of the workspace. However, the NOOP output is not part of the output layout and thus has a NULL box. Attempting to access the properties of this box was causing a segfault. This fixes the issue by just setting the floater's box to all zeroes when mapping on the NOOP output. When the workspace gets moved from the NOOP output to a new output, any floater whose width or height is zero or has an x or y location outside of the output, gets passed to `container_init_floating` again. This will then set the appropriate size and centering. For any floater that has a valid size and location, they are preserved.
Diffstat (limited to 'sway/tree/container.c')
-rw-r--r--sway/tree/container.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c
index 93cff7ff..f84ce360 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -651,6 +651,17 @@ void floating_calculate_constraints(int *min_width, int *max_width,
651 651
652void container_init_floating(struct sway_container *con) { 652void container_init_floating(struct sway_container *con) {
653 struct sway_workspace *ws = con->workspace; 653 struct sway_workspace *ws = con->workspace;
654 struct wlr_box *ob = wlr_output_layout_get_box(root->output_layout,
655 ws->output->wlr_output);
656 if (!ob) {
657 // On NOOP output. Will be called again when moved to an output
658 con->x = 0;
659 con->y = 0;
660 con->width = 0;
661 con->height = 0;
662 return;
663 }
664
654 int min_width, max_width, min_height, max_height; 665 int min_width, max_width, min_height, max_height;
655 floating_calculate_constraints(&min_width, &max_width, 666 floating_calculate_constraints(&min_width, &max_width,
656 &min_height, &max_height); 667 &min_height, &max_height);
@@ -659,8 +670,6 @@ void container_init_floating(struct sway_container *con) {
659 con->width = max_width; 670 con->width = max_width;
660 con->height = max_height; 671 con->height = max_height;
661 if (con->width > ws->width || con->height > ws->height) { 672 if (con->width > ws->width || con->height > ws->height) {
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; 673 con->x = ob->x + (ob->width - con->width) / 2;
665 con->y = ob->y + (ob->height - con->height) / 2; 674 con->y = ob->y + (ob->height - con->height) / 2;
666 } else { 675 } else {
@@ -675,8 +684,6 @@ void container_init_floating(struct sway_container *con) {
675 fmax(min_height, fmin(view->natural_height, max_height)); 684 fmax(min_height, fmin(view->natural_height, max_height));
676 if (con->content_width > ws->width 685 if (con->content_width > ws->width
677 || con->content_height > ws->height) { 686 || 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; 687 con->content_x = ob->x + (ob->width - con->content_width) / 2;
681 con->content_y = ob->y + (ob->height - con->content_height) / 2; 688 con->content_y = ob->y + (ob->height - con->content_height) / 2;
682 } else { 689 } else {