[6/8] dinput: Added possibility to change the action mapping in the ConfigureDevices dialog (try 2)

Lucas Fialho Zawacki lfzawacki at gmail.com
Thu Aug 4 12:22:51 CDT 2011


---
 dlls/dinput/config.c |   51 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/dlls/dinput/config.c b/dlls/dinput/config.c
index 939f9ec..fa2a260 100644
--- a/dlls/dinput/config.c
+++ b/dlls/dinput/config.c
@@ -116,6 +116,17 @@ static int lv_get_cur_item(HWND dialog)
     return SendDlgItemMessageW(dialog, IDC_DEVICEOBJECTSLIST, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
 }
 
+static int lv_get_item_data(HWND dialog, int index)
+{
+    LVITEMW item;
+    item.iItem = index;
+    item.iSubItem = 0;
+
+    SendDlgItemMessageW(dialog, IDC_DEVICEOBJECTSLIST, LVM_GETITEMW , 0, (LPARAM)&item);
+
+    return item.lParam;
+}
+
 static void lv_set_item_text(HWND dialog, int item, int subItem, WCHAR *text)
 {
     LVITEMW lvItem;
@@ -242,11 +253,35 @@ static void show_suitable_actions(HWND dialog, DeviceData* device, LPDIACTIONFOR
     }
 }
 
+static void assign_action(HWND dialog, DeviceData* device, LPDIACTIONFORMATW lpdiaf)
+{
+    int sel = SendDlgItemMessageW(dialog, IDC_ACTIONLIST, LB_GETCURSEL, 0, 0);
+    int action = SendDlgItemMessageW(dialog, IDC_ACTIONLIST, LB_GETITEMDATA, sel, 0);
+    int obj = lv_get_cur_item(dialog);
+    int old_action = lv_get_item_data(dialog, obj);
+
+    DIDEVICEOBJECTINSTANCEW ddo = device->ddo[obj];
+
+    /* Clear old action */
+    if (old_action != action)
+    {
+        lpdiaf->rgoAction[old_action].dwObjID = 0;
+        lpdiaf->rgoAction[old_action].guidInstance = GUID_NULL;
+        lpdiaf->rgoAction[old_action].dwHow = DIAH_UNMAPPED;
+    }
+
+    /* Set new action */
+    lpdiaf->rgoAction[action].dwObjID = ddo.dwType;
+    lpdiaf->rgoAction[action].guidInstance = device->ddi.guidInstance;
+    lpdiaf->rgoAction[action].dwHow = DIAH_USERCONFIG;
+}
+
 static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     static LPDIACTIONFORMATW lpdiaf;
     static DIDevicesData devices_data;
     static ConfigureDevicesData *conf_data;
+    static int display_only = 0;
 
     switch(uMsg)
     {
@@ -255,6 +290,8 @@ static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM w
             conf_data = (ConfigureDevicesData*) lParam;
             lpdiaf = conf_data->params->lprgFormats;
 
+            if (!(conf_data->flags & DICD_EDIT)) display_only = 1;
+
             init_listview_columns(dialog);
             init_devices(dialog, conf_data->lpDI, &devices_data, lpdiaf);
 
@@ -277,6 +314,20 @@ static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM w
             switch( LOWORD( wParam ) )
             {
 
+                case IDC_ACTIONLIST:
+
+                    switch (HIWORD(wParam))
+                    {
+                        case LBN_DBLCLK:
+                            /* Ignore this if app did not ask for editing */
+                            if (display_only) break;
+
+                            assign_action(dialog, get_cur_device(dialog, &devices_data), lpdiaf);
+                            fill_device_object_list(dialog, get_cur_device(dialog, &devices_data), lpdiaf);
+                            break;
+                    }
+                    break;
+
                 case IDC_CONTROLLERCOMBO:
 
                     switch (HIWORD(wParam))
-- 
1.7.0.4



More information about the wine-patches mailing list