Skip to content

Commit cb640c8

Browse files
fix(runtime-wry): propagate wry file drop event to tao event loop, closes #8206 (#8393)
* fix(runtime-wry): propagate wry file drop event to tao event loop * fix build * always block default OS file drop behavior * Update .changes/runevent-filedrop.md [skip ci] --------- Co-authored-by: Lucas Nogueira <lucas@tauri.studio> Co-authored-by: Lucas Fernandes Nogueira <lucas@tauri.app>
1 parent af565c2 commit cb640c8

File tree

2 files changed

+24
-24
lines changed

2 files changed

+24
-24
lines changed

.changes/runevent-filedrop.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'tauri': 'patch:bug'
3+
'tauri-runtime-wry': 'patch'
4+
---
5+
6+
Fix `RunEvent::WindowEvent(event: WindowEvent::FileDrop(FileDropEvent))` never triggered and always prevent default OS behavior when `disable_file_drop_handler` is not used.

core/tauri-runtime-wry/src/lib.rs

+18-24
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ use std::{
104104

105105
pub type WebviewId = u32;
106106
type IpcHandler = dyn Fn(String) + 'static;
107-
type FileDropHandler = dyn Fn(WryFileDropEvent) -> bool + 'static;
108107

109108
mod webview;
110109
pub use webview::Webview;
@@ -373,10 +372,11 @@ impl<'a> From<&TaoWindowEvent<'a>> for WindowEventWrapper {
373372
}
374373
}
375374

376-
impl From<&WebviewEvent> for WindowEventWrapper {
377-
fn from(event: &WebviewEvent) -> Self {
375+
impl From<WebviewEvent> for WindowEventWrapper {
376+
fn from(event: WebviewEvent) -> Self {
378377
let event = match event {
379-
WebviewEvent::Focused(focused) => WindowEvent::Focused(*focused),
378+
WebviewEvent::Focused(focused) => WindowEvent::Focused(focused),
379+
WebviewEvent::FileDrop(event) => WindowEvent::FileDrop(event),
380380
};
381381
Self(Some(event))
382382
}
@@ -1081,6 +1081,7 @@ pub enum WebviewMessage {
10811081
#[allow(dead_code)]
10821082
#[derive(Debug, Clone)]
10831083
pub enum WebviewEvent {
1084+
FileDrop(FileDropEvent),
10841085
Focused(bool),
10851086
}
10861087

@@ -2537,7 +2538,7 @@ fn handle_event_loop<T: UserEvent>(
25372538
}
25382539

25392540
Event::UserEvent(Message::Webview(id, WebviewMessage::WebviewEvent(event))) => {
2540-
if let Some(event) = WindowEventWrapper::from(&event).0 {
2541+
if let Some(event) = WindowEventWrapper::from(event).0 {
25412542
let windows = windows.borrow();
25422543
let window = windows.get(&id);
25432544
if let Some(window) = window {
@@ -2742,7 +2743,7 @@ fn create_webview<T: UserEvent, F: Fn(RawWindow) + Send + 'static>(
27422743

27432744
#[cfg(windows)]
27442745
let window_theme = window_builder.inner.window.preferred_theme;
2745-
#[cfg(windows)]
2746+
27462747
let proxy = context.proxy.clone();
27472748

27482749
#[cfg(target_os = "macos")]
@@ -2830,10 +2831,19 @@ fn create_webview<T: UserEvent, F: Fn(RawWindow) + Send + 'static>(
28302831
.unwrap() // safe to unwrap because we validate the URL beforehand
28312832
.with_transparent(is_window_transparent)
28322833
.with_accept_first_mouse(webview_attributes.accept_first_mouse);
2834+
28332835
if webview_attributes.file_drop_handler_enabled {
2834-
webview_builder = webview_builder
2835-
.with_file_drop_handler(create_file_drop_handler(window_event_listeners.clone()));
2836+
let proxy = proxy.clone();
2837+
webview_builder = webview_builder.with_file_drop_handler(move |event| {
2838+
let event: FileDropEvent = FileDropEventWrapper(event).into();
2839+
let _ = proxy.send_event(Message::Webview(
2840+
window_id,
2841+
WebviewMessage::WebviewEvent(WebviewEvent::FileDrop(event)),
2842+
));
2843+
true
2844+
});
28362845
}
2846+
28372847
if let Some(navigation_handler) = pending.navigation_handler {
28382848
webview_builder = webview_builder.with_navigation_handler(move |url| {
28392849
Url::parse(&url)
@@ -3029,19 +3039,3 @@ fn create_ipc_handler<T: UserEvent>(
30293039
);
30303040
})
30313041
}
3032-
3033-
/// Create a wry file drop handler.
3034-
fn create_file_drop_handler(window_event_listeners: WindowEventListeners) -> Box<FileDropHandler> {
3035-
Box::new(move |event| {
3036-
let event: FileDropEvent = FileDropEventWrapper(event).into();
3037-
let window_event = WindowEvent::FileDrop(event);
3038-
let listeners_map = window_event_listeners.lock().unwrap();
3039-
let has_listener = !listeners_map.is_empty();
3040-
let handlers = listeners_map.values();
3041-
for listener in handlers {
3042-
listener(&window_event);
3043-
}
3044-
// block the default OS action on file drop if we had a listener
3045-
has_listener
3046-
})
3047-
}

0 commit comments

Comments
 (0)