X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fipc.c;h=77b8dbb391101eb50c32a80e8b69d669f7aff7a7;hb=78f5f2204d3b25ce0bac948eb7c0ed8d35808262;hp=dee68e5f64a6b83ad1c8e240ec9a0a37de4a10af;hpb=36464c7a546cb8541d55157bf7dd89aea8645a94;p=i3%2Fi3 diff --git a/src/ipc.c b/src/ipc.c index dee68e5f..77b8dbb3 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -97,7 +97,7 @@ void ipc_send_event(const char *event, uint32_t message_type, const char *payloa * when exiting or restarting only! * */ -void ipc_shutdown() { +void ipc_shutdown(void) { ipc_client *current; while (!TAILQ_EMPTY(&all_clients)) { current = TAILQ_FIRST(&all_clients); @@ -119,16 +119,24 @@ IPC_HANDLER(command) { char *command = scalloc(message_size + 1); strncpy(command, (const char*)message, message_size); LOG("IPC: received: *%s*\n", command); - char *reply = parse_command((const char*)command); - char *save_reply = reply; + struct CommandResult *command_output = parse_command((const char*)command); free(command); - /* If no reply was provided, we just use the default success message */ - if (reply == NULL) - reply = "{\"success\":true}"; - ipc_send_message(fd, strlen(reply), I3_IPC_REPLY_TYPE_COMMAND, (const uint8_t*)reply); + if (command_output->needs_tree_render) + tree_render(); - FREE(save_reply); + const unsigned char *reply; +#if YAJL_MAJOR >= 2 + size_t length; +#else + unsigned int length; +#endif + yajl_gen_get_buf(command_output->json_gen, &reply, &length); + + ipc_send_message(fd, length, I3_IPC_REPLY_TYPE_COMMAND, + (const uint8_t*)reply); + + yajl_gen_free(command_output->json_gen); } static void dump_rect(yajl_gen gen, const char *name, Rect r) { @@ -153,17 +161,14 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) { ystr("type"); y(integer, con->type); + /* provided for backwards compatibility only. */ ystr("orientation"); - switch (con->orientation) { - case NO_ORIENTATION: - ystr("none"); - break; - case HORIZ: + if (!con->split) + ystr("none"); + else { + if (con_orientation(con) == HORIZ) ystr("horizontal"); - break; - case VERT: - ystr("vertical"); - break; + else ystr("vertical"); } ystr("scratchpad_state"); @@ -195,10 +200,20 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) { ystr("focused"); y(bool, (con == focused)); + ystr("split"); + y(bool, con->split); + ystr("layout"); switch (con->layout) { case L_DEFAULT: - ystr("default"); + DLOG("About to dump layout=default, this is a bug in the code.\n"); + assert(false); + break; + case L_SPLITV: + ystr("splitv"); + break; + case L_SPLITH: + ystr("splith"); break; case L_STACKED: ystr("stacked"); @@ -214,6 +229,16 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) { break; } + ystr("last_split_layout"); + switch (con->layout) { + case L_SPLITV: + ystr("splitv"); + break; + default: + ystr("splith"); + break; + } + ystr("border"); switch (con->border_style) { case BS_NORMAL: @@ -441,6 +466,9 @@ IPC_HANDLER(get_outputs) { ystr("active"); y(bool, output->active); + ystr("primary"); + y(bool, output->primary); + ystr("rect"); y(map_open); ystr("x"); @@ -508,6 +536,44 @@ IPC_HANDLER(get_marks) { y(free); } +/* + * Returns the version of i3 + * + */ +IPC_HANDLER(get_version) { +#if YAJL_MAJOR >= 2 + yajl_gen gen = yajl_gen_alloc(NULL); +#else + yajl_gen gen = yajl_gen_alloc(NULL, NULL); +#endif + y(map_open); + + ystr("major"); + y(integer, MAJOR_VERSION); + + ystr("minor"); + y(integer, MINOR_VERSION); + + ystr("patch"); + y(integer, PATCH_VERSION); + + ystr("human_readable"); + ystr(I3_VERSION); + + y(map_close); + + const unsigned char *payload; +#if YAJL_MAJOR >= 2 + size_t length; +#else + unsigned int length; +#endif + y(get_buf, &payload, &length); + + ipc_send_message(fd, length, I3_IPC_REPLY_TYPE_VERSION, payload); + y(free); +} + /* * Formats the reply message for a GET_BAR_CONFIG request and sends it to the * client. @@ -764,7 +830,7 @@ IPC_HANDLER(subscribe) { /* The index of each callback function corresponds to the numeric * value of the message type (see include/i3/ipc.h) */ -handler_t handlers[7] = { +handler_t handlers[8] = { handle_command, handle_get_workspaces, handle_subscribe, @@ -772,6 +838,7 @@ handler_t handlers[7] = { handle_tree, handle_get_marks, handle_get_bar_config, + handle_get_version, }; /*