ReactOS 0.4.16-dev-1097-g530d26a
general.cpp
Go to the documentation of this file.
1/*
2 * 'General' tab property sheet of Folder Options
3 *
4 * Copyright 2007 Johannes Anderwald <johannes.anderwald@reactos.org>
5 * Copyright 2016-2018 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "precomp.h"
23
25
27 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer";
28
30// Shell settings
31
32EXTERN_C void
34{
35 ZeroMemory(pss, sizeof(*pss));
36 pss->fShowAllObjects = TRUE;
37 pss->fShowExtensions = TRUE;
38 pss->fShowCompColor = TRUE;
40 pss->fShowAttribCol = TRUE; // ROS defaults to Details view with this column on
41 pss->fShowInfoTip = TRUE;
44 pss->iSortDirection = 1;
46 pss->fSepProcess = FALSE;
47 pss->fStartPanelOn = FALSE; // Note: This should be changed to TRUE when the modern start menu is implemented
48}
49
52{
56 REG_BINARY, prss, prss->dwSize);
57}
58
59// bDoubleClick is TRUE if "Double-click to open an item (single-click to select)".
60// bDoubleClick is FALSE if "Single-click to open an item (point to select)".
62// API Monitor:
63// SHLWAPI.dll RegOpenKeyExW ( 0x000000c8, NULL, 0, MAXIMUM_ALLOWED, 0x00def234 ) ERROR_SUCCESS 0.0000243
64// SHLWAPI.dll RegSetValueExW ( 0x000003e8, "ShellState", 0, REG_BINARY, 0x000c2050, 36 ) ERROR_SUCCESS 0.0001028
65// SHLWAPI.dll RegCloseKey ( 0x000003e8 ) ERROR_SUCCESS 0.0000081
66// Explorer.EXE SHSettingsChanged ( 0, "ShellState" ) 0.0000131
67static BOOL
68IntSetShellStateSettings(BOOL bDoubleClick, BOOL bUseCommonTasks)
69{
70 SHELLSTATE shellstate;
71 shellstate.fDoubleClickInWebView = !!bDoubleClick;
72 shellstate.fWebView = !!bUseCommonTasks;
74
75 // FIXME: This is not correct, it does nothing. SHGetSetSettings will broadcast it.
76 SHSettingsChanged(0, L"ShellState");
77 return TRUE;
78}
79
81// API Monitor:
82// SHLWAPI.dll RegOpenKeyExW ( 0x000000c8, NULL, 0, MAXIMUM_ALLOWED, 0x0007e484 ) ERROR_SUCCESS 0.0000388
83// SHLWAPI.dll RegQueryValueExW ( 0x000005a8, "ShellState", NULL, 0x0007e474, 0x000c2050, 0x0007e4fc ) ERROR_SUCCESS 0.0000271
84// SHLWAPI.dll RegCloseKey ( 0x000005a8 ) ERROR_SUCCESS 0.0000112
87{
88 DWORD dwSize = sizeof(REGSHELLSTATE);
90 L"ShellState", NULL, prss, &dwSize);
91 return err == ERROR_SUCCESS && prss->dwSize >= REGSHELLSTATE_SIZE;
92}
93
94// bIconUnderline is TRUE if "Underline icon titles only when I point at them".
95// bIconUnderline is FALSE if "Underline icon titles consistent with my browser".
97// API Monitor:
98// SHELL32.dll SHRegGetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", NULL, 0x00d2f324, 0x00d2f328, FALSE, 0x00d2f32c, 4 ) ERROR_SUCCESS 0.0002484
99// SHELL32.dll IsDlgButtonChecked ( 0x0005009e, 30104 ) BST_CHECKED 0.0000212
100// SHELL32.dll SHRegSetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", 0, 0x00d2f314, 4, 6 ) ERROR_SUCCESS 0.0008300
101// Explorer.EXE SHSettingsChanged ( 0, "Software\Microsoft\Windows\CurrentVersion\Explorer\IconUnderline" ) 0.0000092
102static BOOL IntSetUnderlineState(BOOL bIconUnderline)
103{
105 DWORD dwValue = (bIconUnderline ? 3 : 2), dwSize = sizeof(DWORD);
108 if (Status != ERROR_SUCCESS)
109 return FALSE;
110
111 SHSendMessageBroadcastW(WM_SETTINGCHANGE, 0, (LPARAM)L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\IconUnderline");
112 return TRUE;
113}
114
116{
117 DWORD dwValue, dwDefault = 2, dwSize = sizeof(DWORD);
118 SHRegGetUSValue(s_pszExplorerKey, L"IconUnderline", NULL, &dwValue, &dwSize, FALSE, &dwDefault, sizeof(DWORD));
119 return dwValue == 3;
120}
121
122// bNewWindowMode is TRUE if "Open each folder in its own window".
123// bNewWindowMode is FALSE if "Open each folder in the same window".
125// API Monitor:
126// SHELL32.dll RegCreateKeyExW ( HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState", 0, NULL, 0, KEY_SET_VALUE, NULL, 0x00d2f2b8, NULL ) ERROR_SUCCESS 0.0000455
127// SHELL32.dll RegSetValueExW ( 0x00000854, "Settings", 0, REG_BINARY, 0x0210f170, 12 ) ERROR_SUCCESS 0.0001472
128// SHELL32.dll RegSetValueExW ( 0x00000854, "FullPath", 0, REG_DWORD, 0x00d2f2ac, 4 ) ERROR_SUCCESS 0.0000168
129// SHELL32.dll RegCloseKey ( 0x00000854 ) ERROR_SUCCESS 0.0000000
130static HRESULT IntSetNewWindowMode(BOOL bNewWindowMode)
131{
133 if (!ReadCabinetState(&cs, sizeof(cs)))
134 return E_FAIL;
135
136 BOOL changed = !!cs.fNewWindowMode != !!bNewWindowMode;
137 cs.fNewWindowMode = !!bNewWindowMode;
138 return WriteCabinetState(&cs) ? (changed ? S_OK : S_FALSE) : E_FAIL;
139}
140
142{
144 if (!ReadCabinetState(&cs, sizeof(cs)))
145 return FALSE;
146
147 return !!cs.fNewWindowMode;
148}
149
151// GeneralDlg
152
153typedef struct GENERAL_DIALOG
154{
159
160static VOID
162{
163 HICON hTaskIcon = NULL, hFolderIcon = NULL, hClickIcon = NULL;
164 LPTSTR lpTaskIconName = NULL, lpFolderIconName = NULL, lpClickIconName = NULL;
165
166 // Show task setting icon.
171
172 if (lpTaskIconName)
173 {
174 hTaskIcon = (HICON)LoadImage(shell32_hInstance, lpTaskIconName,
176 if (hTaskIcon)
177 {
178 HWND hwndTaskIcon = GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_TASKICON);
179 SendMessage(hwndTaskIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hTaskIcon);
180 }
181 }
182
183 // Show Folder setting icons
188
189 if (lpFolderIconName)
190 {
191 hFolderIcon = (HICON)LoadImage(shell32_hInstance, lpFolderIconName,
193 if (hFolderIcon)
194 {
195 HWND hwndFolderIcon = GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_FOLDERICON);
196 SendMessage(hwndFolderIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hFolderIcon);
197 }
198 }
199
200 // Show click setting icon
205
206 if (lpClickIconName)
207 {
208 hClickIcon = (HICON)LoadImage(shell32_hInstance, lpClickIconName,
210 if (hClickIcon)
211 {
212 HWND hwndClickIcon = GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_CLICKICON);
213 SendMessage(hwndClickIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hClickIcon);
214 }
215 }
216
217 // Replace icons
218 if (hTaskIcon)
219 {
220 DestroyIcon(pGeneral->hTaskIcon);
221 pGeneral->hTaskIcon = hTaskIcon;
222 }
223 if (hFolderIcon)
224 {
225 DestroyIcon(pGeneral->hFolderIcon);
226 pGeneral->hFolderIcon = hFolderIcon;
227 }
228 if (hClickIcon)
229 {
230 DestroyIcon(pGeneral->hClickIcon);
231 pGeneral->hClickIcon = hClickIcon;
232 }
233
234 if (nCtrlID == IDC_FOLDER_OPTIONS_SINGLECLICK)
235 {
238 }
239
240 if (nCtrlID == IDC_FOLDER_OPTIONS_DOUBLECLICK)
241 {
245 }
246}
247
248static void
249GeneralDlg_StoreToUI(HWND hwndDlg, BOOL bDoubleClick, BOOL bUseCommonTasks,
250 BOOL bUnderline, BOOL bNewWindowMode, PGENERAL_DIALOG pGeneral)
251{
252 EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_COMMONTASKS), bUseCommonTasks); // FIXME: ROS DefView does not support WebView nor the tasks pane
253
254 if (bUseCommonTasks)
256 else
258
259 if (bDoubleClick)
261 else
263
264 if (bNewWindowMode)
266 else
268
269 if (!bDoubleClick)
270 {
273 if (bUnderline)
275 else
277 }
278 else
279 {
283 }
284}
285
286static BOOL
288{
291 BOOL bDoubleClick = !!ss.fDoubleClickInWebView;
292 BOOL bUseCommonTasks = !!ss.fWebView;
293 BOOL bUnderline = IntGetUnderlineState();
294 BOOL bNewWindowMode = IntGetNewWindowMode();
295
296 GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderline, bNewWindowMode, pGeneral);
297 GeneralDlg_UpdateIcons(hwndDlg, 0, pGeneral);
298
299 return TRUE;
300}
301
302static void
304{
305 // default values
306 BOOL bDoubleClick = TRUE;
307 BOOL bUseCommonTasks = TRUE;
308 BOOL bUnderline = FALSE;
309 BOOL bNewWindowMode = (_WIN32_WINNT < _WIN32_WINNT_WIN2K);
310
311 GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderline, bNewWindowMode, pGeneral);
312 GeneralDlg_UpdateIcons(hwndDlg, 0, pGeneral);
313}
314
315static BOOL
317{
319 BOOL bUseCommonTasks = (IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_COMMONTASKS) == BST_CHECKED);
321 BOOL bNewWindowMode = !(IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_SAMEWINDOW) == BST_CHECKED);
322
323 IntSetUnderlineState(bUnderline);
324 BOOL updateCabinets = IntSetNewWindowMode(bNewWindowMode) == S_OK;
325 IntSetShellStateSettings(bDoubleClick, bUseCommonTasks);
326 if (updateCabinets)
328 return TRUE;
329}
330
333 HWND hwndDlg,
334 UINT uMsg,
337{
338 static GENERAL_DIALOG general;
339
340 switch (uMsg)
341 {
342 case WM_INITDIALOG:
343 general.hTaskIcon = NULL;
344 general.hFolderIcon = NULL;
345 general.hClickIcon = NULL;
346 return GeneralDlg_OnInitDialog(hwndDlg, &general);
347
348 case WM_COMMAND:
349 switch (LOWORD(wParam))
350 {
359 if (HIWORD(wParam) == BN_CLICKED)
360 {
361 GeneralDlg_UpdateIcons(hwndDlg, LOWORD(wParam), &general);
362
363 // Enable the 'Apply' button
364 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
365 }
366 break;
368 if (HIWORD(wParam) == BN_CLICKED)
369 {
370 GeneralDlg_OnRestoreDefaults(hwndDlg, &general);
371
372 // Enable the 'Apply' button
373 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
374 }
375 break;
376 }
377 break;
378
379 case WM_NOTIFY:
380 {
381 LPNMHDR pnmh = (LPNMHDR)lParam;
382
383 switch (pnmh->code)
384 {
385 case PSN_SETACTIVE:
386 break;
387
388 case PSN_APPLY:
389 return GeneralDlg_OnApply(hwndDlg, &general);
390 }
391 break;
392 }
393
394 case WM_DESTROY:
395 DestroyIcon(general.hTaskIcon);
396 DestroyIcon(general.hFolderIcon);
397 DestroyIcon(general.hClickIcon);
398 break;
399
400 default:
401 return FALSE;
402 }
403 return FALSE;
404}
#define shell32_hInstance
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define _WIN32_WINNT
Definition: precomp.h:14
#define EXTERN_C
Definition: basetyps.h:12
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CALLBACK
Definition: compat.h:35
DWORD WINAPI SHSendMessageBroadcastW(UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: ordinal.c:4072
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1236
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:25
static BOOL IntGetNewWindowMode(VOID)
Definition: general.cpp:141
static BOOL IntGetUnderlineState(VOID)
Definition: general.cpp:115
static BOOL IntSetShellStateSettings(BOOL bDoubleClick, BOOL bUseCommonTasks)
Definition: general.cpp:68
static BOOL IntSetUnderlineState(BOOL bIconUnderline)
Definition: general.cpp:102
static BOOL GeneralDlg_OnInitDialog(HWND hwndDlg, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:287
struct GENERAL_DIALOG * PGENERAL_DIALOG
static const LPCWSTR s_pszExplorerKey
Definition: general.cpp:26
static HRESULT IntSetNewWindowMode(BOOL bNewWindowMode)
Definition: general.cpp:130
EXTERN_C BOOL SHELL32_ReadRegShellState(PREGSHELLSTATE prss)
Definition: general.cpp:86
static VOID GeneralDlg_UpdateIcons(HWND hDlg, UINT nCtrlID, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:161
EXTERN_C void SHELL32_GetDefaultShellState(LPSHELLSTATE pss)
Definition: general.cpp:33
static void GeneralDlg_OnRestoreDefaults(HWND hwndDlg, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:303
static BOOL GeneralDlg_OnApply(HWND hwndDlg, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:316
INT_PTR CALLBACK FolderOptionsGeneralDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: general.cpp:332
EXTERN_C LSTATUS SHELL32_WriteRegShellState(PREGSHELLSTATE prss)
Definition: general.cpp:51
static void GeneralDlg_StoreToUI(HWND hwndDlg, BOOL bDoubleClick, BOOL bUseCommonTasks, BOOL bUnderline, BOOL bNewWindowMode, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:249
#define ss
Definition: i386-dis.c:441
#define cs
Definition: i386-dis.c:442
#define S_OK
Definition: intsafe.h:52
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HICON
Definition: imagelist.c:80
unsigned int UINT
Definition: ndis.h:50
#define REG_BINARY
Definition: nt_native.h:1496
#define DWORD
Definition: nt_native.h:44
#define REG_NONE
Definition: nt_native.h:1492
#define L(x)
Definition: ntvdm.h:50
#define MAKEINTRESOURCE(i)
Definition: ntverrsrc.c:25
#define LOWORD(l)
Definition: pedump.c:82
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
#define PSN_APPLY
Definition: prsht.h:117
#define PSN_SETACTIVE
Definition: prsht.h:115
#define err(...)
#define WM_NOTIFY
Definition: richedit.h:61
#define _WIN32_WINNT_WIN2K
Definition: sdkddkver.h:21
BOOL WINAPI ReadCabinetState(CABINETSTATE *cs, int length)
Definition: shellord.c:1807
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
BOOL WINAPI WriteCabinetState(CABINETSTATE *cs)
Definition: shellord.c:1859
#define SHFSF_COL_NAME
Definition: shfldr.h:44
#define SSF_DOUBLECLICKINWEBVIEW
Definition: shlobj.h:1618
#define SSF_WEBVIEW
Definition: shlobj.h:1628
#define SHRegSetUSValue
Definition: shlwapi.h:565
#define SHRegGetUSValue
Definition: shlwapi.h:543
#define SHREGSET_HKLM
Definition: shlwapi.h:322
#define SHREGSET_FORCE_HKCU
Definition: shlwapi.h:321
BOOL WINAPI SHSettingsChanged(LPCVOID unused, LPCWSTR pszKey)
Definition: shpolicy.c:197
#define IDC_FOLDER_OPTIONS_CLASSICFOLDERS
Definition: shresdef.h:443
#define IDC_FOLDER_OPTIONS_ULBROWSER
Definition: shresdef.h:448
#define IDC_FOLDER_OPTIONS_SINGLECLICK
Definition: shresdef.h:446
#define IDC_FOLDER_OPTIONS_COMMONTASKS
Definition: shresdef.h:442
#define IDI_SHELL_OPEN_IN_SOME_WINDOW
Definition: shresdef.h:678
#define IDC_FOLDER_OPTIONS_SAMEWINDOW
Definition: shresdef.h:444
#define IDC_FOLDER_OPTIONS_FOLDERICON
Definition: shresdef.h:440
#define IDI_SHELL_OPEN_IN_NEW_WINDOW
Definition: shresdef.h:679
#define IDI_SHELL_CLASSIC_FOLDERS
Definition: shresdef.h:677
#define IDI_SHELL_SINGLE_CLICK_TO_OPEN
Definition: shresdef.h:680
#define IDC_FOLDER_OPTIONS_CLICKICON
Definition: shresdef.h:441
#define IDC_FOLDER_OPTIONS_DOUBLECLICK
Definition: shresdef.h:447
#define IDI_SHELL_DOUBLE_CLICK_TO_OPEN
Definition: shresdef.h:681
#define IDC_FOLDER_OPTIONS_TASKICON
Definition: shresdef.h:439
#define IDC_FOLDER_OPTIONS_ULPOINT
Definition: shresdef.h:449
#define IDC_FOLDER_OPTIONS_RESTORE
Definition: shresdef.h:450
#define IDC_FOLDER_OPTIONS_OWNWINDOW
Definition: shresdef.h:445
#define IDI_SHELL_SHOW_COMMON_TASKS
Definition: shresdef.h:676
HICON hFolderIcon
Definition: general.cpp:156
HICON hClickIcon
Definition: general.cpp:157
HICON hTaskIcon
Definition: general.cpp:155
SHELLSTATE ss
Definition: ShellState.cpp:22
BOOL fShowSuperHidden
Definition: shlobj.h:1565
BOOL fShowExtensions
Definition: shlobj.h:1550
LONG lParamSort
Definition: shlobj.h:1571
BOOL fWebView
Definition: shlobj.h:1563
BOOL fShowAttribCol
Definition: shlobj.h:1559
BOOL fShowCompColor
Definition: shlobj.h:1554
BOOL fShowInfoTip
Definition: shlobj.h:1561
UINT version
Definition: shlobj.h:1573
BOOL fSepProcess
Definition: shlobj.h:1575
int iSortDirection
Definition: shlobj.h:1572
BOOL fShowAllObjects
Definition: shlobj.h:1549
BOOL fDoubleClickInWebView
Definition: shlobj.h:1555
BOOL fStartPanelOn
Definition: shlobj.h:1576
UINT code
Definition: winuser.h:3170
int32_t INT_PTR
Definition: typedefs.h:64
#define HIWORD(l)
Definition: typedefs.h:247
#define REGSHELLSTATE_VERSION
Definition: undocshell.h:582
#define REGSHELLSTATE_SIZE
Definition: undocshell.h:581
#define CWM_STATECHANGE
Definition: undocshell.h:241
void PostCabinetMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: view.cpp:880
#define ZeroMemory
Definition: winbase.h:1743
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define S_FALSE
Definition: winerror.h:2357
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define IMAGE_ICON
Definition: winuser.h:212
#define WM_COMMAND
Definition: winuser.h:1751
#define WM_INITDIALOG
Definition: winuser.h:1750
#define STM_SETIMAGE
Definition: winuser.h:2104
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define WM_SETTINGCHANGE
Definition: winuser.h:1640
struct tagNMHDR * LPNMHDR
#define SendMessage
Definition: winuser.h:5863
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
HWND WINAPI GetParent(_In_ HWND)
#define LoadImage
Definition: winuser.h:5835
BOOL WINAPI CheckRadioButton(_In_ HWND, _In_ int, _In_ int, _In_ int)
#define LR_DEFAULTCOLOR
Definition: winuser.h:1098
#define BN_CLICKED
Definition: winuser.h:1936
#define WM_DESTROY
Definition: winuser.h:1620
#define BST_CHECKED
Definition: winuser.h:197
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2390
CHAR * LPTSTR
Definition: xmlstorage.h:192
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185