aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/container.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-03-27 14:00:19 -0400
committerLibravatar emersion <contact@emersion.fr>2019-03-31 09:32:23 +0300
commitdd28e6a6d6abf06d2d16e6c91aeaf942bf225af7 (patch)
tree98d0836c238f9e49b25e65de7c6645813dfe1ad6 /sway/tree/container.c
parentFix a crash in swaybar when an icon dir is not readable (diff)
downloadsway-dd28e6a6d6abf06d2d16e6c91aeaf942bf225af7.tar.gz
sway-dd28e6a6d6abf06d2d16e6c91aeaf942bf225af7.tar.zst
sway-dd28e6a6d6abf06d2d16e6c91aeaf942bf225af7.zip
Fix xwayland configure request scratchpad crash
This fixes a crash in `container_init_floating` when a xwayland view sends a configure request while in the scratchpad. `container_init_floating` gets called so the configured minimum and maximum sizes gets respected when resizing to the requested size. Since the workspace was NULL, it would SIGSEGV when attempting to get the workspace's output for the output box retrieval. This extracts the resizing portion of `container_init_floating` into a separate function. If the container is in the scratchpad, it will just be resized and skip the centering. Additionally, `container_init_floating` has been renamed to `container_floating_resize_and_center` to more accurately describe what it does.
Diffstat (limited to 'sway/tree/container.c')
-rw-r--r--sway/tree/container.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c
index f84ce360..b7ea2b7e 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -649,8 +649,31 @@ void floating_calculate_constraints(int *min_width, int *max_width,
649 649
650} 650}
651 651
652void container_init_floating(struct sway_container *con) { 652static void floating_natural_resize(struct sway_container *con) {
653 int min_width, max_width, min_height, max_height;
654 floating_calculate_constraints(&min_width, &max_width,
655 &min_height, &max_height);
656 if (!con->view) {
657 con->width = max_width;
658 con->height = max_height;
659 } else {
660 struct sway_view *view = con->view;
661 con->content_width =
662 fmax(min_width, fmin(view->natural_width, max_width));
663 con->content_height =
664 fmax(min_height, fmin(view->natural_height, max_height));
665 container_set_geometry_from_content(con);
666 }
667}
668
669void container_floating_resize_and_center(struct sway_container *con) {
653 struct sway_workspace *ws = con->workspace; 670 struct sway_workspace *ws = con->workspace;
671 if (!ws) {
672 // On scratchpad, just resize
673 floating_natural_resize(con);
674 return;
675 }
676
654 struct wlr_box *ob = wlr_output_layout_get_box(root->output_layout, 677 struct wlr_box *ob = wlr_output_layout_get_box(root->output_layout,
655 ws->output->wlr_output); 678 ws->output->wlr_output);
656 if (!ob) { 679 if (!ob) {
@@ -662,13 +685,8 @@ void container_init_floating(struct sway_container *con) {
662 return; 685 return;
663 } 686 }
664 687
665 int min_width, max_width, min_height, max_height; 688 floating_natural_resize(con);
666 floating_calculate_constraints(&min_width, &max_width,
667 &min_height, &max_height);
668
669 if (!con->view) { 689 if (!con->view) {
670 con->width = max_width;
671 con->height = max_height;
672 if (con->width > ws->width || con->height > ws->height) { 690 if (con->width > ws->width || con->height > ws->height) {
673 con->x = ob->x + (ob->width - con->width) / 2; 691 con->x = ob->x + (ob->width - con->width) / 2;
674 con->y = ob->y + (ob->height - con->height) / 2; 692 con->y = ob->y + (ob->height - con->height) / 2;
@@ -677,11 +695,6 @@ void container_init_floating(struct sway_container *con) {
677 con->y = ws->y + (ws->height - con->height) / 2; 695 con->y = ws->y + (ws->height - con->height) / 2;
678 } 696 }
679 } else { 697 } else {
680 struct sway_view *view = con->view;
681 con->content_width =
682 fmax(min_width, fmin(view->natural_width, max_width));
683 con->content_height =
684 fmax(min_height, fmin(view->natural_height, max_height));
685 if (con->content_width > ws->width 698 if (con->content_width > ws->width
686 || con->content_height > ws->height) { 699 || con->content_height > ws->height) {
687 con->content_x = ob->x + (ob->width - con->content_width) / 2; 700 con->content_x = ob->x + (ob->width - con->content_width) / 2;
@@ -711,7 +724,7 @@ void container_set_floating(struct sway_container *container, bool enable) {
711 struct sway_container *old_parent = container->parent; 724 struct sway_container *old_parent = container->parent;
712 container_detach(container); 725 container_detach(container);
713 workspace_add_floating(workspace, container); 726 workspace_add_floating(workspace, container);
714 container_init_floating(container); 727 container_floating_resize_and_center(container);
715 if (container->view) { 728 if (container->view) {
716 view_set_tiled(container->view, false); 729 view_set_tiled(container->view, false);
717 if (container->view->using_csd) { 730 if (container->view->using_csd) {
@@ -995,7 +1008,7 @@ void container_fullscreen_disable(struct sway_container *con) {
995 // criteria, it needs to be reinitialized as floating to get the proper 1008 // criteria, it needs to be reinitialized as floating to get the proper
996 // size and location 1009 // size and location
997 if (container_is_floating(con) && (con->width == 0 || con->height == 0)) { 1010 if (container_is_floating(con) && (con->width == 0 || con->height == 0)) {
998 container_init_floating(con); 1011 container_floating_resize_and_center(con);
999 } 1012 }
1000 1013
1001 con->fullscreen_mode = FULLSCREEN_NONE; 1014 con->fullscreen_mode = FULLSCREEN_NONE;