mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 09:43:04 +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;
|
shellstate.fWebView = !!bUseCommonTasks;
|
||||||
SHGetSetSettings(&shellstate, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE);
|
SHGetSetSettings(&shellstate, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE);
|
||||||
|
|
||||||
|
// FIXME: This is not correct, it does nothing. SHGetSetSettings will broadcast it.
|
||||||
SHSettingsChanged(0, L"ShellState");
|
SHSettingsChanged(0, L"ShellState");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -107,7 +108,7 @@ static BOOL IntSetUnderlineState(BOOL bIconUnderline)
|
||||||
if (Status != ERROR_SUCCESS)
|
if (Status != ERROR_SUCCESS)
|
||||||
return FALSE;
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -942,8 +942,11 @@ ViewDlg_Apply(HWND hwndDlg)
|
||||||
// update user's settings
|
// update user's settings
|
||||||
SHGetSetSettings(&ShellState, dwMask, TRUE);
|
SHGetSetSettings(&ShellState, dwMask, TRUE);
|
||||||
|
|
||||||
|
// invalidate cached restrictions
|
||||||
|
SHSettingsChanged(0, 0);
|
||||||
|
|
||||||
// notify all
|
// notify all
|
||||||
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);
|
SHSendMessageBroadcastW(WM_WININICHANGE, 0, 0);
|
||||||
|
|
||||||
PostCabinetMessage(WM_COMMAND, FCIDM_DESKBROWSER_REFRESH, 0);
|
PostCabinetMessage(WM_COMMAND, FCIDM_DESKBROWSER_REFRESH, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -345,10 +345,10 @@ HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE
|
||||||
switch(LOWORD(lParam))
|
switch(LOWORD(lParam))
|
||||||
{
|
{
|
||||||
case CONTROLPANEL_COL_NAME:
|
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;
|
break;
|
||||||
case CONTROLPANEL_COL_COMMENT:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
ERR("Got wrong lParam!\n");
|
ERR("Got wrong lParam!\n");
|
||||||
|
|
|
@ -1127,7 +1127,7 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam,
|
||||||
switch (LOWORD(lParam))
|
switch (LOWORD(lParam))
|
||||||
{
|
{
|
||||||
case SHFSF_COL_NAME:
|
case SHFSF_COL_NAME:
|
||||||
result = _wcsicmp(pszName1, pszName2);
|
result = CompareUiStrings(pszName1, pszName2, lParam);
|
||||||
break;
|
break;
|
||||||
case SHFSF_COL_SIZE:
|
case SHFSF_COL_SIZE:
|
||||||
if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize)
|
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
|
// FIXME: Compare the type strings from SHGetFileInfo
|
||||||
pExtension1 = PathFindExtensionW(pszName1);
|
pExtension1 = PathFindExtensionW(pszName1);
|
||||||
pExtension2 = PathFindExtensionW(pszName2);
|
pExtension2 = PathFindExtensionW(pszName2);
|
||||||
result = _wcsicmp(pExtension1, pExtension2);
|
result = CompareUiStrings(pExtension1, pExtension2, lParam);
|
||||||
break;
|
break;
|
||||||
case SHFSF_COL_MDATE:
|
case SHFSF_COL_MDATE:
|
||||||
result = pData1->u.file.uFileDate - pData2->u.file.uFileDate;
|
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 FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf);
|
||||||
static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf);
|
static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf);
|
||||||
static HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
|
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);
|
return CompareCanonical(*pData1, *pData2);
|
||||||
pName1 = GetItemOriginalFileName(*pData1);
|
pName1 = GetItemOriginalFileName(*pData1);
|
||||||
pName2 = GetItemOriginalFileName(*pData2);
|
pName2 = GetItemOriginalFileName(*pData2);
|
||||||
result = CFSFolder::CompareUiStrings(pName1, pName2);
|
result = CFSFolder::CompareUiStrings(pName1, pName2, lParam);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -782,7 +782,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1,
|
||||||
{
|
{
|
||||||
if (SUCCEEDED(hr = GetItemOriginalFolder(*pData2, const_cast<LPWSTR&>(pName2))))
|
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>(pName2));
|
||||||
}
|
}
|
||||||
SHFree(const_cast<LPWSTR>(pName1));
|
SHFree(const_cast<LPWSTR>(pName1));
|
||||||
|
@ -797,7 +797,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1,
|
||||||
case COLUMN_TYPE:
|
case COLUMN_TYPE:
|
||||||
GetItemTypeName(pidl1, *pData1, shfi1);
|
GetItemTypeName(pidl1, *pData1, shfi1);
|
||||||
GetItemTypeName(pidl2, *pData2, shfi2);
|
GetItemTypeName(pidl2, *pData2, shfi2);
|
||||||
result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName);
|
result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName, lParam);
|
||||||
break;
|
break;
|
||||||
case COLUMN_MTIME:
|
case COLUMN_MTIME:
|
||||||
_ILGetFileDateTime(pidl1, &ft1);
|
_ILGetFileDateTime(pidl1, &ft1);
|
||||||
|
|
|
@ -431,6 +431,7 @@ LRESULT CDesktopBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam
|
||||||
LPVOID lpEnvironment;
|
LPVOID lpEnvironment;
|
||||||
RegenerateUserEnvironment(&lpEnvironment, TRUE);
|
RegenerateUserEnvironment(&lpEnvironment, TRUE);
|
||||||
}
|
}
|
||||||
|
SHSettingsChanged((LPCVOID)wParam, (PCWSTR)lParam); // Invalidate cached restrictions
|
||||||
|
|
||||||
if (m_hWndShellView)
|
if (m_hWndShellView)
|
||||||
{
|
{
|
||||||
|
|
|
@ -307,7 +307,7 @@ HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST
|
||||||
if (FAILED(hres))
|
if (FAILED(hres))
|
||||||
return MAKE_COMPARE_HRESULT(1);
|
return MAKE_COMPARE_HRESULT(1);
|
||||||
|
|
||||||
int ret = _wcsicmp(wszItem1, wszItem2);
|
int ret = CFSFolder::CompareUiStrings(wszItem1, wszItem2, lParam);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);
|
return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
extern HMODULE huser32 DECLSPEC_HIDDEN;
|
extern HMODULE huser32 DECLSPEC_HIDDEN;
|
||||||
extern HINSTANCE shell32_hInstance 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);
|
BOOL WINAPI Shell_GetImageLists(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList);
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
#include <initguid.h>
|
#include <initguid.h>
|
||||||
#include <shlwapi_undoc.h>
|
#include <shlwapi_undoc.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
#include <wine/debug.h>
|
#include <wine/debug.h>
|
||||||
|
|
||||||
#include "shell32_main.h"
|
#include "shell32_main.h"
|
||||||
|
@ -66,6 +67,21 @@ HANDLE g_hRestGlobalCounter = NULL;
|
||||||
LONG g_nRestCountValue = -1;
|
LONG g_nRestCountValue = -1;
|
||||||
DWORD g_RestValues[_countof(s_PolicyTable)] = { 0 };
|
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
|
* 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 restrictions from registry have changed, reset all cached values to SHELL_NO_POLICY */
|
||||||
if (SHELL_QueryRestrictionsChanged())
|
if (SHELL_QueryRestrictionsChanged())
|
||||||
|
{
|
||||||
FillMemory(&g_RestValues, sizeof(g_RestValues), 0xFF);
|
FillMemory(&g_RestValues, sizeof(g_RestValues), 0xFF);
|
||||||
|
SH32_RestrictionsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
return SHRestrictionLookup(rest, NULL, s_PolicyTable, g_RestValues);
|
return SHRestrictionLookup(rest, NULL, s_PolicyTable, g_RestValues);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue