Skip to main content

telar_platform_winit/
window.rs

1use std::sync::Arc;
2
3use platform_core::Window as PlatformWindow;
4use raw_window_handle::{
5    DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, WindowHandle,
6};
7use winit::window::Window as WinitInnerWindow;
8
9#[derive(Clone)]
10pub struct WinitWindow(pub Arc<WinitInnerWindow>);
11
12impl HasWindowHandle for WinitWindow {
13    fn window_handle(&self) -> Result<WindowHandle<'_>, HandleError> {
14        self.0.window_handle()
15    }
16}
17
18impl HasDisplayHandle for WinitWindow {
19    fn display_handle(&self) -> Result<DisplayHandle<'_>, HandleError> {
20        self.0.display_handle()
21    }
22}
23
24impl PlatformWindow for WinitWindow {
25    fn width(&self) -> u32 {
26        self.0.inner_size().width
27    }
28
29    fn height(&self) -> u32 {
30        self.0.inner_size().height
31    }
32
33    fn request_redraw(&self) {
34        self.0.request_redraw();
35    }
36
37    fn scale_factor(&self) -> f64 {
38        self.0.scale_factor()
39    }
40
41    fn prefers_dark(&self) -> Option<bool> {
42        // winit reports the OS theme natively on Windows/macOS; on Linux it is always `None` (winit has no
43        // color-scheme integration there) — the desktop adapter supplies the freedesktop-portal fallback.
44        self.0.theme().map(|t| t == winit::window::Theme::Dark)
45    }
46
47    fn drag_window(&self) {
48        let _ = self.0.drag_window();
49    }
50
51    fn set_minimized(&self, minimized: bool) {
52        self.0.set_minimized(minimized);
53    }
54
55    fn set_maximized(&self, maximized: bool) {
56        self.0.set_maximized(maximized);
57    }
58
59    fn is_maximized(&self) -> bool {
60        self.0.is_maximized()
61    }
62
63    fn set_title(&self, title: &str) {
64        self.0.set_title(title);
65    }
66
67    fn focus_window(&self) {
68        self.0.focus_window();
69    }
70}