aboutsummaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2018-09-08 09:20:36 -0400
committerLibravatar GitHub <noreply@github.com>2018-09-08 09:20:36 -0400
commit1376d3610455960cbeb098159d39963c55461d92 (patch)
tree80fcbbbd270a99df9c71de9044290c87b328a9d6 /sway
parentMerge pull request #2602 from RyanDwyer/fix-title-textures (diff)
parentcode style fixes (diff)
downloadsway-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
Diffstat (limited to 'sway')
-rw-r--r--sway/ipc-json.c157
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
33static 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
33json_object *ipc_json_get_version() { 45json_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
72static 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
60static void ipc_json_describe_root(struct sway_root *root, json_object *object) { 78static 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
65static const char *ipc_json_get_output_transform(enum wl_output_transform transform) { 82static 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
129json_object *ipc_json_describe_disabled_output(struct sway_output *output) { 160json_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
211static 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
175static void ipc_json_describe_view(struct sway_container *c, json_object *object) { 223static 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
269static 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);