Sync to Wine-20050111:
authorGé van Geldorp <ge@gse.nl>
Tue, 11 Jan 2005 23:11:18 +0000 (23:11 +0000)
committerGé van Geldorp <ge@gse.nl>
Tue, 11 Jan 2005 23:11:18 +0000 (23:11 +0000)
Michael Stefaniuc <mstefani@redhat.de>
- Do not check for non NULL pointer before HeapFree'ing it. It's
redundant.
Christian Costa <titan.costa@wanadoo.fr>
- Handle device class in DX8 enumeration (found by Robert Reif).
- Fixed remaining DX8 device types.
- Factorized a bit GetCapabilities for keyboard and mouse.
- Fixed enumeration of joysticks in DX8.
- Fixed some traces.
Francois Gouget <fgouget@free.fr>
- Assorted spelling fixes.
Neil Olver <olver@math.mcgill.ca>
- The flag for a mouse button down in the structure returned by
GetDeviceState should be 0x80 (only the high bit set), not 0xff.

svn path=/trunk/; revision=12937

reactos/lib/dinput/dinput_main.c
reactos/lib/dinput/joystick_linux.c
reactos/lib/dinput/joystick_linuxinput.c
reactos/lib/dinput/keyboard.c
reactos/lib/dinput/mouse.c

index 3bfcba0..900b7c8 100644 (file)
@@ -744,13 +744,13 @@ HRESULT WINAPI DINPUT_DllCanUnloadNow(void)
 HRESULT WINAPI DINPUT_DllGetClassObject(REFCLSID rclsid, REFIID riid,\r
                                        LPVOID *ppv)\r
 {\r
-    TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);\r
+    TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);\r
     if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {\r
        *ppv = (LPVOID)&DINPUT_CF;\r
        IClassFactory_AddRef((IClassFactory*)*ppv);\r
     return S_OK;\r
     }\r
 \r
-    FIXME("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);\r
+    FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);\r
     return CLASS_E_CLASSNOTAVAILABLE;\r
 }\r
index 8b75fb0..101d900 100644 (file)
@@ -157,7 +157,9 @@ static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
         return FALSE;\r
     }\r
 \r
-    if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) {\r
+    if ((dwDevType == 0) ||\r
+       ((dwDevType == DIDEVTYPE_JOYSTICK) && (version < 8)) ||\r
+       (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 8))) {\r
         /* check whether we have a joystick */\r
         sprintf(dev, "%s%d", JOYDEV, id);\r
         if ((fd = open(dev,O_RDONLY)) < 0) {\r
@@ -205,7 +207,9 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
         return FALSE;\r
     }\r
 \r
-    if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) {\r
+    if ((dwDevType == 0) ||\r
+       ((dwDevType == DIDEVTYPE_JOYSTICK) && (version < 8)) ||\r
+       (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 8))) {\r
         /* check whether we have a joystick */\r
         sprintf(dev, "%s%d", JOYDEV, id);\r
         if ((fd = open(dev,O_RDONLY)) < 0) {\r
@@ -552,7 +556,10 @@ static HRESULT alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputImpl *dinput,
 \r
     newDevice->devcaps.dwSize = sizeof(newDevice->devcaps);\r
     newDevice->devcaps.dwFlags = DIDC_ATTACHED;\r
-    newDevice->devcaps.dwDevType = DIDEVTYPE_JOYSTICK;\r
+    if (newDevice->dinput->version >= 8)\r
+        newDevice->devcaps.dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);\r
+    else\r
+        newDevice->devcaps.dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);\r
     newDevice->devcaps.dwFFSamplePeriod = 0;\r
     newDevice->devcaps.dwFFMinTimeResolution = 0;\r
     newDevice->devcaps.dwFirmwareRevision = 0;\r
@@ -573,18 +580,12 @@ static HRESULT alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputImpl *dinput,
 FAILED:\r
     hr = DIERR_OUTOFMEMORY;\r
 FAILED1:\r
