Lucas Fialho Zawacki : dinput: Added possibility to change the action mapping in the ConfigureDevices dialog .
Alexandre Julliard
julliard at winehq.org
Tue Sep 6 11:35:51 CDT 2011
Module: wine
Branch: master
Commit: 67682c244c9e105b0abed61573f75892f4770a6e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=67682c244c9e105b0abed61573f75892f4770a6e
Author: Lucas Fialho Zawacki <lfzawacki at gmail.com>
Date: Thu Sep 1 15:34:39 2011 -0300
dinput: Added possibility to change the action mapping in the ConfigureDevices dialog.
---
dlls/dinput/config.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/dlls/dinput/config.c b/dlls/dinput/config.c
index d3c604a..b2aa3ab 100644
--- a/dlls/dinput/config.c
+++ b/dlls/dinput/config.c
@@ -41,6 +41,7 @@ typedef struct {
IDirectInput8W *lpDI;
LPDIACTIONFORMATW lpdiaf;
DIDevicesData devices_data;
+ int display_only;
} ConfigureDevicesData;
/*
@@ -115,6 +116,21 @@ 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;
+
+ if (index < 0) return -1;
+
+ item.mask = LVIF_PARAM;
+ item.iItem = index;
+ item.iSubItem = 0;
+
+ SendDlgItemMessageW(dialog, IDC_DEVICEOBJECTSLIST, LVM_GETITEMW , 0, (LPARAM)&item);
+
+ return item.lParam;
+}
+
static void lv_set_action(HWND dialog, int item, int action, LPDIACTIONFORMATW lpdiaf)
{
static const WCHAR no_action[] = {'-','\0'};
@@ -161,6 +177,12 @@ static LPDIACTIONFORMATW get_cur_lpdiaf(HWND dialog)
return data->lpdiaf;
}
+static int dialog_display_only(HWND dialog)
+{
+ ConfigureDevicesData *data = (ConfigureDevicesData*) GetWindowLongPtrW(dialog, DWLP_USER);
+ return data->display_only;
+}
+
static void init_devices(HWND dialog, IDirectInput8W *lpDI, DIDevicesData *data, LPDIACTIONFORMATW lpdiaf)
{
int i;
@@ -261,6 +283,46 @@ static void show_suitable_actions(HWND dialog)
}
}
+static void assign_action(HWND dialog)
+{
+ DeviceData *device = get_cur_device(dialog);
+ LPDIACTIONFORMATW lpdiaf = get_cur_lpdiaf(dialog);
+ LVFINDINFOW lvFind;
+ 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);
+ int used_obj;
+
+ DIDEVICEOBJECTINSTANCEW ddo = device->ddo[obj];
+
+ if (old_action == action) return;
+
+ /* Clear old action */
+ if (old_action != -1)
+ {
+ lpdiaf->rgoAction[old_action].dwObjID = 0;
+ lpdiaf->rgoAction[old_action].guidInstance = GUID_NULL;
+ lpdiaf->rgoAction[old_action].dwHow = DIAH_UNMAPPED;
+ }
+
+ /* Find if action text is already set for other object and unset it */
+ lvFind.flags = LVFI_PARAM;
+ lvFind.lParam = action;
+
+ used_obj = SendDlgItemMessageW(dialog, IDC_DEVICEOBJECTSLIST, LVM_FINDITEMW, -1, (LPARAM) &lvFind);
+
+ lv_set_action(dialog, used_obj, -1, lpdiaf);
+
+ /* Set new action */
+ lpdiaf->rgoAction[action].dwObjID = ddo.dwType;
+ lpdiaf->rgoAction[action].guidInstance = device->ddi.guidInstance;
+ lpdiaf->rgoAction[action].dwHow = DIAH_USERCONFIG;
+
+ /* Set new action in the list */
+ lv_set_action(dialog, obj, action, lpdiaf);
+}
+
static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
@@ -296,6 +358,19 @@ 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 (dialog_display_only(dialog)) break;
+
+ assign_action(dialog);
+ break;
+ }
+ break;
+
case IDC_CONTROLLERCOMBO:
switch (HIWORD(wParam))
@@ -335,6 +410,7 @@ HRESULT _configure_devices(IDirectInput8W *iface,
ConfigureDevicesData data;
data.lpDI = iface;
data.lpdiaf = lpdiCDParams->lprgFormats;
+ data.display_only = !(dwFlags & DICD_EDIT);
InitCommonControls();
More information about the wine-cvs
mailing list