diff --git a/Cargo.lock b/Cargo.lock index 95336bde..4fe02c2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4949,6 +4949,7 @@ dependencies = [ "freya-testing", "futures-util", "image", + "libloading 0.8.9", "mimalloc", "notify", "oneclient_auth", diff --git a/packages/oneclient_app/Cargo.toml b/packages/oneclient_app/Cargo.toml index fbf6e0ea..3d0ce73c 100644 --- a/packages/oneclient_app/Cargo.toml +++ b/packages/oneclient_app/Cargo.toml @@ -69,6 +69,9 @@ freya-testing.workspace = true [target.'cfg(target_os = "macos")'.dependencies] mimalloc = "=0.1.52" +[target.'cfg(target_os = "linux")'.dependencies] +libloading = "=0.8.9" + [target.'cfg(windows)'.dependencies] windows = { version = "=0.62.2", features = [ "Win32_Foundation", @@ -153,6 +156,7 @@ desktop-template = "distribution/linux/org.polyfrost.oneclient.template" [package.metadata.packager.appimage] # desktop entry generated from the deb template above via the linux config +libs = ["libayatana-appindicator3.so.1"] [package.metadata.generate-rpm] auto-req = "builtin" diff --git a/packages/oneclient_app/src/main.rs b/packages/oneclient_app/src/main.rs index f9d5b2c6..b94fff7d 100644 --- a/packages/oneclient_app/src/main.rs +++ b/packages/oneclient_app/src/main.rs @@ -247,7 +247,7 @@ fn main() { .with_plugin(freya::metrics::MetricsPlugin::default()) .with_default_font(theme::DEFAULT_FONT); - if show_tray_icon { + if show_tray_icon && platform::tray::available() { launch_config = launch_config.with_tray(platform::tray::build, platform::tray::handle); } diff --git a/packages/oneclient_app/src/platform.rs b/packages/oneclient_app/src/platform.rs index 0799df15..e0d25e3d 100644 --- a/packages/oneclient_app/src/platform.rs +++ b/packages/oneclient_app/src/platform.rs @@ -181,6 +181,22 @@ pub mod tray { }); } + #[cfg(target_os = "linux")] + pub fn available() -> bool { + let loaded = ["libayatana-appindicator3.so.1", "libappindicator3.so.1"] + .into_iter() + .any(|name| unsafe { libloading::Library::new(name) }.is_ok()); + if !loaded { + tracing::warn!("tray icon disabled, appindicator failed to load"); + } + loaded + } + + #[cfg(not(target_os = "linux"))] + pub fn available() -> bool { + true + } + pub fn build() -> TrayIcon { let live_on_linux = cfg!(target_os = "linux"); let stop = MenuItem::with_id(STOP_ID, "Stop game", live_on_linux, None);