added semver compatibility check for Windows and Linux

pull/502/head
Matthias 2 years ago
parent 51f20b438e
commit 8440daaedd
No known key found for this signature in database
GPG Key ID: BE1CE37C49DC0244

1
Cargo.lock generated

@ -4555,6 +4555,7 @@ name = "tauri-plugin-single-instance"
version = "0.0.0"
dependencies = [
"log",
"semver 1.0.16",
"serde",
"serde_json",
"tauri",

@ -7,6 +7,7 @@ serde = { version = "1", features = ["derive"] }
log = "0.4"
tauri = "1"
tauri-build = "1"
semver = "1"
serde_json = "1"
thiserror = "1"

@ -11,6 +11,7 @@ exclude = ["/examples"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
semver.workspace = true
serde.workspace = true
serde_json.workspace = true
tauri.workspace = true

@ -10,6 +10,9 @@ mod platform_impl;
#[path = "platform_impl/macos.rs"]
mod platform_impl;
mod semver_compat;
pub(crate) type SingleInstanceCallback<R> =
dyn FnMut(&AppHandle<R>, Vec<String>, String) + Send + Sync + 'static;

@ -2,7 +2,7 @@
use std::sync::Arc;
use crate::SingleInstanceCallback;
use crate::{SingleInstanceCallback, semver_compat::semver_compat_string};
use tauri::{
plugin::{self, TauriPlugin},
AppHandle, Config, Manager, RunEvent, Runtime,
@ -26,14 +26,17 @@ impl<R: Runtime> SingleInstanceDBus<R> {
}
}
fn dbus_id(config: Arc<Config>) -> String {
config.tauri.bundle.identifier.replace(['.', '-'], "_")
fn dbus_id(config: Arc<Config>, version: semver::Version) -> String {
let mut id = config.tauri.bundle.identifier.replace(['.', '-'], "_");
id.push('_');
id.push_str(semver_compat_string(version).as_str());
id
}
pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
plugin::Builder::new("single-instance")
.setup(|app| {
let id = dbus_id(app.config());
let id = dbus_id(app.config(), app.package_info().version.clone());
let single_instance_dbus = SingleInstanceDBus {
callback: f,
app_handle: app.clone(),
@ -85,7 +88,7 @@ pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
pub fn destroy<R: Runtime, M: Manager<R>>(manager: &M) {
if let Some(connection) = manager.try_state::<ConnectionHandle>() {
let dbus_name = format!("org.{}.SingleInstance", dbus_id(manager.config()));
let dbus_name = format!("org.{}.SingleInstance", dbus_id(manager.config(), manager.app_handle().package_info().version.clone()));
let _ = connection.0.release_name(dbus_name);
}
}

@ -1,6 +1,6 @@
#![cfg(target_os = "windows")]
use crate::SingleInstanceCallback;
use crate::{SingleInstanceCallback, semver_compat::semver_compat_string};
use std::ffi::CStr;
use tauri::{
plugin::{self, TauriPlugin},
@ -29,7 +29,9 @@ const WMCOPYDATA_SINGLE_INSTANCE_DATA: usize = 1542;
pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
plugin::Builder::new("single-instance")
.setup(|app| {
let id = &app.config().tauri.bundle.identifier;
let mut id = (&app.config().tauri.bundle.identifier).to_owned();
id.push('_');
id.push_str(semver_compat_string(app.package_info().version.clone()).as_str());
let class_name = encode_wide(format!("{id}-sic"));
let window_name = encode_wide(format!("{id}-siw"));

@ -0,0 +1,16 @@
/// Takes a version and spits out a String with trailing .x, thus only considering the digits
/// relevant regarding semver compatibility
pub fn semver_compat_string(version: semver::Version) -> String {
if version.pre.is_empty() == false { // for pre-release always treat each version separately
return version.to_string().replace(['.', '-'], "_")
}
match version.major {
0 => {
match version.minor {
0 => format!("0_0_{}", version.patch),
_ => format!("0_{}_x", version.minor),
}
},
_ => format!("{}_x_x", version.major)
}
}
Loading…
Cancel
Save