From 8e769b491a7eb09a38525dd67cf9b9536a23b975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 3 Feb 2019 12:20:59 +0100 Subject: [PATCH] module/i3: try SWAYSOCK before falling back to I3_SOCKET_PATH --- modules/i3.c | 111 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 46 deletions(-) diff --git a/modules/i3.c b/modules/i3.c index fbd32c7..133ecae 100644 --- a/modules/i3.c +++ b/modules/i3.c @@ -371,57 +371,76 @@ handle_workspace_event(struct private *m, const struct json_object *json) return true; } +static bool +get_socket_address_x11(struct sockaddr_un *addr) +{ + int default_screen; + xcb_connection_t *conn = xcb_connect(NULL, &default_screen); + if (xcb_connection_has_error(conn) > 0) { + LOG_ERR("failed to connect to X"); + xcb_disconnect(conn); + return false; + } + + xcb_screen_t *screen = xcb_aux_get_screen(conn, default_screen); + + xcb_atom_t atom = get_atom(conn, "I3_SOCKET_PATH"); + assert(atom != XCB_ATOM_NONE); + + xcb_get_property_cookie_t cookie + = xcb_get_property_unchecked( + conn, false, screen->root, atom, + XCB_GET_PROPERTY_TYPE_ANY, 0, sizeof(addr->sun_path)); + + xcb_generic_error_t *err; + xcb_get_property_reply_t *reply = + xcb_get_property_reply(conn, cookie, &err); + + if (err != NULL) { + LOG_ERR("failed to get i3 socket path: %s", xcb_error(err)); + free(err); + free(reply); + return false; + } + + const int len = xcb_get_property_value_length(reply); + assert(len < sizeof(addr->sun_path)); + + if (len == 0) { + LOG_ERR("failed to get i3 socket path: empty reply"); + free(reply); + return false; + } + + memcpy(addr->sun_path, xcb_get_property_value(reply), len); + addr->sun_path[len] = '\0'; + + free(reply); + xcb_disconnect(conn); + return true; +} + +static bool +get_socket_address(struct sockaddr_un *addr) +{ + *addr = (struct sockaddr_un){.sun_family = AF_UNIX}; + + const char *sway_sock = getenv("SWAYSOCK"); + if (sway_sock == NULL) + return get_socket_address_x11(addr); + + strncpy(addr->sun_path, sway_sock, sizeof(addr->sun_path)); + return true; +} + static int run(struct module *mod) { struct private *m = mod->private; - struct sockaddr_un addr = {.sun_family = AF_UNIX}; - { - int default_screen; - xcb_connection_t *conn = xcb_connect(NULL, &default_screen); - if (xcb_connection_has_error(conn) > 0) { - LOG_ERR("failed to connect to X"); - xcb_disconnect(conn); - return 1; - } - - xcb_screen_t *screen = xcb_aux_get_screen(conn, default_screen); - - xcb_atom_t atom = get_atom(conn, "I3_SOCKET_PATH"); - assert(atom != XCB_ATOM_NONE); - - xcb_get_property_cookie_t cookie - = xcb_get_property_unchecked( - conn, false, screen->root, atom, - XCB_GET_PROPERTY_TYPE_ANY, 0, sizeof(addr.sun_path)); - - xcb_generic_error_t *err; - xcb_get_property_reply_t *reply = - xcb_get_property_reply(conn, cookie, &err); - - if (err != NULL) { - LOG_ERR("failed to get i3 socket path: %s", xcb_error(err)); - free(err); - free(reply); - return 1; - } - - const int len = xcb_get_property_value_length(reply); - assert(len < sizeof(addr.sun_path)); - - if (len == 0) { - LOG_ERR("failed to get i3 socket path: empty reply"); - free(reply); - return 1; - } - - memcpy(addr.sun_path, xcb_get_property_value(reply), len); - addr.sun_path[len] = '\0'; - - free(reply); - xcb_disconnect(conn); - } + struct sockaddr_un addr; + if (!get_socket_address(&addr)) + return 1; int sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock == -1) {