X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fipc.h;h=a1caea827fb7a549cbcde1a3c5c973e14e1ab987;hb=f43f4127713c61cc2e71765c950b2857ff290369;hp=de4e22642274535c657fd9b63aeb4b6d5b987f30;hpb=ec0113f631e9603b26486af506ca6797d2e732b4;p=i3%2Fi3 diff --git a/include/ipc.h b/include/ipc.h index de4e2264..a1caea82 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -1,21 +1,67 @@ /* - * vim:ts=8:expandtab + * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * - * © 2009 Michael Stapelberg and contributors - * - * See file LICENSE for license information. + * ipc.c: UNIX domain socket IPC (initialization, client handling, protocol). * */ +#pragma once -#ifndef _IPC_H -#define _IPC_H +#include #include +#include +#include +#include + +#include "data.h" +#include "tree.h" +#include "configuration.h" #include "i3/ipc.h" +extern char *current_socketpath; + +typedef struct ipc_client { + int fd; + + /* The events which this client wants to receive */ + int num_events; + char **events; + + /* 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 *callback; + struct ev_timer *timeout; + uint8_t *buffer; + size_t buffer_size; + + TAILQ_ENTRY(ipc_client) + clients; +} ipc_client; + +/* + * Callback type for the different message types. + * + * message is the raw packet, as received from the UNIX domain socket. size + * is the remaining size of bytes for this packet. + * + * message_size is the size of the message as the sender specified it. + * 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); + +/* Macro to declare a callback */ +#define IPC_HANDLER(name) \ + static void handle_##name(int fd, uint8_t *message, \ + int size, uint32_t message_size, \ + uint32_t message_type) + /** * 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 @@ -32,4 +78,60 @@ void ipc_new_client(EV_P_ struct ev_io *w, int revents); */ int ipc_create_socket(const char *filename); -#endif +/** + * Sends the specified event to all IPC clients which are currently connected + * and subscribed to this kind of event. + * + */ +void ipc_send_event(const char *event, uint32_t message_type, const char *payload); + +/** + * 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(shutdown_reason_t reason); + +void dump_node(yajl_gen gen, Con *con, bool inplace_restart); + +/** + * Generates a json workspace event. Returns a dynamically allocated yajl + * generator. Free with yajl_gen_free(). + */ +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, + * also the window container, in "container". + */ +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);