@@ -30,7 +30,7 @@ use crate::hooks::IsolationJavascript;
3030use crate :: pattern:: { format_real_schema, PatternJavascript } ;
3131use crate :: {
3232 app:: { AppHandle , GlobalWindowEvent , GlobalWindowEventListener } ,
33- event:: { is_event_name_valid , Event , EventHandler , Listeners } ,
33+ event:: { assert_event_name_is_valid , Event , EventHandler , Listeners } ,
3434 hooks:: { InvokeHandler , InvokePayload , InvokeResponder , OnPageLoad , PageLoadPayload } ,
3535 plugin:: PluginStore ,
3636 runtime:: {
@@ -850,6 +850,7 @@ impl<R: Runtime> WindowManager<R> {
850850 self . event_listeners_object_name( ) ,
851851 "eventName" . into( ) ,
852852 0 ,
853+ None ,
853854 "window['_' + window.__TAURI__.transformCallback(cb) ]" . into( )
854855 )
855856 ) ,
@@ -865,18 +866,22 @@ impl<R: Runtime> WindowManager<R> {
865866 fn event_initialization_script ( & self ) -> String {
866867 return format ! (
867868 "
868- window['{function}'] = function (eventData) {{
869- const listeners = (window['{listeners}'] && window['{listeners}'][eventData.event]) || []
870-
871- for (let i = listeners.length - 1; i >= 0; i--) {{
872- const listener = listeners[i]
873- eventData.id = listener.id
874- listener.handler(eventData)
875- }}
876- }}
869+ Object.defineProperty(window, '{function}', {{
870+ value: function (eventData) {{
871+ const listeners = (window['{listeners}'] && window['{listeners}'][eventData.event]) || []
872+
873+ for (let i = listeners.length - 1; i >= 0; i--) {{
874+ const listener = listeners[i]
875+ if (listener.windowLabel === null || listener.windowLabel === eventData.windowLabel) {{
876+ eventData.id = listener.id
877+ listener.handler(eventData)
878+ }}
879+ }}
880+ }}
881+ }});
877882 " ,
878- function = self . inner . listeners . function_name ( ) ,
879- listeners = self . inner . listeners . listeners_object_name ( )
883+ function = self . event_emit_function_name ( ) ,
884+ listeners = self . event_listeners_object_name ( )
880885 ) ;
881886 }
882887}
@@ -1088,17 +1093,23 @@ impl<R: Runtime> WindowManager<R> {
10881093 self . windows_lock ( ) . remove ( label) ;
10891094 }
10901095
1091- pub fn emit_filter < S , F > ( & self , event : & str , payload : S , filter : F ) -> crate :: Result < ( ) >
1096+ pub fn emit_filter < S , F > (
1097+ & self ,
1098+ event : & str ,
1099+ source_window_label : Option < & str > ,
1100+ payload : S ,
1101+ filter : F ,
1102+ ) -> crate :: Result < ( ) >
10921103 where
10931104 S : Serialize + Clone ,
10941105 F : Fn ( & Window < R > ) -> bool ,
10951106 {
1096- assert ! ( is_event_name_valid ( event) ) ;
1107+ assert_event_name_is_valid ( event) ;
10971108 self
10981109 . windows_lock ( )
10991110 . values ( )
11001111 . filter ( |& w| filter ( w) )
1101- . try_for_each ( |window| window. emit ( event, payload. clone ( ) ) )
1112+ . try_for_each ( |window| window. emit_internal ( event, source_window_label , payload. clone ( ) ) )
11021113 }
11031114
11041115 pub fn labels ( & self ) -> HashSet < String > {
@@ -1118,7 +1129,7 @@ impl<R: Runtime> WindowManager<R> {
11181129 }
11191130
11201131 pub fn trigger ( & self , event : & str , window : Option < String > , data : Option < String > ) {
1121- assert ! ( is_event_name_valid ( event) ) ;
1132+ assert_event_name_is_valid ( event) ;
11221133 self . inner . listeners . trigger ( event, window, data)
11231134 }
11241135
@@ -1128,7 +1139,7 @@ impl<R: Runtime> WindowManager<R> {
11281139 window : Option < String > ,
11291140 handler : F ,
11301141 ) -> EventHandler {
1131- assert ! ( is_event_name_valid ( & event) ) ;
1142+ assert_event_name_is_valid ( & event) ;
11321143 self . inner . listeners . listen ( event, window, handler)
11331144 }
11341145
@@ -1138,7 +1149,7 @@ impl<R: Runtime> WindowManager<R> {
11381149 window : Option < String > ,
11391150 handler : F ,
11401151 ) -> EventHandler {
1141- assert ! ( is_event_name_valid ( & event) ) ;
1152+ assert_event_name_is_valid ( & event) ;
11421153 self . inner . listeners . once ( event, window, handler)
11431154 }
11441155
@@ -1171,7 +1182,7 @@ fn on_window_event<R: Runtime>(
11711182 label : _,
11721183 signal_tx,
11731184 } => {
1174- if window. has_js_listener ( WINDOW_CLOSE_REQUESTED_EVENT ) {
1185+ if window. has_js_listener ( Some ( window . label ( ) . into ( ) ) , WINDOW_CLOSE_REQUESTED_EVENT ) {
11751186 signal_tx. send ( true ) . unwrap ( ) ;
11761187 }
11771188 window. emit_and_trigger ( WINDOW_CLOSE_REQUESTED_EVENT , ( ) ) ?;
@@ -1210,7 +1221,7 @@ fn on_window_event<R: Runtime>(
12101221 Ok ( ( ) )
12111222}
12121223
1213- #[ derive( Serialize ) ]
1224+ #[ derive( Clone , Serialize ) ]
12141225#[ serde( rename_all = "camelCase" ) ]
12151226struct ScaleFactorChanged {
12161227 scale_factor : f64 ,
0 commit comments