mirror of
https://github.com/reactos/reactos.git
synced 2024-10-30 19:41:57 +00:00
222 lines
6.7 KiB
C
222 lines
6.7 KiB
C
/*
|
|
* PROJECT: ReactX Diagnosis Application
|
|
* LICENSE: LGPL - See COPYING in the top level directory
|
|
* FILE: base/applications/dxdiag/input.c
|
|
* PURPOSE: ReactX diagnosis input page
|
|
* COPYRIGHT: Copyright 2008 Johannes Anderwald
|
|
*
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
#include <dinput.h>
|
|
|
|
typedef struct
|
|
{
|
|
HWND hwndDlg;
|
|
IDirectInput8W * pObj;
|
|
HWND hDevList;
|
|
HWND hPortTree;
|
|
INT Count;
|
|
}INPUT_DIALOG_CONTEXT, *PINPUT_DIALOG_CONTEXT;
|
|
|
|
|
|
BOOL CALLBACK DirectInputEnumDevCb(
|
|
LPCDIDEVICEINSTANCEW lpddi,
|
|
LPVOID pvRef
|
|
)
|
|
{
|
|
HRESULT hResult;
|
|
WCHAR szText[100];
|
|
IDirectInputDevice8W * pDev = NULL;
|
|
//DIPROPGUIDANDPATH GuidPath;
|
|
//DIPROPSTRING TypeName;
|
|
DIPROPDWORD VendorID;
|
|
DIDEVCAPS DevCaps;
|
|
DWORD dwProductID;
|
|
DWORD dwManufacturerID;
|
|
LVITEMW Item;
|
|
LRESULT lResult;
|
|
|
|
PINPUT_DIALOG_CONTEXT pContext = (PINPUT_DIALOG_CONTEXT)pvRef;
|
|
|
|
if (!pContext)
|
|
return DIENUM_STOP;
|
|
|
|
ZeroMemory(&Item, sizeof(LVITEMW));
|
|
Item.mask = LVIF_TEXT;
|
|
Item.pszText = (LPWSTR)lpddi->tszProductName;
|
|
Item.iItem = pContext->Count;
|
|
/* insert device item */
|
|
lResult = SendMessageW(pContext->hDevList, LVM_INSERTITEM, 0, (LPARAM)&Item);
|
|
if (lResult == -1)
|
|
return DIENUM_CONTINUE;
|
|
|
|
/* is the device attached */
|
|
szText[0] = L'\0';
|
|
hResult = pContext->pObj->lpVtbl->GetDeviceStatus(pContext->pObj, &lpddi->guidInstance);
|
|
if (hResult == DI_OK)
|
|
LoadStringW(hInst, IDS_DEVICE_STATUS_ATTACHED, szText, sizeof(szText) / sizeof(WCHAR));
|
|
else if (hResult == DI_NOTATTACHED)
|
|
LoadStringW(hInst, IDS_DEVICE_STATUS_MISSING, szText, sizeof(szText) / sizeof(WCHAR));
|
|
else
|
|
LoadStringW(hInst, IDS_DEVICE_STATUS_UNKNOWN, szText, sizeof(szText) / sizeof(WCHAR));
|
|
|
|
if (szText[0])
|
|
{
|
|
szText[(sizeof(szText) / sizeof(WCHAR))-1] = L'\0';
|
|
Item.iSubItem = 1;
|
|
Item.pszText = szText;
|
|
SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
|
|
}
|
|
|
|
hResult = pContext->pObj->lpVtbl->CreateDevice(pContext->pObj, &lpddi->guidInstance, &pDev, NULL);
|
|
|
|
if (hResult != DI_OK)
|
|
return DIENUM_STOP;
|
|
|
|
ZeroMemory(&VendorID, sizeof(DIPROPDWORD));
|
|
VendorID.diph.dwSize = sizeof(DIPROPDWORD);
|
|
VendorID.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
|
|
|
hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_VIDPID, (LPDIPROPHEADER)&VendorID);
|
|
if (hResult == DI_OK)
|
|
{
|
|
/* set manufacturer id */
|
|
dwManufacturerID = LOWORD(VendorID.dwData);
|
|
wsprintfW(szText, L"0x%04X", dwManufacturerID);
|
|
Item.iSubItem = 3;
|
|
SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
|
|
/* set product id */
|
|
dwProductID = HIWORD(VendorID.dwData);
|
|
wsprintfW(szText, L"0x%04X", dwProductID);
|
|
Item.iSubItem = 4;
|
|
SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
|
|
}
|
|
else
|
|
{
|
|
szText[0] = L'\0';
|
|
LoadStringW(hInst, IDS_NOT_APPLICABLE, szText, sizeof(szText) / sizeof(WCHAR));
|
|
szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
|
|
/* set manufacturer id */
|
|
Item.iSubItem = 3;
|
|
SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
|
|
/* set product id */
|
|
Item.iSubItem = 4;
|
|
SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
|
|
}
|
|
|
|
/* check for force feedback support */
|
|
DevCaps.dwSize = sizeof(DIDEVCAPS); // use DIDEVCAPS_DX3 for DX3 support
|
|
hResult = pDev->lpVtbl->GetCapabilities(pDev, &DevCaps);
|
|
szText[0] = L'\0';
|
|
if (hResult == DI_OK)
|
|
{
|
|
if (DevCaps.dwFlags & DIDC_FORCEFEEDBACK)
|
|
LoadStringW(hInst, IDS_OPTION_YES, szText, sizeof(szText)/sizeof(WCHAR));
|
|
else
|
|
LoadStringW(hInst, IDS_NOT_APPLICABLE, szText, sizeof(szText)/sizeof(WCHAR));
|
|
}
|
|
else
|
|
{
|
|
LoadStringW(hInst, IDS_NOT_APPLICABLE, szText, sizeof(szText)/sizeof(WCHAR));
|
|
}
|
|
|
|
Item.iSubItem = 5;
|
|
SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
|
|
|
|
|
|
#if 0
|
|
ZeroMemory(&GuidPath, sizeof(DIPROPGUIDANDPATH));
|
|
GuidPath.diph.dwSize = sizeof(DIPROPGUIDANDPATH);
|
|
GuidPath.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
|
GuidPath.diph.dwHow = DIPH_DEVICE;
|
|
hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_GUIDANDPATH, (LPDIPROPHEADER)&GuidPath);
|
|
|
|
ZeroMemory(&TypeName, sizeof(TypeName));
|
|
TypeName.diph.dwSize = sizeof(TypeName);
|
|
TypeName.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
|
TypeName.diph.dwHow = DIPH_DEVICE;
|
|
hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_GETPORTDISPLAYNAME, (LPDIPROPHEADER)&TypeName);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
pDev->lpVtbl->Release(pDev);
|
|
pContext->Count++;
|
|
|
|
|
|
return DIENUM_CONTINUE;
|
|
}
|
|
|
|
VOID
|
|
InputPageInitListViewColumns(PINPUT_DIALOG_CONTEXT pContext)
|
|
{
|
|
WCHAR szText[256];
|
|
LVCOLUMNW lvcolumn;
|
|
INT Index;
|
|
|
|
|
|
pContext->hDevList = GetDlgItem(pContext->hwndDlg, IDC_LIST_DEVICE);
|
|
|
|
/* Highlights the entire row instead of just the selected item in the first column.
|
|
This increases readability on the selected item in the list. */
|
|
SendMessage(pContext->hDevList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
|
|
|
|
ZeroMemory(&lvcolumn, sizeof(LVCOLUMNW));
|
|
lvcolumn.pszText = szText;
|
|
lvcolumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH;
|
|
lvcolumn.fmt = LVCFMT_LEFT;
|
|
lvcolumn.cx = 100;
|
|
|
|
for(Index = 0; Index < 6; Index++)
|
|
{
|
|
szText[0] = L'\0';
|
|
LoadStringW(hInst, IDS_DEVICE_NAME + Index, szText, sizeof(szText) / sizeof(WCHAR));
|
|
szText[(sizeof(szText) / sizeof(WCHAR))-1] = L'\0';
|
|
if (SendMessageW(pContext->hDevList, LVM_INSERTCOLUMNW, Index, (LPARAM)&lvcolumn) == -1)
|
|
return;
|
|
}
|
|
}
|
|
|
|
static
|
|
void
|
|
InitializeDirectInputDialog(HWND hwndDlg)
|
|
{
|
|
INPUT_DIALOG_CONTEXT Context;
|
|
HRESULT hResult;
|
|
IDirectInput8W * pObj;
|
|
|
|
hResult = DirectInput8Create(hInst, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (LPVOID*)&pObj, NULL);
|
|
if (hResult != DI_OK)
|
|
return;
|
|
|
|
ZeroMemory(&Context, sizeof(Context));
|
|
Context.pObj = pObj;
|
|
Context.hwndDlg = hwndDlg;
|
|
InputPageInitListViewColumns(&Context);
|
|
pObj->lpVtbl->EnumDevices(pObj, DI8DEVCLASS_ALL, DirectInputEnumDevCb, (PVOID)&Context, DIEDFL_ALLDEVICES);
|
|
|
|
pObj->lpVtbl->Release(pObj);
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK
|
|
InputPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
{
|
|
SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
|
|
InitializeDirectInputDialog(hDlg);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|