From 97d7e1597a5d4eb90c2d99d1d228cb9322b6fa2e Mon Sep 17 00:00:00 2001 From: MamiyaOtaru Date: Sun, 5 Nov 2023 01:28:05 -0700 Subject: [PATCH 1/3] allow right clicking multiple files --- src/wfdir.c | 23 +++++++++++++++++++++++ src/wfdlgs.c | 3 +-- src/winfile.h | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/wfdir.c b/src/wfdir.c index e2670222..e43e09ac 100644 --- a/src/wfdir.c +++ b/src/wfdir.c @@ -886,6 +886,29 @@ DirWndProc( ActivateCommonContextMenu(hwnd, hwndLB, lParam); break; + case FS_RCLICKED: + { + LPXDTALINK lpxdta; + DWORD item = wParam; + INT iMac = (INT)SendMessage(hwndLB, LB_GETSELCOUNT, 0, 0L); + LPINT lpSelItems = (LPINT)LocalAlloc(LMEM_FIXED, sizeof(INT) * iMac); + iMac = (INT)SendMessage(hwndLB, + LB_GETSELITEMS, + (WPARAM)iMac, + (LPARAM)lpSelItems); + boolean clickedOnSelected = 0; + for (i = 0; i < iMac; i++) { + if (lpSelItems[i] == item) { + clickedOnSelected = 1; + } + } + if (!clickedOnSelected) { // clicked on something new, select it + SendMessage(hwndLB, LB_SETSEL, (WPARAM)FALSE, (LPARAM)-1); // deselect current item + SendMessage(hwndLB, LB_SETSEL, (WPARAM)TRUE, (LPARAM)item); // select clicked item + } + break; + } + case WM_VKEYTOITEM: switch (GET_WM_VKEYTOITEM_CODE(wParam, lParam)) { case VK_ESCAPE: diff --git a/src/wfdlgs.c b/src/wfdlgs.c index ba385699..89ac1212 100644 --- a/src/wfdlgs.c +++ b/src/wfdlgs.c @@ -886,8 +886,7 @@ ActivateCommonContextMenu(HWND hwnd, HWND hwndLB, LPARAM lParam) } else { - SendMessage(hwndLB, LB_SETSEL, (WPARAM)FALSE, (LPARAM)-1); - SendMessage(hwndLB, LB_SETSEL, (WPARAM)TRUE, (LPARAM)item); + SendMessage(hwnd, FS_RCLICKED, (WPARAM)item, (LPARAM)0); BOOL bDir = FALSE; SendMessage(hwnd, FS_GETSELECTION, 5, (LPARAM)&bDir); diff --git a/src/winfile.h b/src/winfile.h index b9b60d47..b791a9e2 100644 --- a/src/winfile.h +++ b/src/winfile.h @@ -807,6 +807,8 @@ BOOL RectTreeItem(HWND hwndLB, INT iItem, BOOL bFocusOn); #define FS_ENABLEFSC (WM_USER+0x121) #define FS_DISABLEFSC (WM_USER+0x122) +#define FS_RCLICKED (WM_USER+0x150) + #define ATTR_READWRITE 0x0000 #define ATTR_READONLY FILE_ATTRIBUTE_READONLY // == 0x0001 #define ATTR_HIDDEN FILE_ATTRIBUTE_HIDDEN // == 0x0002 From 919825e145dc09bf0a27d9100733ed0a2cf5b6a3 Mon Sep 17 00:00:00 2001 From: MamiyaOtaru Date: Sun, 5 Nov 2023 01:49:05 -0700 Subject: [PATCH 2/3] deallocate array --- src/Winfile.vcxproj.filters | 4 +++- src/wfdir.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Winfile.vcxproj.filters b/src/Winfile.vcxproj.filters index 58538775..defa61fa 100644 --- a/src/Winfile.vcxproj.filters +++ b/src/Winfile.vcxproj.filters @@ -37,6 +37,7 @@ + @@ -62,6 +63,7 @@ + @@ -145,4 +147,4 @@ {a74d83f3-58ec-46d3-bb3d-fadca6ac5743} - + \ No newline at end of file diff --git a/src/wfdir.c b/src/wfdir.c index e43e09ac..39719283 100644 --- a/src/wfdir.c +++ b/src/wfdir.c @@ -888,7 +888,6 @@ DirWndProc( case FS_RCLICKED: { - LPXDTALINK lpxdta; DWORD item = wParam; INT iMac = (INT)SendMessage(hwndLB, LB_GETSELCOUNT, 0, 0L); LPINT lpSelItems = (LPINT)LocalAlloc(LMEM_FIXED, sizeof(INT) * iMac); @@ -906,6 +905,7 @@ DirWndProc( SendMessage(hwndLB, LB_SETSEL, (WPARAM)FALSE, (LPARAM)-1); // deselect current item SendMessage(hwndLB, LB_SETSEL, (WPARAM)TRUE, (LPARAM)item); // select clicked item } + LocalFree((HLOCAL)lpSelItems); break; } From 82cded7d6af01d656683ac8bf4226eadc38cf357 Mon Sep 17 00:00:00 2001 From: MamiyaOtaru Date: Wed, 8 Nov 2023 11:09:55 -0700 Subject: [PATCH 3/3] moved multiselect rclick logic logic to (optionally) not deselect current selection in directory pane on right click moved to wfdlgs. Avoids the creation of a new message type to be sent to wdir --- src/wfdir.c | 23 ----------------------- src/wfdlgs.c | 19 ++++++++++++++++++- src/winfile.h | 2 -- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/wfdir.c b/src/wfdir.c index 39719283..e2670222 100644 --- a/src/wfdir.c +++ b/src/wfdir.c @@ -886,29 +886,6 @@ DirWndProc( ActivateCommonContextMenu(hwnd, hwndLB, lParam); break; - case FS_RCLICKED: - { - DWORD item = wParam; - INT iMac = (INT)SendMessage(hwndLB, LB_GETSELCOUNT, 0, 0L); - LPINT lpSelItems = (LPINT)LocalAlloc(LMEM_FIXED, sizeof(INT) * iMac); - iMac = (INT)SendMessage(hwndLB, - LB_GETSELITEMS, - (WPARAM)iMac, - (LPARAM)lpSelItems); - boolean clickedOnSelected = 0; - for (i = 0; i < iMac; i++) { - if (lpSelItems[i] == item) { - clickedOnSelected = 1; - } - } - if (!clickedOnSelected) { // clicked on something new, select it - SendMessage(hwndLB, LB_SETSEL, (WPARAM)FALSE, (LPARAM)-1); // deselect current item - SendMessage(hwndLB, LB_SETSEL, (WPARAM)TRUE, (LPARAM)item); // select clicked item - } - LocalFree((HLOCAL)lpSelItems); - break; - } - case WM_VKEYTOITEM: switch (GET_WM_VKEYTOITEM_CODE(wParam, lParam)) { case VK_ESCAPE: diff --git a/src/wfdlgs.c b/src/wfdlgs.c index 89ac1212..c897a50a 100644 --- a/src/wfdlgs.c +++ b/src/wfdlgs.c @@ -886,7 +886,24 @@ ActivateCommonContextMenu(HWND hwnd, HWND hwndLB, LPARAM lParam) } else { - SendMessage(hwnd, FS_RCLICKED, (WPARAM)item, (LPARAM)0); + // directory. Allow for multiselection + INT iMac = (INT)SendMessage(hwndLB, LB_GETSELCOUNT, 0, 0L); + LPINT lpSelItems = (LPINT)LocalAlloc(LMEM_FIXED, sizeof(INT) * iMac); + iMac = (INT)SendMessage(hwndLB, + LB_GETSELITEMS, + (WPARAM)iMac, + (LPARAM)lpSelItems); + boolean clickedOnSelected = 0; + for (int i = 0; i < iMac; i++) { + if (lpSelItems[i] == item) { + clickedOnSelected = 1; + } + } + if (!clickedOnSelected) { // clicked on something new, select it + SendMessage(hwndLB, LB_SETSEL, (WPARAM)FALSE, (LPARAM)-1); + SendMessage(hwndLB, LB_SETSEL, (WPARAM)TRUE, (LPARAM)item); + } + LocalFree((HLOCAL)lpSelItems); BOOL bDir = FALSE; SendMessage(hwnd, FS_GETSELECTION, 5, (LPARAM)&bDir); diff --git a/src/winfile.h b/src/winfile.h index b791a9e2..b9b60d47 100644 --- a/src/winfile.h +++ b/src/winfile.h @@ -807,8 +807,6 @@ BOOL RectTreeItem(HWND hwndLB, INT iItem, BOOL bFocusOn); #define FS_ENABLEFSC (WM_USER+0x121) #define FS_DISABLEFSC (WM_USER+0x122) -#define FS_RCLICKED (WM_USER+0x150) - #define ATTR_READWRITE 0x0000 #define ATTR_READONLY FILE_ATTRIBUTE_READONLY // == 0x0001 #define ATTR_HIDDEN FILE_ATTRIBUTE_HIDDEN // == 0x0002