Alexandre Julliard : dinput: Pass mouse messages through if the request to clip the cursor is rejected.
Alexandre Julliard
julliard at winehq.org
Tue Apr 26 11:35:46 CDT 2011
Module: wine
Branch: master
Commit: 0036e438db3b5382ee0a2c53478960fabb892a2c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0036e438db3b5382ee0a2c53478960fabb892a2c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 26 14:41:51 2011 +0200
dinput: Pass mouse messages through if the request to clip the cursor is rejected.
---
dlls/dinput/mouse.c | 23 ++++++++++++-----------
1 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index f011de9..b890c73 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -66,6 +66,7 @@ struct SysMouseImpl
/* These are used in case of relative -> absolute transitions */
POINT org_coords;
POINT mapped_center;
+ BOOL clipped;
/* warping: whether we need to move mouse back to middle once we
* reach window borders (for e.g. shooters, "surface movement" games) */
BOOL need_warp;
@@ -319,21 +320,20 @@ static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM
{
MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)lparam;
SysMouseImpl* This = impl_from_IDirectInputDevice8A(iface);
- DWORD dwCoop;
int wdata = 0, inst_id = -1, ret;
TRACE("msg %lx @ (%d %d)\n", wparam, hook->pt.x, hook->pt.y);
EnterCriticalSection(&This->base.crit);
- dwCoop = This->base.dwCoopLevel;
- ret = dwCoop & DISCL_EXCLUSIVE;
+ ret = This->clipped;
switch(wparam) {
case WM_MOUSEMOVE:
{
POINT pt, pt1;
- GetCursorPos(&pt);
+ if (This->clipped) pt = This->mapped_center;
+ else GetCursorPos(&pt);
This->m_state.lX += pt.x = hook->pt.x - pt.x;
This->m_state.lY += pt.y = hook->pt.y - pt.y;
@@ -422,28 +422,29 @@ static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM
static HRESULT warp_check( SysMouseImpl* This, BOOL force )
{
DWORD now = GetCurrentTime();
- const DWORD interval = (This->base.dwCoopLevel & DISCL_EXCLUSIVE) ? 500 : 10;
+ const DWORD interval = This->clipped ? 500 : 10;
if (force || (This->need_warp && (now - This->last_warped > interval)))
{
- RECT rect;
+ RECT rect, new_rect;
This->last_warped = now;
This->need_warp = FALSE;
if (!GetWindowRect(This->base.win, &rect)) return DIERR_GENERIC;
This->mapped_center.x = (rect.left + rect.right) / 2;
This->mapped_center.y = (rect.top + rect.bottom) / 2;
+ if (!This->clipped)
+ {
+ TRACE("Warping mouse to %d - %d\n", This->mapped_center.x, This->mapped_center.y);
+ SetCursorPos( This->mapped_center.x, This->mapped_center.y );
+ }
if (This->base.dwCoopLevel & DISCL_EXCLUSIVE)
{
SetRect( &rect, This->mapped_center.x, This->mapped_center.y,
This->mapped_center.x + 1, This->mapped_center.y + 1 );
TRACE("Clipping mouse to %s\n", wine_dbgstr_rect( &rect ));
ClipCursor( &rect );
- }
- else
- {
- 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->clipped = GetClipCursor( &new_rect ) && EqualRect( &rect, &new_rect );
}
}
return DI_OK;
More information about the wine-cvs
mailing list