- Reading items must update the struct field even if the registry is empty. - Adds write support for the important items.
From: anders andersdev@proton.me
- Reading items must update the struct field even if the registry is empty. - Adds write support for the important items. --- dlls/shell32/shellord.c | 125 +++++++++++++++++++++++++++++++++------ dlls/shell32/shfldr_fs.c | 12 +--- include/shlobj.h | 11 +++- 3 files changed, 120 insertions(+), 28 deletions(-)
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c index a007c0e5c60..7488beda793 100644 --- a/dlls/shell32/shellord.c +++ b/dlls/shell32/shellord.c @@ -247,18 +247,104 @@ BOOL WINAPI GetFileNameFromBrowseAW( return GetFileNameFromBrowseA(hwndOwner, lpstrFile, nMaxFile, lpstrInitialDir, lpstrDefExt, lpstrFilter, lpstrTitle); }
+static DWORD ReadSetting(HKEY hKey, LPCSTR pszName, DWORD dwDefault) +{ + DWORD dwData = 0, dwDataSize = sizeof(dwData); + if (hKey && !RegQueryValueExA(hKey, pszName, 0, 0, (LPBYTE)&dwData, &dwDataSize)) + return dwData; + return dwDefault; +} + /************************************************************************* * SHGetSetSettings [SHELL32.68] */ VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet) { + static const CHAR szSubKey[] = "Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"; + const UINT fAdvanced = SSF_SHOWSUPERHIDDEN | SSF_SHOWCOMPCOLOR | \ + SSF_AUTOCHECKSELECT | SSF_ICONSONLY; + HKEY hKey; + DWORD dwData; + C_ASSERT(sizeof(SHELLSTATE) == 32); + C_ASSERT(FIELD_OFFSET(SHELLSTATE, lParamSort) == 12); + if(bSet) { - FIXME("%p 0x%08lx TRUE\n", lpss, dwMask); + const UINT fAdvancedWrite = fAdvanced | SSF_SHOWALLOBJECTS | SSF_SHOWEXTENSIONS; + + TRACE("%p 0x%08lx TRUE\n", lpss, dwMask); + if (!lpss) + { + /* TODO: Increment GLOBALCOUNTER_SHELLSETTINGSCHANGED */ + return; + } + + if (RegCreateKeyExA(HKEY_CURRENT_USER, szSubKey, 0, 0, 0, KEY_WRITE, 0, &hKey, 0)) + return; + + if (dwMask & SSF_SHOWALLOBJECTS) + { + dwData = lpss->fShowAllObjects ? 1 : 2; + RegSetValueExA(hKey, "Hidden", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(dwData)); + } + if (dwMask & SSF_SHOWEXTENSIONS) + { + dwData = lpss->fShowExtensions ? 0 : 1; /* Reversed logic */ + RegSetValueExA(hKey, "HideFileExt", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(dwData)); + } + if (dwMask & SSF_SHOWCOMPCOLOR) + { + dwData = lpss->fShowCompColor != FALSE; + RegSetValueExA(hKey, "ShowCompColor", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(dwData)); + } + if (dwMask & SSF_SHOWSUPERHIDDEN) + { + dwData = lpss->fShowSuperHidden != FALSE; + RegSetValueExA(hKey, "ShowSuperHidden", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(dwData)); + } + if (dwMask & SSF_AUTOCHECKSELECT) + { + dwData = lpss->fAutoCheckSelect != FALSE; + RegSetValueExA(hKey, "AutoCheckSelect", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(dwData)); + } + if (dwMask & SSF_ICONSONLY) + { + dwData = lpss->fIconsOnly != FALSE; + RegSetValueExA(hKey, "IconsOnly", 0, REG_DWORD, (LPBYTE)&dwData, sizeof(dwData)); + } + + if (dwMask & fAdvancedWrite) + { + SHGetSetSettings(NULL, 0, TRUE); /* Update global counter */ + SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"ShellState", + SMTO_ABORTIFHUNG, 1000 * 2, NULL); + } + RegCloseKey(hKey); } else { SHGetSettings((LPSHELLFLAGSTATE)lpss,dwMask); + + if (dwMask & SSF_STARTPANELON) + { + lpss->fStartPanelOn = TRUE; /* New start menu is on by default (and always on in Win7+) */ + lpss->fShowStartPage = FALSE; /* Whistler beta feature, always off */ + } + + if (!(dwMask & fAdvanced) || RegOpenKeyExA(HKEY_CURRENT_USER, szSubKey, 0, KEY_READ, &hKey)) + hKey = NULL; + + if (dwMask & SSF_SHOWCOMPCOLOR) + lpss->fShowCompColor = ReadSetting(hKey, "ShowCompColor", 0) != FALSE; + if (dwMask & SSF_SHOWSUPERHIDDEN) + lpss->fShowSuperHidden = ReadSetting(hKey, "ShowSuperHidden", 0) != FALSE; + if (dwMask & SSF_AUTOCHECKSELECT) + lpss->fAutoCheckSelect = ReadSetting(hKey, "AutoCheckSelect", 0) != FALSE; + if (dwMask & SSF_ICONSONLY) + lpss->fIconsOnly = ReadSetting(hKey, "IconsOnly", 0) != FALSE; + + if (hKey) + RegCloseKey(hKey); } }
@@ -274,34 +360,36 @@ VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask) { HKEY hKey; DWORD dwData; - DWORD dwDataSize = sizeof (DWORD); + C_ASSERT(sizeof(SHELLFLAGSTATE) == 4);
TRACE("(%p 0x%08lx)\n",lpsfs,dwMask);
if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0)) - return; + hKey = NULL;
- if ( (SSF_SHOWEXTENSIONS & dwMask) && !RegQueryValueExA(hKey, "HideFileExt", 0, 0, (LPBYTE)&dwData, &dwDataSize)) - lpsfs->fShowExtensions = ((dwData == 0) ? 0 : 1); + if (SSF_SHOWEXTENSIONS & dwMask) + lpsfs->fShowExtensions = ReadSetting(hKey, "HideFileExt", 0) == FALSE; /* Reversed logic */
- if ( (SSF_SHOWINFOTIP & dwMask) && !RegQueryValueExA(hKey, "ShowInfoTip", 0, 0, (LPBYTE)&dwData, &dwDataSize)) - lpsfs->fShowInfoTip = ((dwData == 0) ? 0 : 1); + if (SSF_SHOWINFOTIP & dwMask) + lpsfs->fShowInfoTip = ReadSetting(hKey, "ShowInfoTip", 0) != FALSE;
- if ( (SSF_DONTPRETTYPATH & dwMask) && !RegQueryValueExA(hKey, "DontPrettyPath", 0, 0, (LPBYTE)&dwData, &dwDataSize)) - lpsfs->fDontPrettyPath = ((dwData == 0) ? 0 : 1); + if (SSF_DONTPRETTYPATH & dwMask) + lpsfs->fDontPrettyPath = ReadSetting(hKey, "DontPrettyPath", 0) != FALSE;
- if ( (SSF_HIDEICONS & dwMask) && !RegQueryValueExA(hKey, "HideIcons", 0, 0, (LPBYTE)&dwData, &dwDataSize)) - lpsfs->fHideIcons = ((dwData == 0) ? 0 : 1); + if (SSF_HIDEICONS & dwMask) + lpsfs->fHideIcons = ReadSetting(hKey, "HideIcons", 0) != FALSE;
- if ( (SSF_MAPNETDRVBUTTON & dwMask) && !RegQueryValueExA(hKey, "MapNetDrvBtn", 0, 0, (LPBYTE)&dwData, &dwDataSize)) - lpsfs->fMapNetDrvBtn = ((dwData == 0) ? 0 : 1); + if (SSF_MAPNETDRVBUTTON & dwMask) + lpsfs->fMapNetDrvBtn = ReadSetting(hKey, "MapNetDrvBtn", 0) != FALSE;
- if ( (SSF_SHOWATTRIBCOL & dwMask) && !RegQueryValueExA(hKey, "ShowAttribCol", 0, 0, (LPBYTE)&dwData, &dwDataSize)) - lpsfs->fShowAttribCol = ((dwData == 0) ? 0 : 1); + if (SSF_SHOWATTRIBCOL & dwMask) + lpsfs->fShowAttribCol = ReadSetting(hKey, "ShowAttribCol", 0) != FALSE;
- if (((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) && !RegQueryValueExA(hKey, "Hidden", 0, 0, (LPBYTE)&dwData, &dwDataSize)) - { if (dwData == 0) + if ((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) + { + dwData = ReadSetting(hKey, "Hidden", 0); + if (dwData == 0) { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0; if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0; } @@ -314,7 +402,8 @@ VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask) if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = -1; } } - RegCloseKey (hKey); + if (hKey) + RegCloseKey (hKey);
TRACE("-- 0x%04x\n", *(WORD*)lpsfs); } diff --git a/dlls/shell32/shfldr_fs.c b/dlls/shell32/shfldr_fs.c index bc3cb000f0e..ff582a19c01 100644 --- a/dlls/shell32/shfldr_fs.c +++ b/dlls/shell32/shfldr_fs.c @@ -754,16 +754,10 @@ IShellFolder_fnGetUIObjectOf (IShellFolder2 * iface, static BOOL SHELL_FS_HideExtension(LPCWSTR szPath) { HKEY hKey; - DWORD dwData; - DWORD dwDataSize = sizeof (DWORD); BOOL doHide = FALSE; /* The default value is FALSE (win98 at least) */ - - if (!RegCreateKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced", - 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0)) { - if (!RegQueryValueExW(hKey, L"HideFileExt", 0, 0, (LPBYTE) &dwData, &dwDataSize)) - doHide = dwData; - RegCloseKey (hKey); - } + SHELLFLAGSTATE shellstate; + SHGetSettings(&shellstate, SSF_SHOWEXTENSIONS); + doHide = !shellstate.fShowExtensions;
if (!doHide) { LPWSTR ext = PathFindExtensionW(szPath); diff --git a/include/shlobj.h b/include/shlobj.h index 327ab981648..6bfa3144fd2 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -1203,10 +1203,15 @@ typedef struct BOOL fSepProcess: 1; BOOL fStartPanelOn: 1; BOOL fShowStartPage: 1; - UINT fSpareFlags : 13; + BOOL fAutoCheckSelect : 1; + BOOL fIconsOnly : 1; + BOOL fShowTypeOverlay : 1; + UINT fSpareFlags : 10; UINT :15; /* Required for proper binary layout with gcc */ } SHELLSTATE, *LPSHELLSTATE;
+WINSHELLAPI VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet); + /********************************************************************** * SHGetSettings () */ @@ -1246,6 +1251,10 @@ WINSHELLAPI VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask); #define SSF_MAPNETDRVBUTTON 0x1000 #define SSF_NOCONFIRMRECYCLE 0x8000 #define SSF_HIDEICONS 0x4000 +#define SSF_SHOWSUPERHIDDEN 0x00040000 +#define SSF_STARTPANELON 0x00200000 +#define SSF_AUTOCHECKSELECT 0x00800000 +#define SSF_ICONSONLY 0x01000000
/**************************************************************************** * SHRestricted API