winit/platform/
wayland.rs

1//! # Wayland
2//!
3//! **Note:** Windows don't appear on Wayland until you draw/present to them.
4//!
5//! By default, Winit loads system libraries using `dlopen`. This can be
6//! disabled by disabling the `"wayland-dlopen"` cargo feature.
7//!
8//! ## Client-side decorations
9//!
10//! Winit provides client-side decorations by default, but the behaviour can
11//! be controlled with the following feature flags:
12//!
13//! * `wayland-csd-adwaita` (default).
14//! * `wayland-csd-adwaita-crossfont`.
15//! * `wayland-csd-adwaita-notitle`.
16use crate::event_loop::{ActiveEventLoop, EventLoop, EventLoopBuilder};
17use crate::monitor::MonitorHandle;
18use crate::window::{Window, WindowAttributes};
19
20pub use crate::window::Theme;
21
22/// Additional methods on [`ActiveEventLoop`] that are specific to Wayland.
23pub trait ActiveEventLoopExtWayland {
24    /// True if the [`ActiveEventLoop`] uses Wayland.
25    fn is_wayland(&self) -> bool;
26}
27
28impl ActiveEventLoopExtWayland for ActiveEventLoop {
29    #[inline]
30    fn is_wayland(&self) -> bool {
31        self.p.is_wayland()
32    }
33}
34
35/// Additional methods on [`EventLoop`] that are specific to Wayland.
36pub trait EventLoopExtWayland {
37    /// True if the [`EventLoop`] uses Wayland.
38    fn is_wayland(&self) -> bool;
39}
40
41impl<T: 'static> EventLoopExtWayland for EventLoop<T> {
42    #[inline]
43    fn is_wayland(&self) -> bool {
44        self.event_loop.is_wayland()
45    }
46}
47
48/// Additional methods on [`EventLoopBuilder`] that are specific to Wayland.
49pub trait EventLoopBuilderExtWayland {
50    /// Force using Wayland.
51    fn with_wayland(&mut self) -> &mut Self;
52
53    /// Whether to allow the event loop to be created off of the main thread.
54    ///
55    /// By default, the window is only allowed to be created on the main
56    /// thread, to make platform compatibility easier.
57    fn with_any_thread(&mut self, any_thread: bool) -> &mut Self;
58}
59
60impl<T> EventLoopBuilderExtWayland for EventLoopBuilder<T> {
61    #[inline]
62    fn with_wayland(&mut self) -> &mut Self {
63        self.platform_specific.forced_backend = Some(crate::platform_impl::Backend::Wayland);
64        self
65    }
66
67    #[inline]
68    fn with_any_thread(&mut self, any_thread: bool) -> &mut Self {
69        self.platform_specific.any_thread = any_thread;
70        self
71    }
72}
73
74/// Additional methods on [`Window`] that are specific to Wayland.
75pub trait WindowExtWayland {}
76
77impl WindowExtWayland for Window {}
78
79/// Additional methods on [`WindowAttributes`] that are specific to Wayland.
80pub trait WindowAttributesExtWayland {
81    /// Build window with the given name.
82    ///
83    /// The `general` name sets an application ID, which should match the `.desktop`
84    /// file distributed with your program. The `instance` is a `no-op`.
85    ///
86    /// For details about application ID conventions, see the
87    /// [Desktop Entry Spec](https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#desktop-file-id)
88    fn with_name(self, general: impl Into<String>, instance: impl Into<String>) -> Self;
89}
90
91impl WindowAttributesExtWayland for WindowAttributes {
92    #[inline]
93    fn with_name(mut self, general: impl Into<String>, instance: impl Into<String>) -> Self {
94        self.platform_specific.name =
95            Some(crate::platform_impl::ApplicationName::new(general.into(), instance.into()));
96        self
97    }
98}
99
100/// Additional methods on `MonitorHandle` that are specific to Wayland.
101pub trait MonitorHandleExtWayland {
102    /// Returns the inner identifier of the monitor.
103    fn native_id(&self) -> u32;
104}
105
106impl MonitorHandleExtWayland for MonitorHandle {
107    #[inline]
108    fn native_id(&self) -> u32 {
109        self.inner.native_identifier()
110    }
111}