2 * PROJECT: ReactX Diagnosis Application
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/dxdiag/input.c
5 * PURPOSE: ReactX diagnosis input page
6 * COPYRIGHT: Copyright 2008 Johannes Anderwald
16 IDirectInput8W
* pObj
;
20 }INPUT_DIALOG_CONTEXT
, *PINPUT_DIALOG_CONTEXT
;
23 BOOL CALLBACK
DirectInputEnumDevCb(
24 LPCDIDEVICEINSTANCEW lpddi
,
30 IDirectInputDevice8W
* pDev
= NULL
;
31 //DIPROPGUIDANDPATH GuidPath;
32 //DIPROPSTRING TypeName;
36 DWORD dwManufacturerID
;
40 PINPUT_DIALOG_CONTEXT pContext
= (PINPUT_DIALOG_CONTEXT
)pvRef
;
45 ZeroMemory(&Item
, sizeof(LVITEMW
));
46 Item
.mask
= LVIF_TEXT
;
47 Item
.pszText
= (LPWSTR
)lpddi
->tszProductName
;
48 Item
.iItem
= pContext
->Count
;
49 /* insert device item */
50 lResult
= SendMessageW(pContext
->hDevList
, LVM_INSERTITEM
, 0, (LPARAM
)&Item
);
52 return DIENUM_CONTINUE
;
54 /* is the device attached */
56 hResult
= pContext
->pObj
->lpVtbl
->GetDeviceStatus(pContext
->pObj
, &lpddi
->guidInstance
);
58 LoadStringW(hInst
, IDS_DEVICE_STATUS_ATTACHED
, szText
, sizeof(szText
) / sizeof(WCHAR
));
59 else if (hResult
== DI_NOTATTACHED
)
60 LoadStringW(hInst
, IDS_DEVICE_STATUS_MISSING
, szText
, sizeof(szText
) / sizeof(WCHAR
));
62 LoadStringW(hInst
, IDS_DEVICE_STATUS_UNKNOWN
, szText
, sizeof(szText
) / sizeof(WCHAR
));
66 szText
[(sizeof(szText
) / sizeof(WCHAR
))-1] = L
'\0';
68 Item
.pszText
= szText
;
69 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
72 hResult
= pContext
->pObj
->lpVtbl
->CreateDevice(pContext
->pObj
, &lpddi
->guidInstance
, &pDev
, NULL
);
77 ZeroMemory(&VendorID
, sizeof(DIPROPDWORD
));
78 VendorID
.diph
.dwSize
= sizeof(DIPROPDWORD
);
79 VendorID
.diph
.dwHeaderSize
= sizeof(DIPROPHEADER
);
81 hResult
= pDev
->lpVtbl
->GetProperty(pDev
, DIPROP_VIDPID
, (LPDIPROPHEADER
)&VendorID
);
84 /* set manufacturer id */
85 dwManufacturerID
= LOWORD(VendorID
.dwData
);
86 wsprintfW(szText
, L
"0x%04X", dwManufacturerID
);
88 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
90 dwProductID
= HIWORD(VendorID
.dwData
);
91 wsprintfW(szText
, L
"0x%04X", dwProductID
);
93 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
98 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
) / sizeof(WCHAR
));
99 szText
[(sizeof(szText
)/sizeof(WCHAR
))-1] = L
'\0';
100 /* set manufacturer id */
102 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
105 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
108 /* check for force feedback support */
109 DevCaps
.dwSize
= sizeof(DIDEVCAPS
); // use DIDEVCAPS_DX3 for DX3 support
110 hResult
= pDev
->lpVtbl
->GetCapabilities(pDev
, &DevCaps
);
112 if (hResult
== DI_OK
)
114 if (DevCaps
.dwFlags
& DIDC_FORCEFEEDBACK
)
115 LoadStringW(hInst
, IDS_OPTION_YES
, szText
, sizeof(szText
)/sizeof(WCHAR
));
117 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
)/sizeof(WCHAR
));
121 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
)/sizeof(WCHAR
));
125 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
129 ZeroMemory(&GuidPath
, sizeof(DIPROPGUIDANDPATH
));
130 GuidPath
.diph
.dwSize
= sizeof(DIPROPGUIDANDPATH
);
131 GuidPath
.diph
.dwHeaderSize
= sizeof(DIPROPHEADER
);
132 GuidPath
.diph
.dwHow
= DIPH_DEVICE
;
133 hResult
= pDev
->lpVtbl
->GetProperty(pDev
, DIPROP_GUIDANDPATH
, (LPDIPROPHEADER
)&GuidPath
);
135 ZeroMemory(&TypeName
, sizeof(TypeName
));
136 TypeName
.diph
.dwSize
= sizeof(TypeName
);
137 TypeName
.diph
.dwHeaderSize
= sizeof(DIPROPHEADER
);
138 TypeName
.diph
.dwHow
= DIPH_DEVICE
;
139 hResult
= pDev
->lpVtbl
->GetProperty(pDev
, DIPROP_GETPORTDISPLAYNAME
, (LPDIPROPHEADER
)&TypeName
);
145 pDev
->lpVtbl
->Release(pDev
);
149 return DIENUM_CONTINUE
;
153 InitListViewColumns(PINPUT_DIALOG_CONTEXT pContext
)
160 pContext
->hDevList
= GetDlgItem(pContext
->hwndDlg
, IDC_LIST_DEVICE
);
162 ZeroMemory(&lvcolumn
, sizeof(LVCOLUMNW
));
163 lvcolumn
.pszText
= szText
;
164 lvcolumn
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_SUBITEM
| LVCF_WIDTH
;
165 lvcolumn
.fmt
= LVCFMT_LEFT
;
168 for(Index
= 0; Index
< 6; Index
++)
171 LoadStringW(hInst
, IDS_DEVICE_NAME
+ Index
, szText
, sizeof(szText
) / sizeof(WCHAR
));
172 szText
[(sizeof(szText
) / sizeof(WCHAR
))-1] = L
'\0';
173 if (SendMessageW(pContext
->hDevList
, LVM_INSERTCOLUMNW
, Index
, (LPARAM
)&lvcolumn
) == -1)
180 InitializeDirectInputDialog(HWND hwndDlg
)
182 INPUT_DIALOG_CONTEXT Context
;
184 IDirectInput8W
* pObj
;
186 hResult
= DirectInput8Create(hInst
, DIRECTINPUT_VERSION
, &IID_IDirectInput8W
, (LPVOID
*)&pObj
, NULL
);
187 if (hResult
!= DI_OK
)
190 ZeroMemory(&Context
, sizeof(Context
));
192 Context
.hwndDlg
= hwndDlg
;
193 InitListViewColumns(&Context
);
194 hResult
= pObj
->lpVtbl
->EnumDevices(pObj
, DI8DEVCLASS_ALL
, DirectInputEnumDevCb
, (PVOID
)&Context
, DIEDFL_ALLDEVICES
);
196 pObj
->lpVtbl
->Release(pObj
);
202 InputPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
204 UNREFERENCED_PARAMETER(lParam
);
205 UNREFERENCED_PARAMETER(wParam
);
209 SetWindowPos(hDlg
, NULL
, 10, 32, 0, 0, SWP_NOACTIVATE
| SWP_NOOWNERZORDER
| SWP_NOSIZE
| SWP_NOZORDER
);
210 InitializeDirectInputDialog(hDlg
);