child_window/
child_window.rs

1#[cfg(any(x11_platform, macos_platform, windows_platform))]
2#[allow(deprecated)]
3fn main() -> Result<(), impl std::error::Error> {
4    use std::collections::HashMap;
5
6    use rio_window::dpi::{LogicalPosition, LogicalSize, Position};
7    use rio_window::event::{ElementState, Event, KeyEvent, WindowEvent};
8    use rio_window::event_loop::{ActiveEventLoop, EventLoop};
9    use rio_window::raw_window_handle::HasRawWindowHandle;
10    use rio_window::window::Window;
11
12    #[path = "util/fill.rs"]
13    mod fill;
14
15    fn spawn_child_window(parent: &Window, event_loop: &ActiveEventLoop) -> Window {
16        let parent = parent.raw_window_handle().unwrap();
17        let mut window_attributes = Window::default_attributes()
18            .with_title("child window")
19            .with_inner_size(LogicalSize::new(200.0f32, 200.0f32))
20            .with_position(Position::Logical(LogicalPosition::new(0.0, 0.0)))
21            .with_visible(true);
22        // `with_parent_window` is unsafe. Parent window must be a valid window.
23        window_attributes = unsafe { window_attributes.with_parent_window(Some(parent)) };
24
25        event_loop.create_window(window_attributes).unwrap()
26    }
27
28    let mut windows = HashMap::new();
29
30    let event_loop: EventLoop<()> = EventLoop::new().unwrap();
31    let mut parent_window_id = None;
32
33    event_loop.run(move |event: Event<()>, event_loop| {
34        match event {
35            Event::Resumed => {
36                let attributes = Window::default_attributes()
37                    .with_title("parent window")
38                    .with_position(Position::Logical(LogicalPosition::new(0.0, 0.0)))
39                    .with_inner_size(LogicalSize::new(640.0f32, 480.0f32));
40                let window = event_loop.create_window(attributes).unwrap();
41
42                parent_window_id = Some(window.id());
43
44                println!("Parent window id: {parent_window_id:?})");
45                windows.insert(window.id(), window);
46            }
47            Event::WindowEvent { window_id, event } => match event {
48                WindowEvent::CloseRequested => {
49                    windows.clear();
50                    event_loop.exit();
51                }
52                WindowEvent::CursorEntered { device_id: _ } => {
53                    // On x11, println when the cursor entered in a window even if the child window
54                    // is created by some key inputs.
55                    // the child windows are always placed at (0, 0) with size (200, 200) in the
56                    // parent window, so we also can see this log when we move
57                    // the cursor around (200, 200) in parent window.
58                    println!("cursor entered in the window {window_id:?}");
59                }
60                WindowEvent::KeyboardInput {
61                    event:
62                        KeyEvent {
63                            state: ElementState::Pressed,
64                            ..
65                        },
66                    ..
67                } => {
68                    let parent_window = windows.get(&parent_window_id.unwrap()).unwrap();
69                    let child_window = spawn_child_window(parent_window, event_loop);
70                    let child_id = child_window.id();
71                    println!("Child window created with id: {child_id:?}");
72                    windows.insert(child_id, child_window);
73                }
74                WindowEvent::RedrawRequested => {
75                    if let Some(window) = windows.get(&window_id) {
76                        fill::fill_window(window);
77                    }
78                }
79                _ => (),
80            },
81            _ => (),
82        }
83    })
84}
85
86#[cfg(not(any(x11_platform, macos_platform, windows_platform)))]
87fn main() {
88    panic!(
89        "This example is supported only on x11, macOS, and Windows, with the `rwh_06` feature \
90         enabled."
91    );
92}