@@ -104,7 +104,6 @@ use std::{
104104
105105pub type WebviewId = u32 ;
106106type IpcHandler = dyn Fn ( String ) + ' static ;
107- type FileDropHandler = dyn Fn ( WryFileDropEvent ) -> bool + ' static ;
108107
109108mod webview;
110109pub 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 ) ]
10831083pub 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