windisplay: Fix some situations in which the mouse could stay confined

Fixes #1115
This commit is contained in:
rdb 2021-03-11 23:29:13 +01:00
parent c1c2183561
commit 7f4d030032

View File

@ -434,7 +434,9 @@ set_properties_now(WindowProperties &properties) {
break;
case WindowProperties::M_confined:
if (confine_cursor()) {
// If we are not the foreground window, we defer confining the cursor
// until we are.
if (GetForegroundWindow() != _hWnd || confine_cursor()) {
_properties.set_mouse_mode(WindowProperties::M_confined);
}
break;
@ -475,6 +477,11 @@ close_window() {
set_cursor_out_of_window();
DestroyWindow(_hWnd);
if (_properties.has_mouse_mode() &&
_properties.get_mouse_mode() == WindowProperties::M_confined) {
ClipCursor(nullptr);
}
if (is_fullscreen()) {
// revert to default display mode.
do_fullscreen_disable();
@ -758,12 +765,6 @@ do_reshape_request(int x_origin, int y_origin, bool has_origin,
view_rect.bottom - view_rect.top,
flags);
// If we are in confined mode, we must update the clip region.
if (_properties.has_mouse_mode() &&
_properties.get_mouse_mode() == WindowProperties::M_confined) {
confine_cursor();
}
handle_reshape();
return true;
}
@ -813,6 +814,28 @@ handle_reshape() {
return;
}
// If we are in confined mode, we must update the clip region. However,
// we ony do that if the cursor in currently inside the window, to properly
// handle the case where someone is resizing the window straight after
// switching to it (you can do this if you press the start menu key to
// deactive the window, and then trying to resize it)
if (_properties.has_mouse_mode() &&
_properties.get_mouse_mode() == WindowProperties::M_confined &&
_hWnd == GetForegroundWindow()) {
POINT cpos;
if (GetCursorPos(&cpos) && PtInRect(&view_rect, cpos)) {
windisplay_cat.info()
<< "ClipCursor() to " << view_rect.left << "," << view_rect.top
<< " to " << view_rect.right << "," << view_rect.bottom << endl;
if (!ClipCursor(&view_rect)) {
windisplay_cat.warning()
<< "Failed to re-confine cursor to window.\n";
}
}
}
WindowProperties properties;
properties.set_size((view_rect.right - view_rect.left),
(view_rect.bottom - view_rect.top));