diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-09-08 09:20:36 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-08 09:20:36 -0400 |
commit | 1376d3610455960cbeb098159d39963c55461d92 (patch) | |
tree | 80fcbbbd270a99df9c71de9044290c87b328a9d6 | |
parent | Merge pull request #2602 from RyanDwyer/fix-title-textures (diff) | |
parent | code style fixes (diff) | |
download | sway-1376d3610455960cbeb098159d39963c55461d92.tar.gz sway-1376d3610455960cbeb098159d39963c55461d92.tar.zst sway-1376d3610455960cbeb098159d39963c55461d92.zip |
Merge pull request #2530 from apreiml/ipc_missing_get_tree
start adding missing ipc properties
-rw-r--r-- | sway/ipc-json.c | 157 |
1 files changed, 138 insertions, 19 deletions
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index abc4a086..8b786145 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c | |||
@@ -30,6 +30,18 @@ static const char *ipc_json_layout_description(enum sway_container_layout l) { | |||
30 | return "none"; | 30 | return "none"; |
31 | } | 31 | } |
32 | 32 | ||
33 | static const char *ipc_json_orientation_description(enum sway_container_layout l) { | ||
34 | if (l == L_VERT) { | ||
35 | return "vertical"; | ||
36 | } | ||
37 | |||
38 | if (l == L_HORIZ) { | ||
39 | return "horizontal"; | ||
40 | } | ||
41 | |||
42 | return "none"; | ||
43 | } | ||
44 | |||
33 | json_object *ipc_json_get_version() { | 45 | json_object *ipc_json_get_version() { |
34 | int major = 0, minor = 0, patch = 0; | 46 | int major = 0, minor = 0, patch = 0; |
35 | json_object *version = json_object_new_object(); | 47 | json_object *version = json_object_new_object(); |
@@ -57,9 +69,14 @@ static json_object *ipc_json_create_rect(struct wlr_box *box) { | |||
57 | return rect; | 69 | return rect; |
58 | } | 70 | } |
59 | 71 | ||
72 | static json_object *ipc_json_create_empty_rect(void) { | ||
73 | struct wlr_box empty = {0, 0, 0, 0}; | ||
74 | |||
75 | return ipc_json_create_rect(&empty); | ||
76 | } | ||
77 | |||
60 | static void ipc_json_describe_root(struct sway_root *root, json_object *object) { | 78 | static void ipc_json_describe_root(struct sway_root *root, json_object *object) { |
61 | json_object_object_add(object, "type", json_object_new_string("root")); | 79 | json_object_object_add(object, "type", json_object_new_string("root")); |
62 | json_object_object_add(object, "layout", json_object_new_string("splith")); | ||
63 | } | 80 | } |
64 | 81 | ||
65 | static const char *ipc_json_get_output_transform(enum wl_output_transform transform) { | 82 | static const char *ipc_json_get_output_transform(enum wl_output_transform transform) { |
@@ -91,6 +108,8 @@ static void ipc_json_describe_output(struct sway_output *output, | |||
91 | json_object_object_add(object, "active", json_object_new_boolean(true)); | 108 | json_object_object_add(object, "active", json_object_new_boolean(true)); |
92 | json_object_object_add(object, "primary", json_object_new_boolean(false)); | 109 | json_object_object_add(object, "primary", json_object_new_boolean(false)); |
93 | json_object_object_add(object, "layout", json_object_new_string("output")); | 110 | json_object_object_add(object, "layout", json_object_new_string("output")); |
111 | json_object_object_add(object, "orientation", | ||
112 | json_object_new_string(ipc_json_orientation_description(L_NONE))); | ||
94 | json_object_object_add(object, "make", | 113 | json_object_object_add(object, "make", |
95 | json_object_new_string(wlr_output->make)); | 114 | json_object_new_string(wlr_output->make)); |
96 | json_object_object_add(object, "model", | 115 | json_object_object_add(object, "model", |
@@ -123,7 +142,19 @@ static void ipc_json_describe_output(struct sway_output *output, | |||
123 | } | 142 | } |
124 | 143 | ||
125 | json_object_object_add(object, "modes", modes_array); | 144 | json_object_object_add(object, "modes", modes_array); |
126 | json_object_object_add(object, "layout", json_object_new_string("output")); | 145 | |
146 | struct sway_node *parent = node_get_parent(&output->node); | ||
147 | struct wlr_box parent_box = {0, 0, 0, 0}; | ||
148 | |||
149 | if (parent != NULL) { | ||
150 | node_get_box(parent, &parent_box); | ||
151 | } | ||
152 | |||
153 | if (parent_box.width != 0 && parent_box.height != 0) { | ||
154 | double percent = ((double)output->width / parent_box.width) | ||
155 | * ((double)output->height / parent_box.height); | ||
156 | json_object_object_add(object, "percent", json_object_new_double(percent)); | ||
157 | } | ||
127 | } | 158 | } |
128 | 159 | ||
129 | json_object *ipc_json_describe_disabled_output(struct sway_output *output) { | 160 | json_object *ipc_json_describe_disabled_output(struct sway_output *output) { |
@@ -143,6 +174,8 @@ json_object *ipc_json_describe_disabled_output(struct sway_output *output) { | |||
143 | json_object_new_string(wlr_output->serial)); | 174 | json_object_new_string(wlr_output->serial)); |
144 | json_object_object_add(object, "modes", json_object_new_array()); | 175 | json_object_object_add(object, "modes", json_object_new_array()); |
145 | 176 | ||
177 | json_object_object_add(object, "percent", NULL); | ||
178 | |||
146 | return object; | 179 | return object; |
147 | } | 180 | } |
148 | 181 | ||
@@ -162,6 +195,9 @@ static void ipc_json_describe_workspace(struct sway_workspace *workspace, | |||
162 | const char *layout = ipc_json_layout_description(workspace->layout); | 195 | const char *layout = ipc_json_layout_description(workspace->layout); |
163 | json_object_object_add(object, "layout", json_object_new_string(layout)); | 196 | json_object_object_add(object, "layout", json_object_new_string(layout)); |
164 | 197 | ||
198 | const char *orientation = ipc_json_orientation_description(workspace->layout); | ||
199 | json_object_object_add(object, "orientation", json_object_new_string(orientation)); | ||
200 | |||
165 | // Floating | 201 | // Floating |
166 | json_object *floating_array = json_object_new_array(); | 202 | json_object *floating_array = json_object_new_array(); |
167 | for (int i = 0; i < workspace->floating->length; ++i) { | 203 | for (int i = 0; i < workspace->floating->length; ++i) { |
@@ -172,35 +208,101 @@ static void ipc_json_describe_workspace(struct sway_workspace *workspace, | |||
172 | json_object_object_add(object, "floating_nodes", floating_array); | 208 | json_object_object_add(object, "floating_nodes", floating_array); |
173 | } | 209 | } |
174 | 210 | ||
211 | static const char *describe_container_border(enum sway_container_border border) { | ||
212 | switch (border) { | ||
213 | case B_NONE: | ||
214 | return "none"; | ||
215 | case B_PIXEL: | ||
216 | return "pixel"; | ||
217 | case B_NORMAL: | ||
218 | return "normal"; | ||
219 | } | ||
220 | return "unknown"; | ||
221 | } | ||
222 | |||
175 | static void ipc_json_describe_view(struct sway_container *c, json_object *object) { | 223 | static void ipc_json_describe_view(struct sway_container *c, json_object *object) { |
176 | json_object_object_add(object, "name", | 224 | const char *app_id = view_get_app_id(c->view); |
177 | c->title ? json_object_new_string(c->title) : NULL); | 225 | json_object_object_add(object, "app_id", |
178 | json_object_object_add(object, "type", json_object_new_string("con")); | 226 | app_id ? json_object_new_string(app_id) : NULL); |
227 | |||
228 | const char *class = view_get_class(c->view); | ||
229 | json_object_object_add(object, "class", | ||
230 | class ? json_object_new_string(class) : NULL); | ||
231 | |||
232 | json_object *marks = json_object_new_array(); | ||
233 | list_t *view_marks = c->view->marks; | ||
234 | for (int i = 0; i < view_marks->length; ++i) { | ||
235 | json_object_array_add(marks, json_object_new_string(view_marks->items[i])); | ||
236 | } | ||
179 | 237 | ||
180 | if (c->view) { | 238 | json_object_object_add(object, "marks", marks); |
181 | const char *app_id = view_get_app_id(c->view); | 239 | |
182 | json_object_object_add(object, "app_id", | 240 | struct wlr_box window_box = { |
183 | app_id ? json_object_new_string(app_id) : NULL); | 241 | c->view->x - c->x, |
242 | (c->current.border == B_PIXEL) ? c->current.border_thickness : 0, | ||
243 | c->view->width, | ||
244 | c->view->height | ||
245 | }; | ||
184 | 246 | ||
185 | const char *class = view_get_class(c->view); | 247 | json_object_object_add(object, "window_rect", ipc_json_create_rect(&window_box)); |
186 | json_object_object_add(object, "class", | 248 | |
187 | class ? json_object_new_string(class) : NULL); | 249 | struct wlr_box deco_box = {0, 0, 0, 0}; |
250 | |||
251 | if (c->current.border == B_NORMAL) { | ||
252 | deco_box.width = c->width; | ||
253 | deco_box.height = c->view->y - c->y; | ||
188 | } | 254 | } |
189 | 255 | ||
256 | json_object_object_add(object, "deco_rect", ipc_json_create_rect(&deco_box)); | ||
257 | |||
258 | struct wlr_box geometry = {0, 0, c->view->natural_width, c->view->natural_height}; | ||
259 | json_object_object_add(object, "geometry", ipc_json_create_rect(&geometry)); | ||
260 | |||
261 | #ifdef HAVE_XWAYLAND | ||
262 | if (c->view->type == SWAY_VIEW_XWAYLAND) { | ||
263 | json_object_object_add(object, "window", | ||
264 | json_object_new_int(view_get_x11_window_id(c->view))); | ||
265 | } | ||
266 | #endif | ||
267 | } | ||
268 | |||
269 | static void ipc_json_describe_container(struct sway_container *c, json_object *object) { | ||
270 | json_object_object_add(object, "name", | ||
271 | c->title ? json_object_new_string(c->title) : NULL); | ||
272 | json_object_object_add(object, "type", json_object_new_string("con")); | ||
273 | |||
190 | json_object_object_add(object, "layout", | 274 | json_object_object_add(object, "layout", |
191 | json_object_new_string(ipc_json_layout_description(c->layout))); | 275 | json_object_new_string(ipc_json_layout_description(c->layout))); |
192 | 276 | ||
277 | json_object_object_add(object, "orientation", | ||
278 | json_object_new_string(ipc_json_orientation_description(c->layout))); | ||
279 | |||
193 | bool urgent = c->view ? | 280 | bool urgent = c->view ? |
194 | view_is_urgent(c->view) : container_has_urgent_child(c); | 281 | view_is_urgent(c->view) : container_has_urgent_child(c); |
195 | json_object_object_add(object, "urgent", json_object_new_boolean(urgent)); | 282 | json_object_object_add(object, "urgent", json_object_new_boolean(urgent)); |
283 | json_object_object_add(object, "sticky", json_object_new_boolean(c->is_sticky)); | ||
284 | |||
285 | struct sway_node *parent = node_get_parent(&c->node); | ||
286 | struct wlr_box parent_box = {0, 0, 0, 0}; | ||
287 | |||
288 | if (parent != NULL) { | ||
289 | node_get_box(parent, &parent_box); | ||
290 | } | ||
291 | |||
292 | if (parent_box.width != 0 && parent_box.height != 0) { | ||
293 | double percent = ((double)c->width / parent_box.width) | ||
294 | * ((double)c->height / parent_box.height); | ||
295 | json_object_object_add(object, "percent", json_object_new_double(percent)); | ||
296 | } | ||
297 | |||
298 | json_object_object_add(object, "border", | ||
299 | json_object_new_string(describe_container_border(c->current.border))); | ||
300 | json_object_object_add(object, "current_border_width", | ||
301 | json_object_new_int(c->current.border_thickness)); | ||
302 | json_object_object_add(object, "floating_nodes", json_object_new_array()); | ||
196 | 303 | ||
197 | if (c->view) { | 304 | if (c->view) { |
198 | json_object *marks = json_object_new_array(); | 305 | ipc_json_describe_view(c, object); |
199 | list_t *view_marks = c->view->marks; | ||
200 | for (int i = 0; i < view_marks->length; ++i) { | ||
201 | json_object_array_add(marks, json_object_new_string(view_marks->items[i])); | ||
202 | } | ||
203 | json_object_object_add(object, "marks", marks); | ||
204 | } | 306 | } |
205 | } | 307 | } |
206 | 308 | ||
@@ -240,6 +342,23 @@ json_object *ipc_json_describe_node(struct sway_node *node) { | |||
240 | seat_for_each_node(seat, focus_inactive_children_iterator, &data); | 342 | seat_for_each_node(seat, focus_inactive_children_iterator, &data); |
241 | json_object_object_add(object, "focus", focus); | 343 | json_object_object_add(object, "focus", focus); |
242 | 344 | ||
345 | // set default values to be compatible with i3 | ||
346 | json_object_object_add(object, "border", | ||
347 | json_object_new_string(describe_container_border(B_NONE))); | ||
348 | json_object_object_add(object, "current_border_width", json_object_new_int(0)); | ||
349 | json_object_object_add(object, "layout", | ||
350 | json_object_new_string(ipc_json_layout_description(L_HORIZ))); | ||
351 | json_object_object_add(object, "orientation", | ||
352 | json_object_new_string(ipc_json_orientation_description(L_HORIZ))); | ||
353 | json_object_object_add(object, "percent", NULL); | ||
354 | json_object_object_add(object, "window_rect", ipc_json_create_empty_rect()); | ||
355 | json_object_object_add(object, "deco_rect", ipc_json_create_empty_rect()); | ||
356 | json_object_object_add(object, "geometry", ipc_json_create_empty_rect()); | ||
357 | json_object_object_add(object, "window", NULL); | ||
358 | json_object_object_add(object, "urgent", json_object_new_boolean(false)); | ||
359 | json_object_object_add(object, "floating_nodes", json_object_new_array()); | ||
360 | json_object_object_add(object, "sticky", json_object_new_boolean(false)); | ||
361 | |||
243 | switch (node->type) { | 362 | switch (node->type) { |
244 | case N_ROOT: | 363 | case N_ROOT: |
245 | ipc_json_describe_root(root, object); | 364 | ipc_json_describe_root(root, object); |
@@ -248,7 +367,7 @@ json_object *ipc_json_describe_node(struct sway_node *node) { | |||
248 | ipc_json_describe_output(node->sway_output, object); | 367 | ipc_json_describe_output(node->sway_output, object); |
249 | break; | 368 | break; |
250 | case N_CONTAINER: | 369 | case N_CONTAINER: |
251 | ipc_json_describe_view(node->sway_container, object); | 370 | ipc_json_describe_container(node->sway_container, object); |
252 | break; | 371 | break; |
253 | case N_WORKSPACE: | 372 | case N_WORKSPACE: |
254 | ipc_json_describe_workspace(node->sway_workspace, object); | 373 | ipc_json_describe_workspace(node->sway_workspace, object); |