mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-01-27 03:56:33 +11:00
Change set_cursor_position to return Result<(), String> (#562)
* Change set_cursor_position to return Result<(), String> This is now consistent with `grab_cursor`, and enables `window.set_cursor_position(x, y)?` in functions that return `Result<_, Box<Error>>`. * Adjust error handling of unimplemented cusor opertions in wayland * The final nitpick * Actually one more
This commit is contained in:
parent
fb7528c239
commit
8f394f117b
10 changed files with 40 additions and 31 deletions
|
@ -17,6 +17,7 @@
|
||||||
- Fixed quirk on macOS where certain keys would generate characters at twice the normal rate when held down.
|
- Fixed quirk on macOS where certain keys would generate characters at twice the normal rate when held down.
|
||||||
- On X11, all event loops now share the same `XConnection`.
|
- On X11, all event loops now share the same `XConnection`.
|
||||||
- **Breaking:** `Window::set_cursor_state` and `CursorState` enum removed in favor of the more composable `Window::grab_cursor` and `Window::hide_cursor`. As a result, grabbing the cursor no longer automatically hides it; you must call both methods to retain the old behavior on Windows and macOS. `Cursor::NoneCursor` has been removed, as it's no longer useful.
|
- **Breaking:** `Window::set_cursor_state` and `CursorState` enum removed in favor of the more composable `Window::grab_cursor` and `Window::hide_cursor`. As a result, grabbing the cursor no longer automatically hides it; you must call both methods to retain the old behavior on Windows and macOS. `Cursor::NoneCursor` has been removed, as it's no longer useful.
|
||||||
|
- **Breaking:** `Window::set_cursor_position` now returns `Result<(), String>`, thus allowing for `Box<Error>` conversion via `?`.
|
||||||
|
|
||||||
# Version 0.15.1 (2018-06-13)
|
# Version 0.15.1 (2018-06-13)
|
||||||
|
|
||||||
|
|
|
@ -346,9 +346,8 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, _position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, _position: LogicalPosition) -> Result<(), String> {
|
||||||
// N/A
|
Err("Setting cursor position is not possible on Android.".to_owned())
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -559,8 +559,8 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, _position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, _position: LogicalPosition) -> Result<(), String> {
|
||||||
Err(())
|
Err("Setting cursor position is not possible on Emscripten.".to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -408,9 +408,8 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, _position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, _position: LogicalPosition) -> Result<(), String> {
|
||||||
// N/A
|
Err("Setting cursor position is not possible on iOS.".to_owned())
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -251,7 +251,7 @@ impl Window {
|
||||||
pub fn grab_cursor(&self, grab: bool) -> Result<(), String> {
|
pub fn grab_cursor(&self, grab: bool) -> Result<(), String> {
|
||||||
match self {
|
match self {
|
||||||
&Window::X(ref window) => window.grab_cursor(grab),
|
&Window::X(ref window) => window.grab_cursor(grab),
|
||||||
&Window::Wayland(ref _window) => Err("Cursor grabbing is not yet possible on Wayland.".to_owned()),
|
&Window::Wayland(ref window) => window.grab_cursor(grab),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ impl Window {
|
||||||
pub fn hide_cursor(&self, hide: bool) {
|
pub fn hide_cursor(&self, hide: bool) {
|
||||||
match self {
|
match self {
|
||||||
&Window::X(ref window) => window.hide_cursor(hide),
|
&Window::X(ref window) => window.hide_cursor(hide),
|
||||||
&Window::Wayland(ref _window) => unimplemented!(),
|
&Window::Wayland(ref window) => window.hide_cursor(hide),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,7 +272,7 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, position: LogicalPosition) -> Result<(), String> {
|
||||||
match self {
|
match self {
|
||||||
&Window::X(ref w) => w.set_cursor_position(position),
|
&Window::X(ref w) => w.set_cursor_position(position),
|
||||||
&Window::Wayland(ref w) => w.set_cursor_position(position),
|
&Window::Wayland(ref w) => w.set_cursor_position(position),
|
||||||
|
|
|
@ -235,11 +235,6 @@ impl Window {
|
||||||
self.frame.lock().unwrap().set_resizable(resizable);
|
self.frame.lock().unwrap().set_resizable(resizable);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn set_cursor(&self, _cursor: MouseCursor) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn hidpi_factor(&self) -> i32 {
|
pub fn hidpi_factor(&self) -> i32 {
|
||||||
self.monitors.lock().unwrap().compute_hidpi_factor()
|
self.monitors.lock().unwrap().compute_hidpi_factor()
|
||||||
|
@ -273,9 +268,23 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, _pos: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor(&self, _cursor: MouseCursor) {
|
||||||
// TODO: not yet possible on wayland
|
// TODO
|
||||||
Err(())
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn hide_cursor(&self, _hide: bool) {
|
||||||
|
// TODO: This isn't possible on Wayland yet
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn grab_cursor(&self, _grab: bool) -> Result<(), String> {
|
||||||
|
Err("Cursor grabbing is not yet possible on Wayland.".to_owned())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn set_cursor_position(&self, _pos: LogicalPosition) -> Result<(), String> {
|
||||||
|
Err("Setting the cursor position is not yet possible on Wayland.".to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_display(&self) -> &Display {
|
pub fn get_display(&self) -> &Display {
|
||||||
|
|
|
@ -1113,7 +1113,7 @@ impl UnownedWindow {
|
||||||
self.get_current_monitor().hidpi_factor
|
self.get_current_monitor().hidpi_factor
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn set_cursor_position_physical(&self, x: i32, y: i32) -> Result<(), ()> {
|
pub fn set_cursor_position_physical(&self, x: i32, y: i32) -> Result<(), String> {
|
||||||
unsafe {
|
unsafe {
|
||||||
(self.xconn.xlib.XWarpPointer)(
|
(self.xconn.xlib.XWarpPointer)(
|
||||||
self.xconn.display,
|
self.xconn.display,
|
||||||
|
@ -1126,12 +1126,12 @@ impl UnownedWindow {
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
);
|
);
|
||||||
self.xconn.flush_requests().map_err(|_| ())
|
self.xconn.flush_requests().map_err(|e| format!("`XWarpPointer` failed: {:?}", e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, logical_position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, logical_position: LogicalPosition) -> Result<(), String> {
|
||||||
let (x, y) = logical_position.to_physical(self.get_hidpi_factor()).into();
|
let (x, y) = logical_position.to_physical(self.get_hidpi_factor()).into();
|
||||||
self.set_cursor_position_physical(x, y)
|
self.set_cursor_position_physical(x, y)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1025,17 +1025,18 @@ impl Window2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, cursor_position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, cursor_position: LogicalPosition) -> Result<(), String> {
|
||||||
let window_position = self.get_inner_position()
|
let window_position = self.get_inner_position()
|
||||||
.expect("`get_inner_position` failed");
|
.ok_or("`get_inner_position` failed".to_owned())?;
|
||||||
let point = appkit::CGPoint {
|
let point = appkit::CGPoint {
|
||||||
x: (cursor_position.x + window_position.x) as CGFloat,
|
x: (cursor_position.x + window_position.x) as CGFloat,
|
||||||
y: (cursor_position.y + window_position.y) as CGFloat,
|
y: (cursor_position.y + window_position.y) as CGFloat,
|
||||||
};
|
};
|
||||||
CGDisplay::warp_mouse_cursor_position(point)
|
CGDisplay::warp_mouse_cursor_position(point)
|
||||||
.expect("`CGWarpMouseCursorPosition` failed");
|
.map_err(|e| format!("`CGWarpMouseCursorPosition` failed: {:?}", e))?;
|
||||||
CGDisplay::associate_mouse_and_mouse_cursor_position(true)
|
CGDisplay::associate_mouse_and_mouse_cursor_position(true)
|
||||||
.expect("`CGAssociateMouseAndMouseCursorPosition` failed");
|
.map_err(|e| format!("`CGAssociateMouseAndMouseCursorPosition` failed: {:?}", e))?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -438,21 +438,21 @@ impl Window {
|
||||||
get_window_scale_factor(self.window.0, self.window.1)
|
get_window_scale_factor(self.window.0, self.window.1)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_cursor_position_physical(&self, x: i32, y: i32) -> Result<(), ()> {
|
fn set_cursor_position_physical(&self, x: i32, y: i32) -> Result<(), String> {
|
||||||
let mut point = POINT { x, y };
|
let mut point = POINT { x, y };
|
||||||
unsafe {
|
unsafe {
|
||||||
if winuser::ClientToScreen(self.window.0, &mut point) == 0 {
|
if winuser::ClientToScreen(self.window.0, &mut point) == 0 {
|
||||||
return Err(());
|
return Err("`ClientToScreen` failed".to_owned());
|
||||||
}
|
}
|
||||||
if winuser::SetCursorPos(point.x, point.y) == 0 {
|
if winuser::SetCursorPos(point.x, point.y) == 0 {
|
||||||
return Err(());
|
return Err("`SetCursorPos` failed".to_owned());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, logical_position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, logical_position: LogicalPosition) -> Result<(), String> {
|
||||||
let dpi_factor = self.get_hidpi_factor();
|
let dpi_factor = self.get_hidpi_factor();
|
||||||
let (x, y) = logical_position.to_physical(dpi_factor).into();
|
let (x, y) = logical_position.to_physical(dpi_factor).into();
|
||||||
self.set_cursor_position_physical(x, y)
|
self.set_cursor_position_physical(x, y)
|
||||||
|
|
|
@ -322,7 +322,7 @@ impl Window {
|
||||||
|
|
||||||
/// Changes the position of the cursor in window coordinates.
|
/// Changes the position of the cursor in window coordinates.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position(&self, position: LogicalPosition) -> Result<(), ()> {
|
pub fn set_cursor_position(&self, position: LogicalPosition) -> Result<(), String> {
|
||||||
self.window.set_cursor_position(position)
|
self.window.set_cursor_position(position)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue