mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 11:11:44 +00:00
[SHELL32] Respect StrCmpLogicalW policy in shell folders (#7900)
This commit is contained in:
parent
4514e748f0
commit
fb6191b71a
10 changed files with 39 additions and 12 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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<LPWSTR&>(pName2))))
|
||||
{
|
||||
result = CFSFolder::CompareUiStrings(pName1, pName2);
|
||||
result = CFSFolder::CompareUiStrings(pName1, pName2, lParam);
|
||||
SHFree(const_cast<LPWSTR>(pName2));
|
||||
}
|
||||
SHFree(const_cast<LPWSTR>(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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <shlobj.h>
|
||||
#include <initguid.h>
|
||||
#include <shlwapi_undoc.h>
|
||||
#include <shlwapi.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue