Skip to content

Commit beebc41

Browse files
committed
docs: document usage of event loop proxy and use it in examples
ref: tauri-apps/tray-icon#209
1 parent 99ec648 commit beebc41

File tree

5 files changed

+106
-36
lines changed

5 files changed

+106
-36
lines changed

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,29 @@ if let Ok(event) = MenuEvent::receiver().try_recv() {
104104
}
105105
```
106106

107+
### Note for [winit] or [tao] users:
108+
109+
You should use [`MenuEvent::set_event_handler`] and forward
110+
the menu events to the event loop by using [`EventLoopProxy`]
111+
so that the event loop is awakened on each menu event.
112+
113+
```rust
114+
enum UserEvent {
115+
MenuEvent(muda::MenuEvent)
116+
}
117+
118+
let event_loop = EventLoop::<UserEvent>::with_user_event().build().unwrap();
119+
120+
let proxy = event_loop.create_proxy();
121+
muda::MenuEvent::set_event_handler(Some(move |event| {
122+
proxy.send_event(UserEvent::MenuEvent(event));
123+
}));
124+
```
125+
126+
[`EventLoopProxy`]: https://docs.rs/winit/latest/winit/event_loop/struct.EventLoopProxy.html
127+
[winit]: https://docs.rs/winit
128+
[tao]: https://docs.rs/tao
129+
107130
## License
108131

109132
Apache-2.0/MIT

examples/tao.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,16 @@ use tao::{
2121
window::{Window, WindowBuilder},
2222
};
2323

24+
enum UserEvent {
25+
MenuEvent(muda::MenuEvent),
26+
}
27+
2428
fn main() {
25-
let mut event_loop_builder = EventLoopBuilder::new();
29+
let mut event_loop_builder = EventLoopBuilder::<UserEvent>::with_user_event();
2630

2731
let menu_bar = Menu::new();
2832

33+
// setup accelerator handler on Windows
2934
#[cfg(target_os = "windows")]
3035
{
3136
let menu_bar = menu_bar.clone();
@@ -41,6 +46,12 @@ fn main() {
4146

4247
let event_loop = event_loop_builder.build();
4348

49+
// set a menu event handler that wakes up the event loop
50+
let proxy = event_loop.create_proxy();
51+
muda::MenuEvent::set_event_handler(Some(move |event| {
52+
proxy.send_event(UserEvent::MenuEvent(event));
53+
}));
54+
4455
let window = WindowBuilder::new()
4556
.with_title("Window 1")
4657
.build(&event_loop)
@@ -201,19 +212,14 @@ fn main() {
201212
Event::MainEventsCleared => {
202213
window.request_redraw();
203214
}
204-
_ => (),
205-
}
206215

207-
if let Ok(event) = menu_channel.try_recv() {
208-
if event.id == custom_i_1.id() {
209-
custom_i_1
210-
.set_accelerator(Some(Accelerator::new(Some(Modifiers::SHIFT), Code::KeyF)));
211-
file_m.insert(
212-
&MenuItem::with_id("new-menu-id", "New Menu Item", true, None),
213-
2,
214-
);
216+
Event::UserEvent(UserEvent::MenuEvent(event)) => {
217+
if event.id == custom_i_1.id() {
218+
file_m.insert(&MenuItem::new("New Menu Item", true, None), 2);
219+
}
220+
println!("{event:?}");
215221
}
216-
println!("{event:?}");
222+
_ => (),
217223
}
218224
})
219225
}

examples/winit.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@ use winit::{
1919
window::{Window, WindowBuilder},
2020
};
2121

22+
enum UserEvent {
23+
MenuEvent(muda::MenuEvent),
24+
}
25+
2226
fn main() {
23-
let mut event_loop_builder = EventLoopBuilder::new();
27+
let mut event_loop_builder = EventLoopBuilder::<UserEvent>::with_user_event();
2428

2529
let menu_bar = Menu::new();
2630

31+
// setup accelerator handler on Windows
2732
#[cfg(target_os = "windows")]
2833
{
2934
let menu_bar = menu_bar.clone();
@@ -41,6 +46,12 @@ fn main() {
4146

4247
let event_loop = event_loop_builder.build().unwrap();
4348

49+
// set a menu event handler that wakes up the event loop
50+
let proxy = event_loop.create_proxy();
51+
muda::MenuEvent::set_event_handler(Some(move |event| {
52+
proxy.send_event(UserEvent::MenuEvent(event));
53+
}));
54+
4455
let window = WindowBuilder::new()
4556
.with_title("Window 1")
4657
.build(&event_loop)
@@ -188,14 +199,14 @@ fn main() {
188199
);
189200
use_window_pos = !use_window_pos;
190201
}
191-
_ => (),
192-
}
193202

194-
if let Ok(event) = menu_channel.try_recv() {
195-
if event.id == custom_i_1.id() {
196-
file_m.insert(&MenuItem::new("New Menu Item", true, None), 2);
203+
Event::UserEvent(UserEvent::MenuEvent(event)) => {
204+
if event.id == custom_i_1.id() {
205+
file_m.insert(&MenuItem::new("New Menu Item", true, None), 2);
206+
}
207+
println!("{event:?}");
197208
}
198-
println!("{event:?}");
209+
_ => (),
199210
}
200211
});
201212
}

examples/wry.rs

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,16 @@ use tao::{
2626
use wry::WebViewBuilderExtUnix;
2727
use wry::{http::Request, WebViewBuilder};
2828

29+
enum UserEvent {
30+
MenuEvent(muda::MenuEvent),
31+
}
32+
2933
fn main() -> wry::Result<()> {
30-
let mut event_loop_builder = EventLoopBuilder::new();
34+
let mut event_loop_builder = EventLoopBuilder::<UserEvent>::with_user_event();
3135

3236
let menu_bar = Menu::new();
3337

38+
// setup accelerator handler on Windows
3439
#[cfg(target_os = "windows")]
3540
{
3641
let menu_bar = menu_bar.clone();
@@ -46,6 +51,12 @@ fn main() -> wry::Result<()> {
4651

4752
let event_loop = event_loop_builder.build();
4853

54+
// set a menu event handler that wakes up the event loop
55+
let proxy = event_loop.create_proxy();
56+
muda::MenuEvent::set_event_handler(Some(move |event| {
57+
proxy.send_event(UserEvent::MenuEvent(event));
58+
}));
59+
4960
let window = WindowBuilder::new()
5061
.with_title("Window 1")
5162
.build(&event_loop)
@@ -281,24 +292,19 @@ fn main() -> wry::Result<()> {
281292
event_loop.run(move |event, _, control_flow| {
282293
*control_flow = ControlFlow::Wait;
283294

284-
if let Event::WindowEvent {
285-
event: WindowEvent::CloseRequested,
286-
..
287-
} = event
288-
{
289-
*control_flow = ControlFlow::Exit;
290-
}
295+
match event {
296+
Event::WindowEvent {
297+
event: WindowEvent::CloseRequested,
298+
..
299+
} => *control_flow = ControlFlow::Exit,
291300

292-
if let Ok(event) = menu_channel.try_recv() {
293-
if event.id == custom_i_1.id() {
294-
custom_i_1
295-
.set_accelerator(Some(Accelerator::new(Some(Modifiers::SHIFT), Code::KeyF)))
296-
.unwrap();
297-
file_m
298-
.insert(&MenuItem::new("New Menu Item", true, None), 2)
299-
.unwrap();
301+
Event::UserEvent(UserEvent::MenuEvent(event)) => {
302+
if event.id == custom_i_1.id() {
303+
file_m.insert(&MenuItem::new("New Menu Item", true, None), 2);
304+
}
305+
println!("{event:?}");
300306
}
301-
println!("{event:?}");
307+
_ => {}
302308
}
303309
})
304310
}

src/lib.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,30 @@
128128
//! }
129129
//! }
130130
//! ```
131+
//!
132+
//! ### Note for [winit] or [tao] users:
133+
//!
134+
//! You should use [`MenuEvent::set_event_handler`] and forward
135+
//! the menu events to the event loop by using [`EventLoopProxy`]
136+
//! so that the event loop is awakened on each menu event.
137+
//!
138+
//! ```no_run
139+
//! # use winit::event_loop::EventLoop;
140+
//! enum UserEvent {
141+
//! MenuEvent(muda::MenuEvent)
142+
//! }
143+
//!
144+
//! let event_loop = EventLoop::<UserEvent>::with_user_event().build().unwrap();
145+
//!
146+
//! let proxy = event_loop.create_proxy();
147+
//! muda::MenuEvent::set_event_handler(Some(move |event| {
148+
//! proxy.send_event(UserEvent::MenuEvent(event));
149+
//! }));
150+
//! ```
151+
//!
152+
//! [`EventLoopProxy`]: https://docs.rs/winit/latest/winit/event_loop/struct.EventLoopProxy.html
153+
//! [winit]: https://docs.rs/winit
154+
//! [tao]: https://docs.rs/tao
131155
132156
use crossbeam_channel::{unbounded, Receiver, Sender};
133157
use once_cell::sync::{Lazy, OnceCell};

0 commit comments

Comments
 (0)