From 4ad5b922a025bf15539e1593e2e4cc003cf1d6ac Mon Sep 17 00:00:00 2001 From: Aceeri Date: Sat, 16 Jul 2022 17:53:33 -0700 Subject: [PATCH 1/5] Prep for next version of winit --- crates/bevy_window/src/window.rs | 46 ++++++++++++++++---------- crates/bevy_winit/Cargo.toml | 6 ++-- crates/bevy_winit/src/lib.rs | 12 +++++-- crates/bevy_winit/src/winit_windows.rs | 18 ++++++---- 4 files changed, 53 insertions(+), 29 deletions(-) diff --git a/crates/bevy_window/src/window.rs b/crates/bevy_window/src/window.rs index 3972046781d29..ff2eabed94082 100644 --- a/crates/bevy_window/src/window.rs +++ b/crates/bevy_window/src/window.rs @@ -198,7 +198,7 @@ pub struct Window { decorations: bool, cursor_icon: CursorIcon, cursor_visible: bool, - cursor_locked: bool, + cursor_grab_mode: CursorGrabMode, physical_cursor_position: Option, raw_window_handle: RawWindowHandleWrapper, focused: bool, @@ -245,9 +245,10 @@ pub enum WindowCommand { SetDecorations { decorations: bool, }, - /// Set whether or not the cursor's position is locked. - SetCursorLockMode { - locked: bool, + /// Set whether or not the cursor's postition is locked in place, confined to the window + /// or free to move anywhere + SetCursorGrabMode { + mode: CursorGrabMode, }, /// Set the cursor's [`CursorIcon`]. SetCursorIcon { @@ -282,8 +283,19 @@ pub enum WindowCommand { Close, } -/// Defines the way a window is displayed. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +/// Defines if and how the cursor is grabbed. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum CursorGrabMode { + /// No grabbing of the cursor is performed + None, + /// The cursor is confined to the window area. + Confined, + /// The cursor is locked inside the window area to a certain position. + Locked, +} + +/// Defines the way a window is displayed +#[derive(Debug, Clone, Copy, PartialEq)] pub enum WindowMode { /// Creates a window that uses the given size. Windowed, @@ -323,7 +335,7 @@ impl Window { resizable: window_descriptor.resizable, decorations: window_descriptor.decorations, cursor_visible: window_descriptor.cursor_visible, - cursor_locked: window_descriptor.cursor_locked, + cursor_grab_mode: window_descriptor.cursor_grab_mode, cursor_icon: CursorIcon::Default, physical_cursor_position: None, raw_window_handle: RawWindowHandleWrapper::new(raw_window_handle), @@ -584,17 +596,17 @@ impl Window { self.command_queue .push(WindowCommand::SetDecorations { decorations }); } - /// Get whether or not the cursor is locked. + /// Get whether or not the cursor is locked in position, confined to the window, or free to move. /// /// ## Platform-specific /// /// - **`macOS`** doesn't support cursor lock, but most windowing plugins can emulate it. See [issue #4875](https://github.com/bevyengine/bevy/issues/4875#issuecomment-1153977546) for more information. /// - **`iOS/Android`** don't have cursors. #[inline] - pub fn cursor_locked(&self) -> bool { - self.cursor_locked + pub fn cursor_grab_mode(&self) -> CursorGrabMode { + self.cursor_grab_mode } - /// Set whether or not the cursor is locked. + /// Set whether or not the cursor is locked in position, confined to the window, or free to move. /// /// This doesn't hide the cursor. For that, use [`set_cursor_visibility`](Window::set_cursor_visibility) /// @@ -602,10 +614,10 @@ impl Window { /// /// - **`macOS`** doesn't support cursor lock, but most windowing plugins can emulate it. See [issue #4875](https://github.com/bevyengine/bevy/issues/4875#issuecomment-1153977546) for more information. /// - **`iOS/Android`** don't have cursors. - pub fn set_cursor_lock_mode(&mut self, lock_mode: bool) { - self.cursor_locked = lock_mode; + pub fn set_cursor_grab_mode(&mut self, grab_mode: CursorGrabMode) { + self.cursor_grab_mode = grab_mode; self.command_queue - .push(WindowCommand::SetCursorLockMode { locked: lock_mode }); + .push(WindowCommand::SetCursorGrabMode { mode: grab_mode }); } /// Get whether or not the cursor is visible. /// @@ -813,8 +825,8 @@ pub struct WindowDescriptor { pub decorations: bool, /// Sets whether the cursor is visible when the window has focus. pub cursor_visible: bool, - /// Sets whether the window locks the cursor inside its borders when the window has focus. - pub cursor_locked: bool, + /// Sets the [`CursorGrabMode`](crate::CursorGrabMode) for whether it is confined/won't move to the window area. + pub cursor_grab_mode: CursorGrabMode, /// Sets the [`WindowMode`](crate::WindowMode). pub mode: WindowMode, /// Sets whether the background of the window should be transparent. @@ -856,7 +868,7 @@ impl Default for WindowDescriptor { present_mode: PresentMode::Fifo, resizable: true, decorations: true, - cursor_locked: false, + cursor_grab_mode: CursorGrabMode::None, cursor_visible: true, mode: WindowMode::Windowed, transparent: false, diff --git a/crates/bevy_winit/Cargo.toml b/crates/bevy_winit/Cargo.toml index 50a5c8ab7f802..1de888715fa41 100644 --- a/crates/bevy_winit/Cargo.toml +++ b/crates/bevy_winit/Cargo.toml @@ -22,12 +22,12 @@ bevy_window = { path = "../bevy_window", version = "0.8.0" } bevy_utils = { path = "../bevy_utils", version = "0.8.0" } # other -winit = { version = "0.26.0", default-features = false } -approx = { version = "0.5.0", default-features = false } +winit = { version = "0.27", default-features = false } +approx = { version = "0.5", default-features = false } raw-window-handle = "0.4.2" [target.'cfg(target_arch = "wasm32")'.dependencies] -winit = { version = "0.26.0", default-features = false } +winit = { version = "0.27", default-features = false } wasm-bindgen = { version = "0.2" } web-sys = "0.3" crossbeam-channel = "0.5" diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 135ad3326d86a..7edb3ba5798e4 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -135,10 +135,10 @@ fn change_window( let window = winit_windows.get_window(id).unwrap(); window.set_cursor_icon(converters::convert_cursor_icon(icon)); } - bevy_window::WindowCommand::SetCursorLockMode { locked } => { + bevy_window::WindowCommand::SetCursorGrabMode { mode } => { let window = winit_windows.get_window(id).unwrap(); window - .set_cursor_grab(locked) + .set_cursor_grab(winit_grab_mode(mode)) .unwrap_or_else(|e| error!("Unable to un/grab cursor: {}", e)); } bevy_window::WindowCommand::SetCursorVisibility { visible } => { @@ -710,3 +710,11 @@ fn handle_create_window_events( } } } + +fn winit_grab_mode(mode: bevy_window::CursorGrabMode) -> winit::window::CursorGrabMode { + match mode { + bevy_window::CursorGrabMode::None => winit::window::CursorGrabMode::None, + bevy_window::CursorGrabMode::Confined => winit::window::CursorGrabMode::Confined, + bevy_window::CursorGrabMode::Locked => winit::window::CursorGrabMode::Locked, + } +} diff --git a/crates/bevy_winit/src/winit_windows.rs b/crates/bevy_winit/src/winit_windows.rs index 91550eeffecf7..0adbfc37d3c9e 100644 --- a/crates/bevy_winit/src/winit_windows.rs +++ b/crates/bevy_winit/src/winit_windows.rs @@ -4,6 +4,8 @@ use bevy_window::{Window, WindowDescriptor, WindowId, WindowMode}; use raw_window_handle::HasRawWindowHandle; use winit::dpi::{LogicalPosition, LogicalSize, PhysicalPosition}; +use crate::winit_grab_mode; + #[derive(Debug, Default)] pub struct WinitWindows { pub windows: HashMap, @@ -155,11 +157,9 @@ impl WinitWindows { let winit_window = winit_window_builder.build(event_loop).unwrap(); - if window_descriptor.cursor_locked { - match winit_window.set_cursor_grab(true) { - Ok(_) | Err(winit::error::ExternalError::NotSupported(_)) => {} - Err(err) => Err(err).unwrap(), - } + match winit_window.set_cursor_grab(winit_grab_mode(window_descriptor.cursor_grab_mode)) { + Ok(_) | Err(winit::error::ExternalError::NotSupported(_)) => {} + Err(err) => Err(err).unwrap(), } winit_window.set_cursor_visible(window_descriptor.cursor_visible); @@ -238,7 +238,9 @@ pub fn get_fitting_videomode( match abs_diff(a.size().width, width).cmp(&abs_diff(b.size().width, width)) { Equal => { match abs_diff(a.size().height, height).cmp(&abs_diff(b.size().height, height)) { - Equal => b.refresh_rate().cmp(&a.refresh_rate()), + Equal => b + .refresh_rate_millihertz() + .cmp(&a.refresh_rate_millihertz()), default => default, } } @@ -255,7 +257,9 @@ pub fn get_best_videomode(monitor: &winit::monitor::MonitorHandle) -> winit::mon use std::cmp::Ordering::*; match b.size().width.cmp(&a.size().width) { Equal => match b.size().height.cmp(&a.size().height) { - Equal => b.refresh_rate().cmp(&a.refresh_rate()), + Equal => b + .refresh_rate_millihertz() + .cmp(&a.refresh_rate_millihertz()), default => default, }, default => default, From 883b37e20c7ecc7b3a45f04e9baa19be3c325481 Mon Sep 17 00:00:00 2001 From: Aceeri Date: Sun, 31 Jul 2022 19:07:35 -0700 Subject: [PATCH 2/5] Bump raw-window-handle version to 0.5 --- crates/bevy_window/Cargo.toml | 2 +- crates/bevy_winit/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_window/Cargo.toml b/crates/bevy_window/Cargo.toml index 8a93fd404ddb6..c1de706c94e11 100644 --- a/crates/bevy_window/Cargo.toml +++ b/crates/bevy_window/Cargo.toml @@ -16,7 +16,7 @@ bevy_math = { path = "../bevy_math", version = "0.8.0" } bevy_utils = { path = "../bevy_utils", version = "0.8.0" } # Used for close_on_esc bevy_input = { path = "../bevy_input", version = "0.8.0" } -raw-window-handle = "0.4.2" +raw-window-handle = "0.5" # other diff --git a/crates/bevy_winit/Cargo.toml b/crates/bevy_winit/Cargo.toml index 1de888715fa41..06219d35fe9a5 100644 --- a/crates/bevy_winit/Cargo.toml +++ b/crates/bevy_winit/Cargo.toml @@ -24,7 +24,7 @@ bevy_utils = { path = "../bevy_utils", version = "0.8.0" } # other winit = { version = "0.27", default-features = false } approx = { version = "0.5", default-features = false } -raw-window-handle = "0.4.2" +raw-window-handle = "0.5" [target.'cfg(target_arch = "wasm32")'.dependencies] winit = { version = "0.27", default-features = false } From cb715a7d84623f19f28f4b327c9043ba1cdfd934 Mon Sep 17 00:00:00 2001 From: Aceeri Date: Sun, 31 Jul 2022 19:09:28 -0700 Subject: [PATCH 3/5] Affirmative statement for grab mode documentation, rather than negative Co-authored-by: Alice Cecile --- crates/bevy_window/src/window.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_window/src/window.rs b/crates/bevy_window/src/window.rs index ff2eabed94082..1e2e029af2b85 100644 --- a/crates/bevy_window/src/window.rs +++ b/crates/bevy_window/src/window.rs @@ -286,7 +286,7 @@ pub enum WindowCommand { /// Defines if and how the cursor is grabbed. #[derive(Debug, Clone, Copy, PartialEq)] pub enum CursorGrabMode { - /// No grabbing of the cursor is performed + /// The cursor can freely leave the window None, /// The cursor is confined to the window area. Confined, From cbbb6caaf834cff56c018c8207180fc86184b3bf Mon Sep 17 00:00:00 2001 From: Aceeri Date: Sun, 31 Jul 2022 19:28:08 -0700 Subject: [PATCH 4/5] Remove duplicate winit dependency for wasm --- crates/bevy_winit/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/bevy_winit/Cargo.toml b/crates/bevy_winit/Cargo.toml index 06219d35fe9a5..21529afade824 100644 --- a/crates/bevy_winit/Cargo.toml +++ b/crates/bevy_winit/Cargo.toml @@ -27,7 +27,6 @@ approx = { version = "0.5", default-features = false } raw-window-handle = "0.5" [target.'cfg(target_arch = "wasm32")'.dependencies] -winit = { version = "0.27", default-features = false } wasm-bindgen = { version = "0.2" } web-sys = "0.3" crossbeam-channel = "0.5" From 8c67076dbf45123c5cf52498314158c361410a01 Mon Sep 17 00:00:00 2001 From: Aceeri Date: Tue, 2 Aug 2022 16:29:38 -0700 Subject: [PATCH 5/5] Bump ndk-glue to 0.7 --- crates/bevy_asset/Cargo.toml | 2 +- crates/bevy_internal/Cargo.toml | 2 +- deny.toml | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/crates/bevy_asset/Cargo.toml b/crates/bevy_asset/Cargo.toml index 69c5d537fd717..e357b2edc3a9b 100644 --- a/crates/bevy_asset/Cargo.toml +++ b/crates/bevy_asset/Cargo.toml @@ -40,7 +40,7 @@ wasm-bindgen-futures = "0.4" js-sys = "0.3" [target.'cfg(target_os = "android")'.dependencies] -ndk-glue = { version = "0.5" } +ndk-glue = { version = "0.7" } [dev-dependencies] futures-lite = "1.4.0" diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index b3fdf62952a51..7180edbf438dc 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -100,4 +100,4 @@ bevy_gilrs = { path = "../bevy_gilrs", optional = true, version = "0.8.0" } [target.'cfg(target_os = "android")'.dependencies] # This version *must* be the same as the version used by winit, # or Android will break: https://github.com/rust-windowing/winit#android -ndk-glue = {version = "0.5", features = ["logger"]} +ndk-glue = {version = "0.7", features = ["logger"]} diff --git a/deny.toml b/deny.toml index e060441b42336..81f2d5b81d1a4 100644 --- a/deny.toml +++ b/deny.toml @@ -40,9 +40,6 @@ skip = [ { name = "core-graphics", version = "0.19" }, # from winit v0.26.0 { name = "hashbrown", version = "0.11" }, # from wgpu v0.12 - https://github.com/zakarumych/gpu-descriptor/pull/21 { name = "mio", version = "0.7" }, # from notify v5.0.0-pre.11 - { name = "ndk", version = "0.5" }, # from winit v0.26.1 - { name = "ndk-glue", version = "0.5" }, # from winit v0.26.1 - { name = "ndk-sys", version = "0.2" }, # from winit v0.26.1 { name = "parking_lot", version = "0.11" }, # from rodio v0.15.0 { name = "parking_lot_core", version = "0.8" }, # from rodio v0.15.0 { name = "stdweb", version = "0.1" }, # from rodio v0.15.0