diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 0c03804..718305b 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -209,6 +209,7 @@ fn main() -> Result<(), ArgsError> { get_theme_list, system_helpers::run_command, system_helpers::run_program, + system_helpers::run_program_args, system_helpers::run_program_relative, system_helpers::start_service, system_helpers::service_status, diff --git a/src-tauri/src/system_helpers.rs b/src-tauri/src/system_helpers.rs index 1962a59..6081dad 100644 --- a/src-tauri/src/system_helpers.rs +++ b/src-tauri/src/system_helpers.rs @@ -108,6 +108,18 @@ impl SpawnItsFineReally for Command { } } +#[tauri::command] +pub fn run_program_args(path: String, args: Option) { + match open::with( + format!("{}", args.unwrap_or_else(|| "".into())), + path.clone(), + ) { + Ok(_) => (), + Err(e) => println!("Failed to open program ({}): {}", &path, e), + }; + return; +} + #[tauri::command] pub fn run_program(path: String, args: Option) { // Without unwrap_or, this can crash when UAC prompt is denied diff --git a/src/ui/components/ServerLaunchSection.tsx b/src/ui/components/ServerLaunchSection.tsx index ef53ab8..2d9d642 100644 --- a/src/ui/components/ServerLaunchSection.tsx +++ b/src/ui/components/ServerLaunchSection.tsx @@ -278,6 +278,13 @@ export default class ServerLaunchSection extends React.Component if (config.launch_args.length < 1) { // Run relative when there are no args await invoke('run_program_relative', { path: exe || config.game_install_path }) + } + // Handle XXMI + else if (proc_name?.toLowerCase().includes('xxmi')) { + await invoke('run_program_args', { + path: exe, + args: config.launch_args, + }) } else { // Run directly when there are args await invoke('run_program', { diff --git a/src/ui/components/menu/ExtrasMenu.tsx b/src/ui/components/menu/ExtrasMenu.tsx index 900b304..0d23e5a 100644 --- a/src/ui/components/menu/ExtrasMenu.tsx +++ b/src/ui/components/menu/ExtrasMenu.tsx @@ -69,7 +69,10 @@ export class ExtrasMenu extends React.Component { // This injects independent of the game if (this.state.launch_migoto) { - await this.launchMigoto() + if (await this.launchMigoto()) { + // Already launched the game (ie. via XXMI) + return + } } // This injects independent of the game @@ -104,7 +107,17 @@ export class ExtrasMenu extends React.Component { if (!config.migoto_path) return alert('Migoto not installed or set!') + if (config.migoto_path?.toLowerCase().includes('xxmi')) { + // Get game exe from game path, so we can watch it + const pathArr = config.migoto_path.replace(/\\/g, '/').split('/') + const gameExec = pathArr[pathArr.length - 1] + + this.props.playGame(config.migoto_path, gameExec) + return true + } + await invoke('run_program_relative', { path: config.migoto_path }) + return false } async launchReshade() {