fix(core): trigger `tauri://*` events to Rust listeners, closes #2901 (#2902)

This commit is contained in:
Lucas Fernandes Nogueira 2021-11-16 16:41:45 -03:00 committed by GitHub
parent 000d126e0e
commit 4c4ab1eb8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 24 deletions

View File

@ -0,0 +1,5 @@
---
"tauri": patch
---
Emit `tauri://*` events to Rust listeners.

View File

@ -493,9 +493,11 @@ impl<R: Runtime> WindowManager<R> {
crate::async_runtime::block_on(async move {
let window = Window::new(manager.clone(), window, app_handle);
let _ = match event {
FileDropEvent::Hovered(paths) => window.emit("tauri://file-drop-hover", Some(paths)),
FileDropEvent::Dropped(paths) => window.emit("tauri://file-drop", Some(paths)),
FileDropEvent::Cancelled => window.emit("tauri://file-drop-cancelled", Some(())),
FileDropEvent::Hovered(paths) => {
window.emit_and_trigger("tauri://file-drop-hover", paths)
}
FileDropEvent::Dropped(paths) => window.emit_and_trigger("tauri://file-drop", paths),
FileDropEvent::Cancelled => window.emit_and_trigger("tauri://file-drop-cancelled", ()),
_ => unimplemented!(),
};
});
@ -796,13 +798,13 @@ fn on_window_event<R: Runtime>(
event: &WindowEvent,
) -> crate::Result<()> {
match event {
WindowEvent::Resized(size) => window.emit(WINDOW_RESIZED_EVENT, Some(size))?,
WindowEvent::Moved(position) => window.emit(WINDOW_MOVED_EVENT, Some(position))?,
WindowEvent::Resized(size) => window.emit_and_trigger(WINDOW_RESIZED_EVENT, size)?,
WindowEvent::Moved(position) => window.emit_and_trigger(WINDOW_MOVED_EVENT, position)?,
WindowEvent::CloseRequested => {
window.emit(WINDOW_CLOSE_REQUESTED_EVENT, Some(()))?;
window.emit_and_trigger(WINDOW_CLOSE_REQUESTED_EVENT, ())?;
}
WindowEvent::Destroyed => {
window.emit(WINDOW_DESTROYED_EVENT, Some(()))?;
window.emit_and_trigger(WINDOW_DESTROYED_EVENT, ())?;
let label = window.label();
for window in manager.inner.windows.lock().unwrap().values() {
window.eval(&format!(
@ -811,24 +813,24 @@ fn on_window_event<R: Runtime>(
))?;
}
}
WindowEvent::Focused(focused) => window.emit(
WindowEvent::Focused(focused) => window.emit_and_trigger(
if *focused {
WINDOW_FOCUS_EVENT
} else {
WINDOW_BLUR_EVENT
},
Some(()),
(),
)?,
WindowEvent::ScaleFactorChanged {
scale_factor,
new_inner_size,
..
} => window.emit(
} => window.emit_and_trigger(
WINDOW_SCALE_FACTOR_CHANGED_EVENT,
Some(ScaleFactorChanged {
ScaleFactorChanged {
scale_factor: *scale_factor,
size: *new_inner_size,
}),
},
)?,
_ => unimplemented!(),
}
@ -843,5 +845,5 @@ struct ScaleFactorChanged {
}
fn on_menu_event<R: Runtime>(window: &Window<R>, event: &MenuEvent) -> crate::Result<()> {
window.emit(MENU_EVENT, Some(event.menu_item_id.clone()))
window.emit_and_trigger(MENU_EVENT, event.menu_item_id.clone())
}

View File

@ -461,13 +461,13 @@ pub(crate) fn listener<R: Runtime>(
let body = updater.body.clone().unwrap_or_else(|| String::from(""));
// Emit `tauri://update-available`
let _ = window.emit(
let _ = window.emit_and_trigger(
EVENT_UPDATE_AVAILABLE,
Some(UpdateManifest {
UpdateManifest {
body,
date: updater.date.clone(),
version: updater.version.clone(),
}),
},
);
// Listen for `tauri://update-install`
@ -510,12 +510,12 @@ pub(crate) fn listener<R: Runtime>(
// Send a status update via `tauri://update-status` event.
fn send_status_update<R: Runtime>(window: Window<R>, status: &str, error: Option<String>) {
let _ = window.emit(
let _ = window.emit_and_trigger(
EVENT_STATUS_UPDATE,
Some(StatusEvent {
StatusEvent {
error,
status: String::from(status),
}),
},
);
}

View File

@ -266,7 +266,15 @@ impl<R: Runtime> Window<R> {
&self.window.label
}
/// Emits an event to the current window.
/// Emits an event to both the JavaScript and the Rust listeners.
pub fn emit_and_trigger<S: Serialize>(&self, event: &str, payload: S) -> crate::Result<()> {
self.trigger(event, Some(serde_json::to_string(&payload)?));
self.emit(event, payload)
}
/// Emits an event to the JavaScript listeners on the current window.
///
/// The event is only delivered to listeners that used the `appWindow.listen` method on the @tauri-apps/api `window` module.
pub fn emit<S: Serialize>(&self, event: &str, payload: S) -> crate::Result<()> {
self.eval(&format!(
"window['{}']({{event: {}, payload: {}}})",
@ -274,16 +282,21 @@ impl<R: Runtime> Window<R> {
serde_json::to_string(event)?,
serde_json::to_value(payload)?,
))?;
Ok(())
}
/// Emits an event on all windows except this one.
/// Emits an event to the JavaScript listeners on all windows except this one.
///
/// The event is only delivered to listeners that used the `appWindow.listen` function from the `@tauri-apps/api `window` module.
pub fn emit_others<S: Serialize + Clone>(&self, event: &str, payload: S) -> crate::Result<()> {
self.manager.emit_filter(event, payload, |w| w != self)
}
/// Listen to an event on this window.
///
/// This listener only receives events that are triggered using the
/// [`trigger`](Window#method.trigger) and [`emit_and_trigger`](Window#method.emit_and_trigger) methods or
/// the `appWindow.emit` function from the @tauri-apps/api `window` module.
pub fn listen<F>(&self, event: impl Into<String>, handler: F) -> EventHandler
where
F: Fn(Event) + Send + 'static,
@ -297,7 +310,7 @@ impl<R: Runtime> Window<R> {
self.manager.unlisten(handler_id)
}
/// Listen to a an event on this window a single time.
/// Listen to an event on this window a single time.
pub fn once<F>(&self, event: impl Into<String>, handler: F) -> EventHandler
where
F: Fn(Event) + Send + 'static,
@ -306,7 +319,9 @@ impl<R: Runtime> Window<R> {
self.manager.once(event.into(), Some(label), handler)
}
/// Triggers an event on this window.
/// Triggers an event to the Rust listeners on this window.
///
/// The event is only delivered to listeners that used the [`listen`](Window#method.listen) method.
pub fn trigger(&self, event: &str, data: Option<String>) {
let label = self.window.label.clone();
self.manager.trigger(event, Some(label), data)