From a706f6ba78ce961bcfc0232e57524b5b57a3480f Mon Sep 17 00:00:00 2001 From: Thamatip Chitpong Date: Tue, 9 Apr 2024 22:33:32 +0700 Subject: [PATCH] [SHELL32] Fix separator not showing for CopyTo and MoveTo menu Fix wrong previous item index. --- dll/win32/shell32/CCopyMoveToMenu.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/dll/win32/shell32/CCopyMoveToMenu.cpp b/dll/win32/shell32/CCopyMoveToMenu.cpp index 859b05eb5b7..55a11c4fe19 100644 --- a/dll/win32/shell32/CCopyMoveToMenu.cpp +++ b/dll/win32/shell32/CCopyMoveToMenu.cpp @@ -257,6 +257,21 @@ HRESULT CCopyMoveToMenu::DoAction(LPCMINVOKECOMMANDINFO lpici) return hr; } +static BOOL +GetPreviousMenuItemInfo(HMENU hMenu, UINT iItem, LPMENUITEMINFOW lpmii) +{ + BOOL bSuccess = FALSE; + + while (iItem > 0) + { + bSuccess = GetMenuItemInfoW(hMenu, --iItem, TRUE, lpmii); + if (bSuccess || (!bSuccess && GetLastError() != ERROR_MENU_ITEM_NOT_FOUND)) + break; + } + + return bSuccess; +} + STDMETHODIMP CCopyToMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, @@ -279,7 +294,7 @@ CCopyToMenu::QueryContextMenu(HMENU hMenu, ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE; - if (GetMenuItemInfoW(hMenu, indexMenu - 1, TRUE, &mii) && + if (GetPreviousMenuItemInfo(hMenu, indexMenu, &mii) && mii.fType != MFT_SEPARATOR) { ZeroMemory(&mii, sizeof(mii)); @@ -338,7 +353,7 @@ CMoveToMenu::QueryContextMenu(HMENU hMenu, mii.fMask = MIIM_TYPE; mii.dwTypeData = szBuff; mii.cch = _countof(szBuff); - if (GetMenuItemInfoW(hMenu, indexMenu - 1, TRUE, &mii) && + if (GetPreviousMenuItemInfo(hMenu, indexMenu, &mii) && mii.fType != MFT_SEPARATOR && !(mii.fType == MFT_STRING && CStringW(szBuff) == strCopyTo)) {