[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