X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fipc.c;h=021bdd7bf1b2f57e5c989a807866d43232c1d43c;hb=419b73be9e6e502760878f8372a7d51975c0cdce;hp=ea6a7de941dfa5aae2a6a4c35038636b0cb731d7;hpb=80da100ac84890890594f8df951cc20a522d7922;p=i3%2Fi3 diff --git a/src/ipc.c b/src/ipc.c index ea6a7de9..021bdd7b 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -4,7 +4,7 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * * ipc.c: UNIX domain socket IPC (initialization, client handling, protocol). * @@ -37,36 +37,6 @@ static void set_nonblock(int sockfd) { err(-1, "Could not set O_NONBLOCK"); } -/* - * Emulates mkdir -p (creates any missing folders) - * - */ -bool mkdirp(const char *path) { - if (mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0) - return true; - if (errno != ENOENT) { - ELOG("mkdir(%s) failed: %s\n", path, strerror(errno)); - return false; - } - char *copy = sstrdup(path); - /* strip trailing slashes, if any */ - while (copy[strlen(copy) - 1] == '/') - copy[strlen(copy) - 1] = '\0'; - - char *sep = strrchr(copy, '/'); - if (sep == NULL) { - FREE(copy); - return false; - } - *sep = '\0'; - bool result = false; - if (mkdirp(copy)) - result = mkdirp(path); - free(copy); - - return result; -} - /* * Sends the specified event to all IPC clients which are currently connected * and subscribed to this kind of event. @@ -114,7 +84,7 @@ void ipc_shutdown(void) { IPC_HANDLER(command) { /* To get a properly terminated buffer, we copy * message_size bytes out of the buffer */ - char *command = scalloc(message_size + 1); + char *command = scalloc(message_size + 1, 1); strncpy(command, (const char *)message, message_size); LOG("IPC: received: *%s*\n", command); yajl_gen gen = yajl_gen_alloc(NULL); @@ -450,6 +420,10 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) { y(array_open); Match *match; TAILQ_FOREACH(match, &(con->swallow_head), matches) { + /* We will generate a new restart_mode match specification after this + * loop, so skip this one. */ + if (match->restart_mode) + continue; y(map_open); if (match->dock != -1) { ystr("dock"); @@ -495,6 +469,28 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) { y(map_close); } +static void dump_bar_bindings(yajl_gen gen, Barconfig *config) { + if (TAILQ_EMPTY(&(config->bar_bindings))) + return; + + ystr("bindings"); + y(array_open); + + struct Barbinding *current; + TAILQ_FOREACH(current, &(config->bar_bindings), bindings) { + y(map_open); + + ystr("input_code"); + y(integer, current->input_code); + ystr("command"); + ystr(current->command); + + y(map_close); + } + + y(array_close); +} + static void dump_bar_config(yajl_gen gen, Barconfig *config) { y(map_open); @@ -518,6 +514,10 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) { } while (0) YSTR_IF_SET(tray_output); + + ystr("tray_padding"); + y(integer, config->tray_padding); + YSTR_IF_SET(socket_path); ystr("mode"); @@ -575,15 +575,7 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) { break; } - if (config->wheel_up_cmd) { - ystr("wheel_up_cmd"); - ystr(config->wheel_up_cmd); - } - - if (config->wheel_down_cmd) { - ystr("wheel_down_cmd"); - ystr(config->wheel_down_cmd); - } + dump_bar_bindings(gen, config); ystr("position"); if (config->position == P_BOTTOM) @@ -637,6 +629,9 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) { YSTR_IF_SET(urgent_workspace_border); YSTR_IF_SET(urgent_workspace_bg); YSTR_IF_SET(urgent_workspace_text); + YSTR_IF_SET(binding_mode_border); + YSTR_IF_SET(binding_mode_bg); + YSTR_IF_SET(binding_mode_text); y(map_close); y(map_close); @@ -817,7 +812,10 @@ IPC_HANDLER(get_version) { y(integer, PATCH_VERSION); ystr("human_readable"); - ystr(I3_VERSION); + ystr(i3_version); + + ystr("loaded_config_file_name"); + ystr(current_configpath); y(map_close); @@ -857,7 +855,7 @@ IPC_HANDLER(get_bar_config) { /* To get a properly terminated buffer, we copy * message_size bytes out of the buffer */ - char *bar_id = scalloc(message_size + 1); + char *bar_id = scalloc(message_size + 1, 1); strncpy(bar_id, (const char *)message, message_size); LOG("IPC: looking for config for bar ID \"%s\"\n", bar_id); Barconfig *current, *config = NULL; @@ -902,10 +900,10 @@ static int add_subscription(void *extra, const unsigned char *s, int event = client->num_events; client->num_events++; - client->events = realloc(client->events, client->num_events * sizeof(char *)); + client->events = srealloc(client->events, client->num_events * sizeof(char *)); /* We copy the string because it is not null-terminated and strndup() * is missing on some BSD systems */ - client->events[event] = scalloc(len + 1); + client->events[event] = scalloc(len + 1, 1); memcpy(client->events[event], s, len); DLOG("client is now subscribed to:\n"); @@ -1062,13 +1060,13 @@ void ipc_new_client(EV_P_ struct ev_io *w, int revents) { set_nonblock(client); - struct ev_io *package = scalloc(sizeof(struct ev_io)); + struct ev_io *package = scalloc(1, sizeof(struct ev_io)); ev_io_init(package, ipc_receive_message, client, EV_READ); ev_io_start(EV_A_ package); DLOG("IPC: new client connected on fd %d\n", w->fd); - ipc_client *new = scalloc(sizeof(ipc_client)); + ipc_client *new = scalloc(1, sizeof(ipc_client)); new->fd = client; TAILQ_INSERT_TAIL(&all_clients, new, clients); @@ -1089,7 +1087,7 @@ int ipc_create_socket(const char *filename) { char *copy = sstrdup(resolved); const char *dir = dirname(copy); if (!path_exists(dir)) - mkdirp(dir); + mkdirp(dir, DEFAULT_DIR_MODE); free(copy); /* Unlink the unix domain socket before */