https://git.reactos.org/?p=reactos.git;a=commitdiff;h=163f3407c8fa93ce06773fdf9fc53064506bd05e

commit 163f3407c8fa93ce06773fdf9fc53064506bd05e
Author:     Whindmar Saksit <whinds...@proton.me>
AuthorDate: Sat Aug 31 18:30:45 2024 +0200
Commit:     GitHub <nore...@github.com>
CommitDate: Sat Aug 31 18:30:45 2024 +0200

    [RAPPS] Show listview context menu when the keyboard menu button/Shift+F10 
is pressed (#5620)
---
 base/applications/rapps/appview.cpp    | 33 ++++++++++++++++++++++++---------
 base/applications/rapps/include/misc.h |  2 +-
 base/applications/rapps/misc.cpp       |  9 ++++++---
 3 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/base/applications/rapps/appview.cpp 
b/base/applications/rapps/appview.cpp
index e2af2ab6c5c..a173d9530ac 100644
--- a/base/applications/rapps/appview.cpp
+++ b/base/applications/rapps/appview.cpp
@@ -1569,15 +1569,6 @@ CApplicationView::ProcessWindowMessage(
                         }
                     }
                     break;
-
-                    case NM_RCLICK:
-                    {
-                        if (((LPNMLISTVIEW)lParam)->iItem != -1)
-                        {
-                            ShowPopupMenuEx(m_hWnd, m_hWnd, 0, ID_INSTALL);
-                        }
-                    }
-                    break;
                 }
             }
             else if (pNotifyHeader->hwndFrom == m_Toolbar->GetWindow())
@@ -1613,6 +1604,30 @@ CApplicationView::ProcessWindowMessage(
             OnCommand(wParam, lParam);
         }
         break;
+
+        case WM_CONTEXTMENU:
+        {
+            bool kbd = -1 == (int)(INT_PTR)lParam;
+            if ((HWND)wParam == m_ListView->m_hWnd)
+            {
+                int item = m_ListView->GetNextItem(-1, LVNI_FOCUSED | 
LVNI_SELECTED);
+                if (item != -1)
+                {
+                    POINT *ppt = NULL, pt;
+                    if (kbd)
+                    {
+                        RECT r;
+                        ListView_GetItemRect((HWND)wParam, item, &r, 
LVIR_LABEL);
+                        pt.x = r.left + (r.right - r.left) / 2;
+                        pt.y = r.top + (r.bottom - r.top) / 2;
+                        ::ClientToScreen((HWND)wParam, ppt = &pt);
+                    }
+                    ShowPopupMenuEx(m_hWnd, m_hWnd, 0, ID_INSTALL, ppt);
+                    return TRUE;
+                }
+            }
+        }
+        break;
     }
     return FALSE;
 }
diff --git a/base/applications/rapps/include/misc.h 
b/base/applications/rapps/include/misc.h
index b43585d748a..91ede797f08 100644
--- a/base/applications/rapps/include/misc.h
+++ b/base/applications/rapps/include/misc.h
@@ -29,7 +29,7 @@ ErrorFromHResult(HRESULT hr)
 VOID
 CopyTextToClipboard(LPCWSTR lpszText);
 VOID
-ShowPopupMenuEx(HWND hwnd, HWND hwndOwner, UINT MenuID, UINT DefaultItem);
+ShowPopupMenuEx(HWND hwnd, HWND hwndOwner, UINT MenuID, UINT DefaultItem, 
POINT *Point = NULL);
 BOOL
 StartProcess(const CStringW &Path, BOOL Wait);
 BOOL
diff --git a/base/applications/rapps/misc.cpp b/base/applications/rapps/misc.cpp
index f2b15d5c645..400f0b588e6 100644
--- a/base/applications/rapps/misc.cpp
+++ b/base/applications/rapps/misc.cpp
@@ -40,7 +40,7 @@ CopyTextToClipboard(LPCWSTR lpszText)
 }
 
 VOID
-ShowPopupMenuEx(HWND hwnd, HWND hwndOwner, UINT MenuID, UINT DefaultItem)
+ShowPopupMenuEx(HWND hwnd, HWND hwndOwner, UINT MenuID, UINT DefaultItem, 
POINT *Point)
 {
     HMENU hMenu = NULL;
     HMENU hPopupMenu;
@@ -68,10 +68,13 @@ ShowPopupMenuEx(HWND hwnd, HWND hwndOwner, UINT MenuID, 
UINT DefaultItem)
         SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE);
     }
 
-    GetCursorPos(&pt);
+    if (!Point)
+    {
+        GetCursorPos(Point = &pt);
+    }
 
     SetForegroundWindow(hwnd);
-    TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hwndOwner, NULL);
+    TrackPopupMenu(hPopupMenu, 0, Point->x, Point->y, 0, hwndOwner, NULL);
 
     if (hMenu)
     {

Reply via email to