Wayland, Windows, MacOS: Popup Implementation (#4543)

Implement proper decorationless popups by specifying the type of the child window with with_type()

With this commit, different kind of child windows can be created

-  Popups: Special windows without any decoration which can be positioned relative to the parent
-  Window: Normal window with a parent or not

The type can be specified during creation of the Window using the window_attributes and the with_type() function. As default a normal Window is used. If Popup is choosen a parent must be specified, otherwise the Popup creation fails with an Error returned by the new() function.

Related issues: #403 and #4256
This commit is contained in:
Martin Marmsoler
2026-07-27 15:43:51 +02:00
committed by GitHub
parent 1fe178b2a6
commit 9674d8ceef
22 changed files with 2035 additions and 368 deletions

View File

@@ -13,7 +13,7 @@ use winit_core::icon::Icon;
use winit_core::monitor::{Fullscreen, MonitorHandle as CoremMonitorHandle};
use winit_core::window::{
CursorGrabMode, ImeRequestError, ResizeDirection, Theme, UserAttentionType,
Window as RootWindow, WindowAttributes, WindowButtons, WindowId, WindowLevel,
Window as RootWindow, WindowAttributes, WindowButtons, WindowId, WindowLevel, WindowType,
};
use crate::r#async::Dispatcher;
@@ -46,6 +46,12 @@ impl Window {
target: &ActiveEventLoop,
attr: WindowAttributes,
) -> Result<Self, RequestError> {
if attr.window_type() == WindowType::Popup {
return Err(RequestError::NotSupported(NotSupportedError::new(
"Popups are not implemented for Web",
)));
}
let id = target.generate_id();
let window = target.runner.window();
@@ -103,6 +109,10 @@ impl Window {
}
impl RootWindow for Window {
fn window_type(&self) -> WindowType {
WindowType::Window
}
fn id(&self) -> WindowId {
self.inner.queue(|inner| inner.id)
}