[CSRSS]
[reactos.git] / reactos / base / applications / dxdiag / input.c
1 /*
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
7 *
8 */
9
10 #include "precomp.h"
11 #include <dinput.h>
12
13 typedef struct
14 {
15 HWND hwndDlg;
16 IDirectInput8W * pObj;
17 HWND hDevList;
18 HWND hPortTree;
19 INT Count;
20 }INPUT_DIALOG_CONTEXT, *PINPUT_DIALOG_CONTEXT;
21
22
23 BOOL CALLBACK DirectInputEnumDevCb(
24 LPCDIDEVICEINSTANCEW lpddi,
25 LPVOID pvRef
26 )
27 {
28 HRESULT hResult;
29 WCHAR szText[100];
30 IDirectInputDevice8W * pDev = NULL;
31 //DIPROPGUIDANDPATH GuidPath;
32 //DIPROPSTRING TypeName;
33 DIPROPDWORD VendorID;
34 DIDEVCAPS DevCaps;
35 DWORD dwProductID;
36 DWORD dwManufacturerID;
37 LVITEMW Item;
38 LRESULT lResult;
39
40 PINPUT_DIALOG_CONTEXT pContext = (PINPUT_DIALOG_CONTEXT)pvRef;
41
42 if (!pContext)
43 return DIENUM_STOP;
44
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);
51 if (lResult == -1)
52 return DIENUM_CONTINUE;
53
54 /* is the device attached */
55 szText[0] = L'\0';
56 hResult = pContext->pObj->lpVtbl->GetDeviceStatus(pContext->pObj, &lpddi->guidInstance);
57 if (hResult == DI_OK)
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));
61 else
62 LoadStringW(hInst, IDS_DEVICE_STATUS_UNKNOWN, szText, sizeof(szText) / sizeof(WCHAR));
63
64 if (szText[0])
65 {
66 szText[(sizeof(szText) / sizeof(WCHAR))-1] = L'\0';
67 Item.iSubItem = 1;
68 Item.pszText = szText;
69 SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
70 }
71
72 hResult = pContext->pObj->lpVtbl->CreateDevice(pContext->pObj, &lpddi->guidInstance, &pDev, NULL);
73
74 if (hResult != DI_OK)
75 return DIENUM_STOP;
76
77 ZeroMemory(&VendorID, sizeof(DIPROPDWORD));
78 VendorID.diph.dwSize = sizeof(DIPROPDWORD);
79 VendorID.diph.dwHeaderSize = sizeof(DIPROPHEADER);
80
81 hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_VIDPID, (LPDIPROPHEADER)&VendorID);
82 if (hResult == DI_OK)
83 {
84 /* set manufacturer id */
85 dwManufacturerID = LOWORD(VendorID.dwData);
86 wsprintfW(szText, L"0x%04X", dwManufacturerID);
87 Item.iSubItem = 3;
88 SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
89 /* set product id */
90 dwProductID = HIWORD(VendorID.dwData);
91 wsprintfW(szText, L"0x%04X", dwProductID);
92 Item.iSubItem = 4;
93 SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
94 }
95 else
96 {
97 szText[0] = L'\0';
98 LoadStringW(hInst, IDS_NOT_APPLICABLE, szText, sizeof(szText) / sizeof(WCHAR));
99 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
100 /* set manufacturer id */
101 Item.iSubItem = 3;
102 SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
103 /* set product id */
104 Item.iSubItem = 4;
105 SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
106 }
107
108 /* check for force feedback support */
109 DevCaps.dwSize = sizeof(DIDEVCAPS); // use DIDEVCAPS_DX3 for DX3 support
110 hResult = pDev->lpVtbl->GetCapabilities(pDev, &DevCaps);
111 szText[0] = L'\0';
112 if (hResult == DI_OK)
113 {
114 if (DevCaps.dwFlags & DIDC_FORCEFEEDBACK)
115 LoadStringW(hInst, IDS_OPTION_YES, szText, sizeof(szText)/sizeof(WCHAR));
116 else
117 LoadStringW(hInst, IDS_NOT_APPLICABLE, szText, sizeof(szText)/sizeof(WCHAR));
118 }
119 else
120 {
121 LoadStringW(hInst, IDS_NOT_APPLICABLE, szText, sizeof(szText)/sizeof(WCHAR));
122 }
123
124 Item.iSubItem = 5;
125 SendMessageW(pContext->hDevList, LVM_SETITEM, lResult, (LPARAM)&Item);
126
127
128 #if 0
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);
134
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);
140
141
142 #endif
143
144
145 pDev->lpVtbl->Release(pDev);
146 pContext->Count++;
147
148
149 return DIENUM_CONTINUE;
150 }
151
152 VOID
153 InitListViewColumns(PINPUT_DIALOG_CONTEXT pContext)
154 {
155 WCHAR szText[256];
156 LVCOLUMNW lvcolumn;
157 INT Index;
158
159
160 pContext->hDevList = GetDlgItem(pContext->hwndDlg, IDC_LIST_DEVICE);
161
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;
166 lvcolumn.cx = 100;
167
168 for(Index = 0; Index < 6; Index++)
169 {
170 szText[0] = L'\0';
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)
174 return;
175 }
176 }
177
178 static
179 void
180 InitializeDirectInputDialog(HWND hwndDlg)
181 {
182 INPUT_DIALOG_CONTEXT Context;
183 HRESULT hResult;
184 IDirectInput8W * pObj;
185
186 hResult = DirectInput8Create(hInst, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (LPVOID*)&pObj, NULL);
187 if (hResult != DI_OK)
188 return;
189
190 ZeroMemory(&Context, sizeof(Context));
191 Context.pObj = pObj;
192 Context.hwndDlg = hwndDlg;
193 InitListViewColumns(&Context);
194 pObj->lpVtbl->EnumDevices(pObj, DI8DEVCLASS_ALL, DirectInputEnumDevCb, (PVOID)&Context, DIEDFL_ALLDEVICES);
195
196 pObj->lpVtbl->Release(pObj);
197 }
198
199
200
201 INT_PTR CALLBACK
202 InputPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
203 {
204 UNREFERENCED_PARAMETER(lParam);
205 UNREFERENCED_PARAMETER(wParam);
206 switch (message) {
207 case WM_INITDIALOG:
208 {
209 SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
210 InitializeDirectInputDialog(hDlg);
211 return TRUE;
212 }
213 }
214
215 return FALSE;
216 }