From 661625b29edb820a7e6d29f4eafcdd3d9610ef22 Mon Sep 17 00:00:00 2001
From: lbonn <bonnans.l@gmail.com>
Date: Sat, 7 Oct 2017 22:02:08 +0200
Subject: [PATCH] ipc/tree: output mandatory fields for all nodes

Still missing: focus
---
 sway/ipc-json.c | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index 31de53f0..775fcc24 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -138,7 +138,6 @@ static void ipc_json_describe_workspace(swayc_t *workspace, json_object *object)
 
 	json_object_object_add(object, "num", json_object_new_int(num));
 	json_object_object_add(object, "output", (workspace->parent) ? json_object_new_string(workspace->parent->name) : NULL);
-	json_object_object_add(object, "urgent", json_object_new_boolean(false));
 	json_object_object_add(object, "type", json_object_new_string("workspace"));
 	json_object_object_add(object, "layout", (strcmp(layout, "null") == 0) ? NULL : json_object_new_string(layout));
 }
@@ -156,7 +155,6 @@ static const char *ipc_json_get_scratchpad_state(swayc_t *c) {
 
 static void ipc_json_describe_view(swayc_t *c, json_object *object) {
 	json_object *props = json_object_new_object();
-	float percent = ipc_json_child_percentage(c);
 	const char *layout = (c->parent->type == C_CONTAINER) ?
 		ipc_json_layout_description(c->parent->layout) : "none";
 	const char *last_layout = (c->parent->type == C_CONTAINER) ?
@@ -167,9 +165,6 @@ static void ipc_json_describe_view(swayc_t *c, json_object *object) {
 
 	json_object_object_add(object, "scratchpad_state",
 		json_object_new_string(ipc_json_get_scratchpad_state(c)));
-	json_object_object_add(object, "percent", (percent > 0) ? json_object_new_double(percent) : NULL);
-	// TODO: make urgency actually work once Sway supports it
-	json_object_object_add(object, "urgent", json_object_new_boolean(false));
 	json_object_object_add(object, "layout",
 		(strcmp(layout, "null") == 0) ? NULL : json_object_new_string(layout));
 	json_object_object_add(object, "last_split_layout",
@@ -177,17 +172,8 @@ static void ipc_json_describe_view(swayc_t *c, json_object *object) {
 	json_object_object_add(object, "workspace_layout",
 		json_object_new_string(ipc_json_layout_description(swayc_parent_by_type(c, C_WORKSPACE)->workspace_layout)));
 
-	json_object_object_add(object, "border", json_object_new_string(ipc_json_border_description(c)));
-	json_object_object_add(object, "current_border_width", json_object_new_int(c->border_thickness));
-
-	json_object_object_add(object, "rect", ipc_json_create_rect(c));
-	json_object_object_add(object, "deco_rect", ipc_json_create_rect_from_geometry(c->title_bar_geometry));
-	json_object_object_add(object, "geometry", ipc_json_create_rect_from_geometry(c->cached_geometry));
-	json_object_object_add(object, "window_rect", ipc_json_create_rect_from_geometry(c->actual_geometry));
-
 	json_object_object_add(object, "name", (c->name) ? json_object_new_string(c->name) : NULL);
 
-	json_object_object_add(object, "window", json_object_new_int(c->handle)); // for the sake of i3 compat
 	json_object_object_add(props, "class", c->class ? json_object_new_string(c->class) :
 		c->app_id ? json_object_new_string(c->app_id) : NULL);
 	json_object_object_add(props, "instance", c->instance ? json_object_new_string(c->instance) :
@@ -205,7 +191,14 @@ static void ipc_json_describe_view(swayc_t *c, json_object *object) {
 	json_object_object_add(object, "app_id", c->app_id ? json_object_new_string(c->app_id) : NULL);
 }
 
+static void ipc_json_describe_root(swayc_t *c, json_object *object) {
+	json_object_object_add(object, "type", json_object_new_string("root"));
+	json_object_object_add(object, "layout", json_object_new_string("splith"));
+}
+
 json_object *ipc_json_describe_container(swayc_t *c) {
+	float percent = ipc_json_child_percentage(c);
+
 	if (!(sway_assert(c, "Container must not be null."))) {
 		return NULL;
 	}
@@ -218,9 +211,19 @@ json_object *ipc_json_describe_container(swayc_t *c) {
 	json_object_object_add(object, "visible", json_object_new_boolean(c->visible));
 	json_object_object_add(object, "focused", json_object_new_boolean(c == current_focus));
 
+	json_object_object_add(object, "border", json_object_new_string(ipc_json_border_description(c)));
+	json_object_object_add(object, "window_rect", ipc_json_create_rect_from_geometry(c->actual_geometry));
+	json_object_object_add(object, "deco_rect", ipc_json_create_rect_from_geometry(c->title_bar_geometry));
+	json_object_object_add(object, "geometry", ipc_json_create_rect_from_geometry(c->cached_geometry));
+	json_object_object_add(object, "percent", (percent > 0) ? json_object_new_double(percent) : NULL);
+	json_object_object_add(object, "window", json_object_new_int(c->handle)); // for the sake of i3 compat
+	// TODO: make urgency actually work once Sway supports it
+	json_object_object_add(object, "urgent", json_object_new_boolean(false));
+	json_object_object_add(object, "current_border_width", json_object_new_int(c->border_thickness));
+
 	switch (c->type) {
 	case C_ROOT:
-		json_object_object_add(object, "type", json_object_new_string("root"));
+		ipc_json_describe_root(c, object);
 		break;
 
 	case C_OUTPUT: