dinput: Add mouse warp override config option.

This commit is contained in:
Vitaliy Margolen 2008-08-18 19:18:29 -06:00 committed by Alexandre Julliard
parent 43aa149046
commit 517462cf9a

View File

@ -30,6 +30,7 @@
#include "wingdi.h"
#include "winuser.h"
#include "winerror.h"
#include "winreg.h"
#include "dinput.h"
#include "dinput_private.h"
@ -50,6 +51,13 @@ static const IDirectInputDevice8WVtbl SysMouseWvt;
typedef struct SysMouseImpl SysMouseImpl;
typedef enum
{
WARP_DEFAULT,
WARP_DISABLE,
WARP_FORCE_ON
} WARP_MOUSE;
struct SysMouseImpl
{
struct IDirectInputDevice2AImpl base;
@ -66,6 +74,8 @@ struct SysMouseImpl
/* This is for mouse reporting. */
DIMOUSESTATE2 m_state;
WARP_MOUSE warp_override;
};
static void dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam );
@ -174,6 +184,8 @@ static SysMouseImpl *alloc_device(REFGUID rguid, const void *mvt, IDirectInputIm
SysMouseImpl* newDevice;
LPDIDATAFORMAT df = NULL;
unsigned i;
char buffer[20];
HKEY hkey, appkey;
newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl));
if (!newDevice) return NULL;
@ -186,6 +198,17 @@ static SysMouseImpl *alloc_device(REFGUID rguid, const void *mvt, IDirectInputIm
newDevice->base.dinput = dinput;
newDevice->base.event_proc = dinput_mouse_hook;
get_app_key(&hkey, &appkey);
if (!get_config_key(hkey, appkey, "MouseWarpOverride", buffer, sizeof(buffer)))
{
if (!strcasecmp(buffer, "disable"))
newDevice->warp_override = WARP_DISABLE;
else if (!strcasecmp(buffer, "force"))
newDevice->warp_override = WARP_FORCE_ON;
}
if (appkey) RegCloseKey(appkey);
if (hkey) RegCloseKey(hkey);
/* Create copy of default data format */
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIMouse2.dwSize))) goto failed;
memcpy(df, &c_dfDIMouse2, c_dfDIMouse2.dwSize);
@ -306,7 +329,9 @@ static void dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARA
wdata = pt1.y;
}
This->need_warp = (pt.x || pt.y) && dwCoop & DISCL_EXCLUSIVE;
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:
@ -422,14 +447,18 @@ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
else
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->win_centerX = (rect.right - rect.left) / 2;
This->win_centerY = (rect.bottom - rect.top ) / 2;
/* Warp the mouse to the center of the window */
if (This->base.dwCoopLevel & DISCL_EXCLUSIVE)
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;
@ -463,7 +492,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)
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);