mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 09:23:06 +00:00
[SHELL32][EXPLORER][SHLWAPI][SDK] Implement SHGetSetSettings (#6982)
These settings are cached per-process (and invalidated by the global counter). This should reduce the number of registry reads performed by DefView and CFSFolder.
This commit is contained in:
parent
80c170d7bc
commit
71a3be2497
11 changed files with 332 additions and 136 deletions
|
@ -1563,10 +1563,14 @@ typedef struct
|
|||
int iSortDirection;
|
||||
UINT version;
|
||||
UINT uNotUsed;
|
||||
BOOL fSepProcess: 1;
|
||||
BOOL fStartPanelOn: 1;
|
||||
BOOL fShowStartPage: 1;
|
||||
UINT fSpareFlags : 13;
|
||||
BOOL fSepProcess : 1;
|
||||
BOOL fStartPanelOn : 1;
|
||||
BOOL fShowStartPage : 1;
|
||||
BOOL fAutoCheckSelect : 1; // Vista+
|
||||
BOOL fIconsOnly : 1;
|
||||
BOOL fShowTypeOverlay : 1;
|
||||
BOOL fShowStatusBar : 1; // 8+
|
||||
UINT fSpareFlags : 9;
|
||||
UINT :15; /* Required for proper binary layout with gcc */
|
||||
} SHELLSTATE, *LPSHELLSTATE;
|
||||
|
||||
|
@ -1580,51 +1584,53 @@ typedef struct
|
|||
BOOL fShowExtensions : 1;
|
||||
BOOL fNoConfirmRecycle : 1;
|
||||
BOOL fShowSysFiles : 1;
|
||||
|
||||
BOOL fShowCompColor : 1;
|
||||
BOOL fDoubleClickInWebView : 1;
|
||||
BOOL fDesktopHTML : 1;
|
||||
BOOL fWin95Classic : 1;
|
||||
|
||||
BOOL fDontPrettyPath : 1;
|
||||
BOOL fShowAttribCol : 1;
|
||||
BOOL fMapNetDrvBtn : 1;
|
||||
BOOL fShowInfoTip : 1;
|
||||
|
||||
BOOL fHideIcons : 1;
|
||||
UINT fRestFlags : 3;
|
||||
BOOL fAutoCheckSelect : 1;
|
||||
BOOL fIconsOnly : 1;
|
||||
UINT fRestFlags : 1;
|
||||
UINT :15; /* Required for proper binary layout with gcc */
|
||||
} SHELLFLAGSTATE, * LPSHELLFLAGSTATE;
|
||||
|
||||
VOID WINAPI SHGetSettings(_Out_ LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
|
||||
|
||||
#define SSF_SHOWALLOBJECTS 0x0001
|
||||
#define SSF_SHOWEXTENSIONS 0x0002
|
||||
#define SSF_SHOWCOMPCOLOR 0x0008
|
||||
#define SSF_SHOWSYSFILES 0x0020
|
||||
#define SSF_DOUBLECLICKINWEBVIEW 0x0080
|
||||
#define SSF_SHOWATTRIBCOL 0x0100
|
||||
#define SSF_DESKTOPHTML 0x0200
|
||||
#define SSF_WIN95CLASSIC 0x0400
|
||||
#define SSF_DONTPRETTYPATH 0x0800
|
||||
#define SSF_SHOWINFOTIP 0x2000
|
||||
#define SSF_MAPNETDRVBUTTON 0x1000
|
||||
#define SSF_NOCONFIRMRECYCLE 0x8000
|
||||
#define SSF_HIDEICONS 0x4000
|
||||
#define SSF_SHOWSUPERHIDDEN 0x00040000
|
||||
#define SSF_SEPPROCESS 0x00080000
|
||||
#define SSF_SHOWALLOBJECTS 0x00000001
|
||||
#define SSF_SHOWEXTENSIONS 0x00000002
|
||||
#define SSF_SHOWCOMPCOLOR 0x00000008
|
||||
#define SSF_SORTCOLUMNS 0x00000010
|
||||
#define SSF_SHOWSYSFILES 0x00000020
|
||||
#define SSF_DOUBLECLICKINWEBVIEW 0x00000080
|
||||
#define SSF_SHOWATTRIBCOL 0x00000100
|
||||
#define SSF_DESKTOPHTML 0x00000200
|
||||
#define SSF_WIN95CLASSIC 0x00000400
|
||||
#define SSF_DONTPRETTYPATH 0x00000800
|
||||
#define SSF_MAPNETDRVBUTTON 0x00001000
|
||||
#define SSF_SHOWINFOTIP 0x00002000
|
||||
#define SSF_HIDEICONS 0x00004000
|
||||
#define SSF_NOCONFIRMRECYCLE 0x00008000
|
||||
#define SSF_FILTER 0x00010000
|
||||
#define SSF_WEBVIEW 0x00020000
|
||||
#define SSF_SHOWSUPERHIDDEN 0x00040000
|
||||
#define SSF_SEPPROCESS 0x00080000
|
||||
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
||||
#define SSF_NONETCRAWLING 0x00100000
|
||||
#define SSF_STARTPANELON 0x00200000
|
||||
#define SSF_SHOWSTARTPAGE 0x00400000
|
||||
#define SSF_NONETCRAWLING 0x00100000
|
||||
#define SSF_STARTPANELON 0x00200000
|
||||
#define SSF_SHOWSTARTPAGE 0x00400000
|
||||
#endif
|
||||
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
||||
#define SSF_AUTOCHECKSELECT 0x00800000
|
||||
#define SSF_ICONSONLY 0x01000000
|
||||
#define SSF_SHOWTYPEOVERLAY 0x02000000
|
||||
#define SSF_AUTOCHECKSELECT 0x00800000
|
||||
#define SSF_ICONSONLY 0x01000000
|
||||
#define SSF_SHOWTYPEOVERLAY 0x02000000
|
||||
#endif
|
||||
#if (NTDDI_VERSION >= NTDDI_WIN8)
|
||||
#define SSF_SHOWSTATUSBAR 0x04000000
|
||||
#define SSF_SHOWSTATUSBAR 0x04000000
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
@ -783,5 +783,17 @@ DataObject_SetOffset(IDataObject* pDataObject, POINT* point)
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
struct SHELL_GetSettingImpl
|
||||
{
|
||||
SHELLSTATE ss;
|
||||
SHELL_GetSettingImpl(DWORD ssf) { SHGetSetSettings(&ss, ssf, FALSE); }
|
||||
const SHELLSTATE* operator ->() { return &ss; }
|
||||
};
|
||||
#define SHELL_GetSetting(ssf, field) ( SHELL_GetSettingImpl(ssf)->field )
|
||||
#else
|
||||
#define SHELL_GetSetting(pss, ssf, field) ( SHGetSetSettings((pss), (ssf), FALSE), (pss)->field )
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __ROS_SHELL_UTILS_H */
|
||||
|
|
|
@ -39,6 +39,29 @@ PVOID WINAPI SHInterlockedCompareExchange(PVOID *dest, PVOID xchg, PVOID compare
|
|||
LONG WINAPI SHGlobalCounterGetValue(HANDLE hGlobalCounter);
|
||||
LONG WINAPI SHGlobalCounterIncrement(HANDLE hGlobalCounter);
|
||||
|
||||
#if FALSE && ((DLL_EXPORT_VERSION) >= _WIN32_WINNT_VISTA)
|
||||
#define SHELL_GCOUNTER_DEFINE_GUID(name, a, b, c, d, e, f, g, h, i, j, k) enum { SHELLUNUSEDCOUNTERGUID_##name }
|
||||
#define SHELL_GCOUNTER_DEFINE_HANDLE(name) enum { SHELLUNUSEDCOUNTERHANDLE_##name }
|
||||
#define SHELL_GCOUNTER_PARAMETERS(handle, id) id
|
||||
#define SHELL_GlobalCounterCreate(refguid, handle) ( (refguid), (handle), (void)0 )
|
||||
#define SHELL_GlobalCounterIsInitialized(handle) ( (handle), TRUE )
|
||||
#define SHELL_GlobalCounterGet(id) SHGlobalCounterGetValue_Vista(id)
|
||||
#define SHELL_GlobalCounterIncrement(id) SHGlobalCounterIncrement_Vista(id)
|
||||
#else
|
||||
#define SHELL_GCOUNTER_DEFINE_GUID(name, a, b, c, d, e, f, g, h, i, j, k) const GUID name = { a, b, c, { d, e, f, g, h, i, j, k } }
|
||||
#define SHELL_GCOUNTER_DEFINE_HANDLE(name) HANDLE name = NULL
|
||||
#define SHELL_GCOUNTER_PARAMETERS(handle, id) handle
|
||||
#define SHELL_GlobalCounterCreate(refguid, handle) \
|
||||
do { \
|
||||
EXTERN_C HANDLE SHELL_GetCachedGlobalCounter(HANDLE *phGlobalCounter, REFGUID rguid); \
|
||||
SHELL_GetCachedGlobalCounter(&(handle), (refguid)); \
|
||||
} while (0)
|
||||
#define SHELL_GlobalCounterIsInitialized(handle) ( (handle) != NULL )
|
||||
#define SHELL_GlobalCounterGet(handle) SHGlobalCounterGetValue(handle)
|
||||
#define SHELL_GlobalCounterIncrement(handle) SHGlobalCounterIncrement(handle)
|
||||
#endif
|
||||
#define SHELL_GCOUNTER_DECLAREPARAMETERS(handle, id) SHELL_GCOUNTER_PARAMETERS(HANDLE handle, SHGLOBALCOUNTER id)
|
||||
|
||||
DWORD WINAPI
|
||||
SHRestrictionLookup(
|
||||
_In_ DWORD policy,
|
||||
|
@ -71,6 +94,7 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfK
|
|||
HMENU WINAPI SHGetMenuFromID(HMENU hMenu, UINT uID);
|
||||
DWORD WINAPI SHGetCurColorRes(void);
|
||||
DWORD WINAPI SHWaitForSendMessageThread(HANDLE hand, DWORD dwTimeout);
|
||||
DWORD WINAPI SHSendMessageBroadcastW(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
HRESULT WINAPI SHIsExpandableFolder(LPSHELLFOLDER lpFolder, LPCITEMIDLIST pidl);
|
||||
DWORD WINAPI SHFillRectClr(HDC hDC, LPCRECT pRect, COLORREF cRef);
|
||||
int WINAPI SHSearchMapInt(const int *lpKeys, const int *lpValues, int iLen, int iKey);
|
||||
|
|
|
@ -535,6 +535,19 @@ BOOL WINAPI PathIsTemporaryW(_In_ LPCWSTR Str);
|
|||
// #define DE_ERROR_MAX
|
||||
#define ERRORONDEST 0x10000
|
||||
|
||||
/****************************************************************************
|
||||
* Shell settings
|
||||
*/
|
||||
|
||||
typedef struct _REGSHELLSTATE
|
||||
{
|
||||
DWORD dwSize;
|
||||
SHELLSTATE ss;
|
||||
} REGSHELLSTATE, *PREGSHELLSTATE;
|
||||
#define REGSHELLSTATE_SIZE 0x24
|
||||
#define REGSHELLSTATE_VERSION 0xD
|
||||
C_ASSERT(sizeof(REGSHELLSTATE) == REGSHELLSTATE_SIZE);
|
||||
|
||||
/****************************************************************************
|
||||
* Shell Namespace Routines
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue