@@ -95,16 +95,32 @@ impl<P: Params> GlobalWindowEvent<P> {
9595
9696crate :: manager:: default_args! {
9797 /// A handle to the currently running application.
98+ ///
99+ /// This type implements [`Manager`] which allows for manipulation of global application items.
98100 pub struct AppHandle <P : Params > {
101+ runtime_handle: <P :: Runtime as Runtime >:: Handle ,
99102 manager: WindowManager <P >,
100103 }
101104}
102105
106+ impl < P : Params > Clone for AppHandle < P > {
107+ fn clone ( & self ) -> Self {
108+ Self {
109+ runtime_handle : self . runtime_handle . clone ( ) ,
110+ manager : self . manager . clone ( ) ,
111+ }
112+ }
113+ }
114+
103115impl < P : Params > Manager < P > for AppHandle < P > { }
104116impl < P : Params > ManagerBase < P > for AppHandle < P > {
105117 fn manager ( & self ) -> & WindowManager < P > {
106118 & self . manager
107119 }
120+
121+ fn runtime ( & self ) -> RuntimeOrDispatch < ' _ , P > {
122+ RuntimeOrDispatch :: RuntimeHandle ( self . runtime_handle . clone ( ) )
123+ }
108124}
109125
110126crate :: manager:: default_args! {
@@ -122,29 +138,51 @@ impl<P: Params> ManagerBase<P> for App<P> {
122138 fn manager ( & self ) -> & WindowManager < P > {
123139 & self . manager
124140 }
141+
142+ fn runtime ( & self ) -> RuntimeOrDispatch < ' _ , P > {
143+ RuntimeOrDispatch :: Runtime ( & self . runtime )
144+ }
145+ }
146+
147+ macro_rules! shared_app_impl {
148+ ( $app: ty) => {
149+ impl <P : Params > $app {
150+ /// Creates a new webview window.
151+ pub fn create_window<F >( & self , label: P :: Label , url: WindowUrl , setup: F ) -> crate :: Result <( ) >
152+ where
153+ F : FnOnce (
154+ <<P :: Runtime as Runtime >:: Dispatcher as Dispatch >:: WindowBuilder ,
155+ WebviewAttributes ,
156+ ) -> (
157+ <<P :: Runtime as Runtime >:: Dispatcher as Dispatch >:: WindowBuilder ,
158+ WebviewAttributes ,
159+ ) ,
160+ {
161+ let ( window_builder, webview_attributes) = setup(
162+ <<P :: Runtime as Runtime >:: Dispatcher as Dispatch >:: WindowBuilder :: new( ) ,
163+ WebviewAttributes :: new( url) ,
164+ ) ;
165+ self . create_new_window( PendingWindow :: new(
166+ window_builder,
167+ webview_attributes,
168+ label,
169+ ) ) ?;
170+ Ok ( ( ) )
171+ }
172+ }
173+ } ;
125174}
126175
176+ shared_app_impl ! ( App <P >) ;
177+ shared_app_impl ! ( AppHandle <P >) ;
178+
127179impl < P : Params > App < P > {
128- /// Creates a new webview window.
129- pub fn create_window < F > ( & mut self , label : P :: Label , url : WindowUrl , setup : F ) -> crate :: Result < ( ) >
130- where
131- F : FnOnce (
132- <<P :: Runtime as Runtime >:: Dispatcher as Dispatch >:: WindowBuilder ,
133- WebviewAttributes ,
134- ) -> (
135- <<P :: Runtime as Runtime >:: Dispatcher as Dispatch >:: WindowBuilder ,
136- WebviewAttributes ,
137- ) ,
138- {
139- let ( window_builder, webview_attributes) = setup (
140- <<P :: Runtime as Runtime >:: Dispatcher as Dispatch >:: WindowBuilder :: new ( ) ,
141- WebviewAttributes :: new ( url) ,
142- ) ;
143- self . create_new_window (
144- RuntimeOrDispatch :: Runtime ( & self . runtime ) ,
145- PendingWindow :: new ( window_builder, webview_attributes, label) ,
146- ) ?;
147- Ok ( ( ) )
180+ /// Gets a handle to the application instance.
181+ pub fn handle ( & self ) -> AppHandle < P > {
182+ AppHandle {
183+ runtime_handle : self . runtime . handle ( ) ,
184+ manager : self . manager . clone ( ) ,
185+ }
148186 }
149187}
150188
@@ -577,17 +615,16 @@ where
577615 )
578616 . expect ( "failed to run tray" ) ;
579617 for listener in self . system_tray_event_listeners {
580- let app_handle = AppHandle {
581- manager : app. manager . clone ( ) ,
582- } ;
618+ let app_handle = app. handle ( ) ;
583619 let ids = ids. clone ( ) ;
620+ let listener = Arc :: new ( std:: sync:: Mutex :: new ( listener) ) ;
584621 app. runtime . on_system_tray_event ( move |event| {
585- listener (
586- & app_handle ,
587- SystemTrayEvent {
588- menu_item_id : ids . get ( & event . menu_item_id ) . unwrap ( ) . clone ( ) ,
589- } ,
590- ) ;
622+ let app_handle = app_handle . clone ( ) ;
623+ let menu_item_id = ids . get ( & event . menu_item_id ) . unwrap ( ) . clone ( ) ;
624+ let listener = listener . clone ( ) ;
625+ crate :: async_runtime :: spawn ( async move {
626+ listener . lock ( ) . unwrap ( ) ( & app_handle , SystemTrayEvent { menu_item_id } ) ;
627+ } ) ;
591628 } ) ;
592629 }
593630 }
0 commit comments