SIGN IN SIGN UP
bevyengine / bevy UNCLAIMED

A refreshingly simple data-driven game engine built in Rust

0 0 87 Rust

Refactor window creation logic (#22088)

# Objective

Fixes #21948

Currently we tell winit to spawn any new `Window`s during the
`about_to_wait` lifecycle method, but that's unreliable: if no new
events appear while we're already waiting it could take an arbitrarily
long time, or no new events could appear at all so we never spawn the
window. This is especially bad when going from 0 to 1 `Window`s, as many
events are related to the existing window.

## Solution

Check for new windows in `resumed` for the initial window (which is also
what winit examples do) and in `user_event` for new windows.

I also did some other improvements while I was investigating this:
* Inlined the `Added<Window>` query filter into `CreateWindowParams`, as
the logic didn't make sense with any other filter.
* Insert the `EventLoopProxyWrapper` resource when the plugin builds
instead of inside the `winit_runner`. This currently makes no practical
difference, but in another version of this PR I had a crash because the
observer tried to use the resource before the runner started. It's also
a more natural way to do it.
* Made `WinitPlugin` no longer generic, and removed the
`custom_user_event` example. The functionality it provides (being able
to send events into bevy from the outside) only works in one direction,
and I don't see why it needs to go via winit instead of a dedicated
plugin with channels. ~~If this feature is useful for reasons I've
missed then I'm happy to re-add it.~~ edit: winit is removing custom
user events in 0.31, which made me even more confident it's the right
direction for us too.

## Testing

Run different examples and see that the window spawns in a timely
fashion, edit the `multiple_windows` example as in #21948 and see that
the window spawns.
K
Kristoffer Søholm committed
61a46455d1b3d652e948bff94d4d8aafc7c19a65
Parent: d88ff08
Committed by GitHub <noreply@github.com> on 12/16/2025, 3:36:02 AM