From 5c39d09053c360bb58b91dbc71c3151c3b23d99e Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Wed, 1 Jan 2025 18:06:31 -0600 Subject: [PATCH 1/3] core: detect what desktop environment the user is using --- src/cli/version.zig | 2 ++ src/os/desktop.zig | 25 +++++++++++++++++++++++++ src/os/main.zig | 1 + 3 files changed, 28 insertions(+) diff --git a/src/cli/version.zig b/src/cli/version.zig index 29ab7f63fa..177558ac91 100644 --- a/src/cli/version.zig +++ b/src/cli/version.zig @@ -3,6 +3,7 @@ const build_options = @import("build_options"); const Allocator = std.mem.Allocator; const builtin = @import("builtin"); const build_config = @import("../build_config.zig"); +const internal_os = @import("../os/main.zig"); const xev = @import("xev"); const renderer = @import("../renderer.zig"); const gtk = if (build_config.app_runtime == .gtk) @import("../apprt/gtk/c.zig").c else void; @@ -36,6 +37,7 @@ pub fn run(alloc: Allocator) !u8 { try stdout.print(" - font engine: {}\n", .{build_config.font_backend}); try stdout.print(" - renderer : {}\n", .{renderer.Renderer}); try stdout.print(" - libxev : {}\n", .{xev.backend}); + try stdout.print(" - desktop env: {s}\n", .{@tagName(internal_os.desktopEnvironment())}); if (comptime build_config.app_runtime == .gtk) { try stdout.print(" - GTK version:\n", .{}); try stdout.print(" build : {d}.{d}.{d}\n", .{ diff --git a/src/os/desktop.zig b/src/os/desktop.zig index 103127dfa1..20738f1913 100644 --- a/src/os/desktop.zig +++ b/src/os/desktop.zig @@ -59,3 +59,28 @@ pub fn launchedFromDesktop() bool { else => @compileError("unsupported platform"), }; } + +pub const DesktopEnvironment = enum { + gnome, + macos, + other, + windows, +}; + +/// Detect what desktop environment we are running under. This is mainly used on +/// Linux to enable or disable GTK client-side decorations but there may be more +/// uses in the future. +pub fn desktopEnvironment() DesktopEnvironment { + return switch (comptime builtin.os.tag) { + .macos => .macos, + .windows => .windows, + .linux => de: { + // use $XDG_SESSION_DESKTOP to determine what DE we are using on Linux + // https://www.freedesktop.org/software/systemd/man/latest/pam_systemd.html#desktop= + const de = posix.getenv("XDG_SESSION_DESKTOP") orelse break :de .other; + if (std.ascii.eqlIgnoreCase("gnome", de)) break :de .gnome; + break :de .other; + }, + else => .other, + }; +} diff --git a/src/os/main.zig b/src/os/main.zig index b529a470d1..e652a7981b 100644 --- a/src/os/main.zig +++ b/src/os/main.zig @@ -32,6 +32,7 @@ pub const getenv = env.getenv; pub const setenv = env.setenv; pub const unsetenv = env.unsetenv; pub const launchedFromDesktop = desktop.launchedFromDesktop; +pub const desktopEnvironment = desktop.desktopEnvironment; pub const rlimit = file.rlimit; pub const fixMaxFiles = file.fixMaxFiles; pub const restoreMaxFiles = file.restoreMaxFiles; From c89df01e13cbb712179bfb6cdc79f76a8a07dd29 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Wed, 1 Jan 2025 18:49:26 -0600 Subject: [PATCH 2/3] core: prohibit checking for the desktop environment on linux during comptime --- src/os/desktop.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/src/os/desktop.zig b/src/os/desktop.zig index 20738f1913..3a61e2eaa4 100644 --- a/src/os/desktop.zig +++ b/src/os/desktop.zig @@ -75,6 +75,7 @@ pub fn desktopEnvironment() DesktopEnvironment { .macos => .macos, .windows => .windows, .linux => de: { + if (@inComptime()) @compileError("Checking for the desktop environment on Linux must be done at runtime."); // use $XDG_SESSION_DESKTOP to determine what DE we are using on Linux // https://www.freedesktop.org/software/systemd/man/latest/pam_systemd.html#desktop= const de = posix.getenv("XDG_SESSION_DESKTOP") orelse break :de .other; From 3c93f00d04a379da77bda22eda916d8ef3711c8c Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Thu, 2 Jan 2025 11:52:20 -0600 Subject: [PATCH 3/3] cli: only print out DE when using the GTK apprt --- src/cli/version.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/version.zig b/src/cli/version.zig index 177558ac91..99f03384b4 100644 --- a/src/cli/version.zig +++ b/src/cli/version.zig @@ -37,8 +37,8 @@ pub fn run(alloc: Allocator) !u8 { try stdout.print(" - font engine: {}\n", .{build_config.font_backend}); try stdout.print(" - renderer : {}\n", .{renderer.Renderer}); try stdout.print(" - libxev : {}\n", .{xev.backend}); - try stdout.print(" - desktop env: {s}\n", .{@tagName(internal_os.desktopEnvironment())}); if (comptime build_config.app_runtime == .gtk) { + try stdout.print(" - desktop env: {s}\n", .{@tagName(internal_os.desktopEnvironment())}); try stdout.print(" - GTK version:\n", .{}); try stdout.print(" build : {d}.{d}.{d}\n", .{ gtk.GTK_MAJOR_VERSION,