From 6ab05b6c38e5957f08822bcb185f111055bbd3d8 Mon Sep 17 00:00:00 2001 From: quexeky Date: Mon, 30 Dec 2024 13:50:26 +1100 Subject: [PATCH] feat(process manager): Game kill tauri command Signed-off-by: quexeky --- desktop/src-tauri/src/lib.rs | 3 ++- .../src-tauri/src/process/process_commands.rs | 10 ++++++++++ desktop/src-tauri/src/process/process_manager.rs | 16 ++++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/desktop/src-tauri/src/lib.rs b/desktop/src-tauri/src/lib.rs index dfaa5428..c125bd97 100644 --- a/desktop/src-tauri/src/lib.rs +++ b/desktop/src-tauri/src/lib.rs @@ -32,7 +32,7 @@ use log4rs::config::{Appender, Root}; use log4rs::encode::pattern::PatternEncoder; use log4rs::Config; use process::compat::CompatibilityManager; -use process::process_commands::launch_game; +use process::process_commands::{kill_game, launch_game}; use process::process_manager::ProcessManager; use remote::{gen_drop_url, use_remote}; use serde::{Deserialize, Serialize}; @@ -234,6 +234,7 @@ pub fn run() { uninstall_game, // Processes launch_game, + kill_game ]) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_dialog::init()) diff --git a/desktop/src-tauri/src/process/process_commands.rs b/desktop/src-tauri/src/process/process_commands.rs index 6b4aba5a..afdd3089 100644 --- a/desktop/src-tauri/src/process/process_commands.rs +++ b/desktop/src-tauri/src/process/process_commands.rs @@ -17,3 +17,13 @@ pub fn launch_game( Ok(()) } + +#[tauri::command] +pub fn kill_game( + game_id: String, + state: tauri::State<'_, Mutex>, +) -> Result<(), String> { + let state_lock = state.lock().unwrap(); + let mut process_manager_lock = state_lock.process_manager.lock().unwrap(); + process_manager_lock.terminate_child(game_id).map_err(|x| x.to_string()) +} \ No newline at end of file diff --git a/desktop/src-tauri/src/process/process_manager.rs b/desktop/src-tauri/src/process/process_manager.rs index e7c3fd94..a9d7725f 100644 --- a/desktop/src-tauri/src/process/process_manager.rs +++ b/desktop/src-tauri/src/process/process_manager.rs @@ -1,10 +1,5 @@ use std::{ - collections::HashMap, - fs::{File, OpenOptions}, - path::{Path, PathBuf}, - process::{Child, Command, ExitStatus}, - sync::{Arc, Mutex}, - thread::spawn, + collections::HashMap, fs::{File, OpenOptions}, io, path::{Path, PathBuf}, process::{Child, Command, ExitStatus}, sync::{Arc, Mutex}, thread::spawn }; use log::{info, warn}; @@ -80,6 +75,15 @@ impl ProcessManager<'_> { */ (absolute_exe, Vec::new()) } + pub fn terminate_child(&mut self, game_id: String) -> Result<(), io::Error> { + return match self.processes.get(&game_id) { + Some(child) => { + let mut lock = child.lock().unwrap(); + lock.kill() + }, + None => Err(io::Error::new(io::ErrorKind::NotFound, "Game ID not running")), + } + } fn on_process_finish(&mut self, game_id: String, result: Result) { if !self.processes.contains_key(&game_id) {