Alexandre Julliard : dinput: Add a helper function for mouse warping.

Alexandre Julliard julliard at winehq.org
Tue Apr 26 11:35:46 CDT 2011


Module: wine
Branch: master
Commit: 5f2daff124b269f641f3903a5fb0b088432f9be4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5f2daff124b269f641f3903a5fb0b088432f9be4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Apr 26 12:28:25 2011 +0200

dinput: Add a helper function for mouse warping.

---

 dlls/dinput/mouse.c |   61 ++++++++++++++++----------------------------------
 1 files changed, 20 insertions(+), 41 deletions(-)

diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 9434888..ec67b02 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -427,6 +427,21 @@ static BOOL dinput_window_check(SysMouseImpl* This) {
     return TRUE;
 }
 
+static HRESULT warp_check( SysMouseImpl* This, BOOL force )
+{
+    DWORD now = GetCurrentTime();
+
+    if (force || (This->need_warp && (now - This->last_warped > 10)))
+    {
+        This->last_warped = now;
+        This->need_warp = FALSE;
+        if (!dinput_window_check(This)) return DIERR_GENERIC;
+        TRACE("Warping mouse to %d - %d\n", This->mapped_center.x, This->mapped_center.y);
+        SetCursorPos( This->mapped_center.x, This->mapped_center.y );
+    }
+    return DI_OK;
+}
+
 
 /******************************************************************************
   *     Acquire : gets exclusive control of the mouse
@@ -434,7 +449,6 @@ static BOOL dinput_window_check(SysMouseImpl* This) {
 static HRESULT WINAPI SysMouseWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface)
 {
     SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
-    RECT  rect;
     POINT point;
     HRESULT res;
 
@@ -473,23 +487,12 @@ static HRESULT WINAPI SysMouseWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface)
         ERR("Failed to get RECT: %d\n", GetLastError());
     }
 
-    /* Need a window to warp mouse in. */
-    if (This->warp_override == WARP_FORCE_ON && !This->base.win)
-        This->base.win = GetDesktopWindow();
-
-    /* Get the window dimension and find the center */
-    GetWindowRect(This->base.win, &rect);
-    This->mapped_center.x = (rect.left + rect.right) / 2;
-    This->mapped_center.y = (rect.top + rect.bottom) / 2;
-
     /* Warp the mouse to the center of the window */
     if (This->base.dwCoopLevel & DISCL_EXCLUSIVE || This->warp_override == WARP_FORCE_ON)
     {
-      TRACE("Warping mouse to %d - %d\n", This->mapped_center.x, This->mapped_center.y);
-      SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-      This->last_warped = GetCurrentTime();
-
-      This->need_warp = FALSE;
+        /* Need a window to warp mouse in. */
+        if (!This->base.win) This->base.win = GetDesktopWindow();
+        warp_check( This, TRUE );
     }
 
     return DI_OK;
@@ -563,19 +566,7 @@ static HRESULT WINAPI SysMouseWImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface,
     }
     LeaveCriticalSection(&This->base.crit);
 
-    /* Check if we need to do a mouse warping */
-    if (This->need_warp && (GetCurrentTime() - This->last_warped > 10))
-    {
-        if(!dinput_window_check(This))
-            return DIERR_GENERIC;
-	TRACE("Warping mouse to %d - %d\n", This->mapped_center.x, This->mapped_center.y);
-	SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-        This->last_warped = GetCurrentTime();
-
-        This->need_warp = FALSE;
-    }
-
-    return DI_OK;
+    return warp_check( This, FALSE );
 }
 
 static HRESULT WINAPI SysMouseAImpl_GetDeviceState(LPDIRECTINPUTDEVICE8A iface, DWORD len, LPVOID ptr)
@@ -594,19 +585,7 @@ static HRESULT WINAPI SysMouseWImpl_GetDeviceData(LPDIRECTINPUTDEVICE8W iface,
     HRESULT res;
 
     res = IDirectInputDevice2WImpl_GetDeviceData(iface, dodsize, dod, entries, flags);
-    if (FAILED(res)) return res;
-
-    /* Check if we need to do a mouse warping */
-    if (This->need_warp && (GetCurrentTime() - This->last_warped > 10))
-    {
-        if(!dinput_window_check(This))
-            return DIERR_GENERIC;
-	TRACE("Warping mouse to %d - %d\n", This->mapped_center.x, This->mapped_center.y);
-	SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-        This->last_warped = GetCurrentTime();
-
-        This->need_warp = FALSE;
-    }
+    if (SUCCEEDED(res)) res = warp_check( This, FALSE );
     return res;
 }
 




More information about the wine-cvs mailing list