aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/root.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree/root.c')
-rw-r--r--sway/tree/root.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/sway/tree/root.c b/sway/tree/root.c
index 95129a88..233358d2 100644
--- a/sway/tree/root.c
+++ b/sway/tree/root.c
@@ -56,6 +56,16 @@ void root_destroy(struct sway_root *root) {
56 free(root); 56 free(root);
57} 57}
58 58
59static void set_container_transform(struct sway_workspace *ws,
60 struct sway_container *con) {
61 struct sway_output *output = ws->output;
62 struct wlr_box box = {0};
63 if (output) {
64 output_get_box(output, &box);
65 }
66 con->transform = box;
67}
68
59void root_scratchpad_add_container(struct sway_container *con, struct sway_workspace *ws) { 69void root_scratchpad_add_container(struct sway_container *con, struct sway_workspace *ws) {
60 if (!sway_assert(!con->scratchpad, "Container is already in scratchpad")) { 70 if (!sway_assert(!con->scratchpad, "Container is already in scratchpad")) {
61 return; 71 return;
@@ -64,6 +74,8 @@ void root_scratchpad_add_container(struct sway_container *con, struct sway_works
64 struct sway_container *parent = con->pending.parent; 74 struct sway_container *parent = con->pending.parent;
65 struct sway_workspace *workspace = con->pending.workspace; 75 struct sway_workspace *workspace = con->pending.workspace;
66 76
77 set_container_transform(workspace, con);
78
67 // Clear the fullscreen mode when sending to the scratchpad 79 // Clear the fullscreen mode when sending to the scratchpad
68 if (con->pending.fullscreen_mode != FULLSCREEN_NONE) { 80 if (con->pending.fullscreen_mode != FULLSCREEN_NONE) {
69 container_fullscreen_disable(con); 81 container_fullscreen_disable(con);
@@ -142,15 +154,12 @@ void root_scratchpad_show(struct sway_container *con) {
142 } 154 }
143 workspace_add_floating(new_ws, con); 155 workspace_add_floating(new_ws, con);
144 156
145 // Make sure the container's center point overlaps this workspace 157 if (new_ws->output) {
146 double center_lx = con->pending.x + con->pending.width / 2; 158 struct wlr_box output_box;
147 double center_ly = con->pending.y + con->pending.height / 2; 159 output_get_box(new_ws->output, &output_box);
148 160 floating_fix_coordinates(con, &con->transform, &output_box);
149 struct wlr_box workspace_box;
150 workspace_get_box(new_ws, &workspace_box);
151 if (!wlr_box_contains_point(&workspace_box, center_lx, center_ly)) {
152 container_floating_resize_and_center(con);
153 } 161 }
162 set_container_transform(new_ws, con);
154 163
155 arrange_workspace(new_ws); 164 arrange_workspace(new_ws);
156 seat_set_focus(seat, seat_get_focus_inactive(seat, &con->node)); 165 seat_set_focus(seat, seat_get_focus_inactive(seat, &con->node));
@@ -173,6 +182,8 @@ void root_scratchpad_hide(struct sway_container *con) {
173 return; 182 return;
174 } 183 }
175 184
185 set_container_transform(con->pending.workspace, con);
186
176 disable_fullscreen(con, NULL); 187 disable_fullscreen(con, NULL);
177 container_for_each_child(con, disable_fullscreen, NULL); 188 container_for_each_child(con, disable_fullscreen, NULL);
178 container_detach(con); 189 container_detach(con);