@@ -104,7 +104,6 @@ use std::{
104
104
105
105
pub type WebviewId = u32 ;
106
106
type IpcHandler = dyn Fn ( String ) + ' static ;
107
- type FileDropHandler = dyn Fn ( WryFileDropEvent ) -> bool + ' static ;
108
107
109
108
mod webview;
110
109
pub use webview:: Webview ;
@@ -373,10 +372,11 @@ impl<'a> From<&TaoWindowEvent<'a>> for WindowEventWrapper {
373
372
}
374
373
}
375
374
376
- impl From < & WebviewEvent > for WindowEventWrapper {
377
- fn from ( event : & WebviewEvent ) -> Self {
375
+ impl From < WebviewEvent > for WindowEventWrapper {
376
+ fn from ( event : WebviewEvent ) -> Self {
378
377
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) ,
380
380
} ;
381
381
Self ( Some ( event) )
382
382
}
@@ -1081,6 +1081,7 @@ pub enum WebviewMessage {
1081
1081
#[ allow( dead_code) ]
1082
1082
#[ derive( Debug , Clone ) ]
1083
1083
pub enum WebviewEvent {
1084
+ FileDrop ( FileDropEvent ) ,
1084
1085
Focused ( bool ) ,
1085
1086
}
1086
1087
@@ -2537,7 +2538,7 @@ fn handle_event_loop<T: UserEvent>(
2537
2538
}
2538
2539
2539
2540
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 {
2541
2542
let windows = windows. borrow ( ) ;
2542
2543
let window = windows. get ( & id) ;
2543
2544
if let Some ( window) = window {
@@ -2742,7 +2743,7 @@ fn create_webview<T: UserEvent, F: Fn(RawWindow) + Send + 'static>(
2742
2743
2743
2744
#[ cfg( windows) ]
2744
2745
let window_theme = window_builder. inner . window . preferred_theme ;
2745
- # [ cfg ( windows ) ]
2746
+
2746
2747
let proxy = context. proxy . clone ( ) ;
2747
2748
2748
2749
#[ cfg( target_os = "macos" ) ]
@@ -2830,10 +2831,19 @@ fn create_webview<T: UserEvent, F: Fn(RawWindow) + Send + 'static>(
2830
2831
. unwrap ( ) // safe to unwrap because we validate the URL beforehand
2831
2832
. with_transparent ( is_window_transparent)
2832
2833
. with_accept_first_mouse ( webview_attributes. accept_first_mouse ) ;
2834
+
2833
2835
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
+ } ) ;
2836
2845
}
2846
+
2837
2847
if let Some ( navigation_handler) = pending. navigation_handler {
2838
2848
webview_builder = webview_builder. with_navigation_handler ( move |url| {
2839
2849
Url :: parse ( & url)
@@ -3029,19 +3039,3 @@ fn create_ipc_handler<T: UserEvent>(
3029
3039
) ;
3030
3040
} )
3031
3041
}
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