[2/6] dinput: Added enumerated devices to ConfigureDevices dialog (try 3)

Lucas Fialho Zawacki lfzawacki at gmail.com
Thu Sep 1 13:34:36 CDT 2011


From: Lucas Fialho Zawacki <lfzawacki at gmail.com>

Changes since last version:

* Storing information in the dialog DWLP_USER member
* Made some COM cleanup
---
 dlls/dinput/config.c |  120 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 119 insertions(+), 1 deletions(-)

diff --git a/dlls/dinput/config.c b/dlls/dinput/config.c
index 63ac507..2f02f5a 100644
--- a/dlls/dinput/config.c
+++ b/dlls/dinput/config.c
@@ -25,6 +25,120 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);
 
+typedef struct {
+    int nobjects;
+    IDirectInputDevice8W *lpdid;
+    DIDEVICEINSTANCEW ddi;
+    DIDEVICEOBJECTINSTANCEW ddo[256];
+} DeviceData;
+
+typedef struct {
+    int ndevices;
+    DeviceData *devices;
+} DIDevicesData;
+
+typedef struct {
+    IDirectInput8W *lpDI;
+    LPDIACTIONFORMATW lpdiaf;
+    DIDevicesData devices_data;
+} ConfigureDevicesData;
+
+/*
+ * Enumeration callback functions
+ */
+static BOOL CALLBACK count_devices(LPCDIDEVICEINSTANCEW lpddi, IDirectInputDevice8W *lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef)
+{
+    DIDevicesData *data = (DIDevicesData*) pvRef;
+
+    data->ndevices++;
+    return DIENUM_CONTINUE;
+}
+
+static BOOL CALLBACK collect_devices(LPCDIDEVICEINSTANCEW lpddi, IDirectInputDevice8W *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, IDirectInput8W *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(HWND dialog)
+{
+    int i;
+    ConfigureDevicesData *data = (ConfigureDevicesData*) GetWindowLongPtrW(dialog, DWLP_USER);
+    DIDevicesData *devices_data = &data->devices_data;
+
+    for (i=0; i < devices_data->ndevices; i++)
+        IDirectInputDevice8_Release(devices_data->devices[i].lpdid);
+
+    HeapFree(GetProcessHeap(), 0, devices_data->devices);
+}
+
+static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    switch(uMsg)
+    {
+        case WM_INITDIALOG:
+        {
+            ConfigureDevicesData *data = (ConfigureDevicesData*) lParam;
+
+            /* Initialize action format and enumerate devices */
+            init_devices(dialog, data->lpDI, &data->devices_data, data->lpdiaf);
+
+            /* Store information in the window */
+            SetWindowLongPtrW(dialog, DWLP_USER, (LONG_PTR) data);
+
+            break;
+        }
+        case WM_COMMAND:
+
+            switch(LOWORD(wParam))
+            {
+                case IDOK:
+                    EndDialog(dialog, 0);
+                    destroy_devices(dialog);
+                    break;
+
+                case IDCANCEL:
+                    EndDialog(dialog, 0);
+                    destroy_devices(dialog);
+                    break;
+
+                case IDRESET:
+                    break;
+            }
+        break;
+    }
+
+    return FALSE;
+}
+
 HRESULT _configure_devices(IDirectInput8W *iface,
                            LPDICONFIGUREDEVICESCALLBACK lpdiCallback,
                            LPDICONFIGUREDEVICESPARAMSW lpdiCDParams,
@@ -32,9 +146,13 @@ HRESULT _configure_devices(IDirectInput8W *iface,
                            LPVOID pvRefData
 )
 {
+    ConfigureDevicesData data;
+    data.lpDI = iface;
+    data.lpdiaf = lpdiCDParams->lprgFormats;
+
     InitCommonControls();
 
-    DialogBoxParamW(GetModuleHandleA("dinput.dll"), (LPCWSTR) MAKEINTRESOURCE(IDD_CONFIGUREDEVICES), lpdiCDParams->hwnd, 0, 0);
+    DialogBoxParamW(GetModuleHandleA("dinput.dll"), (LPCWSTR) MAKEINTRESOURCE(IDD_CONFIGUREDEVICES), lpdiCDParams->hwnd, ConfigureDevicesDlgProc, (LPARAM) &data);
 
     return DI_OK;
 }
-- 
1.7.0.4



More information about the wine-patches mailing list