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
15 IDirectInput8W
* pObj
;
19 }INPUT_DIALOG_CONTEXT
, *PINPUT_DIALOG_CONTEXT
;
22 BOOL CALLBACK
DirectInputEnumDevCb(
23 LPCDIDEVICEINSTANCEW lpddi
,
29 IDirectInputDevice8W
* pDev
= NULL
;
30 //DIPROPGUIDANDPATH GuidPath;
31 //DIPROPSTRING TypeName;
35 DWORD dwManufacturerID
;
39 PINPUT_DIALOG_CONTEXT pContext
= (PINPUT_DIALOG_CONTEXT
)pvRef
;
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
);
51 return DIENUM_CONTINUE
;
53 /* is the device attached */
55 hResult
= pContext
->pObj
->lpVtbl
->GetDeviceStatus(pContext
->pObj
, &lpddi
->guidInstance
);
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
));
61 LoadStringW(hInst
, IDS_DEVICE_STATUS_UNKNOWN
, szText
, sizeof(szText
) / sizeof(WCHAR
));
65 szText
[(sizeof(szText
) / sizeof(WCHAR
))-1] = L
'\0';
67 Item
.pszText
= szText
;
68 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
71 hResult
= pContext
->pObj
->lpVtbl
->CreateDevice(pContext
->pObj
, &lpddi
->guidInstance
, &pDev
, NULL
);
76 ZeroMemory(&VendorID
, sizeof(DIPROPDWORD
));
77 VendorID
.diph
.dwSize
= sizeof(DIPROPDWORD
);
78 VendorID
.diph
.dwHeaderSize
= sizeof(DIPROPHEADER
);
80 hResult
= pDev
->lpVtbl
->GetProperty(pDev
, DIPROP_VIDPID
, (LPDIPROPHEADER
)&VendorID
);
83 /* set manufacturer id */
84 dwManufacturerID
= LOWORD(VendorID
.dwData
);
85 wsprintfW(szText
, L
"0x%04X", dwManufacturerID
);
87 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
89 dwProductID
= HIWORD(VendorID
.dwData
);
90 wsprintfW(szText
, L
"0x%04X", dwProductID
);
92 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
97 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
) / sizeof(WCHAR
));
98 szText
[(sizeof(szText
)/sizeof(WCHAR
))-1] = L
'\0';
99 /* set manufacturer id */
101 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
104 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
107 /* check for force feedback support */
108 DevCaps
.dwSize
= sizeof(DIDEVCAPS
); // use DIDEVCAPS_DX3 for DX3 support
109 hResult
= pDev
->lpVtbl
->GetCapabilities(pDev
, &DevCaps
);
111 if (hResult
== DI_OK
)
113 if (DevCaps
.dwFlags
& DIDC_FORCEFEEDBACK
)
114 LoadStringW(hInst
, IDS_OPTION_YES
, szText
, sizeof(szText
)/sizeof(WCHAR
));
116 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
)/sizeof(WCHAR
));
120 LoadStringW(hInst
, IDS_NOT_APPLICABLE
, szText
, sizeof(szText
)/sizeof(WCHAR
));
124 SendMessageW(pContext
->hDevList
, LVM_SETITEM
, lResult
, (LPARAM
)&Item
);
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
);
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
);
144 pDev
->lpVtbl
->Release(pDev
);
148 return DIENUM_CONTINUE
;
152 InitListViewColumns(PINPUT_DIALOG_CONTEXT pContext
)
159 pContext
->hDevList
= GetDlgItem(pContext
->hwndDlg
, IDC_LIST_DEVICE
);
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
;
167 for(Index
= 0; Index
< 6; Index
++)
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)
179 InitializeDirectInputDialog(HWND hwndDlg
)
181 INPUT_DIALOG_CONTEXT Context
;
183 IDirectInput8W
* pObj
;
185 hResult
= DirectInput8Create(hInst
, DIRECTINPUT_VERSION
, &IID_IDirectInput8W
, (LPVOID
*)&pObj
, NULL
);
186 if (hResult
!= DI_OK
)
189 ZeroMemory(&Context
, sizeof(Context
));
191 Context
.hwndDlg
= hwndDlg
;
192 InitListViewColumns(&Context
);
193 hResult
= pObj
->lpVtbl
->EnumDevices(pObj
, DI8DEVCLASS_ALL
, DirectInputEnumDevCb
, (PVOID
)&Context
, DIEDFL_ALLDEVICES
);
195 pObj
->lpVtbl
->Release(pObj
);
201 InputPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
203 UNREFERENCED_PARAMETER(lParam
);
204 UNREFERENCED_PARAMETER(wParam
);
208 SetWindowPos(hDlg
, NULL
, 10, 32, 0, 0, SWP_NOACTIVATE
| SWP_NOOWNERZORDER
| SWP_NOSIZE
| SWP_NOZORDER
);
209 InitializeDirectInputDialog(hDlg
);