-    if (newDevice->axis_map)\r
-        HeapFree(GetProcessHeap(),0,newDevice->axis_map);\r
-    if (newDevice->name)\r
-        HeapFree(GetProcessHeap(),0,newDevice->name);\r
-    if (newDevice->props)\r
-        HeapFree(GetProcessHeap(),0,newDevice->props);\r
-    if (newDevice->user_df->rgodf)\r
-        HeapFree(GetProcessHeap(),0,newDevice->user_df->rgodf);\r
-    if (newDevice->user_df)\r
-        HeapFree(GetProcessHeap(),0,newDevice->user_df);\r
-    if (newDevice)\r
-        HeapFree(GetProcessHeap(),0,newDevice);\r
+    HeapFree(GetProcessHeap(),0,newDevice->axis_map);\r
+    HeapFree(GetProcessHeap(),0,newDevice->name);\r
+    HeapFree(GetProcessHeap(),0,newDevice->props);\r
+    HeapFree(GetProcessHeap(),0,newDevice->user_df->rgodf);\r
+    HeapFree(GetProcessHeap(),0,newDevice->user_df);\r
+    HeapFree(GetProcessHeap(),0,newDevice);\r
     *pdev = 0;\r
 \r
     return hr;\r
@@ -671,16 +672,13 @@ static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
         return ref;\r
 \r
     /* Free the device name */\r
-    if (This->name)\r
-        HeapFree(GetProcessHeap(),0,This->name);\r
+    HeapFree(GetProcessHeap(),0,This->name);\r
 \r
     /* Free the axis map */\r
-    if (This->axis_map)\r
-        HeapFree(GetProcessHeap(),0,This->axis_map);\r
+    HeapFree(GetProcessHeap(),0,This->axis_map);\r
 \r
     /* Free the data queue */\r
-    if (This->data_queue != NULL)\r
-        HeapFree(GetProcessHeap(),0,This->data_queue);\r
+    HeapFree(GetProcessHeap(),0,This->data_queue);\r
 \r
     /* Free the DataFormat */\r
     HeapFree(GetProcessHeap(), 0, This->user_df->rgodf);\r
@@ -764,12 +762,9 @@ static HRESULT WINAPI JoystickAImpl_SetDataFormat(
 \r
 FAILED:\r
     WARN("out of memory\n");\r
-    if (new_props)\r
-        HeapFree(GetProcessHeap(),0,new_props);\r
-    if (new_rgodf)\r
-        HeapFree(GetProcessHeap(),0,new_rgodf);\r
-    if (new_df)\r
-        HeapFree(GetProcessHeap(),0,new_df);\r
+    HeapFree(GetProcessHeap(),0,new_props);\r
+    HeapFree(GetProcessHeap(),0,new_rgodf);\r
+    HeapFree(GetProcessHeap(),0,new_df);\r
     return DIERR_OUTOFMEMORY;\r
 }\r
 \r
@@ -1580,10 +1575,7 @@ HRESULT WINAPI JoystickAImpl_GetDeviceInfo(
     pdidi->guidInstance = GUID_Joystick;\r
     pdidi->guidProduct = DInput_Wine_Joystick_GUID;\r
     /* we only support traditional joysticks for now */\r
-    if (This->dinput->version >= 8)\r
-        pdidi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);\r
-    else\r
-        pdidi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);\r
+    pdidi->dwDevType = This->devcaps.dwDevType;\r
     strcpy(pdidi->tszInstanceName, "Joystick");\r
     strcpy(pdidi->tszProductName, This->name);\r
     if (pdidi->dwSize > sizeof(DIDEVICEINSTANCE_DX3A)) {\r
@@ -1618,10 +1610,7 @@ HRESULT WINAPI JoystickWImpl_GetDeviceInfo(
     pdidi->guidInstance = GUID_Joystick;\r
     pdidi->guidProduct = DInput_Wine_Joystick_GUID;\r
     /* we only support traditional joysticks for now */\r
-    if (This->dinput->version >= 8)\r
-        pdidi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);\r
-    else\r
-        pdidi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);\r
+    pdidi->dwDevType = This->devcaps.dwDevType;\r
     MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, pdidi->tszInstanceName, MAX_PATH);\r
     MultiByteToWideChar(CP_ACP, 0, This->name, -1, pdidi->tszProductName, MAX_PATH);\r
     if (pdidi->dwSize > sizeof(DIDEVICEINSTANCE_DX3W)) {\r
index 514715b..673cc38 100644 (file)
@@ -175,8 +175,10 @@ static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
   if (id != 0)\r
       return FALSE;\r
 \r
-  if ((dwDevType != 0) && (GET_DIDEVICE_TYPE(dwDevType) != DIDEVTYPE_JOYSTICK))\r
-      return FALSE;\r
+  if (!((dwDevType == 0) ||\r
+        ((dwDevType == DIDEVTYPE_JOYSTICK) && (version < 8)) ||\r
+        (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 8))))\r
+    return FALSE;\r
 \r
   if (dwFlags & DIEDFL_FORCEFEEDBACK)\r
     return FALSE;\r
