From 308e092153afbfedc73d92370c6df9f8581d4da4 Mon Sep 17 00:00:00 2001 From: ira Date: Mon, 14 Nov 2022 21:59:18 +0000 Subject: [PATCH] Add `Windows::get_focused(_mut)` (#6571) Add a method to get the focused window. Use this instead of `WindowFocused` events in `close_on_esc`. Seems that the OS/window manager might not always send focused events on application startup. Sadly, not a fix for #5646. Co-authored-by: devil-ira --- crates/bevy_window/src/system.rs | 22 +++++----------------- crates/bevy_window/src/window.rs | 2 +- crates/bevy_window/src/windows.rs | 10 ++++++++++ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/crates/bevy_window/src/system.rs b/crates/bevy_window/src/system.rs index 6cb17b877a..4cf79fa549 100644 --- a/crates/bevy_window/src/system.rs +++ b/crates/bevy_window/src/system.rs @@ -1,4 +1,4 @@ -use crate::{Window, WindowCloseRequested, WindowFocused, WindowId, Windows}; +use crate::{Window, WindowCloseRequested, Windows}; use bevy_app::AppExit; use bevy_ecs::prelude::*; @@ -36,22 +36,10 @@ pub fn close_when_requested( /// Close the focused window whenever the escape key (Esc) is pressed /// /// This is useful for examples or prototyping. -pub fn close_on_esc( - mut focused: Local>, - mut focused_events: EventReader, - mut windows: ResMut, - input: Res>, -) { - // TODO: Track this in e.g. a resource to ensure consistent behaviour across similar systems - for event in focused_events.iter() { - *focused = event.focused.then_some(event.id); - } - - if let Some(focused) = &*focused { - if input.just_pressed(KeyCode::Escape) { - if let Some(window) = windows.get_mut(*focused) { - window.close(); - } +pub fn close_on_esc(mut windows: ResMut, input: Res>) { + if input.just_pressed(KeyCode::Escape) { + if let Some(window) = windows.get_focused_mut() { + window.close(); } } } diff --git a/crates/bevy_window/src/window.rs b/crates/bevy_window/src/window.rs index 1c7416b2c9..ccc764210e 100644 --- a/crates/bevy_window/src/window.rs +++ b/crates/bevy_window/src/window.rs @@ -432,7 +432,7 @@ impl Window { cursor_icon: CursorIcon::Default, physical_cursor_position: None, raw_handle, - focused: true, + focused: false, mode: window_descriptor.mode, canvas: window_descriptor.canvas.clone(), fit_canvas_to_parent: window_descriptor.fit_canvas_to_parent, diff --git a/crates/bevy_window/src/windows.rs b/crates/bevy_window/src/windows.rs index 29efe73876..5ffbf524c1 100644 --- a/crates/bevy_window/src/windows.rs +++ b/crates/bevy_window/src/windows.rs @@ -53,6 +53,16 @@ impl Windows { .expect("Primary window does not exist") } + /// Get a reference to the focused [`Window`]. + pub fn get_focused(&self) -> Option<&Window> { + self.windows.values().find(|window| window.is_focused()) + } + + /// Get a mutable reference to the focused [`Window`]. + pub fn get_focused_mut(&mut self) -> Option<&mut Window> { + self.windows.values_mut().find(|window| window.is_focused()) + } + /// Returns the scale factor for the [`Window`] of `id`, or `1.0` if the window does not exist. pub fn scale_factor(&self, id: WindowId) -> f64 { if let Some(window) = self.get(id) {