mirror of
https://github.com/bevyengine/bevy
synced 2025-02-16 22:18:33 +00:00
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 <justthecooldude@gmail.com>
This commit is contained in:
parent
5f1261110f
commit
308e092153
3 changed files with 16 additions and 18 deletions
|
@ -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 (<kbd>Esc</kbd>) is pressed
|
||||
///
|
||||
/// This is useful for examples or prototyping.
|
||||
pub fn close_on_esc(
|
||||
mut focused: Local<Option<WindowId>>,
|
||||
mut focused_events: EventReader<WindowFocused>,
|
||||
mut windows: ResMut<Windows>,
|
||||
input: Res<Input<KeyCode>>,
|
||||
) {
|
||||
// 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<Windows>, input: Res<Input<KeyCode>>) {
|
||||
if input.just_pressed(KeyCode::Escape) {
|
||||
if let Some(window) = windows.get_focused_mut() {
|
||||
window.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue