summaryrefslogtreecommitdiff
path: root/sway/ipc-json.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/ipc-json.c')
-rw-r--r--sway/ipc-json.c185
1 files changed, 100 insertions, 85 deletions
diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index 06cb7e11..abc4a086 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -46,18 +46,18 @@ json_object *ipc_json_get_version() {
return version;
}
-static json_object *ipc_json_create_rect(struct sway_container *c) {
+static json_object *ipc_json_create_rect(struct wlr_box *box) {
json_object *rect = json_object_new_object();
- json_object_object_add(rect, "x", json_object_new_int((int32_t)c->x));
- json_object_object_add(rect, "y", json_object_new_int((int32_t)c->y));
- json_object_object_add(rect, "width", json_object_new_int((int32_t)c->width));
- json_object_object_add(rect, "height", json_object_new_int((int32_t)c->height));
+ json_object_object_add(rect, "x", json_object_new_int(box->x));
+ json_object_object_add(rect, "y", json_object_new_int(box->y));
+ json_object_object_add(rect, "width", json_object_new_int(box->width));
+ json_object_object_add(rect, "height", json_object_new_int(box->height));
return rect;
}
-static void ipc_json_describe_root(struct sway_container *root, json_object *object) {
+static void ipc_json_describe_root(struct sway_root *root, 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"));
}
@@ -84,17 +84,13 @@ static const char *ipc_json_get_output_transform(enum wl_output_transform transf
return NULL;
}
-static void ipc_json_describe_output(struct sway_container *container,
+static void ipc_json_describe_output(struct sway_output *output,
json_object *object) {
- struct wlr_output *wlr_output = container->sway_output->wlr_output;
- json_object_object_add(object, "type",
- json_object_new_string("output"));
- json_object_object_add(object, "active",
- json_object_new_boolean(true));
- json_object_object_add(object, "primary",
- json_object_new_boolean(false));
- json_object_object_add(object, "layout",
- json_object_new_string("output"));
+ struct wlr_output *wlr_output = output->wlr_output;
+ json_object_object_add(object, "type", json_object_new_string("output"));
+ json_object_object_add(object, "active", json_object_new_boolean(true));
+ json_object_object_add(object, "primary", json_object_new_boolean(false));
+ json_object_object_add(object, "layout", json_object_new_string("output"));
json_object_object_add(object, "make",
json_object_new_string(wlr_output->make));
json_object_object_add(object, "model",
@@ -109,20 +105,9 @@ static void ipc_json_describe_output(struct sway_container *container,
json_object_new_string(
ipc_json_get_output_transform(wlr_output->transform)));
- struct sway_seat *seat = input_manager_get_default_seat(input_manager);
- const char *ws = NULL;
- if (seat) {
- struct sway_container *focus =
- seat_get_focus_inactive(seat, container);
- if (focus && focus->type != C_WORKSPACE) {
- focus = container_parent(focus, C_WORKSPACE);
- }
- if (focus) {
- ws = focus->name;
- }
- }
+ struct sway_workspace *ws = output_get_active_workspace(output);
json_object_object_add(object, "current_workspace",
- json_object_new_string(ws));
+ json_object_new_string(ws->name));
json_object *modes_array = json_object_new_array();
struct wlr_output_mode *mode;
@@ -161,60 +146,57 @@ json_object *ipc_json_describe_disabled_output(struct sway_output *output) {
return object;
}
-static void ipc_json_describe_workspace(struct sway_container *workspace,
+static void ipc_json_describe_workspace(struct sway_workspace *workspace,
json_object *object) {
int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1;
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, "output", workspace->output ?
+ json_object_new_string(workspace->output->wlr_output->name) : NULL);
json_object_object_add(object, "type", json_object_new_string("workspace"));
json_object_object_add(object, "urgent",
- json_object_new_boolean(workspace->sway_workspace->urgent));
- json_object_object_add(object, "representation", workspace->formatted_title ?
- json_object_new_string(workspace->formatted_title) : NULL);
+ json_object_new_boolean(workspace->urgent));
+ json_object_object_add(object, "representation", workspace->representation ?
+ json_object_new_string(workspace->representation) : NULL);
const char *layout = ipc_json_layout_description(workspace->layout);
json_object_object_add(object, "layout", json_object_new_string(layout));
// Floating
json_object *floating_array = json_object_new_array();
- list_t *floating = workspace->sway_workspace->floating;
- for (int i = 0; i < floating->length; ++i) {
- struct sway_container *floater = floating->items[i];
+ for (int i = 0; i < workspace->floating->length; ++i) {
+ struct sway_container *floater = workspace->floating->items[i];
json_object_array_add(floating_array,
- ipc_json_describe_container_recursive(floater));
+ ipc_json_describe_node_recursive(&floater->node));
}
json_object_object_add(object, "floating_nodes", floating_array);
}
static void ipc_json_describe_view(struct sway_container *c, json_object *object) {
json_object_object_add(object, "name",
- c->name ? json_object_new_string(c->name) : NULL);
+ c->title ? json_object_new_string(c->title) : NULL);
json_object_object_add(object, "type", json_object_new_string("con"));
- if (c->type == C_VIEW) {
- const char *app_id = view_get_app_id(c->sway_view);
+ if (c->view) {
+ const char *app_id = view_get_app_id(c->view);
json_object_object_add(object, "app_id",
app_id ? json_object_new_string(app_id) : NULL);
- const char *class = view_get_class(c->sway_view);
+ const char *class = view_get_class(c->view);
json_object_object_add(object, "class",
class ? json_object_new_string(class) : NULL);
}
- if (c->parent) {
- json_object_object_add(object, "layout",
- json_object_new_string(ipc_json_layout_description(c->layout)));
- }
+ json_object_object_add(object, "layout",
+ json_object_new_string(ipc_json_layout_description(c->layout)));
- bool urgent = c->type == C_VIEW ?
- view_is_urgent(c->sway_view) : container_has_urgent_child(c);
+ bool urgent = c->view ?
+ view_is_urgent(c->view) : container_has_urgent_child(c);
json_object_object_add(object, "urgent", json_object_new_boolean(urgent));
- if (c->type == C_VIEW) {
+ if (c->view) {
json_object *marks = json_object_new_array();
- list_t *view_marks = c->sway_view->marks;
+ list_t *view_marks = c->view->marks;
for (int i = 0; i < view_marks->length; ++i) {
json_object_array_add(marks, json_object_new_string(view_marks->items[i]));
}
@@ -222,64 +204,97 @@ static void ipc_json_describe_view(struct sway_container *c, json_object *object
}
}
-static void focus_inactive_children_iterator(struct sway_container *c, void *data) {
- json_object *focus = data;
- json_object_array_add(focus, json_object_new_int(c->id));
-}
+struct focus_inactive_data {
+ struct sway_node *node;
+ json_object *object;
+};
-json_object *ipc_json_describe_container(struct sway_container *c) {
- if (!(sway_assert(c, "Container must not be null."))) {
- return NULL;
+static void focus_inactive_children_iterator(struct sway_node *node,
+ void *_data) {
+ struct focus_inactive_data *data = _data;
+ if (node_get_parent(node) == data->node) {
+ json_object_array_add(data->object, json_object_new_int(node->id));
}
+}
+json_object *ipc_json_describe_node(struct sway_node *node) {
struct sway_seat *seat = input_manager_get_default_seat(input_manager);
- bool focused = seat_get_focus(seat) == c;
+ bool focused = seat_get_focus(seat) == node;
json_object *object = json_object_new_object();
+ char *name = node_get_name(node);
- json_object_object_add(object, "id", json_object_new_int((int)c->id));
+ struct wlr_box box;
+ node_get_box(node, &box);
+ json_object_object_add(object, "id", json_object_new_int((int)node->id));
json_object_object_add(object, "name",
- c->name ? json_object_new_string(c->name) : NULL);
- json_object_object_add(object, "rect", ipc_json_create_rect(c));
- json_object_object_add(object, "focused",
- json_object_new_boolean(focused));
+ name ? json_object_new_string(name) : NULL);
+ json_object_object_add(object, "rect", ipc_json_create_rect(&box));
+ json_object_object_add(object, "focused", json_object_new_boolean(focused));
json_object *focus = json_object_new_array();
- seat_focus_inactive_children_for_each(seat, c,
- focus_inactive_children_iterator, focus);
+ struct focus_inactive_data data = {
+ .node = node,
+ .object = focus,
+ };
+ seat_for_each_node(seat, focus_inactive_children_iterator, &data);
json_object_object_add(object, "focus", focus);
- switch (c->type) {
- case C_ROOT:
- ipc_json_describe_root(c, object);
+ switch (node->type) {
+ case N_ROOT:
+ ipc_json_describe_root(root, object);
break;
- case C_OUTPUT:
- ipc_json_describe_output(c, object);
+ case N_OUTPUT:
+ ipc_json_describe_output(node->sway_output, object);
break;
- case C_CONTAINER:
- case C_VIEW:
- ipc_json_describe_view(c, object);
+ case N_CONTAINER:
+ ipc_json_describe_view(node->sway_container, object);
break;
- case C_WORKSPACE:
- ipc_json_describe_workspace(c, object);
- break;
- case C_TYPES:
- default:
+ case N_WORKSPACE:
+ ipc_json_describe_workspace(node->sway_workspace, object);
break;
}
return object;
}
-json_object *ipc_json_describe_container_recursive(struct sway_container *c) {
- json_object *object = ipc_json_describe_container(c);
+json_object *ipc_json_describe_node_recursive(struct sway_node *node) {
+ json_object *object = ipc_json_describe_node(node);
int i;
json_object *children = json_object_new_array();
- if (c->type != C_VIEW && c->children) {
- for (i = 0; i < c->children->length; ++i) {
- json_object_array_add(children, ipc_json_describe_container_recursive(c->children->items[i]));
+ switch (node->type) {
+ case N_ROOT:
+ for (i = 0; i < root->outputs->length; ++i) {
+ struct sway_output *output = root->outputs->items[i];
+ json_object_array_add(children,
+ ipc_json_describe_node_recursive(&output->node));
+ }
+ break;
+ case N_OUTPUT:
+ for (i = 0; i < node->sway_output->workspaces->length; ++i) {
+ struct sway_workspace *ws = node->sway_output->workspaces->items[i];
+ json_object_array_add(children,
+ ipc_json_describe_node_recursive(&ws->node));
}
+ break;
+ case N_WORKSPACE:
+ for (i = 0; i < node->sway_workspace->tiling->length; ++i) {
+ struct sway_container *con = node->sway_workspace->tiling->items[i];
+ json_object_array_add(children,
+ ipc_json_describe_node_recursive(&con->node));
+ }
+ break;
+ case N_CONTAINER:
+ if (node->sway_container->children) {
+ for (i = 0; i < node->sway_container->children->length; ++i) {
+ struct sway_container *child =
+ node->sway_container->children->items[i];
+ json_object_array_add(children,
+ ipc_json_describe_node_recursive(&child->node));
+ }
+ }
+ break;
}
json_object_object_add(object, "nodes", children);
@@ -329,7 +344,7 @@ json_object *ipc_json_describe_seat(struct sway_seat *seat) {
}
json_object *object = json_object_new_object();
- struct sway_container *focus = seat_get_focus(seat);
+ struct sway_node *focus = seat_get_focus(seat);
json_object_object_add(object, "name",
json_object_new_string(seat->wlr_seat->name));