Skip to content

Commit d832d57

Browse files
authored
fix(windows): use webview events on windows (#2277)
1 parent a8c1de5 commit d832d57

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

.changes/core-webview-events.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"tauri": patch
3+
"tauri-runtime": patch
4+
"tauri-runtime-wry": patch
5+
---
6+
7+
Fix blur/focus events being incorrect on Windows.

core/tauri-runtime-wry/src/lib.rs

+68-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ use wry::{
5757
},
5858
};
5959

60+
#[cfg(target_os = "windows")]
61+
use wry::webview::WebviewExtWindows;
62+
6063
use 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+
298309
pub struct MonitorHandleWrapper(MonitorHandle);
299310

300311
impl From<MonitorHandleWrapper> for Monitor {
@@ -690,9 +701,17 @@ enum WindowMessage {
690701
#[derive(Debug, Clone)]
691702
enum 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)]
698717
pub(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

Comments
 (0)