--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -55,7 +55,8 @@ typedef enum
 {
     WARP_DEFAULT,
     WARP_DISABLE,
-    WARP_FORCE_ON
+    WARP_FORCE_ON,
+    WARP_FORCE_EDGE
 } WARP_MOUSE;
 
 struct SysMouseImpl
@@ -205,6 +206,8 @@ static SysMouseImpl *alloc_device(REFGUID rguid, const void *mvt, IDirectInputIm
             newDevice->warp_override = WARP_DISABLE;
         else if (!strcasecmp(buffer, "force"))
             newDevice->warp_override = WARP_FORCE_ON;
+        else if (!strcasecmp(buffer, "force_edge"))
+            newDevice->warp_override = WARP_FORCE_EDGE;
     }
     if (appkey) RegCloseKey(appkey);
     if (hkey) RegCloseKey(hkey);
@@ -331,8 +334,16 @@ static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM
             }
 
             This->need_warp = This->warp_override != WARP_DISABLE &&
-                              (pt.x || pt.y) &&
-                              (dwCoop & DISCL_EXCLUSIVE || This->warp_override == WARP_FORCE_ON);
+                              (
+                                ((pt.x || pt.y) && This->warp_override != WARP_FORCE_EDGE) ||
+                                (
+                                  (
+                                    hook->pt.x<2 || hook->pt.y<2 ||
+                                    hook->pt.x>((2 * This->win_centerX)-2) || hook->pt.y>((2 * This->win_centerY)-2)
+                                  ) && This->warp_override == WARP_FORCE_EDGE
+                                )
+                              ) &&
+                              (dwCoop & DISCL_EXCLUSIVE || This->warp_override >= WARP_FORCE_ON);
             break;
         }
         case WM_MOUSEWHEEL:
@@ -453,7 +464,7 @@ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
     }
 
     /* Need a window to warp mouse in. */
-    if (This->warp_override == WARP_FORCE_ON && !This->base.win)
+    if (This->warp_override >= WARP_FORCE_ON && !This->base.win)
         This->base.win = GetDesktopWindow();
 
     /* Get the window dimension and find the center */
@@ -462,7 +473,7 @@ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
     This->win_centerY = (rect.bottom - rect.top ) / 2;
 
     /* Warp the mouse to the center of the window */
-    if (This->base.dwCoopLevel & DISCL_EXCLUSIVE || This->warp_override == WARP_FORCE_ON)
+    if (This->base.dwCoopLevel & DISCL_EXCLUSIVE || This->warp_override >= WARP_FORCE_ON)
     {
       This->mapped_center.x = This->win_centerX;
       This->mapped_center.y = This->win_centerY;
@@ -496,7 +507,7 @@ static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
     }
 
     /* And put the mouse cursor back where it was at acquire time */
-    if (This->base.dwCoopLevel & DISCL_EXCLUSIVE || This->warp_override == WARP_FORCE_ON)
+    if (This->base.dwCoopLevel & DISCL_EXCLUSIVE || This->warp_override >= WARP_FORCE_ON)
     {
       TRACE(" warping mouse back to (%d , %d)\n", This->org_coords.x, This->org_coords.y);
       SetCursorPos(This->org_coords.x, This->org_coords.y);