[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