parent
ff1035740e
commit
c86f4dc024
@ -1,106 +0,0 @@
|
|||||||
lockfileVersion: 5.3
|
|
||||||
|
|
||||||
specifiers:
|
|
||||||
'@tauri-apps/cli': ^1.0.0-rc.0
|
|
||||||
|
|
||||||
dependencies:
|
|
||||||
'@tauri-apps/cli': 1.0.0-rc.8
|
|
||||||
|
|
||||||
packages:
|
|
||||||
|
|
||||||
/@tauri-apps/cli-darwin-arm64/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-sbV4fkd3YBlX0gEBldEVmN/NbBdHzrn8wCRRiFaNBocDWC6Ji6DNvpp1Vy1xgY0RgtGOisGD+3+HelmKP4Mh/A==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [darwin]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-darwin-x64/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-VmuYbBZKKal/YxSTbzHTaM04C9zUlTXq7ePoXc1PRAa/Xafo16N37OGzhzBlsKHrvh6BtPp9ZWk5UhHIDiJBsw==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [darwin]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-linux-arm-gnueabihf/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-2VKkS1c2pK56sgtGxtsm9nKKWefG7dgPnynTuCoEngkgQfNIlZ1ns/eAIZpBmwhvOMOw2OesKvK9ZQo0/lE/IA==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [arm]
|
|
||||||
os: [linux]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-linux-arm64-gnu/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-jykbrTJyx0uJhhL/3PPYGx5ETqEzacJ3YChnHzVClSzPkrdoGC61/xY9dMD9ZFJsLMJkV4VJj8sGRd1OPKCa/w==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [linux]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-linux-arm64-musl/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-HAIm8BKpLIWkvYgxoRzDIaqWIW3UtH2HO1qDd0aov5FTx/9dtCTtylpvd/6mWs5LGaEmsLoSokfJloI2sMZ/WQ==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [linux]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-linux-x64-gnu/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-fnPrkX6Uy9Qz2vqnT3D3sgbJzXTR4arNUIQl8HIYi2YCZZVmDWczz4x4++ilZWwk0I3a7d612/WzTeBzQjn3kg==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [linux]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-linux-x64-musl/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-kHrpBsJFRAwqFL7xnsrKdNxnYjzI/J9/Dr7T3rl+IIPbi1sIojh6DydxFOYepnuoINA6zWYQJpo0FQeASJsXrw==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [linux]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-win32-ia32-msvc/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-y8uT7AaIZVdLAWL4pxj/GXitwWn828er23yniOvTo1mJMCZsSFdwiOGiRSXI6OZsVCOPiJmvqq7eWaskQKYA0A==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [ia32]
|
|
||||||
os: [win32]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli-win32-x64-msvc/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-PiDr/iAKoL9nQSiWHkUSjRVHbvCJaa7Xj3P9UnGkjJQ9LGTr7AYZdLk4zISegF+/fZnOmaqUdZW9yWPPyJAzPw==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [win32]
|
|
||||||
requiresBuild: true
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
/@tauri-apps/cli/1.0.0-rc.8:
|
|
||||||
resolution: {integrity: sha512-FWpNwbgGMPgDb41oO7wdBhBsBE6FMG9yHKbtbrkJ/8d/hWcT6e3UUTfFL9cR2VGdp1pdWlul5+BKH0PTf8rB9w==}
|
|
||||||
engines: {node: '>= 10'}
|
|
||||||
hasBin: true
|
|
||||||
optionalDependencies:
|
|
||||||
'@tauri-apps/cli-darwin-arm64': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-darwin-x64': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-linux-arm-gnueabihf': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-linux-arm64-gnu': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-linux-arm64-musl': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-linux-x64-gnu': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-linux-x64-musl': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-win32-ia32-msvc': 1.0.0-rc.8
|
|
||||||
'@tauri-apps/cli-win32-x64-msvc': 1.0.0-rc.8
|
|
||||||
dev: false
|
|
@ -0,0 +1,94 @@
|
|||||||
|
#![cfg(target_os = "linux")]
|
||||||
|
|
||||||
|
use crate::SingleInstanceCallback;
|
||||||
|
use std::{cell::RefCell, rc::Rc};
|
||||||
|
use tauri::{
|
||||||
|
plugin::{self, TauriPlugin},
|
||||||
|
Manager, RunEvent, Runtime,
|
||||||
|
};
|
||||||
|
use zbus::{
|
||||||
|
blocking::{Connection, ConnectionBuilder},
|
||||||
|
dbus_interface,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ConnectionHandle(Connection);
|
||||||
|
const CLOSE_NEW_INSTANCE_ID: u32 = 1542;
|
||||||
|
|
||||||
|
struct SingleInstanceDBus {
|
||||||
|
callback: Box<SingleInstanceCallback>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[dbus_interface(name = "org.SingleInstance.DBus")]
|
||||||
|
impl SingleInstanceDBus {
|
||||||
|
fn execute_callback(&mut self, argv: Vec<String>, cwd: String) -> u32 {
|
||||||
|
let ret = Rc::new(RefCell::new(1));
|
||||||
|
let ret_c = Rc::clone(&ret);
|
||||||
|
|
||||||
|
(self.callback)(
|
||||||
|
argv,
|
||||||
|
cwd,
|
||||||
|
Box::new(move || {
|
||||||
|
let mut ret = ret_c.borrow_mut();
|
||||||
|
*ret = CLOSE_NEW_INSTANCE_ID;
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
ret.take()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn init<R: Runtime>(f: Box<SingleInstanceCallback>) -> TauriPlugin<R> {
|
||||||
|
plugin::Builder::new("single-instance")
|
||||||
|
.setup(|app| {
|
||||||
|
let app_name = app.package_info().name.clone();
|
||||||
|
let single_instance_dbus = SingleInstanceDBus { callback: f };
|
||||||
|
let dbus_name = format!("org.{}.SingleInstance", app_name);
|
||||||
|
let dbus_path = format!("/org/{}/SingleInstance", app_name);
|
||||||
|
|
||||||
|
match ConnectionBuilder::session()
|
||||||
|
.unwrap()
|
||||||
|
.name(dbus_name.as_str())
|
||||||
|
.unwrap()
|
||||||
|
.serve_at(dbus_path.as_str(), single_instance_dbus)
|
||||||
|
.unwrap()
|
||||||
|
.build()
|
||||||
|
{
|
||||||
|
Ok(connection) => {
|
||||||
|
app.manage(ConnectionHandle(connection));
|
||||||
|
}
|
||||||
|
Err(zbus::Error::NameTaken) => {
|
||||||
|
let connection = Connection::session().unwrap();
|
||||||
|
if let Ok(m) = connection.call_method(
|
||||||
|
Some(dbus_name.as_str()),
|
||||||
|
dbus_path.as_str(),
|
||||||
|
Some("org.SingleInstance.DBus"),
|
||||||
|
"ExecuteCallback",
|
||||||
|
&(
|
||||||
|
std::env::args().collect::<Vec<String>>(),
|
||||||
|
std::env::current_dir()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_str()
|
||||||
|
.unwrap_or_default(),
|
||||||
|
),
|
||||||
|
) {
|
||||||
|
let reply: u32 = m.body().unwrap_or_default();
|
||||||
|
if reply == CLOSE_NEW_INSTANCE_ID {
|
||||||
|
std::process::exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.on_event(|app, event| {
|
||||||
|
if let RunEvent::Exit = event {
|
||||||
|
if let Some(connection) = app.try_state::<ConnectionHandle>() {
|
||||||
|
let app_name = app.package_info().name.clone();
|
||||||
|
let dbus_name = format!("org.{}.SingleInstance", app_name);
|
||||||
|
let _ = connection.0.release_name(dbus_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.build()
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
#![cfg(target_os = "macos")]
|
||||||
|
|
||||||
|
use crate::SingleInstanceCallback;
|
||||||
|
use tauri::{
|
||||||
|
plugin::{self, TauriPlugin},
|
||||||
|
Runtime,
|
||||||
|
};
|
||||||
|
pub fn init<R: Runtime>(f: Box<SingleInstanceCallback>) -> TauriPlugin<R> {
|
||||||
|
plugin::Builder::new("single-instance").build()
|
||||||
|
}
|
Loading…
Reference in new issue