Skip to content

Commit 7159438

Browse files
committed
Prep for next version of winit
1 parent 5ace79f commit 7159438

File tree

3 files changed

+47
-24
lines changed

3 files changed

+47
-24
lines changed

crates/bevy_window/src/window.rs

+26-15
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ pub struct Window {
160160
decorations: bool,
161161
cursor_icon: CursorIcon,
162162
cursor_visible: bool,
163-
cursor_locked: bool,
163+
cursor_grab_mode: CursorGrabMode,
164164
physical_cursor_position: Option<DVec2>,
165165
raw_window_handle: RawWindowHandleWrapper,
166166
focused: bool,
@@ -195,8 +195,8 @@ pub enum WindowCommand {
195195
SetDecorations {
196196
decorations: bool,
197197
},
198-
SetCursorLockMode {
199-
locked: bool,
198+
SetCursorGrabMode {
199+
mode: CursorGrabMode,
200200
},
201201
SetCursorIcon {
202202
icon: CursorIcon,
@@ -222,6 +222,17 @@ pub enum WindowCommand {
222222
Close,
223223
}
224224

225+
/// Defines how the cursor is grabbed.
226+
#[derive(Debug, Clone, Copy, PartialEq)]
227+
pub enum CursorGrabMode {
228+
/// No grabbing of the cursor is performed
229+
None,
230+
/// The cursor is confined to the window area.
231+
Confined,
232+
/// The cursor is locked inside the window area to a certain position.
233+
Locked,
234+
}
235+
225236
/// Defines the way a window is displayed
226237
#[derive(Debug, Clone, Copy, PartialEq)]
227238
pub enum WindowMode {
@@ -261,7 +272,7 @@ impl Window {
261272
resizable: window_descriptor.resizable,
262273
decorations: window_descriptor.decorations,
263274
cursor_visible: window_descriptor.cursor_visible,
264-
cursor_locked: window_descriptor.cursor_locked,
275+
cursor_grab_mode: window_descriptor.cursor_grab_mode,
265276
cursor_icon: CursorIcon::Default,
266277
physical_cursor_position: None,
267278
raw_window_handle: RawWindowHandleWrapper::new(raw_window_handle),
@@ -496,25 +507,25 @@ impl Window {
496507
}
497508

498509
#[inline]
499-
pub fn cursor_locked(&self) -> bool {
500-
self.cursor_locked
510+
pub fn cursor_grab_mode(&self) -> CursorGrabMode {
511+
self.cursor_grab_mode
501512
}
502513

503-
pub fn set_cursor_lock_mode(&mut self, lock_mode: bool) {
504-
self.cursor_locked = lock_mode;
514+
pub fn set_cursor_grab_mode(&mut self, grab_mode: CursorGrabMode) {
515+
self.cursor_grab_mode = grab_mode;
505516
self.command_queue
506-
.push(WindowCommand::SetCursorLockMode { locked: lock_mode });
517+
.push(WindowCommand::SetCursorGrabMode { mode: grab_mode });
507518
}
508519

509520
#[inline]
510521
pub fn cursor_visible(&self) -> bool {
511522
self.cursor_visible
512523
}
513524

514-
pub fn set_cursor_visibility(&mut self, visibile_mode: bool) {
515-
self.cursor_visible = visibile_mode;
525+
pub fn set_cursor_visibility(&mut self, visible_mode: bool) {
526+
self.cursor_visible = visible_mode;
516527
self.command_queue.push(WindowCommand::SetCursorVisibility {
517-
visible: visibile_mode,
528+
visible: visible_mode,
518529
});
519530
}
520531

@@ -663,8 +674,8 @@ pub struct WindowDescriptor {
663674
pub decorations: bool,
664675
/// Sets whether the cursor is visible when the window has focus.
665676
pub cursor_visible: bool,
666-
/// Sets whether the window locks the cursor inside its borders when the window has focus.
667-
pub cursor_locked: bool,
677+
/// Sets the [`CursorGrabMode`](crate::CursorGrabMode) for whether it is confined/won't move to the window area.
678+
pub cursor_grab_mode: CursorGrabMode,
668679
/// Sets the [`WindowMode`](crate::WindowMode).
669680
pub mode: WindowMode,
670681
/// Sets whether the background of the window should be transparent.
@@ -703,7 +714,7 @@ impl Default for WindowDescriptor {
703714
present_mode: PresentMode::Fifo,
704715
resizable: true,
705716
decorations: true,
706-
cursor_locked: false,
717+
cursor_grab_mode: CursorGrabMode::None,
707718
cursor_visible: true,
708719
mode: WindowMode::Windowed,
709720
transparent: false,

crates/bevy_winit/src/lib.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ fn change_window(
123123
let window = winit_windows.get_window(id).unwrap();
124124
window.set_cursor_icon(converters::convert_cursor_icon(icon));
125125
}
126-
bevy_window::WindowCommand::SetCursorLockMode { locked } => {
126+
bevy_window::WindowCommand::SetCursorGrabMode { mode } => {
127127
let window = winit_windows.get_window(id).unwrap();
128128
window
129-
.set_cursor_grab(locked)
129+
.set_cursor_grab(winit_grab_mode(mode))
130130
.unwrap_or_else(|e| error!("Unable to un/grab cursor: {}", e));
131131
}
132132
bevy_window::WindowCommand::SetCursorVisibility { visible } => {
@@ -662,3 +662,11 @@ fn handle_create_window_events(
662662
}
663663
}
664664
}
665+
666+
fn winit_grab_mode(mode: bevy_window::CursorGrabMode) -> winit::window::CursorGrabMode {
667+
match mode {
668+
bevy_window::CursorGrabMode::None => winit::window::CursorGrabMode::None,
669+
bevy_window::CursorGrabMode::Confined => winit::window::CursorGrabMode::Confined,
670+
bevy_window::CursorGrabMode::Locked => winit::window::CursorGrabMode::Locked,
671+
}
672+
}

crates/bevy_winit/src/winit_windows.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use bevy_window::{Window, WindowDescriptor, WindowId, WindowMode};
44
use raw_window_handle::HasRawWindowHandle;
55
use winit::dpi::LogicalSize;
66

7+
use crate::winit_grab_mode;
8+
79
#[derive(Debug, Default)]
810
pub struct WinitWindows {
911
pub windows: HashMap<winit::window::WindowId, winit::window::Window>,
@@ -124,11 +126,9 @@ impl WinitWindows {
124126

125127
let winit_window = winit_window_builder.build(event_loop).unwrap();
126128

127-
if window_descriptor.cursor_locked {
128-
match winit_window.set_cursor_grab(true) {
129-
Ok(_) | Err(winit::error::ExternalError::NotSupported(_)) => {}
130-
Err(err) => Err(err).unwrap(),
131-
}
129+
match winit_window.set_cursor_grab(winit_grab_mode(window_descriptor.cursor_grab_mode)) {
130+
Ok(_) | Err(winit::error::ExternalError::NotSupported(_)) => {}
131+
Err(err) => Err(err).unwrap(),
132132
}
133133

134134
winit_window.set_cursor_visible(window_descriptor.cursor_visible);
@@ -207,7 +207,9 @@ pub fn get_fitting_videomode(
207207
match abs_diff(a.size().width, width).cmp(&abs_diff(b.size().width, width)) {
208208
Equal => {
209209
match abs_diff(a.size().height, height).cmp(&abs_diff(b.size().height, height)) {
210-
Equal => b.refresh_rate().cmp(&a.refresh_rate()),
210+
Equal => b
211+
.refresh_rate_millihertz()
212+
.cmp(&a.refresh_rate_millihertz()),
211213
default => default,
212214
}
213215
}
@@ -224,7 +226,9 @@ pub fn get_best_videomode(monitor: &winit::monitor::MonitorHandle) -> winit::mon
224226
use std::cmp::Ordering::*;
225227
match b.size().width.cmp(&a.size().width) {
226228
Equal => match b.size().height.cmp(&a.size().height) {
227-
Equal => b.refresh_rate().cmp(&a.refresh_rate()),
229+
Equal => b
230+
.refresh_rate_millihertz()
231+
.cmp(&a.refresh_rate_millihertz()),
228232
default => default,
229233
},
230234
default => default,

0 commit comments

Comments
 (0)