diff options
author | minus <minus@mnus.de> | 2015-08-27 00:41:07 +0200 |
---|---|---|
committer | minus <minus@mnus.de> | 2015-08-27 00:41:07 +0200 |
commit | 873a51f7e263aaf5922c8ca69f3784c97330b691 (patch) | |
tree | 4b41ae3d2d0d28bef11cbab543986714cccca9d1 /sway/ipc.c | |
parent | fixed json-c CMake inclusion (diff) | |
download | sway-873a51f7e263aaf5922c8ca69f3784c97330b691.tar.gz sway-873a51f7e263aaf5922c8ca69f3784c97330b691.tar.zst sway-873a51f7e263aaf5922c8ca69f3784c97330b691.zip |
converted IPC to use json-c
get_workspaces and get_outputs
Diffstat (limited to 'sway/ipc.c')
-rw-r--r-- | sway/ipc.c | 113 |
1 files changed, 43 insertions, 70 deletions
@@ -41,11 +41,9 @@ int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data); | |||
41 | void ipc_client_disconnect(struct ipc_client *client); | 41 | void ipc_client_disconnect(struct ipc_client *client); |
42 | void ipc_client_handle_command(struct ipc_client *client); | 42 | void ipc_client_handle_command(struct ipc_client *client); |
43 | bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length); | 43 | bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length); |
44 | void ipc_get_workspaces_callback(swayc_t *container, void *data); | 44 | void ipc_get_workspaces_callback(swayc_t *workspace, void *data); |
45 | void ipc_get_outputs_callback(swayc_t *container, void *data); | 45 | void ipc_get_outputs_callback(swayc_t *container, void *data); |
46 | 46 | ||
47 | char *json_list(list_t *items); | ||
48 | |||
49 | void ipc_init(void) { | 47 | void ipc_init(void) { |
50 | ipc_socket = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0); | 48 | ipc_socket = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0); |
51 | if (ipc_socket == -1) { | 49 | if (ipc_socket == -1) { |
@@ -209,22 +207,20 @@ void ipc_client_handle_command(struct ipc_client *client) { | |||
209 | } | 207 | } |
210 | case IPC_GET_WORKSPACES: | 208 | case IPC_GET_WORKSPACES: |
211 | { | 209 | { |
212 | list_t *workspaces = create_list(); | 210 | json_object *workspaces = json_object_new_array(); |
213 | container_map(&root_container, ipc_get_workspaces_callback, workspaces); | 211 | container_map(&root_container, ipc_get_workspaces_callback, workspaces); |
214 | char *json = json_list(workspaces); | 212 | const char *json_string = json_object_to_json_string(workspaces); |
215 | free_flat_list(workspaces); | 213 | ipc_send_reply(client, json_string, (uint32_t) strlen(json_string)); |
216 | ipc_send_reply(client, json, strlen(json)); | 214 | json_object_put(workspaces); // free |
217 | free(json); | ||
218 | break; | 215 | break; |
219 | } | 216 | } |
220 | case IPC_GET_OUTPUTS: | 217 | case IPC_GET_OUTPUTS: |
221 | { | 218 | { |
222 | list_t *outputs = create_list(); | 219 | json_object *outputs = json_object_new_array(); |
223 | container_map(&root_container, ipc_get_outputs_callback, outputs); | 220 | container_map(&root_container, ipc_get_outputs_callback, outputs); |
224 | char *json = json_list(outputs); | 221 | const char *json_string = json_object_to_json_string(outputs); |
225 | free_flat_list(outputs); | 222 | ipc_send_reply(client, json_string, (uint32_t) strlen(json_string)); |
226 | ipc_send_reply(client, json, strlen(json)); | 223 | json_object_put(outputs); // free |
227 | free(json); | ||
228 | break; | 224 | break; |
229 | } | 225 | } |
230 | case IPC_GET_VERSION: | 226 | case IPC_GET_VERSION: |
@@ -272,67 +268,44 @@ bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t pay | |||
272 | return true; | 268 | return true; |
273 | } | 269 | } |
274 | 270 | ||
275 | char *json_list(list_t *items) { | 271 | void ipc_get_workspaces_callback(swayc_t *workspace, void *data) { |
276 | char *json_elements = join_list(items, ","); | 272 | if (workspace->type == C_WORKSPACE) { |
277 | size_t len = strlen(json_elements); | 273 | int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1; |
278 | char *json = malloc(len + 3); | 274 | json_object *object = json_object_new_object(); |
279 | json[0] = '['; | 275 | json_object *rect = json_object_new_object(); |
280 | memcpy(json + 1, json_elements, len); | 276 | json_object_object_add(rect, "x", json_object_new_int((int32_t) workspace->x)); |
281 | json[len+1] = ']'; | 277 | json_object_object_add(rect, "y", json_object_new_int((int32_t) workspace->y)); |
282 | json[len+2] = '\0'; | 278 | json_object_object_add(rect, "width", json_object_new_int((int32_t) workspace->width)); |
283 | free(json_elements); | 279 | json_object_object_add(rect, "height", json_object_new_int((int32_t) workspace->height)); |
284 | return json; | 280 | |
285 | } | 281 | json_object_object_add(object, "num", json_object_new_int(num)); |
286 | 282 | json_object_object_add(object, "name", json_object_new_string(workspace->name)); | |
287 | void ipc_get_workspaces_callback(swayc_t *container, void *data) { | 283 | json_object_object_add(object, "visible", json_object_new_boolean(workspace->visible)); |
288 | if (container->type == C_WORKSPACE) { | 284 | bool focused = root_container.focused == workspace->parent && workspace->parent->focused == workspace; |
289 | char *json = malloc(512); // Output should usually be around 180 chars | 285 | json_object_object_add(object, "focused", json_object_new_boolean(focused)); |
290 | int num = isdigit(container->name[0]) ? atoi(container->name) : -1; | 286 | json_object_object_add(object, "rect", rect); |
291 | // TODO: escape the name (quotation marks, unicode) | 287 | json_object_object_add(object, "output", json_object_new_string(workspace->parent->name)); |
292 | sprintf(json, | 288 | json_object_object_add(object, "urgent", json_object_new_boolean(false)); |
293 | "{" | 289 | |
294 | "\"num\":%d," | 290 | json_object_array_add((json_object *)data, object); |
295 | "\"name\":\"%s\"," | ||
296 | "\"visible\":%s," | ||
297 | "\"focused\":%s," | ||
298 | "\"rect\":{" | ||
299 | "\"x\":%d," | ||
300 | "\"y\":%d," | ||
301 | "\"width\":%d," | ||
302 | "\"height\":%d" | ||
303 | "}," | ||
304 | "\"output\":\"%s\"," | ||
305 | "\"urgent\":%s" | ||
306 | "}", | ||
307 | num, container->name, container->visible ? "true" : "false", container->is_focused ? "true" : "false", | ||
308 | (int)container->x, (int)container->y, (int)container->width, (int)container->height, | ||
309 | container->parent->name, "false" // TODO: urgent hint | ||
310 | ); | ||
311 | list_add((list_t *)data, json); | ||
312 | } | 291 | } |
313 | } | 292 | } |
314 | 293 | ||
315 | void ipc_get_outputs_callback(swayc_t *container, void *data) { | 294 | void ipc_get_outputs_callback(swayc_t *container, void *data) { |
316 | if (container->type == C_OUTPUT) { | 295 | if (container->type == C_OUTPUT) { |
317 | char *json = malloc(512); // Output should usually be around 130 chars | 296 | json_object *object = json_object_new_object(); |
318 | // TODO: escape the name (quotation marks, unicode) | 297 | json_object *rect = json_object_new_object(); |
319 | sprintf(json, | 298 | json_object_object_add(rect, "x", json_object_new_int((int32_t) container->x)); |
320 | "{" | 299 | json_object_object_add(rect, "y", json_object_new_int((int32_t) container->y)); |
321 | "\"name\":\"%s\"," | 300 | json_object_object_add(rect, "width", json_object_new_int((int32_t) container->width)); |
322 | "\"active\":%s," | 301 | json_object_object_add(rect, "height", json_object_new_int((int32_t) container->height)); |
323 | "\"primary\":%s," | 302 | |
324 | "\"rect\":{" | 303 | json_object_object_add(object, "name", json_object_new_string(container->name)); |
325 | "\"x\":%d," | 304 | json_object_object_add(object, "active", json_object_new_boolean(true)); |
326 | "\"y\":%d," | 305 | json_object_object_add(object, "primary", json_object_new_boolean(false)); |
327 | "\"width\":%d," | 306 | json_object_object_add(object, "rect", rect); |
328 | "\"height\":%d" | 307 | json_object_object_add(object, "current_workspace", container->focused ? json_object_new_string(container->focused->name) : NULL); |
329 | "}," | 308 | |
330 | "\"current_workspace\":\"%s\"" | 309 | json_object_array_add((json_object *)data, object); |
331 | "}", | ||
332 | container->name, "true", "false", // TODO: active, primary | ||
333 | (int)container->x, (int)container->y, (int)container->width, (int)container->height, | ||
334 | container->focused ? container->focused->name : "" | ||
335 | ); | ||
336 | list_add((list_t *)data, json); | ||
337 | } | 310 | } |
338 | } | 311 | } |