Skip to content

Commit 9e5774e

Browse files
authored
[SHELL32][SDK] Implement CDefFolderMenu_MergeMenu (reactos#8875)
Implementing missing functions... JIRA issue: CORE-19278 - Add _SHMergePopupMenus and SHLoadPopupMenu helper functions. - Implement CDefFolderMenu_MergeMenu function in utils.cpp. - Add function prototype into <undocshell.h>.
1 parent eb9a73c commit 9e5774e

3 files changed

Lines changed: 93 additions & 13 deletions

File tree

dll/win32/shell32/stubs.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -133,19 +133,6 @@ SHGetSetFolderCustomSettingsA(LPSHFOLDERCUSTOMSETTINGSA pfcs,
133133
return E_FAIL;
134134
}
135135

136-
/*
137-
* Unimplemented
138-
*/
139-
EXTERN_C VOID
140-
WINAPI
141-
CDefFolderMenu_MergeMenu(HINSTANCE hInstance,
142-
UINT uMainMerge,
143-
UINT uPopupMerge,
144-
LPQCMINFO lpQcmInfo)
145-
{
146-
FIXME("CDefFolderMenu_MergeMenu() stub\n");
147-
}
148-
149136
/*
150137
* Unimplemented
151138
*/

dll/win32/shell32/utils.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,88 @@ static PCWSTR StrEndNW(_In_ PCWSTR psz, _In_ INT_PTR cch)
3232
return pch;
3333
}
3434

35+
static INT _SHMergePopupMenus(HMENU hMenu, HMENU hPopupMenu, UINT uIDAdjust, UINT uIDAdjustMax)
36+
{
37+
INT maxID = uIDAdjust;
38+
const INT itemCount = GetMenuItemCount(hPopupMenu);
39+
if (itemCount == -1)
40+
return maxID;
41+
42+
MENUITEMINFOW mii = { sizeof(mii), MIIM_ID | MIIM_SUBMENU };
43+
for (INT i = itemCount - 1; i >= 0; --i)
44+
{
45+
if (!GetMenuItemInfoW(hPopupMenu, i, TRUE, &mii))
46+
continue;
47+
48+
HMENU hTargetSubMenu = SHGetMenuFromID(hMenu, mii.wID);
49+
if (!hTargetSubMenu)
50+
continue;
51+
52+
INT currentMax = Shell_MergeMenus(hTargetSubMenu, mii.hSubMenu, 0,
53+
uIDAdjust, uIDAdjustMax,
54+
MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS);
55+
maxID = max(maxID, currentMax);
56+
}
57+
58+
return maxID;
59+
}
60+
61+
static HMENU SHLoadPopupMenu(HINSTANCE hInstance, UINT uMenuId)
62+
{
63+
HMENU hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(uMenuId));
64+
if (!hMenu)
65+
return NULL;
66+
HMENU hSubMenu = GetSubMenu(hMenu, 0);
67+
RemoveMenu(hMenu, 0, MF_BYPOSITION);
68+
DestroyMenu(hMenu);
69+
return hSubMenu;
70+
}
71+
72+
/*************************************************************************
73+
* CDefFolderMenu_MergeMenu [SHELL32.702]
74+
*/
75+
EXTERN_C
76+
VOID WINAPI
77+
CDefFolderMenu_MergeMenu(
78+
_In_ HINSTANCE hInstance,
79+
_In_ UINT uMainMerge,
80+
_In_ UINT uPopupMerge,
81+
_Inout_ LPQCMINFO lpQcmInfo)
82+
{
83+
UINT idCmdFirst = lpQcmInfo->idCmdFirst;
84+
HMENU hPopupMenu;
85+
86+
if (uMainMerge)
87+
{
88+
hPopupMenu = SHLoadPopupMenu(hInstance, uMainMerge);
89+
if (hPopupMenu)
90+
{
91+
enum { uFlags = MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS | MM_DONTREMOVESEPS };
92+
idCmdFirst = Shell_MergeMenus(lpQcmInfo->hmenu,
93+
hPopupMenu,
94+
lpQcmInfo->indexMenu,
95+
lpQcmInfo->idCmdFirst,
96+
lpQcmInfo->idCmdLast,
97+
uFlags);
98+
DestroyMenu(hPopupMenu);
99+
}
100+
}
101+
102+
if (uPopupMerge)
103+
{
104+
hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(uPopupMerge));
105+
if (hPopupMenu)
106+
{
107+
UINT id = _SHMergePopupMenus(lpQcmInfo->hmenu, hPopupMenu,
108+
lpQcmInfo->idCmdFirst, lpQcmInfo->idCmdLast);
109+
idCmdFirst = max(idCmdFirst, id);
110+
DestroyMenu(hPopupMenu);
111+
}
112+
}
113+
114+
lpQcmInfo->idCmdFirst = idCmdFirst;
115+
}
116+
35117
/*************************************************************************
36118
* StrRStrA [SHELL32.389]
37119
*/

sdk/include/reactos/undocshell.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,17 @@ BOOL WINAPI IContextMenu_Invoke(
138138
BOOL WINAPI StrRetToStrNA(LPSTR,DWORD,LPSTRRET,const ITEMIDLIST*);
139139
BOOL WINAPI StrRetToStrNW(LPWSTR,DWORD,LPSTRRET,const ITEMIDLIST*);
140140

141+
/****************************************************************************
142+
* Misc.
143+
*/
144+
145+
VOID WINAPI
146+
CDefFolderMenu_MergeMenu(
147+
_In_ HINSTANCE hInstance,
148+
_In_ UINT uMainMerge,
149+
_In_ UINT uPopupMerge,
150+
_Inout_ LPQCMINFO lpQcmInfo);
151+
141152
/****************************************************************************
142153
* SHChangeNotifyRegister API
143154
*/

0 commit comments

Comments
 (0)