From 50a7472bbc76089b7a2dc559249a285a9ce192a6 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Mon, 12 Sep 2022 12:36:09 -0300 Subject: [PATCH] feat: add function to stop checking for single instance (#13) --- src/lib.rs | 6 +++++- src/platform_impl/linux.rs | 22 ++++++++++++++-------- src/platform_impl/macos.rs | 4 +++- src/platform_impl/windows.rs | 22 +++++++++++++--------- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1cc9488a..a2ff71af 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use tauri::{plugin::TauriPlugin, AppHandle, Runtime}; +use tauri::{plugin::TauriPlugin, AppHandle, Manager, Runtime}; #[cfg(target_os = "windows")] #[path = "platform_impl/windows.rs"] @@ -18,3 +18,7 @@ pub fn init, Vec, String) + Send + Sy ) -> TauriPlugin { platform_impl::init(Box::new(f)) } + +pub fn destroy>(manager: &M) { + platform_impl::destroy(manager) +} diff --git a/src/platform_impl/linux.rs b/src/platform_impl/linux.rs index af7986a3..b175d727 100644 --- a/src/platform_impl/linux.rs +++ b/src/platform_impl/linux.rs @@ -1,9 +1,11 @@ #![cfg(target_os = "linux")] +use std::sync::Arc; + use crate::SingleInstanceCallback; use tauri::{ plugin::{self, TauriPlugin}, - AppHandle, Manager, RunEvent, Runtime, + AppHandle, Config, Manager, RunEvent, Runtime, }; use zbus::{ blocking::{Connection, ConnectionBuilder}, @@ -24,8 +26,8 @@ impl SingleInstanceDBus { } } -fn dbus_id(app: &AppHandle) -> String { - app.config() +fn dbus_id(config: Arc) -> String { + config .tauri .bundle .identifier @@ -36,7 +38,7 @@ fn dbus_id(app: &AppHandle) -> String { pub fn init(f: Box>) -> TauriPlugin { plugin::Builder::new("single-instance") .setup(|app| { - let id = dbus_id(app); + let id = dbus_id(app.config()); let single_instance_dbus = SingleInstanceDBus { callback: f, app_handle: app.clone(), @@ -80,11 +82,15 @@ pub fn init(f: Box>) -> TauriPlugin { }) .on_event(|app, event| { if let RunEvent::Exit = event { - if let Some(connection) = app.try_state::() { - let dbus_name = format!("org.{}.SingleInstance", dbus_id(app)); - let _ = connection.0.release_name(dbus_name); - } + destroy(app); } }) .build() } + +pub fn destroy>(manager: &M) { + if let Some(connection) = manager.try_state::() { + let dbus_name = format!("org.{}.SingleInstance", dbus_id(manager.config())); + let _ = connection.0.release_name(dbus_name); + } +} diff --git a/src/platform_impl/macos.rs b/src/platform_impl/macos.rs index 99edeaed..4e25d35a 100644 --- a/src/platform_impl/macos.rs +++ b/src/platform_impl/macos.rs @@ -3,8 +3,10 @@ use crate::SingleInstanceCallback; use tauri::{ plugin::{self, TauriPlugin}, - Runtime, + Manager, Runtime, }; pub fn init(f: Box>) -> TauriPlugin { plugin::Builder::new("single-instance").build() } + +pub fn destroy>(_manager: &M) {} diff --git a/src/platform_impl/windows.rs b/src/platform_impl/windows.rs index 15db8b48..3abec84c 100644 --- a/src/platform_impl/windows.rs +++ b/src/platform_impl/windows.rs @@ -84,20 +84,24 @@ pub fn init(f: Box>) -> TauriPlugin { }) .on_event(|app, event| { if let RunEvent::Exit = event { - if let Some(hmutex) = app.try_state::() { - unsafe { - ReleaseMutex(hmutex.0); - CloseHandle(hmutex.0); - } - } - if let Some(hwnd) = app.try_state::() { - unsafe { DestroyWindow(hwnd.0) }; - } + destroy(app); } }) .build() } +pub fn destroy>(manager: &M) { + if let Some(hmutex) = manager.try_state::() { + unsafe { + ReleaseMutex(hmutex.0); + CloseHandle(hmutex.0); + } + } + if let Some(hwnd) = manager.try_state::() { + unsafe { DestroyWindow(hwnd.0) }; + } +} + unsafe extern "system" fn single_instance_window_proc( hwnd: HWND, msg: u32,