All pastes #171656 Raw Edit

xav

public text v1 · immutable
·published 2006-09-15 15:27 UTC
rendered paste body
--- wine-git-bak/dlls/dinput/mouse.c	2006-09-13 10:29:53.000000000 +0200
+++ wine-git/dlls/dinput/mouse.c	2006-09-15 17:25:51.000000000 +0200
@@ -37,8 +37,6 @@
 #include "wine/debug.h"
 #include "wine/unicode.h"
 
-#define MOUSE_HACK
-
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);
 
 /* Wine mouse driver object instances */
@@ -103,7 +101,6 @@
 typedef enum {
     WARP_DONE,   /* Warping has been done */
     WARP_NEEDED, /* Warping is needed */
-    WARP_STARTED /* Warping has been done, waiting for the warp event */
 } WARP_STATUS;
 
 struct SysMouseImpl
@@ -136,7 +133,6 @@
     /* warping: whether we need to move mouse back to middle once we
      * reach window borders (for e.g. shooters, "surface movement" games) */
     WARP_STATUS		            need_warp;
-    DWORD                           last_warped;
     int				    acquired;
     HANDLE			    hEvent;
     CRITICAL_SECTION		    crit;
@@ -412,6 +408,9 @@
     return DI_OK;
 }
 
+#define MIN 50
+#define MAX 200
+
 /* low-level mouse hook */
 static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lparam )
 {
@@ -434,53 +433,48 @@
 	    if (hook->pt.y != This->prevY)
                 GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y,
                           hook->time, This->dinput->evsequence);
+
+	        This->m_state.lX = hook->pt.x;
+	        This->m_state.lY = hook->pt.y;
 	} else {
 	    /* Now, warp handling */
-	    if ((This->need_warp == WARP_STARTED) &&
-		(hook->pt.x == This->mapped_center.x) && (hook->pt.y == This->mapped_center.y)) {
-		/* Warp has been done... */
+            if (This->need_warp == WARP_NEEDED) {
+                /* If warp was needed, we check if it has been done, ie if the pointer is back in the center zone */
+                if ( (hook->pt.x > This->mapped_center.x-MIN) &&
+                        (hook->pt.x < This->mapped_center.x+MIN) &&
+                        (hook->pt.y > This->mapped_center.y-MIN) &&
+                        (hook->pt.y < This->mapped_center.y+MIN) ) {
 		This->need_warp = WARP_DONE;
-		goto end;
+                    This->prevX = This->mapped_center.x;
+                    This->prevY = This->mapped_center.y;
+                }
+            }
+            else {
+                /* Otherwise, we make sure the pointer doesn't go too far. If it does, then warp is needed */
+                if ( (hook->pt.x < This->mapped_center.x-MAX) ||
+                        (hook->pt.x > This->mapped_center.x+MAX) ||
+                        (hook->pt.y < This->mapped_center.y-MAX) ||
+                        (hook->pt.y > This->mapped_center.y+MAX) ) {
+                    This->need_warp = WARP_NEEDED;
+                }
 	    }
 	    
-	    /* Relative mouse input with absolute mouse event : the real fun starts here... */
-	    if ((This->need_warp == WARP_NEEDED) ||
-		(This->need_warp == WARP_STARTED)) {
 		if (hook->pt.x != This->prevX)
 		    GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->prevX,
                               hook->time, This->dinput->evsequence);
 		if (hook->pt.y != This->prevY)
 		    GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->prevY,
                               hook->time, This->dinput->evsequence);
-	    } else {
-		/* This is the first time the event handler has been called after a
-		   GetDeviceData or GetDeviceState. */
-		if (hook->pt.x != This->mapped_center.x) {
-		    GEN_EVENT(This->offset_array[WINE_MOUSE_X_POSITION], hook->pt.x - This->mapped_center.x,
-                              hook->time, This->dinput->evsequence);
-		    This->need_warp = WARP_NEEDED;
-		}
 		
-		if (hook->pt.y != This->mapped_center.y) {
-		    GEN_EVENT(This->offset_array[WINE_MOUSE_Y_POSITION], hook->pt.y - This->mapped_center.y,
-                              hook->time, This->dinput->evsequence);
-		    This->need_warp = WARP_NEEDED;
-		}
-	    }
+            This->m_state.lX = hook->pt.x - This->mapped_center.x;
+            This->m_state.lY = hook->pt.y - This->mapped_center.y;
 	}
 	
 	This->prevX = hook->pt.x;
 	This->prevY = hook->pt.y;
-	
-	if (This->absolute) {
-	    This->m_state.lX = hook->pt.x;
-	    This->m_state.lY = hook->pt.y;
-	} else {
-	    This->m_state.lX = hook->pt.x - This->mapped_center.x;
-	    This->m_state.lY = hook->pt.y - This->mapped_center.y;
-	}
     }
     
+    
     TRACE(" msg %x pt %ld %ld (W=%d)\n",
           wparam, hook->pt.x, hook->pt.y, (!This->absolute) && This->need_warp );
     
@@ -529,7 +523,6 @@
     
     This->dinput->evsequence++;
 
-  end:
     /* Mouse moved -> send event if asked */
     if (This->hEvent) SetEvent(This->hEvent);
     
@@ -616,13 +609,8 @@
       MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);
       TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
       SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-      This->last_warped = GetCurrentTime();
 
-#ifdef MOUSE_HACK
       This->need_warp = WARP_DONE;
-#else
-      This->need_warp = WARP_STARTED;
-#endif
     }
 	
     return DI_OK;
@@ -693,17 +681,10 @@
     }
     
     /* Check if we need to do a mouse warping */
-    if (This->need_warp == WARP_NEEDED && (GetCurrentTime() - This->last_warped > 10)) {
+    if (This->need_warp == WARP_NEEDED) {
 	dinput_window_check(This);
 	TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
 	SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-        This->last_warped = GetCurrentTime();
-
-#ifdef MOUSE_HACK
-	This->need_warp = WARP_DONE;
-#else
-	This->need_warp = WARP_STARTED;
-#endif
     }
     
     LeaveCriticalSection(&(This->crit));
@@ -787,17 +768,10 @@
     LeaveCriticalSection(&(This->crit));
     
     /* Check if we need to do a mouse warping */
-    if (This->need_warp == WARP_NEEDED && (GetCurrentTime() - This->last_warped > 10)) {
+    if (This->need_warp == WARP_NEEDED) {
 	dinput_window_check(This);
 	TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);
 	SetCursorPos( This->mapped_center.x, This->mapped_center.y );
-        This->last_warped = GetCurrentTime();
-
-#ifdef MOUSE_HACK
-	This->need_warp = WARP_DONE;
-#else
-	This->need_warp = WARP_STARTED;
-#endif
     }
     return DI_OK;
 }