diff --git a/panda/src/windisplay/winGraphicsWindow.cxx b/panda/src/windisplay/winGraphicsWindow.cxx index 2fc41c5038..1e8921ec03 100644 --- a/panda/src/windisplay/winGraphicsWindow.cxx +++ b/panda/src/windisplay/winGraphicsWindow.cxx @@ -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));