mirror of
https://github.com/rust-windowing/winit.git
synced 2026-09-01 14:20:05 -04:00
@@ -47,3 +47,4 @@ changelog entry.
|
|||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- On Windows, fixed the event loop not waking on accessibility requests.
|
- On Windows, fixed the event loop not waking on accessibility requests.
|
||||||
|
- On X11, fixed cursor grab mode state tracking on error.
|
||||||
|
|||||||
@@ -1492,6 +1492,11 @@ impl UnownedWindow {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_grab(&self, mode: CursorGrabMode) -> Result<(), ExternalError> {
|
pub fn set_cursor_grab(&self, mode: CursorGrabMode) -> Result<(), ExternalError> {
|
||||||
|
// We don't support the locked cursor yet, so ignore it early on.
|
||||||
|
if mode == CursorGrabMode::Locked {
|
||||||
|
return Err(ExternalError::NotSupported(NotSupportedError::new()));
|
||||||
|
}
|
||||||
|
|
||||||
let mut grabbed_lock = self.cursor_grabbed_mode.lock().unwrap();
|
let mut grabbed_lock = self.cursor_grabbed_mode.lock().unwrap();
|
||||||
if mode == *grabbed_lock {
|
if mode == *grabbed_lock {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -1503,40 +1508,40 @@ impl UnownedWindow {
|
|||||||
.xcb_connection()
|
.xcb_connection()
|
||||||
.ungrab_pointer(x11rb::CURRENT_TIME)
|
.ungrab_pointer(x11rb::CURRENT_TIME)
|
||||||
.expect_then_ignore_error("Failed to call `xcb_ungrab_pointer`");
|
.expect_then_ignore_error("Failed to call `xcb_ungrab_pointer`");
|
||||||
|
*grabbed_lock = CursorGrabMode::None;
|
||||||
|
|
||||||
let result = match mode {
|
let result = match mode {
|
||||||
CursorGrabMode::None => self.xconn.flush_requests().map_err(|err| {
|
CursorGrabMode::None => self.xconn.flush_requests().map_err(|err| {
|
||||||
ExternalError::Os(os_error!(OsError::XError(X11Error::Xlib(err).into())))
|
ExternalError::Os(os_error!(OsError::XError(X11Error::Xlib(err).into())))
|
||||||
}),
|
}),
|
||||||
CursorGrabMode::Confined => {
|
CursorGrabMode::Confined => {
|
||||||
let result = {
|
let result = self
|
||||||
self.xconn
|
.xconn
|
||||||
.xcb_connection()
|
.xcb_connection()
|
||||||
.grab_pointer(
|
.grab_pointer(
|
||||||
true as _,
|
true as _,
|
||||||
self.xwindow,
|
self.xwindow,
|
||||||
xproto::EventMask::BUTTON_PRESS
|
xproto::EventMask::BUTTON_PRESS
|
||||||
| xproto::EventMask::BUTTON_RELEASE
|
| xproto::EventMask::BUTTON_RELEASE
|
||||||
| xproto::EventMask::ENTER_WINDOW
|
| xproto::EventMask::ENTER_WINDOW
|
||||||
| xproto::EventMask::LEAVE_WINDOW
|
| xproto::EventMask::LEAVE_WINDOW
|
||||||
| xproto::EventMask::POINTER_MOTION
|
| xproto::EventMask::POINTER_MOTION
|
||||||
| xproto::EventMask::POINTER_MOTION_HINT
|
| xproto::EventMask::POINTER_MOTION_HINT
|
||||||
| xproto::EventMask::BUTTON1_MOTION
|
| xproto::EventMask::BUTTON1_MOTION
|
||||||
| xproto::EventMask::BUTTON2_MOTION
|
| xproto::EventMask::BUTTON2_MOTION
|
||||||
| xproto::EventMask::BUTTON3_MOTION
|
| xproto::EventMask::BUTTON3_MOTION
|
||||||
| xproto::EventMask::BUTTON4_MOTION
|
| xproto::EventMask::BUTTON4_MOTION
|
||||||
| xproto::EventMask::BUTTON5_MOTION
|
| xproto::EventMask::BUTTON5_MOTION
|
||||||
| xproto::EventMask::KEYMAP_STATE,
|
| xproto::EventMask::KEYMAP_STATE,
|
||||||
xproto::GrabMode::ASYNC,
|
xproto::GrabMode::ASYNC,
|
||||||
xproto::GrabMode::ASYNC,
|
xproto::GrabMode::ASYNC,
|
||||||
self.xwindow,
|
self.xwindow,
|
||||||
0u32,
|
0u32,
|
||||||
x11rb::CURRENT_TIME,
|
x11rb::CURRENT_TIME,
|
||||||
)
|
)
|
||||||
.expect("Failed to call `grab_pointer`")
|
.expect("Failed to call `grab_pointer`")
|
||||||
.reply()
|
.reply()
|
||||||
.expect("Failed to receive reply from `grab_pointer`")
|
.expect("Failed to receive reply from `grab_pointer`");
|
||||||
};
|
|
||||||
|
|
||||||
match result.status {
|
match result.status {
|
||||||
xproto::GrabStatus::SUCCESS => Ok(()),
|
xproto::GrabStatus::SUCCESS => Ok(()),
|
||||||
@@ -1556,9 +1561,7 @@ impl UnownedWindow {
|
|||||||
}
|
}
|
||||||
.map_err(|err| ExternalError::Os(os_error!(OsError::Misc(err))))
|
.map_err(|err| ExternalError::Os(os_error!(OsError::Misc(err))))
|
||||||
},
|
},
|
||||||
CursorGrabMode::Locked => {
|
CursorGrabMode::Locked => return Ok(()),
|
||||||
return Err(ExternalError::NotSupported(NotSupportedError::new()));
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if result.is_ok() {
|
if result.is_ok() {
|
||||||
|
|||||||
Reference in New Issue
Block a user