From 5e26d3ef470bc1129e7fb442334e34dcbb045d12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 2 Aug 2020 13:10:31 +0200 Subject: [PATCH] server/client: use $WAYLAND_DISPLAY instead of $XDG_SESSION_ID in default socket path Foot is a Wayland client and cannot be run outside of a Wayland session. As such, it makes more sense to use $WAYLAND_SESSION instead of $XDG_SESSION_ID in the default socket path since this makes it clearer which Wayland session we belong to. Closes #55. --- CHANGELOG.md | 2 ++ client.c | 13 ++++++++----- completions/zsh/_footclient | 2 +- config.c | 13 ++++++++----- doc/foot.1.scd | 8 ++++---- doc/footclient.1.scd | 3 ++- main.c | 2 +- 7 files changed, 26 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d756d63..098ed367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,8 @@ * Configuration errors are no longer fatal; foot will start and print an error inside the terminal (and of course still log errors on stderr). +* Default `--server` socket path to use `$WAYLAND_DISPLAY` instead of + `$XDG_SESSION_ID` (https://codeberg.org/dnkl/foot/issues/55). ### Fixed diff --git a/client.c b/client.c index aac2e95a..69a91833 100644 --- a/client.c +++ b/client.c @@ -38,7 +38,7 @@ print_usage(const char *prog_name) " --maximized start in maximized mode\n" " --fullscreen start in fullscreen mode\n" " --login-shell start shell as a login shell\n" - " -s,--server-socket=PATH path to the server UNIX domain socket (default=$XDG_RUNTIME_DIR/foot-$XDG_SESSION_ID.sock)\n" + " -s,--server-socket=PATH path to the server UNIX domain socket (default=$XDG_RUNTIME_DIR/foot-$WAYLAND_DISPLAY.sock)\n" " --hold remain open after child process exits\n" " -l,--log-colorize=[never|always|auto] enable/disable colorization of log output on stderr\n" " -v,--version show the version number and quit\n"); @@ -172,13 +172,16 @@ main(int argc, char *const *argv) } else { bool connected = false; - const char *xdg_session_id = getenv("XDG_SESSION_ID"); const char *xdg_runtime = getenv("XDG_RUNTIME_DIR"); if (xdg_runtime != NULL) { - if (xdg_session_id == NULL) - xdg_session_id = "no-session"; + const char *wayland_display = getenv("WAYLAND_DISPLAY"); + if (wayland_display != NULL) + snprintf(addr.sun_path, sizeof(addr.sun_path), + "%s/foot-%s.sock", xdg_runtime, wayland_display); + else + snprintf(addr.sun_path, sizeof(addr.sun_path), + "%s/foot.sock", xdg_runtime); - snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/foot-%s.sock", xdg_runtime, xdg_session_id); if (connect(fd, (const struct sockaddr *)&addr, sizeof(addr)) == 0) connected = true; else diff --git a/completions/zsh/_footclient b/completions/zsh/_footclient index 6eb66066..a1307e97 100644 --- a/completions/zsh/_footclient +++ b/completions/zsh/_footclient @@ -8,7 +8,7 @@ _arguments \ '--maximized[start in maximized mode]' \ '--fullscreen[start in fullscreen mode]' \ '--login-shell[start shell as a login shell]' \ - '(-s --server-socket)'{-s,--server-socket}'[override the default path to the foot server socket (XDG_RUNTIME_DIR/foot.sock)]:server:_files' \ + '(-s --server-socket)'{-s,--server-socket}'[override the default path to the foot server socket ($XDG_RUNTIME_DIR/foot-$WAYLAND_DISPLAY.sock)]:server:_files' \ '--hold[remain open after child process exits]' \ '(-l --log-colorize)'{-l,--log-colorize}'[enable or disable colorization of log output on stderr]:logcolor:(never always auto)' \ '(-v --version)'{-v,--version}'[show the version number and quit]' \ diff --git a/config.c b/config.c index 50bf8a19..2976c6a4 100644 --- a/config.c +++ b/config.c @@ -1188,16 +1188,19 @@ err: static char * get_server_socket_path(void) { - const char *xdg_session_id = getenv("XDG_SESSION_ID"); const char *xdg_runtime = getenv("XDG_RUNTIME_DIR"); if (xdg_runtime == NULL) return strdup("/tmp/foot.sock"); - if (xdg_session_id == NULL) - xdg_session_id = "no-session"; + const char *wayland_display = getenv("WAYLAND_DISPLAY"); + if (wayland_display == NULL) { + char *path = malloc(strlen(xdg_runtime) + 1 + strlen("foot.sock") + 1); + sprintf(path, "%s/foot.sock", xdg_runtime); + return path; + } - char *path = malloc(strlen(xdg_runtime) + 1 + strlen("foot-.sock") + strlen(xdg_session_id) + 1); - sprintf(path, "%s/foot-%s.sock", xdg_runtime, xdg_session_id); + char *path = malloc(strlen(xdg_runtime) + 1 + strlen("foot-.sock") + strlen(wayland_display) + 1); + sprintf(path, "%s/foot-%s.sock", xdg_runtime, wayland_display); return path; } diff --git a/doc/foot.1.scd b/doc/foot.1.scd index bf45777e..55c82e18 100644 --- a/doc/foot.1.scd +++ b/doc/foot.1.scd @@ -81,13 +81,13 @@ arguments, to execute (instead of the default shell). others with it. The default path is - *$XDG\_RUNTIME\_DIR/foot-$XDG\_SESSION\_ID.sock*. + *$XDG\_RUNTIME\_DIR/foot-$WAYLAND\_DISPLAY.sock*. - If *$XDG_RUNTIME_DIR* is not set, the default path is instead + If *$XDG\_RUNTIME\_DIR* is not set, the default path is instead */tmp/foot.sock*. - If *$XDG_RUNTIME_DIR* is set, but *$XDG_SESSION_ID* is not, the - default path is *$XDG_RUNTIME_DIR/foot-no-session.sock*. + If *$XDG\_RUNTIME\_DIR* is set, but *$WAYLAND\_DISPLAY* is not, + the default path is *$XDG\_RUNTIME\_DIR/foot.sock*. Note that if you change the default, you will also need to use the *--server-socket* option in *footclient*(1) and point it to your diff --git a/doc/footclient.1.scd b/doc/footclient.1.scd index 4f65bf9d..88b6676c 100644 --- a/doc/footclient.1.scd +++ b/doc/footclient.1.scd @@ -34,7 +34,8 @@ arguments, to execute (instead of the default shell). Start a login shell, by prepending a '-' to argv[0]. *-s*,*--server-socket*=_PATH_ - Connect to _PATH_ instead of _XDG\_RUNTIME\_DIR/foot.sock_. + Connect to _PATH_ instead of + *$XDG\_RUNTIME\_DIR/foot-$WAYLAND\_DISPLAY.sock*. *--hold* Remain open after child process exits. diff --git a/main.c b/main.c index c677b22d..9c3bfe6f 100644 --- a/main.c +++ b/main.c @@ -56,7 +56,7 @@ print_usage(const char *prog_name) " --login-shell start shell as a login shell\n" " -g,--geometry=WIDTHxHEIGHT set initial width and height\n" " -s,--server[=PATH] run as a server (use 'footclient' to start terminals).\n" - " Without PATH, $XDG_RUNTIME_DIR/foot-$XDG_SESSION_ID.sock will be used.\n" + " Without PATH, $XDG_RUNTIME_DIR/foot-$WAYLAND_DISPLAY.sock will be used.\n" " --hold remain open after child process exits\n" " -p,--print-pid=FILE|FD print PID to file or FD (only applicable in server mode)\n" " -l,--log-colorize=[never|always|auto] enable/disable colorization of log output on stderr\n"