Skip to content

Commit 2f0a9b8

Browse files
committed
update
1 parent 07a1e9e commit 2f0a9b8

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed

crates/rs-gui/try-wry/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,16 @@ version = "0.1.0"
44
edition = "2024"
55

66

7+
# multiwebview
78
[[bin]]
89
name = "t01"
910
path = "examples/try01.rs"
1011

12+
# multiwindow
13+
[[bin]]
14+
name = "t02"
15+
path = "examples/try02.rs"
16+
1117

1218
[dependencies]
1319
tao = "0.32.6"
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// Copyright 2020-2023 Tauri Programme within The Commons Conservancy
2+
// SPDX-License-Identifier: Apache-2.0
3+
// SPDX-License-Identifier: MIT
4+
5+
use std::collections::HashMap;
6+
use tao::{
7+
event::{Event, WindowEvent},
8+
event_loop::{ControlFlow, EventLoopBuilder, EventLoopProxy, EventLoopWindowTarget},
9+
window::{Window, WindowBuilder, WindowId},
10+
};
11+
use wry::{WebView, WebViewBuilder, http::Request};
12+
13+
enum UserEvent {
14+
CloseWindow(WindowId),
15+
NewTitle(WindowId, String),
16+
NewWindow,
17+
}
18+
19+
fn main() -> wry::Result<()> {
20+
let event_loop = EventLoopBuilder::<UserEvent>::with_user_event().build();
21+
let mut webviews = HashMap::new();
22+
let proxy = event_loop.create_proxy();
23+
24+
let (window, webview) =
25+
create_new_window(format!("Window {}", webviews.len() + 1), &event_loop, proxy.clone());
26+
webviews.insert(window.id(), (window, webview));
27+
28+
event_loop.run(move |event, event_loop, control_flow| {
29+
*control_flow = ControlFlow::Wait;
30+
31+
match event {
32+
Event::WindowEvent { event: WindowEvent::CloseRequested, window_id, .. } => {
33+
webviews.remove(&window_id);
34+
if webviews.is_empty() {
35+
*control_flow = ControlFlow::Exit
36+
}
37+
},
38+
Event::UserEvent(UserEvent::NewWindow) => {
39+
let (window, webview) = create_new_window(
40+
format!("Window {}", webviews.len() + 1),
41+
event_loop,
42+
proxy.clone(),
43+
);
44+
webviews.insert(window.id(), (window, webview));
45+
},
46+
Event::UserEvent(UserEvent::CloseWindow(id)) => {
47+
webviews.remove(&id);
48+
if webviews.is_empty() {
49+
*control_flow = ControlFlow::Exit
50+
}
51+
},
52+
53+
Event::UserEvent(UserEvent::NewTitle(id, title)) => {
54+
webviews.get(&id).unwrap().0.set_title(&title);
55+
},
56+
_ => (),
57+
}
58+
});
59+
}
60+
61+
fn create_new_window(
62+
title: String,
63+
event_loop: &EventLoopWindowTarget<UserEvent>,
64+
proxy: EventLoopProxy<UserEvent>,
65+
) -> (Window, WebView) {
66+
let window = WindowBuilder::new().with_title(title).build(event_loop).unwrap();
67+
let window_id = window.id();
68+
let handler = move |req: Request<String>| {
69+
let body = req.body();
70+
match body.as_str() {
71+
"new-window" => {
72+
let _ = proxy.send_event(UserEvent::NewWindow);
73+
},
74+
"close" => {
75+
let _ = proxy.send_event(UserEvent::CloseWindow(window_id));
76+
},
77+
_ if body.starts_with("change-title") => {
78+
let title = body.replace("change-title:", "");
79+
let _ = proxy.send_event(UserEvent::NewTitle(window_id, title));
80+
},
81+
_ => {},
82+
}
83+
};
84+
85+
let builder = WebViewBuilder::new()
86+
.with_html(
87+
r#"
88+
<button onclick="window.ipc.postMessage('new-window')">Open a new window</button>
89+
<button onclick="window.ipc.postMessage('close')">Close current window</button>
90+
<input oninput="window.ipc.postMessage(`change-title:${this.value}`)" />
91+
"#,
92+
)
93+
.with_ipc_handler(handler);
94+
95+
#[cfg(any(
96+
target_os = "windows",
97+
target_os = "macos",
98+
target_os = "ios",
99+
target_os = "android"
100+
))]
101+
let webview = builder.build(&window).unwrap();
102+
#[cfg(not(any(
103+
target_os = "windows",
104+
target_os = "macos",
105+
target_os = "ios",
106+
target_os = "android"
107+
)))]
108+
let webview = {
109+
use tao::platform::unix::WindowExtUnix;
110+
use wry::WebViewBuilderExtUnix;
111+
let vbox = window.default_vbox().unwrap();
112+
builder.build_gtk(vbox).unwrap()
113+
};
114+
(window, webview)
115+
}

crates/rs-gui/try-wry/readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ cargo add wry
1616

1717
cd git-repo-root-dir/
1818

19+
# multiwebview
1920
task gui:wry:r -- --bin t01
21+
22+
# multiwindow
23+
task gui:wry:r -- --bin t02
2024
```
2125

2226

0 commit comments

Comments
 (0)