diff --git a/dll/win32/shell32/dialogs/general.cpp b/dll/win32/shell32/dialogs/general.cpp index e809a12d5ef..60d304f7404 100644 --- a/dll/win32/shell32/dialogs/general.cpp +++ b/dll/win32/shell32/dialogs/general.cpp @@ -72,6 +72,7 @@ IntSetShellStateSettings(BOOL bDoubleClick, BOOL bUseCommonTasks) shellstate.fWebView = !!bUseCommonTasks; SHGetSetSettings(&shellstate, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE); + // FIXME: This is not correct, it does nothing. SHGetSetSettings will broadcast it. SHSettingsChanged(0, L"ShellState"); return TRUE; } @@ -107,7 +108,7 @@ static BOOL IntSetUnderlineState(BOOL bIconUnderline) if (Status != ERROR_SUCCESS) return FALSE; - SHSettingsChanged(0, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\IconUnderline"); + SHSendMessageBroadcastW(WM_SETTINGCHANGE, 0, (LPARAM)L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\IconUnderline"); return TRUE; } diff --git a/dll/win32/shell32/dialogs/view.cpp b/dll/win32/shell32/dialogs/view.cpp index 87f4c270497..a455e445ab4 100644 --- a/dll/win32/shell32/dialogs/view.cpp +++ b/dll/win32/shell32/dialogs/view.cpp @@ -942,8 +942,11 @@ ViewDlg_Apply(HWND hwndDlg) // update user's settings SHGetSetSettings(&ShellState, dwMask, TRUE); + // invalidate cached restrictions + SHSettingsChanged(0, 0); + // notify all - SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0); + SHSendMessageBroadcastW(WM_WININICHANGE, 0, 0); PostCabinetMessage(WM_COMMAND, FCIDM_DESKBROWSER_REFRESH, 0); } diff --git a/dll/win32/shell32/folders/CControlPanelFolder.cpp b/dll/win32/shell32/folders/CControlPanelFolder.cpp index f66018e9fd0..706be10390e 100644 --- a/dll/win32/shell32/folders/CControlPanelFolder.cpp +++ b/dll/win32/shell32/folders/CControlPanelFolder.cpp @@ -345,10 +345,10 @@ HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE switch(LOWORD(lParam)) { case CONTROLPANEL_COL_NAME: - result = _wcsicmp(pData1->szName + pData1->offsDispName, pData2->szName + pData2->offsDispName); + result = SHELL_StrCmpLogical(pData1->szName + pData1->offsDispName, pData2->szName + pData2->offsDispName); break; case CONTROLPANEL_COL_COMMENT: - result = _wcsicmp(pData1->szName + pData1->offsComment, pData2->szName + pData2->offsComment); + result = SHELL_StrCmpLogical(pData1->szName + pData1->offsComment, pData2->szName + pData2->offsComment); break; default: ERR("Got wrong lParam!\n"); diff --git a/dll/win32/shell32/folders/CFSFolder.cpp b/dll/win32/shell32/folders/CFSFolder.cpp index 1a9161c273d..bc59d820902 100644 --- a/dll/win32/shell32/folders/CFSFolder.cpp +++ b/dll/win32/shell32/folders/CFSFolder.cpp @@ -1127,7 +1127,7 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam, switch (LOWORD(lParam)) { case SHFSF_COL_NAME: - result = _wcsicmp(pszName1, pszName2); + result = CompareUiStrings(pszName1, pszName2, lParam); break; case SHFSF_COL_SIZE: if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize) @@ -1141,7 +1141,7 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam, // FIXME: Compare the type strings from SHGetFileInfo pExtension1 = PathFindExtensionW(pszName1); pExtension2 = PathFindExtensionW(pszName2); - result = _wcsicmp(pExtension1, pExtension2); + result = CompareUiStrings(pExtension1, pExtension2, lParam); break; case SHFSF_COL_MDATE: result = pData1->u.file.uFileDate - pData2->u.file.uFileDate; diff --git a/dll/win32/shell32/folders/CFSFolder.h b/dll/win32/shell32/folders/CFSFolder.h index 79f9c2c17e5..654b80593ec 100644 --- a/dll/win32/shell32/folders/CFSFolder.h +++ b/dll/win32/shell32/folders/CFSFolder.h @@ -133,9 +133,11 @@ class CFSFolder : static HRESULT FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf); static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf); static HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); - static inline int CompareUiStrings(LPCWSTR a, LPCWSTR b) + static inline int CompareUiStrings(LPCWSTR a, LPCWSTR b, LPARAM lParam = 0) { - return StrCmpLogicalW(a, b); + if (lParam & SHCIDS_CANONICALONLY) + return _wcsicmp(a, b); + return SHELL_StrCmpLogical(a, b); } }; diff --git a/dll/win32/shell32/folders/CRecycleBin.cpp b/dll/win32/shell32/folders/CRecycleBin.cpp index 5f4e0e0bd2b..ec5b35dbcc2 100644 --- a/dll/win32/shell32/folders/CRecycleBin.cpp +++ b/dll/win32/shell32/folders/CRecycleBin.cpp @@ -762,7 +762,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, return CompareCanonical(*pData1, *pData2); pName1 = GetItemOriginalFileName(*pData1); pName2 = GetItemOriginalFileName(*pData2); - result = CFSFolder::CompareUiStrings(pName1, pName2); + result = CFSFolder::CompareUiStrings(pName1, pName2, lParam); } else { @@ -782,7 +782,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, { if (SUCCEEDED(hr = GetItemOriginalFolder(*pData2, const_cast(pName2)))) { - result = CFSFolder::CompareUiStrings(pName1, pName2); + result = CFSFolder::CompareUiStrings(pName1, pName2, lParam); SHFree(const_cast(pName2)); } SHFree(const_cast(pName1)); @@ -797,7 +797,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, case COLUMN_TYPE: GetItemTypeName(pidl1, *pData1, shfi1); GetItemTypeName(pidl2, *pData2, shfi2); - result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName); + result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName, lParam); break; case COLUMN_MTIME: _ILGetFileDateTime(pidl1, &ft1); diff --git a/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp b/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp index d14c1c15626..e443a233e03 100644 --- a/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp +++ b/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp @@ -431,6 +431,7 @@ LRESULT CDesktopBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam LPVOID lpEnvironment; RegenerateUserEnvironment(&lpEnvironment, TRUE); } + SHSettingsChanged((LPCVOID)wParam, (PCWSTR)lParam); // Invalidate cached restrictions if (m_hWndShellView) { diff --git a/dll/win32/shell32/shlfolder.cpp b/dll/win32/shell32/shlfolder.cpp index 268eadb238a..04dcbcc3232 100644 --- a/dll/win32/shell32/shlfolder.cpp +++ b/dll/win32/shell32/shlfolder.cpp @@ -307,7 +307,7 @@ HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); - int ret = _wcsicmp(wszItem1, wszItem2); + int ret = CFSFolder::CompareUiStrings(wszItem1, wszItem2, lParam); if (ret == 0) return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2); diff --git a/dll/win32/shell32/wine/shell32_main.h b/dll/win32/shell32/wine/shell32_main.h index ec6c1f5d01c..a8a7f9cd72e 100644 --- a/dll/win32/shell32/wine/shell32_main.h +++ b/dll/win32/shell32/wine/shell32_main.h @@ -35,6 +35,7 @@ extern "C" { */ extern HMODULE huser32 DECLSPEC_HIDDEN; extern HINSTANCE shell32_hInstance DECLSPEC_HIDDEN; +extern int (WINAPI* SHELL_StrCmpLogical)(PCWSTR s1, PCWSTR s2); BOOL WINAPI Shell_GetImageLists(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList); diff --git a/dll/win32/shell32/wine/shpolicy.c b/dll/win32/shell32/wine/shpolicy.c index aef236fa321..8753f8cb573 100644 --- a/dll/win32/shell32/wine/shpolicy.c +++ b/dll/win32/shell32/wine/shpolicy.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include "shell32_main.h" @@ -66,6 +67,21 @@ HANDLE g_hRestGlobalCounter = NULL; LONG g_nRestCountValue = -1; DWORD g_RestValues[_countof(s_PolicyTable)] = { 0 }; +#ifdef __REACTOS__ +int WINAPI SHELL_StrCmpLogicalInit(PCWSTR s1, PCWSTR s2) +{ + SHELL_StrCmpLogical = SHRestricted(REST_NOSTRCMPLOGICAL) ? StrCmpIW : StrCmpLogicalW; + return SHELL_StrCmpLogical(s1, s2); +} + +int (WINAPI* SHELL_StrCmpLogical)(PCWSTR s1, PCWSTR s2) = SHELL_StrCmpLogicalInit; + +static void SH32_RestrictionsChanged() +{ + SHELL_StrCmpLogical = SHELL_StrCmpLogicalInit; +} +#endif + /**************************************************************************** * SHELL_GetCachedGlobalCounter * @@ -153,7 +169,10 @@ DWORD WINAPI SHRestricted (RESTRICTIONS rest) /* If restrictions from registry have changed, reset all cached values to SHELL_NO_POLICY */ if (SHELL_QueryRestrictionsChanged()) + { FillMemory(&g_RestValues, sizeof(g_RestValues), 0xFF); + SH32_RestrictionsChanged(); + } return SHRestrictionLookup(rest, NULL, s_PolicyTable, g_RestValues); }