diff --git a/Cargo.lock b/Cargo.lock index 100553bf7..66395e78f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -582,6 +582,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + [[package]] name = "embed_plist" version = "1.2.2" @@ -1396,6 +1402,26 @@ dependencies = [ "adler", ] +[[package]] +name = "native-dialog" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab637f328b31bd0855c43bd38a4a4455e74324d9e74e0aac6a803422f43abc6" +dependencies = [ + "block", + "cocoa", + "dirs-next", + "objc", + "objc-foundation", + "objc_id", + "once_cell", + "raw-window-handle 0.4.3", + "thiserror", + "wfd", + "which", + "winapi", +] + [[package]] name = "ndk" version = "0.6.0" @@ -1517,6 +1543,17 @@ dependencies = [ "objc_exception", ] +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -1943,6 +1980,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "raw-window-handle" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +dependencies = [ + "cty", +] + [[package]] name = "raw-window-handle" version = "0.5.0" @@ -2258,7 +2304,9 @@ version = "0.0.0" dependencies = [ "clap-verbosity-flag", "log", + "native-dialog", "pretty_env_logger", + "rand 0.8.5", "serde", "serde_json", "tauri", @@ -2421,7 +2469,7 @@ dependencies = [ "parking_lot", "paste", "png", - "raw-window-handle", + "raw-window-handle 0.5.0", "scopeguard", "serde", "unicode-segmentation", @@ -2467,7 +2515,7 @@ dependencies = [ "os_pipe", "percent-encoding", "rand 0.8.5", - "raw-window-handle", + "raw-window-handle 0.5.0", "regex", "semver 1.0.14", "serde", @@ -2569,7 +2617,7 @@ dependencies = [ "http", "http-range", "rand 0.8.5", - "raw-window-handle", + "raw-window-handle 0.5.0", "serde", "serde_json", "tauri-utils", @@ -2589,7 +2637,7 @@ dependencies = [ "gtk", "percent-encoding", "rand 0.8.5", - "raw-window-handle", + "raw-window-handle 0.5.0", "tauri-runtime", "tauri-utils", "uuid 1.2.2", @@ -3041,6 +3089,27 @@ dependencies = [ "windows-metadata", ] +[[package]] +name = "wfd" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e713040b67aae5bf1a0ae3e1ebba8cc29ab2b90da9aa1bff6e09031a8a41d7a8" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "which" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" +dependencies = [ + "either", + "libc", + "once_cell", +] + [[package]] name = "win32job" version = "1.0.2" diff --git a/gui/src-tauri/Cargo.toml b/gui/src-tauri/Cargo.toml index c9be17201..2bc2b7d9c 100644 --- a/gui/src-tauri/Cargo.toml +++ b/gui/src-tauri/Cargo.toml @@ -31,6 +31,8 @@ pretty_env_logger = "0.4" log = "0.4" clap-verbosity-flag = "1" tauri-plugin-window-state = "0.1.0" +native-dialog = "0.6.3" +rand = "0.8.5" [target.'cfg(windows)'.dependencies] win32job = "1" diff --git a/gui/src-tauri/src/main.rs b/gui/src-tauri/src/main.rs index c87b9ce87..70007e005 100644 --- a/gui/src-tauri/src/main.rs +++ b/gui/src-tauri/src/main.rs @@ -1,16 +1,28 @@ #![cfg_attr( - all(not(debug_assertions), target_os = "windows"), + all(not(debug_assertions), windows), windows_subsystem = "windows" )] +use std::env; +use std::panic; +use std::path::PathBuf; use clap::Parser; use clap_verbosity_flag::{InfoLevel, Verbosity}; -use std::env; -use std::path::PathBuf; +use native_dialog::{MessageDialog, MessageType}; +use rand::seq::SliceRandom; +use rand::thread_rng; use tauri::api::clap; use tauri::api::process::Command; use tauri::Manager; +static POSSIBLE_TITLES: &[&str] = &[ + "Panicking situation", + "looking for spatula", + "never gonna give you up", + "never gonna let you down", + "uwu sowwy", +]; + #[derive(Parser)] #[clap(version, about)] struct Cli { @@ -48,7 +60,25 @@ fn get_launch_path(cli: Cli) -> Option { None } +fn show_error(text: &str) { + MessageDialog::new() + .set_title(&format!( + "SlimeVR GUI crashed - {}", + POSSIBLE_TITLES.choose(&mut thread_rng()).unwrap() + )) + .set_text(text) + .set_type(MessageType::Error) + .show_alert() + .unwrap(); +} + fn main() { + // Make an error dialog box when panicking + panic::set_hook(Box::new(|panic_info| { + eprintln!("{}", panic_info); + show_error(&panic_info.to_string()); + })); + let cli = Cli::parse(); // Set up loggers and global handlers @@ -60,7 +90,7 @@ fn main() { } // Ensure child processes die when spawned on windows - #[cfg(target_os = "windows")] + #[cfg(windows)] { use win32job::{ExtendedLimitInfo, Job}; diff --git a/package-lock.json b/package-lock.json index c6501719b..52bf748b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5521,9 +5521,9 @@ } }, "node_modules/flatbuffers": { - "version": "22.10.26", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-22.10.26.tgz", - "integrity": "sha512-sdO3emf/BlLfOogW6KwHuXg16APR/E86jNacDXfSInPzt8SSEzxlHcqDekfM/IJ1CGC5bvDksfNufNhS8h1FRA==" + "version": "22.11.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-22.11.23.tgz", + "integrity": "sha512-aBOu8GjUWP3FaAC0t17lVFvNWYBEVIF/ia25Mx77BJJtJRbiyYmYQZjZV0bFoBvLBLYQ7ivnFO4ZIvgxhX1VKQ==" }, "node_modules/flatted": { "version": "3.2.7", @@ -13727,9 +13727,9 @@ } }, "flatbuffers": { - "version": "22.10.26", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-22.10.26.tgz", - "integrity": "sha512-sdO3emf/BlLfOogW6KwHuXg16APR/E86jNacDXfSInPzt8SSEzxlHcqDekfM/IJ1CGC5bvDksfNufNhS8h1FRA==" + "version": "22.11.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-22.11.23.tgz", + "integrity": "sha512-aBOu8GjUWP3FaAC0t17lVFvNWYBEVIF/ia25Mx77BJJtJRbiyYmYQZjZV0bFoBvLBLYQ7ivnFO4ZIvgxhX1VKQ==" }, "flatted": { "version": "3.2.7",