@@ -211,8 +213,10 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
   if (id != 0)\r
       return FALSE;\r
 \r
-  if ((dwDevType != 0) && (GET_DIDEVICE_TYPE(dwDevType) != DIDEVTYPE_JOYSTICK))\r
-      return FALSE;\r
+  if (!((dwDevType == 0) ||\r
+        ((dwDevType == DIDEVTYPE_JOYSTICK) && (version < 8)) ||\r
+        (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 8))))\r
+    return FALSE;\r
 \r
   if (dwFlags & DIEDFL_FORCEFEEDBACK)\r
     return FALSE;\r
@@ -229,7 +233,10 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
   lpddi->guidProduct   = DInput_Wine_Joystick_GUID;\r
 \r
   lpddi->guidFFDriver = GUID_NULL;\r
-  lpddi->dwDevType    = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL<<8);\r
+  if (version >= 8)\r
+    lpddi->dwDevType    = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);\r
+  else\r
+    lpddi->dwDevType    = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);\r
 \r
   MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, lpddi->tszInstanceName, MAX_PATH);\r
   /* ioctl JSIOCGNAME(len) */\r
@@ -339,8 +346,7 @@ static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
                return ref;\r
 \r
        /* Free the data queue */\r
-       if (This->data_queue != NULL)\r
-         HeapFree(GetProcessHeap(),0,This->data_queue);\r
+       HeapFree(GetProcessHeap(),0,This->data_queue);\r
 \r
        /* Free the DataFormat */\r
        HeapFree(GetProcessHeap(), 0, This->df);\r
@@ -756,7 +762,10 @@ static HRESULT WINAPI JoystickAImpl_GetCapabilities(
        wasacquired = 0;\r
     }\r
     lpDIDevCaps->dwFlags       = DIDC_ATTACHED;\r
-    lpDIDevCaps->dwDevType     = DIDEVTYPE_JOYSTICK;\r
+    if (This->dinput->version >= 8)\r
+        lpDIDevCaps->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);\r
+    else\r
+        lpDIDevCaps->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);\r
 \r
     axes=0;\r
     for (i=0;i<ABS_MAX;i++) if (test_bit(This->absbits,i)) axes++;\r
index 7110679..41630d0 100644 (file)
@@ -266,7 +266,7 @@ static BOOL keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEI
 \r
   if ((dwDevType == 0) ||\r
       ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 8)) ||\r
-      ((dwDevType == DI8DEVTYPE_KEYBOARD) && (version >= 8))) {\r
+      (((dwDevType == DI8DEVCLASS_KEYBOARD) || (dwDevType == DI8DEVTYPE_KEYBOARD)) && (version >= 8))) {\r
     TRACE("Enumerating the Keyboard device\n");\r
  \r
     fill_keyboard_dideviceinstanceA(lpddi, version);\r
@@ -284,7 +284,7 @@ static BOOL keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEI
 \r
   if ((dwDevType == 0) ||\r
       ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 8)) ||\r
