X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=blobdiff_plain;f=include%2Fipc.h;h=a77439737aea46066961114f32464ce54e5eb7f5;hp=e9358ee58b78d2e8e6d21c6bb8f268d950900fa1;hb=HEAD;hpb=2d28273cac9643f6a6e71b3f434ac1318238d686 diff --git a/include/ipc.h b/include/ipc.h index e9358ee5..a7743973 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -2,13 +2,15 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2011 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). * */ #pragma once +#include + #include #include #include @@ -16,7 +18,7 @@ #include "data.h" #include "tree.h" -#include "config.h" +#include "configuration.h" #include "i3/ipc.h" @@ -29,7 +31,18 @@ typedef struct ipc_client { int num_events; char **events; - TAILQ_ENTRY(ipc_client) clients; + /* For clients which subscribe to the tick event: whether the first tick + * event has been sent by i3. */ + bool first_tick_sent; + + struct ev_io *read_callback; + struct ev_io *write_callback; + struct ev_timer *timeout; + uint8_t *buffer; + size_t buffer_size; + + TAILQ_ENTRY(ipc_client) + clients; } ipc_client; /* @@ -42,20 +55,14 @@ typedef struct ipc_client { * message_type is the type of the message as the sender specified it. * */ -typedef void (*handler_t)(int, uint8_t *, int, uint32_t, uint32_t); +typedef void (*handler_t)(ipc_client *, uint8_t *, int, uint32_t, uint32_t); /* Macro to declare a callback */ -#define IPC_HANDLER(name) \ - static void handle_##name(int fd, uint8_t *message, \ - int size, uint32_t message_size, \ +#define IPC_HANDLER(name) \ + static void handle_##name(ipc_client *client, uint8_t *message, \ + int size, uint32_t message_size, \ uint32_t message_type) -/** - * Emulates mkdir -p (creates any missing folders) - * - */ -bool mkdirp(const char *path); - /** * Handler for activity on the listening socket, meaning that a new client * has just connected and we should accept() him. Sets up the event handler @@ -80,20 +87,33 @@ int ipc_create_socket(const char *filename); void ipc_send_event(const char *event, uint32_t message_type, const char *payload); /** - * Calls shutdown() on each socket and closes it. This function to be called - * when exiting or restarting only! + * Calls to ipc_shutdown() should provide a reason for the shutdown. + */ +typedef enum { + SHUTDOWN_REASON_RESTART, + SHUTDOWN_REASON_EXIT +} shutdown_reason_t; + +/** + * Calls shutdown() on each socket and closes it. * */ -void ipc_shutdown(void); +void ipc_shutdown(shutdown_reason_t reason); void dump_node(yajl_gen gen, Con *con, bool inplace_restart); /** - * For the workspace "focus" event we send, along the usual "change" field, - * also the current and previous workspace, in "current" and "old" - * respectively. + * Generates a json workspace event. Returns a dynamically allocated yajl + * generator. Free with yajl_gen_free(). */ -void ipc_send_workspace_focus_event(Con *current, Con *old); +yajl_gen ipc_marshal_workspace_event(const char *change, Con *current, Con *old); + +/** + * For the workspace events we send, along with the usual "change" field, also + * the workspace container in "current". For focus events, we send the + * previously focused workspace in "old". + */ +void ipc_send_workspace_event(const char *change, Con *current, Con *old); /** * For the window events we send, along the usual "change" field, @@ -105,3 +125,14 @@ void ipc_send_window_event(const char *property, Con *con); * For the barconfig update events, we send the serialized barconfig. */ void ipc_send_barconfig_update_event(Barconfig *barconfig); + +/** + * For the binding events, we send the serialized binding struct. + */ +void ipc_send_binding_event(const char *event_type, Binding *bind); + +/** + * Set the maximum duration that we allow for a connection with an unwriteable + * socket. + */ +void ipc_set_kill_timeout(ev_tstamp new);