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
17 IDirectInput8W
* pObj
;
21 }INPUT_DIALOG_CONTEXT
, *PINPUT_DIALOG_CONTEXT
;
24 BOOL CALLBACK
DirectInputEnumDevCb(
25 LPCDIDEVICEINSTANCEW lpddi
,
31 IDirectInputDevice8W
* pDev
= NULL
;
32 //DIPROPGUIDANDPATH GuidPath;
33 //DIPROPSTRING TypeName;
37 DWORD dwManufacturerID
;
41 PINPUT_DIALOG_CONTEXT pContext
= (PINPUT_DIALOG_CONTEXT
)pvRef
;
46 ZeroMemory(&Item
, sizeof(LVITEMW
));
47 Item
.mask
= LVIF_TEXT
;
48 Item
.pszText
= (LPWSTR
)lpddi
->tszProductName
;
49 Item
.iItem
= pContext
->Count
;
50 /* insert device item */
51 lResult
= SendMessageW(pContext
->hDevList
, LVM_INSERTITEM
, 0, (LPARAM
)&Item
);
53 return DIENUM_CONTINUE
;
55 /* is the device attached */
57 hResult
= pContext
->pObj
->lpVtbl
->GetDeviceStatus(pContext
->pObj
, &lpddi
->guidInstance
);
59 LoadStringW(hInst
, IDS_DEVICE_STATUS_ATTACHED
, szText
, sizeof(szText
) / sizeof(WCHAR
));
60 else if (hResult
== DI_NOTATTACHED
)
61 LoadStringW(hInst
, IDS_DEVICE_STATUS_MISSING
, szText
, sizeof(szText
) / sizeof(WCHAR
));
63 LoadStringW(hInst
, IDS_DEVICE_STATUS_UNKNOWN
, szText
, sizeof(szText
) / sizeof(WCHAR
));
67 szText
[(sizeof(szText
) / sizeof(WCHAR
))-1] = L
'\0';
69 Item
.pszText
= szText
;
70 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
73 hResult
= pContext
->pObj
->lpVtbl
->CreateDevice(pContext
->pObj
, &lpddi
->guidInstance
, &pDev
, NULL
);
78 ZeroMemory(&VendorID
, sizeof(DIPROPDWORD
));
79 VendorID
.diph
.dwSize
= sizeof(DIPROPDWORD
);
80 VendorID
.diph
.dwHeaderSize
= sizeof(DIPROPHEADER
);
82 hResult
= pDev
->lpVtbl
->GetProperty(pDev
, DIPROP_VIDPID
, (LPDIPROPHEADER
)&VendorID
);
85 /* set manufacturer id */
86 dwManufacturerID
= LOWORD(VendorID
.dwData
);
87 wsprintfW(szText
, L
"0x%04X", dwManufacturerID
);
89 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
91 dwProductID
= HIWORD(VendorID
.dwData
);
92 wsprintfW(szText
, L
"0x%04X", dwProductID
);
94 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
99 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
) / sizeof(WCHAR
));
100 szText
[(sizeof(szText
)/sizeof(WCHAR
))-1] = L
'\0';
101 /* set manufacturer id */
103 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
106 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
109 /* check for force feedback support */
110 DevCaps
.dwSize
= sizeof(DIDEVCAPS
); // use DIDEVCAPS_DX3 for DX3 support
111 hResult
= pDev
->lpVtbl
->GetCapabilities(pDev
, &DevCaps
);
113 if (hResult
== DI_OK
)
115 if (DevCaps
.dwFlags
& DIDC_FORCEFEEDBACK
)
116 LoadStringW(hInst
, IDS_OPTION_YES
, szText
, sizeof(szText
)/sizeof(WCHAR
));
118 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
)/sizeof(WCHAR
));
122 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
)/sizeof(WCHAR
));
126 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
130 ZeroMemory(&GuidPath
, sizeof(DIPROPGUIDANDPATH
));
131 GuidPath
.diph
.dwSize
= sizeof(DIPROPGUIDANDPATH
);
132 GuidPath
.diph
.dwHeaderSize
= sizeof(DIPROPHEADER
);
133 GuidPath
.diph
.dwHow
= DIPH_DEVICE
;
134 hResult
= pDev
->lpVtbl
->GetProperty(pDev
, DIPROP_GUIDANDPATH
, (LPDIPROPHEADER
)&GuidPath
);
136 ZeroMemory(&TypeName
, sizeof(TypeName
));
137 TypeName
.diph
.dwSize
= sizeof(TypeName
);
138 TypeName
.diph
.dwHeaderSize
= sizeof(DIPROPHEADER
);
139 TypeName
.diph
.dwHow
= DIPH_DEVICE
;
140 hResult
= pDev
->lpVtbl
->GetProperty(pDev
, DIPROP_GETPORTDISPLAYNAME
, (LPDIPROPHEADER
)&TypeName
);
146 pDev
->lpVtbl
->Release(pDev
);
150 return DIENUM_CONTINUE
;
154 InitListViewColumns(PINPUT_DIALOG_CONTEXT pContext
)
161 pContext
->hDevList
= GetDlgItem(pContext
->hwndDlg
, IDC_LIST_DEVICE
);
163 ZeroMemory(&lvcolumn
, sizeof(LVCOLUMNW
));
164 lvcolumn
.pszText
= szText
;
165 lvcolumn
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_SUBITEM
| LVCF_WIDTH
;
166 lvcolumn
.fmt
= LVCFMT_LEFT
;
169 for(Index
= 0; Index
< 6; Index
++)
172 LoadStringW(hInst
, IDS_DEVICE_NAME
+ Index
, szText
, sizeof(szText
) / sizeof(WCHAR
));
173 szText
[(sizeof(szText
) / sizeof(WCHAR
))-1] = L
'\0';
174 if (SendMessageW(pContext
->hDevList
, LVM_INSERTCOLUMNW
, Index
, (LPARAM
)&lvcolumn
) == -1)
181 InitializeDirectInputDialog(HWND hwndDlg
)
183 INPUT_DIALOG_CONTEXT Context
;
185 IDirectInput8W
* pObj
;
187 hResult
= DirectInput8Create(hInst
, DIRECTINPUT_VERSION
, &IID_IDirectInput8W
, (LPVOID
*)&pObj
, NULL
);
188 if (hResult
!= DI_OK
)
191 ZeroMemory(&Context
, sizeof(Context
));
193 Context
.hwndDlg
= hwndDlg
;
194 InitListViewColumns(&Context
);
195 pObj
->lpVtbl
->EnumDevices(pObj
, DI8DEVCLASS_ALL
, DirectInputEnumDevCb
, (PVOID
)&Context
, DIEDFL_ALLDEVICES
);
197 pObj
->lpVtbl
->Release(pObj
);
203 InputPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
205 UNREFERENCED_PARAMETER(lParam
);
206 UNREFERENCED_PARAMETER(wParam
);
210 SetWindowPos(hDlg
, NULL
, 10, 32, 0, 0, SWP_NOACTIVATE
| SWP_NOOWNERZORDER
| SWP_NOSIZE
| SWP_NOZORDER
);
211 InitializeDirectInputDialog(hDlg
);