From 8dd32bbe986e61d4460f9fb5a08d991782c3c073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Gonz=C3=A1lez?= <7822554+AlexTMjugador@users.noreply.github.com> Date: Mon, 5 May 2025 21:38:10 +0200 Subject: [PATCH] Fix macOS Theseus build issue, cleanup platform specific code (#3604) * chore(theseus): significantly cleanup MacOS-specific code * fix(labrinth): only use jemalloc allocator for Linux targets The upstream crate asserts that its tests only pass for Linux targets, and there's little point in supporting other OS for now since practical Labrinth deployments run under a Linux environment anyway. This change made it easier for me to cross-compile Labrinth. * chore(theseus): tweak traffic lights pos according to https://github.com/modrinth/code/commit/c39bb78e38cb9cfe13f01f4a9bee277881b52efb As far as I understand it, that PR introduced the seemingly ad-hoc additions of 6 and 12 units to the traffic light position calculations, not directly modifying the `const` values introduced by https://github.com/modrinth/code/commit/d6a72fbfc4613a45acaa38e0e73da9bcc455e87a. * fix: re-enable app window shadows on Linux * chore: log `window.set_shadow` errors * chore: trigger CI --- Cargo.lock | 161 ++---------- apps/app-frontend/package.json | 12 +- apps/app/Cargo.toml | 9 - apps/app/package.json | 2 +- apps/app/src/api/utils.rs | 27 +- apps/app/src/macos/mod.rs | 1 - apps/app/src/macos/window_ext.rs | 412 ------------------------------- apps/app/src/main.rs | 19 +- apps/app/tauri.conf.json | 10 +- apps/app/tauri.macos.conf.json | 6 +- apps/labrinth/Cargo.toml | 2 +- apps/labrinth/src/lib.rs | 2 +- apps/labrinth/src/main.rs | 4 +- apps/labrinth/src/routes/mod.rs | 2 +- pnpm-lock.yaml | 168 +++++++------ 15 files changed, 146 insertions(+), 691 deletions(-) delete mode 100644 apps/app/src/macos/window_ext.rs diff --git a/Cargo.lock b/Cargo.lock index 5ba81ef48..4d8b3c8f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -513,7 +513,7 @@ dependencies = [ "futures-channel", "futures-util", "rand 0.8.5", - "raw-window-handle 0.6.2", + "raw-window-handle", "serde", "serde_repr", "tokio", @@ -1043,12 +1043,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.9.0" @@ -1523,66 +1517,6 @@ dependencies = [ "cc", ] -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types 0.5.0", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" -dependencies = [ - "bitflags 2.9.0", - "block", - "cocoa-foundation 0.2.0", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types 0.5.0", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" -dependencies = [ - "bitflags 2.9.0", - "block", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "libc", - "objc", -] - [[package]] name = "color-thief" version = "0.2.2" @@ -1785,19 +1719,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types 0.5.0", - "libc", -] - [[package]] name = "core-graphics" version = "0.24.0" @@ -1806,22 +1727,11 @@ checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ "bitflags 2.9.0", "core-foundation 0.10.0", - "core-graphics-types 0.2.0", + "core-graphics-types", "foreign-types 0.5.0", "libc", ] -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - [[package]] name = "core-graphics-types" version = "0.2.0" @@ -4943,15 +4853,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - [[package]] name = "mappings" version = "0.7.0" @@ -5231,7 +5132,7 @@ dependencies = [ "objc2-core-foundation", "objc2-core-graphics", "objc2-foundation 0.3.1", - "raw-window-handle 0.6.2", + "raw-window-handle", "thiserror 2.0.12", "versions", "wfd", @@ -5267,7 +5168,7 @@ dependencies = [ "log", "ndk-sys", "num_enum", - "raw-window-handle 0.6.2", + "raw-window-handle", "thiserror 1.0.69", ] @@ -5539,15 +5440,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - [[package]] name = "objc-sys" version = "0.3.5" @@ -6948,12 +6840,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - [[package]] name = "raw-window-handle" version = "0.6.2" @@ -7249,7 +7135,7 @@ dependencies = [ "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", - "raw-window-handle 0.6.2", + "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -8360,14 +8246,14 @@ checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ "bytemuck", "cfg_aliases", - "core-graphics 0.24.0", + "core-graphics", "foreign-types 0.5.0", "js-sys", "log", "objc2 0.5.2", "objc2-foundation 0.2.2", "objc2-quartz-core 0.2.2", - "raw-window-handle 0.6.2", + "raw-window-handle", "redox_syscall", "wasm-bindgen", "web-sys", @@ -8942,7 +8828,7 @@ checksum = "1e59c1f38e657351a2e822eadf40d6a2ad4627b9c25557bc1180ec1b3295ef82" dependencies = [ "bitflags 2.9.0", "core-foundation 0.10.0", - "core-graphics 0.24.0", + "core-graphics", "crossbeam-channel", "dispatch", "dlopen2", @@ -8962,7 +8848,7 @@ dependencies = [ "objc2-foundation 0.3.1", "once_cell", "parking_lot", - "raw-window-handle 0.6.2", + "raw-window-handle", "scopeguard", "tao-macros", "unicode-segmentation", @@ -9036,7 +8922,7 @@ dependencies = [ "objc2-ui-kit", "percent-encoding", "plist", - "raw-window-handle 0.6.2", + "raw-window-handle", "reqwest 0.12.15", "serde", "serde_json", @@ -9168,7 +9054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcaf6e5d6062423a0f711a23c2a573ccba222b6a16a9322d8499928f27e41376" dependencies = [ "log", - "raw-window-handle 0.6.2", + "raw-window-handle", "rfd", "serde", "serde_json", @@ -9317,7 +9203,7 @@ dependencies = [ "jni", "objc2 0.6.1", "objc2-ui-kit", - "raw-window-handle 0.6.2", + "raw-window-handle", "serde", "serde_json", "tauri-utils", @@ -9341,7 +9227,7 @@ dependencies = [ "objc2-foundation 0.3.1", "once_cell", "percent-encoding", - "raw-window-handle 0.6.2", + "raw-window-handle", "softbuffer", "tao", "tauri-runtime", @@ -9501,17 +9387,13 @@ name = "theseus_gui" version = "0.9.5" dependencies = [ "chrono", - "cocoa 0.26.0", "daedalus", "dashmap 6.1.0", "either", "enumset", "native-dialog", - "objc", "opener", - "os_info", "paste", - "rand 0.9.1", "serde", "serde_json", "serde_with", @@ -9532,7 +9414,6 @@ dependencies = [ "url", "urlencoding", "uuid 1.16.0", - "window-shadows", ] [[package]] @@ -10852,18 +10733,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "window-shadows" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ff424735b1ac21293b0492b069394b0a189c8a463fb015a16dea7c2e221c08" -dependencies = [ - "cocoa 0.25.0", - "objc", - "raw-window-handle 0.5.2", - "windows-sys 0.48.0", -] - [[package]] name = "window-vibrancy" version = "0.6.0" @@ -10874,7 +10743,7 @@ dependencies = [ "objc2-app-kit 0.3.1", "objc2-core-foundation", "objc2-foundation 0.3.1", - "raw-window-handle 0.6.2", + "raw-window-handle", "windows-sys 0.59.0", "windows-version", ] @@ -11559,7 +11428,7 @@ dependencies = [ "objc2-web-kit", "once_cell", "percent-encoding", - "raw-window-handle 0.6.2", + "raw-window-handle", "sha2 0.10.9", "soup3", "tao-macros", diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index fbc130015..fa6d8f926 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -17,12 +17,12 @@ "@modrinth/utils": "workspace:*", "@sentry/vue": "^8.27.0", "@geometrically/minecraft-motd-parser": "^1.1.4", - "@tauri-apps/api": "^2.1.1", - "@tauri-apps/plugin-dialog": "^2.2.0", - "@tauri-apps/plugin-os": "^2.2.0", - "@tauri-apps/plugin-opener": "^2.2.1", - "@tauri-apps/plugin-updater": "^2.3.0", - "@tauri-apps/plugin-window-state": "^2.2.0", + "@tauri-apps/api": "^2.5.0", + "@tauri-apps/plugin-dialog": "^2.2.1", + "@tauri-apps/plugin-os": "^2.2.1", + "@tauri-apps/plugin-opener": "^2.2.6", + "@tauri-apps/plugin-updater": "^2.7.1", + "@tauri-apps/plugin-window-state": "^2.2.2", "@vintl/vintl": "^4.4.1", "dayjs": "^1.11.10", "floating-vue": "^5.2.2", diff --git a/apps/app/Cargo.toml b/apps/app/Cargo.toml index 5786182bd..0309a8130 100644 --- a/apps/app/Cargo.toml +++ b/apps/app/Cargo.toml @@ -35,7 +35,6 @@ either = "1.15" url = "2.2" urlencoding = "2.1" uuid = { version = "1.1", features = ["serde", "v4"] } -os_info = "3.7.0" tracing = "0.1.37" tracing-error = "0.2.0" @@ -48,14 +47,6 @@ opener = { version = "0.7.2", features = ["reveal", "dbus-vendored"] } native-dialog = "0.9.0" -[target.'cfg(not(target_os = "linux"))'.dependencies] -window-shadows = "0.2.1" - -[target.'cfg(target_os = "macos")'.dependencies] -cocoa = "0.26.0" -objc = "0.2.7" -rand = "0.9.1" - [target.'cfg(target_os = "linux")'.dependencies] tauri-plugin-updater = { version = "2.3.0", optional = true, features = ["native-tls-vendored", "zip"], default-features = false } diff --git a/apps/app/package.json b/apps/app/package.json index 168ac3454..794bf7e0b 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -9,7 +9,7 @@ "fix": "cargo fmt && cargo clippy --fix" }, "devDependencies": { - "@tauri-apps/cli": "2.1.0" + "@tauri-apps/cli": "2.5.0" }, "dependencies": { "@modrinth/app-frontend": "workspace:*", diff --git a/apps/app/src/api/utils.rs b/apps/app/src/api/utils.rs index cb20d87c8..dfb1d9187 100644 --- a/apps/app/src/api/utils.rs +++ b/apps/app/src/api/utils.rs @@ -53,25 +53,24 @@ pub async fn progress_bars_list() Ok(res) } -// cfg only on mac os // disables mouseover and fixes a random crash error only fixed by recent versions of macos -#[cfg(target_os = "macos")] #[tauri::command] pub async fn should_disable_mouseover() -> bool { - // We try to match version to 12.2 or higher. If unrecognizable to pattern or lower, we default to the css with disabled mouseover for safety - let os = os_info::get(); - if let os_info::Version::Semantic(major, minor, _) = os.version() { - if *major >= 12 && *minor >= 3 { - // Mac os version is 12.3 or higher, we allow mouseover - return false; + if cfg!(target_os = "macos") { + // We try to match version to 12.2 or higher. If unrecognizable to pattern or lower, we default to the css with disabled mouseover for safety + if let tauri_plugin_os::Version::Semantic(major, minor, _) = + tauri_plugin_os::version() + { + if major >= 12 && minor >= 3 { + // Mac os version is 12.3 or higher, we allow mouseover + return false; + } } + true + } else { + // Not macos, we allow mouseover + false } - true -} -#[cfg(not(target_os = "macos"))] -#[tauri::command] -pub async fn should_disable_mouseover() -> bool { - false } #[tauri::command] diff --git a/apps/app/src/macos/mod.rs b/apps/app/src/macos/mod.rs index 8098222ea..af946b000 100644 --- a/apps/app/src/macos/mod.rs +++ b/apps/app/src/macos/mod.rs @@ -1,2 +1 @@ pub mod deep_link; -pub mod window_ext; diff --git a/apps/app/src/macos/window_ext.rs b/apps/app/src/macos/window_ext.rs deleted file mode 100644 index 0e3975509..000000000 --- a/apps/app/src/macos/window_ext.rs +++ /dev/null @@ -1,412 +0,0 @@ -// Stolen from https://gist.github.com/charrondev/43150e940bd2771b1ea88256d491c7a9 -use objc::{msg_send, sel, sel_impl}; -use rand::{Rng, distributions::Alphanumeric}; -use tauri::{ - Emitter, Runtime, Window, - plugin::{Builder, TauriPlugin}, -}; // 0.8 - -const WINDOW_CONTROL_PAD_X: f64 = 9.0; -const WINDOW_CONTROL_PAD_Y: f64 = 10.0; - -struct UnsafeWindowHandle(*mut std::ffi::c_void); -unsafe impl Send for UnsafeWindowHandle {} -unsafe impl Sync for UnsafeWindowHandle {} - -pub fn init() -> TauriPlugin { - Builder::new("traffic_light_positioner") - .on_window_ready(|window| { - #[cfg(target_os = "macos")] - setup_traffic_light_positioner(window); - }) - .build() -} - -#[cfg(target_os = "macos")] -fn position_traffic_lights( - ns_window_handle: UnsafeWindowHandle, - x: f64, - y: f64, -) { - use cocoa::appkit::{NSView, NSWindow, NSWindowButton}; - use cocoa::foundation::NSRect; - let ns_window = ns_window_handle.0 as cocoa::base::id; - unsafe { - let close = ns_window - .standardWindowButton_(NSWindowButton::NSWindowCloseButton); - let miniaturize = ns_window - .standardWindowButton_(NSWindowButton::NSWindowMiniaturizeButton); - let zoom = - ns_window.standardWindowButton_(NSWindowButton::NSWindowZoomButton); - - let title_bar_container_view = close.superview().superview(); - - let close_rect: NSRect = msg_send![close, frame]; - let button_height = close_rect.size.height + 12.0; - - let title_bar_frame_height = button_height + y; - let mut title_bar_rect = NSView::frame(title_bar_container_view); - title_bar_rect.size.height = title_bar_frame_height; - title_bar_rect.origin.y = - NSView::frame(ns_window).size.height - title_bar_frame_height; - let _: () = - msg_send![title_bar_container_view, setFrame: title_bar_rect]; - - let window_buttons = vec![close, miniaturize, zoom]; - let space_between = - NSView::frame(miniaturize).origin.x - NSView::frame(close).origin.x; - - for (i, button) in window_buttons.into_iter().enumerate() { - let mut rect: NSRect = NSView::frame(button); - rect.origin.x = x + (i as f64 * space_between) + 6.0; - button.setFrameOrigin(rect.origin); - } - } -} - -#[cfg(target_os = "macos")] -#[derive(Debug)] -struct WindowState { - window: Window, -} - -#[cfg(target_os = "macos")] -pub fn setup_traffic_light_positioner(window: Window) { - use cocoa::appkit::NSWindow; - use cocoa::base::{BOOL, id}; - use cocoa::foundation::NSUInteger; - use objc::runtime::{Object, Sel}; - use std::ffi::c_void; - - // Do the initial positioning - position_traffic_lights( - UnsafeWindowHandle( - window.ns_window().expect("Failed to create window handle"), - ), - WINDOW_CONTROL_PAD_X, - WINDOW_CONTROL_PAD_Y, - ); - - // Ensure they stay in place while resizing the window. - fn with_window_state) -> T, T>( - this: &Object, - func: F, - ) { - let ptr = unsafe { - let x: *mut c_void = *this.get_ivar("app_box"); - &mut *(x as *mut WindowState) - }; - func(ptr); - } - - unsafe { - let ns_win = window - .ns_window() - .expect("NS Window should exist to mount traffic light delegate.") - as id; - - let current_delegate: id = ns_win.delegate(); - - extern "C" fn on_window_should_close( - this: &Object, - _cmd: Sel, - sender: id, - ) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, windowShouldClose: sender] - } - } - extern "C" fn on_window_will_close( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowWillClose: notification]; - } - } - extern "C" fn on_window_did_resize( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - let id = state.window.ns_window().expect( - "NS window should exist on state to handle resize", - ) as id; - - #[cfg(target_os = "macos")] - position_traffic_lights( - UnsafeWindowHandle(id as *mut std::ffi::c_void), - WINDOW_CONTROL_PAD_X, - WINDOW_CONTROL_PAD_Y, - ); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidResize: notification]; - } - } - extern "C" fn on_window_did_move( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidMove: notification]; - } - } - extern "C" fn on_window_did_change_backing_properties( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidChangeBackingProperties: notification]; - } - } - extern "C" fn on_window_did_become_key( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = - msg_send![super_del, windowDidBecomeKey: notification]; - } - } - extern "C" fn on_window_did_resign_key( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = - msg_send![super_del, windowDidResignKey: notification]; - } - } - extern "C" fn on_dragging_entered( - this: &Object, - _cmd: Sel, - notification: id, - ) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, draggingEntered: notification] - } - } - extern "C" fn on_prepare_for_drag_operation( - this: &Object, - _cmd: Sel, - notification: id, - ) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, prepareForDragOperation: notification] - } - } - extern "C" fn on_perform_drag_operation( - this: &Object, - _cmd: Sel, - sender: id, - ) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, performDragOperation: sender] - } - } - extern "C" fn on_conclude_drag_operation( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = - msg_send![super_del, concludeDragOperation: notification]; - } - } - extern "C" fn on_dragging_exited( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, draggingExited: notification]; - } - } - extern "C" fn on_window_will_use_full_screen_presentation_options( - this: &Object, - _cmd: Sel, - window: id, - proposed_options: NSUInteger, - ) -> NSUInteger { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, window: window willUseFullScreenPresentationOptions: proposed_options] - } - } - extern "C" fn on_window_did_enter_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("did-enter-fullscreen", ()) - .expect("Failed to emit event"); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidEnterFullScreen: notification]; - } - } - extern "C" fn on_window_will_enter_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("will-enter-fullscreen", ()) - .expect("Failed to emit event"); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowWillEnterFullScreen: notification]; - } - } - extern "C" fn on_window_did_exit_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("did-exit-fullscreen", ()) - .expect("Failed to emit event"); - - let id = - state.window.ns_window().expect("Failed to emit event") - as id; - position_traffic_lights( - UnsafeWindowHandle(id as *mut std::ffi::c_void), - WINDOW_CONTROL_PAD_X, - WINDOW_CONTROL_PAD_Y, - ); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = - msg_send![super_del, windowDidExitFullScreen: notification]; - } - } - extern "C" fn on_window_will_exit_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("will-exit-fullscreen", ()) - .expect("Failed to emit event"); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowWillExitFullScreen: notification]; - } - } - extern "C" fn on_window_did_fail_to_enter_full_screen( - this: &Object, - _cmd: Sel, - window: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidFailToEnterFullScreen: window]; - } - } - extern "C" fn on_effective_appearance_did_change( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, effectiveAppearanceDidChange: notification]; - } - } - extern "C" fn on_effective_appearance_did_changed_on_main_thread( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![ - super_del, - effectiveAppearanceDidChangedOnMainThread: notification - ]; - } - } - - // Are we deallocing this properly ? (I miss safe Rust :( ) - let window_label = window.label().to_string(); - - let app_state = WindowState { window }; - let app_box = Box::into_raw(Box::new(app_state)) as *mut c_void; - let random_str: String = rand::rng() - .sample_iter(&Alphanumeric) - .take(20) - .map(char::from) - .collect(); - - // We need to ensure we have a unique delegate name, otherwise we will panic while trying to create a duplicate - // delegate with the same name. - let delegate_name = - format!("windowDelegate_{}_{}", window_label, random_str); - - ns_win.setDelegate_(delegate!(&delegate_name, { - window: id = ns_win, - app_box: *mut c_void = app_box, - toolbar: id = cocoa::base::nil, - super_delegate: id = current_delegate, - (windowShouldClose:) => on_window_should_close as extern fn(&Object, Sel, id) -> BOOL, - (windowWillClose:) => on_window_will_close as extern fn(&Object, Sel, id), - (windowDidResize:) => on_window_did_resize:: as extern fn(&Object, Sel, id), - (windowDidMove:) => on_window_did_move as extern fn(&Object, Sel, id), - (windowDidChangeBackingProperties:) => on_window_did_change_backing_properties as extern fn(&Object, Sel, id), - (windowDidBecomeKey:) => on_window_did_become_key as extern fn(&Object, Sel, id), - (windowDidResignKey:) => on_window_did_resign_key as extern fn(&Object, Sel, id), - (draggingEntered:) => on_dragging_entered as extern fn(&Object, Sel, id) -> BOOL, - (prepareForDragOperation:) => on_prepare_for_drag_operation as extern fn(&Object, Sel, id) -> BOOL, - (performDragOperation:) => on_perform_drag_operation as extern fn(&Object, Sel, id) -> BOOL, - (concludeDragOperation:) => on_conclude_drag_operation as extern fn(&Object, Sel, id), - (draggingExited:) => on_dragging_exited as extern fn(&Object, Sel, id), - (window:willUseFullScreenPresentationOptions:) => on_window_will_use_full_screen_presentation_options as extern fn(&Object, Sel, id, NSUInteger) -> NSUInteger, - (windowDidEnterFullScreen:) => on_window_did_enter_full_screen:: as extern fn(&Object, Sel, id), - (windowWillEnterFullScreen:) => on_window_will_enter_full_screen:: as extern fn(&Object, Sel, id), - (windowDidExitFullScreen:) => on_window_did_exit_full_screen:: as extern fn(&Object, Sel, id), - (windowWillExitFullScreen:) => on_window_will_exit_full_screen:: as extern fn(&Object, Sel, id), - (windowDidFailToEnterFullScreen:) => on_window_did_fail_to_enter_full_screen as extern fn(&Object, Sel, id), - (effectiveAppearanceDidChange:) => on_effective_appearance_did_change as extern fn(&Object, Sel, id), - (effectiveAppearanceDidChangedOnMainThread:) => on_effective_appearance_did_changed_on_main_thread as extern fn(&Object, Sel, id) - })) - } -} diff --git a/apps/app/src/main.rs b/apps/app/src/main.rs index 134d34bfe..4291431df 100644 --- a/apps/app/src/main.rs +++ b/apps/app/src/main.rs @@ -14,14 +14,6 @@ mod error; #[cfg(target_os = "macos")] mod macos; -#[cfg(target_os = "macos")] -#[macro_use] -extern crate cocoa; - -#[cfg(target_os = "macos")] -#[macro_use] -extern crate objc; - // Should be called in launcher initialization #[tracing::instrument(skip_all)] #[tauri::command] @@ -241,9 +233,9 @@ fn main() { }); #[cfg(not(target_os = "linux"))] - { - if let Some(window) = app.get_window("main") { - window.set_shadow(true).unwrap(); + if let Some(window) = app.get_window("main") { + if let Err(e) = window.set_shadow(true) { + tracing::warn!("Failed to set window shadow: {e}"); } } @@ -276,11 +268,6 @@ fn main() { restart_app, ]); - #[cfg(target_os = "macos")] - { - builder = builder.plugin(macos::window_ext::init()); - } - tracing::info!("Initializing app..."); let app = builder.build(tauri::generate_context!()); diff --git a/apps/app/tauri.conf.json b/apps/app/tauri.conf.json index a9a6dc3ba..72e380d8d 100644 --- a/apps/app/tauri.conf.json +++ b/apps/app/tauri.conf.json @@ -1,4 +1,5 @@ { + "$schema": "https://schema.tauri.app/config/2", "build": { "beforeDevCommand": "pnpm turbo run dev --filter=@modrinth/app-frontend", "beforeBuildCommand": "pnpm turbo run build --filter=@modrinth/app-frontend", @@ -76,7 +77,14 @@ ], "security": { "assetProtocol": { - "scope": ["$APPDATA/caches/icons/*", "$APPCONFIG/caches/icons/*", "$CONFIG/caches/icons/*", "$APPDATA/profiles/*/saves/*/icon.png", "$APPCONFIG/profiles/*/saves/*/icon.png", "$CONFIG/profiles/*/saves/*/icon.png"], + "scope": [ + "$APPDATA/caches/icons/*", + "$APPCONFIG/caches/icons/*", + "$CONFIG/caches/icons/*", + "$APPDATA/profiles/*/saves/*/icon.png", + "$APPCONFIG/profiles/*/saves/*/icon.png", + "$CONFIG/profiles/*/saves/*/icon.png" + ], "enable": true }, "capabilities": ["ads", "core", "plugins"], diff --git a/apps/app/tauri.macos.conf.json b/apps/app/tauri.macos.conf.json index d618f3228..821902426 100644 --- a/apps/app/tauri.macos.conf.json +++ b/apps/app/tauri.macos.conf.json @@ -13,7 +13,11 @@ "minWidth": 1100, "visible": false, "zoomHotkeysEnabled": false, - "decorations": true + "decorations": true, + "trafficLightPosition": { + "x": 15.0, + "y": 22.0 + } } ] } diff --git a/apps/labrinth/Cargo.toml b/apps/labrinth/Cargo.toml index 663f0ab24..ce5e55844 100644 --- a/apps/labrinth/Cargo.toml +++ b/apps/labrinth/Cargo.toml @@ -128,7 +128,7 @@ ariadne = { path = "../../packages/ariadne" } clap = { version = "4.5", features = ["derive"] } iana-time-zone = "0.1.61" -[target.'cfg(not(target_env = "msvc"))'.dependencies] +[target.'cfg(target_os = "linux")'.dependencies] tikv-jemallocator = { version = "0.6.0", features = ["profiling", "unprefixed_malloc_on_supported_platforms"] } tikv-jemalloc-ctl = { version = "0.6.0", features = ["stats"] } jemalloc_pprof = { version = "0.7.0", features = ["flamegraph"] } diff --git a/apps/labrinth/src/lib.rs b/apps/labrinth/src/lib.rs index 61b5839a9..562e70267 100644 --- a/apps/labrinth/src/lib.rs +++ b/apps/labrinth/src/lib.rs @@ -316,7 +316,7 @@ pub fn app_config( .configure( #[allow(unused_variables)] |cfg| { - #[cfg(not(target_env = "msvc"))] + #[cfg(target_os = "linux")] routes::debug::config(cfg) }, ) diff --git a/apps/labrinth/src/main.rs b/apps/labrinth/src/main.rs index 1c4f9c87c..e3fc5bed4 100644 --- a/apps/labrinth/src/main.rs +++ b/apps/labrinth/src/main.rs @@ -12,7 +12,7 @@ use std::sync::Arc; use tracing::{error, info}; use tracing_actix_web::TracingLogger; -#[cfg(not(target_env = "msvc"))] +#[cfg(target_os = "linux")] #[global_allocator] static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; @@ -149,7 +149,7 @@ async fn main() -> std::io::Result<()> { .await .expect("Failed to register redis metrics"); - #[cfg(not(target_env = "msvc"))] + #[cfg(target_os = "linux")] labrinth::routes::debug::jemalloc_mmeory_stats(&prometheus.registry) .expect("Failed to register jemalloc metrics"); diff --git a/apps/labrinth/src/routes/mod.rs b/apps/labrinth/src/routes/mod.rs index 131bddabc..64ef50ba9 100644 --- a/apps/labrinth/src/routes/mod.rs +++ b/apps/labrinth/src/routes/mod.rs @@ -12,7 +12,7 @@ pub mod internal; pub mod v2; pub mod v3; -#[cfg(not(target_env = "msvc"))] +#[cfg(target_os = "linux")] pub mod debug; pub mod v2_reroute; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 800cc3d19..795d937c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: version: link:../../packages/daedalus devDependencies: '@tauri-apps/cli': - specifier: 2.1.0 - version: 2.1.0 + specifier: 2.5.0 + version: 2.5.0 apps/app-frontend: dependencies: @@ -57,23 +57,23 @@ importers: specifier: ^8.27.0 version: 8.27.0(vue@3.5.13(typescript@5.5.4)) '@tauri-apps/api': - specifier: ^2.1.1 - version: 2.1.1 + specifier: ^2.5.0 + version: 2.5.0 '@tauri-apps/plugin-dialog': - specifier: ^2.2.0 - version: 2.2.0 - '@tauri-apps/plugin-opener': specifier: ^2.2.1 version: 2.2.1 + '@tauri-apps/plugin-opener': + specifier: ^2.2.6 + version: 2.2.6 '@tauri-apps/plugin-os': - specifier: ^2.2.0 - version: 2.2.0 + specifier: ^2.2.1 + version: 2.2.1 '@tauri-apps/plugin-updater': - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.7.1 + version: 2.7.1 '@tauri-apps/plugin-window-state': - specifier: ^2.2.0 - version: 2.2.0 + specifier: ^2.2.2 + version: 2.2.2 '@vintl/vintl': specifier: ^4.4.1 version: 4.4.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4)) @@ -2346,88 +2346,94 @@ packages: peerDependencies: vue: ^3.0.0 - '@tauri-apps/api@2.1.1': - resolution: {integrity: sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A==} + '@tauri-apps/api@2.5.0': + resolution: {integrity: sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==} - '@tauri-apps/cli-darwin-arm64@2.1.0': - resolution: {integrity: sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==} + '@tauri-apps/cli-darwin-arm64@2.5.0': + resolution: {integrity: sha512-VuVAeTFq86dfpoBDNYAdtQVLbP0+2EKCHIIhkaxjeoPARR0sLpFHz2zs0PcFU76e+KAaxtEtAJAXGNUc8E1PzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.1.0': - resolution: {integrity: sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==} + '@tauri-apps/cli-darwin-x64@2.5.0': + resolution: {integrity: sha512-hUF01sC06cZVa8+I0/VtsHOk9BbO75rd+YdtHJ48xTdcYaQ5QIwL4yZz9OR1AKBTaUYhBam8UX9Pvd5V2/4Dpw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@2.1.0': - resolution: {integrity: sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.5.0': + resolution: {integrity: sha512-LQKqttsK252LlqYyX8R02MinUsfFcy3+NZiJwHFgi5Y3+ZUIAED9cSxJkyNtuY5KMnR4RlpgWyLv4P6akN1xhg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.1.0': - resolution: {integrity: sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==} + '@tauri-apps/cli-linux-arm64-gnu@2.5.0': + resolution: {integrity: sha512-mTQufsPcpdHg5RW0zypazMo4L55EfeE5snTzrPqbLX4yCK2qalN7+rnP8O8GT06xhp6ElSP/Ku1M2MR297SByQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-musl@2.1.0': - resolution: {integrity: sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==} + '@tauri-apps/cli-linux-arm64-musl@2.5.0': + resolution: {integrity: sha512-rQO1HhRUQqyEaal5dUVOQruTRda/TD36s9kv1hTxZiFuSq3558lsTjAcUEnMAtBcBkps20sbyTJNMT0AwYIk8Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-x64-gnu@2.1.0': - resolution: {integrity: sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==} + '@tauri-apps/cli-linux-riscv64-gnu@2.5.0': + resolution: {integrity: sha512-7oS18FN46yDxyw1zX/AxhLAd7T3GrLj3Ai6s8hZKd9qFVzrAn36ESL7d3G05s8wEtsJf26qjXnVF4qleS3dYsA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@tauri-apps/cli-linux-x64-gnu@2.5.0': + resolution: {integrity: sha512-SG5sFNL7VMmDBdIg3nO3EzNRT306HsiEQ0N90ILe3ZABYAVoPDO/ttpCO37ApLInTzrq/DLN+gOlC/mgZvLw1w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-musl@2.1.0': - resolution: {integrity: sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==} + '@tauri-apps/cli-linux-x64-musl@2.5.0': + resolution: {integrity: sha512-QXDM8zp/6v05PNWju5ELsVwF0VH1n6b5pk2E6W/jFbbiwz80Vs1lACl9pv5kEHkrxBj+aWU/03JzGuIj2g3SkQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-win32-arm64-msvc@2.1.0': - resolution: {integrity: sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==} + '@tauri-apps/cli-win32-arm64-msvc@2.5.0': + resolution: {integrity: sha512-pFSHFK6b+o9y4Un8w0gGLwVyFTZaC3P0kQ7umRt/BLDkzD5RnQ4vBM7CF8BCU5nkwmEBUCZd7Wt3TWZxe41o6Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.1.0': - resolution: {integrity: sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==} + '@tauri-apps/cli-win32-ia32-msvc@2.5.0': + resolution: {integrity: sha512-EArv1IaRlogdLAQyGlKmEqZqm5RfHCUMhJoedWu7GtdbOMUfSAz6FMX2boE1PtEmNO4An+g188flLeVErrxEKg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.1.0': - resolution: {integrity: sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==} + '@tauri-apps/cli-win32-x64-msvc@2.5.0': + resolution: {integrity: sha512-lj43EFYbnAta8pd9JnUq87o+xRUR0odz+4rixBtTUwUgdRdwQ2V9CzFtsMu6FQKpFQ6mujRK6P1IEwhL6ADRsQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@2.1.0': - resolution: {integrity: sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==} + '@tauri-apps/cli@2.5.0': + resolution: {integrity: sha512-rAtHqG0Gh/IWLjN2zTf3nZqYqbo81oMbqop56rGTjrlWk9pTTAjkqOjSL9XQLIMZ3RbeVjveCqqCA0s8RnLdMg==} engines: {node: '>= 10'} hasBin: true - '@tauri-apps/plugin-dialog@2.2.0': - resolution: {integrity: sha512-6bLkYK68zyK31418AK5fNccCdVuRnNpbxquCl8IqgFByOgWFivbiIlvb79wpSXi0O+8k8RCSsIpOquebusRVSg==} + '@tauri-apps/plugin-dialog@2.2.1': + resolution: {integrity: sha512-wZmCouo4PgTosh/UoejPw9DPs6RllS5Pp3fuOV2JobCu36mR5AXU2MzU9NZiVaFi/5Zfc8RN0IhcZHnksJ1o8A==} - '@tauri-apps/plugin-opener@2.2.1': - resolution: {integrity: sha512-zloo4xzBqeh363xNA+xYt+7+/cu/lPYuG5PRtxjWAaSyfMqFo6IINdizkDBYylUewLiplXb5+S65GLVkeXTHPg==} + '@tauri-apps/plugin-opener@2.2.6': + resolution: {integrity: sha512-bSdkuP71ZQRepPOn8BOEdBKYJQvl6+jb160QtJX/i2H9BF6ZySY/kYljh76N2Ne5fJMQRge7rlKoStYQY5Jq1w==} - '@tauri-apps/plugin-os@2.2.0': - resolution: {integrity: sha512-HszbCdbisMlu5QhCNAN8YIWyz2v33abAWha6+uvV2CKX8P5VSct/y+kEe22JeyqrxCnWlQ3DRx7s49Byg7/0EA==} + '@tauri-apps/plugin-os@2.2.1': + resolution: {integrity: sha512-cNYpNri2CCc6BaNeB6G/mOtLvg8dFyFQyCUdf2y0K8PIAKGEWdEcu8DECkydU2B+oj4OJihDPD2de5K6cbVl9A==} - '@tauri-apps/plugin-updater@2.3.0': - resolution: {integrity: sha512-qdzyZEUN69FZQ/nRx51fBub10tT6wffJl3DLVo9q922Gvw8Wk++rZhoD9eethPlZYbog/7RGgT8JkrfLh5BKAg==} + '@tauri-apps/plugin-updater@2.7.1': + resolution: {integrity: sha512-1OPqEY/z7NDVSeTEMIhD2ss/vXWdpfZ5Th2Mk0KtPR/RA6FKuOTDGZQhxoyYBk0pcZJ+nNZUbl/IujDCLBApjA==} - '@tauri-apps/plugin-window-state@2.2.0': - resolution: {integrity: sha512-PFZ/vkZ6UPaRyuggEn8jWc/xwpiEw3Id8i6bin54zUR3vHY0MOK+ovvpvp6SEHKryCJbZMigYJz0OUT2eZ4YmQ==} + '@tauri-apps/plugin-window-state@2.2.2': + resolution: {integrity: sha512-7pFwmMtGhhhE/WgmM7PUrj0BSSWVAQMfDdYbRalphIqqF1tWBvxtlxclx8bTutpXHLJTQoCpIeWtBEIXsoAlGw==} '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} @@ -9850,70 +9856,74 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.5.4) - '@tauri-apps/api@2.1.1': {} + '@tauri-apps/api@2.5.0': {} - '@tauri-apps/cli-darwin-arm64@2.1.0': + '@tauri-apps/cli-darwin-arm64@2.5.0': optional: true - '@tauri-apps/cli-darwin-x64@2.1.0': + '@tauri-apps/cli-darwin-x64@2.5.0': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.1.0': + '@tauri-apps/cli-linux-arm-gnueabihf@2.5.0': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.1.0': + '@tauri-apps/cli-linux-arm64-gnu@2.5.0': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.1.0': + '@tauri-apps/cli-linux-arm64-musl@2.5.0': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.1.0': + '@tauri-apps/cli-linux-riscv64-gnu@2.5.0': optional: true - '@tauri-apps/cli-linux-x64-musl@2.1.0': + '@tauri-apps/cli-linux-x64-gnu@2.5.0': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.1.0': + '@tauri-apps/cli-linux-x64-musl@2.5.0': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.1.0': + '@tauri-apps/cli-win32-arm64-msvc@2.5.0': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.1.0': + '@tauri-apps/cli-win32-ia32-msvc@2.5.0': optional: true - '@tauri-apps/cli@2.1.0': + '@tauri-apps/cli-win32-x64-msvc@2.5.0': + optional: true + + '@tauri-apps/cli@2.5.0': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.1.0 - '@tauri-apps/cli-darwin-x64': 2.1.0 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.1.0 - '@tauri-apps/cli-linux-arm64-gnu': 2.1.0 - '@tauri-apps/cli-linux-arm64-musl': 2.1.0 - '@tauri-apps/cli-linux-x64-gnu': 2.1.0 - '@tauri-apps/cli-linux-x64-musl': 2.1.0 - '@tauri-apps/cli-win32-arm64-msvc': 2.1.0 - '@tauri-apps/cli-win32-ia32-msvc': 2.1.0 - '@tauri-apps/cli-win32-x64-msvc': 2.1.0 + '@tauri-apps/cli-darwin-arm64': 2.5.0 + '@tauri-apps/cli-darwin-x64': 2.5.0 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.5.0 + '@tauri-apps/cli-linux-arm64-gnu': 2.5.0 + '@tauri-apps/cli-linux-arm64-musl': 2.5.0 + '@tauri-apps/cli-linux-riscv64-gnu': 2.5.0 + '@tauri-apps/cli-linux-x64-gnu': 2.5.0 + '@tauri-apps/cli-linux-x64-musl': 2.5.0 + '@tauri-apps/cli-win32-arm64-msvc': 2.5.0 + '@tauri-apps/cli-win32-ia32-msvc': 2.5.0 + '@tauri-apps/cli-win32-x64-msvc': 2.5.0 - '@tauri-apps/plugin-dialog@2.2.0': + '@tauri-apps/plugin-dialog@2.2.1': dependencies: - '@tauri-apps/api': 2.1.1 + '@tauri-apps/api': 2.5.0 - '@tauri-apps/plugin-opener@2.2.1': + '@tauri-apps/plugin-opener@2.2.6': dependencies: - '@tauri-apps/api': 2.1.1 + '@tauri-apps/api': 2.5.0 - '@tauri-apps/plugin-os@2.2.0': + '@tauri-apps/plugin-os@2.2.1': dependencies: - '@tauri-apps/api': 2.1.1 + '@tauri-apps/api': 2.5.0 - '@tauri-apps/plugin-updater@2.3.0': + '@tauri-apps/plugin-updater@2.7.1': dependencies: - '@tauri-apps/api': 2.1.1 + '@tauri-apps/api': 2.5.0 - '@tauri-apps/plugin-window-state@2.2.0': + '@tauri-apps/plugin-window-state@2.2.2': dependencies: - '@tauri-apps/api': 2.1.1 + '@tauri-apps/api': 2.5.0 '@trysound/sax@0.2.0': {}