diff --git a/packages/tauri-app/Cargo.lock b/packages/tauri-app/Cargo.lock index 750131d6..d5bc8ce7 100644 --- a/packages/tauri-app/Cargo.lock +++ b/packages/tauri-app/Cargo.lock @@ -646,6 +646,7 @@ dependencies = [ "thiserror 1.0.69", "url", "which", + "windows-sys 0.59.0", ] [[package]] diff --git a/packages/tauri-app/src-tauri/Cargo.toml b/packages/tauri-app/src-tauri/Cargo.toml index 6d05959a..f697d3f4 100644 --- a/packages/tauri-app/src-tauri/Cargo.toml +++ b/packages/tauri-app/src-tauri/Cargo.toml @@ -25,3 +25,6 @@ tauri-plugin-opener = "2" url = "2" tauri-plugin-keepawake = "0.1.1" tauri-plugin-notification = "2" + +[target.'cfg(windows)'.dependencies] +windows-sys = { version = "0.59", features = ["Win32_UI_Shell"] } diff --git a/packages/tauri-app/src-tauri/src/main.rs b/packages/tauri-app/src-tauri/src/main.rs index ac402932..832c51f9 100644 --- a/packages/tauri-app/src-tauri/src/main.rs +++ b/packages/tauri-app/src-tauri/src/main.rs @@ -12,8 +12,20 @@ use tauri::{AppHandle, Emitter, Manager, Runtime, Wry}; use tauri_plugin_opener::OpenerExt; use url::Url; +#[cfg(windows)] +use std::ffi::OsStr; +#[cfg(windows)] +use std::iter; +#[cfg(windows)] +use std::os::windows::ffi::OsStrExt; +#[cfg(windows)] +use windows_sys::Win32::UI::Shell::SetCurrentProcessExplicitAppUserModelID; + static QUIT_REQUESTED: AtomicBool = AtomicBool::new(false); +#[cfg(windows)] +const WINDOWS_APP_USER_MODEL_ID: &str = "ai.neuralnomads.codenomad.client"; + #[derive(Clone)] pub struct AppState { pub manager: CliProcessManager, @@ -101,6 +113,22 @@ fn emit_folder_drop_event( } } +#[cfg(windows)] +fn set_windows_app_user_model_id() { + let app_id: Vec = OsStr::new(WINDOWS_APP_USER_MODEL_ID) + .encode_wide() + .chain(iter::once(0)) + .collect(); + + let result = unsafe { SetCurrentProcessExplicitAppUserModelID(app_id.as_ptr()) }; + if result < 0 { + eprintln!("[tauri] failed to set AppUserModelID: {result}"); + } +} + +#[cfg(not(windows))] +fn set_windows_app_user_model_id() {} + fn main() { let navigation_guard: TauriPlugin = PluginBuilder::new("external-link-guard") .on_navigation(|webview, url| intercept_navigation(webview, url)) @@ -116,6 +144,7 @@ fn main() { manager: CliProcessManager::new(), }) .setup(|app| { + set_windows_app_user_model_id(); build_menu(&app.handle())?; let dev_mode = is_dev_mode(); let app_handle = app.handle().clone();