This also alters `VideoMode` to be a regular object and not reference the `MonitorHandle`, since it's a static data. Given that `VideoMode` set may change during runtime keeping the reference as a some sort of validity may not be idea and propagating errors when changing video mode could be more reliable.
98 lines
3.3 KiB
Rust
98 lines
3.3 KiB
Rust
//! # Wayland
|
|
//!
|
|
//! **Note:** Windows don't appear on Wayland until you draw/present to them.
|
|
//!
|
|
//! By default, Winit loads system libraries using `dlopen`. This can be
|
|
//! disabled by disabling the `"wayland-dlopen"` cargo feature.
|
|
//!
|
|
//! ## Client-side decorations
|
|
//!
|
|
//! Winit provides client-side decorations by default, but the behaviour can
|
|
//! be controlled with the following feature flags:
|
|
//!
|
|
//! * `wayland-csd-adwaita` (default).
|
|
//! * `wayland-csd-adwaita-crossfont`.
|
|
//! * `wayland-csd-adwaita-notitle`.
|
|
use crate::event_loop::{ActiveEventLoop, EventLoop, EventLoopBuilder};
|
|
pub use crate::window::Theme;
|
|
use crate::window::{Window as CoreWindow, WindowAttributes};
|
|
|
|
/// Additional methods on [`ActiveEventLoop`] that are specific to Wayland.
|
|
pub trait ActiveEventLoopExtWayland {
|
|
/// True if the [`ActiveEventLoop`] uses Wayland.
|
|
fn is_wayland(&self) -> bool;
|
|
}
|
|
|
|
impl ActiveEventLoopExtWayland for dyn ActiveEventLoop + '_ {
|
|
#[inline]
|
|
fn is_wayland(&self) -> bool {
|
|
self.as_any().downcast_ref::<crate::platform_impl::wayland::ActiveEventLoop>().is_some()
|
|
}
|
|
}
|
|
|
|
/// Additional methods on [`EventLoop`] that are specific to Wayland.
|
|
pub trait EventLoopExtWayland {
|
|
/// True if the [`EventLoop`] uses Wayland.
|
|
fn is_wayland(&self) -> bool;
|
|
}
|
|
|
|
impl EventLoopExtWayland for EventLoop {
|
|
#[inline]
|
|
fn is_wayland(&self) -> bool {
|
|
self.event_loop.is_wayland()
|
|
}
|
|
}
|
|
|
|
/// Additional methods on [`EventLoopBuilder`] that are specific to Wayland.
|
|
pub trait EventLoopBuilderExtWayland {
|
|
/// Force using Wayland.
|
|
fn with_wayland(&mut self) -> &mut Self;
|
|
|
|
/// Whether to allow the event loop to be created off of the main thread.
|
|
///
|
|
/// By default, the window is only allowed to be created on the main
|
|
/// thread, to make platform compatibility easier.
|
|
fn with_any_thread(&mut self, any_thread: bool) -> &mut Self;
|
|
}
|
|
|
|
impl EventLoopBuilderExtWayland for EventLoopBuilder {
|
|
#[inline]
|
|
fn with_wayland(&mut self) -> &mut Self {
|
|
self.platform_specific.forced_backend = Some(crate::platform_impl::Backend::Wayland);
|
|
self
|
|
}
|
|
|
|
#[inline]
|
|
fn with_any_thread(&mut self, any_thread: bool) -> &mut Self {
|
|
self.platform_specific.any_thread = any_thread;
|
|
self
|
|
}
|
|
}
|
|
|
|
/// Additional methods on [`Window`] that are specific to Wayland.
|
|
///
|
|
/// [`Window`]: crate::window::Window
|
|
pub trait WindowExtWayland {}
|
|
|
|
impl WindowExtWayland for dyn CoreWindow + '_ {}
|
|
|
|
/// Additional methods on [`WindowAttributes`] that are specific to Wayland.
|
|
pub trait WindowAttributesExtWayland {
|
|
/// Build window with the given name.
|
|
///
|
|
/// The `general` name sets an application ID, which should match the `.desktop`
|
|
/// file distributed with your program. The `instance` is a `no-op`.
|
|
///
|
|
/// For details about application ID conventions, see the
|
|
/// [Desktop Entry Spec](https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#desktop-file-id)
|
|
fn with_name(self, general: impl Into<String>, instance: impl Into<String>) -> Self;
|
|
}
|
|
|
|
impl WindowAttributesExtWayland for WindowAttributes {
|
|
#[inline]
|
|
fn with_name(mut self, general: impl Into<String>, instance: impl Into<String>) -> Self {
|
|
self.platform_specific.name =
|
|
Some(crate::platform_impl::ApplicationName::new(general.into(), instance.into()));
|
|
self
|
|
}
|
|
}
|