Skip to content

Commit

Permalink
fix(windows): configure hidden and grabbed cursor
Browse files Browse the repository at this point in the history
This fixes issues where a hidden and grabbed cursor could leave the
window and become visible on top of the windows taskbar (and potentially
leave the window altogether if the taskbar is clicked) under at least
two occasions:

    - When a window is overlapping the taskbar.
    - When a window is maximized and Automatically hide the taskbar has
      been enabled.

This approach of confining the cursor to the center of the window is
used in SDL.
  • Loading branch information
fornwall authored and kchibisov committed Mar 18, 2024
1 parent baf10de commit ba10c35
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/changelog/unreleased.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@
- **Breaking:** Removed `EventLoopBuilder::with_user_event`, the functionality is now available in `EventLoop::with_user_event`.
- Add `Window::default_attributes` to get default `WindowAttributes`.
- `log` has been replaced with `tracing`. The old behavior can be emulated by setting the `log` feature on the `tracing` crate.
- On Windows, confine cursor to center of window when grabbed and hidden.
17 changes: 16 additions & 1 deletion src/platform_impl/windows/window_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,22 @@ impl CursorFlags {

if util::is_focused(window) {
let cursor_clip = match self.contains(CursorFlags::GRABBED) {
true => Some(client_rect),
true => {
if self.contains(CursorFlags::HIDDEN) {
// Confine the cursor to the center of the window if the cursor is hidden. This avoids
// problems with the cursor activating the taskbar if the window borders or overlaps that.
let cx = (client_rect.left + client_rect.right) / 2;
let cy = (client_rect.top + client_rect.bottom) / 2;
Some(RECT {
left: cx,
right: cx + 1,
top: cy,
bottom: cy + 1,
})
} else {
Some(client_rect)
}
}
false => None,
};

Expand Down

0 comments on commit ba10c35

Please sign in to comment.