-      ((dwDevType == DI8DEVTYPE_KEYBOARD) && (version >= 8))) {\r
+      (((dwDevType == DI8DEVCLASS_KEYBOARD) || (dwDevType == DI8DEVTYPE_KEYBOARD)) && (version >= 8))) {\r
     TRACE("Enumerating the Keyboard device\n");\r
 \r
     fill_keyboard_dideviceinstanceW(lpddi, version);\r
@@ -387,8 +387,7 @@ static ULONG WINAPI SysKeyboardAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
 #endif\r
 \r
        /* Free the data queue */\r
-       if (This->buffer != NULL)\r
-         HeapFree(GetProcessHeap(),0,This->buffer);\r
+       HeapFree(GetProcessHeap(),0,This->buffer);\r
 \r
        DeleteCriticalSection(&(This->crit));\r
 \r
@@ -649,36 +648,34 @@ static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities(
        LPDIRECTINPUTDEVICE8A iface,\r
        LPDIDEVCAPS lpDIDevCaps)\r
 {\r
-  SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
+    SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
+    DIDEVCAPS devcaps;\r
 \r
-  TRACE("(this=%p,%p)\n",This,lpDIDevCaps);\r
+    TRACE("(this=%p,%p)\n",This,lpDIDevCaps);\r
 \r
-  if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {\r
-    lpDIDevCaps->dwFlags = DIDC_ATTACHED;\r
+    if ((lpDIDevCaps->dwSize != sizeof(DIDEVCAPS)) && (lpDIDevCaps->dwSize != sizeof(DIDEVCAPS_DX3))) {\r
+        WARN("invalid parameter\n");\r
+        return DIERR_INVALIDPARAM;\r
+    }\r
+    \r
+    devcaps.dwSize = lpDIDevCaps->dwSize;\r
+    devcaps.dwFlags = DIDC_ATTACHED;\r
     if (This->dinput->version >= 8)\r
-        lpDIDevCaps->dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);\r
+       devcaps.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);\r
     else\r
-        lpDIDevCaps->dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);\r
-    lpDIDevCaps->dwAxes = 0;\r
-    lpDIDevCaps->dwButtons = 256;\r
-    lpDIDevCaps->dwPOVs = 0;\r
-    lpDIDevCaps->dwFFSamplePeriod = 0;\r
-    lpDIDevCaps->dwFFMinTimeResolution = 0;\r
-    lpDIDevCaps->dwFirmwareRevision = 100;\r
-    lpDIDevCaps->dwHardwareRevision = 100;\r
-    lpDIDevCaps->dwFFDriverVersion = 0;\r
-  } else if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS_DX3)) {\r
-    lpDIDevCaps->dwFlags = DIDC_ATTACHED;\r
-    lpDIDevCaps->dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);\r
-    lpDIDevCaps->dwAxes = 0;\r
-    lpDIDevCaps->dwButtons = 256;\r
-    lpDIDevCaps->dwPOVs = 0;\r
-  } else {\r
-    WARN("invalid parameter\n");\r
-    return DIERR_INVALIDPARAM;\r
-  }\r
-\r
-  return DI_OK;\r
+       devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);\r
+    devcaps.dwAxes = 0;\r
+    devcaps.dwButtons = 256;\r
+    devcaps.dwPOVs = 0;\r
+    devcaps.dwFFSamplePeriod = 0;\r
+    devcaps.dwFFMinTimeResolution = 0;\r
+    devcaps.dwFirmwareRevision = 100;\r
+    devcaps.dwHardwareRevision = 100;\r
+    devcaps.dwFFDriverVersion = 0;\r
+\r
+    memcpy(lpDIDevCaps, &devcaps, lpDIDevCaps->dwSize);\r
+    \r
+    return DI_OK;\r
 }\r
 \r
 /******************************************************************************\r
index e0602f0..96e849b 100644 (file)
@@ -220,7 +220,7 @@ static BOOL mousedev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINST
 \r
     if ((dwDevType == 0) ||\r
        ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) ||\r
-       ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) {\r
+       (((dwDevType == DI8DEVCLASS_POINTER) || (dwDevType == DI8DEVTYPE_MOUSE)) && (version >= 8))) {\r
        TRACE("Enumerating the mouse device\n");\r
        \r
        fill_mouse_dideviceinstanceA(lpddi, version);\r
@@ -238,7 +238,7 @@ static BOOL mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINST
 \r
     if ((dwDevType == 0) ||\r
        ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) ||\r
-       ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) {\r
+       (((dwDevType == DI8DEVCLASS_POINTER) || (dwDevType == DI8DEVTYPE_MOUSE)) && (version >= 8))) {\r
        TRACE("Enumerating the mouse device\n");\r
        \r
        fill_mouse_dideviceinstanceW(lpddi, version);\r
@@ -351,8 +351,7 @@ static ULONG WINAPI SysMouseAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
        return ref;\r
     \r
     /* Free the data queue */\r
