@@ -52,7 +52,7 @@ use std::{
5252 convert:: TryFrom ,
5353 fs:: read,
5454 sync:: {
55- mpsc:: { channel, Receiver , Sender } ,
55+ mpsc:: { channel, Sender } ,
5656 Arc , Mutex , MutexGuard ,
5757 } ,
5858} ;
@@ -62,9 +62,9 @@ mod menu;
6262#[ cfg( any( feature = "menu" , feature = "system-tray" ) ) ]
6363use menu:: * ;
6464
65+ type MainTask = Arc < Mutex < Option < Box < dyn FnOnce ( ) + Send > > > > ;
6566type CreateWebviewHandler =
6667 Box < dyn FnOnce ( & EventLoopWindowTarget < Message > ) -> Result < WebviewWrapper > + Send > ;
67- type MainThreadTask = Box < dyn FnOnce ( ) + Send > ;
6868type WindowEventHandler = Box < dyn Fn ( & WindowEvent ) + Send > ;
6969type WindowEventListeners = Arc < Mutex < HashMap < Uuid , WindowEventHandler > > > ;
7070
@@ -494,6 +494,7 @@ pub(crate) enum TrayMessage {
494494
495495#[ derive( Clone ) ]
496496pub ( crate ) enum Message {
497+ Task ( MainTask ) ,
497498 Window ( WindowId , WindowMessage ) ,
498499 Webview ( WindowId , WebviewMessage ) ,
499500 #[ cfg( feature = "system-tray" ) ]
@@ -504,7 +505,6 @@ pub(crate) enum Message {
504505#[ derive( Clone ) ]
505506struct DispatcherContext {
506507 proxy : EventLoopProxy < Message > ,
507- task_tx : Sender < MainThreadTask > ,
508508 window_event_listeners : WindowEventListeners ,
509509 #[ cfg( feature = "menu" ) ]
510510 menu_event_listeners : MenuEventListeners ,
@@ -536,8 +536,8 @@ impl Dispatch for WryDispatcher {
536536 fn run_on_main_thread < F : FnOnce ( ) + Send + ' static > ( & self , f : F ) -> Result < ( ) > {
537537 self
538538 . context
539- . task_tx
540- . send ( Box :: new ( f) )
539+ . proxy
540+ . send_event ( Message :: Task ( Arc :: new ( Mutex :: new ( Some ( Box :: new ( f) ) ) ) ) )
541541 . map_err ( |_| Error :: FailedToSendMessage )
542542 }
543543
@@ -908,11 +908,9 @@ struct WebviewWrapper {
908908pub struct Wry {
909909 event_loop : EventLoop < Message > ,
910910 webviews : Arc < Mutex < HashMap < WindowId , WebviewWrapper > > > ,
911- task_tx : Sender < MainThreadTask > ,
912911 window_event_listeners : WindowEventListeners ,
913912 #[ cfg( feature = "menu" ) ]
914913 menu_event_listeners : MenuEventListeners ,
915- task_rx : Arc < Receiver < MainThreadTask > > ,
916914 #[ cfg( feature = "system-tray" ) ]
917915 tray_context : TrayContext ,
918916}
@@ -971,12 +969,9 @@ impl Runtime for Wry {
971969
972970 fn new ( ) -> Result < Self > {
973971 let event_loop = EventLoop :: < Message > :: with_user_event ( ) ;
974- let ( task_tx, task_rx) = channel ( ) ;
975972 Ok ( Self {
976973 event_loop,
977974 webviews : Default :: default ( ) ,
978- task_tx,
979- task_rx : Arc :: new ( task_rx) ,
980975 window_event_listeners : Default :: default ( ) ,
981976 #[ cfg( feature = "menu" ) ]
982977 menu_event_listeners : Default :: default ( ) ,
@@ -989,7 +984,6 @@ impl Runtime for Wry {
989984 WryHandle {
990985 dispatcher_context : DispatcherContext {
991986 proxy : self . event_loop . create_proxy ( ) ,
992- task_tx : self . task_tx . clone ( ) ,
993987 window_event_listeners : self . window_event_listeners . clone ( ) ,
994988 #[ cfg( feature = "menu" ) ]
995989 menu_event_listeners : self . menu_event_listeners . clone ( ) ,
@@ -1007,7 +1001,6 @@ impl Runtime for Wry {
10071001 & self . event_loop ,
10081002 DispatcherContext {
10091003 proxy : proxy. clone ( ) ,
1010- task_tx : self . task_tx . clone ( ) ,
10111004 window_event_listeners : self . window_event_listeners . clone ( ) ,
10121005 #[ cfg( feature = "menu" ) ]
10131006 menu_event_listeners : self . menu_event_listeners . clone ( ) ,
@@ -1019,7 +1012,6 @@ impl Runtime for Wry {
10191012 window_id : webview. inner . window ( ) . id ( ) ,
10201013 context : DispatcherContext {
10211014 proxy,
1022- task_tx : self . task_tx . clone ( ) ,
10231015 window_event_listeners : self . window_event_listeners . clone ( ) ,
10241016 #[ cfg( feature = "menu" ) ]
10251017 menu_event_listeners : self . menu_event_listeners . clone ( ) ,
@@ -1077,7 +1069,6 @@ impl Runtime for Wry {
10771069 fn run_iteration ( & mut self ) -> RunIteration {
10781070 use wry:: application:: platform:: run_return:: EventLoopExtRunReturn ;
10791071 let webviews = self . webviews . clone ( ) ;
1080- let task_rx = self . task_rx . clone ( ) ;
10811072 let window_event_listeners = self . window_event_listeners . clone ( ) ;
10821073 #[ cfg( feature = "menu" ) ]
10831074 let menu_event_listeners = self . menu_event_listeners . clone ( ) ;
@@ -1099,7 +1090,6 @@ impl Runtime for Wry {
10991090 EventLoopIterationContext {
11001091 callback : None ,
11011092 webviews : webviews. lock ( ) . expect ( "poisoned webview collection" ) ,
1102- task_rx : task_rx. clone ( ) ,
11031093 window_event_listeners : window_event_listeners. clone ( ) ,
11041094 #[ cfg( feature = "menu" ) ]
11051095 menu_event_listeners : menu_event_listeners. clone ( ) ,
@@ -1114,7 +1104,6 @@ impl Runtime for Wry {
11141104
11151105 fn run < F : Fn ( ) + ' static > ( self , callback : F ) {
11161106 let webviews = self . webviews . clone ( ) ;
1117- let task_rx = self . task_rx ;
11181107 let window_event_listeners = self . window_event_listeners . clone ( ) ;
11191108 #[ cfg( feature = "menu" ) ]
11201109 let menu_event_listeners = self . menu_event_listeners . clone ( ) ;
@@ -1129,7 +1118,6 @@ impl Runtime for Wry {
11291118 EventLoopIterationContext {
11301119 callback : Some ( & callback) ,
11311120 webviews : webviews. lock ( ) . expect ( "poisoned webview collection" ) ,
1132- task_rx : task_rx. clone ( ) ,
11331121 window_event_listeners : window_event_listeners. clone ( ) ,
11341122 #[ cfg( feature = "menu" ) ]
11351123 menu_event_listeners : menu_event_listeners. clone ( ) ,
@@ -1144,7 +1132,6 @@ impl Runtime for Wry {
11441132struct EventLoopIterationContext < ' a > {
11451133 callback : Option < & ' a ( dyn Fn ( ) + ' static ) > ,
11461134 webviews : MutexGuard < ' a , HashMap < WindowId , WebviewWrapper > > ,
1147- task_rx : Arc < Receiver < MainThreadTask > > ,
11481135 window_event_listeners : WindowEventListeners ,
11491136 #[ cfg( feature = "menu" ) ]
11501137 menu_event_listeners : MenuEventListeners ,
@@ -1161,7 +1148,6 @@ fn handle_event_loop(
11611148 let EventLoopIterationContext {
11621149 callback,
11631150 mut webviews,
1164- task_rx,
11651151 window_event_listeners,
11661152 #[ cfg( feature = "menu" ) ]
11671153 menu_event_listeners,
@@ -1176,10 +1162,6 @@ fn handle_event_loop(
11761162 }
11771163 }
11781164
1179- while let Ok ( task) = task_rx. try_recv ( ) {
1180- task ( ) ;
1181- }
1182-
11831165 match event {
11841166 #[ cfg( feature = "menu" ) ]
11851167 Event :: MenuEvent {
@@ -1247,6 +1229,11 @@ fn handle_event_loop(
12471229 }
12481230 }
12491231 Event :: UserEvent ( message) => match message {
1232+ Message :: Task ( task) => {
1233+ if let Some ( task) = task. lock ( ) . unwrap ( ) . take ( ) {
1234+ task ( ) ;
1235+ }
1236+ }
12501237 Message :: Window ( id, window_message) => {
12511238 if let Some ( webview) = webviews. get_mut ( & id) {
12521239 let window = webview. inner . window ( ) ;
0 commit comments