Windows: Fix set_cursor delay (#660)

This commit is contained in:
Francesca Plebani 2018-09-22 21:03:38 -04:00 committed by GitHub
parent b0e3865562
commit 808638fee3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 6 deletions

View file

@ -7,6 +7,7 @@
- Updated window manager hints under X11 to v1.5 of [Extended Window Manager Hints](https://specifications.freedesktop.org/wm-spec/wm-spec-1.5.html#idm140200472629520). - Updated window manager hints under X11 to v1.5 of [Extended Window Manager Hints](https://specifications.freedesktop.org/wm-spec/wm-spec-1.5.html#idm140200472629520).
- Added `WindowBuilderExt::with_gtk_theme_variant` to X11-specific `WindowBuilder` functions. - Added `WindowBuilderExt::with_gtk_theme_variant` to X11-specific `WindowBuilder` functions.
- Fixed UTF8 handling bug in X11 `set_title` function. - Fixed UTF8 handling bug in X11 `set_title` function.
- On Windows, `Window::set_cursor` now applies immediately instead of requiring specific events to occur first.
# Version 0.17.2 (2018-08-19) # Version 0.17.2 (2018-08-19)

View file

@ -18,7 +18,7 @@ unsafe impl Send for PlatformSpecificWindowBuilderAttributes {}
unsafe impl Sync for PlatformSpecificWindowBuilderAttributes {} unsafe impl Sync for PlatformSpecificWindowBuilderAttributes {}
// Cursor name in UTF-16. Used to set cursor in `WM_SETCURSOR`. // Cursor name in UTF-16. Used to set cursor in `WM_SETCURSOR`.
#[derive(Debug, Clone)] #[derive(Debug, Clone, Copy)]
pub struct Cursor(pub *const winapi::ctypes::wchar_t); pub struct Cursor(pub *const winapi::ctypes::wchar_t);
unsafe impl Send for Cursor {} unsafe impl Send for Cursor {}
unsafe impl Sync for Cursor {} unsafe impl Sync for Cursor {}

View file

@ -301,7 +301,7 @@ impl Window {
#[inline] #[inline]
pub fn set_cursor(&self, cursor: MouseCursor) { pub fn set_cursor(&self, cursor: MouseCursor) {
let cursor_id = match cursor { let cursor_id = Cursor(match cursor {
MouseCursor::Arrow | MouseCursor::Default => winuser::IDC_ARROW, MouseCursor::Arrow | MouseCursor::Default => winuser::IDC_ARROW,
MouseCursor::Hand => winuser::IDC_HAND, MouseCursor::Hand => winuser::IDC_HAND,
MouseCursor::Crosshair => winuser::IDC_CROSS, MouseCursor::Crosshair => winuser::IDC_CROSS,
@ -321,10 +321,15 @@ impl Window {
MouseCursor::Progress => winuser::IDC_APPSTARTING, MouseCursor::Progress => winuser::IDC_APPSTARTING,
MouseCursor::Help => winuser::IDC_HELP, MouseCursor::Help => winuser::IDC_HELP,
_ => winuser::IDC_ARROW, // use arrow for the missing cases. _ => winuser::IDC_ARROW, // use arrow for the missing cases.
}; });
self.window_state.lock().unwrap().cursor = cursor_id;
let mut cur = self.window_state.lock().unwrap(); self.events_loop_proxy.execute_in_thread(move |_| unsafe {
cur.cursor = Cursor(cursor_id); let cursor = winuser::LoadCursorW(
ptr::null_mut(),
cursor_id.0,
);
winuser::SetCursor(cursor);
});
} }
unsafe fn cursor_is_grabbed(&self) -> Result<bool, String> { unsafe fn cursor_is_grabbed(&self) -> Result<bool, String> {