From 8e736aa4ebe5cd12edcabde61043943e4af4a187 Mon Sep 17 00:00:00 2001 From: notcancername Date: Sun, 17 Nov 2024 15:25:36 +0100 Subject: [PATCH 1/2] Append the default value of XDG_DATA_DIRS when setting up shell integration --- src/termio/shell_integration.zig | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/termio/shell_integration.zig b/src/termio/shell_integration.zig index 7a8726b15..031cc9839 100644 --- a/src/termio/shell_integration.zig +++ b/src/termio/shell_integration.zig @@ -447,27 +447,30 @@ fn setupXdgDataDirs( // so that our modifications don't interfere with other commands. try env.put("GHOSTTY_SHELL_INTEGRATION_XDG_DIR", integ_dir); - if (env.get("XDG_DATA_DIRS")) |old| { - // We have an old value, We need to prepend our value to it. - + { // We attempt to avoid allocating by using the stack up to 4K. // Max stack size is considerably larger on macOS and Linux but // 4K is a reasonable size for this for most cases. However, env // vars can be significantly larger so if we have to we fall // back to a heap allocated value. - var stack_alloc = std.heap.stackFallback(4096, alloc_arena); - const alloc = stack_alloc.get(); + var stack_alloc_state = std.heap.stackFallback(4096, alloc_arena); + const stack_alloc = stack_alloc_state.get(); + + const old_value = if (env.get("XDG_DATA_DIRS")) |old| + old + else + // No XDG_DATA_DIRS set, we prepend to the default value. + // + "/usr/local/share:/usr/share"; + const prepended = try std.fmt.allocPrint( - alloc, + stack_alloc, "{s}{c}{s}", - .{ integ_dir, std.fs.path.delimiter, old }, + .{ integ_dir, std.fs.path.delimiter, old_value }, ); - defer alloc.free(prepended); + defer stack_alloc.free(prepended); try env.put("XDG_DATA_DIRS", prepended); - } else { - // No XDG_DATA_DIRS set, we just set it our desired value. - try env.put("XDG_DATA_DIRS", integ_dir); } } From 3e971f2837c5a97c0550d7d9ef894a0ab391f7ba Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 17 Nov 2024 09:48:25 -0800 Subject: [PATCH 2/2] termio: tweaks to xdg data dir handling (no logic changes) --- src/termio/shell_integration.zig | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/termio/shell_integration.zig b/src/termio/shell_integration.zig index 031cc9839..cd4d88dce 100644 --- a/src/termio/shell_integration.zig +++ b/src/termio/shell_integration.zig @@ -448,6 +448,8 @@ fn setupXdgDataDirs( try env.put("GHOSTTY_SHELL_INTEGRATION_XDG_DIR", integ_dir); { + const xdg_data_dir_key = "XDG_DATA_DIRS"; + // We attempt to avoid allocating by using the stack up to 4K. // Max stack size is considerably larger on macOS and Linux but // 4K is a reasonable size for this for most cases. However, env @@ -456,21 +458,20 @@ fn setupXdgDataDirs( var stack_alloc_state = std.heap.stackFallback(4096, alloc_arena); const stack_alloc = stack_alloc_state.get(); - const old_value = if (env.get("XDG_DATA_DIRS")) |old| - old - else - // No XDG_DATA_DIRS set, we prepend to the default value. - // - "/usr/local/share:/usr/share"; + // If no XDG_DATA_DIRS set use the default value as specified. + // This ensures that the default directories aren't lost by setting + // our desired integration dir directly. See #2711. + // + const old = env.get(xdg_data_dir_key) orelse "/usr/local/share:/usr/share"; - const prepended = try std.fmt.allocPrint( - stack_alloc, - "{s}{c}{s}", - .{ integ_dir, std.fs.path.delimiter, old_value }, - ); + const prepended = try std.fmt.allocPrint(stack_alloc, "{s}{c}{s}", .{ + integ_dir, + std.fs.path.delimiter, + old, + }); defer stack_alloc.free(prepended); - try env.put("XDG_DATA_DIRS", prepended); + try env.put(xdg_data_dir_key, prepended); } }