child_window/
child_window.rs1#[cfg(all(feature = "rwh_06", 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 winit::dpi::{LogicalPosition, LogicalSize, Position};
7 use winit::event::{ElementState, Event, KeyEvent, WindowEvent};
8 use winit::event_loop::{ActiveEventLoop, EventLoop};
9 use winit::raw_window_handle::HasRawWindowHandle;
10 use winit::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 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 println!("cursor entered in the window {window_id:?}");
59 },
60 WindowEvent::KeyboardInput {
61 event: KeyEvent { state: ElementState::Pressed, .. },
62 ..
63 } => {
64 let parent_window = windows.get(&parent_window_id.unwrap()).unwrap();
65 let child_window = spawn_child_window(parent_window, event_loop);
66 let child_id = child_window.id();
67 println!("Child window created with id: {child_id:?}");
68 windows.insert(child_id, child_window);
69 },
70 WindowEvent::RedrawRequested => {
71 if let Some(window) = windows.get(&window_id) {
72 fill::fill_window(window);
73 }
74 },
75 _ => (),
76 },
77 _ => (),
78 }
79 })
80}
81
82#[cfg(all(feature = "rwh_06", not(any(x11_platform, macos_platform, windows_platform))))]
83fn main() {
84 panic!(
85 "This example is supported only on x11, macOS, and Windows, with the `rwh_06` feature \
86 enabled."
87 );
88}