ReactOS 0.4.16-dev-2204-g370eb8c
CFontBackgroundMenu.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Font Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Fonts folder shell extension background menu
5 * COPYRIGHT: Copyright 2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "precomp.h"
9#include <shlwapi_undoc.h>
10
12
14{
15}
16
18{
19}
20
22{
23 m_pFontExt = pFontExt;
24 m_psf = pdcm->psf;
25 m_pmcb = pdcm->pcmcb;
26 m_hwnd = pdcm->hwnd;
27 return S_OK;
28}
29
30// IContextMenu
32{
33 TRACE("%d\n", idCmdFirst);
35 INT idCmd = idCmdFirst;
36 AppendMenuW(hMenu, MF_STRING, idCmd++, strProp);
37 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, idCmd - idCmdFirst);
38}
39
41{
42 INT idCmd = IS_INTRESOURCE(lpcmi->lpVerb) ? LOWORD(lpcmi->lpVerb) : -1;
43 TRACE("%d\n", idCmd);
44
45 if (idCmd == 0 || (idCmd == -1 && !lstrcmpiA(lpcmi->lpVerb, "properties")))
46 {
47 // Open "Fonts" properties
48 LPITEMIDLIST pidl = NULL;
50 if (FAILED_UNEXPECTEDLY(hr) || !pidl)
51 return E_FAIL;
52
53 SHELLEXECUTEINFOW sei = {
54 sizeof(sei), SEE_MASK_INVOKEIDLIST | SEE_MASK_ASYNCOK, NULL, L"properties",
55 NULL, NULL, NULL, SW_SHOWNORMAL, NULL, const_cast<LPITEMIDLIST>(pidl)
56 };
57 BOOL bOK = ShellExecuteExW(&sei);
58 if (pidl)
59 CoTaskMemFree(pidl);
60 return bOK ? S_OK : E_FAIL;
61 }
62
63 if (idCmd == FCIDM_SHVIEW_INSERT || (idCmd == -1 && !lstrcmpiA(lpcmi->lpVerb, "paste")))
64 {
65 CComPtr<IDataObject> pDataObj;
66 HRESULT hr = OleGetClipboard(&pDataObj);
67 if (FAILED_UNEXPECTEDLY(hr) || !CheckDataObject(pDataObj))
68 {
69 // Show error message
72 text.LoadStringW(IDS_INSTALL_FAILED);
74 return E_FAIL;
75 }
76
77 return SHSimulateDrop(m_pFontExt, pDataObj, 0, NULL, NULL);
78 }
79
80 return S_OK;
81}
82
84{
85 TRACE("%d\n", idCommand);
86 if (idCommand == 0)
87 {
88 lstrcpynA(lpszName, "properties", uMaxNameLen);
89 return S_OK;
90 }
91 return E_FAIL;
92}
93
94// IContextMenu2
96{
97 return HandleMenuMsg2(uMsg, wParam, lParam, NULL);
98}
99
100// IContextMenu3
102{
103 if (uMsg == WM_INITMENUPOPUP)
104 {
105 HMENU hMenu = (HMENU)wParam;
107 return S_OK;
108 }
109 return E_NOTIMPL;
110}
111
115 CFontExt* pFontExt,
116 HWND hwnd,
117 IShellFolder* psf,
118 IContextMenu** ppcm)
119{
120 DEFCONTEXTMENU dcm;
121 ZeroMemory(&dcm, sizeof(dcm));
122 dcm.hwnd = hwnd;
123 dcm.psf = psf;
124 return ShellObjectCreatorInit<CFontBackgroundMenu>(pFontExt, &dcm, IID_PPV_ARG(IContextMenu, ppcm));
125}
HRESULT APIENTRY CFontBackgroundMenu_Create(CFontExt *pFontExt, HWND hwnd, IShellFolder *psf, IContextMenu **ppcm)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define IDS_PROPERTIES
Definition: resource.h:108
#define STDMETHODIMP
Definition: basetyps.h:43
CComPtr< IContextMenuCB > m_pmcb
STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) override
CComPtr< IShellFolder > m_psf
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) override
STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override
HRESULT WINAPI Initialize(CFontExt *pFontExt, const DEFCONTEXTMENU *pdcm)
STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) override
STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define APIENTRY
Definition: api.h:79
#define IDS_INSTALL_FAILED
Definition: resource.h:9
#define IDS_REACTOS_FONTS_FOLDER
Definition: resource.h:7
UINT uFlags
Definition: api.c:59
#define lstrcpynA
Definition: compat.h:751
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4227
#define IS_INTRESOURCE(x)
Definition: loader.c:613
const WCHAR * text
Definition: package.c:1794
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
Definition: clipboard.c:2249
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3384
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
Definition: ordinal.c:1828
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:29
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL CheckDataObject(IDataObject *pDataObj)
Definition: fontext.cpp:308
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
#define S_OK
Definition: intsafe.h:52
#define ZeroMemory
Definition: minwinbase.h:31
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82
static char title[]
Definition: ps.c:92
#define SEE_MASK_ASYNCOK
Definition: shellapi.h:43
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2723
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_FONTS
Definition: shlobj.h:2198
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:875
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:873
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define TRACE(s)
Definition: solgame.cpp:4
IContextMenuCB * pcmcb
Definition: shlobj.h:2556
IShellFolder * psf
Definition: shlobj.h:2558
int32_t INT
Definition: typedefs.h:58
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#define SEVERITY_SUCCESS
Definition: winerror.h:177
_In_ DWORD _In_ int _In_ int _In_opt_ LPNLSVERSIONINFO _In_opt_ LPVOID lpReserved
Definition: winnls.h:1268
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MF_BYCOMMAND
Definition: winuser.h:202
#define MF_STRING
Definition: winuser.h:138
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_ICONERROR
Definition: winuser.h:798
#define WM_INITMENUPOPUP
Definition: winuser.h:1774
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define IID_PPV_ARG(Itype, ppType)
char * LPSTR
Definition: xmlstorage.h:182