diff --git a/src-tauri/capabilities/main.json b/src-tauri/capabilities/main.json index 80a7522c..2d1b5132 100644 --- a/src-tauri/capabilities/main.json +++ b/src-tauri/capabilities/main.json @@ -2,8 +2,13 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "window", "description": "Capability for the desktop", - "platforms": ["macOS", "windows"], - "windows": ["*"], + "platforms": [ + "macOS", + "windows" + ], + "windows": [ + "*" + ], "permissions": [ "core:path:default", "core:event:default", @@ -41,9 +46,7 @@ "decorum:allow-show-snap-overlay", "clipboard-manager:allow-write-text", "clipboard-manager:allow-read-text", - "dialog:allow-open", - "dialog:allow-ask", - "dialog:allow-message", + "dialog:default", "process:allow-restart", "process:allow-exit", "fs:allow-read-file", diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json index 411f8862..841ad385 100644 --- a/src-tauri/gen/schemas/capabilities.json +++ b/src-tauri/gen/schemas/capabilities.json @@ -1 +1 @@ -{"window":{"identifier":"window","description":"Capability for the desktop","local":true,"windows":["*"],"permissions":["core:path:default","core:event:default","core:window:default","core:app:default","core:resources:default","core:menu:default","core:tray:default","core:window:allow-create","core:window:allow-close","core:window:allow-destroy","core:window:allow-set-focus","core:window:allow-center","core:window:allow-minimize","core:window:allow-maximize","core:window:allow-set-size","core:window:allow-start-dragging","core:window:allow-toggle-maximize","core:webview:allow-create-webview-window","core:webview:allow-create-webview","core:webview:allow-set-webview-size","core:webview:allow-set-webview-position","core:webview:allow-webview-close","core:menu:allow-new","core:menu:allow-popup","notification:allow-is-permission-granted","notification:allow-request-permission","notification:default","os:allow-locale","os:allow-platform","os:allow-os-type","updater:default","updater:allow-check","updater:allow-download-and-install","decorum:allow-show-snap-overlay","clipboard-manager:allow-write-text","clipboard-manager:allow-read-text","dialog:allow-open","dialog:allow-ask","dialog:allow-message","process:allow-restart","process:allow-exit","fs:allow-read-file","shell:allow-open","store:default","prevent-default:default","theme:default",{"identifier":"http:default","allow":[{"url":"http://**/"},{"url":"https://**/"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"$RESOURCE/locales/*"},{"path":"$RESOURCE/resources/*"}]}],"platforms":["macOS","windows"]}} \ No newline at end of file +{"window":{"identifier":"window","description":"Capability for the desktop","local":true,"windows":["*"],"permissions":["core:path:default","core:event:default","core:window:default","core:app:default","core:resources:default","core:menu:default","core:tray:default","core:window:allow-create","core:window:allow-close","core:window:allow-destroy","core:window:allow-set-focus","core:window:allow-center","core:window:allow-minimize","core:window:allow-maximize","core:window:allow-set-size","core:window:allow-start-dragging","core:window:allow-toggle-maximize","core:webview:allow-create-webview-window","core:webview:allow-create-webview","core:webview:allow-set-webview-size","core:webview:allow-set-webview-position","core:webview:allow-webview-close","core:menu:allow-new","core:menu:allow-popup","notification:allow-is-permission-granted","notification:allow-request-permission","notification:default","os:allow-locale","os:allow-platform","os:allow-os-type","updater:default","updater:allow-check","updater:allow-download-and-install","decorum:allow-show-snap-overlay","clipboard-manager:allow-write-text","clipboard-manager:allow-read-text","dialog:default","process:allow-restart","process:allow-exit","fs:allow-read-file","shell:allow-open","store:default","prevent-default:default","theme:default",{"identifier":"http:default","allow":[{"url":"http://**/"},{"url":"https://**/"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"$RESOURCE/locales/*"},{"path":"$RESOURCE/resources/*"}]}],"platforms":["macOS","windows"]}} \ No newline at end of file diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 348227e6..9ee49265 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -18,7 +18,11 @@ use std::{ str::FromStr, time::Duration, }; -use tauri::{path::BaseDirectory, Emitter, EventTarget, Listener, Manager}; +use tauri::{ + menu::{Menu, MenuItem}, + path::BaseDirectory, + Emitter, EventTarget, Listener, Manager, WebviewWindowBuilder, +}; use tauri_plugin_decorum::WebviewWindowExt; use tauri_plugin_notification::{NotificationExt, PermissionState}; use tauri_specta::{collect_commands, Builder}; @@ -172,6 +176,53 @@ fn main() { #[cfg(target_os = "macos")] main_window.set_traffic_lights_inset(7.0, 10.0).unwrap(); + // Setup tray menu item + let open_i = MenuItem::with_id(app, "open", "Open Lume", true, None::<&str>)?; + let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?; + // Create tray menu + let menu = Menu::with_items(app, &[&open_i, &quit_i])?; + // Get main tray + let tray = app.tray_by_id("main").unwrap(); + // Set menu + tray.set_menu(Some(menu)).unwrap(); + // Listen to tray events + tray.on_menu_event(|handle, event| match event.id().as_ref() { + "open" => { + if let Some(window) = handle.get_window("main") { + if window.is_visible().unwrap_or_default() { + let _ = window.set_focus(); + } else { + let _ = window.show(); + let _ = window.set_focus(); + }; + } else { + let window = WebviewWindowBuilder::from_config( + handle, + handle.config().app.windows.first().unwrap(), + ) + .unwrap() + .build() + .unwrap(); + + // Set decoration + #[cfg(target_os = "windows")] + window.create_overlay_titlebar().unwrap(); + + // Restore native border + #[cfg(target_os = "macos")] + window.add_border(None); + + // Set a custom inset to the traffic lights + #[cfg(target_os = "macos")] + window.set_traffic_lights_inset(7.0, 10.0).unwrap(); + } + } + "quit" => { + std::process::exit(0); + } + _ => {} + }); + let client = tauri::async_runtime::block_on(async move { // Setup database let database = NostrLMDB::open(config_dir.join("nostr")) @@ -491,8 +542,13 @@ fn main() { .plugin(tauri_plugin_upload::init()) .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_window_state::Builder::default().build()) - .run(ctx) - .expect("error while running tauri application"); + .build(ctx) + .expect("error while running tauri application") + .run(|_app_handle, event| { + if let tauri::RunEvent::ExitRequested { api, .. } = event { + api.prevent_exit(); + } + }); } #[cfg(debug_assertions)]