--- wine-1.1.3/dlls/dinput/mouse.c	2008-08-24 03:13:36.924717247 +0600
+++ wine-1.1.3-rm/dlls/dinput/mouse.c	2008-08-24 03:19:25.240715877 +0600
@@ -49,12 +49,15 @@
 static const IDirectInputDevice8AVtbl SysMouseAvt;
 static const IDirectInputDevice8WVtbl SysMouseWvt;
 
+int rmb_down_since;
+
 typedef struct SysMouseImpl SysMouseImpl;
 
 typedef enum
 {
     WARP_DEFAULT,
     WARP_DISABLE,
+    WARP_RMB,
     WARP_FORCE_ON
 } WARP_MOUSE;
 
@@ -203,6 +206,8 @@
     {
         if (!strcasecmp(buffer, "disable"))
             newDevice->warp_override = WARP_DISABLE;
+        else if (!strcasecmp(buffer, "rmb"))
+            newDevice->warp_override = WARP_RMB;
         else if (!strcasecmp(buffer, "force"))
             newDevice->warp_override = WARP_FORCE_ON;
     }
@@ -329,9 +334,18 @@
                 wdata = pt1.y;
             }
 
+            if(This->warp_override == WARP_RMB) {
+                This->need_warp = 0;
+                if(This->m_state.rgbButtons[1]){
+                    if(GetCurrentTime()-rmb_down_since>100){
+                        This->need_warp = (pt.x || pt.y);
+                    }
+                }
+            } else {
             This->need_warp = This->warp_override != WARP_DISABLE &&
                               (pt.x || pt.y) &&
                               (dwCoop & DISCL_EXCLUSIVE || This->warp_override == WARP_FORCE_ON);
+            }
             break;
         }
         case WM_MOUSEWHEEL:
@@ -348,6 +362,7 @@
 	    break;
 	case WM_RBUTTONDOWN:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 1) | DIDFT_PSHBUTTON;
+            if(This->warp_override == WARP_RMB) rmb_down_since = GetCurrentTime();
             This->m_state.rgbButtons[1] = wdata = 0x80;
 	    break;
 	case WM_RBUTTONUP:

