Module: wine Branch: master Commit: b0dfa932b6b36e6a2beed33f6fd428ccc75c92cb URL: http://source.winehq.org/git/wine.git/?a=commit;h=b0dfa932b6b36e6a2beed33f6f...
Author: Lucas Fialho Zawacki lfzawacki@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;