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