[PATCH 4/6] dinput: Use the base device state in the mouse device.

Rémi Bernon rbernon at codeweavers.com
Tue Oct 19 02:20:04 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/mouse.c | 116 +++++++++++++++++++++-----------------------
 1 file changed, 56 insertions(+), 60 deletions(-)

diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index f6aedda080a..b3a48baa3aa 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -68,9 +68,6 @@ struct SysMouseImpl
     BOOL                            need_warp;
     DWORD                           last_warped;
 
-    /* This is for mouse reporting. */
-    DIMOUSESTATE2                   m_state;
-
     WARP_MOUSE                      warp_override;
 };
 
@@ -79,17 +76,6 @@ static inline SysMouseImpl *impl_from_IDirectInputDevice8W(IDirectInputDevice8W
     return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface), SysMouseImpl, base);
 }
 
-static void _dump_mouse_state(const DIMOUSESTATE2 *m_state)
-{
-    int i;
-
-    if (!TRACE_ON(dinput)) return;
-
-    TRACE("(X: %d Y: %d Z: %d", m_state->lX, m_state->lY, m_state->lZ);
-    for (i = 0; i < 5; i++) TRACE(" B%d: %02x", i, m_state->rgbButtons[i]);
-    TRACE(")\n");
-}
-
 static void fill_mouse_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD version) {
     DWORD dwSize;
     DIDEVICEINSTANCEW ddi;
@@ -213,6 +199,7 @@ const struct dinput_device mouse_device = {
 void dinput_mouse_rawinput_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lparam, RAWINPUT *ri )
 {
     SysMouseImpl *This = impl_from_IDirectInputDevice8W( iface );
+    DIMOUSESTATE2 *state = (DIMOUSESTATE2 *)This->base.device_state;
     POINT rel, pt;
     DWORD seq;
     int i, wdata = 0;
@@ -246,13 +233,13 @@ void dinput_mouse_rawinput_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPA
         rel.y -= pt.y;
     }
 
-    This->m_state.lX += rel.x;
-    This->m_state.lY += rel.y;
+    state->lX += rel.x;
+    state->lY += rel.y;
 
     if (This->base.data_format.user_df->dwFlags & DIDF_ABSAXIS)
     {
-        pt.x = This->m_state.lX;
-        pt.y = This->m_state.lY;
+        pt.x = state->lX;
+        pt.y = state->lY;
     }
     else
     {
@@ -282,7 +269,7 @@ void dinput_mouse_rawinput_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPA
 
     if (ri->data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
     {
-        This->m_state.lZ += (wdata = (SHORT)ri->data.mouse.usButtonData);
+        state->lZ += (wdata = (SHORT)ri->data.mouse.usButtonData);
         queue_event( iface, DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS,
                      wdata, GetCurrentTime(), seq );
         notify = TRUE;
@@ -292,13 +279,17 @@ void dinput_mouse_rawinput_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPA
     {
         if (ri->data.mouse.usButtonFlags & mouse_button_flags[i])
         {
-            This->m_state.rgbButtons[i / 2] = 0x80 - (i % 2) * 0x80;
-            queue_event( iface, DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE +(i / 2) ) | DIDFT_PSHBUTTON,
-                         This->m_state.rgbButtons[i / 2], GetCurrentTime(), seq );
+            state->rgbButtons[i / 2] = 0x80 - (i % 2) * 0x80;
+            queue_event( iface, DIDFT_MAKEINSTANCE( WINE_MOUSE_BUTTONS_INSTANCE + (i / 2) ) | DIDFT_PSHBUTTON,
+                         state->rgbButtons[i / 2], GetCurrentTime(), seq );
             notify = TRUE;
         }
     }
 
+    TRACE( "buttons %02x %02x %02x %02x %02x, x %d, y %d, w %d\n", state->rgbButtons[0],
+           state->rgbButtons[1], state->rgbButtons[2], state->rgbButtons[3], state->rgbButtons[4],
+           state->lX, state->lY, state->lZ );
+
     if (notify && This->base.hEvent) SetEvent( This->base.hEvent );
     LeaveCriticalSection( &This->base.crit );
 }
@@ -308,6 +299,7 @@ int dinput_mouse_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lparam
 {
     MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)lparam;
     SysMouseImpl *This = impl_from_IDirectInputDevice8W( iface );
+    DIMOUSESTATE2 *state = (DIMOUSESTATE2 *)This->base.device_state;
     int wdata = 0, inst_id = -1, ret = 0;
     BOOL notify = FALSE;
 
@@ -321,13 +313,13 @@ int dinput_mouse_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lparam
             POINT pt, pt1;
 
             GetCursorPos(&pt);
-            This->m_state.lX += pt.x = hook->pt.x - pt.x;
-            This->m_state.lY += pt.y = hook->pt.y - pt.y;
+            state->lX += pt.x = hook->pt.x - pt.x;
+            state->lY += pt.y = hook->pt.y - pt.y;
 
             if (This->base.data_format.user_df->dwFlags & DIDF_ABSAXIS)
             {
-                pt1.x = This->m_state.lX;
-                pt1.y = This->m_state.lY;
+                pt1.x = state->lX;
+                pt1.y = state->lY;
             } else
                 pt1 = pt;
 
@@ -359,54 +351,57 @@ int dinput_mouse_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lparam
         }
         case WM_MOUSEWHEEL:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS;
-            This->m_state.lZ += wdata = (short)HIWORD(hook->mouseData);
+            state->lZ += wdata = (short)HIWORD( hook->mouseData );
             /* FarCry crashes if it gets a mouse wheel message */
             /* FIXME: should probably filter out other messages too */
             ret = This->clipped;
             break;
         case WM_LBUTTONDOWN:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 0) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[0] = wdata = 0x80;
