From 4527e6ad585b448529859eecd2617fd9c2ae4b3a Mon Sep 17 00:00:00 2001
From: Lucas Fialho Zawacki <lfzawacki@gmail.com>
Date: Thu, 9 Jun 2011 00:32:41 -0300
Subject: dinput: EnumDevicesBySemantics passing priority callback flags

---
 dlls/dinput/dinput_main.c    |   22 ++++++++++++++++++++++
 dlls/dinput/dinput_private.h |    3 +++
 dlls/dinput8/tests/device.c  |   11 +++++++++--
 3 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 0f42e3e..d08eb04 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -685,6 +685,7 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
     LPDIRECTINPUTDEVICE8A lpdid;
     BOOL ret; /* for the callback return */
     DWORD callbackFlags = 0;
+    int i;
 
     FIXME("(this=%p,%s,%p,%p,%p,%04x): semi-stub\n", This, ptszUserName, lpdiActionFormat,
           lpCallback, pvRef, dwFlags);
@@ -704,6 +705,11 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
     /* enum the keyboard first */
     IDirectInput_CreateDevice(iface, &GUID_SysKeyboard, &lpdid, NULL);
     IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+    /* if there's any DIKEYBOARD action, keyboard is priority 1*/
+    for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+        if ( (lpdiActionFormat->rgoAction[i].dwSemantic & 0xff000000) == DIKEYBOARD_MASK)
+            callbackFlags |= DIEDBS_MAPPEDPRI1;
+
     ret = lpCallback(&didevi, lpdid, callbackFlags , 1, pvRef);
 
     if (ret == DIENUM_STOP) return DI_OK;
@@ -711,6 +717,11 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
     /* and then the mouse */
     IDirectInput_CreateDevice(iface, &GUID_SysMouse, &lpdid, NULL);
     IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+    /* same as above, but for the mouse */
+    for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+        if ( (lpdiActionFormat->rgoAction[i].dwSemantic & 0xff000000) == DIMOUSE_MASK)
+            callbackFlags |= DIEDBS_MAPPEDPRI1;
+
     ret = lpCallback(&didevi, lpdid, callbackFlags , 0, pvRef);
 
     return DI_OK;
@@ -727,6 +738,7 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
     LPDIRECTINPUTDEVICE8W lpdid;
     BOOL ret; /* for the callback return */
     DWORD callbackFlags = 0;
+    int i;
 
     FIXME("(this=%p,%s,%p,%p,%p,%04x): semi-stub\n", This, debugstr_w(ptszUserName), lpdiActionFormat,
           lpCallback, pvRef, dwFlags);
@@ -736,6 +748,11 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
     /* enum the keyboard first */
     IDirectInput_CreateDevice(iface, &GUID_SysKeyboard, &lpdid, NULL);
     IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+    /* if there's any DIKEYBOARD action, keyboard is priority 1*/
+    for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+        if ( (lpdiActionFormat->rgoAction[i].dwSemantic & 0xff000000) == DIKEYBOARD_MASK)
+            callbackFlags |= DIEDBS_MAPPEDPRI1;
+
     ret = lpCallback(&didevi, lpdid, callbackFlags , 1, pvRef);
 
     if (ret == DIENUM_STOP) return DI_OK;
@@ -743,6 +760,11 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
     /* and then the mouse */
     IDirectInput_CreateDevice(iface, &GUID_SysMouse, &lpdid, NULL);
     IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+    /* same as above, but for the mouse */
+    for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+        if ( (lpdiActionFormat->rgoAction[i].dwSemantic & 0xff000000) == DIMOUSE_MASK)
+            callbackFlags |= DIEDBS_MAPPEDPRI1;
+
     ret = lpCallback(&didevi, lpdid, callbackFlags , 0, pvRef);
 
     return DI_OK;
diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h
index 5972081..33cc823 100644
--- a/dlls/dinput/dinput_private.h
+++ b/dlls/dinput/dinput_private.h
@@ -66,4 +66,7 @@ extern void _dump_diactionformatA(LPDIACTIONFORMATA) DECLSPEC_HIDDEN;
 
 #define IS_DIPROP(x)    (((ULONG_PTR)(x) >> 16) == 0)
 
+#define DIKEYBOARD_MASK    0x81000000
+#define DIMOUSE_MASK       0x82000000
+
 #endif /* __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H */
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index 062b9c4..256c275 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -42,9 +42,12 @@ DIACTION actionMapping[]=
 {
   /* axis */
   { 0, 0x01008A01 /* DIAXIS_DRIVINGR_STEER */ , 0, { "Steer" } },
-
   /* button */
-  { 1, 0x01000C01 /* DIBUTTON_DRIVINGR_SHIFTUP */ , 0, { "Upshift" } }
+  { 1, 0x01000C01 /* DIBUTTON_DRIVINGR_SHIFTUP */ , 0, { "Upshift" } },
+  /* keyboard key */
+  { 2, DIKEYBOARD_SPACE , 0, { "Missile" } },
+  /* mouse button */
+  { 3, DIMOUSE_BUTTON0 , 0, { "Select" } }
 };
 
 static BOOL CALLBACK enumeration_callback(
@@ -64,12 +67,16 @@ static BOOL CALLBACK enumeration_callback(
     {
         IDirectInputDevice_AddRef(lpdid);
         data->keyboard = lpdid;
+
+        ok (dwFlags & DIEDBS_MAPPEDPRI1, "Keyboard should be mapped as pri1 dwFlags=%08x\n",dwFlags);
     }
 
     if ( IsEqualGUID(&lpddi->guidInstance, &GUID_SysMouse) )
     {
         IDirectInputDevice_AddRef(lpdid);
         data->mouse = lpdid;
+
+        ok (dwFlags & DIEDBS_MAPPEDPRI1, "Mouse should be mapped as pri1 dwFlags=%08x\n",dwFlags);
     }
 
     return DIENUM_CONTINUE;
-- 
1.7.0.4

