1 | use crate::{ |
2 | event_loop::{EventLoopBuilder, EventLoopWindowTarget}, |
3 | monitor::MonitorHandle, |
4 | window::{Window, WindowBuilder}, |
5 | }; |
6 | |
7 | use crate::platform_impl::{ApplicationName, Backend}; |
8 | |
9 | pub use crate::window::Theme; |
10 | |
11 | /// Additional methods on [`EventLoopWindowTarget`] that are specific to Wayland. |
12 | pub trait EventLoopWindowTargetExtWayland { |
13 | /// True if the [`EventLoopWindowTarget`] uses Wayland. |
14 | fn is_wayland(&self) -> bool; |
15 | } |
16 | |
17 | impl<T> EventLoopWindowTargetExtWayland for EventLoopWindowTarget<T> { |
18 | #[inline ] |
19 | fn is_wayland(&self) -> bool { |
20 | self.p.is_wayland() |
21 | } |
22 | } |
23 | |
24 | /// Additional methods on [`EventLoopBuilder`] that are specific to Wayland. |
25 | pub trait EventLoopBuilderExtWayland { |
26 | /// Force using Wayland. |
27 | fn with_wayland(&mut self) -> &mut Self; |
28 | |
29 | /// Whether to allow the event loop to be created off of the main thread. |
30 | /// |
31 | /// By default, the window is only allowed to be created on the main |
32 | /// thread, to make platform compatibility easier. |
33 | fn with_any_thread(&mut self, any_thread: bool) -> &mut Self; |
34 | } |
35 | |
36 | impl<T> EventLoopBuilderExtWayland for EventLoopBuilder<T> { |
37 | #[inline ] |
38 | fn with_wayland(&mut self) -> &mut Self { |
39 | self.platform_specific.forced_backend = Some(Backend::Wayland); |
40 | self |
41 | } |
42 | |
43 | #[inline ] |
44 | fn with_any_thread(&mut self, any_thread: bool) -> &mut Self { |
45 | self.platform_specific.any_thread = any_thread; |
46 | self |
47 | } |
48 | } |
49 | |
50 | /// Additional methods on [`Window`] that are specific to Wayland. |
51 | pub trait WindowExtWayland {} |
52 | |
53 | impl WindowExtWayland for Window {} |
54 | |
55 | /// Additional methods on [`WindowBuilder`] that are specific to Wayland. |
56 | pub trait WindowBuilderExtWayland { |
57 | /// Build window with the given name. |
58 | /// |
59 | /// The `general` name sets an application ID, which should match the `.desktop` |
60 | /// file destributed with your program. The `instance` is a `no-op`. |
61 | /// |
62 | /// For details about application ID conventions, see the |
63 | /// [Desktop Entry Spec](https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#desktop-file-id) |
64 | fn with_name(self, general: impl Into<String>, instance: impl Into<String>) -> Self; |
65 | } |
66 | |
67 | impl WindowBuilderExtWayland for WindowBuilder { |
68 | #[inline ] |
69 | fn with_name(mut self, general: impl Into<String>, instance: impl Into<String>) -> Self { |
70 | self.platform_specific.name = Some(ApplicationName::new(general:general.into(), instance:instance.into())); |
71 | self |
72 | } |
73 | } |
74 | |
75 | /// Additional methods on `MonitorHandle` that are specific to Wayland. |
76 | pub trait MonitorHandleExtWayland { |
77 | /// Returns the inner identifier of the monitor. |
78 | fn native_id(&self) -> u32; |
79 | } |
80 | |
81 | impl MonitorHandleExtWayland for MonitorHandle { |
82 | #[inline ] |
83 | fn native_id(&self) -> u32 { |
84 | self.inner.native_identifier() |
85 | } |
86 | } |
87 | |