From 37d15096f928d277a125a30156c6dee7a017f85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 13 Feb 2019 21:53:53 +0100 Subject: [PATCH] module/i3: break out get_socket_address() --- modules/CMakeLists.txt | 4 +- modules/i3-common.c | 88 ++++++++++++++++++++++++++++++++++++++++++ modules/i3-common.h | 9 +++++ modules/i3.c | 82 +-------------------------------------- 4 files changed, 102 insertions(+), 81 deletions(-) create mode 100644 modules/i3-common.c create mode 100644 modules/i3-common.h diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 723537d..e1f09cc 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -37,8 +37,10 @@ find_file(I3_IPC_H i3/ipc.h) if (NOT I3_IPC_H) message(FATAL_ERROR "cannot find header file: i3/ipc.h") endif () +add_library(i3-common STATIC EXCLUDE_FROM_ALL i3-common.c i3-common.h) + add_library(i3 ${lib_type} i3.c) -target_link_libraries(i3 module-sdk dynlist PkgConfig::json) +target_link_libraries(i3 module-sdk i3-common dynlist PkgConfig::json) if (ENABLE_X11) target_link_libraries(i3 xcb-stuff) endif () diff --git a/modules/i3-common.c b/modules/i3-common.c new file mode 100644 index 0000000..68919e4 --- /dev/null +++ b/modules/i3-common.c @@ -0,0 +1,88 @@ +#include "i3-common.h" + +#include +#include + +#if defined(ENABLE_X11) + #include + #include +#endif + +#define LOG_MODULE "i3:common" +#include "../log.h" + +#if defined(ENABLE_X11) + #include "../xcb.h" +#endif + +#if defined(ENABLE_X11) +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; +} +#endif + +bool +i3_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) { + sway_sock = getenv("I3SOCK"); + if (sway_sock == NULL) { +#if defined(ENABLE_X11) + return get_socket_address_x11(addr); +#else + return false; +#endif + } + } + + strncpy(addr->sun_path, sway_sock, sizeof(addr->sun_path) - 1); + return true; +} diff --git a/modules/i3-common.h b/modules/i3-common.h new file mode 100644 index 0000000..91ac777 --- /dev/null +++ b/modules/i3-common.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#include +#include +#include + +bool i3_get_socket_address(struct sockaddr_un *addr); diff --git a/modules/i3.c b/modules/i3.c index 65dc702..c7cebb2 100644 --- a/modules/i3.c +++ b/modules/i3.c @@ -13,11 +13,6 @@ #include #include -#if defined(ENABLE_X11) - #include - #include -#endif - #include #include @@ -33,9 +28,7 @@ #include "../particles/dynlist.h" #include "../plugin.h" -#if defined(ENABLE_X11) - #include "../xcb.h" -#endif +#include "i3-common.h" struct ws_content { char *name; @@ -479,77 +472,6 @@ handle_window_event(struct private *m, const struct json_object *json) return true; } -#if defined(ENABLE_X11) -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; -} -#endif - -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) { - sway_sock = getenv("I3SOCK"); - if (sway_sock == NULL) { -#if defined(ENABLE_X11) - return get_socket_address_x11(addr); -#else - return false; -#endif - } - } - - strncpy(addr->sun_path, sway_sock, sizeof(addr->sun_path) - 1); - return true; -} static int run(struct module *mod) @@ -557,7 +479,7 @@ run(struct module *mod) struct private *m = mod->private; struct sockaddr_un addr; - if (!get_socket_address(&addr)) + if (!i3_get_socket_address(&addr)) return 1; int sock = socket(AF_UNIX, SOCK_STREAM, 0);