mirror of
https://github.com/tauri-apps/plugins-workspace.git
synced 2026-07-30 17:48:50 +02:00
single-instance: fix cwd in single instance on macOS (#2609)
* single-instance: fix `cwd` in single instance on macOS which was the `cwd` of the first instance, instead of the second how it should be and is on windows and linux. also add rustfmt.toml to enforce the correct formatting (4 spaces for indent) * use split_once * remove rustfmt * fix indentation --------- Co-authored-by: Lucas Nogueira <lucas@tauri.app>
This commit is contained in:
co-authored by
Lucas Nogueira
parent
ff384cbabe
commit
dc84f8d8bb
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
single-instance: patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix `cwd` in single instance on macOS, which was the cwd of the first instance, instead of the second (like it is on windows and linux)
|
||||||
@@ -114,8 +114,8 @@ mod imp {
|
|||||||
/// ## Platform-specific:
|
/// ## Platform-specific:
|
||||||
///
|
///
|
||||||
/// - **Windows / Linux**: This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values.
|
/// - **Windows / Linux**: This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values.
|
||||||
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
|
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
|
||||||
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
|
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
|
||||||
pub fn get_current(&self) -> crate::Result<Option<Vec<url::Url>>> {
|
pub fn get_current(&self) -> crate::Result<Option<Vec<url::Url>>> {
|
||||||
self.plugin_handle
|
self.plugin_handle
|
||||||
.run_mobile_plugin::<GetCurrentResponse>("getCurrent", ())
|
.run_mobile_plugin::<GetCurrentResponse>("getCurrent", ())
|
||||||
@@ -226,8 +226,8 @@ mod imp {
|
|||||||
/// ## Platform-specific:
|
/// ## Platform-specific:
|
||||||
///
|
///
|
||||||
/// - **Windows / Linux**: This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values.
|
/// - **Windows / Linux**: This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values.
|
||||||
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
|
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
|
||||||
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
|
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
|
||||||
pub fn get_current(&self) -> crate::Result<Option<Vec<url::Url>>> {
|
pub fn get_current(&self) -> crate::Result<Option<Vec<url::Url>>> {
|
||||||
return Ok(self.current.lock().unwrap().clone());
|
return Ok(self.current.lock().unwrap().clone());
|
||||||
}
|
}
|
||||||
@@ -350,7 +350,7 @@ mod imp {
|
|||||||
/// ## Platform-specific:
|
/// ## Platform-specific:
|
||||||
///
|
///
|
||||||
/// - **Windows**: Requires admin rights if the protocol is registered on local machine
|
/// - **Windows**: Requires admin rights if the protocol is registered on local machine
|
||||||
/// (this can happen when registered from the NSIS installer when the install mode is set to both or per machine)
|
/// (this can happen when registered from the NSIS installer when the install mode is set to both or per machine)
|
||||||
/// - **Linux**: Can only unregister the scheme if it was initially registered with [`register`](`Self::register`). May not work on older distros.
|
/// - **Linux**: Can only unregister the scheme if it was initially registered with [`register`](`Self::register`). May not work on older distros.
|
||||||
/// - **macOS / Android / iOS**: Unsupported, will return [`Error::UnsupportedPlatform`](`crate::Error::UnsupportedPlatform`).
|
/// - **macOS / Android / iOS**: Unsupported, will return [`Error::UnsupportedPlatform`](`crate::Error::UnsupportedPlatform`).
|
||||||
pub fn unregister<S: AsRef<str>>(&self, _protocol: S) -> crate::Result<()> {
|
pub fn unregister<S: AsRef<str>>(&self, _protocol: S) -> crate::Result<()> {
|
||||||
|
|||||||
@@ -77,6 +77,13 @@ fn socket_cleanup(socket: &PathBuf) {
|
|||||||
fn notify_singleton(socket: &PathBuf) -> Result<(), Error> {
|
fn notify_singleton(socket: &PathBuf) -> Result<(), Error> {
|
||||||
let stream = UnixStream::connect(socket)?;
|
let stream = UnixStream::connect(socket)?;
|
||||||
let mut bf = BufWriter::new(&stream);
|
let mut bf = BufWriter::new(&stream);
|
||||||
|
let cwd = std::env::current_dir()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_str()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_string();
|
||||||
|
bf.write_all(cwd.as_bytes())?;
|
||||||
|
bf.write_all(b"\0\0")?;
|
||||||
let args_joined = std::env::args().collect::<Vec<String>>().join("\0");
|
let args_joined = std::env::args().collect::<Vec<String>>().join("\0");
|
||||||
bf.write_all(args_joined.as_bytes())?;
|
bf.write_all(args_joined.as_bytes())?;
|
||||||
bf.flush()?;
|
bf.flush()?;
|
||||||
@@ -91,12 +98,6 @@ fn listen_for_other_instances<A: Runtime>(
|
|||||||
) {
|
) {
|
||||||
match UnixListener::bind(socket) {
|
match UnixListener::bind(socket) {
|
||||||
Ok(listener) => {
|
Ok(listener) => {
|
||||||
let cwd = std::env::current_dir()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_str()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_string();
|
|
||||||
|
|
||||||
tauri::async_runtime::spawn(async move {
|
tauri::async_runtime::spawn(async move {
|
||||||
for stream in listener.incoming() {
|
for stream in listener.incoming() {
|
||||||
match stream {
|
match stream {
|
||||||
@@ -104,9 +105,10 @@ fn listen_for_other_instances<A: Runtime>(
|
|||||||
let mut s = String::new();
|
let mut s = String::new();
|
||||||
match stream.read_to_string(&mut s) {
|
match stream.read_to_string(&mut s) {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
|
let (cwd, args) = s.split_once("\0\0").unwrap_or_default();
|
||||||
let args: Vec<String> =
|
let args: Vec<String> =
|
||||||
s.split('\0').map(String::from).collect();
|
args.split('\0').map(String::from).collect();
|
||||||
cb(app.app_handle(), args, cwd.clone());
|
cb(app.app_handle(), args, cwd.to_string());
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::debug!("single_instance failed to be notified: {e}")
|
tracing::debug!("single_instance failed to be notified: {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user