Lucas Fialho Zawacki : dinput: Working CANCEL and RESET buttons in ConfigureDevices dialog.

Alexandre Julliard julliard at winehq.org
Tue Sep 6 11:35:51 CDT 2011


Module: wine
Branch: master
Commit: b0dfa932b6b36e6a2beed33f6fd428ccc75c92cb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b0dfa932b6b36e6a2beed33f6fd428ccc75c92cb

Author: Lucas Fialho Zawacki <lfzawacki at gmail.com>
Date:   Thu Sep  1 15:34:40 2011 -0300

dinput: Working CANCEL and RESET buttons in ConfigureDevices dialog.

---

 dlls/dinput/config.c |   41 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/dlls/dinput/config.c b/dlls/dinput/config.c
index b2aa3ab..1c6da6c 100644
--- a/dlls/dinput/config.c
+++ b/dlls/dinput/config.c
@@ -40,6 +40,7 @@ typedef struct {
 typedef struct {
     IDirectInput8W *lpDI;
     LPDIACTIONFORMATW lpdiaf;
+    LPDIACTIONFORMATW original_lpdiaf;
     DIDevicesData devices_data;
     int display_only;
 } ConfigureDevicesData;
@@ -201,16 +202,21 @@ static void init_devices(HWND dialog, IDirectInput8W *lpDI, DIDevicesData *data,
         SendDlgItemMessageW(dialog, IDC_CONTROLLERCOMBO, CB_ADDSTRING, 0, (LPARAM) data->devices[i].ddi.tszProductName );
 }
 
-static void destroy_devices(HWND dialog)
+static void destroy_data(HWND dialog)
 {
     int i;
     ConfigureDevicesData *data = (ConfigureDevicesData*) GetWindowLongPtrW(dialog, DWLP_USER);
     DIDevicesData *devices_data = &data->devices_data;
 
+    /* Free the devices */
     for (i=0; i < devices_data->ndevices; i++)
         IDirectInputDevice8_Release(devices_data->devices[i].lpdid);
 
     HeapFree(GetProcessHeap(), 0, devices_data->devices);
+
+    /* Free the backup LPDIACTIONFORMATW  */
+    HeapFree(GetProcessHeap(), 0, data->original_lpdiaf->rgoAction);
+    HeapFree(GetProcessHeap(), 0, data->original_lpdiaf);
 }
 
 static void fill_device_object_list(HWND dialog)
@@ -323,6 +329,26 @@ static void assign_action(HWND dialog)
     lv_set_action(dialog, obj, action, lpdiaf);
 }
 
+static void copy_actions(LPDIACTIONFORMATW to, LPDIACTIONFORMATW from)
+{
+    int i;
+    for (i=0; i < from->dwNumActions; i++)
+    {
+        to->rgoAction[i].guidInstance = from->rgoAction[i].guidInstance;
+        to->rgoAction[i].dwObjID = from->rgoAction[i].dwObjID;
+        to->rgoAction[i].dwHow = from->rgoAction[i].dwHow;
+        to->rgoAction[i].lptszActionName = from->rgoAction[i].lptszActionName;
+    }
+}
+
+static void reset_actions(HWND dialog)
+{
+    ConfigureDevicesData *data = (ConfigureDevicesData*) GetWindowLongPtrW(dialog, DWLP_USER);
+    LPDIACTIONFORMATW to = data->lpdiaf, from = data->original_lpdiaf;
+
+    copy_actions(to, from);
+}
+
 static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     switch(uMsg)
@@ -339,6 +365,12 @@ static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM w
 
             init_listview_columns(dialog);
 
+            /* Create a backup action format for CANCEL and RESET operations */
+            data->original_lpdiaf = HeapAlloc(GetProcessHeap(), 0, sizeof(LPDIACTIONFORMATW));
+            data->original_lpdiaf->dwNumActions = data->lpdiaf->dwNumActions;
+            data->original_lpdiaf->rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*data->lpdiaf->dwNumActions);
+            copy_actions(data->original_lpdiaf, data->lpdiaf);
+
             break;
         }
 
@@ -383,15 +415,18 @@ static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM w
 
                 case IDOK:
                     EndDialog(dialog, 0);
-                    destroy_devices(dialog);
+                    destroy_data(dialog);
                     break;
 
                 case IDCANCEL:
+                    reset_actions(dialog);
                     EndDialog(dialog, 0);
-                    destroy_devices(dialog);
+                    destroy_data(dialog);
                     break;
 
                 case IDC_RESET:
+                    reset_actions(dialog);
+                    fill_device_object_list(dialog);
                     break;
             }
         break;




More information about the wine-cvs mailing list