summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <RedSoxFan@users.noreply.github.com>2018-11-26 12:02:27 -0500
committerLibravatar GitHub <noreply@github.com>2018-11-26 12:02:27 -0500
commita22e7b13ad9dd35a60290385d36cefb092f4aeee (patch)
treece4e7a4a7f243e2c0aa45bfa0d580fe147129b8f
parentMerge pull request #3185 from emersion/remove-xopen-source (diff)
parentIPC: Use consistent function names across ipc-json (diff)
downloadsway-a22e7b13ad9dd35a60290385d36cefb092f4aeee.tar.gz
sway-a22e7b13ad9dd35a60290385d36cefb092f4aeee.tar.zst
sway-a22e7b13ad9dd35a60290385d36cefb092f4aeee.zip
Merge pull request #3168 from mihaicmn/scratchpad-events
Fix missing IPC scratchpad replies/move events
-rw-r--r--sway/ipc-json.c251
-rw-r--r--sway/tree/root.c35
2 files changed, 183 insertions, 103 deletions
diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index 05e453ec..40fbd3e7 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -15,6 +15,9 @@
15#include <xkbcommon/xkbcommon.h> 15#include <xkbcommon/xkbcommon.h>
16#include "wlr-layer-shell-unstable-v1-protocol.h" 16#include "wlr-layer-shell-unstable-v1-protocol.h"
17 17
18static const int i3_output_id = INT32_MAX;
19static const int i3_scratch_id = INT32_MAX - 1;
20
18static const char *ipc_json_layout_description(enum sway_container_layout l) { 21static const char *ipc_json_layout_description(enum sway_container_layout l) {
19 switch (l) { 22 switch (l) {
20 case L_VERT: 23 case L_VERT:
@@ -32,15 +35,66 @@ static const char *ipc_json_layout_description(enum sway_container_layout l) {
32} 35}
33 36
34static const char *ipc_json_orientation_description(enum sway_container_layout l) { 37static const char *ipc_json_orientation_description(enum sway_container_layout l) {
35 if (l == L_VERT) { 38 switch (l) {
39 case L_VERT:
36 return "vertical"; 40 return "vertical";
41 case L_HORIZ:
42 return "horizontal";
43 default:
44 return "none";
37 } 45 }
46}
38 47
39 if (l == L_HORIZ) { 48static const char *ipc_json_border_description(enum sway_container_border border) {
40 return "horizontal"; 49 switch (border) {
50 case B_NONE:
51 return "none";
52 case B_PIXEL:
53 return "pixel";
54 case B_NORMAL:
55 return "normal";
56 case B_CSD:
57 return "csd";
41 } 58 }
59 return "unknown";
60}
42 61
43 return "none"; 62static const char *ipc_json_output_transform_description(enum wl_output_transform transform) {
63 switch (transform) {
64 case WL_OUTPUT_TRANSFORM_NORMAL:
65 return "normal";
66 case WL_OUTPUT_TRANSFORM_90:
67 return "90";
68 case WL_OUTPUT_TRANSFORM_180:
69 return "180";
70 case WL_OUTPUT_TRANSFORM_270:
71 return "270";
72 case WL_OUTPUT_TRANSFORM_FLIPPED:
73 return "flipped";
74 case WL_OUTPUT_TRANSFORM_FLIPPED_90:
75 return "flipped-90";
76 case WL_OUTPUT_TRANSFORM_FLIPPED_180:
77 return "flipped-180";
78 case WL_OUTPUT_TRANSFORM_FLIPPED_270:
79 return "flipped-270";
80 }
81 return NULL;
82}
83
84static const char *ipc_json_device_type_description(struct sway_input_device *device) {
85 switch (device->wlr_device->type) {
86 case WLR_INPUT_DEVICE_POINTER:
87 return "pointer";
88 case WLR_INPUT_DEVICE_KEYBOARD:
89 return "keyboard";
90 case WLR_INPUT_DEVICE_TOUCH:
91 return "touch";
92 case WLR_INPUT_DEVICE_TABLET_TOOL:
93 return "tablet_tool";
94 case WLR_INPUT_DEVICE_TABLET_PAD:
95 return "tablet_pad";
96 }
97 return "unknown";
44} 98}
45 99
46json_object *ipc_json_get_version(void) { 100json_object *ipc_json_get_version(void) {
@@ -76,30 +130,43 @@ static json_object *ipc_json_create_empty_rect(void) {
76 return ipc_json_create_rect(&empty); 130 return ipc_json_create_rect(&empty);
77} 131}
78 132
79static void ipc_json_describe_root(struct sway_root *root, json_object *object) { 133static json_object *ipc_json_create_node(int id, char *name,
80 json_object_object_add(object, "type", json_object_new_string("root")); 134 bool focused, json_object *focus, struct wlr_box *box) {
135 json_object *object = json_object_new_object();
136
137 json_object_object_add(object, "id", json_object_new_int(id));
138 json_object_object_add(object, "name",
139 name ? json_object_new_string(name) : NULL);
140 json_object_object_add(object, "rect", ipc_json_create_rect(box));
141 json_object_object_add(object, "focused", json_object_new_boolean(focused));
142 json_object_object_add(object, "focus", focus);
143
144 // set default values to be compatible with i3
145 json_object_object_add(object, "border",
146 json_object_new_string(
147 ipc_json_border_description(B_NONE)));
148 json_object_object_add(object, "current_border_width",
149 json_object_new_int(0));
150 json_object_object_add(object, "layout",
151 json_object_new_string(
152 ipc_json_layout_description(L_HORIZ)));
153 json_object_object_add(object, "orientation",
154 json_object_new_string(
155 ipc_json_orientation_description(L_HORIZ)));
156 json_object_object_add(object, "percent", NULL);
157 json_object_object_add(object, "window_rect", ipc_json_create_empty_rect());
158 json_object_object_add(object, "deco_rect", ipc_json_create_empty_rect());
159 json_object_object_add(object, "geometry", ipc_json_create_empty_rect());
160 json_object_object_add(object, "window", NULL);
161 json_object_object_add(object, "urgent", json_object_new_boolean(false));
162 json_object_object_add(object, "floating_nodes", json_object_new_array());
163 json_object_object_add(object, "sticky", json_object_new_boolean(false));
164
165 return object;
81} 166}
82 167
83static const char *ipc_json_get_output_transform(enum wl_output_transform transform) { 168static void ipc_json_describe_root(struct sway_root *root, json_object *object) {
84 switch (transform) { 169 json_object_object_add(object, "type", json_object_new_string("root"));
85 case WL_OUTPUT_TRANSFORM_NORMAL:
86 return "normal";
87 case WL_OUTPUT_TRANSFORM_90:
88 return "90";
89 case WL_OUTPUT_TRANSFORM_180:
90 return "180";
91 case WL_OUTPUT_TRANSFORM_270:
92 return "270";
93 case WL_OUTPUT_TRANSFORM_FLIPPED:
94 return "flipped";
95 case WL_OUTPUT_TRANSFORM_FLIPPED_90:
96 return "flipped-90";
97 case WL_OUTPUT_TRANSFORM_FLIPPED_180:
98 return "flipped-180";
99 case WL_OUTPUT_TRANSFORM_FLIPPED_270:
100 return "flipped-270";
101 }
102 return NULL;
103} 170}
104 171
105static void ipc_json_describe_output(struct sway_output *output, 172static void ipc_json_describe_output(struct sway_output *output,
@@ -110,7 +177,8 @@ static void ipc_json_describe_output(struct sway_output *output,
110 json_object_object_add(object, "primary", json_object_new_boolean(false)); 177 json_object_object_add(object, "primary", json_object_new_boolean(false));
111 json_object_object_add(object, "layout", json_object_new_string("output")); 178 json_object_object_add(object, "layout", json_object_new_string("output"));
112 json_object_object_add(object, "orientation", 179 json_object_object_add(object, "orientation",
113 json_object_new_string(ipc_json_orientation_description(L_NONE))); 180 json_object_new_string(
181 ipc_json_orientation_description(L_NONE)));
114 json_object_object_add(object, "make", 182 json_object_object_add(object, "make",
115 json_object_new_string(wlr_output->make)); 183 json_object_new_string(wlr_output->make));
116 json_object_object_add(object, "model", 184 json_object_object_add(object, "model",
@@ -121,7 +189,7 @@ static void ipc_json_describe_output(struct sway_output *output,
121 json_object_new_double(wlr_output->scale)); 189 json_object_new_double(wlr_output->scale));
122 json_object_object_add(object, "transform", 190 json_object_object_add(object, "transform",
123 json_object_new_string( 191 json_object_new_string(
124 ipc_json_get_output_transform(wlr_output->transform))); 192 ipc_json_output_transform_description(wlr_output->transform)));
125 193
126 struct sway_workspace *ws = output_get_active_workspace(output); 194 struct sway_workspace *ws = output_get_active_workspace(output);
127 json_object_object_add(object, "current_workspace", 195 json_object_object_add(object, "current_workspace",
@@ -187,6 +255,52 @@ json_object *ipc_json_describe_disabled_output(struct sway_output *output) {
187 return object; 255 return object;
188} 256}
189 257
258static json_object *ipc_json_describe_scratchpad_output(void) {
259 struct wlr_box box;
260 root_get_box(root, &box);
261
262 // Create focus stack for __i3_scratch workspace
263 json_object *workspace_focus = json_object_new_array();
264 for (int i = root->scratchpad->length - 1; i >= 0; --i) {
265 struct sway_container *container = root->scratchpad->items[i];
266 json_object_array_add(workspace_focus,
267 json_object_new_int(container->node.id));
268 }
269
270 json_object *workspace = ipc_json_create_node(i3_scratch_id,
271 "__i3_scratch", false, workspace_focus, &box);
272 json_object_object_add(workspace, "type",
273 json_object_new_string("workspace"));
274
275 // List all hidden scratchpad containers as floating nodes
276 json_object *floating_array = json_object_new_array();
277 for (int i = 0; i < root->scratchpad->length; ++i) {
278 struct sway_container *container = root->scratchpad->items[i];
279 if (!container->workspace) {
280 json_object_array_add(floating_array,
281 ipc_json_describe_node_recursive(&container->node));
282 }
283 }
284 json_object_object_add(workspace, "floating_nodes", floating_array);
285
286 // Create focus stack for __i3 output
287 json_object *output_focus = json_object_new_array();
288 json_object_array_add(output_focus, json_object_new_int(i3_scratch_id));
289
290 json_object *output = ipc_json_create_node(i3_output_id,
291 "__i3", false, output_focus, &box);
292 json_object_object_add(output, "type",
293 json_object_new_string("output"));
294 json_object_object_add(output, "layout",
295 json_object_new_string("output"));
296
297 json_object *nodes = json_object_new_array();
298 json_object_array_add(nodes, workspace);
299 json_object_object_add(output, "nodes", nodes);
300
301 return output;
302}
303
190static void ipc_json_describe_workspace(struct sway_workspace *workspace, 304static void ipc_json_describe_workspace(struct sway_workspace *workspace,
191 json_object *object) { 305 json_object *object) {
192 int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1; 306 int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1;
@@ -200,11 +314,12 @@ static void ipc_json_describe_workspace(struct sway_workspace *workspace,
200 json_object_object_add(object, "representation", workspace->representation ? 314 json_object_object_add(object, "representation", workspace->representation ?
201 json_object_new_string(workspace->representation) : NULL); 315 json_object_new_string(workspace->representation) : NULL);
202 316
203 const char *layout = ipc_json_layout_description(workspace->layout); 317 json_object_object_add(object, "layout",
204 json_object_object_add(object, "layout", json_object_new_string(layout)); 318 json_object_new_string(
205 319 ipc_json_layout_description(workspace->layout)));
206 const char *orientation = ipc_json_orientation_description(workspace->layout); 320 json_object_object_add(object, "orientation",
207 json_object_object_add(object, "orientation", json_object_new_string(orientation)); 321 json_object_new_string(
322 ipc_json_orientation_description(workspace->layout)));
208 323
209 // Floating 324 // Floating
210 json_object *floating_array = json_object_new_array(); 325 json_object *floating_array = json_object_new_array();
@@ -216,20 +331,6 @@ static void ipc_json_describe_workspace(struct sway_workspace *workspace,
216 json_object_object_add(object, "floating_nodes", floating_array); 331 json_object_object_add(object, "floating_nodes", floating_array);
217} 332}
218 333
219static const char *describe_container_border(enum sway_container_border border) {
220 switch (border) {
221 case B_NONE:
222 return "none";
223 case B_PIXEL:
224 return "pixel";
225 case B_NORMAL:
226 return "normal";
227 case B_CSD:
228 return "csd";
229 }
230 return "unknown";
231}
232
233static void ipc_json_describe_view(struct sway_container *c, json_object *object) { 334static void ipc_json_describe_view(struct sway_container *c, json_object *object) {
234 json_object_object_add(object, "pid", json_object_new_int(c->view->pid)); 335 json_object_object_add(object, "pid", json_object_new_int(c->view->pid));
235 336
@@ -307,10 +408,12 @@ static void ipc_json_describe_container(struct sway_container *c, json_object *o
307 json_object_new_string(container_is_floating(c) ? "floating_con" : "con")); 408 json_object_new_string(container_is_floating(c) ? "floating_con" : "con"));
308 409
309 json_object_object_add(object, "layout", 410 json_object_object_add(object, "layout",
310 json_object_new_string(ipc_json_layout_description(c->layout))); 411 json_object_new_string(
412 ipc_json_layout_description(c->layout)));
311 413
312 json_object_object_add(object, "orientation", 414 json_object_object_add(object, "orientation",
313 json_object_new_string(ipc_json_orientation_description(c->layout))); 415 json_object_new_string(
416 ipc_json_orientation_description(c->layout)));
314 417
315 bool urgent = c->view ? 418 bool urgent = c->view ?
316 view_is_urgent(c->view) : container_has_urgent_child(c); 419 view_is_urgent(c->view) : container_has_urgent_child(c);
@@ -331,7 +434,8 @@ static void ipc_json_describe_container(struct sway_container *c, json_object *o
331 } 434 }
332 435
333 json_object_object_add(object, "border", 436 json_object_object_add(object, "border",
334 json_object_new_string(describe_container_border(c->current.border))); 437 json_object_new_string(
438 ipc_json_border_description(c->current.border)));
335 json_object_object_add(object, "current_border_width", 439 json_object_object_add(object, "current_border_width",
336 json_object_new_int(c->current.border_thickness)); 440 json_object_new_int(c->current.border_thickness));
337 json_object_object_add(object, "floating_nodes", json_object_new_array()); 441 json_object_object_add(object, "floating_nodes", json_object_new_array());
@@ -372,17 +476,10 @@ static void focus_inactive_children_iterator(struct sway_node *node,
372json_object *ipc_json_describe_node(struct sway_node *node) { 476json_object *ipc_json_describe_node(struct sway_node *node) {
373 struct sway_seat *seat = input_manager_get_default_seat(); 477 struct sway_seat *seat = input_manager_get_default_seat();
374 bool focused = seat_get_focus(seat) == node; 478 bool focused = seat_get_focus(seat) == node;
375
376 json_object *object = json_object_new_object();
377 char *name = node_get_name(node); 479 char *name = node_get_name(node);
378 480
379 struct wlr_box box; 481 struct wlr_box box;
380 node_get_box(node, &box); 482 node_get_box(node, &box);
381 json_object_object_add(object, "id", json_object_new_int((int)node->id));
382 json_object_object_add(object, "name",
383 name ? json_object_new_string(name) : NULL);
384 json_object_object_add(object, "rect", ipc_json_create_rect(&box));
385 json_object_object_add(object, "focused", json_object_new_boolean(focused));
386 483
387 json_object *focus = json_object_new_array(); 484 json_object *focus = json_object_new_array();
388 struct focus_inactive_data data = { 485 struct focus_inactive_data data = {
@@ -390,24 +487,9 @@ json_object *ipc_json_describe_node(struct sway_node *node) {
390 .object = focus, 487 .object = focus,
391 }; 488 };
392 seat_for_each_node(seat, focus_inactive_children_iterator, &data); 489 seat_for_each_node(seat, focus_inactive_children_iterator, &data);
393 json_object_object_add(object, "focus", focus);
394 490
395 // set default values to be compatible with i3 491 json_object *object = ipc_json_create_node(
396 json_object_object_add(object, "border", 492 (int)node->id, name, focused, focus, &box);
397 json_object_new_string(describe_container_border(B_NONE)));
398 json_object_object_add(object, "current_border_width", json_object_new_int(0));
399 json_object_object_add(object, "layout",
400 json_object_new_string(ipc_json_layout_description(L_HORIZ)));
401 json_object_object_add(object, "orientation",
402 json_object_new_string(ipc_json_orientation_description(L_HORIZ)));
403 json_object_object_add(object, "percent", NULL);
404 json_object_object_add(object, "window_rect", ipc_json_create_empty_rect());
405 json_object_object_add(object, "deco_rect", ipc_json_create_empty_rect());
406 json_object_object_add(object, "geometry", ipc_json_create_empty_rect());
407 json_object_object_add(object, "window", NULL);
408 json_object_object_add(object, "urgent", json_object_new_boolean(false));
409 json_object_object_add(object, "floating_nodes", json_object_new_array());
410 json_object_object_add(object, "sticky", json_object_new_boolean(false));
411 493
412 switch (node->type) { 494 switch (node->type) {
413 case N_ROOT: 495 case N_ROOT:
@@ -434,6 +516,8 @@ json_object *ipc_json_describe_node_recursive(struct sway_node *node) {
434 json_object *children = json_object_new_array(); 516 json_object *children = json_object_new_array();
435 switch (node->type) { 517 switch (node->type) {
436 case N_ROOT: 518 case N_ROOT:
519 json_object_array_add(children,
520 ipc_json_describe_scratchpad_output());
437 for (i = 0; i < root->outputs->length; ++i) { 521 for (i = 0; i < root->outputs->length; ++i) {
438 struct sway_output *output = root->outputs->items[i]; 522 struct sway_output *output = root->outputs->items[i];
439 json_object_array_add(children, 523 json_object_array_add(children,
@@ -470,22 +554,6 @@ json_object *ipc_json_describe_node_recursive(struct sway_node *node) {
470 return object; 554 return object;
471} 555}
472 556
473static const char *describe_device_type(struct sway_input_device *device) {
474 switch (device->wlr_device->type) {
475 case WLR_INPUT_DEVICE_POINTER:
476 return "pointer";
477 case WLR_INPUT_DEVICE_KEYBOARD:
478 return "keyboard";
479 case WLR_INPUT_DEVICE_TOUCH:
480 return "touch";
481 case WLR_INPUT_DEVICE_TABLET_TOOL:
482 return "tablet_tool";
483 case WLR_INPUT_DEVICE_TABLET_PAD:
484 return "tablet_pad";
485 }
486 return "unknown";
487}
488
489json_object *ipc_json_describe_input(struct sway_input_device *device) { 557json_object *ipc_json_describe_input(struct sway_input_device *device) {
490 if (!(sway_assert(device, "Device must not be null"))) { 558 if (!(sway_assert(device, "Device must not be null"))) {
491 return NULL; 559 return NULL;
@@ -502,7 +570,8 @@ json_object *ipc_json_describe_input(struct sway_input_device *device) {
502 json_object_object_add(object, "product", 570 json_object_object_add(object, "product",
503 json_object_new_int(device->wlr_device->product)); 571 json_object_new_int(device->wlr_device->product));
504 json_object_object_add(object, "type", 572 json_object_object_add(object, "type",
505 json_object_new_string(describe_device_type(device))); 573 json_object_new_string(
574 ipc_json_device_type_description(device)));
506 575
507 if (device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { 576 if (device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) {
508 struct wlr_keyboard *keyboard = device->wlr_device->keyboard; 577 struct wlr_keyboard *keyboard = device->wlr_device->keyboard;
diff --git a/sway/tree/root.c b/sway/tree/root.c
index 544d666a..9f6bf607 100644
--- a/sway/tree/root.c
+++ b/sway/tree/root.c
@@ -5,6 +5,7 @@
5#include <wlr/types/wlr_output_layout.h> 5#include <wlr/types/wlr_output_layout.h>
6#include "sway/desktop/transaction.h" 6#include "sway/desktop/transaction.h"
7#include "sway/input/seat.h" 7#include "sway/input/seat.h"
8#include "sway/ipc-server.h"
8#include "sway/output.h" 9#include "sway/output.h"
9#include "sway/tree/arrange.h" 10#include "sway/tree/arrange.h"
10#include "sway/tree/container.h" 11#include "sway/tree/container.h"
@@ -75,6 +76,8 @@ void root_scratchpad_add_container(struct sway_container *con) {
75 arrange_workspace(workspace); 76 arrange_workspace(workspace);
76 seat_set_focus(seat, seat_get_focus_inactive(seat, &workspace->node)); 77 seat_set_focus(seat, seat_get_focus_inactive(seat, &workspace->node));
77 } 78 }
79
80 ipc_event_window(con, "move");
78} 81}
79 82
80void root_scratchpad_remove_container(struct sway_container *con) { 83void root_scratchpad_remove_container(struct sway_container *con) {
@@ -85,45 +88,51 @@ void root_scratchpad_remove_container(struct sway_container *con) {
85 int index = list_find(root->scratchpad, con); 88 int index = list_find(root->scratchpad, con);
86 if (index != -1) { 89 if (index != -1) {
87 list_del(root->scratchpad, index); 90 list_del(root->scratchpad, index);
91 ipc_event_window(con, "move");
88 } 92 }
89} 93}
90 94
91void root_scratchpad_show(struct sway_container *con) { 95void root_scratchpad_show(struct sway_container *con) {
92 struct sway_seat *seat = input_manager_current_seat(); 96 struct sway_seat *seat = input_manager_current_seat();
93 struct sway_workspace *ws = seat_get_focused_workspace(seat); 97 struct sway_workspace *new_ws = seat_get_focused_workspace(seat);
98 struct sway_workspace *old_ws = con->workspace;
94 99
95 // If the current con or any of its parents are in fullscreen mode, we 100 // If the current con or any of its parents are in fullscreen mode, we
96 // first need to disable it before showing the scratchpad con. 101 // first need to disable it before showing the scratchpad con.
97 if (ws->fullscreen) { 102 if (new_ws->fullscreen) {
98 container_set_fullscreen(ws->fullscreen, false); 103 container_set_fullscreen(new_ws->fullscreen, false);
99 } 104 }
100 105
101 // Show the container 106 // Show the container
102 if (con->workspace) { 107 if (old_ws) {
103 container_detach(con); 108 container_detach(con);
104 } 109 }
105 workspace_add_floating(ws, con); 110 workspace_add_floating(new_ws, con);
106 111
107 // Make sure the container's center point overlaps this workspace 112 // Make sure the container's center point overlaps this workspace
108 double center_lx = con->x + con->width / 2; 113 double center_lx = con->x + con->width / 2;
109 double center_ly = con->y + con->height / 2; 114 double center_ly = con->y + con->height / 2;
110 115
111 struct wlr_box workspace_box; 116 struct wlr_box workspace_box;
112 workspace_get_box(ws, &workspace_box); 117 workspace_get_box(new_ws, &workspace_box);
113 if (!wlr_box_contains_point(&workspace_box, center_lx, center_ly)) { 118 if (!wlr_box_contains_point(&workspace_box, center_lx, center_ly)) {
114 // Maybe resize it 119 // Maybe resize it
115 if (con->width > ws->width || con->height > ws->height) { 120 if (con->width > new_ws->width || con->height > new_ws->height) {
116 container_init_floating(con); 121 container_init_floating(con);
117 } 122 }
118 123
119 // Center it 124 // Center it
120 double new_lx = ws->x + (ws->width - con->width) / 2; 125 double new_lx = new_ws->x + (new_ws->width - con->width) / 2;
121 double new_ly = ws->y + (ws->height - con->height) / 2; 126 double new_ly = new_ws->y + (new_ws->height - con->height) / 2;
122 container_floating_move_to(con, new_lx, new_ly); 127 container_floating_move_to(con, new_lx, new_ly);
123 } 128 }
124 129
125 arrange_workspace(ws); 130 arrange_workspace(new_ws);
126 seat_set_focus(seat, seat_get_focus_inactive(seat, &con->node)); 131 seat_set_focus(seat, seat_get_focus_inactive(seat, &con->node));
132
133 if (new_ws != old_ws) {
134 ipc_event_window(con, "move");
135 }
127} 136}
128 137
129void root_scratchpad_hide(struct sway_container *con) { 138void root_scratchpad_hide(struct sway_container *con) {
@@ -137,6 +146,8 @@ void root_scratchpad_hide(struct sway_container *con) {
137 seat_set_focus(seat, seat_get_focus_inactive(seat, &ws->node)); 146 seat_set_focus(seat, seat_get_focus_inactive(seat, &ws->node));
138 } 147 }
139 list_move_to_end(root->scratchpad, con); 148 list_move_to_end(root->scratchpad, con);
149
150 ipc_event_window(con, "move");
140} 151}
141 152
142struct pid_workspace { 153struct pid_workspace {