Allow unfocused window creation (#19237)

# Objective

Allow creating a new window without it being focused, when `Window`'s
`focused` is `false.
## Solution

Use `winit`'s `WindowBuilder`'s `with_active` method

## Notes

- `winit`'s doc lists [redox's
`Orbital`](https://gitlab.redox-os.org/redox-os/orbital) as an
unsupported platform, but since Bevy doesn't officially support this
platform, I didn't put it in the documentation.

- I only tested on Linux, which is an unsupported platform. I can give
you a test code if you want to test on another platform.

- I initially put a line
[here](https://github.com/bevyengine/bevy/blob/v0.11.0/crates/bevy_winit/src/system.rs#L72)
to set the Bevy `Window`'s `focused` to `winit_window.has_focus()` after
window creation to avoid the case where `with_active` is not supported,
the window is spawned focused, no `WindowFocused` event is triggered,
and Bevy `Window` would be desynced from winit's window. But after
testing on Linux (which doesn't support `with_active`) it seems like at
that point `has_focus` returns `false` and the event is triggered, so I
removed it. Do you think I should add it back to be safe?

## Changelog

- A new unfocused `Window` can be created by setting `focused` to
`false`.

## Migration Guide

- If a `Window` is spawned with `focused` set to `false`, it will now
start not focused on supported platforms.

Adopted from #9208

---------

Co-authored-by: Sélène Amanita <selene.amanita@net-c.com>
Co-authored-by: Sélène Amanita <134181069+Selene-Amanita@users.noreply.github.com>
Co-authored-by: atlv <email@atlasdostal.com>
Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
This commit is contained in:
Benjamin Brienen 2025-05-26 22:05:33 +02:00 committed by GitHub
parent f8cb8f237d
commit 818a8fe154
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 1 deletions

View File

@ -225,6 +225,15 @@ pub struct Window {
/// You should also set the window `composite_alpha_mode` to `CompositeAlphaMode::PostMultiplied`.
pub transparent: bool,
/// Get/set whether the window is focused.
///
/// It cannot be set unfocused after creation.
///
/// ## Platform-specific
///
/// - iOS / Android / X11 / Wayland: Spawning unfocused is
/// [not supported](https://docs.rs/winit/latest/winit/window/struct.WindowAttributes.html#method.with_active).
/// - iOS / Android / Web / Wayland: Setting focused after creation is
/// [not supported](https://docs.rs/winit/latest/winit/window/struct.Window.html#method.focus_window).
pub focused: bool,
/// Where should the window appear relative to other overlapping window.
///

View File

@ -129,7 +129,8 @@ impl WinitWindows {
.with_resizable(window.resizable)
.with_enabled_buttons(convert_enabled_buttons(window.enabled_buttons))
.with_decorations(window.decorations)
.with_transparent(window.transparent);
.with_transparent(window.transparent)
.with_active(window.focused);
#[cfg(target_os = "windows")]
{