summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar minus <minus@mnus.de>2015-08-27 00:41:07 +0200
committerLibravatar minus <minus@mnus.de>2015-08-27 00:41:07 +0200
commit873a51f7e263aaf5922c8ca69f3784c97330b691 (patch)
tree4b41ae3d2d0d28bef11cbab543986714cccca9d1
parentfixed json-c CMake inclusion (diff)
downloadsway-873a51f7e263aaf5922c8ca69f3784c97330b691.tar.gz
sway-873a51f7e263aaf5922c8ca69f3784c97330b691.tar.zst
sway-873a51f7e263aaf5922c8ca69f3784c97330b691.zip
converted IPC to use json-c
get_workspaces and get_outputs
-rw-r--r--sway/ipc.c113
1 files changed, 43 insertions, 70 deletions
diff --git a/sway/ipc.c b/sway/ipc.c
index c5b72db7..d278c0a0 100644
--- a/sway/ipc.c
+++ b/sway/ipc.c
@@ -41,11 +41,9 @@ int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data);
41void ipc_client_disconnect(struct ipc_client *client); 41void ipc_client_disconnect(struct ipc_client *client);
42void ipc_client_handle_command(struct ipc_client *client); 42void ipc_client_handle_command(struct ipc_client *client);
43bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length); 43bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length);
44void ipc_get_workspaces_callback(swayc_t *container, void *data); 44void ipc_get_workspaces_callback(swayc_t *workspace, void *data);
45void ipc_get_outputs_callback(swayc_t *container, void *data); 45void ipc_get_outputs_callback(swayc_t *container, void *data);
46 46
47char *json_list(list_t *items);
48
49void ipc_init(void) { 47void 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
275char *json_list(list_t *items) { 271void 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));
287void 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
315void ipc_get_outputs_callback(swayc_t *container, void *data) { 294void 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}