diff --git a/crates/tauri/src/lib.rs b/crates/tauri/src/lib.rs index 47268fde7..30058b6f9 100644 --- a/crates/tauri/src/lib.rs +++ b/crates/tauri/src/lib.rs @@ -1001,7 +1001,7 @@ pub trait Emitter: sealed::ManagerBase { { let event = EventName::new(event)?; let payload = EmitPayload::Serialize(&payload); - self.manager().emit_to(target, event, payload) + self.manager().emit_to(target.into(), event, payload) } /// Similar to [`Emitter::emit_to`] but the payload is json serialized. @@ -1011,7 +1011,7 @@ pub trait Emitter: sealed::ManagerBase { { let event = EventName::new(event)?; let payload = EmitPayload::<()>::Str(payload); - self.manager().emit_to(target, event, payload) + self.manager().emit_to(target.into(), event, payload) } /// Emits an event to all [targets](EventTarget) based on the given filter. diff --git a/crates/tauri/src/manager/mod.rs b/crates/tauri/src/manager/mod.rs index 98f549527..4f9369b99 100644 --- a/crates/tauri/src/manager/mod.rs +++ b/crates/tauri/src/manager/mod.rs @@ -596,60 +596,51 @@ impl AppManager { feature = "tracing", tracing::instrument("app::emit::to", skip(self, target, payload), fields(target)) )] - pub(crate) fn emit_to( + pub(crate) fn emit_to( &self, - target: I, + target: EventTarget, event: EventName<&str>, payload: EmitPayload<'_, S>, ) -> crate::Result<()> where - I: Into, S: Serialize, { - let target = target.into(); #[cfg(feature = "tracing")] tracing::Span::current().record("target", format!("{target:?}")); + fn filter_target(target: &EventTarget, candidate: &EventTarget) -> bool { + match target { + // if targeting any label, filter matching labels + EventTarget::AnyLabel { label } => match candidate { + EventTarget::Window { label: l } + | EventTarget::Webview { label: l } + | EventTarget::WebviewWindow { label: l } + | EventTarget::AnyLabel { label: l } => l == label, + _ => false, + }, + EventTarget::Window { label } => match candidate { + EventTarget::AnyLabel { label: l } | EventTarget::Window { label: l } => l == label, + _ => false, + }, + EventTarget::Webview { label } => match candidate { + EventTarget::AnyLabel { label: l } | EventTarget::Webview { label: l } => l == label, + _ => false, + }, + EventTarget::WebviewWindow { label } => match candidate { + EventTarget::AnyLabel { label: l } | EventTarget::WebviewWindow { label: l } => { + l == label + } + _ => false, + }, + // otherwise match same target + _ => target == candidate, + } + } + match target { // if targeting all, emit to all using emit without filter EventTarget::Any => self.emit(event, payload), - - // if targeting any label, emit using emit_filter and filter labels - EventTarget::AnyLabel { - label: target_label, - } => self.emit_filter(event, payload, |t| match t { - EventTarget::Window { label } - | EventTarget::Webview { label } - | EventTarget::WebviewWindow { label } - | EventTarget::AnyLabel { label } => label == &target_label, - _ => false, - }), - - EventTarget::Window { - label: target_label, - } => self.emit_filter(event, payload, |t| match t { - EventTarget::AnyLabel { label } | EventTarget::Window { label } => label == &target_label, - _ => false, - }), - - EventTarget::Webview { - label: target_label, - } => self.emit_filter(event, payload, |t| match t { - EventTarget::AnyLabel { label } | EventTarget::Webview { label } => label == &target_label, - _ => false, - }), - - EventTarget::WebviewWindow { - label: target_label, - } => self.emit_filter(event, payload, |t| match t { - EventTarget::AnyLabel { label } | EventTarget::WebviewWindow { label } => { - label == &target_label - } - _ => false, - }), - - // otherwise match same target - _ => self.emit_filter(event, payload, |t| t == &target), + target => self.emit_filter(event, payload, |t| filter_target(&target, t)), } }