Explorar o código

fix(wry): window event listeners being emitted to all windows (#2056)

Lucas Fernandes Nogueira %!s(int64=4) %!d(string=hai) anos
pai
achega
fca976404e
Modificáronse 2 ficheiros con 37 adicións e 2 borrados
  1. 5 0
      .changes/fix-window-events.md
  2. 32 2
      core/tauri-runtime-wry/src/lib.rs

+ 5 - 0
.changes/fix-window-events.md

@@ -0,0 +1,5 @@
+---
+"tauri-runtime-wry": patch
+---
+
+Fixes window event being emitted to all windows listeners.

+ 32 - 2
core/tauri-runtime-wry/src/lib.rs

@@ -84,7 +84,8 @@ type CreateWebviewHandler = Box<
   dyn FnOnce(&EventLoopWindowTarget<Message>, &WebContextStore) -> Result<WebviewWrapper> + Send,
   dyn FnOnce(&EventLoopWindowTarget<Message>, &WebContextStore) -> Result<WebviewWrapper> + Send,
 >;
 >;
 type WindowEventHandler = Box<dyn Fn(&WindowEvent) + Send>;
 type WindowEventHandler = Box<dyn Fn(&WindowEvent) + Send>;
-type WindowEventListeners = Arc<Mutex<HashMap<Uuid, WindowEventHandler>>>;
+type WindowEventListenersMap = Arc<Mutex<HashMap<Uuid, WindowEventHandler>>>;
+type WindowEventListeners = Arc<Mutex<HashMap<WindowId, WindowEventListenersMap>>>;
 type GlobalShortcutListeners = Arc<Mutex<HashMap<AcceleratorId, Box<dyn Fn() + Send>>>>;
 type GlobalShortcutListeners = Arc<Mutex<HashMap<AcceleratorId, Box<dyn Fn() + Send>>>>;
 
 
 macro_rules! dispatcher_getter {
 macro_rules! dispatcher_getter {
@@ -731,6 +732,10 @@ impl Dispatch for WryDispatcher {
       .window_event_listeners
       .window_event_listeners
       .lock()
       .lock()
       .unwrap()
       .unwrap()
+      .get(&self.window_id)
+      .unwrap()
+      .lock()
+      .unwrap()
       .insert(id, Box::new(f));
       .insert(id, Box::new(f));
     id
     id
   }
   }
@@ -1523,7 +1528,15 @@ fn handle_event_loop(
     }
     }
     Event::WindowEvent { event, window_id } => {
     Event::WindowEvent { event, window_id } => {
       if let Some(event) = WindowEventWrapper::from(&event).0 {
       if let Some(event) = WindowEventWrapper::from(&event).0 {
-        for handler in window_event_listeners.lock().unwrap().values() {
+        for handler in window_event_listeners
+          .lock()
+          .unwrap()
+          .get(&window_id)
+          .unwrap()
+          .lock()
+          .unwrap()
+          .values()
+        {
           handler(&event);
           handler(&event);
         }
         }
       }
       }
@@ -1625,6 +1638,17 @@ fn handle_event_loop(
             WindowMessage::Show => window.set_visible(true),
             WindowMessage::Show => window.set_visible(true),
             WindowMessage::Hide => window.set_visible(false),
             WindowMessage::Hide => window.set_visible(false),
             WindowMessage::Close => {
             WindowMessage::Close => {
+              for handler in window_event_listeners
+                .lock()
+                .unwrap()
+                .get(&window.id())
+                .unwrap()
+                .lock()
+                .unwrap()
+                .values()
+              {
+                handler(&WindowEvent::CloseRequested);
+              }
               on_window_close(
               on_window_close(
                 callback,
                 callback,
                 id,
                 id,
@@ -1859,6 +1883,12 @@ fn create_webview<P: Params<Runtime = Wry>>(
   };
   };
   let window = window_builder.inner.build(event_loop).unwrap();
   let window = window_builder.inner.build(event_loop).unwrap();
 
 
+  context
+    .window_event_listeners
+    .lock()
+    .unwrap()
+    .insert(window.id(), WindowEventListenersMap::default());
+
   #[cfg(feature = "menu")]
   #[cfg(feature = "menu")]
   context
   context
     .menu_event_listeners
     .menu_event_listeners