[3/8] dinput: Added enumerated devices to ConfigureDevices dialog (try 2)
Lucas Fialho Zawacki
lfzawacki at gmail.com
Thu Aug 4 12:21:32 CDT 2011
---
dlls/dinput/config.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 116 insertions(+), 1 deletions(-)
diff --git a/dlls/dinput/config.c b/dlls/dinput/config.c
index 26625ac..ca85797 100644
--- a/dlls/dinput/config.c
+++ b/dlls/dinput/config.c
@@ -25,8 +25,120 @@
WINE_DEFAULT_DEBUG_CHANNEL(dinput);
+typedef struct {
+ int nobjects;
+ LPDIRECTINPUTDEVICE8W lpdid;
+ DIDEVICEINSTANCEW ddi;
+ DIDEVICEOBJECTINSTANCEW ddo[256];
+} DeviceData;
+
+typedef struct {
+ int ndevices;
+ DeviceData *devices;
+} DIDevicesData;
+
+typedef struct {
+ LPDIRECTINPUT8W lpDI;
+ LPDICONFIGUREDEVICESPARAMSW params;
+ DWORD flags;
+} ConfigureDevicesData;
+
static HINSTANCE g_hinstance;
+/*
+ * Enumeration callback functions
+ */
+static BOOL CALLBACK count_devices(LPCDIDEVICEINSTANCEW lpddi, LPDIRECTINPUTDEVICE8W lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef)
+{
+ DIDevicesData *data = (DIDevicesData*) pvRef;
+
+ data->ndevices++;
+ return DIENUM_CONTINUE;
+}
+
+static BOOL CALLBACK collect_devices(LPCDIDEVICEINSTANCEW lpddi, LPDIRECTINPUTDEVICE8W lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef)
+{
+ DIDevicesData *data = (DIDevicesData*) pvRef;
+ DeviceData *device = &data->devices[data->ndevices];
+ device->lpdid = lpdid;
+ device->ddi = *lpddi;
+
+ IDirectInputDevice_AddRef(lpdid);
+
+ data->ndevices++;
+ return DIENUM_CONTINUE;
+}
+
+/*
+ * Utility functions
+ */
+static void init_devices(HWND dialog, LPDIRECTINPUT8W lpDI, DIDevicesData *data, LPDIACTIONFORMATW lpdiaf)
+{
+ int i;
+
+ /* Count devices */
+ IDirectInput8_EnumDevicesBySemantics(lpDI, NULL, lpdiaf, count_devices, (LPVOID) data, 0);
+
+ /* Allocate devices */
+ data->devices = (DeviceData*) HeapAlloc(GetProcessHeap(), 0, sizeof(DeviceData) * data->ndevices);
+
+ /* Collect and insert */
+ data->ndevices = 0;
+ IDirectInput8_EnumDevicesBySemantics(lpDI, NULL, lpdiaf, collect_devices, (LPVOID) data, 0);
+
+ for (i=0; i < data->ndevices; i++)
+ SendDlgItemMessageW(dialog, IDC_CONTROLLERCOMBO, CB_ADDSTRING, 0, (LPARAM) data->devices[i].ddi.tszProductName );
+}
+
+static void destroy_devices(DIDevicesData *data)
+{
+ int i;
+ for (i=0; i < data->ndevices; i++)
+ IDirectInputDevice8_Release(data->devices[i].lpdid);
+
+ HeapFree(GetProcessHeap(), 0, data->devices);
+}
+
+static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ static LPDIACTIONFORMATW lpdiaf;
+ static DIDevicesData devices_data;
+ static ConfigureDevicesData *conf_data;
+
+ switch(uMsg)
+ {
+ case WM_INITDIALOG:
+ /* Initialize action format and enumerate devices */
+ conf_data = (ConfigureDevicesData*) lParam;
+ lpdiaf = conf_data->params->lprgFormats;
+
+ init_devices(dialog, conf_data->lpDI, &devices_data, lpdiaf);
+
+ break;
+
+ case WM_COMMAND:
+
+ switch( LOWORD( wParam ) )
+ {
+ case IDOK:
+ EndDialog(dialog, 0);
+ destroy_devices(&devices_data);
+ break;
+
+ case IDCANCEL:
+ EndDialog(dialog, 0);
+ destroy_devices(&devices_data);
+ break;
+
+ case IDRESET:
+ break;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
HRESULT _configure_devices(LPDIRECTINPUT8W iface,
LPDICONFIGUREDEVICESCALLBACK lpdiCallback,
LPDICONFIGUREDEVICESPARAMSW lpdiCDParams,
@@ -34,10 +146,13 @@ HRESULT _configure_devices(LPDIRECTINPUT8W iface,
LPVOID pvRefData,
HINSTANCE hinstance)
{
+ ConfigureDevicesData data = { iface, lpdiCDParams, dwFlags };
+
InitCommonControls();
g_hinstance = hinstance;
- DialogBoxParamW(g_hinstance, (LPCWSTR) MAKEINTRESOURCE(IDD_CONFIGUREDEVICES), lpdiCDParams->hwnd, 0, 0);
+
+ DialogBoxParamW(g_hinstance, (LPCWSTR) MAKEINTRESOURCE(IDD_CONFIGUREDEVICES), lpdiCDParams->hwnd, ConfigureDevicesDlgProc, (LPARAM) &data);
return DI_OK;
}
--
1.7.0.4
More information about the wine-patches
mailing list