diff options
author | Mihai Coman <mihai.cmn@gmail.com> | 2018-11-21 15:31:30 +0200 |
---|---|---|
committer | Mihai Coman <mihai.cmn@gmail.com> | 2018-11-26 11:15:25 +0200 |
commit | 65c32e41d455b944ee25fa319e1336f1090bc00d (patch) | |
tree | 738de91c7204288e6d4dfdfe1d5448967497096b | |
parent | IPC: Trigger move events for scratchpad containers (diff) | |
download | sway-65c32e41d455b944ee25fa319e1336f1090bc00d.tar.gz sway-65c32e41d455b944ee25fa319e1336f1090bc00d.tar.zst sway-65c32e41d455b944ee25fa319e1336f1090bc00d.zip |
IPC: Add scratchpad containers to get_tree reply
This patch lists all hidden scratchpad containers as floating nodes
on "__i3_scratch" workspace. This workspace resides on "__i3" output.
-rw-r--r-- | sway/ipc-json.c | 136 |
1 files changed, 98 insertions, 38 deletions
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 05e453ec..833d20a1 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 | ||
18 | static const int i3_output_id = INT32_MAX; | ||
19 | static const int i3_scratch_id = INT32_MAX - 1; | ||
20 | |||
18 | static const char *ipc_json_layout_description(enum sway_container_layout l) { | 21 | static 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: |
@@ -43,6 +46,20 @@ static const char *ipc_json_orientation_description(enum sway_container_layout l | |||
43 | return "none"; | 46 | return "none"; |
44 | } | 47 | } |
45 | 48 | ||
49 | static const char *describe_container_border(enum sway_container_border border) { | ||
50 | switch (border) { | ||
51 | case B_NONE: | ||
52 | return "none"; | ||
53 | case B_PIXEL: | ||
54 | return "pixel"; | ||
55 | case B_NORMAL: | ||
56 | return "normal"; | ||
57 | case B_CSD: | ||
58 | return "csd"; | ||
59 | } | ||
60 | return "unknown"; | ||
61 | } | ||
62 | |||
46 | json_object *ipc_json_get_version(void) { | 63 | json_object *ipc_json_get_version(void) { |
47 | int major = 0, minor = 0, patch = 0; | 64 | int major = 0, minor = 0, patch = 0; |
48 | json_object *version = json_object_new_object(); | 65 | json_object *version = json_object_new_object(); |
@@ -76,6 +93,37 @@ static json_object *ipc_json_create_empty_rect(void) { | |||
76 | return ipc_json_create_rect(&empty); | 93 | return ipc_json_create_rect(&empty); |
77 | } | 94 | } |
78 | 95 | ||
96 | static json_object *ipc_json_create_node(int id, char *name, | ||
97 | bool focused, json_object *focus, struct wlr_box *box) { | ||
98 | json_object *object = json_object_new_object(); | ||
99 | |||
100 | json_object_object_add(object, "id", json_object_new_int(id)); | ||
101 | json_object_object_add(object, "name", | ||
102 | name ? json_object_new_string(name) : NULL); | ||
103 | json_object_object_add(object, "rect", ipc_json_create_rect(box)); | ||
104 | json_object_object_add(object, "focused", json_object_new_boolean(focused)); | ||
105 | json_object_object_add(object, "focus", focus); | ||
106 | |||
107 | // set default values to be compatible with i3 | ||
108 | json_object_object_add(object, "border", | ||
109 | json_object_new_string(describe_container_border(B_NONE))); | ||
110 | json_object_object_add(object, "current_border_width", json_object_new_int(0)); | ||
111 | json_object_object_add(object, "layout", | ||
112 | json_object_new_string(ipc_json_layout_description(L_HORIZ))); | ||
113 | json_object_object_add(object, "orientation", | ||
114 | json_object_new_string(ipc_json_orientation_description(L_HORIZ))); | ||
115 | json_object_object_add(object, "percent", NULL); | ||
116 | json_object_object_add(object, "window_rect", ipc_json_create_empty_rect()); | ||
117 | json_object_object_add(object, "deco_rect", ipc_json_create_empty_rect()); | ||
118 | json_object_object_add(object, "geometry", ipc_json_create_empty_rect()); | ||
119 | json_object_object_add(object, "window", NULL); | ||
120 | json_object_object_add(object, "urgent", json_object_new_boolean(false)); | ||
121 | json_object_object_add(object, "floating_nodes", json_object_new_array()); | ||
122 | json_object_object_add(object, "sticky", json_object_new_boolean(false)); | ||
123 | |||
124 | return object; | ||
125 | } | ||
126 | |||
79 | static void ipc_json_describe_root(struct sway_root *root, json_object *object) { | 127 | static void ipc_json_describe_root(struct sway_root *root, json_object *object) { |
80 | json_object_object_add(object, "type", json_object_new_string("root")); | 128 | json_object_object_add(object, "type", json_object_new_string("root")); |
81 | } | 129 | } |
@@ -187,6 +235,52 @@ json_object *ipc_json_describe_disabled_output(struct sway_output *output) { | |||
187 | return object; | 235 | return object; |
188 | } | 236 | } |
189 | 237 | ||
238 | static json_object *ipc_json_describe_scratchpad_output(void) { | ||
239 | struct wlr_box box; | ||
240 | root_get_box(root, &box); | ||
241 | |||
242 | // Create focus stack for __i3_scratch workspace | ||
243 | json_object *workspace_focus = json_object_new_array(); | ||
244 | for (int i = root->scratchpad->length - 1; i >= 0; --i) { | ||
245 | struct sway_container *container = root->scratchpad->items[i]; | ||
246 | json_object_array_add(workspace_focus, | ||
247 | json_object_new_int(container->node.id)); | ||
248 | } | ||
249 | |||
250 | json_object *workspace = ipc_json_create_node(i3_scratch_id, | ||
251 | "__i3_scratch", false, workspace_focus, &box); | ||
252 | json_object_object_add(workspace, "type", | ||
253 | json_object_new_string("workspace")); | ||
254 | |||
255 | // List all hidden scratchpad containers as floating nodes | ||
256 | json_object *floating_array = json_object_new_array(); | ||
257 | for (int i = 0; i < root->scratchpad->length; ++i) { | ||
258 | struct sway_container *container = root->scratchpad->items[i]; | ||
259 | if (!container->workspace) { | ||
260 | json_object_array_add(floating_array, | ||
261 | ipc_json_describe_node_recursive(&container->node)); | ||
262 | } | ||
263 | } | ||
264 | json_object_object_add(workspace, "floating_nodes", floating_array); | ||
265 | |||
266 | // Create focus stack for __i3 output | ||
267 | json_object *output_focus = json_object_new_array(); | ||
268 | json_object_array_add(output_focus, json_object_new_int(i3_scratch_id)); | ||
269 | |||
270 | json_object *output = ipc_json_create_node(i3_output_id, | ||
271 | "__i3", false, output_focus, &box); | ||
272 | json_object_object_add(output, "type", | ||
273 | json_object_new_string("output")); | ||
274 | json_object_object_add(output, "layout", | ||
275 | json_object_new_string("output")); | ||
276 | |||
277 | json_object *nodes = json_object_new_array(); | ||
278 | json_object_array_add(nodes, workspace); | ||
279 | json_object_object_add(output, "nodes", nodes); | ||
280 | |||
281 | return output; | ||
282 | } | ||
283 | |||
190 | static void ipc_json_describe_workspace(struct sway_workspace *workspace, | 284 | static void ipc_json_describe_workspace(struct sway_workspace *workspace, |
191 | json_object *object) { | 285 | json_object *object) { |
192 | int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1; | 286 | int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1; |
@@ -216,20 +310,6 @@ static void ipc_json_describe_workspace(struct sway_workspace *workspace, | |||
216 | json_object_object_add(object, "floating_nodes", floating_array); | 310 | json_object_object_add(object, "floating_nodes", floating_array); |
217 | } | 311 | } |
218 | 312 | ||
219 | static 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 | |||
233 | static void ipc_json_describe_view(struct sway_container *c, json_object *object) { | 313 | static 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)); | 314 | json_object_object_add(object, "pid", json_object_new_int(c->view->pid)); |
235 | 315 | ||
@@ -372,17 +452,10 @@ static void focus_inactive_children_iterator(struct sway_node *node, | |||
372 | json_object *ipc_json_describe_node(struct sway_node *node) { | 452 | json_object *ipc_json_describe_node(struct sway_node *node) { |
373 | struct sway_seat *seat = input_manager_get_default_seat(); | 453 | struct sway_seat *seat = input_manager_get_default_seat(); |
374 | bool focused = seat_get_focus(seat) == node; | 454 | bool focused = seat_get_focus(seat) == node; |
375 | |||
376 | json_object *object = json_object_new_object(); | ||
377 | char *name = node_get_name(node); | 455 | char *name = node_get_name(node); |
378 | 456 | ||
379 | struct wlr_box box; | 457 | struct wlr_box box; |
380 | node_get_box(node, &box); | 458 | 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 | 459 | ||
387 | json_object *focus = json_object_new_array(); | 460 | json_object *focus = json_object_new_array(); |
388 | struct focus_inactive_data data = { | 461 | struct focus_inactive_data data = { |
@@ -390,24 +463,9 @@ json_object *ipc_json_describe_node(struct sway_node *node) { | |||
390 | .object = focus, | 463 | .object = focus, |
391 | }; | 464 | }; |
392 | seat_for_each_node(seat, focus_inactive_children_iterator, &data); | 465 | seat_for_each_node(seat, focus_inactive_children_iterator, &data); |
393 | json_object_object_add(object, "focus", focus); | ||
394 | 466 | ||
395 | // set default values to be compatible with i3 | 467 | json_object *object = ipc_json_create_node( |
396 | json_object_object_add(object, "border", | 468 | (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 | 469 | ||
412 | switch (node->type) { | 470 | switch (node->type) { |
413 | case N_ROOT: | 471 | case N_ROOT: |
@@ -434,6 +492,8 @@ json_object *ipc_json_describe_node_recursive(struct sway_node *node) { | |||
434 | json_object *children = json_object_new_array(); | 492 | json_object *children = json_object_new_array(); |
435 | switch (node->type) { | 493 | switch (node->type) { |
436 | case N_ROOT: | 494 | case N_ROOT: |
495 | json_object_array_add(children, | ||
496 | ipc_json_describe_scratchpad_output()); | ||
437 | for (i = 0; i < root->outputs->length; ++i) { | 497 | for (i = 0; i < root->outputs->length; ++i) { |
438 | struct sway_output *output = root->outputs->items[i]; | 498 | struct sway_output *output = root->outputs->items[i]; |
439 | json_object_array_add(children, | 499 | json_object_array_add(children, |