From 2d2fdf0b1efb1cbf76df6aa6c9e9a01ced5e56b5 Mon Sep 17 00:00:00 2001
From: GyDi <segydi@foxmail.com>
Date: Mon, 12 Sep 2022 00:45:19 +0800
Subject: [PATCH] fix: handle is none

---
 src-tauri/src/core/handle.rs   |  4 ++--
 src-tauri/src/core/mod.rs      | 33 +++++++++++++++++++++++----------
 src-tauri/src/utils/resolve.rs |  2 +-
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs
index bba93d0..471790d 100644
--- a/src-tauri/src/core/handle.rs
+++ b/src-tauri/src/core/handle.rs
@@ -10,8 +10,8 @@ pub struct Handle {
 }
 
 impl Handle {
-  pub fn from(app_handle: Option<AppHandle>) -> Handle {
-    Handle { app_handle }
+  pub fn set_inner(&mut self, app_handle: AppHandle) {
+    self.app_handle = Some(app_handle);
   }
 
   pub fn get_window(&self) -> Option<Window> {
diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs
index df7d6d2..24421f6 100644
--- a/src-tauri/src/core/mod.rs
+++ b/src-tauri/src/core/mod.rs
@@ -22,7 +22,7 @@ static CORE: Lazy<Core> = Lazy::new(|| Core {
   sysopt: Arc::new(Mutex::new(Sysopt::new())),
   timer: Arc::new(Mutex::new(Timer::new())),
   runtime: Arc::new(Mutex::new(RuntimeResult::default())),
-  handle: Handle::default(),
+  handle: Arc::new(Mutex::new(Handle::default())),
 });
 
 #[derive(Clone)]
@@ -31,7 +31,7 @@ pub struct Core {
   pub sysopt: Arc<Mutex<Sysopt>>,
   pub timer: Arc<Mutex<Timer>>,
   pub runtime: Arc<Mutex<RuntimeResult>>,
-  pub handle: Handle,
+  pub handle: Arc<Mutex<Handle>>,
 }
 
 impl Core {
@@ -40,10 +40,14 @@ impl Core {
   }
 
   /// initialize the core state
-  pub fn init(&mut self, app_handle: tauri::AppHandle) {
+  pub fn init(&self, app_handle: tauri::AppHandle) {
     // kill old clash process
     Service::kill_old_clash();
-    self.handle = Handle::from(Some(app_handle));
+
+    {
+      let mut handle = self.handle.lock();
+      handle.set_inner(app_handle);
+    }
 
     {
       let mut service = self.service.lock();
@@ -58,8 +62,11 @@ impl Core {
       log_if_err!(sysopt.init_sysproxy());
     }
 
-    log_if_err!(self.handle.update_systray());
-    log_if_err!(self.handle.update_systray_clash());
+    {
+      let handle = self.handle.lock();
+      log_if_err!(handle.update_systray());
+      log_if_err!(handle.update_systray_clash());
+    }
 
     // timer initialize
     let mut timer = self.timer.lock();
@@ -124,7 +131,8 @@ impl Core {
     }
 
     if has_mode {
-      self.handle.update_systray_clash()?;
+      let handle = self.handle.lock();
+      handle.update_systray_clash()?;
     }
 
     Ok(())
@@ -186,7 +194,8 @@ impl Core {
     }
 
     if system_proxy.is_some() || tun_mode.is_some() {
-      self.handle.update_systray()?;
+      let handle = self.handle.lock();
+      handle.update_systray()?;
     }
 
     Ok(())
@@ -211,7 +220,8 @@ impl Core {
     });
 
     // update tray
-    self.handle.update_systray_clash()?;
+    let handle = self.handle.lock();
+    handle.update_systray_clash()?;
 
     Ok(())
   }
@@ -260,7 +270,10 @@ impl Core {
     let handle = self.handle.clone();
     tauri::async_runtime::spawn(async move {
       match Service::set_config(clash_info, config).await {
-        Ok(_) => handle.refresh_clash(),
+        Ok(_) => {
+          let handle = handle.lock();
+          handle.refresh_clash()
+        }
         Err(err) => log::error!(target: "app", "{err}"),
       }
     });
diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs
index 6042640..fd947c9 100644
--- a/src-tauri/src/utils/resolve.rs
+++ b/src-tauri/src/utils/resolve.rs
@@ -16,7 +16,7 @@ pub fn resolve_setup(app: &App) {
   }
 
   // core should be initialized after init_app fix #122
-  let mut core = Core::global();
+  let core = Core::global();
   core.init(app.app_handle());
 
   resolve_window(app);
-- 
GitLab