os/xdg: Avoid allocations on non-Windows systems.

os/desktop: Add TODO
This commit is contained in:
Krzysztof Wolicki
2023-10-19 17:22:11 +02:00
parent b830deb8a9
commit f4a2273ad9
2 changed files with 26 additions and 12 deletions

View File

@ -40,6 +40,7 @@ pub fn launchedFromDesktop() bool {
break :linux gio_pid == pid;
},
//TODO: maybe find a way to check that
.windows => false,
else => @compileError("unsupported platform"),

View File

@ -20,22 +20,35 @@ pub const Options = struct {
/// Get the XDG user config directory. The returned value is allocated.
pub fn config(alloc: Allocator, opts: Options) ![]u8 {
if (std.process.getEnvVarOwned(alloc, "XDG_CONFIG_HOME")) |env| {
defer alloc.free(env);
// If we have a subdir, then we use the env as-is to avoid a copy.
if (opts.subdir) |subdir| {
return try std.fs.path.join(alloc, &[_][]const u8{
env,
subdir,
});
}
if (builtin.os.tag == .windows) {
if (std.process.getEnvVarOwned(alloc, "XDG_CONFIG_HOME")) |env| {
// If we have a subdir, then we use the env as-is to avoid a copy.
if (opts.subdir) |subdir| {
defer alloc.free(env);
return try std.fs.path.join(alloc, &[_][]const u8{
env,
subdir,
});
}
return try alloc.dupe(u8, env);
} else |err| {
switch (err) {
// We don't need to dupe since it's already allocated
return env;
} else |err| switch (err) {
error.EnvironmentVariableNotFound => {},
else => return err,
}
} else {
if (std.os.getenv("XDG_CONFIG_HOME")) |env| {
// If we have a subdir, then we use the env as-is to avoid a copy.
if (opts.subdir) |subdir| {
return try std.fs.path.join(alloc, &[_][]const u8{
env,
subdir,
});
}
return try alloc.dupe(u8, env);
}
}
// If we have a cached home dir, use that.