-    if (This->data_queue != NULL)\r
-       HeapFree(GetProcessHeap(),0,This->data_queue);\r
+    HeapFree(GetProcessHeap(),0,This->data_queue);\r
 \r
 #ifndef __REACTOS__\r
     if (This->hook) {\r
@@ -458,7 +457,7 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
     /* Only allow mouse events every 10 ms.\r
      * This is to allow the cursor to start acceleration before\r
      * the warps happen. But if it involves a mouse button event we\r
-     * allow it since we don't want to loose the clicks.\r
+     * allow it since we don't want to lose the clicks.\r
      */\r
     if (((GetCurrentTime() - last_event) < 10)\r
         && wparam == WM_MOUSEMOVE)\r
@@ -527,9 +526,9 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
     \r
     switch(wparam) {\r
         case WM_LBUTTONDOWN:\r
-           GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0xFF,\r
+           GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0x80,\r
                      hook->time, This->dinput->evsequence++);\r
-           This->m_state.rgbButtons[0] = 0xFF;\r
+           This->m_state.rgbButtons[0] = 0x80;\r
            break;\r
        case WM_LBUTTONUP:\r
            GEN_EVENT(This->offset_array[WINE_MOUSE_L_POSITION], 0x00,\r
@@ -537,9 +536,9 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
            This->m_state.rgbButtons[0] = 0x00;\r
            break;\r
        case WM_RBUTTONDOWN:\r
-           GEN_EVENT(This->offset_array[WINE_MOUSE_R_POSITION], 0xFF,\r
+           GEN_EVENT(This->offset_array[WINE_MOUSE_R_POSITION], 0x80,\r
                      hook->time, This->dinput->evsequence++);\r
-           This->m_state.rgbButtons[1] = 0xFF;\r
+           This->m_state.rgbButtons[1] = 0x80;\r
            break;\r
        case WM_RBUTTONUP:\r
            GEN_EVENT(This->offset_array[WINE_MOUSE_R_POSITION], 0x00,\r
@@ -547,9 +546,9 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
            This->m_state.rgbButtons[1] = 0x00;\r
            break;\r
        case WM_MBUTTONDOWN:\r
-           GEN_EVENT(This->offset_array[WINE_MOUSE_M_POSITION], 0xFF,\r
+           GEN_EVENT(This->offset_array[WINE_MOUSE_M_POSITION], 0x80,\r
                      hook->time, This->dinput->evsequence++);\r
-           This->m_state.rgbButtons[2] = 0xFF;\r
+           This->m_state.rgbButtons[2] = 0x80;\r
            break;\r
        case WM_MBUTTONUP:\r
            GEN_EVENT(This->offset_array[WINE_MOUSE_M_POSITION], 0x00,\r
@@ -1115,33 +1114,31 @@ static HRESULT WINAPI SysMouseAImpl_GetCapabilities(
        LPDIDEVCAPS lpDIDevCaps)\r
 {\r
     SysMouseImpl *This = (SysMouseImpl *)iface;\r
-    \r
+    DIDEVCAPS devcaps;\r
+\r
     TRACE("(this=%p,%p)\n",This,lpDIDevCaps);\r
-    \r
-    if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) {\r
-       lpDIDevCaps->dwFlags = DIDC_ATTACHED;\r
-       if (This->dinput->version >= 8)\r
-           lpDIDevCaps->dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);\r
-       else\r
-           lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8);\r
-       lpDIDevCaps->dwAxes = 3;\r
-       lpDIDevCaps->dwButtons = 3;\r
-       lpDIDevCaps->dwPOVs = 0;\r
-       lpDIDevCaps->dwFFSamplePeriod = 0;\r
-       lpDIDevCaps->dwFFMinTimeResolution = 0;\r
-       lpDIDevCaps->dwFirmwareRevision = 100;\r
-       lpDIDevCaps->dwHardwareRevision = 100;\r
-       lpDIDevCaps->dwFFDriverVersion = 0;\r
-    } else if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS_DX3)) {\r
-       lpDIDevCaps->dwFlags = DIDC_ATTACHED;\r
-       lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8);\r
-       lpDIDevCaps->dwAxes = 3;\r
-       lpDIDevCaps->dwButtons = 3;\r
-       lpDIDevCaps->dwPOVs = 0;\r
-    } else {\r
+\r
+    if ((lpDIDevCaps->dwSize != sizeof(DIDEVCAPS)) && (lpDIDevCaps->dwSize != sizeof(DIDEVCAPS_DX3))) {\r
         WARN("invalid parameter\n");\r
         return DIERR_INVALIDPARAM;\r
     }\r
+\r
+    devcaps.dwSize = lpDIDevCaps->dwSize;\r
+    devcaps.dwFlags = DIDC_ATTACHED;\r
+    if (This->dinput->version >= 8)\r
+       devcaps.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);\r
+    else\r
+       devcaps.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8);\r
+    devcaps.dwAxes = 3;\r
+    devcaps.dwButtons = 3;\r
+    devcaps.dwPOVs = 0;\r
+    devcaps.dwFFSamplePeriod = 0;\r
+    devcaps.dwFFMinTimeResolution = 0;\r
+    devcaps.dwFirmwareRevision = 100;\r
+    devcaps.dwHardwareRevision = 100;\r
+    devcaps.dwFFDriverVersion = 0;\r
+\r
+    memcpy(lpDIDevCaps, &devcaps, lpDIDevCaps->dwSize);\r
     \r
     return DI_OK;\r
 }\r