aboutsummaryrefslogtreecommitdiffstats
path: root/sway/ipc-json.c
diff options
context:
space:
mode:
authorLibravatar Mihai Coman <mihai.cmn@gmail.com>2018-11-21 15:31:30 +0200
committerLibravatar Mihai Coman <mihai.cmn@gmail.com>2018-11-26 11:15:25 +0200
commit65c32e41d455b944ee25fa319e1336f1090bc00d (patch)
tree738de91c7204288e6d4dfdfe1d5448967497096b /sway/ipc-json.c
parentIPC: Trigger move events for scratchpad containers (diff)
downloadsway-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.
Diffstat (limited to 'sway/ipc-json.c')
-rw-r--r--sway/ipc-json.c136
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
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:
@@ -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
49static 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
46json_object *ipc_json_get_version(void) { 63json_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
96static 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
79static void ipc_json_describe_root(struct sway_root *root, json_object *object) { 127static 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
238static 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
190static void ipc_json_describe_workspace(struct sway_workspace *workspace, 284static 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
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) { 313static 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,
372json_object *ipc_json_describe_node(struct sway_node *node) { 452json_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,