mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 05:26:58 +00:00
[DINPUT] Sync with Wine Staging 3.17. CORE-15127
This commit is contained in:
parent
db2b3364c6
commit
ad21be5e5f
|
@ -25,8 +25,6 @@
|
|||
#include "windef.h"
|
||||
#include "dinput.h"
|
||||
|
||||
#define numObjects(x) (sizeof(x) / sizeof(x[0]))
|
||||
|
||||
static const DIOBJECTDATAFORMAT dfDIJoystick[] = {
|
||||
{ &GUID_XAxis,DIJOFS_X,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},
|
||||
{ &GUID_YAxis,DIJOFS_Y,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},
|
||||
|
@ -79,7 +77,7 @@ const DIDATAFORMAT c_dfDIJoystick = {
|
|||
sizeof(DIOBJECTDATAFORMAT),
|
||||
DIDF_ABSAXIS,
|
||||
sizeof(DIJOYSTATE),
|
||||
numObjects(dfDIJoystick),
|
||||
ARRAY_SIZE(dfDIJoystick),
|
||||
(LPDIOBJECTDATAFORMAT)dfDIJoystick
|
||||
};
|
||||
|
||||
|
@ -255,7 +253,7 @@ const DIDATAFORMAT c_dfDIJoystick2 = {
|
|||
sizeof(DIOBJECTDATAFORMAT),
|
||||
DIDF_ABSAXIS,
|
||||
sizeof(DIJOYSTATE2),
|
||||
numObjects(dfDIJoystick2),
|
||||
ARRAY_SIZE(dfDIJoystick2),
|
||||
(LPDIOBJECTDATAFORMAT)dfDIJoystick2
|
||||
};
|
||||
|
||||
|
@ -274,7 +272,7 @@ const DIDATAFORMAT c_dfDIMouse = {
|
|||
sizeof(DIOBJECTDATAFORMAT),
|
||||
DIDF_RELAXIS,
|
||||
sizeof(DIMOUSESTATE),
|
||||
numObjects(dfDIMouse),
|
||||
ARRAY_SIZE(dfDIMouse),
|
||||
(LPDIOBJECTDATAFORMAT)dfDIMouse
|
||||
};
|
||||
|
||||
|
@ -297,7 +295,7 @@ const DIDATAFORMAT c_dfDIMouse2 = {
|
|||
sizeof(DIOBJECTDATAFORMAT),
|
||||
DIDF_RELAXIS,
|
||||
sizeof(DIMOUSESTATE2),
|
||||
numObjects(dfDIMouse2),
|
||||
ARRAY_SIZE(dfDIMouse2),
|
||||
(LPDIOBJECTDATAFORMAT)dfDIMouse2
|
||||
};
|
||||
|
||||
|
@ -565,6 +563,6 @@ const DIDATAFORMAT c_dfDIKeyboard = {
|
|||
sizeof(DIOBJECTDATAFORMAT),
|
||||
DIDF_RELAXIS,
|
||||
256,
|
||||
numObjects(dfDIKeyboard),
|
||||
ARRAY_SIZE(dfDIKeyboard),
|
||||
(LPDIOBJECTDATAFORMAT)dfDIKeyboard
|
||||
};
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#include "device_private.h"
|
||||
#include "dinput_private.h"
|
||||
|
||||
#define WM_WINE_NOTIFY_ACTIVITY WM_USER
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(dinput);
|
||||
|
||||
static inline IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
|
||||
|
@ -935,6 +937,8 @@ void queue_event(LPDIRECTINPUTDEVICE8A iface, int inst_id, DWORD data, DWORD tim
|
|||
/* Event is being set regardless of the queue state */
|
||||
if (This->hEvent) SetEvent(This->hEvent);
|
||||
|
||||
PostMessageW(GetDesktopWindow(), WM_WINE_NOTIFY_ACTIVITY, 0, 0);
|
||||
|
||||
if (!This->queue_len || This->overflow || ofs < 0) return;
|
||||
|
||||
next_pos = (This->queue_head + 1) % This->queue_len;
|
||||
|
|
|
@ -92,7 +92,6 @@ static const struct dinput_device *dinput_devices[] =
|
|||
&joystick_linux_device,
|
||||
&joystick_osx_device
|
||||
};
|
||||
#define NB_DINPUT_DEVICES (sizeof(dinput_devices)/sizeof(dinput_devices[0]))
|
||||
|
||||
static HINSTANCE DINPUT_instance = NULL;
|
||||
|
||||
|
@ -165,6 +164,63 @@ HRESULT WINAPI DirectInputCreateEx(
|
|||
return DI_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* DirectInput8Create (DINPUT8.@)
|
||||
*/
|
||||
HRESULT WINAPI DECLSPEC_HOTPATCH DirectInput8Create(HINSTANCE hinst,
|
||||
DWORD version, REFIID iid, void **out, IUnknown *outer)
|
||||
{
|
||||
IDirectInputImpl *This;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("hinst %p, version %#x, iid %s, out %p, outer %p.\n",
|
||||
hinst, version, debugstr_guid(iid), out, outer);
|
||||
|
||||
if (!out)
|
||||
return E_POINTER;
|
||||
|
||||
if (!IsEqualGUID(&IID_IDirectInput8A, iid) &&
|
||||
!IsEqualGUID(&IID_IDirectInput8W, iid) &&
|
||||
!IsEqualGUID(&IID_IUnknown, iid))
|
||||
{
|
||||
*out = NULL;
|
||||
return DIERR_NOINTERFACE;
|
||||
}
|
||||
|
||||
hr = create_directinput_instance(iid, out, &This);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
ERR("Failed to create DirectInput, hr %#x.\n", hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/* When aggregation is used, the application needs to manually call Initialize(). */
|
||||
if (!outer && IsEqualGUID(&IID_IDirectInput8A, iid))
|
||||
{
|
||||
hr = IDirectInput8_Initialize(&This->IDirectInput8A_iface, hinst, version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
IDirectInput8_Release(&This->IDirectInput8A_iface);
|
||||
*out = NULL;
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
|
||||
if (!outer && IsEqualGUID(&IID_IDirectInput8W, iid))
|
||||
{
|
||||
hr = IDirectInput8_Initialize(&This->IDirectInput8W_iface, hinst, version);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
IDirectInput8_Release(&This->IDirectInput8W_iface);
|
||||
*out = NULL;
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* DirectInputCreateA (DINPUT.@)
|
||||
*/
|
||||
|
@ -409,7 +465,7 @@ static HRESULT WINAPI IDirectInputAImpl_EnumDevices(
|
|||
if (!This->initialized)
|
||||
return DIERR_NOTINITIALIZED;
|
||||
|
||||
for (i = 0; i < NB_DINPUT_DEVICES; i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(dinput_devices); i++) {
|
||||
if (!dinput_devices[i]->enum_deviceA) continue;
|
||||
for (j = 0, r = S_OK; SUCCEEDED(r); j++) {
|
||||
devInstance.dwSize = sizeof(devInstance);
|
||||
|
@ -449,7 +505,7 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices(
|
|||
if (!This->initialized)
|
||||
return DIERR_NOTINITIALIZED;
|
||||
|
||||
for (i = 0; i < NB_DINPUT_DEVICES; i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(dinput_devices); i++) {
|
||||
if (!dinput_devices[i]->enum_deviceW) continue;
|
||||
for (j = 0, r = S_OK; SUCCEEDED(r); j++) {
|
||||
devInstance.dwSize = sizeof(devInstance);
|
||||
|
@ -750,7 +806,7 @@ static HRESULT create_device(IDirectInputImpl *This, REFGUID rguid, REFIID riid,
|
|||
return DIERR_NOTINITIALIZED;
|
||||
|
||||
/* Loop on all the devices to see if anyone matches the given GUID */
|
||||
for (i = 0; i < NB_DINPUT_DEVICES; i++)
|
||||
for (i = 0; i < ARRAY_SIZE(dinput_devices); i++)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
|
@ -1006,7 +1062,7 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
|
|||
}
|
||||
|
||||
/* Enumerate all the joysticks */
|
||||
for (i = 0; i < NB_DINPUT_DEVICES; i++)
|
||||
for (i = 0; i < ARRAY_SIZE(dinput_devices); i++)
|
||||
{
|
||||
HRESULT enumSuccess;
|
||||
|
||||
|
@ -1107,7 +1163,7 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
|
|||
didevi.dwSize = sizeof(didevi);
|
||||
|
||||
/* Enumerate all the joysticks */
|
||||
for (i = 0; i < NB_DINPUT_DEVICES; i++)
|
||||
for (i = 0; i < ARRAY_SIZE(dinput_devices); i++)
|
||||
{
|
||||
HRESULT enumSuccess;
|
||||
|
||||
|
@ -1330,7 +1386,7 @@ static HRESULT WINAPI JoyConfig8Impl_GetConfig(IDirectInputJoyConfig8 *iface, UI
|
|||
#undef X
|
||||
|
||||
/* Enumerate all joysticks in order */
|
||||
for (i = 0; i < NB_DINPUT_DEVICES; i++)
|
||||
for (i = 0; i < ARRAY_SIZE(dinput_devices); i++)
|
||||
{
|
||||
if (!dinput_devices[i]->enum_deviceA) continue;
|
||||
|
||||
|
@ -1520,7 +1576,10 @@ static HRESULT WINAPI DICF_CreateInstance(
|
|||
IsEqualGUID( &IID_IDirectInput2A, riid ) ||
|
||||
IsEqualGUID( &IID_IDirectInput2W, riid ) ||
|
||||
IsEqualGUID( &IID_IDirectInput7A, riid ) ||
|
||||
IsEqualGUID( &IID_IDirectInput7W, riid ) ) {
|
||||
IsEqualGUID( &IID_IDirectInput7W, riid ) ||
|
||||
IsEqualGUID( &IID_IDirectInput8A, riid ) ||
|
||||
IsEqualGUID( &IID_IDirectInput8W, riid ) )
|
||||
{
|
||||
return create_directinput_instance(riid, ppobj, NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -932,18 +932,31 @@ static INT find_joystick_devices(void)
|
|||
return joystick_devices_count;
|
||||
}
|
||||
|
||||
static DWORD make_vid_pid(IOHIDDeviceRef device)
|
||||
{
|
||||
long vendID, prodID;
|
||||
|
||||
vendID = get_device_property_long(device, CFSTR(kIOHIDVendorIDKey));
|
||||
prodID = get_device_property_long(device, CFSTR(kIOHIDProductIDKey));
|
||||
|
||||
return MAKELONG(vendID, prodID);
|
||||
}
|
||||
|
||||
static HRESULT joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
|
||||
{
|
||||
IOHIDDeviceRef device;
|
||||
|
||||
TRACE("dwDevType %u dwFlags 0x%08x version 0x%04x id %d\n", dwDevType, dwFlags, version, id);
|
||||
|
||||
if (id >= find_joystick_devices()) return E_FAIL;
|
||||
|
||||
device = get_device_ref(id);
|
||||
|
||||
if ((dwDevType == 0) ||
|
||||
((dwDevType == DIDEVTYPE_JOYSTICK) && (version > 0x0300 && version < 0x0800)) ||
|
||||
(((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 0x0800)))
|
||||
{
|
||||
if (dwFlags & DIEDFL_FORCEFEEDBACK) {
|
||||
IOHIDDeviceRef device = get_device_ref(id);
|
||||
if(!device)
|
||||
return S_FALSE;
|
||||
if(get_ff(device, NULL) != S_OK)
|
||||
|
@ -953,6 +966,7 @@ static HRESULT joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINS
|
|||
lpddi->guidInstance = DInput_Wine_OsX_Joystick_GUID;
|
||||
lpddi->guidInstance.Data3 = id;
|
||||
lpddi->guidProduct = DInput_Wine_OsX_Joystick_GUID;
|
||||
lpddi->guidProduct.Data1 = make_vid_pid(device);
|
||||
/* we only support traditional joysticks for now */
|
||||
if (version >= 0x0800)
|
||||
lpddi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
|
||||
|
@ -974,16 +988,19 @@ static HRESULT joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINS
|
|||
{
|
||||
char name[MAX_PATH];
|
||||
char friendly[32];
|
||||
IOHIDDeviceRef device;
|
||||
|
||||
TRACE("dwDevType %u dwFlags 0x%08x version 0x%04x id %d\n", dwDevType, dwFlags, version, id);
|
||||
|
||||
if (id >= find_joystick_devices()) return E_FAIL;
|
||||
|
||||
device = get_device_ref(id);
|
||||
|
||||
if ((dwDevType == 0) ||
|
||||
((dwDevType == DIDEVTYPE_JOYSTICK) && (version > 0x0300 && version < 0x0800)) ||
|
||||
(((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 0x0800))) {
|
||||
|
||||
if (dwFlags & DIEDFL_FORCEFEEDBACK) {
|
||||
IOHIDDeviceRef device = get_device_ref(id);
|
||||
if(!device)
|
||||
return S_FALSE;
|
||||
if(get_ff(device, NULL) != S_OK)
|
||||
|
@ -993,6 +1010,7 @@ static HRESULT joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINS
|
|||
lpddi->guidInstance = DInput_Wine_OsX_Joystick_GUID;
|
||||
lpddi->guidInstance.Data3 = id;
|
||||
lpddi->guidProduct = DInput_Wine_OsX_Joystick_GUID;
|
||||
lpddi->guidProduct.Data1 = make_vid_pid(device);
|
||||
/* we only support traditional joysticks for now */
|
||||
if (version >= 0x0800)
|
||||
lpddi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
|
||||
|
@ -1060,9 +1078,12 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
|
|||
|
||||
newDevice->id = index;
|
||||
|
||||
device = get_device_ref(index);
|
||||
|
||||
newDevice->generic.guidInstance = DInput_Wine_OsX_Joystick_GUID;
|
||||
newDevice->generic.guidInstance.Data3 = index;
|
||||
newDevice->generic.guidProduct = DInput_Wine_OsX_Joystick_GUID;
|
||||
newDevice->generic.guidProduct.Data1 = make_vid_pid(device);
|
||||
newDevice->generic.joy_polldev = poll_osx_device_state;
|
||||
|
||||
/* get the device name */
|
||||
|
@ -1074,7 +1095,6 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
|
|||
strcpy(newDevice->generic.name, name);
|
||||
|
||||
list_init(&newDevice->effects);
|
||||
device = get_device_ref(index);
|
||||
if(get_ff(device, &newDevice->ff) == S_OK){
|
||||
newDevice->generic.devcaps.dwFlags |= DIDC_FORCEFEEDBACK;
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@ struct SysKeyboardImpl
|
|||
{
|
||||
struct IDirectInputDeviceImpl base;
|
||||
BYTE DInputKeyState[WINE_DINPUT_KEYBOARD_MAX_KEYS];
|
||||
DWORD subtype;
|
||||
};
|
||||
|
||||
static inline SysKeyboardImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
|
||||
|
@ -67,11 +68,38 @@ static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysKeyboardIm
|
|||
return &This->base.IDirectInputDevice8W_iface;
|
||||
}
|
||||
|
||||
static BYTE map_dik_code(DWORD scanCode, DWORD vkCode)
|
||||
static BYTE map_dik_code(DWORD scanCode, DWORD vkCode, DWORD subType)
|
||||
{
|
||||
if (!scanCode)
|
||||
scanCode = MapVirtualKeyW(vkCode, MAPVK_VK_TO_VSC);
|
||||
|
||||
if (subType == DIDEVTYPEKEYBOARD_JAPAN106)
|
||||
{
|
||||
switch (scanCode)
|
||||
{
|
||||
case 0x0d: /* ^ */
|
||||
scanCode = DIK_CIRCUMFLEX;
|
||||
break;
|
||||
case 0x1a: /* @ */
|
||||
scanCode = DIK_AT;
|
||||
break;
|
||||
case 0x1b: /* [ */
|
||||
scanCode = DIK_LBRACKET;
|
||||
break;
|
||||
case 0x28: /* : */
|
||||
scanCode = DIK_COLON;
|
||||
break;
|
||||
case 0x29: /* Hankaku/Zenkaku */
|
||||
scanCode = DIK_KANJI;
|
||||
break;
|
||||
case 0x2b: /* ] */
|
||||
scanCode = DIK_RBRACKET;
|
||||
break;
|
||||
case 0x73: /* \ */
|
||||
scanCode = DIK_BACKSLASH;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return scanCode;
|
||||
}
|
||||
|
||||
|
@ -97,7 +125,7 @@ static int KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM
|
|||
case VK_NUMLOCK : dik_code = DIK_NUMLOCK; break;
|
||||
case VK_SUBTRACT: dik_code = DIK_SUBTRACT; break;
|
||||
default:
|
||||
dik_code = map_dik_code(hook->scanCode & 0xff, hook->vkCode);
|
||||
dik_code = map_dik_code(hook->scanCode & 0xff, hook->vkCode, This->subtype);
|
||||
if (hook->flags & LLKHF_EXTENDED) dik_code |= 0x80;
|
||||
}
|
||||
new_diks = hook->flags & LLKHF_UP ? 0 : 0x80;
|
||||
|
@ -121,7 +149,24 @@ const GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a96441
|
|||
0x0ab8648a, 0x7735, 0x11d2, {0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41}
|
||||
};
|
||||
|
||||
static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD version) {
|
||||
static DWORD get_keyboard_subtype(void)
|
||||
{
|
||||
DWORD kbd_type, kbd_subtype, dev_subtype;
|
||||
kbd_type = GetKeyboardType(0);
|
||||
kbd_subtype = GetKeyboardType(1);
|
||||
|
||||
if (kbd_type == 4 || (kbd_type == 7 && kbd_subtype == 0))
|
||||
dev_subtype = DIDEVTYPEKEYBOARD_PCENH;
|
||||
else if (kbd_type == 7 && kbd_subtype == 2)
|
||||
dev_subtype = DIDEVTYPEKEYBOARD_JAPAN106;
|
||||
else {
|
||||
FIXME("Unknown keyboard type=%u, subtype=%u\n", kbd_type, kbd_subtype);
|
||||
dev_subtype = DIDEVTYPEKEYBOARD_PCENH;
|
||||
}
|
||||
return dev_subtype;
|
||||
}
|
||||
|
||||
static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD version, DWORD subtype) {
|
||||
DWORD dwSize;
|
||||
DIDEVICEINSTANCEA ddi;
|
||||
|
||||
|
@ -136,16 +181,16 @@ static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD ver
|
|||
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
|
||||
ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
|
||||
if (version >= 0x0800)
|
||||
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);
|
||||
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
|
||||
else
|
||||
ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
|
||||
ddi.dwDevType = DIDEVTYPE_KEYBOARD | (subtype << 8);
|
||||
strcpy(ddi.tszInstanceName, "Keyboard");
|
||||
strcpy(ddi.tszProductName, "Wine Keyboard");
|
||||
|
||||
memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
|
||||
}
|
||||
|
||||
static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD version) {
|
||||
static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD version, DWORD subtype) {
|
||||
DWORD dwSize;
|
||||
DIDEVICEINSTANCEW ddi;
|
||||
|
||||
|
@ -160,9 +205,9 @@ static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
|
|||
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
|
||||
ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
|
||||
if (version >= 0x0800)
|
||||
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);
|
||||
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
|
||||
else
|
||||
ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
|
||||
ddi.dwDevType = DIDEVTYPE_KEYBOARD | (subtype << 8);
|
||||
MultiByteToWideChar(CP_ACP, 0, "Keyboard", -1, ddi.tszInstanceName, MAX_PATH);
|
||||
MultiByteToWideChar(CP_ACP, 0, "Wine Keyboard", -1, ddi.tszProductName, MAX_PATH);
|
||||
|
||||
|
@ -179,7 +224,7 @@ static HRESULT keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVI
|
|||
(((dwDevType == DI8DEVCLASS_KEYBOARD) || (dwDevType == DI8DEVTYPE_KEYBOARD)) && (version >= 0x0800))) {
|
||||
TRACE("Enumerating the Keyboard device\n");
|
||||
|
||||
fill_keyboard_dideviceinstanceA(lpddi, version);
|
||||
fill_keyboard_dideviceinstanceA(lpddi, version, get_keyboard_subtype());
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -197,7 +242,7 @@ static HRESULT keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVI
|
|||
(((dwDevType == DI8DEVCLASS_KEYBOARD) || (dwDevType == DI8DEVTYPE_KEYBOARD)) && (version >= 0x0800))) {
|
||||
TRACE("Enumerating the Keyboard device\n");
|
||||
|
||||
fill_keyboard_dideviceinstanceW(lpddi, version);
|
||||
fill_keyboard_dideviceinstanceW(lpddi, version, get_keyboard_subtype());
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -220,6 +265,7 @@ static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
|
|||
newDevice->base.event_proc = KeyboardCallback;
|
||||
InitializeCriticalSection(&newDevice->base.crit);
|
||||
newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SysKeyboardImpl*->base.crit");
|
||||
newDevice->subtype = get_keyboard_subtype();
|
||||
|
||||
/* Create copy of default data format */
|
||||
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIKeyboard.dwSize))) goto failed;
|
||||
|
@ -229,12 +275,14 @@ static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
|
|||
for (i = 0; i < df->dwNumObjs; i++)
|
||||
{
|
||||
char buf[MAX_PATH];
|
||||
BYTE dik_code;
|
||||
|
||||
if (!GetKeyNameTextA(((i & 0x7f) << 16) | ((i & 0x80) << 17), buf, sizeof(buf)))
|
||||
continue;
|
||||
|
||||
memcpy(&df->rgodf[idx], &c_dfDIKeyboard.rgodf[i], df->dwObjSize);
|
||||
df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_PSHBUTTON;
|
||||
dik_code = map_dik_code(i, 0, newDevice->subtype);
|
||||
memcpy(&df->rgodf[idx], &c_dfDIKeyboard.rgodf[dik_code], df->dwObjSize);
|
||||
df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(dik_code) | DIDFT_PSHBUTTON;
|
||||
}
|
||||
df->dwNumObjs = idx;
|
||||
|
||||
|
@ -362,9 +410,9 @@ static HRESULT WINAPI SysKeyboardWImpl_GetCapabilities(LPDIRECTINPUTDEVICE8W ifa
|
|||
devcaps.dwSize = lpDIDevCaps->dwSize;
|
||||
devcaps.dwFlags = DIDC_ATTACHED | DIDC_EMULATED;
|
||||
if (This->base.dinput->dwVersion >= 0x0800)
|
||||
devcaps.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_PCENH << 8);
|
||||
devcaps.dwDevType = DI8DEVTYPE_KEYBOARD | (This->subtype << 8);
|
||||
else
|
||||
devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_PCENH << 8);
|
||||
devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (This->subtype << 8);
|
||||
devcaps.dwAxes = 0;
|
||||
devcaps.dwButtons = This->base.data_format.wine_df->dwNumObjs;
|
||||
devcaps.dwPOVs = 0;
|
||||
|
@ -385,6 +433,40 @@ static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities(LPDIRECTINPUTDEVICE8A ifa
|
|||
return SysKeyboardWImpl_GetCapabilities(IDirectInputDevice8W_from_impl(This), lpDIDevCaps);
|
||||
}
|
||||
|
||||
static DWORD map_dik_to_scan(DWORD dik_code, DWORD subtype)
|
||||
{
|
||||
if (dik_code == DIK_PAUSE || dik_code == DIK_NUMLOCK) dik_code ^= 0x80;
|
||||
if (subtype == DIDEVTYPEKEYBOARD_JAPAN106)
|
||||
{
|
||||
switch (dik_code)
|
||||
{
|
||||
case DIK_CIRCUMFLEX:
|
||||
dik_code = 0x0d;
|
||||
break;
|
||||
case DIK_AT:
|
||||
dik_code = 0x1a;
|
||||
break;
|
||||
case DIK_LBRACKET:
|
||||
dik_code = 0x1b;
|
||||
break;
|
||||
case DIK_COLON:
|
||||
dik_code = 0x28;
|
||||
break;
|
||||
case DIK_KANJI:
|
||||
dik_code = 0x29;
|
||||
break;
|
||||
case DIK_RBRACKET:
|
||||
dik_code = 0x2b;
|
||||
break;
|
||||
case DIK_BACKSLASH:
|
||||
dik_code = 0x73;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return dik_code;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* GetObjectInfo : get information about a device object such as a button
|
||||
* or axis
|
||||
|
@ -396,14 +478,14 @@ SysKeyboardAImpl_GetObjectInfo(
|
|||
DWORD dwObj,
|
||||
DWORD dwHow)
|
||||
{
|
||||
SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface);
|
||||
HRESULT res;
|
||||
LONG scan;
|
||||
|
||||
res = IDirectInputDevice2AImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow);
|
||||
if (res != DI_OK) return res;
|
||||
|
||||
scan = DIDFT_GETINSTANCE(pdidoi->dwType);
|
||||
if (scan == DIK_PAUSE || scan == DIK_NUMLOCK) scan ^= 0x80;
|
||||
scan = map_dik_to_scan(DIDFT_GETINSTANCE(pdidoi->dwType), This->subtype);
|
||||
if (!GetKeyNameTextA((scan & 0x80) << 17 | (scan & 0x7f) << 16,
|
||||
pdidoi->tszName, sizeof(pdidoi->tszName)))
|
||||
return DIERR_OBJECTNOTFOUND;
|
||||
|
@ -417,14 +499,14 @@ static HRESULT WINAPI SysKeyboardWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface
|
|||
DWORD dwObj,
|
||||
DWORD dwHow)
|
||||
{
|
||||
SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface);
|
||||
HRESULT res;
|
||||
LONG scan;
|
||||
|
||||
res = IDirectInputDevice2WImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow);
|
||||
if (res != DI_OK) return res;
|
||||
|
||||
scan = DIDFT_GETINSTANCE(pdidoi->dwType);
|
||||
if (scan == DIK_PAUSE || scan == DIK_NUMLOCK) scan ^= 0x80;
|
||||
scan = map_dik_to_scan(DIDFT_GETINSTANCE(pdidoi->dwType), This->subtype);
|
||||
if (!GetKeyNameTextW((scan & 0x80) << 17 | (scan & 0x7f) << 16,
|
||||
pdidoi->tszName, sizeof(pdidoi->tszName)/sizeof(pdidoi->tszName[0])))
|
||||
return DIERR_OBJECTNOTFOUND;
|
||||
|
@ -448,7 +530,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceInfo(
|
|||
return DI_OK;
|
||||
}
|
||||
|
||||
fill_keyboard_dideviceinstanceA(pdidi, This->base.dinput->dwVersion);
|
||||
fill_keyboard_dideviceinstanceA(pdidi, This->base.dinput->dwVersion, This->subtype);
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
|
@ -463,7 +545,7 @@ static HRESULT WINAPI SysKeyboardWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface
|
|||
return DI_OK;
|
||||
}
|
||||
|
||||
fill_keyboard_dideviceinstanceW(pdidi, This->base.dinput->dwVersion);
|
||||
fill_keyboard_dideviceinstanceW(pdidi, This->base.dinput->dwVersion, This->subtype);
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to WineStaging-3.17
|
|||
reactos/dll/directx/wine/d3dxof # Synced to WineStaging-3.17
|
||||
reactos/dll/directx/wine/ddraw # Synced to WineStaging-3.9
|
||||
reactos/dll/directx/wine/devenum # Synced to WineStaging-3.9
|
||||
reactos/dll/directx/wine/dinput # Synced to WineStaging-3.9
|
||||
reactos/dll/directx/wine/dinput # Synced to WineStaging-3.17
|
||||
reactos/dll/directx/wine/dinput8 # Synced to WineStaging-3.3
|
||||
reactos/dll/directx/wine/dmusic # Synced to WineStaging-3.9
|
||||
reactos/dll/directx/wine/dplay # Synced to WineStaging-3.3
|
||||
|
|
Loading…
Reference in a new issue