Implement GetDeviceInfo and GetObjectInfo for the keyboard device.
This commit is contained in:
parent
f4d19e6b58
commit
8985c02020
|
@ -156,8 +156,8 @@ static HRESULT WINAPI IDirectInputAImpl_EnumDevices(
|
||||||
TRACE("(this=%p,0x%04lx,%p,%p,%04lx)\n", This, dwDevType, lpCallback, pvRef, dwFlags);
|
TRACE("(this=%p,0x%04lx,%p,%p,%04lx)\n", This, dwDevType, lpCallback, pvRef, dwFlags);
|
||||||
|
|
||||||
for (i = 0; i < nrof_dinput_devices; i++) {
|
for (i = 0; i < nrof_dinput_devices; i++) {
|
||||||
|
devInstance.dwSize = sizeof(devInstance);
|
||||||
if (dinput_devices[i]->enum_device(dwDevType, dwFlags, &devInstance)) {
|
if (dinput_devices[i]->enum_device(dwDevType, dwFlags, &devInstance)) {
|
||||||
devInstance.dwSize = sizeof(devInstance);
|
|
||||||
if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
|
if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ LRESULT CALLBACK KeyboardCallback( int code, WPARAM wparam, LPARAM lparam )
|
||||||
BYTE dik_code;
|
BYTE dik_code;
|
||||||
BOOL down;
|
BOOL down;
|
||||||
DWORD timestamp;
|
DWORD timestamp;
|
||||||
|
|
||||||
{
|
{
|
||||||
KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam;
|
KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam;
|
||||||
dik_code = hook->scanCode;
|
dik_code = hook->scanCode;
|
||||||
|
@ -138,17 +138,34 @@ static GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a9644
|
||||||
{0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41}
|
{0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void fill_keyboard_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi) {
|
||||||
|
DWORD dwSize;
|
||||||
|
DIDEVICEINSTANCEA ddi;
|
||||||
|
|
||||||
|
dwSize = lpddi->dwSize;
|
||||||
|
|
||||||
|
TRACE("%ld %p\n", dwSize, lpddi);
|
||||||
|
|
||||||
|
memset(lpddi, 0, dwSize);
|
||||||
|
memset(&ddi, 0, sizeof(ddi));
|
||||||
|
|
||||||
|
ddi.dwSize = dwSize;
|
||||||
|
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
|
||||||
|
ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
|
||||||
|
ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
|
||||||
|
strcpy(ddi.tszInstanceName, "Keyboard");
|
||||||
|
strcpy(ddi.tszProductName, "Wine Keyboard");
|
||||||
|
|
||||||
|
memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL keyboarddev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi)
|
static BOOL keyboarddev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi)
|
||||||
{
|
{
|
||||||
if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_KEYBOARD)) {
|
if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_KEYBOARD)) {
|
||||||
TRACE("Enumerating the Keyboard device\n");
|
TRACE("Enumerating the Keyboard device\n");
|
||||||
|
|
||||||
lpddi->guidInstance = GUID_SysKeyboard;/* DInput's GUID */
|
fill_keyboard_dideviceinstancea(lpddi);
|
||||||
lpddi->guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
|
|
||||||
lpddi->dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
|
|
||||||
strcpy(lpddi->tszInstanceName, "Keyboard");
|
|
||||||
strcpy(lpddi->tszProductName, "Wine Keyboard");
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,7 +369,7 @@ static HRESULT WINAPI SysKeyboardAImpl_EnumObjects(
|
||||||
ddoi.guidType = GUID_Key;
|
ddoi.guidType = GUID_Key;
|
||||||
ddoi.dwOfs = i;
|
ddoi.dwOfs = i;
|
||||||
ddoi.dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_BUTTON;
|
ddoi.dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_BUTTON;
|
||||||
strcpy(ddoi.tszName, "a"); /* This should be better handled :-/ */
|
GetKeyNameTextA(((i & 0x7f) << 16) | ((i & 0x80) << 17), ddoi.tszName, sizeof(ddoi.tszName));
|
||||||
_dump_OBJECTINSTANCEA(&ddoi);
|
_dump_OBJECTINSTANCEA(&ddoi);
|
||||||
if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
|
if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK;
|
||||||
}
|
}
|
||||||
|
@ -461,6 +478,66 @@ static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities(
|
||||||
return DI_OK;
|
return DI_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* GetObjectInfo : get information about a device object such as a button
|
||||||
|
* or axis
|
||||||
|
*/
|
||||||
|
static HRESULT WINAPI
|
||||||
|
SysKeyboardAImpl_GetObjectInfo(
|
||||||
|
LPDIRECTINPUTDEVICE8A iface,
|
||||||
|
LPDIDEVICEOBJECTINSTANCEA pdidoi,
|
||||||
|
DWORD dwObj,
|
||||||
|
DWORD dwHow)
|
||||||
|
{
|
||||||
|
ICOM_THIS(SysKeyboardAImpl,iface);
|
||||||
|
DIDEVICEOBJECTINSTANCEA ddoi;
|
||||||
|
DWORD dwSize = pdidoi->dwSize;
|
||||||
|
|
||||||
|
TRACE("(this=%p,%p,%ld,0x%08lx)\n", This, pdidoi, dwObj, dwHow);
|
||||||
|
|
||||||
|
if (dwHow == DIPH_BYID) {
|
||||||
|
WARN(" querying by id not supported yet...\n");
|
||||||
|
return DI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(pdidoi, 0, dwSize);
|
||||||
|
memset(&ddoi, 0, sizeof(ddoi));
|
||||||
|
|
||||||
|
ddoi.dwSize = dwSize;
|
||||||
|
ddoi.guidType = GUID_Key;
|
||||||
|
ddoi.dwOfs = dwObj;
|
||||||
|
ddoi.dwType = DIDFT_MAKEINSTANCE(dwObj) | DIDFT_BUTTON;
|
||||||
|
GetKeyNameTextA(((dwObj & 0x7f) << 16) | ((dwObj & 0x80) << 17), ddoi.tszName, sizeof(ddoi.tszName));
|
||||||
|
|
||||||
|
/* And return our just filled device object instance structure */
|
||||||
|
memcpy(pdidoi, &ddoi, (dwSize < sizeof(ddoi) ? dwSize : sizeof(ddoi)));
|
||||||
|
|
||||||
|
_dump_OBJECTINSTANCEA(pdidoi);
|
||||||
|
|
||||||
|
return DI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* GetDeviceInfo : get information about a device's identity
|
||||||
|
*/
|
||||||
|
static HRESULT WINAPI SysKeyboardAImpl_GetDeviceInfo(
|
||||||
|
LPDIRECTINPUTDEVICE8A iface,
|
||||||
|
LPDIDEVICEINSTANCEA pdidi)
|
||||||
|
{
|
||||||
|
ICOM_THIS(SysKeyboardAImpl,iface);
|
||||||
|
TRACE("(this=%p,%p)\n", This, pdidi);
|
||||||
|
|
||||||
|
if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEA)) {
|
||||||
|
WARN(" dinput3 not supporte yet...\n");
|
||||||
|
return DI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
fill_keyboard_dideviceinstancea(pdidi);
|
||||||
|
|
||||||
|
return DI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ICOM_VTABLE(IDirectInputDevice8A) SysKeyboardAvt =
|
static ICOM_VTABLE(IDirectInputDevice8A) SysKeyboardAvt =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
|
@ -478,8 +555,8 @@ static ICOM_VTABLE(IDirectInputDevice8A) SysKeyboardAvt =
|
||||||
IDirectInputDevice2AImpl_SetDataFormat,
|
IDirectInputDevice2AImpl_SetDataFormat,
|
||||||
SysKeyboardAImpl_SetEventNotification,
|
SysKeyboardAImpl_SetEventNotification,
|
||||||
IDirectInputDevice2AImpl_SetCooperativeLevel,
|
IDirectInputDevice2AImpl_SetCooperativeLevel,
|
||||||
IDirectInputDevice2AImpl_GetObjectInfo,
|
SysKeyboardAImpl_GetObjectInfo,
|
||||||
IDirectInputDevice2AImpl_GetDeviceInfo,
|
SysKeyboardAImpl_GetDeviceInfo,
|
||||||
IDirectInputDevice2AImpl_RunControlPanel,
|
IDirectInputDevice2AImpl_RunControlPanel,
|
||||||
IDirectInputDevice2AImpl_Initialize,
|
IDirectInputDevice2AImpl_Initialize,
|
||||||
IDirectInputDevice2AImpl_CreateEffect,
|
IDirectInputDevice2AImpl_CreateEffect,
|
||||||
|
|
Loading…
Reference in New Issue