-	    break;
-	case WM_LBUTTONUP:
+            state->rgbButtons[0] = wdata = 0x80;
+            break;
+        case WM_LBUTTONUP:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 0) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[0] = wdata = 0x00;
-	    break;
-	case WM_RBUTTONDOWN:
+            state->rgbButtons[0] = wdata = 0x00;
+            break;
+        case WM_RBUTTONDOWN:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 1) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[1] = wdata = 0x80;
-	    break;
-	case WM_RBUTTONUP:
+            state->rgbButtons[1] = wdata = 0x80;
+            break;
+        case WM_RBUTTONUP:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 1) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[1] = wdata = 0x00;
-	    break;
-	case WM_MBUTTONDOWN:
+            state->rgbButtons[1] = wdata = 0x00;
+            break;
+        case WM_MBUTTONDOWN:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[2] = wdata = 0x80;
-	    break;
-	case WM_MBUTTONUP:
+            state->rgbButtons[2] = wdata = 0x80;
+            break;
+        case WM_MBUTTONUP:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[2] = wdata = 0x00;
-	    break;
+            state->rgbButtons[2] = wdata = 0x00;
+            break;
         case WM_XBUTTONDOWN:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2 + HIWORD(hook->mouseData)) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[2 + HIWORD(hook->mouseData)] = wdata = 0x80;
+            state->rgbButtons[2 + HIWORD( hook->mouseData )] = wdata = 0x80;
             break;
         case WM_XBUTTONUP:
             inst_id = DIDFT_MAKEINSTANCE(WINE_MOUSE_BUTTONS_INSTANCE + 2 + HIWORD(hook->mouseData)) | DIDFT_PSHBUTTON;
-            This->m_state.rgbButtons[2 + HIWORD(hook->mouseData)] = wdata = 0x00;
+            state->rgbButtons[2 + HIWORD( hook->mouseData )] = wdata = 0x00;
             break;
     }
 
 
     if (inst_id != -1)
     {
-        _dump_mouse_state(&This->m_state);
         queue_event(iface, inst_id,
                     wdata, GetCurrentTime(), This->base.dinput->evsequence++);
         notify = TRUE;
     }
 
+    TRACE( "buttons %02x %02x %02x %02x %02x, x %d, y %d, w %d\n", state->rgbButtons[0],
+           state->rgbButtons[1], state->rgbButtons[2], state->rgbButtons[3], state->rgbButtons[4],
+           state->lX, state->lY, state->lZ );
+
     if (notify && This->base.hEvent) SetEvent( This->base.hEvent );
     LeaveCriticalSection(&This->base.crit);
     return ret;
@@ -456,6 +451,7 @@ static void warp_check( SysMouseImpl* This, BOOL force )
 static HRESULT WINAPI SysMouseWImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface, DWORD len, LPVOID ptr)
 {
     SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
+    DIMOUSESTATE2 *state = (DIMOUSESTATE2 *)This->base.device_state;
     TRACE("(%p)->(%u,%p)\n", This, len, ptr);
 
     if(This->base.acquired == 0) return DIERR_NOTACQUIRED;
@@ -463,17 +459,16 @@ static HRESULT WINAPI SysMouseWImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface,
     check_dinput_events();
 
     EnterCriticalSection(&This->base.crit);
-    _dump_mouse_state(&This->m_state);
 
     /* Copy the current mouse state */
-    fill_DataFormat(ptr, len, &This->m_state, &This->base.data_format);
+    fill_DataFormat( ptr, len, state, &This->base.data_format );
 
     /* Initialize the buffer when in relative mode */
     if (!(This->base.data_format.user_df->dwFlags & DIDF_ABSAXIS))
     {
-	This->m_state.lX = 0;
-	This->m_state.lY = 0;
-	This->m_state.lZ = 0;
+        state->lX = 0;
+        state->lY = 0;
+        state->lZ = 0;
     }
     LeaveCriticalSection(&This->base.crit);
 
@@ -498,25 +493,26 @@ static HRESULT WINAPI SysMouseWImpl_GetDeviceData(LPDIRECTINPUTDEVICE8W iface,
 static HRESULT mouse_internal_acquire( IDirectInputDevice8W *iface )
 {
     SysMouseImpl *impl = impl_from_IDirectInputDevice8W( iface );
+    DIMOUSESTATE2 *state = (DIMOUSESTATE2 *)impl->base.device_state;
     POINT point;
 
     /* Init the mouse state */
     GetCursorPos( &point );
     if (impl->base.data_format.user_df->dwFlags & DIDF_ABSAXIS)
     {
-        impl->m_state.lX = point.x;
-        impl->m_state.lY = point.y;
+        state->lX = point.x;
+        state->lY = point.y;
     }
     else
     {
-        impl->m_state.lX = 0;
-        impl->m_state.lY = 0;
+        state->lX = 0;
+        state->lY = 0;
         impl->org_coords = point;
     }
-    impl->m_state.lZ = 0;
-    impl->m_state.rgbButtons[0] = GetKeyState( VK_LBUTTON ) & 0x80;
-    impl->m_state.rgbButtons[1] = GetKeyState( VK_RBUTTON ) & 0x80;
-    impl->m_state.rgbButtons[2] = GetKeyState( VK_MBUTTON ) & 0x80;
+    state->lZ = 0;
+    state->rgbButtons[0] = GetKeyState( VK_LBUTTON ) & 0x80;
+    state->rgbButtons[1] = GetKeyState( VK_RBUTTON ) & 0x80;
+    state->rgbButtons[2] = GetKeyState( VK_MBUTTON ) & 0x80;
 
     if (impl->base.dwCoopLevel & DISCL_EXCLUSIVE)
     {
-- 
2.33.0




More information about the wine-devel mailing list