From 847511672ae35c78a5d35b34f11047ec9ce271bf Mon Sep 17 00:00:00 2001 From: Putta Khunchalee Date: Tue, 29 Apr 2025 13:31:49 +0900 Subject: [PATCH] wayland: add WindowExtWayland::xdg_toplevel Fixes #4068. --- src/changelog/unreleased.md | 1 + src/platform/wayland.rs | 24 +++++++++++++++++-- src/platform_impl/linux/wayland/window/mod.rs | 6 +++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/changelog/unreleased.md b/src/changelog/unreleased.md index 94ece6741..2bbcfdccc 100644 --- a/src/changelog/unreleased.md +++ b/src/changelog/unreleased.md @@ -44,6 +44,7 @@ changelog entry. - On Windows, add `IconExtWindows::from_resource_name`. - On Windows, add `CursorGrabMode::Locked`. +- On Wayland, add `WindowExtWayland::xdg_toplevel`. ### Fixed diff --git a/src/platform/wayland.rs b/src/platform/wayland.rs index db6a217dc..9c1a8e437 100644 --- a/src/platform/wayland.rs +++ b/src/platform/wayland.rs @@ -13,6 +13,10 @@ //! * `wayland-csd-adwaita` (default). //! * `wayland-csd-adwaita-crossfont`. //! * `wayland-csd-adwaita-notitle`. + +use std::ffi::c_void; +use std::ptr::NonNull; + use crate::event_loop::{ActiveEventLoop, EventLoop, EventLoopBuilder}; use crate::monitor::MonitorHandle; use crate::window::{Window, WindowAttributes}; @@ -72,9 +76,25 @@ impl EventLoopBuilderExtWayland for EventLoopBuilder { } /// Additional methods on [`Window`] that are specific to Wayland. -pub trait WindowExtWayland {} +/// +/// [`Window`]: crate::window::Window +pub trait WindowExtWayland { + /// Returns `xdg_toplevel` of the window or [`None`] if the window is X11 window. + fn xdg_toplevel(&self) -> Option>; +} -impl WindowExtWayland for Window {} +impl WindowExtWayland for Window { + #[inline] + fn xdg_toplevel(&self) -> Option> { + #[allow(clippy::single_match)] + match &self.window { + #[cfg(x11_platform)] + crate::platform_impl::Window::X(_) => None, + #[cfg(wayland_platform)] + crate::platform_impl::Window::Wayland(window) => window.xdg_toplevel(), + } + } +} /// Additional methods on [`WindowAttributes`] that are specific to Wayland. pub trait WindowAttributesExtWayland { diff --git a/src/platform_impl/linux/wayland/window/mod.rs b/src/platform_impl/linux/wayland/window/mod.rs index 83d6f8032..047affeb0 100644 --- a/src/platform_impl/linux/wayland/window/mod.rs +++ b/src/platform_impl/linux/wayland/window/mod.rs @@ -1,5 +1,7 @@ //! The Wayland window. +use std::ffi::c_void; +use std::ptr::NonNull; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; @@ -223,6 +225,10 @@ impl Window { window_events_sink, }) } + + pub(crate) fn xdg_toplevel(&self) -> Option> { + NonNull::new(self.window.xdg_toplevel().id().as_ptr().cast()) + } } impl Window {