@@ -57,6 +57,9 @@ use wry::{
5757 } ,
5858} ;
5959
60+ #[ cfg( target_os = "windows" ) ]
61+ use wry:: webview:: WebviewExtWindows ;
62+
6063use std:: {
6164 collections:: HashMap ,
6265 convert:: TryFrom ,
@@ -281,7 +284,6 @@ impl<'a> From<&WryWindowEvent<'a>> for WindowEventWrapper {
281284 }
282285 WryWindowEvent :: CloseRequested => WindowEvent :: CloseRequested ,
283286 WryWindowEvent :: Destroyed => WindowEvent :: Destroyed ,
284- WryWindowEvent :: Focused ( focused) => WindowEvent :: Focused ( * focused) ,
285287 WryWindowEvent :: ScaleFactorChanged {
286288 scale_factor,
287289 new_inner_size,
@@ -295,6 +297,15 @@ impl<'a> From<&WryWindowEvent<'a>> for WindowEventWrapper {
295297 }
296298}
297299
300+ impl From < & WebviewEvent > for WindowEventWrapper {
301+ fn from ( event : & WebviewEvent ) -> Self {
302+ let event = match event {
303+ WebviewEvent :: Focused ( focused) => WindowEvent :: Focused ( * focused) ,
304+ } ;
305+ Self ( Some ( event) )
306+ }
307+ }
308+
298309pub struct MonitorHandleWrapper ( MonitorHandle ) ;
299310
300311impl From < MonitorHandleWrapper > for Monitor {
@@ -690,9 +701,17 @@ enum WindowMessage {
690701#[ derive( Debug , Clone ) ]
691702enum WebviewMessage {
692703 EvaluateScript ( String ) ,
704+ #[ allow( dead_code) ]
705+ WebviewEvent ( WebviewEvent ) ,
693706 Print ,
694707}
695708
709+ #[ allow( dead_code) ]
710+ #[ derive( Debug , Clone ) ]
711+ enum WebviewEvent {
712+ Focused ( bool ) ,
713+ }
714+
696715#[ cfg( feature = "system-tray" ) ]
697716#[ derive( Clone ) ]
698717pub ( crate ) enum TrayMessage {
@@ -1330,6 +1349,33 @@ impl Runtime for Wry {
13301349 pending,
13311350 ) ?;
13321351
1352+ #[ cfg( target_os = "windows" ) ]
1353+ {
1354+ let id = webview. inner . window ( ) . id ( ) ;
1355+ if let Some ( controller) = webview. inner . controller ( ) {
1356+ let proxy = self . event_loop . create_proxy ( ) ;
1357+ controller
1358+ . add_got_focus ( move |_| {
1359+ let _ = proxy. send_event ( Message :: Webview (
1360+ id,
1361+ WebviewMessage :: WebviewEvent ( WebviewEvent :: Focused ( true ) ) ,
1362+ ) ) ;
1363+ Ok ( ( ) )
1364+ } )
1365+ . unwrap ( ) ;
1366+ let proxy = self . event_loop . create_proxy ( ) ;
1367+ controller
1368+ . add_lost_focus ( move |_| {
1369+ let _ = proxy. send_event ( Message :: Webview (
1370+ id,
1371+ WebviewMessage :: WebviewEvent ( WebviewEvent :: Focused ( false ) ) ,
1372+ ) ) ;
1373+ Ok ( ( ) )
1374+ } )
1375+ . unwrap ( ) ;
1376+ } ;
1377+ }
1378+
13331379 let dispatcher = WryDispatcher {
13341380 window_id : webview. inner . window ( ) . id ( ) ,
13351381 context : DispatcherContext {
@@ -1567,6 +1613,12 @@ fn handle_event_loop(
15671613 Event :: WindowEvent {
15681614 event, window_id, ..
15691615 } => {
1616+ if event == WryWindowEvent :: Focused ( true ) {
1617+ if let Some ( webview) = webviews. get ( & window_id) {
1618+ webview. inner . focus ( ) ;
1619+ } ;
1620+ }
1621+
15701622 if let Some ( event) = WindowEventWrapper :: from ( & event) . 0 {
15711623 for handler in window_event_listeners
15721624 . lock ( )
@@ -1768,6 +1820,21 @@ fn handle_event_loop(
17681820 WebviewMessage :: Print => {
17691821 let _ = webview. inner . print ( ) ;
17701822 }
1823+ WebviewMessage :: WebviewEvent ( event) => {
1824+ if let Some ( event) = WindowEventWrapper :: from ( & event) . 0 {
1825+ for handler in window_event_listeners
1826+ . lock ( )
1827+ . unwrap ( )
1828+ . get ( & id)
1829+ . unwrap ( )
1830+ . lock ( )
1831+ . unwrap ( )
1832+ . values ( )
1833+ {
1834+ handler ( & event) ;
1835+ }
1836+ }
1837+ }
17711838 }
17721839 }
17731840 }
0 commit comments