[5/8] dinput: Added display of available actions to ConfigureDevices dialog

Lucas Fialho Zawacki lfzawacki at gmail.com
Wed Aug 3 18:51:05 CDT 2011


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

diff --git a/dlls/dinput/configure_devices.c b/dlls/dinput/configure_devices.c
index 312eda1..1a05fa3 100644
--- a/dlls/dinput/configure_devices.c
+++ b/dlls/dinput/configure_devices.c
@@ -111,6 +111,11 @@ static void init_listview_columns(HWND dialog)
     SendDlgItemMessageW(dialog, IDC_DEVICEOBJECTSLIST, LVM_INSERTCOLUMNW, 1, (LPARAM) &listColumn);
 }
 
+static int lv_get_cur_item(HWND dialog)
+{
+    return SendDlgItemMessageW(dialog, IDC_DEVICEOBJECTSLIST, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
+}
+
 static void lv_set_item_text(HWND dialog, int item, int subItem, WCHAR *text)
 {
     LVITEMW lvItem;
@@ -208,6 +213,35 @@ static void destroy_devices(DIDevicesData *data)
     HeapFree(GetProcessHeap(), 0, data->devices);
 }
 
+static void show_suitable_actions(HWND dialog, DeviceData* device, LPDIACTIONFORMATW lpdiaf)
+{
+    int i, added = 0;
+    int obj = lv_get_cur_item(dialog);
+
+    if (obj < 0) return;
+
+    SendDlgItemMessageW(dialog, IDC_ACTIONLIST, LB_RESETCONTENT, 0, 0);
+
+    for (i=0; i < lpdiaf->dwNumActions; i++)
+    {
+        /* Skip keyboard actions for non keyboards */
+        if (GET_DIDEVICE_TYPE(device->ddi.dwDevType) != DI8DEVTYPE_KEYBOARD &&
+            (lpdiaf->rgoAction[i].dwSemantic & DIKEYBOARD_MASK) == DIKEYBOARD_MASK) continue;
+
+        /* Skip mouse actions for non mouses */
+        if (GET_DIDEVICE_TYPE(device->ddi.dwDevType) != DI8DEVTYPE_MOUSE &&
+            (lpdiaf->rgoAction[i].dwSemantic & DIMOUSE_MASK) == DIMOUSE_MASK) continue;
+
+        /* Add action string and index in the action format to the list entry */
+        if (DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwSemantic) & DIDFT_GETTYPE(device->ddo[obj].dwType))
+        {
+            SendDlgItemMessageW(dialog, IDC_ACTIONLIST, LB_ADDSTRING, 0, (LPARAM)lpdiaf->rgoAction[i].lptszActionName);
+            SendDlgItemMessageW(dialog, IDC_ACTIONLIST, LB_SETITEMDATA, added, (LPARAM) i);
+            added++;
+        }
+    }
+}
+
 static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     static LPDIACTIONFORMATW lpdiaf;
@@ -226,6 +260,18 @@ static INT_PTR CALLBACK ConfigureDevicesDlgProc(HWND dialog, UINT uMsg, WPARAM w
 
             break;
 
+        case WM_NOTIFY:
+
+            switch (((LPNMHDR)lParam)->code)
+            {
+                case LVN_ITEMCHANGED:
+                    show_suitable_actions(dialog, get_cur_device(dialog, &devices_data), lpdiaf);
+                    break;
+
+            }
+            break;
+
+
         case WM_COMMAND:
 
             switch( LOWORD( wParam ) )
-- 
1.7.0.4



More information about the wine-patches mailing list