json_object *ipc_json_describe_container(swayc_t *c) { if (!(sway_assert(c, "Container must not be null."))) { return NULL; } json_object *object = json_object_new_object(); json_object_object_add(object, "id", json_object_new_int((int)c->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, "visible", json_object_new_boolean(c->visible)); json_object_object_add(object, "focused", json_object_new_boolean(c == current_focus)); switch (c->type) { case C_ROOT: json_object_object_add(object, "type", json_object_new_string("root")); break; case C_OUTPUT: ipc_json_describe_output(c, object); break; case C_CONTAINER: // fallthrough case C_VIEW: ipc_json_describe_view(c, object); break; case C_WORKSPACE: ipc_json_describe_workspace(c, object); break; case C_TYPES: // fallthrough; this should never happen, I'm just trying to silence compiler warnings default: break; } return object; }
void ipc_get_workspaces_callback(swayc_t *workspace, void *data) { if (workspace->type == C_WORKSPACE) { json_object_array_add((json_object *)data, ipc_json_describe_workspace(workspace)); } }
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, "rect", rect); json_object_object_add(object, "current_workspace", output->focused ? json_object_new_string(output->focused->name) : NULL); return object; } void ipc_get_outputs_callback(swayc_t *container, void *data) { if (container->type == C_OUTPUT) { json_object_array_add((json_object *)data, ipc_json_describe_output(container)); } } void ipc_event_workspace(swayc_t *old, swayc_t *new) { json_object *obj = json_object_new_object(); json_object_object_add(obj, "change", json_object_new_string("focus")); json_object_object_add(obj, "old", ipc_json_describe_workspace(old)); json_object_object_add(obj, "current", ipc_json_describe_workspace(new)); const char *json_string = json_object_to_json_string(obj); for (int i = 0; i < ipc_client_list->length; i++) { struct ipc_client *client = ipc_client_list->items[i]; if ((client->subscribed_events & IPC_GET_WORKSPACES) == 0) break; ipc_send_reply(client, json_string, (uint32_t) strlen(json_string)); } json_object_put(obj); // free }