Browse Source

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

Fixes #1115
rdb 4 years ago
parent
commit
7f4d030032
1 changed files with 30 additions and 7 deletions
  1. 30 7
      panda/src/windisplay/winGraphicsWindow.cxx

+ 30 - 7
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));