ReactOS 0.4.17-dev-243-g1369312
startmnusite.cpp
Go to the documentation of this file.
1/*
2 * ReactOS Explorer
3 *
4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include "precomp.h"
22#include <cfgmgr32.h>
23
25 public CComCoClass<CStartMenuSite>,
26 public CComObjectRootEx<CComMultiThreadModelNoCS>,
27 public IServiceProvider,
28 public ITrayPriv,
29 public IOleCommandTarget,
30 public IMenuPopup
31{
33
34public:
36 {
37 }
38
39 virtual ~CStartMenuSite() {}
40
41 // *** IServiceProvider methods ***
42
45 IN REFGUID guidService,
47 OUT PVOID *ppvObject) override
48 {
49 if (IsEqualGUID(guidService, SID_SMenuPopup))
50 {
51 return QueryInterface(riid, ppvObject);
52 }
53
54 return E_NOINTERFACE;
55 }
56
57 // *** IOleWindow methods ***
58
60 GetWindow(OUT HWND *phwnd) override
61 {
62 TRACE("ITrayPriv::GetWindow\n");
63
64 *phwnd = m_Tray->GetHWND();
65 if (*phwnd != NULL)
66 return S_OK;
67
68 return E_FAIL;
69 }
70
72 ContextSensitiveHelp(IN BOOL fEnterMode) override
73 {
74 TRACE("ITrayPriv::ContextSensitiveHelp\n");
75 return E_NOTIMPL;
76 }
77
80 IN IShellFolder *pShellFolder,
81 IN LPCITEMIDLIST pidl) override
82 {
84
85 TRACE("ITrayPriv::Execute\n");
86
87 ret = SHInvokeDefaultCommand(m_Tray->GetHWND(), pShellFolder, pidl);
88
89 return ret;
90 }
91
94 IN PVOID Unknown1,
95 IN PVOID Unknown2,
97 IN PVOID Unknown4) override
98 {
99 TRACE("ITrayPriv::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1, Unknown2, Unknown3, Unknown4);
100 return E_NOTIMPL;
101 }
102
104 {
105 BOOL bPresent;
107
108 return bPresent &&
110 SHTestTokenPrivilegeW(NULL, L"SeUndockPrivilege") &&
112 }
113
114 virtual BOOL
116 {
117 TRACE("ShowSynchronizeMenuItem() not implemented!\n");
118 /* FIXME: How do we detect this?! */
119 return FALSE;
120 }
121
123 AppendMenu(OUT HMENU* phMenu) override
124 {
125 HMENU hMenu, hSettingsMenu;
126 DWORD dwLogoff;
127 BOOL bWantLogoff;
128 UINT uLastItemsCount = 5; /* 5 menu items below the last separator */
129 WCHAR szUser[128];
130
131 TRACE("ITrayPriv::AppendMenu\n");
132
134 *phMenu = hMenu;
135 if (hMenu == NULL)
136 return E_FAIL;
137
138 /* Remove menu items that don't apply */
139
140 /* Favorites */
142 !GetAdvancedBool(L"StartMenuFavorites", FALSE))
143 {
145 }
146
147 /* Documents */
149 !GetAdvancedBool(L"Start_ShowRecentDocs", TRUE))
150 {
152 }
153
154 /* Settings */
155 hSettingsMenu = FindSubMenu(hMenu, IDM_SETTINGS, FALSE);
156
157 /* Control Panel */
160 !GetAdvancedBool(L"Start_ShowControlPanel", TRUE))
161 {
163
164 /* Delete the separator below it */
165 DeleteMenu(hSettingsMenu, 0, MF_BYPOSITION);
166 }
167
168 /* Network Connections */
171 !GetAdvancedBool(L"Start_ShowNetConn", TRUE))
172 {
174 }
175
176 /* Printers and Faxes */
178 !GetAdvancedBool(L"Start_ShowPrinters", TRUE))
179 {
181 }
182
183 /* Security */
185 GetSystemMetrics(SM_REMOTECONTROL) == 0 ||
187 {
188 DeleteMenu(hSettingsMenu, IDM_SECURITY, MF_BYCOMMAND);
189 }
190
191 /* Delete Settings menu if it was empty */
192 if (GetMenuItemCount(hSettingsMenu) == 0)
193 {
195 }
196
197 /* Search */
199 !GetAdvancedBool(L"Start_ShowSearch", TRUE))
200 {
202 }
203
204 /* Help */
206 !GetAdvancedBool(L"Start_ShowHelp", TRUE))
207 {
209 }
210
211 /* Run */
213 !GetAdvancedBool(L"StartMenuRun", TRUE))
214 {
216 }
217
218 /* Synchronize */
220 {
222 uLastItemsCount--;
223 }
224
225 /* Log off */
227 bWantLogoff = (dwLogoff == 2 ||
229 GetAdvancedBool(L"StartMenuLogoff", FALSE));
230 if (dwLogoff != 1 && bWantLogoff)
231 {
232 /* FIXME: We need a more sophisticated way to determine whether to show
233 or hide it, it might be hidden in too many cases!!! */
234
235 /* Update Log Off menu item */
236 if (!GetCurrentLoggedOnUserName(szUser, _countof(szUser)))
237 {
238 szUser[0] = _T('\0');
239 }
240
241 if (!FormatMenuString(hMenu,
244 szUser))
245 {
246 /* We couldn't update the menu item, delete it... */
248 }
249 }
250 else
251 {
253 uLastItemsCount--;
254 }
255
256 /* Disconnect */
258 GetSystemMetrics(SM_REMOTECONTROL) == 0)
259 {
261 uLastItemsCount--;
262 }
263
264 /* Undock computer */
265 if (!ShowUndockMenuItem())
266 {
268 uLastItemsCount--;
269 }
270
271 /* Shut down */
273 {
275 uLastItemsCount--;
276 }
277
278 if (uLastItemsCount == 0)
279 {
280 /* Remove the separator at the end of the menu */
282 }
283
284 return S_OK;
285 }
286
287 /*******************************************************************/
288
291 IN const GUID *pguidCmdGroup OPTIONAL,
292 IN ULONG cCmds,
293 IN OUT OLECMD *prgCmds,
294 IN OUT OLECMDTEXT *pCmdText OPTIONAL) override
295 {
296 return E_NOTIMPL;
297 }
298
301 IN const GUID *pguidCmdGroup OPTIONAL,
302 IN DWORD nCmdID,
303 IN DWORD nCmdExecOpt,
304 IN VARIANTARG *pvaIn OPTIONAL,
305 IN VARIANTARG *pvaOut OPTIONAL) override
306 {
307 return E_NOTIMPL;
308 }
309
310 /*******************************************************************/
311
313 SetClient(IUnknown *punkClient) override
314 {
315 return E_NOTIMPL;
316 }
317
319 GetClient(IUnknown ** ppunkClient) override
320 {
321 return E_NOTIMPL;
322 }
323
326 {
327 return E_NOTIMPL;
328 }
329
330 // *** IMenuPopup methods ***
331
333 Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags) override
334 {
335 return E_NOTIMPL;
336 }
337
339 OnSelect(DWORD dwSelectType) override
340 {
341 return E_NOTIMPL;
342 }
343
345 SetSubMenu(IMenuPopup *pmp, BOOL fSet) override
346 {
347 if (!fSet)
348 {
350 }
351
352 return S_OK;
353 }
354
355 /*******************************************************************/
356
357 HRESULT Initialize(IN ITrayWindow *tray)
358 {
359 m_Tray = tray;
360 return S_OK;
361 }
362
364
367 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
368 COM_INTERFACE_ENTRY_IID(IID_ITrayPriv, ITrayPriv)
369 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
370 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup)
373};
374
376{
377 return ShellObjectCreatorInit<CStartMenuSite>(Tray, riid, ppv);
378}
PRTL_UNICODE_STRING_BUFFER PULONG PULONG Unknown4
HMENU FindSubMenu(IN HMENU hMenu, IN UINT uItem, IN BOOL fByPosition)
Definition: util.cpp:55
BOOL FormatMenuString(IN HMENU hMenu, IN UINT uPosition, IN UINT uFlags,...)
Definition: util.cpp:106
BOOL GetAdvancedBool(IN LPCWSTR pszValueName, IN BOOL bDefaultValue)
Definition: util.cpp:156
HMENU LoadPopupMenu(IN HINSTANCE hInstance, IN LPCWSTR lpMenuName)
Definition: util.cpp:33
HRESULT Tray_OnStartMenuDismissed(ITrayWindow *Tray)
Definition: traywnd.cpp:3775
BOOL GetCurrentLoggedOnUserName(OUT LPWSTR szBuffer, IN DWORD dwBufferSize)
Definition: util.cpp:73
#define IDM_SEARCH
Definition: resource.h:77
#define IDM_FAVORITES
Definition: resource.h:69
#define IDM_UNDOCKCOMPUTER
Definition: resource.h:83
#define IDM_SECURITY
Definition: resource.h:73
#define IDM_SYNCHRONIZE
Definition: resource.h:80
#define IDM_NETWORKCONNECTIONS
Definition: resource.h:74
#define IDM_SHUTDOWN
Definition: resource.h:84
#define IDM_CONTROLPANEL
Definition: resource.h:72
#define IDM_PRINTERSANDFAXES
Definition: resource.h:75
#define IDM_LASTSTARTMENU_SEPARATOR
Definition: resource.h:85
#define IDM_SETTINGS
Definition: resource.h:71
#define IDM_DISCONNECT
Definition: resource.h:82
#define IDM_RUN
Definition: resource.h:79
#define IDM_STARTMENU
Definition: resource.h:62
#define IDM_HELPANDSUPPORT
Definition: resource.h:78
#define IDM_DOCUMENTS
Definition: resource.h:70
#define IDM_LOGOFF
Definition: resource.h:81
#define STDMETHODIMP
Definition: basetyps.h:43
CONFIGRET WINAPI CM_Is_Dock_Station_Present(_Out_ PBOOL pbPresent)
Definition: cfgmgr.c:5886
virtual ~CStartMenuSite()
STDMETHODIMP QueryService(IN REFGUID guidService, IN REFIID riid, OUT PVOID *ppvObject) override
STDMETHODIMP OnPosRectChangeDB(RECT *prc) override
virtual BOOL ShowSynchronizeMenuItem(VOID)
STDMETHODIMP AppendMenu(OUT HMENU *phMenu) override
CComPtr< ITrayWindow > m_Tray
STDMETHODIMP Execute(IN IShellFolder *pShellFolder, IN LPCITEMIDLIST pidl) override
STDMETHODIMP Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags) override
STDMETHODIMP GetWindow(OUT HWND *phwnd) override
virtual BOOL ShowUndockMenuItem(VOID)
STDMETHODIMP OnSelect(DWORD dwSelectType) override
STDMETHODIMP GetClient(IUnknown **ppunkClient) override
HRESULT Initialize(IN ITrayWindow *tray)
STDMETHODIMP SetSubMenu(IMenuPopup *pmp, BOOL fSet) override
STDMETHODIMP SetClient(IUnknown *punkClient) override
STDMETHODIMP Unknown(IN PVOID Unknown1, IN PVOID Unknown2, IN PVOID Unknown3, IN PVOID Unknown4) override
STDMETHODIMP QueryStatus(IN const GUID *pguidCmdGroup OPTIONAL, IN ULONG cCmds, IN OUT OLECMD *prgCmds, IN OUT OLECMDTEXT *pCmdText OPTIONAL) override
STDMETHODIMP Exec(IN const GUID *pguidCmdGroup OPTIONAL, IN DWORD nCmdID, IN DWORD nCmdExecOpt, IN VARIANTARG *pvaIn OPTIONAL, IN VARIANTARG *pvaOut OPTIONAL) override
STDMETHODIMP ContextSensitiveHelp(IN BOOL fEnterMode) override
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES IN DWORD Unknown3
Definition: conport.c:37
#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 FALSE
Definition: types.h:117
EXTERN_C BOOL WINAPI SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_ LPCWSTR lpName)
Definition: utils.cpp:858
HRESULT WINAPI SHInvokeDefaultCommand(HWND hWnd, IShellFolder *lpFolder, LPCITEMIDLIST lpApidl)
Definition: ordinal.c:3183
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
HINSTANCE hExplorerInstance
Definition: explorer.cpp:24
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
int MP_POPUPFLAGS
Definition: shobjidl.idl:2631
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:679
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
const GUID IID_IOleWindow
short WCHAR
Definition: pedump.c:58
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
_Out_ LPRECT prc
Definition: ntgdi.h:1658
@ REST_FORCESTARTMENULOGOFF
Definition: shlobj.h:1726
@ REST_NOSETFOLDERS
Definition: shlobj.h:1654
@ REST_NOCONTROLPANEL
Definition: shlobj.h:1715
@ REST_STARTMENULOGOFF
Definition: shlobj.h:1678
@ REST_NOSMEJECTPC
Definition: shlobj.h:1796
@ REST_NONETWORKCONNECTIONS
Definition: shlobj.h:1725
@ REST_NOSECURITY
Definition: shlobj.h:1874
@ REST_NORECENTDOCSMENU
Definition: shlobj.h:1682
@ REST_NORUN
Definition: shlobj.h:1650
@ REST_NOFIND
Definition: shlobj.h:1657
@ REST_NODISCONNECT
Definition: shlobj.h:1873
@ REST_NOSMHELP
Definition: shlobj.h:1747
@ REST_NOCLOSE
Definition: shlobj.h:1651
@ REST_NOFAVORITESMENU
Definition: shlobj.h:1685
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT CStartMenuSite_CreateInstance(IN OUT ITrayWindow *Tray, const IID &riid, PVOID *ppv)
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
Definition: scsiwmi.h:51
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define _T(x)
Definition: vfdio.h:22
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define MF_BYCOMMAND
Definition: winuser.h:202
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MF_BYPOSITION
Definition: winuser.h:203
#define SM_REMOTESESSION
Definition: winuser.h:1069
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
int WINAPI GetSystemMetrics(_In_ int)
#define const
Definition: zconf.h:233