ReactOS 0.4.15-dev-6644-g539123c
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
26typedef struct REGSHELLSTATE
27{
31
32#define REGSHELLSTATE_SIZE 0x24
33
35 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer";
36
37extern "C"
39
41// Shell settings
42
43static void
45{
46 ZeroMemory(&rss, sizeof(rss));
48
51
54 rss.ss.fShowInfoTip = TRUE;
55
56 rss.ss.iSortDirection = 1;
57 rss.ss.version = 0xD;
58 rss.ss.fStartPanelOn = TRUE;
59}
60
61// bDoubleClick is TRUE if "Double-click to open an item (single-click to select)".
62// bDoubleClick is FALSE if "Single-click to open an item (point to select)".
64// API Monitor:
65// SHLWAPI.dll RegOpenKeyExW ( 0x000000c8, NULL, 0, MAXIMUM_ALLOWED, 0x00def234 ) ERROR_SUCCESS 0.0000243
66// SHLWAPI.dll RegSetValueExW ( 0x000003e8, "ShellState", 0, REG_BINARY, 0x000c2050, 36 ) ERROR_SUCCESS 0.0001028
67// SHLWAPI.dll RegCloseKey ( 0x000003e8 ) ERROR_SUCCESS 0.0000081
68// Explorer.EXE SHSettingsChanged ( 0, "ShellState" ) 0.0000131
69static BOOL
70IntSetShellStateSettings(BOOL bDoubleClick, BOOL bUseCommonTasks)
71{
72 REGSHELLSTATE rss;
73 DWORD dwSize = sizeof(rss);
74 LSTATUS nStatus;
75
76 // read ShellState
79 L"ShellState",
80 NULL,
81 &rss,
82 &dwSize);
83 if (nStatus != ERROR_SUCCESS || rss.dwSize < REGSHELLSTATE_SIZE)
84 {
86 }
87
88 // update ShellState
89 rss.ss.fDoubleClickInWebView = (bDoubleClick ? TRUE : FALSE);
90 rss.ss.fWebView = (bUseCommonTasks ? TRUE : FALSE);
91
92 // write ShellState
96 L"ShellState",
98 &rss,
99 dwSize);
100 if (nStatus != ERROR_SUCCESS)
101 return FALSE;
102
103 SHSettingsChanged(0, L"ShellState");
104 return TRUE;
105}
106
108// API Monitor:
109// SHLWAPI.dll RegOpenKeyExW ( 0x000000c8, NULL, 0, MAXIMUM_ALLOWED, 0x0007e484 ) ERROR_SUCCESS 0.0000388
110// SHLWAPI.dll RegQueryValueExW ( 0x000005a8, "ShellState", NULL, 0x0007e474, 0x000c2050, 0x0007e4fc ) ERROR_SUCCESS 0.0000271
111// SHLWAPI.dll RegCloseKey ( 0x000005a8 ) ERROR_SUCCESS 0.0000112
112static BOOL
113IntGetShellStateSettings(BOOL& bDoubleClick, BOOL& bUseCommonTasks)
114{
115 REGSHELLSTATE rss;
116 DWORD dwSize = sizeof(rss);
117 LSTATUS nStatus;
118 bDoubleClick = TRUE;
119 bUseCommonTasks = FALSE;
120
121 // read ShellState
123 L"ShellState", NULL, &rss, &dwSize);
124 if (nStatus != ERROR_SUCCESS || rss.dwSize < REGSHELLSTATE_SIZE)
125 return FALSE;
126
127 bDoubleClick = !!rss.ss.fDoubleClickInWebView;
128 bUseCommonTasks = !!rss.ss.fWebView;
129 return TRUE;
130}
131
132// bIconUnderline is TRUE if "Underline icon titles only when I point at them".
133// bIconUnderline is FALSE if "Underline icon titles consistent with my browser".
135// API Monitor:
136// SHELL32.dll SHRegGetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", NULL, 0x00d2f324, 0x00d2f328, FALSE, 0x00d2f32c, 4 ) ERROR_SUCCESS 0.0002484
137// SHELL32.dll IsDlgButtonChecked ( 0x0005009e, 30104 ) BST_CHECKED 0.0000212
138// SHELL32.dll SHRegSetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", 0, 0x00d2f314, 4, 6 ) ERROR_SUCCESS 0.0008300
139// Explorer.EXE SHSettingsChanged ( 0, "Software\Microsoft\Windows\CurrentVersion\Explorer\IconUnderline" ) 0.0000092
140static BOOL IntSetUnderlineState(BOOL bIconUnderline)
141{
143 DWORD dwValue = (bIconUnderline ? 3 : 2), dwSize = sizeof(DWORD);
146 if (Status != ERROR_SUCCESS)
147 return FALSE;
148
149 SHSettingsChanged(0, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\IconUnderline");
150 return TRUE;
151}
152
154{
155 DWORD dwValue, dwDefault = 2, dwSize = sizeof(DWORD);
156 SHRegGetUSValue(s_pszExplorerKey, L"IconUnderline", NULL, &dwValue, &dwSize, FALSE, &dwDefault, sizeof(DWORD));
157 return dwValue == 3;
158}
159
160// bNewWindowMode is TRUE if "Open each folder in its own window".
161// bNewWindowMode is FALSE if "Open each folder in the same window".
163// API Monitor:
164// 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
165// SHELL32.dll RegSetValueExW ( 0x00000854, "Settings", 0, REG_BINARY, 0x0210f170, 12 ) ERROR_SUCCESS 0.0001472
166// SHELL32.dll RegSetValueExW ( 0x00000854, "FullPath", 0, REG_DWORD, 0x00d2f2ac, 4 ) ERROR_SUCCESS 0.0000168
167// SHELL32.dll RegCloseKey ( 0x00000854 ) ERROR_SUCCESS 0.0000000
168static BOOL IntSetNewWindowMode(BOOL bNewWindowMode)
169{
171 if (!ReadCabinetState(&cs, sizeof(cs)))
172 return FALSE;
173
174 cs.fNewWindowMode = (bNewWindowMode ? TRUE : FALSE);
175 return WriteCabinetState(&cs);
176}
177
179{
181 if (!ReadCabinetState(&cs, sizeof(cs)))
182 return FALSE;
183
184 return !!cs.fNewWindowMode;
185}
186
188// GeneralDlg
189
190typedef struct GENERAL_DIALOG
191{
196
197static VOID
199{
200 HICON hTaskIcon = NULL, hFolderIcon = NULL, hClickIcon = NULL;
201 LPTSTR lpTaskIconName = NULL, lpFolderIconName = NULL, lpClickIconName = NULL;
202
203 // Show task setting icon.
208
209 if (lpTaskIconName)
210 {
211 hTaskIcon = (HICON)LoadImage(shell32_hInstance, lpTaskIconName,
213 if (hTaskIcon)
214 {
215 HWND hwndTaskIcon = GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_TASKICON);
216 SendMessage(hwndTaskIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hTaskIcon);
217 }
218 }
219
220 // Show Folder setting icons
225
226 if (lpFolderIconName)
227 {
228 hFolderIcon = (HICON)LoadImage(shell32_hInstance, lpFolderIconName,
230 if (hFolderIcon)
231 {
232 HWND hwndFolderIcon = GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_FOLDERICON);
233 SendMessage(hwndFolderIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hFolderIcon);
234 }
235 }
236
237 // Show click setting icon
242
243 if (lpClickIconName)
244 {
245 hClickIcon = (HICON)LoadImage(shell32_hInstance, lpClickIconName,
247 if (hClickIcon)
248 {
249 HWND hwndClickIcon = GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_CLICKICON);
250 SendMessage(hwndClickIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hClickIcon);
251 }
252 }
253
254 // Replace icons
255 if (hTaskIcon)
256 {
257 DestroyIcon(pGeneral->hTaskIcon);
258 pGeneral->hTaskIcon = hTaskIcon;
259 }
260 if (hFolderIcon)
261 {
262 DestroyIcon(pGeneral->hFolderIcon);
263 pGeneral->hFolderIcon = hFolderIcon;
264 }
265 if (hClickIcon)
266 {
267 DestroyIcon(pGeneral->hClickIcon);
268 pGeneral->hClickIcon = hClickIcon;
269 }
270
271 if (nCtrlID == IDC_FOLDER_OPTIONS_SINGLECLICK)
272 {
275 }
276
277 if (nCtrlID == IDC_FOLDER_OPTIONS_DOUBLECLICK)
278 {
282 }
283}
284
285static void
286GeneralDlg_StoreToUI(HWND hwndDlg, BOOL bDoubleClick, BOOL bUseCommonTasks,
287 BOOL bUnderline, BOOL bNewWindowMode, PGENERAL_DIALOG pGeneral)
288{
289 if (bUseCommonTasks)
291 else
293
294 if (bDoubleClick)
296 else
298
299 if (bNewWindowMode)
301 else
303
304 if (!bDoubleClick)
305 {
308 if (bUnderline)
310 else
312 }
313 else
314 {
318 }
319}
320
321static BOOL
323{
324 BOOL bDoubleClick = TRUE;
325 BOOL bUseCommonTasks = FALSE;
326 BOOL bUnderline = IntGetUnderlineState();
327 BOOL bNewWindowMode = IntGetNewWindowMode();
328
329 IntGetShellStateSettings(bDoubleClick, bUseCommonTasks);
330
331 GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderline, bNewWindowMode, pGeneral);
332 GeneralDlg_UpdateIcons(hwndDlg, 0, pGeneral);
333
334 return TRUE;
335}
336
337static void
339{
340 // default values
341 BOOL bDoubleClick = TRUE;
342 BOOL bUseCommonTasks = FALSE;
343 BOOL bUnderline = FALSE;
344 BOOL bNewWindowMode = FALSE;
345
346 GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderline, bNewWindowMode, pGeneral);
347 GeneralDlg_UpdateIcons(hwndDlg, 0, pGeneral);
348}
349
350static BOOL
352{
354 BOOL bUseCommonTasks = (IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_COMMONTASKS) == BST_CHECKED);
356 BOOL bNewWindowMode = !(IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_SAMEWINDOW) == BST_CHECKED);
357
358 IntSetUnderlineState(bUnderline);
359 IntSetNewWindowMode(bNewWindowMode);
360 IntSetShellStateSettings(bDoubleClick, bUseCommonTasks);
361 return TRUE;
362}
363
366 HWND hwndDlg,
367 UINT uMsg,
370{
371 static GENERAL_DIALOG general;
372
373 switch (uMsg)
374 {
375 case WM_INITDIALOG:
376 general.hTaskIcon = NULL;
377 general.hFolderIcon = NULL;
378 general.hClickIcon = NULL;
379 return GeneralDlg_OnInitDialog(hwndDlg, &general);
380
381 case WM_COMMAND:
382 switch (LOWORD(wParam))
383 {
392 if (HIWORD(wParam) == BN_CLICKED)
393 {
394 GeneralDlg_UpdateIcons(hwndDlg, LOWORD(wParam), &general);
395
396 // Enable the 'Apply' button
397 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
398 }
399 break;
401 if (HIWORD(wParam) == BN_CLICKED)
402 {
403 GeneralDlg_OnRestoreDefaults(hwndDlg, &general);
404
405 // Enable the 'Apply' button
406 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
407 }
408 break;
409 }
410 break;
411
412 case WM_NOTIFY:
413 {
414 LPNMHDR pnmh = (LPNMHDR)lParam;
415
416 switch (pnmh->code)
417 {
418 case PSN_SETACTIVE:
419 break;
420
421 case PSN_APPLY:
422 return GeneralDlg_OnApply(hwndDlg, &general);
423 }
424 break;
425 }
426
427 case WM_DESTROY:
428 DestroyIcon(general.hTaskIcon);
429 DestroyIcon(general.hFolderIcon);
430 DestroyIcon(general.hClickIcon);
431 break;
432
433 default:
434 return FALSE;
435 }
436 return FALSE;
437}
#define shell32_hInstance
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#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 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 void IntGetDefaultShellState(REGSHELLSTATE &rss)
Definition: general.cpp:44
static BOOL IntGetNewWindowMode(VOID)
Definition: general.cpp:178
static BOOL IntGetUnderlineState(VOID)
Definition: general.cpp:153
#define REGSHELLSTATE_SIZE
Definition: general.cpp:32
static BOOL IntSetShellStateSettings(BOOL bDoubleClick, BOOL bUseCommonTasks)
Definition: general.cpp:70
static BOOL IntSetUnderlineState(BOOL bIconUnderline)
Definition: general.cpp:140
static BOOL GeneralDlg_OnInitDialog(HWND hwndDlg, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:322
struct GENERAL_DIALOG * PGENERAL_DIALOG
static const LPCWSTR s_pszExplorerKey
Definition: general.cpp:34
static BOOL IntGetShellStateSettings(BOOL &bDoubleClick, BOOL &bUseCommonTasks)
Definition: general.cpp:113
static VOID GeneralDlg_UpdateIcons(HWND hDlg, UINT nCtrlID, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:198
struct REGSHELLSTATE * PREGSHELLSTATE
static void GeneralDlg_OnRestoreDefaults(HWND hwndDlg, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:338
BOOL WINAPI SHSettingsChanged(LPCVOID unused, LPCVOID inpRegKey)
Definition: shpolicy.c:904
static BOOL IntSetNewWindowMode(BOOL bNewWindowMode)
Definition: general.cpp:168
static BOOL GeneralDlg_OnApply(HWND hwndDlg, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:351
INT_PTR CALLBACK FolderOptionsGeneralDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: general.cpp:365
struct REGSHELLSTATE REGSHELLSTATE
static void GeneralDlg_StoreToUI(HWND hwndDlg, BOOL bDoubleClick, BOOL bUseCommonTasks, BOOL bUnderline, BOOL bNewWindowMode, PGENERAL_DIALOG pGeneral)
Definition: general.cpp:286
#define cs
Definition: i386-dis.c:442
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HICON
Definition: imagelist.c:84
WORD unused[29]
Definition: crypt.c:1155
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 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 WM_NOTIFY
Definition: richedit.h:61
BOOL WINAPI ReadCabinetState(CABINETSTATE *cs, int length)
Definition: shellord.c:1620
BOOL WINAPI WriteCabinetState(CABINETSTATE *cs)
Definition: shellord.c:1667
#define SHRegSetUSValue
Definition: shlwapi.h:556
#define SHRegGetUSValue
Definition: shlwapi.h:534
#define SHREGSET_HKLM
Definition: shlwapi.h:313
#define SHREGSET_FORCE_HKCU
Definition: shlwapi.h:312
#define IDC_FOLDER_OPTIONS_CLASSICFOLDERS
Definition: shresdef.h:402
#define IDC_FOLDER_OPTIONS_ULBROWSER
Definition: shresdef.h:407
#define IDC_FOLDER_OPTIONS_SINGLECLICK
Definition: shresdef.h:405
#define IDC_FOLDER_OPTIONS_COMMONTASKS
Definition: shresdef.h:401
#define IDI_SHELL_OPEN_IN_SOME_WINDOW
Definition: shresdef.h:633
#define IDC_FOLDER_OPTIONS_SAMEWINDOW
Definition: shresdef.h:403
#define IDC_FOLDER_OPTIONS_FOLDERICON
Definition: shresdef.h:399
#define IDI_SHELL_OPEN_IN_NEW_WINDOW
Definition: shresdef.h:634
#define IDI_SHELL_CLASSIC_FOLDERS
Definition: shresdef.h:632
#define IDI_SHELL_SINGLE_CLICK_TO_OPEN
Definition: shresdef.h:635
#define IDC_FOLDER_OPTIONS_CLICKICON
Definition: shresdef.h:400
#define IDC_FOLDER_OPTIONS_DOUBLECLICK
Definition: shresdef.h:406
#define IDI_SHELL_DOUBLE_CLICK_TO_OPEN
Definition: shresdef.h:636
#define IDC_FOLDER_OPTIONS_TASKICON
Definition: shresdef.h:398
#define IDC_FOLDER_OPTIONS_ULPOINT
Definition: shresdef.h:408
#define IDC_FOLDER_OPTIONS_RESTORE
Definition: shresdef.h:409
#define IDC_FOLDER_OPTIONS_OWNWINDOW
Definition: shresdef.h:404
#define IDI_SHELL_SHOW_COMMON_TASKS
Definition: shresdef.h:631
HICON hFolderIcon
Definition: general.cpp:193
HICON hClickIcon
Definition: general.cpp:194
HICON hTaskIcon
Definition: general.cpp:192
DWORD dwSize
Definition: general.cpp:28
SHELLSTATE ss
Definition: general.cpp:29
BOOL fShowExtensions
Definition: shlobj.h:1471
BOOL fWebView
Definition: shlobj.h:1484
BOOL fShowCompColor
Definition: shlobj.h:1475
BOOL fShowInfoTip
Definition: shlobj.h:1482
UINT version
Definition: shlobj.h:1494
int iSortDirection
Definition: shlobj.h:1493
BOOL fShowAllObjects
Definition: shlobj.h:1470
BOOL fDoubleClickInWebView
Definition: shlobj.h:1476
BOOL fStartPanelOn
Definition: shlobj.h:1497
UINT code
Definition: winuser.h:3149
int32_t INT_PTR
Definition: typedefs.h:64
#define HIWORD(l)
Definition: typedefs.h:247
#define ZeroMemory
Definition: winbase.h:1700
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
CONST void * LPCVOID
Definition: windef.h:191
#define WINAPI
Definition: msvc.h:6
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define IMAGE_ICON
Definition: winuser.h:212
#define WM_COMMAND
Definition: winuser.h:1730
#define WM_INITDIALOG
Definition: winuser.h:1729
#define STM_SETIMAGE
Definition: winuser.h:2083
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
struct tagNMHDR * LPNMHDR
#define SendMessage
Definition: winuser.h:5833
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
HWND WINAPI GetParent(_In_ HWND)
#define LoadImage
Definition: winuser.h:5805
BOOL WINAPI CheckRadioButton(_In_ HWND, _In_ int, _In_ int, _In_ int)
#define LR_DEFAULTCOLOR
Definition: winuser.h:1081
#define BN_CLICKED
Definition: winuser.h:1915
#define WM_DESTROY
Definition: winuser.h:1599
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define BST_CHECKED
Definition: winuser.h:197
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
CHAR * LPTSTR
Definition: xmlstorage.h:192
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185