ReactOS 0.4.16-dev-1028-g8602629
CFontMenu.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: CFontMenu implementation
5 * COPYRIGHT: Copyright 2019-2021 Mark Jansen <mark.jansen@reactos.org>
6 */
7
8#include "precomp.h"
9
11
12const char* DFM_TO_STR(UINT uMsg)
13{
14 switch(uMsg)
15 {
16 case DFM_MERGECONTEXTMENU: return "DFM_MERGECONTEXTMENU";
17 case DFM_INVOKECOMMAND: return "DFM_INVOKECOMMAND";
18 case DFM_MODIFYQCMFLAGS: return "DFM_MODIFYQCMFLAGS";
19 case DFM_MERGECONTEXTMENU_TOP: return "DFM_MERGECONTEXTMENU_TOP";
20 case DFM_MERGECONTEXTMENU_BOTTOM: return "DFM_MERGECONTEXTMENU_BOTTOM";
21 case DFM_GETHELPTEXTW: return "DFM_GETHELPTEXTW";
22 case DFM_GETVERBW: return "DFM_GETVERBW";
23 case DFM_GETVERBA: return "DFM_GETVERBA";
24 case DFM_WM_INITMENUPOPUP: return "DFM_WM_INITMENUPOPUP";
25 case DFM_INVOKECOMMANDEX: return "DFM_INVOKECOMMANDEX";
26 case DFM_GETDEFSTATICID: return "DFM_GETDEFSTATICID";
27 case 3: return "MENU_BEGIN";
28 case 4: return "MENU_END";
29 default: return "";
30 }
31}
32
33static void RunFontViewer(HWND hwnd, const FontPidlEntry* fontEntry)
34{
35 WCHAR FontViewerPath[MAX_PATH] = L"%SystemRoot%\\System32\\fontview.exe";
36 WCHAR FontPathArg[MAX_PATH + 3];
37
38 CStringW Path = g_FontCache->Filename(g_FontCache->Find(fontEntry), true);
39 if (!Path.IsEmpty())
40 {
41 // '/d' disables the install button
42 StringCchPrintfW(FontPathArg, _countof(FontPathArg), L"/d %s", Path.GetString());
43 PathQuoteSpacesW(FontPathArg + 3);
44
45 SHELLEXECUTEINFOW si = { sizeof(si) };
47 si.hwnd = hwnd;
48 si.lpFile = FontViewerPath;
49 si.lpParameters = FontPathArg;
51 ShellExecuteExW(&si);
52 }
53}
54
57{
58 TRACE("FontFolderMenuCallback(%u {%s})\n", uMsg, DFM_TO_STR(uMsg));
59 switch (uMsg)
60 {
62 {
63 QCMINFO *pqcminfo = (QCMINFO *)lParam;
64
66 MENUITEMINFOW cmi = { sizeof(cmi) };
68 cmi.fType = MFT_STRING;
69 cmi.fState = MFS_DEFAULT;
70 cmi.wID = pqcminfo->idCmdFirst++;
71 cmi.dwTypeData = (LPWSTR)menuText.GetString();
72 InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu, TRUE, &cmi);
73
74 return S_OK;
75 }
77 // Preview is the only item we handle
78 if (wParam == 0)
79 {
80 CDataObjectHIDA cida(pdtobj);
81
82 if (FAILED_UNEXPECTEDLY(cida.hr()))
83 return cida.hr();
84
85 for (UINT n = 0; n < cida->cidl; ++n)
86 {
87 const FontPidlEntry* fontEntry = _FontFromIL(HIDA_GetPIDLItem(cida, n));
88 RunFontViewer(hwnd, fontEntry);
89 }
90 return S_OK;
91 }
92 else if (wParam == DFM_CMD_PROPERTIES)
93 {
94 TRACE("Default properties handling!\n");
95 return S_FALSE;
96 }
97 else
98 {
99 ERR("Unhandled DFM_INVOKECOMMAND(wParam=0x%x)\n", wParam);
100 }
101 return S_FALSE;
102
104 return E_NOTIMPL;
105 case DFM_GETDEFSTATICID: // Required for Windows 7 to pick a default
106 return S_FALSE;
107 }
108 return E_NOTIMPL;
109}
110
112 IShellFolder *psf, REFIID riid, LPVOID* ppvOut)
113{
114 if (cidl > 0)
115 {
116 HKEY keys[1] = {0};
117 int nkeys = 0;
119
120 // Use the default context menu handler, but augment it from the callbacks
121 HRESULT hr = CDefFolderMenu_Create2(NULL, hwnd, cidl, apidl, psf, FontFolderMenuCallback, nkeys, keys, &spMenu);
122
124 return hr;
125
126 // See if the requested interface (e.g. IContextMenu3) is also available
127 return spMenu->QueryInterface(riid, ppvOut);
128 }
129
130 // We can't create a background menu
131 return E_FAIL;
132}
HRESULT WINAPI CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeyClsKeys, IContextMenu **ppcm)
CFontCache * g_FontCache
Definition: CFontCache.cpp:12
static HRESULT CALLBACK FontFolderMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CFontMenu.cpp:55
HRESULT _CFontMenu_CreateInstance(HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, REFIID riid, LPVOID *ppvOut)
Definition: CFontMenu.cpp:111
const char * DFM_TO_STR(UINT uMsg)
Definition: CFontMenu.cpp:12
static void RunFontViewer(HWND hwnd, const FontPidlEntry *fontEntry)
Definition: CFontMenu.cpp:33
PRTL_UNICODE_STRING_BUFFER Path
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ERR(fmt,...)
Definition: precomp.h:57
PXSTR GetString() noexcept
Definition: atlsimpstr.h:367
CStringW Filename(CFontInfo *info, bool alwaysFullPath=false)
Definition: CFontCache.cpp:164
CFontInfo * Find(const FontPidlEntry *fontEntry)
Definition: CFontCache.cpp:145
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 TRUE
Definition: types.h:120
#define IDS_FONT_PREVIEW
Definition: resource.h:13
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_INVOKECOMMANDEX
Definition: precomp.h:46
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
VOID WINAPI PathQuoteSpacesW(LPWSTR lpszPath)
Definition: path.c:984
const FontPidlEntry * _FontFromIL(LPCITEMIDLIST pidl)
Definition: fontpidl.cpp:31
GLdouble n
Definition: glext.h:7729
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
#define REFIID
Definition: guiddef.h:118
#define SEE_MASK_DOENVSUBST
Definition: shellapi.h:35
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:648
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2452
HRESULT hr
Definition: shlfolder.c:183
#define DFM_GETVERBW
Definition: shlobj.h:2610
#define DFM_WM_INITMENUPOPUP
Definition: shlobj.h:2605
#define DFM_GETVERBA
Definition: shlobj.h:2611
#define DFM_MERGECONTEXTMENU_BOTTOM
Definition: shlobj.h:2612
#define DFM_GETHELPTEXTW
Definition: shlobj.h:2608
#define DFM_MERGECONTEXTMENU_TOP
Definition: shlobj.h:2607
#define DFM_MODIFYQCMFLAGS
Definition: shlobj.h:2613
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2620
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
HMENU hmenu
Definition: shlobj.h:1398
UINT idCmdFirst
Definition: shlobj.h:1400
UINT indexMenu
Definition: shlobj.h:1399
LPCWSTR lpParameters
Definition: shellapi.h:334
LPWSTR dwTypeData
Definition: winuser.h:3280
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define S_FALSE
Definition: winerror.h:2357
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MIIM_STRING
Definition: winuser.h:738
#define MIIM_ID
Definition: winuser.h:733
#define MIIM_STATE
Definition: winuser.h:732
#define MFS_DEFAULT
Definition: winuser.h:759
#define MFT_STRING
Definition: winuser.h:757
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184