Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b0c1d9a229 | ||
|
|
ac80080f90 | ||
|
|
d28c8e512a | ||
|
|
be57a43589 | ||
|
|
0465ac9c1b | ||
|
|
77d2d3a01d | ||
|
|
704459225b | ||
|
|
04770c403d | ||
|
|
f42980e090 | ||
|
|
7ad33f509e | ||
|
|
1b013c3590 | ||
|
|
cef27bdfa0 | ||
|
|
f7334882c3 | ||
|
|
9397d58986 | ||
|
|
7f6b7229f6 | ||
|
|
a0a03760cd | ||
|
|
9606e11e0e | ||
|
|
7f04293361 | ||
|
|
e6b33a70e4 | ||
|
|
179a59ac1b | ||
|
|
2a5ed14599 | ||
|
|
1cc5d2eb53 | ||
|
|
687e50914f |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 4.0 KiB |
16
README.md
@@ -1,11 +1,11 @@
|
||||
## Open-Shell 
|
||||
## Open-Shell <img src=/Src/Setup/OpenShell.ico width="64" />
|
||||
|
||||
*Originally* **[Classic Shell](http://www.classicshell.net)** *by [Ivo Beltchev](https://sourceforge.net/u/ibeltchev/profile/)*
|
||||
|
||||
[](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest) [](https://github.com/Open-Shell/Open-Shell-Menu/releases) [](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master) [](https://gitq.com/passionate-coder/Classic-Start) [](https://gitter.im/open-shell/Lobby) [](https://discord.gg/7H6arr5)
|
||||
[](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest) [](https://github.com/Open-Shell/Open-Shell-Menu/releases) [](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master) [](https://gitq.com/passionate-coder/Classic-Start) [](https://gitter.im/open-shell/Lobby) [](https://discord.gg/7H6arr5)
|
||||
|
||||
[Home Page](https://open-shell.github.io/Open-Shell-Menu)
|
||||
[Gitter Discussion room](https://gitter.im/Open-Shell)
|
||||
[Homepage](https://open-shell.github.io/Open-Shell-Menu)
|
||||
[Gitter Discussion rooms](https://gitter.im/Open-Shell)
|
||||
|
||||
### Features
|
||||
- Classic style Start Menu for Windows 7, 8, 8.1, 10
|
||||
@@ -15,9 +15,9 @@
|
||||
- Title bar and status bar for Internet Explorer
|
||||
|
||||
### Download
|
||||
If you just want to use it or looking for setup file, click here to download:
|
||||
You can find the latest stable version here:
|
||||
|
||||
[](https://github.com/Open-Shell/Open-Shell-Menu/releases)
|
||||
[](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest)
|
||||
|
||||
### Temporary Translation/Language Solution
|
||||
1. Download [language DLL](https://coddec.github.io/Classic-Shell/www.classicshell.net/translations/index.html)
|
||||
@@ -28,6 +28,6 @@ If you just want to use it or looking for setup file, click here to download:
|
||||
*For archival reasons, we have a mirror of `www.classicshell.net` [here](https://coddec.github.io/Classic-Shell/www.classicshell.net/).*
|
||||
|
||||
[How To Skin a Start Menu](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/skintutorial.html)
|
||||
[Classic Shell - Custom Start Buttons](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/buttontutorial.html)
|
||||
[Classic Shell: Custom Start Buttons](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/buttontutorial.html)
|
||||
[Questions? Ask on the Discussions section](https://github.com/Open-Shell/Open-Shell-Menu/discussions) or on [Discord](https://discord.gg/7H6arr5)
|
||||
[Report a bug/issue or submit a feature request](https://github.com/Open-Shell/Open-Shell-Menu/issues)
|
||||
[Submit a bug report/feature request](https://github.com/Open-Shell/Open-Shell-Menu/issues)
|
||||
|
||||
@@ -135,17 +135,17 @@ BEGIN
|
||||
IDS_LANGUAGE_SETTINGS "Language"
|
||||
IDS_CAPTION_FONT "Caption font"
|
||||
IDS_CAPTION_FONT_TIP "Select the font and text size to use for the caption"
|
||||
IDS_TEXT_COLOR "Text color"
|
||||
IDS_TEXT_COLOR "Text color (RRGGBB)"
|
||||
IDS_TEXT_COLOR_TIP "Select the color for the caption text"
|
||||
IDS_MAXTEXT_COLOR "Text color (maximized)"
|
||||
IDS_MAXTEXT_COLOR "Text color (maximized) (RRGGBB)"
|
||||
IDS_MAXTEXT_COLOR_TIP "Select the color for the caption text when the window is maximized"
|
||||
IDS_INTEXT_COLOR "Text color (inactive)"
|
||||
IDS_INTEXT_COLOR "Text color (inactive) (RRGGBB)"
|
||||
IDS_INTEXT_COLOR_TIP "Select the color for the caption text when the window is inactive"
|
||||
IDS_MAXINTEXT_COLOR "Text color (maximized, inactive)"
|
||||
IDS_MAXINTEXT_COLOR "Text color (maximized, inactive) (RRGGBB)"
|
||||
IDS_MAXINTEXT_COLOR_TIP "Select the color for the caption text when the window is maximized and inactive"
|
||||
IDS_GLOW "Text glow"
|
||||
IDS_GLOW_TIP "When this is checked, the text will have a glow around it"
|
||||
IDS_GLOW_COLOR "Glow color"
|
||||
IDS_GLOW_COLOR "Glow color (RRGGBB)"
|
||||
IDS_GLOW_COLOR_TIP "Select the color for the caption glow"
|
||||
END
|
||||
|
||||
@@ -153,7 +153,7 @@ STRINGTABLE
|
||||
BEGIN
|
||||
IDS_MAXGLOW "Text glow (maximized)"
|
||||
IDS_MAXGLOW_TIP "When this is checked, the text in the maximized window will have a glow around it"
|
||||
IDS_MAXGLOW_COLOR "Glow color (maximized)"
|
||||
IDS_MAXGLOW_COLOR "Glow color (maximized) (RRGGBB)"
|
||||
IDS_MAXGLOW_COLOR_TIP "Select the color for the caption glow when the window is maximized"
|
||||
IDS_STATUS_SETTINGS "Status Bar"
|
||||
IDS_SHOW_PROGRESS "Show progress"
|
||||
|
||||
@@ -396,8 +396,11 @@ HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, b
|
||||
CComPtr<IWICImagingFactory> pFactory;
|
||||
if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory)))
|
||||
{
|
||||
if (srcBmp) DeleteObject(srcBmp);
|
||||
return NULL;
|
||||
if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory1)))
|
||||
{
|
||||
if (srcBmp) DeleteObject(srcBmp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
CComPtr<IWICBitmapSource> pBitmap;
|
||||
@@ -534,7 +537,10 @@ HBITMAP LoadImageResource( HMODULE hModule, const wchar_t *name, bool bTopDown,
|
||||
{
|
||||
CComPtr<IWICImagingFactory> pFactory;
|
||||
if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory)))
|
||||
return NULL;
|
||||
{
|
||||
if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory1)))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CComPtr<IWICBitmapSource> pBitmap;
|
||||
if (hModule)
|
||||
@@ -727,6 +733,19 @@ bool IsWin10RS4( void )
|
||||
return bIsRS4;
|
||||
}
|
||||
|
||||
static bool IsWin11Helper()
|
||||
{
|
||||
auto version = GetOSVersion();
|
||||
return version.dwMajorVersion >= 10 && version.dwBuildNumber >= 22000;
|
||||
}
|
||||
|
||||
// Returns true if the version is Windows11 or later
|
||||
bool IsWin11(void)
|
||||
{
|
||||
static bool bIsWin11 = IsWin11Helper();
|
||||
return bIsWin11;
|
||||
}
|
||||
|
||||
// Wrapper for IShellFolder::ParseDisplayName
|
||||
HRESULT ShParseDisplayName( const wchar_t *pszName, PIDLIST_ABSOLUTE *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut )
|
||||
{
|
||||
@@ -903,3 +922,31 @@ HFONT CreateFontSetting( const wchar_t *fontStr, int dpi )
|
||||
int size=-_wtol(token);
|
||||
return CreateFont(size*dpi/72,0,0,0,weight,bItalic?1:0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,name);
|
||||
}
|
||||
|
||||
static UINT WINAPI GetDpiForWindow(HWND hwnd)
|
||||
{
|
||||
static auto p = static_cast<decltype(&GetDpiForWindow)>((void*)GetProcAddress(GetModuleHandle(L"user32.dll"), "GetDpiForWindow"));
|
||||
if (p)
|
||||
return p(hwnd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT GetDpi(HWND hwnd)
|
||||
{
|
||||
UINT dpi = GetDpiForWindow(hwnd);
|
||||
if (!dpi)
|
||||
{
|
||||
// fall-back for older systems
|
||||
HDC hdc = GetDC(nullptr);
|
||||
dpi = GetDeviceCaps(hdc, LOGPIXELSY);
|
||||
ReleaseDC(nullptr, hdc);
|
||||
}
|
||||
|
||||
return dpi;
|
||||
}
|
||||
|
||||
int ScaleForDpi(HWND hwnd, int value)
|
||||
{
|
||||
return MulDiv(value, GetDpi(hwnd), USER_DEFAULT_SCREEN_DPI);
|
||||
}
|
||||
|
||||
@@ -67,6 +67,9 @@ bool IsWin10RS1( void );
|
||||
// Returns true if the version is Windows10 RS4 (Spring Creator Update) or later
|
||||
bool IsWin10RS4( void );
|
||||
|
||||
// Returns true if the version is Windows11 or later
|
||||
bool IsWin11();
|
||||
|
||||
// Wrapper for IShellFolder::ParseDisplayName
|
||||
HRESULT ShParseDisplayName( const wchar_t *pszName, PIDLIST_ABSOLUTE *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut );
|
||||
|
||||
@@ -82,6 +85,12 @@ void StringUpper( CString &str );
|
||||
// Create a font from the user settings
|
||||
HFONT CreateFontSetting( const wchar_t *fontStr, int dpi );
|
||||
|
||||
// Return DPI of given window (or system DPI on older systems)
|
||||
UINT GetDpi(HWND hwnd = nullptr);
|
||||
|
||||
// Scale given value according to DPI of window
|
||||
int ScaleForDpi(HWND hwnd, int value);
|
||||
|
||||
extern HINSTANCE g_Instance;
|
||||
|
||||
const int ANIM_BUTTON_TAG1='ANM';
|
||||
|
||||
@@ -793,10 +793,7 @@ CString CSettingsManager::LoadSettingsXml( const wchar_t *fname )
|
||||
}
|
||||
string.push_back(0);
|
||||
pSetting->value=CComVariant(&string[0]);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -809,10 +806,7 @@ CString CSettingsManager::LoadSettingsXml( const wchar_t *fname )
|
||||
if (pSetting->type>=CSetting::TYPE_STRING)
|
||||
{
|
||||
pSetting->value=value;
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
else if (pSetting->type==CSetting::TYPE_BOOL || (pSetting->type==CSetting::TYPE_INT && pSetting[1].type!=CSetting::TYPE_RADIO) || pSetting->type==CSetting::TYPE_HOTKEY || pSetting->type==CSetting::TYPE_HOTKEY_ANY || pSetting->type==CSetting::TYPE_COLOR)
|
||||
{
|
||||
@@ -821,10 +815,7 @@ CString CSettingsManager::LoadSettingsXml( const wchar_t *fname )
|
||||
pSetting->value=CComVariant(val?1:0);
|
||||
else
|
||||
pSetting->value=CComVariant(val);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
else if (pSetting->type==CSetting::TYPE_INT && pSetting[1].type==CSetting::TYPE_RADIO)
|
||||
{
|
||||
@@ -834,10 +825,7 @@ CString CSettingsManager::LoadSettingsXml( const wchar_t *fname )
|
||||
if (_wcsicmp(pRadio->name,value.bstrVal)==0)
|
||||
{
|
||||
pSetting->value=CComVariant(val);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1828,10 +1828,7 @@ void CCustomTreeDlg::SerializeData( void )
|
||||
if ((m_pSetting->flags&CSetting::FLAG_DEFAULT) || wcscmp(strNew,strOld)!=0)
|
||||
SetSettingsDirty();
|
||||
m_pSetting->value=CComVariant(strNew);
|
||||
if (m_pSetting->value==m_pSetting->defValue)
|
||||
m_pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
m_pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
m_pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
ItemsChanged();
|
||||
}
|
||||
|
||||
@@ -2654,15 +2651,14 @@ LRESULT CTreeSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO
|
||||
CString str;
|
||||
m_EditBox.GetWindowText(str);
|
||||
str.TrimLeft(); str.TrimRight();
|
||||
wchar_t *end;
|
||||
COLORREF val=wcstol(str,&end,16)&0xFFFFFF;
|
||||
COLORREF val=RgbToBgr(ParseColor(str));
|
||||
static COLORREF customColors[16];
|
||||
CHOOSECOLOR choose={sizeof(choose),m_hWnd,NULL,val,customColors};
|
||||
choose.Flags=CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT;
|
||||
if (ChooseColor(&choose))
|
||||
{
|
||||
wchar_t text[100];
|
||||
Sprintf(text,_countof(text),L"%06X",choose.rgbResult);
|
||||
Sprintf(text,_countof(text),L"%06X",BgrToRgb(choose.rgbResult));
|
||||
m_EditBox.SetWindowText(text);
|
||||
ApplyEditBox();
|
||||
UpdateGroup(m_pEditSetting);
|
||||
@@ -2811,10 +2807,7 @@ void CTreeSettingsDlg::ToggleItem( HTREEITEM hItem, bool bDefault )
|
||||
{
|
||||
CSettingsLockWrite lock;
|
||||
pSetting->value=CComVariant(state?0:1);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsDirty();
|
||||
}
|
||||
if (pSetting->flags&CSetting::FLAG_CALLBACK)
|
||||
@@ -2838,10 +2831,7 @@ void CTreeSettingsDlg::ToggleItem( HTREEITEM hItem, bool bDefault )
|
||||
{
|
||||
CSettingsLockWrite lock;
|
||||
pTarget->value=CComVariant(val);
|
||||
if (pTarget->value==pTarget->defValue)
|
||||
pTarget->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pTarget->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pTarget->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsDirty();
|
||||
}
|
||||
if (pParent->flags&CSetting::FLAG_CALLBACK)
|
||||
@@ -3052,23 +3042,16 @@ void CTreeSettingsDlg::ApplyEditBox( void )
|
||||
if (pSetting->value.vt!=VT_I4 || pSetting->value.intVal!=val)
|
||||
{
|
||||
pSetting->value=CComVariant(val);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
else if (pSetting->type==CSetting::TYPE_COLOR)
|
||||
{
|
||||
wchar_t *end;
|
||||
int val=wcstol(str,&end,16)&0xFFFFFF;
|
||||
int val=RgbToBgr(ParseColor(str));
|
||||
if (pSetting->value.vt!=VT_I4 || pSetting->value.intVal!=val)
|
||||
{
|
||||
pSetting->value=CComVariant(val);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
else if (pSetting->type==CSetting::TYPE_HOTKEY || pSetting->type==CSetting::TYPE_HOTKEY_ANY)
|
||||
@@ -3076,10 +3059,7 @@ void CTreeSettingsDlg::ApplyEditBox( void )
|
||||
if (pSetting->value.vt!=VT_I4 || pSetting->value.intVal!=g_HotKey)
|
||||
{
|
||||
pSetting->value=CComVariant(g_HotKey);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
else if (pSetting->type==CSetting::TYPE_DIRECTORY)
|
||||
@@ -3101,10 +3081,7 @@ void CTreeSettingsDlg::ApplyEditBox( void )
|
||||
if (pSetting->value.vt!=VT_BSTR || str!=pSetting->value.bstrVal)
|
||||
{
|
||||
pSetting->value=CComVariant(str);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
SetSettingsDirty();
|
||||
@@ -3177,7 +3154,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b
|
||||
mode=EDIT_COLOR;
|
||||
int val=0;
|
||||
if (valVar.vt==VT_I4)
|
||||
val=valVar.intVal;
|
||||
val=BgrToRgb(valVar.intVal);
|
||||
Sprintf(text,_countof(text),L"%06X",val);
|
||||
}
|
||||
}
|
||||
@@ -3483,7 +3460,7 @@ void CTreeSettingsDlg::UpdateGroup( const CSetting *pModified )
|
||||
CString str=LoadStringEx(pSetting->nameID);
|
||||
int val=0;
|
||||
if (valVar.vt==VT_I4)
|
||||
val=valVar.intVal;
|
||||
val=BgrToRgb(valVar.intVal);
|
||||
Sprintf(text,_countof(text),L"%s: %06X",str,val);
|
||||
item.mask|=TVIF_TEXT;
|
||||
}
|
||||
@@ -3637,3 +3614,19 @@ bool CDefaultSettingsPanel::Validate( HWND parent )
|
||||
s_Dialog.Validate();
|
||||
return true;
|
||||
}
|
||||
|
||||
DWORD RgbToBgr(DWORD val)
|
||||
{
|
||||
return ((val & 0xFF) << 16) | (val & 0xFF00) | ((val >> 16) & 0xFF);
|
||||
}
|
||||
|
||||
DWORD BgrToRgb(DWORD val)
|
||||
{
|
||||
return RgbToBgr(val);
|
||||
}
|
||||
|
||||
DWORD ParseColor(const wchar_t* str)
|
||||
{
|
||||
wchar_t* end;
|
||||
return wcstoul(str, &end, 16) & 0xFFFFFF;
|
||||
}
|
||||
|
||||
@@ -387,3 +387,11 @@ extern const GUID FOLDERID_DesktopRoot;
|
||||
bool BrowseCommandHelper( HWND parent, wchar_t *text );
|
||||
bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly );
|
||||
bool BrowseIconHelper( HWND parent, wchar_t *text );
|
||||
|
||||
// convert color in RRGGBB format to BBGGRR
|
||||
DWORD RgbToBgr(DWORD val);
|
||||
// convert color in BBGGRR format to RRGGBB
|
||||
DWORD BgrToRgb(DWORD val);
|
||||
|
||||
// parse color from hexadecimal string
|
||||
DWORD ParseColor(const wchar_t* str);
|
||||
|
||||
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 4.0 KiB |
@@ -114,7 +114,7 @@ copy /B Output\x64\StartMenuHelper64.dll Output\PDB64 > nul
|
||||
|
||||
REM ********* Source Index PDBs
|
||||
|
||||
set PDBSTR_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\srcsrv\pdbstr.exe"
|
||||
set PDBSTR_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\srcsrv\pdbstr.exe"
|
||||
|
||||
if exist %PDBSTR_PATH% (
|
||||
echo --- Adding source index to PDBs
|
||||
@@ -122,10 +122,18 @@ if exist %PDBSTR_PATH% (
|
||||
|
||||
for %%f in (Output\PDB32\*.pdb) do (
|
||||
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
||||
if not ERRORLEVEL 0 (
|
||||
echo Error adding source index to PDB
|
||||
exit /b 1
|
||||
)
|
||||
)
|
||||
|
||||
for %%f in (Output\PDB64\*.pdb) do (
|
||||
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
|
||||
if not ERRORLEVEL 0 (
|
||||
echo Error adding source index to PDB
|
||||
exit /b 1
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 401 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -561,6 +561,7 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC
|
||||
else if (wcsstr(lpstrCmdLine,L"-toggle")!=NULL) open=MSG_TOGGLE;
|
||||
else if (wcsstr(lpstrCmdLine,L"-open")!=NULL) open=MSG_OPEN;
|
||||
else if (wcsstr(lpstrCmdLine,L"-settings")!=NULL) open=MSG_SETTINGS;
|
||||
else if (wcsstr(lpstrCmdLine,L"-reloadsettings")!=NULL) open=MSG_RELOADSETTINGS;
|
||||
else if (wcsstr(lpstrCmdLine,L"-exit")!=NULL) open=MSG_EXIT;
|
||||
|
||||
{
|
||||
|
||||
@@ -903,7 +903,7 @@ HRESULT STDMETHODCALLTYPE CMenuContainer::Drop( IDataObject *pDataObj, DWORD grf
|
||||
else if (i<before)
|
||||
skip++;
|
||||
}
|
||||
SortMenuItem ins(L"",FNV_HASH0,false,false,false,folderIndex*2,0);
|
||||
SortMenuItem ins(L"",FNV_HASH0,false,false,folderIndex*2,0);
|
||||
items.insert(items.begin()+(before-skip),ins);
|
||||
SaveItemOrder(items);
|
||||
}
|
||||
|
||||
@@ -489,7 +489,8 @@ void CItemManager::LoadIconData::Init( void )
|
||||
HIMAGELIST_QueryInterface(m_TempLists[i],IID_IImageList2,(void**)&m_pTempLists[i]);
|
||||
}
|
||||
}
|
||||
m_pFactory.CoCreateInstance(CLSID_WICImagingFactory);
|
||||
if (FAILED(m_pFactory.CoCreateInstance(CLSID_WICImagingFactory)))
|
||||
m_pFactory.CoCreateInstance(CLSID_WICImagingFactory1);
|
||||
}
|
||||
|
||||
void CItemManager::LoadIconData::Close( void )
|
||||
|
||||
@@ -2811,6 +2811,10 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p
|
||||
if (bRefresh || bRefreshMain)
|
||||
info.fMask|=CMIC_MASK_NOASYNC; // wait for delete/link commands to finish so we can refresh the menu
|
||||
|
||||
// we don't want our virtual folder to appear in Explorer's frequent list
|
||||
if (item.pItemInfo && wcsncmp(item.pItemInfo->PATH, L"::{82E749ED-B971-4550-BAF7-06AA2BF7E836}", 40) == 0)
|
||||
info.fMask &= ~CMIC_MASK_FLAG_LOG_USAGE;
|
||||
|
||||
s_bPreventClosing=true;
|
||||
for (auto& it : s_Menus)
|
||||
{
|
||||
|
||||
@@ -345,7 +345,8 @@ bool CMenuContainer::s_bMRULoaded=false;
|
||||
const CItemManager::ItemInfo *CMenuContainer::s_JumpAppInfo;
|
||||
CJumpList CMenuContainer::s_JumpList;
|
||||
int CMenuContainer::s_TaskBarId;
|
||||
HWND CMenuContainer::s_TaskBar, CMenuContainer::s_StartButton;
|
||||
HWND CMenuContainer::s_TaskBar;
|
||||
HWND CMenuContainer::s_StartButton; // custom start button (if any)
|
||||
UINT CMenuContainer::s_TaskBarEdge;
|
||||
RECT CMenuContainer::s_StartRect;
|
||||
HWND CMenuContainer::s_LastFGWindow;
|
||||
@@ -861,8 +862,7 @@ void CMenuContainer::AddFirstFolder( IShellItem *pFolder, std::vector<MenuItem>
|
||||
|
||||
if (bLibrary) flags&=~SFGAO_STREAM;
|
||||
item.bLink=(flags&SFGAO_LINK)!=0;
|
||||
item.bFolderLink=(flags&SFGAO_FOLDER && (!(flags&(SFGAO_STREAM|SFGAO_LINK)) || (s_bExpandLinks && item.bLink)));
|
||||
item.bFolder=(!(options&CONTAINER_CONTROLPANEL) && !(options&CONTAINER_NOSUBFOLDERS) && item.bFolderLink);
|
||||
item.bFolder=(!(options&CONTAINER_CONTROLPANEL) && !(options&CONTAINER_NOSUBFOLDERS) && (flags&SFGAO_FOLDER) && (!(flags&(SFGAO_STREAM|SFGAO_LINK)) || (s_bExpandLinks && item.bLink)));
|
||||
{
|
||||
CItemManager::RWLock lock(&g_ItemManager,false,CItemManager::RWLOCK_ITEMS);
|
||||
if (item.pItemInfo->IsMetroLink())
|
||||
@@ -1072,7 +1072,7 @@ void CMenuContainer::AddStandardItems( void )
|
||||
const StdMenuItem *pInlineParent=NULL;
|
||||
int searchProviderIndex=-1;
|
||||
m_SearchProvidersCount=0;
|
||||
MenuSkin::TIconSize mainIconSize=s_Skin.Main_icon_size;
|
||||
bool bSecondColumn=false;
|
||||
for (const StdMenuItem *pStdItem=m_pStdItem;;pStdItem++)
|
||||
{
|
||||
if (pStdItem->id==MENU_LAST)
|
||||
@@ -1090,9 +1090,8 @@ void CMenuContainer::AddStandardItems( void )
|
||||
if (m_bSubMenu && pStdItem->id==s_ShutdownCommand)
|
||||
continue;
|
||||
|
||||
const bool bTwoColumns = (!m_bSubMenu && s_Skin.TwoColumns);
|
||||
if (pStdItem->id==MENU_COLUMN_BREAK && bTwoColumns)
|
||||
mainIconSize=s_Skin.Main2_icon_size;
|
||||
if (pStdItem->id==MENU_COLUMN_BREAK && !m_bSubMenu && s_Skin.TwoColumns)
|
||||
bSecondColumn=true;
|
||||
|
||||
int stdOptions=GetStdOptions(pStdItem->id);
|
||||
if (!(stdOptions&MENU_ENABLED)) continue;
|
||||
@@ -1273,6 +1272,10 @@ void CMenuContainer::AddStandardItems( void )
|
||||
item.bSplit=item.bFolder && (item.pStdItem->settings&StdMenuItem::MENU_SPLIT_BUTTON)!=0;
|
||||
|
||||
// get icon
|
||||
MenuSkin::TIconSize mainIconSize=!bSecondColumn ? s_Skin.Main_icon_size : s_Skin.Main2_icon_size;
|
||||
if (item.bInline && mainIconSize==MenuSkin::ICON_SIZE_NONE)
|
||||
mainIconSize=s_Skin.Main_icon_size;
|
||||
|
||||
CItemManager::TIconSizeType iconSizeType;
|
||||
int refreshFlags;
|
||||
if (bSearchProvider7 || m_bSubMenu)
|
||||
@@ -1586,6 +1589,23 @@ static const wchar_t *g_MfuIgnoreExes[]={
|
||||
L"WUAPP.EXE",
|
||||
};
|
||||
|
||||
static bool IgnoreUserAssistItem(const UserAssistItem& uaItem)
|
||||
{
|
||||
static constexpr const wchar_t* ignoredNames[] =
|
||||
{
|
||||
DESKTOP_APP_ID,
|
||||
L"Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy!App",
|
||||
};
|
||||
|
||||
for (const auto& name : ignoredNames)
|
||||
{
|
||||
if (_wcsicmp(uaItem.name, name) == 0)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CMenuContainer::GetRecentPrograms( std::vector<MenuItem> &items, int maxCount )
|
||||
{
|
||||
bool bShowMetro=GetSettingBool(L"RecentMetroApps");
|
||||
@@ -1938,9 +1958,9 @@ void CMenuContainer::GetRecentPrograms( std::vector<MenuItem> &items, int maxCou
|
||||
continue;
|
||||
}
|
||||
|
||||
if (_wcsicmp(uaItem.name,DESKTOP_APP_ID)==0)
|
||||
if (IgnoreUserAssistItem(uaItem))
|
||||
{
|
||||
LOG_MENU(LOG_MFU,L"UserAssist: Dropping: Ignore desktop");
|
||||
LOG_MENU(LOG_MFU,L"UserAssist: Dropping: Ignore '%s'",uaItem.name);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -7505,6 +7525,7 @@ RECT CMenuContainer::CalculateWorkArea( const RECT &taskbarRect )
|
||||
return rc;
|
||||
}
|
||||
|
||||
// Calculates start menu position
|
||||
POINT CMenuContainer::CalculateCorner( void )
|
||||
{
|
||||
RECT margin={0,0,0,0};
|
||||
@@ -7512,10 +7533,24 @@ POINT CMenuContainer::CalculateCorner( void )
|
||||
AdjustWindowRect(&margin,GetWindowLong(GWL_STYLE),FALSE);
|
||||
|
||||
POINT corner;
|
||||
if (m_Options&CONTAINER_LEFT)
|
||||
corner.x=s_MainMenuLimits.left+margin.left;
|
||||
if (IsWin11())
|
||||
{
|
||||
// start button can be in the center on Win11
|
||||
// we want to show menu at the position of start button
|
||||
if (m_Options&CONTAINER_LEFT)
|
||||
corner.x=s_StartRect.left+margin.left;
|
||||
else
|
||||
corner.x=s_StartRect.right+margin.right;
|
||||
}
|
||||
else
|
||||
corner.x=s_MainMenuLimits.right+margin.right;
|
||||
{
|
||||
// start button can be only in corner on older systems
|
||||
// we can use screen limits to determine menu position
|
||||
if (m_Options&CONTAINER_LEFT)
|
||||
corner.x=s_MainMenuLimits.left+margin.left;
|
||||
else
|
||||
corner.x=s_MainMenuLimits.right+margin.right;
|
||||
}
|
||||
|
||||
if (m_Options&CONTAINER_TOP)
|
||||
{
|
||||
@@ -7634,6 +7669,9 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr
|
||||
// initialize all settings
|
||||
bool bErr=false;
|
||||
HMONITOR initialMonitor=MonitorFromWindow(s_TaskBar,MONITOR_DEFAULTTONEAREST);
|
||||
// note: GetTaskbarPosition properly identifies monitor in case of multi-monitor setup and automatic taskbar hiding
|
||||
GetTaskbarPosition(s_TaskBar,NULL,&initialMonitor,NULL);
|
||||
|
||||
int dpi=CItemManager::GetDPI(true);
|
||||
if (!CItemManager::GetDPIOverride() && GetWinVersion()>=WIN_VER_WIN81)
|
||||
{
|
||||
|
||||
@@ -453,7 +453,7 @@ private:
|
||||
drawType=MenuSkin::COLUMN1_ITEM;
|
||||
column=row=0;
|
||||
memset(&itemRect,0,sizeof(itemRect));
|
||||
bFolder=bLink=bFolderLink=bPrograms=bAlignBottom=bBreak=bInline=bInlineFirst=bInlineLast=bSplit=bHasJumpList=bMetroLink=bMetroApp=bBlankSeparator=bNew=bStartScreen=bCustomAccelerator=false;
|
||||
bFolder=bLink=bPrograms=bAlignBottom=bBreak=bInline=bInlineFirst=bInlineLast=bSplit=bHasJumpList=bMetroLink=bMetroApp=bBlankSeparator=bNew=bStartScreen=bCustomAccelerator=false;
|
||||
priority=0;
|
||||
pItem1=pItem2=NULL;
|
||||
mfuHash=0;
|
||||
@@ -477,7 +477,6 @@ private:
|
||||
RECT itemRect;
|
||||
bool bFolder:1; // this is a folder - draw arrow
|
||||
bool bLink:1; // this is a link (if a link to a folder is expanded it is always single-column)
|
||||
bool bFolderLink:1; // this is a folder that is not explicitly expandable - used for sorting the list-of-links style
|
||||
bool bPrograms:1; // this item is part of the Start Menu folder hierarchy
|
||||
bool bAlignBottom:1; // two-column menu: this item is aligned to the bottom
|
||||
bool bBreak:1; // two-column menu: this item starts the second column
|
||||
@@ -513,8 +512,8 @@ private:
|
||||
if (priority>item.priority) return false;
|
||||
if (row<item.row) return true;
|
||||
if (row>item.row) return false;
|
||||
if (((bFolder || bFolderLink) && !bHasJumpList) && !((item.bFolder || item.bFolderLink) && !item.bHasJumpList)) return true;
|
||||
if (!((bFolder || bFolderLink) && !bHasJumpList) && ((item.bFolder || item.bFolderLink) && !item.bHasJumpList)) return false;
|
||||
if ((bFolder && !bHasJumpList) && !(item.bFolder && !item.bHasJumpList)) return true;
|
||||
if (!(bFolder && !bHasJumpList) && (item.bFolder && !item.bHasJumpList)) return false;
|
||||
if (drive && !item.drive) return true;
|
||||
if (!drive && item.drive) return false;
|
||||
if (drive && item.drive) return drive<item.drive;
|
||||
@@ -579,19 +578,18 @@ private:
|
||||
CString name;
|
||||
unsigned int nameHash;
|
||||
bool bFolder;
|
||||
bool bFolderLink;
|
||||
bool bHasJumpList;
|
||||
char priority;
|
||||
char drive;
|
||||
|
||||
SortMenuItem( const CString &_name, unsigned _nameHash, bool _bFolder, bool _bFolderLink, bool _bHasJumpList, char _priority ,char _drive) { name=_name; nameHash=_nameHash; bFolder=_bFolder; bFolderLink=_bFolderLink; bHasJumpList=_bHasJumpList; priority=_priority; drive=_drive; }
|
||||
SortMenuItem( const MenuItem &item ) { name=item.name; nameHash=item.nameHash; bFolder=item.bFolder; bFolderLink=item.bFolderLink; bHasJumpList=item.bHasJumpList; priority=item.priority; drive=item.drive; }
|
||||
SortMenuItem( const CString &_name, unsigned _nameHash, bool _bFolder, bool _bHasJumpList, char _priority ,char _drive) { name=_name; nameHash=_nameHash; bFolder=_bFolder; bHasJumpList=_bHasJumpList; priority=_priority; drive=_drive; }
|
||||
SortMenuItem( const MenuItem &item ) { name=item.name; nameHash=item.nameHash; bFolder=item.bFolder; bHasJumpList=item.bHasJumpList; priority=item.priority; drive=item.drive; }
|
||||
bool operator<( const SortMenuItem &x ) const
|
||||
{
|
||||
if (priority<x.priority) return true;
|
||||
if (priority>x.priority) return false;
|
||||
if (((bFolder || bFolderLink) && !bHasJumpList) && !((x.bFolder || x.bFolderLink) && !x.bHasJumpList)) return true;
|
||||
if (!((bFolder || bFolderLink) && !bHasJumpList) && ((x.bFolder || x.bFolderLink) && !x.bHasJumpList)) return false;
|
||||
if ((bFolder && !bHasJumpList) && !(x.bFolder && !x.bHasJumpList)) return true;
|
||||
if (!(bFolder && !bHasJumpList) && (x.bFolder && !x.bHasJumpList)) return false;
|
||||
if (drive && !x.drive) return true;
|
||||
if (!drive && x.drive) return false;
|
||||
if (drive && x.drive) return drive<x.drive;
|
||||
|
||||
@@ -30,6 +30,19 @@ const int DEFAULT_TASK_OPACITY10=85; // 85%
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CString RgbToBgr(const wchar_t* str)
|
||||
{
|
||||
CString retval;
|
||||
retval.Format(L"%06X", RgbToBgr(ParseColor(str)));
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
CString BgrToRgb(const wchar_t* str)
|
||||
{
|
||||
return RgbToBgr(str);
|
||||
}
|
||||
|
||||
class CSkinSettingsDlg: public CResizeableDlg<CSkinSettingsDlg>
|
||||
{
|
||||
public:
|
||||
@@ -422,7 +435,7 @@ void CSkinSettingsDlg::UpdateSkinSettings( void )
|
||||
if (!option.bEnabled || bLocked)
|
||||
image|=SETTING_STATE_DISABLED;
|
||||
if (option.bValue && option.type>SKIN_OPTION_BOOL)
|
||||
Sprintf(text,_countof(text),L"%s: %s",option.label,option.sValue);
|
||||
Sprintf(text,_countof(text),L"%s: %s",option.label,(option.type==SKIN_OPTION_COLOR)?BgrToRgb(option.sValue):option.sValue);
|
||||
else
|
||||
Sprintf(text,_countof(text),L"%s",option.label);
|
||||
|
||||
@@ -482,9 +495,7 @@ LRESULT CSkinSettingsDlg::OnCustomDraw( int idCtrl, LPNMHDR pnmh, BOOL& bHandled
|
||||
if (TreeView_GetItemRect(m_Tree,(HTREEITEM)pDraw->nmcd.dwItemSpec,&rc,TRUE))
|
||||
{
|
||||
const wchar_t *str=m_CurrentSkin.Options[pDraw->nmcd.lItemlParam].sValue;
|
||||
wchar_t *end;
|
||||
COLORREF color=wcstoul(str,&end,16);
|
||||
SetDCBrushColor(pDraw->nmcd.hdc,color&0xFFFFFF);
|
||||
SetDCBrushColor(pDraw->nmcd.hdc,ParseColor(str));
|
||||
SelectObject(pDraw->nmcd.hdc,GetStockObject(DC_BRUSH));
|
||||
SelectObject(pDraw->nmcd.hdc,GetStockObject(BLACK_PEN));
|
||||
Rectangle(pDraw->nmcd.hdc,rc.right,rc.top,rc.right+rc.bottom-rc.top,rc.bottom-1);
|
||||
@@ -690,15 +701,14 @@ LRESULT CSkinSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO
|
||||
CString str;
|
||||
m_EditBox.GetWindowText(str);
|
||||
str.TrimLeft(); str.TrimRight();
|
||||
wchar_t *end;
|
||||
COLORREF val=wcstol(str,&end,16)&0xFFFFFF;
|
||||
COLORREF val=RgbToBgr(ParseColor(str));
|
||||
static COLORREF customColors[16];
|
||||
CHOOSECOLOR choose={sizeof(choose),m_hWnd,NULL,val,customColors};
|
||||
choose.Flags=CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT;
|
||||
if (ChooseColor(&choose))
|
||||
{
|
||||
wchar_t text[100];
|
||||
Sprintf(text,_countof(text),L"%06X",choose.rgbResult);
|
||||
Sprintf(text,_countof(text),L"%06X",BgrToRgb(choose.rgbResult));
|
||||
m_EditBox.SetWindowText(text);
|
||||
ApplyEditBox();
|
||||
m_Tree.Invalidate();
|
||||
@@ -717,7 +727,11 @@ void CSkinSettingsDlg::ApplyEditBox( void )
|
||||
CString str;
|
||||
m_EditBox.GetWindowText(str);
|
||||
str.TrimLeft(); str.TrimRight();
|
||||
m_CurrentSkin.Options[m_EditItemIndex].sValue=str;
|
||||
auto& option=m_CurrentSkin.Options[m_EditItemIndex];
|
||||
if (option.type==SKIN_OPTION_COLOR)
|
||||
option.sValue=RgbToBgr(str);
|
||||
else
|
||||
option.sValue=str;
|
||||
StoreSkinOptions();
|
||||
}
|
||||
}
|
||||
@@ -730,7 +744,7 @@ void CSkinSettingsDlg::ItemSelected( HTREEITEM hItem, int index, bool bEnabled )
|
||||
const MenuSkin::Option &option=m_CurrentSkin.Options[m_EditItemIndex];
|
||||
wchar_t text[256];
|
||||
if (option.bValue && option.type>SKIN_OPTION_BOOL)
|
||||
Sprintf(text,_countof(text),L"%s: %s",option.label,option.sValue);
|
||||
Sprintf(text,_countof(text),L"%s: %s",option.label,(option.type==SKIN_OPTION_COLOR)?BgrToRgb(option.sValue):option.sValue);
|
||||
else
|
||||
Sprintf(text,_countof(text),L"%s",option.label);
|
||||
TVITEM item={TVIF_TEXT,m_EditItem,0,0,text};
|
||||
@@ -745,7 +759,10 @@ void CSkinSettingsDlg::ItemSelected( HTREEITEM hItem, int index, bool bEnabled )
|
||||
const MenuSkin::Option &option=m_CurrentSkin.Options[index];
|
||||
if (option.type>SKIN_OPTION_BOOL)
|
||||
mode=option.type;
|
||||
text=option.sValue;
|
||||
if (option.type==SKIN_OPTION_COLOR)
|
||||
text=BgrToRgb(option.sValue);
|
||||
else
|
||||
text=option.sValue;
|
||||
}
|
||||
|
||||
RECT rc;
|
||||
@@ -3624,10 +3641,7 @@ void CCustomMenuDlg7::SerializeData( void )
|
||||
stringBuilder.push_back(0);
|
||||
CSettingsLockWrite lock;
|
||||
m_pSetting->value=CComVariant(&stringBuilder[0]);
|
||||
if (m_pSetting->value==m_pSetting->defValue)
|
||||
m_pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
m_pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
m_pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsDirty();
|
||||
}
|
||||
|
||||
@@ -3854,10 +3868,7 @@ LRESULT CMenuStyleDlg::OnClick( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL&
|
||||
CheckDlgButton(IDC_RADIO_CLASSIC,pSetting->value.intVal==MENU_CLASSIC1?BST_CHECKED:BST_UNCHECKED);
|
||||
CheckDlgButton(IDC_RADIO_TWO_COLUMNS,pSetting->value.intVal==MENU_CLASSIC2?BST_CHECKED:BST_UNCHECKED);
|
||||
CheckDlgButton(IDC_RADIO_WIN7,pSetting->value.intVal==MENU_WIN7?BST_CHECKED:BST_UNCHECKED);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsDirty();
|
||||
|
||||
SetSettingsStyle(styleFlag,CSetting::FLAG_MENU_MASK);
|
||||
@@ -3875,10 +3886,7 @@ LRESULT CMenuStyleDlg::OnEnabled( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL
|
||||
CSettingsLockWrite lock;
|
||||
CSetting *pSetting=FindSetting(L"EnableStartButton");
|
||||
pSetting->value=CComVariant(bEnabled);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsDirty();
|
||||
}
|
||||
Update(false);
|
||||
@@ -3917,10 +3925,7 @@ LRESULT CMenuStyleDlg::OnButtonStyle( WORD wNotifyCode, WORD wID, HWND hWndCtl,
|
||||
CSettingsLockWrite lock;
|
||||
CSetting *pSetting=FindSetting(L"StartButtonType");
|
||||
pSetting->value=CComVariant(style);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsDirty();
|
||||
}
|
||||
Update(false);
|
||||
@@ -3944,10 +3949,7 @@ LRESULT CMenuStyleDlg::OnPick( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& b
|
||||
CSettingsLockWrite lock;
|
||||
CSetting *pSetting=FindSetting(L"StartButtonPath");
|
||||
pSetting->value=CComVariant(path);
|
||||
if (pSetting->value==pSetting->defValue)
|
||||
pSetting->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSetting->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsDirty();
|
||||
}
|
||||
Update(true);
|
||||
@@ -4586,10 +4588,7 @@ void UpgradeSettings( bool bShared )
|
||||
items.Replace(L"Command=recent_items\n",L"Command=recent_programs\n");
|
||||
items.Replace(L"Command=control_panel_categories\n",L"Command=control_panel\n");
|
||||
pSettingItems->value=items;
|
||||
if (pSettingItems->value==pSettingItems->defValue)
|
||||
pSettingItems->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingItems->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingItems->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
|
||||
// set initial menu style
|
||||
@@ -4597,10 +4596,7 @@ void UpgradeSettings( bool bShared )
|
||||
if (!pSettingStyle->IsLocked())
|
||||
{
|
||||
pSettingStyle->value=(bTwoColumns?1:0);
|
||||
if (pSettingStyle->value==pSettingStyle->defValue)
|
||||
pSettingStyle->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingStyle->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingStyle->flags&=~CSetting::FLAG_DEFAULT;
|
||||
SetSettingsStyle(bTwoColumns?CSetting::FLAG_MENU_CLASSIC2:CSetting::FLAG_MENU_CLASSIC1,CSetting::FLAG_MENU_MASK);
|
||||
}
|
||||
|
||||
@@ -4612,10 +4608,7 @@ void UpgradeSettings( bool bShared )
|
||||
if (!pSetting->IsDefault())
|
||||
{
|
||||
pSettingSkin->value=pSetting->value;
|
||||
if (pSettingSkin->value==pSettingSkin->defValue)
|
||||
pSettingSkin->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingSkin->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingSkin->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
CSetting *pSettingOpt=FindSetting(bTwoColumns?L"SkinOptionsC2":L"SkinOptionsC1");
|
||||
@@ -4625,10 +4618,7 @@ void UpgradeSettings( bool bShared )
|
||||
if (!pSetting->IsDefault())
|
||||
{
|
||||
pSettingOpt->value=pSetting->value;
|
||||
if (pSettingOpt->value==pSettingOpt->defValue)
|
||||
pSettingOpt->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingOpt->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingOpt->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
CSetting *pSettingVar=FindSetting(bTwoColumns?L"SkinVariationC2":L"SkinVariationC1");
|
||||
@@ -4638,10 +4628,7 @@ void UpgradeSettings( bool bShared )
|
||||
if (!pSetting->IsDefault())
|
||||
{
|
||||
pSettingVar->value=pSetting->value;
|
||||
if (pSettingVar->value==pSettingVar->defValue)
|
||||
pSettingVar->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingVar->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingVar->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4653,10 +4640,7 @@ void UpgradeSettings( bool bShared )
|
||||
if (!pSetting->IsDefault())
|
||||
{
|
||||
pSettingSkin->value=pSetting->value;
|
||||
if (pSettingSkin->value==pSettingSkin->defValue)
|
||||
pSettingSkin->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingSkin->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingSkin->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
pSettingOpt=FindSetting(L"SkinOptionsA");
|
||||
@@ -4666,10 +4650,7 @@ void UpgradeSettings( bool bShared )
|
||||
if (!pSetting->IsDefault())
|
||||
{
|
||||
pSettingOpt->value=pSetting->value;
|
||||
if (pSettingOpt->value==pSettingOpt->defValue)
|
||||
pSettingOpt->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingOpt->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingOpt->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
pSettingVar=FindSetting(L"SkinVariationA");
|
||||
@@ -4679,14 +4660,53 @@ void UpgradeSettings( bool bShared )
|
||||
if (!pSetting->IsDefault())
|
||||
{
|
||||
pSettingVar->value=pSetting->value;
|
||||
if (pSettingVar->value==pSettingVar->defValue)
|
||||
pSettingVar->flags|=CSetting::FLAG_DEFAULT;
|
||||
else
|
||||
pSettingVar->flags&=~CSetting::FLAG_DEFAULT;
|
||||
pSettingVar->flags&=~CSetting::FLAG_DEFAULT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static CString GetWindowsBrandingString()
|
||||
{
|
||||
CString retval;
|
||||
|
||||
if (GetWinVersion() >= WIN_VER_WIN10)
|
||||
{
|
||||
auto winbrand = LoadLibraryEx(L"winbrand.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
|
||||
if (winbrand)
|
||||
{
|
||||
PWSTR (WINAPI * BrandingFormatString)(PCWSTR pstrFormat);
|
||||
BrandingFormatString = (decltype(BrandingFormatString))GetProcAddress(winbrand, "BrandingFormatString");
|
||||
if (BrandingFormatString)
|
||||
{
|
||||
auto osName = BrandingFormatString(L"%WINDOWS_LONG%");
|
||||
if (osName)
|
||||
{
|
||||
retval = osName;
|
||||
GlobalFree(osName);
|
||||
}
|
||||
}
|
||||
|
||||
FreeLibrary(winbrand);
|
||||
}
|
||||
}
|
||||
|
||||
if (retval.IsEmpty())
|
||||
{
|
||||
// fallback for older Windows
|
||||
wchar_t title[256] = L"Windows";
|
||||
|
||||
if (CRegKey reg; reg.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion", KEY_READ) == ERROR_SUCCESS)
|
||||
{
|
||||
ULONG size = _countof(title);
|
||||
reg.QueryStringValue(L"ProductName", title, &size);
|
||||
}
|
||||
|
||||
retval = title;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
void UpdateSettings( void )
|
||||
{
|
||||
{
|
||||
@@ -4809,16 +4829,10 @@ void UpdateSettings( void )
|
||||
|
||||
UpdateSetting(L"NumericSort",CComVariant(SHRestricted(REST_NOSTRCMPLOGICAL)?0:1),false);
|
||||
|
||||
wchar_t title[256]=L"Windows";
|
||||
ULONG size=_countof(title);
|
||||
{
|
||||
CRegKey regTitle;
|
||||
if (regTitle.Open(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows NT\\CurrentVersion",KEY_READ)==ERROR_SUCCESS)
|
||||
regTitle.QueryStringValue(L"ProductName",title,&size);
|
||||
}
|
||||
UpdateSetting(L"MenuCaption",CComVariant(title),false);
|
||||
UpdateSetting(L"MenuCaption",CComVariant(GetWindowsBrandingString()),false);
|
||||
|
||||
size=_countof(title);
|
||||
wchar_t title[256]{};
|
||||
ULONG size=_countof(title);
|
||||
if (!GetUserNameEx(NameDisplay,title,&size))
|
||||
{
|
||||
// GetUserNameEx may fail (for example on Home editions). use the login name
|
||||
@@ -4949,7 +4963,7 @@ void UpdateSettings( void )
|
||||
if (GetWinVersion()>WIN_VER_WIN7)
|
||||
{
|
||||
int color=GetSystemGlassColor8();
|
||||
UpdateSetting(L"TaskbarColor",CComVariant(((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF)),false);
|
||||
UpdateSetting(L"TaskbarColor",CComVariant(RgbToBgr(color)),false);
|
||||
}
|
||||
|
||||
if (GetWinVersion()<=WIN_VER_WIN7)
|
||||
@@ -5049,15 +5063,15 @@ void UpdateSettings( void )
|
||||
HIGHCONTRAST contrast={sizeof(contrast)};
|
||||
if (SystemParametersInfo(SPI_GETHIGHCONTRAST,sizeof(contrast),&contrast,0) && (contrast.dwFlags&HCF_HIGHCONTRASTON))
|
||||
{
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1\n";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1\n";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0\n";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0\n";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0\n";
|
||||
}
|
||||
}
|
||||
else if (GetWinVersion()<WIN_VER_WIN8)
|
||||
@@ -5065,25 +5079,25 @@ void UpdateSettings( void )
|
||||
BOOL comp=FALSE;
|
||||
skin12=(SUCCEEDED(DwmIsCompositionEnabled(&comp)) && comp)?L"Windows Aero":L"Windows Basic";
|
||||
skin3=L"Windows Aero";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nWHITE_SUBMENUS=1";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nWHITE_SUBMENUS=1";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nWHITE_SUBMENUS=1";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nWHITE_SUBMENUS=1\n";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nWHITE_SUBMENUS=1\n";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nWHITE_SUBMENUS=1\n";
|
||||
}
|
||||
else if (GetWinVersion()<WIN_VER_WIN10)
|
||||
{
|
||||
skin12=L"Windows 8";
|
||||
skin3=L"Windows 8";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nOPAQUE=0\nWHITE_SUBMENUS=1";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nOPAQUE=0\nGLASS_SHADOW=0\nBLACK_TEXT=0\nBLACK_FRAMES=0\nWHITE_SUBMENUS=1";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nOPAQUE=0\nGLASS_SHADOW=0\nBLACK_TEXT=0\nBLACK_FRAMES=0\nWHITE_SUBMENUS=1";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nOPAQUE=0\nWHITE_SUBMENUS=1\n";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nOPAQUE=0\nGLASS_SHADOW=0\nBLACK_TEXT=0\nBLACK_FRAMES=0\nWHITE_SUBMENUS=1\n";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nLARGE_FONT=0\nDISABLE_MASK=0\nOPAQUE=0\nGLASS_SHADOW=0\nBLACK_TEXT=0\nBLACK_FRAMES=0\nWHITE_SUBMENUS=1\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
skin12=L"Metro";
|
||||
skin3=L"Metro";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nICON_FRAMES=1\nOPAQUE=0";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nICON_FRAMES=1\nOPAQUE=0";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nLARGE_FONT=0\nICON_FRAMES=1\nOPAQUE=0";
|
||||
options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nICON_FRAMES=1\nOPAQUE=0\n";
|
||||
options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nLARGE_FONT=0\nICON_FRAMES=1\nOPAQUE=0\n";
|
||||
options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nLARGE_FONT=0\nICON_FRAMES=1\nOPAQUE=0\n";
|
||||
}
|
||||
UpdateSetting(L"SkinC1",CComVariant(skin12),false);
|
||||
UpdateSetting(L"SkinOptionsC1",CComVariant(options1),false);
|
||||
|
||||
@@ -3235,10 +3235,14 @@ void GetSkinsPath( wchar_t *path )
|
||||
{
|
||||
GetModuleFileName(g_Instance,path,_MAX_PATH);
|
||||
*PathFindFileName(path)=0;
|
||||
#ifdef BUILD_SETUP
|
||||
Strcat(path,_MAX_PATH,L"Skins\\");
|
||||
#else
|
||||
Strcat(path,_MAX_PATH,L"..\\Skins\\");
|
||||
|
||||
#ifndef BUILD_SETUP
|
||||
if (!PathIsDirectory(path))
|
||||
{
|
||||
*PathFindFileName(path) = 0;
|
||||
Strcat(path,_MAX_PATH,L"..\\Skins\\");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -154,6 +154,7 @@ LRESULT CStartButton::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b
|
||||
OnThemeChanged(WM_THEMECHANGED,0,0,bHandled);
|
||||
m_bPressed=true;
|
||||
SetPressed(false);
|
||||
ResizeClient(m_Size.cx,m_Size.cy);
|
||||
bHandled=FALSE;
|
||||
return 0;
|
||||
}
|
||||
@@ -534,12 +535,12 @@ void CStartButton::LoadBitmap( void )
|
||||
if (!m_Bitmap)
|
||||
{
|
||||
int id;
|
||||
int dpi=CItemManager::GetDPI(false);
|
||||
int dpi=GetDpi(GetParent());
|
||||
if (dpi<120)
|
||||
id=IDB_BUTTON96;
|
||||
else if (dpi<144)
|
||||
id=IDB_BUTTON120;
|
||||
else if (dpi<180)
|
||||
else if (dpi<168)
|
||||
id=IDB_BUTTON144;
|
||||
else
|
||||
id=IDB_BUTTON180;
|
||||
@@ -604,55 +605,12 @@ void CStartButton::LoadBitmap( void )
|
||||
|
||||
static std::map<int,CStartButton> g_StartButtons;
|
||||
|
||||
HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar, const RECT &rcTask )
|
||||
HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar )
|
||||
{
|
||||
bool bRTL=(GetWindowLongPtr(rebar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL)!=0;
|
||||
DWORD styleTopmost=GetWindowLongPtr(taskBar,GWL_EXSTYLE)&WS_EX_TOPMOST;
|
||||
CStartButton &button=g_StartButtons[taskbarId];
|
||||
button.Create(taskBar,NULL,NULL,WS_POPUP,styleTopmost|WS_EX_TOOLWINDOW|WS_EX_LAYERED,0U,(void*)(intptr_t)(taskbarId*2+(bRTL?1:0)));
|
||||
SIZE size=button.GetSize();
|
||||
RECT rcButton;
|
||||
MONITORINFO info;
|
||||
UINT uEdge=GetTaskbarPosition(taskBar,&info,NULL,NULL);
|
||||
if (uEdge==ABE_LEFT || uEdge==ABE_RIGHT)
|
||||
{
|
||||
if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign"))
|
||||
rcButton.left=(rcTask.left+rcTask.right-size.cx)/2;
|
||||
else if (uEdge==ABE_LEFT)
|
||||
rcButton.left=rcTask.left;
|
||||
else
|
||||
rcButton.left=rcTask.right-size.cx;
|
||||
rcButton.top=rcTask.top;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bRTL)
|
||||
rcButton.left=rcTask.right-size.cx;
|
||||
else
|
||||
rcButton.left=rcTask.left;
|
||||
if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign"))
|
||||
rcButton.top=(rcTask.top+rcTask.bottom-size.cy)/2;
|
||||
else if (uEdge==ABE_TOP)
|
||||
rcButton.top=rcTask.top;
|
||||
else
|
||||
rcButton.top=rcTask.bottom-size.cy;
|
||||
}
|
||||
rcButton.right=rcButton.left+size.cx;
|
||||
rcButton.bottom=rcButton.top+size.cy;
|
||||
g_bAllowMoveButton=true;
|
||||
button.SetWindowPos(HWND_TOP,&rcButton,SWP_SHOWWINDOW|SWP_NOOWNERZORDER|SWP_NOACTIVATE);
|
||||
g_bAllowMoveButton=false;
|
||||
|
||||
RECT rc;
|
||||
IntersectRect(&rc,&rcButton,&info.rcMonitor);
|
||||
HRGN rgn=CreateRectRgn(rc.left-rcButton.left,rc.top-rcButton.top,rc.right-rcButton.left,rc.bottom-rcButton.top);
|
||||
if (!SetWindowRgn(button,rgn,FALSE))
|
||||
{
|
||||
AddTrackedObject(rgn);
|
||||
DeleteObject(rgn);
|
||||
}
|
||||
|
||||
button.UpdateButton();
|
||||
return button.m_hWnd;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ enum TStartButtonType
|
||||
// START_BUTTON_METRO,
|
||||
};
|
||||
|
||||
HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar, const RECT &rcTask );
|
||||
HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar );
|
||||
void DestroyStartButton( int taskbarId );
|
||||
void UpdateStartButton( int taskbarId );
|
||||
void PressStartButton( int taskbarId, bool bPressed );
|
||||
|
||||
@@ -47,7 +47,7 @@ static HWND g_Tooltip;
|
||||
static TOOLINFO g_StartButtonTool;
|
||||
static bool g_bHotkeyShift;
|
||||
static int g_HotkeyCSM, g_HotkeyWSM, g_HotkeyShiftID, g_HotkeyCSMID, g_HotkeyWSMID;
|
||||
static HHOOK g_ProgHook, g_StartHook, g_AppManagerHook, g_NewWindowHook, g_StartMenuHook;
|
||||
static HHOOK g_ProgHook, g_StartHook, g_StartMouseHook, g_AppManagerHook, g_NewWindowHook, g_StartMenuHook;
|
||||
static bool g_bAllProgramsTimer;
|
||||
static bool g_bInMenu;
|
||||
static DWORD g_LastClickTime;
|
||||
@@ -402,6 +402,7 @@ static TaskbarInfo *FindTaskBarInfoBar( HWND bar )
|
||||
|
||||
static LRESULT CALLBACK HookProgManThread( int code, WPARAM wParam, LPARAM lParam );
|
||||
static LRESULT CALLBACK HookDesktopThread( int code, WPARAM wParam, LPARAM lParam );
|
||||
static LRESULT CALLBACK HookDesktopThreadMouse(int code, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
static BOOL CALLBACK FindTooltipEnum( HWND hwnd, LPARAM lParam )
|
||||
{
|
||||
@@ -616,12 +617,12 @@ UINT GetTaskbarPosition( HWND taskBar, MONITORINFO *pInfo, HMONITOR *pMonitor, R
|
||||
if (pRc->right>rc.right) pRc->right=rc.right;
|
||||
}
|
||||
}
|
||||
HMONITOR monitor=MonitorFromRect(&appbar.rc,MONITOR_DEFAULTTONEAREST);
|
||||
if (pMonitor) *pMonitor=monitor;
|
||||
if (pInfo)
|
||||
{
|
||||
pInfo->cbSize=sizeof(MONITORINFO);
|
||||
HMONITOR monitor=MonitorFromRect(&appbar.rc,MONITOR_DEFAULTTONEAREST);
|
||||
GetMonitorInfo(monitor,pInfo);
|
||||
if (pMonitor) *pMonitor=monitor;
|
||||
}
|
||||
return appbar.uEdge;
|
||||
}
|
||||
@@ -671,21 +672,45 @@ UINT GetTaskbarPosition( HWND taskBar, MONITORINFO *pInfo, HMONITOR *pMonitor, R
|
||||
bool PointAroundStartButton( size_t taskbarId, const CPoint &pt )
|
||||
{
|
||||
const TaskbarInfo *taskBar=GetTaskbarInfo(taskbarId);
|
||||
if (!taskBar || !taskBar->startButton) return false;
|
||||
RECT rc;
|
||||
if (!taskBar || !(taskBar->startButton || taskBar->oldButton)) return false;
|
||||
CRect rc;
|
||||
GetWindowRect(taskBar->taskBar,&rc);
|
||||
if (!PtInRect(&rc,pt))
|
||||
return false;
|
||||
|
||||
UINT uEdge=GetTaskbarPosition(taskBar->taskBar,NULL,NULL,NULL);
|
||||
bool rtl=GetWindowLongPtr(taskBar->taskBar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL;
|
||||
|
||||
CRect rcStart;
|
||||
if (taskBar->startButton)
|
||||
GetWindowRect(taskBar->startButton,&rcStart);
|
||||
|
||||
CRect rcOld;
|
||||
if (taskBar->oldButton)
|
||||
{
|
||||
GetWindowRect(taskBar->oldButton,&rcOld);
|
||||
|
||||
if (IsWin11())
|
||||
{
|
||||
// on Win11 the Start button rectangle is a bit smaller that actual XAML active area
|
||||
// lets make it a bit wider to avoid accidental original Start menu triggers
|
||||
const int adjust=ScaleForDpi(taskBar->taskBar,1);
|
||||
if (rtl)
|
||||
rcOld.left-=adjust;
|
||||
else
|
||||
rcOld.right+=adjust;
|
||||
}
|
||||
}
|
||||
|
||||
rc.UnionRect(&rcStart,&rcOld);
|
||||
|
||||
// check if the point is inside the start button rect
|
||||
GetWindowRect(taskBar->startButton,&rc);
|
||||
UINT uEdge=GetTaskbarPosition(taskBar->taskBar,NULL,NULL,NULL);
|
||||
if (uEdge==ABE_LEFT || uEdge==ABE_RIGHT)
|
||||
return pt.y<rc.bottom;
|
||||
else if (GetWindowLongPtr(taskBar->taskBar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL)
|
||||
return pt.x>rc.left;
|
||||
return pt.y>=rc.top && pt.y<rc.bottom;
|
||||
else if (rtl)
|
||||
return pt.x>rc.left && pt.x<=rc.right;
|
||||
else
|
||||
return pt.x<rc.right;
|
||||
return pt.x>=rc.left && pt.x<rc.right;
|
||||
}
|
||||
|
||||
// declare few interfaces so we don't need the Win8 SDK
|
||||
@@ -1186,24 +1211,156 @@ void EnableHotkeys( THotkeys enable )
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdateStartButtonPosition(const TaskbarInfo* taskBar, const WINDOWPOS* pPos)
|
||||
{
|
||||
if (IsStartButtonSmallIcons(taskBar->taskbarId) != IsTaskbarSmallIcons())
|
||||
RecreateStartButton(taskBar->taskbarId);
|
||||
|
||||
RECT rcTask;
|
||||
GetWindowRect(taskBar->taskBar, &rcTask);
|
||||
MONITORINFO info;
|
||||
UINT uEdge = GetTaskbarPosition(taskBar->taskBar, &info, NULL, NULL);
|
||||
DWORD buttonFlags = SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE;
|
||||
if (IsWindowVisible(taskBar->taskBar))
|
||||
buttonFlags |= SWP_SHOWWINDOW;
|
||||
else
|
||||
buttonFlags |= SWP_HIDEWINDOW;
|
||||
|
||||
APPBARDATA appbar = { sizeof(appbar) };
|
||||
if (SHAppBarMessage(ABM_GETSTATE, &appbar) & ABS_AUTOHIDE)
|
||||
{
|
||||
bool bHide = false;
|
||||
if (uEdge == ABE_LEFT)
|
||||
bHide = (rcTask.right < info.rcMonitor.left + 5);
|
||||
else if (uEdge == ABE_RIGHT)
|
||||
bHide = (rcTask.left > info.rcMonitor.right - 5);
|
||||
else if (uEdge == ABE_TOP)
|
||||
bHide = (rcTask.bottom < info.rcMonitor.top + 5);
|
||||
else
|
||||
bHide = (rcTask.top > info.rcMonitor.bottom - 5);
|
||||
if (bHide)
|
||||
buttonFlags = (buttonFlags & ~SWP_SHOWWINDOW) | SWP_HIDEWINDOW;
|
||||
}
|
||||
if (uEdge == ABE_TOP || uEdge == ABE_BOTTOM)
|
||||
{
|
||||
if (rcTask.left < info.rcMonitor.left) rcTask.left = info.rcMonitor.left;
|
||||
if (rcTask.right > info.rcMonitor.right) rcTask.right = info.rcMonitor.right;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rcTask.top < info.rcMonitor.top) rcTask.top = info.rcMonitor.top;
|
||||
}
|
||||
|
||||
HWND zPos = NULL;
|
||||
if (pPos->flags & SWP_NOZORDER)
|
||||
buttonFlags |= SWP_NOZORDER;
|
||||
else
|
||||
{
|
||||
zPos = pPos->hwndInsertAfter;
|
||||
if (zPos == HWND_TOP && !(GetWindowLongPtr(taskBar->startButton, GWL_EXSTYLE) & WS_EX_TOPMOST))
|
||||
zPos = HWND_TOPMOST;
|
||||
if (zPos == HWND_TOPMOST && !(GetWindowLongPtr(taskBar->taskBar, GWL_EXSTYLE) & WS_EX_TOPMOST))
|
||||
zPos = HWND_TOP;
|
||||
if (zPos == HWND_BOTTOM)
|
||||
buttonFlags |= SWP_NOZORDER;
|
||||
if (zPos == taskBar->startButton)
|
||||
buttonFlags |= SWP_NOZORDER;
|
||||
}
|
||||
|
||||
if (!IsStartButtonSmallIcons(taskBar->taskbarId))
|
||||
{
|
||||
bool bClassic;
|
||||
if (GetWinVersion() < WIN_VER_WIN8)
|
||||
bClassic = !IsAppThemed();
|
||||
else
|
||||
{
|
||||
HIGHCONTRAST contrast = { sizeof(contrast) };
|
||||
bClassic = (SystemParametersInfo(SPI_GETHIGHCONTRAST, sizeof(contrast), &contrast, 0) && (contrast.dwFlags & HCF_HIGHCONTRASTON));
|
||||
}
|
||||
if (!bClassic)
|
||||
{
|
||||
if (uEdge == ABE_TOP)
|
||||
OffsetRect(&rcTask, 0, -1);
|
||||
else if (uEdge == ABE_BOTTOM)
|
||||
OffsetRect(&rcTask, 0, 1);
|
||||
}
|
||||
}
|
||||
|
||||
RECT rcOldButton;
|
||||
if (taskBar->oldButton)
|
||||
GetWindowRect(taskBar->oldButton, &rcOldButton);
|
||||
|
||||
int x, y;
|
||||
if (uEdge == ABE_LEFT || uEdge == ABE_RIGHT)
|
||||
{
|
||||
if (GetSettingInt(L"StartButtonType") != START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign"))
|
||||
x = (rcTask.left + rcTask.right - taskBar->startButtonSize.cx) / 2;
|
||||
else if (uEdge == ABE_LEFT)
|
||||
x = rcTask.left;
|
||||
else
|
||||
x = rcTask.right - taskBar->startButtonSize.cx;
|
||||
y = taskBar->oldButton ? rcOldButton.top : rcTask.top;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetWindowLongPtr(taskBar->rebar, GWL_EXSTYLE) & WS_EX_LAYOUTRTL)
|
||||
x = (taskBar->oldButton ? rcOldButton.right : rcTask.right) - taskBar->startButtonSize.cx;
|
||||
else
|
||||
x = taskBar->oldButton ? rcOldButton.left : rcTask.left;
|
||||
if (GetSettingInt(L"StartButtonType") != START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign"))
|
||||
y = (rcTask.top + rcTask.bottom - taskBar->startButtonSize.cy) / 2;
|
||||
else if (uEdge == ABE_TOP)
|
||||
y = rcTask.top;
|
||||
else
|
||||
y = rcTask.bottom - taskBar->startButtonSize.cy;
|
||||
}
|
||||
|
||||
// Start button on Win11 is a bit shifted to the right
|
||||
// We will shift our Aero button to cover original button
|
||||
if (IsWin11() && (x == 0) && (GetStartButtonType() == START_BUTTON_AERO))
|
||||
x += ScaleForDpi(taskBar->taskBar, 6);
|
||||
|
||||
RECT rcButton = { x, y, x + taskBar->startButtonSize.cx, y + taskBar->startButtonSize.cy };
|
||||
RECT rc;
|
||||
IntersectRect(&rc, &rcButton, &info.rcMonitor);
|
||||
HRGN rgn = CreateRectRgn(rc.left - x, rc.top - y, rc.right - x, rc.bottom - y);
|
||||
if (!SetWindowRgn(taskBar->startButton, rgn, FALSE))
|
||||
{
|
||||
AddTrackedObject(rgn);
|
||||
DeleteObject(rgn);
|
||||
}
|
||||
|
||||
SetWindowPos(taskBar->startButton, zPos, x, y, 0, 0, buttonFlags);
|
||||
|
||||
if (buttonFlags & SWP_SHOWWINDOW)
|
||||
UpdateStartButton(taskBar->taskbarId);
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK SubclassWin81StartButton( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData )
|
||||
{
|
||||
TaskbarInfo* taskBar = GetTaskbarInfo((int)dwRefData);
|
||||
|
||||
if (uMsg==WM_WINDOWPOSCHANGING)
|
||||
{
|
||||
// keep the original start button hidden at all times
|
||||
const TaskbarInfo *taskBar=GetTaskbarInfo((int)dwRefData);
|
||||
if (taskBar && taskBar->bHideButton)
|
||||
{
|
||||
((WINDOWPOS*)lParam)->flags&=~SWP_SHOWWINDOW;
|
||||
}
|
||||
}
|
||||
if (uMsg==WM_WINDOWPOSCHANGED)
|
||||
{
|
||||
if (taskBar && taskBar->bReplaceButton)
|
||||
{
|
||||
UpdateStartButtonPosition(taskBar,(WINDOWPOS*)lParam);
|
||||
}
|
||||
}
|
||||
if (uMsg==WM_SIZE)
|
||||
{
|
||||
RECT rc;
|
||||
GetWindowRect(hWnd,&rc);
|
||||
rc.right-=rc.left;
|
||||
rc.bottom-=rc.top;
|
||||
TaskbarInfo *taskBar=GetTaskbarInfo((int)dwRefData);
|
||||
if (taskBar && (taskBar->oldButtonSize.cx!=rc.right || taskBar->oldButtonSize.cy!=rc.bottom))
|
||||
{
|
||||
taskBar->oldButtonSize.cx=rc.right;
|
||||
@@ -1467,6 +1624,15 @@ static void ComputeTaskbarColors( int *data )
|
||||
|
||||
static void ShowWinX( void )
|
||||
{
|
||||
if (IsWin11())
|
||||
{
|
||||
HWND hwnd=FindWindowEx(NULL,NULL,L"Shell_TrayWnd",NULL);
|
||||
if (hwnd)
|
||||
PostMessage(hwnd,WM_HOTKEY,590,MAKELPARAM(MOD_WIN,'X'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (GetWinVersion()>=WIN_VER_WIN10)
|
||||
{
|
||||
CComPtr<IUnknown> pImmersiveShell;
|
||||
@@ -1651,116 +1817,7 @@ static LRESULT CALLBACK SubclassTaskBarProc( HWND hWnd, UINT uMsg, WPARAM wParam
|
||||
{
|
||||
if (taskBar->bReplaceButton)
|
||||
{
|
||||
if (IsStartButtonSmallIcons(taskBar->taskbarId)!=IsTaskbarSmallIcons())
|
||||
RecreateStartButton((int)dwRefData);
|
||||
|
||||
WINDOWPOS *pPos=(WINDOWPOS*)lParam;
|
||||
RECT rcTask;
|
||||
GetWindowRect(hWnd,&rcTask);
|
||||
MONITORINFO info;
|
||||
UINT uEdge=GetTaskbarPosition(hWnd,&info,NULL,NULL);
|
||||
DWORD buttonFlags=SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE;
|
||||
if (IsWindowVisible(taskBar->taskBar))
|
||||
buttonFlags|=SWP_SHOWWINDOW;
|
||||
else
|
||||
buttonFlags|=SWP_HIDEWINDOW;
|
||||
|
||||
APPBARDATA appbar={sizeof(appbar)};
|
||||
if (SHAppBarMessage(ABM_GETSTATE,&appbar)&ABS_AUTOHIDE)
|
||||
{
|
||||
bool bHide=false;
|
||||
if (uEdge==ABE_LEFT)
|
||||
bHide=(rcTask.right<info.rcMonitor.left+5);
|
||||
else if (uEdge==ABE_RIGHT)
|
||||
bHide=(rcTask.left>info.rcMonitor.right-5);
|
||||
else if (uEdge==ABE_TOP)
|
||||
bHide=(rcTask.bottom<info.rcMonitor.top+5);
|
||||
else
|
||||
bHide=(rcTask.top>info.rcMonitor.bottom-5);
|
||||
if (bHide)
|
||||
buttonFlags=(buttonFlags&~SWP_SHOWWINDOW)|SWP_HIDEWINDOW;
|
||||
}
|
||||
if (uEdge==ABE_TOP || uEdge==ABE_BOTTOM)
|
||||
{
|
||||
if (rcTask.left<info.rcMonitor.left) rcTask.left=info.rcMonitor.left;
|
||||
if (rcTask.right>info.rcMonitor.right) rcTask.right=info.rcMonitor.right;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rcTask.top<info.rcMonitor.top) rcTask.top=info.rcMonitor.top;
|
||||
}
|
||||
if (!IsStartButtonSmallIcons(taskBar->taskbarId))
|
||||
{
|
||||
bool bClassic;
|
||||
if (GetWinVersion()<WIN_VER_WIN8)
|
||||
bClassic=!IsAppThemed();
|
||||
else
|
||||
{
|
||||
HIGHCONTRAST contrast={sizeof(contrast)};
|
||||
bClassic=(SystemParametersInfo(SPI_GETHIGHCONTRAST,sizeof(contrast),&contrast,0) && (contrast.dwFlags&HCF_HIGHCONTRASTON));
|
||||
}
|
||||
if (!bClassic)
|
||||
{
|
||||
if (uEdge==ABE_TOP)
|
||||
OffsetRect(&rcTask,0,-1);
|
||||
else if (uEdge==ABE_BOTTOM)
|
||||
OffsetRect(&rcTask,0,1);
|
||||
}
|
||||
}
|
||||
HWND zPos=NULL;
|
||||
if (pPos->flags&SWP_NOZORDER)
|
||||
buttonFlags|=SWP_NOZORDER;
|
||||
else
|
||||
{
|
||||
zPos=pPos->hwndInsertAfter;
|
||||
if (zPos==HWND_TOP && !(GetWindowLongPtr(taskBar->startButton,GWL_EXSTYLE)&WS_EX_TOPMOST))
|
||||
zPos=HWND_TOPMOST;
|
||||
if (zPos==HWND_TOPMOST && !(GetWindowLongPtr(hWnd,GWL_EXSTYLE)&WS_EX_TOPMOST))
|
||||
zPos=HWND_TOP;
|
||||
if (zPos==HWND_BOTTOM)
|
||||
buttonFlags|=SWP_NOZORDER;
|
||||
if (zPos==taskBar->startButton)
|
||||
buttonFlags|=SWP_NOZORDER;
|
||||
}
|
||||
|
||||
int x, y;
|
||||
if (uEdge==ABE_LEFT || uEdge==ABE_RIGHT)
|
||||
{
|
||||
if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign"))
|
||||
x=(rcTask.left+rcTask.right-taskBar->startButtonSize.cx)/2;
|
||||
else if (uEdge==ABE_LEFT)
|
||||
x=rcTask.left;
|
||||
else
|
||||
x=rcTask.right-taskBar->startButtonSize.cx;
|
||||
y=rcTask.top;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetWindowLongPtr(taskBar->rebar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL)
|
||||
x=rcTask.right-taskBar->startButtonSize.cx;
|
||||
else
|
||||
x=rcTask.left;
|
||||
if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign"))
|
||||
y=(rcTask.top+rcTask.bottom-taskBar->startButtonSize.cy)/2;
|
||||
else if (uEdge==ABE_TOP)
|
||||
y=rcTask.top;
|
||||
else
|
||||
y=rcTask.bottom-taskBar->startButtonSize.cy;
|
||||
}
|
||||
RECT rcButton={x,y,x+taskBar->startButtonSize.cx,y+taskBar->startButtonSize.cy};
|
||||
RECT rc;
|
||||
IntersectRect(&rc,&rcButton,&info.rcMonitor);
|
||||
HRGN rgn=CreateRectRgn(rc.left-x,rc.top-y,rc.right-x,rc.bottom-y);
|
||||
if (!SetWindowRgn(taskBar->startButton,rgn,FALSE))
|
||||
{
|
||||
AddTrackedObject(rgn);
|
||||
DeleteObject(rgn);
|
||||
}
|
||||
g_bAllowMoveButton=true;
|
||||
SetWindowPos(taskBar->startButton,zPos,x,y,0,0,buttonFlags);
|
||||
g_bAllowMoveButton=false;
|
||||
if (buttonFlags&SWP_SHOWWINDOW)
|
||||
UpdateStartButton(taskBar->taskbarId);
|
||||
UpdateStartButtonPosition(taskBar,(WINDOWPOS*)lParam);
|
||||
}
|
||||
if (taskBar->oldButton && GetWinVersion()<WIN_VER_WIN10)
|
||||
{
|
||||
@@ -2872,6 +2929,9 @@ static void InitStartMenuDLL( void )
|
||||
DWORD progThread=GetWindowThreadProcessId(g_ProgWin,NULL);
|
||||
g_ProgHook=SetWindowsHookEx(WH_GETMESSAGE,HookProgManThread,NULL,progThread);
|
||||
g_StartHook=SetWindowsHookEx(WH_GETMESSAGE,HookDesktopThread,NULL,GetCurrentThreadId());
|
||||
if (IsWin11())
|
||||
g_StartMouseHook=SetWindowsHookEx(WH_MOUSE,HookDesktopThreadMouse,NULL,GetCurrentThreadId());
|
||||
|
||||
HWND hwnd=FindWindow(L"OpenShellMenu.CStartHookWindow",L"StartHookWindow");
|
||||
LoadLibrary(L"StartMenuDLL.dll"); // keep the DLL from unloading
|
||||
if (hwnd) PostMessage(hwnd,WM_CLEAR,0,0); // tell the exe to unhook this hook
|
||||
@@ -2993,39 +3053,6 @@ static void RecreateStartButton( size_t taskbarId )
|
||||
continue;
|
||||
if (taskBar.bRecreatingButton)
|
||||
continue;
|
||||
RECT rcTask;
|
||||
GetWindowRect(taskBar.taskBar,&rcTask);
|
||||
RECT rcTask2=rcTask;
|
||||
MONITORINFO info;
|
||||
UINT uEdge=GetTaskbarPosition(taskBar.taskBar,&info,NULL,NULL);
|
||||
if (uEdge==ABE_TOP || uEdge==ABE_BOTTOM)
|
||||
{
|
||||
if (rcTask2.left<info.rcMonitor.left) rcTask2.left=info.rcMonitor.left;
|
||||
if (rcTask2.right>info.rcMonitor.right) rcTask2.right=info.rcMonitor.right;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rcTask2.top<info.rcMonitor.top) rcTask2.top=info.rcMonitor.top;
|
||||
}
|
||||
|
||||
if (!IsTaskbarSmallIcons())
|
||||
{
|
||||
bool bClassic;
|
||||
if (GetWinVersion()<WIN_VER_WIN8)
|
||||
bClassic=!IsAppThemed();
|
||||
else
|
||||
{
|
||||
HIGHCONTRAST contrast={sizeof(contrast)};
|
||||
bClassic=(SystemParametersInfo(SPI_GETHIGHCONTRAST,sizeof(contrast),&contrast,0) && (contrast.dwFlags&HCF_HIGHCONTRASTON));
|
||||
}
|
||||
if (!bClassic)
|
||||
{
|
||||
if (uEdge==ABE_TOP)
|
||||
OffsetRect(&rcTask2,0,-1);
|
||||
else if (uEdge==ABE_BOTTOM)
|
||||
OffsetRect(&rcTask2,0,1);
|
||||
}
|
||||
}
|
||||
|
||||
taskBar.bRecreatingButton=true;
|
||||
{
|
||||
@@ -3034,7 +3061,7 @@ static void RecreateStartButton( size_t taskbarId )
|
||||
RevokeDragDrop(taskBar.startButton);
|
||||
DestroyStartButton(taskBar.taskbarId);
|
||||
}
|
||||
taskBar.startButton=CreateStartButton(taskBar.taskbarId,taskBar.taskBar,taskBar.rebar,rcTask2);
|
||||
taskBar.startButton=CreateStartButton(taskBar.taskbarId,taskBar.taskBar,taskBar.rebar);
|
||||
CStartMenuTarget *pNewTarget=new CStartMenuTarget(taskBar.taskbarId);
|
||||
RegisterDragDrop(taskBar.startButton,pNewTarget);
|
||||
pNewTarget->Release();
|
||||
@@ -3050,6 +3077,8 @@ static void RecreateStartButton( size_t taskbarId )
|
||||
taskBar.oldButtonSize.cy=rc.bottom-rc.top;
|
||||
}
|
||||
|
||||
RECT rcTask;
|
||||
GetWindowRect(taskBar.taskBar,&rcTask);
|
||||
PostMessage(taskBar.taskBar,WM_SIZE,SIZE_RESTORED,MAKELONG(rcTask.right-rcTask.left,rcTask.bottom-rcTask.top));
|
||||
}
|
||||
}
|
||||
@@ -3099,6 +3128,8 @@ static void CleanStartMenuDLL( void )
|
||||
HWND hwnd=FindWindow(L"OpenShellMenu.CStartHookWindow",L"StartHookWindow");
|
||||
UnhookWindowsHookEx(g_ProgHook);
|
||||
UnhookWindowsHookEx(g_StartHook);
|
||||
if (g_StartMouseHook) UnhookWindowsHookEx(g_StartMouseHook);
|
||||
g_StartMouseHook=NULL;
|
||||
if (g_AppManagerHook) UnhookWindowsHookEx(g_AppManagerHook);
|
||||
g_AppManagerHook=NULL;
|
||||
if (g_NewWindowHook) UnhookWindowsHookEx(g_NewWindowHook);
|
||||
@@ -3120,7 +3151,8 @@ static void CleanStartMenuDLL( void )
|
||||
if (it->second.oldButton)
|
||||
{
|
||||
RemoveWindowSubclass(it->second.oldButton,SubclassWin81StartButton,'CLSH');
|
||||
SetWindowPos(it->second.oldButton,NULL,0,0,0,0,SWP_NOSIZE|SWP_NOZORDER);
|
||||
if (GetWinVersion()<WIN_VER_WIN10 && GetTaskbarPosition(it->second.taskBar,NULL,NULL,NULL)==ABE_BOTTOM)
|
||||
SetWindowPos(it->second.oldButton,NULL,0,0,0,0,SWP_NOSIZE|SWP_NOZORDER);
|
||||
RevokeDragDrop(it->second.oldButton);
|
||||
if (it->second.pOriginalTarget)
|
||||
RegisterDragDrop(it->second.oldButton,it->second.pOriginalTarget);
|
||||
@@ -3383,6 +3415,35 @@ static LRESULT CALLBACK HookProgManThread( int code, WPARAM wParam, LPARAM lPara
|
||||
return CallNextHookEx(NULL,code,wParam,lParam);
|
||||
}
|
||||
|
||||
// WH_MOUSE hook for taskbar thread (Win11+)
|
||||
static LRESULT CALLBACK HookDesktopThreadMouse(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (code == HC_ACTION)
|
||||
{
|
||||
// we need to steal mouse messages that are issues in start button area
|
||||
// so that they won't get to XAML framework that is handling original start button
|
||||
auto info = (const MOUSEHOOKSTRUCT*)lParam;
|
||||
{
|
||||
auto taskBar = FindTaskBarInfoButton(info->hwnd); // click on start button
|
||||
if (!taskBar)
|
||||
{
|
||||
taskBar = FindTaskBarInfoBar(GetAncestor(info->hwnd, GA_ROOT)); // click on taskbar
|
||||
if (taskBar && !PointAroundStartButton(taskBar->taskbarId))
|
||||
taskBar = NULL;
|
||||
}
|
||||
|
||||
if (taskBar && (info->hwnd != taskBar->startButton) && taskBar->oldButton)
|
||||
{
|
||||
// steal messages from other than our custom button window
|
||||
PostMessage(taskBar->oldButton, (UINT)wParam, 0, MAKELPARAM(info->pt.x, info->pt.y));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return CallNextHookEx(NULL, code, wParam, lParam);
|
||||
}
|
||||
|
||||
// WH_GETMESSAGE hook for the taskbar thread
|
||||
static LRESULT CALLBACK HookDesktopThread( int code, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
@@ -3861,9 +3922,13 @@ if (!g_bTrimHooks)
|
||||
|
||||
// right-click on the start button - open the context menu (Settings, Help, Exit)
|
||||
HMENU menu=CreatePopupMenu();
|
||||
CString title=LoadStringEx(IDS_MENU_TITLE);
|
||||
if (!title.IsEmpty())
|
||||
CString titleFmt=LoadStringEx(IDS_MENU_TITLE);
|
||||
if (!titleFmt.IsEmpty())
|
||||
{
|
||||
CString title;
|
||||
DWORD ver=GetVersionEx(g_Instance);
|
||||
title.Format(titleFmt,ver>>24,(ver>>16)&0xFF,ver&0xFFFF);
|
||||
|
||||
AppendMenu(menu,MF_STRING,0,title);
|
||||
EnableMenuItem(menu,0,MF_BYPOSITION|MF_DISABLED);
|
||||
SetMenuDefaultItem(menu,0,TRUE);
|
||||
|
||||
@@ -51,7 +51,7 @@ struct TaskbarInfo
|
||||
int taskbarId;
|
||||
HWND taskBar;
|
||||
HWND startButton; // either own start button or the win7 start button (depending on bReplaceButton)
|
||||
HWND oldButton; // win81 start button (child of taskBar)
|
||||
HWND oldButton; // win8.1+ start button (child of taskBar)
|
||||
HWND rebar;
|
||||
HWND taskList;
|
||||
HWND chevron;
|
||||
@@ -61,8 +61,8 @@ struct TaskbarInfo
|
||||
int pointerId;
|
||||
bool bTimer;
|
||||
bool bCustomLook;
|
||||
bool bReplaceButton;
|
||||
bool bHideButton;
|
||||
bool bReplaceButton; // replace start button with own one
|
||||
bool bHideButton; // hide old start button (if we have own button)
|
||||
bool bRecreatingButton;
|
||||
bool bThemeChanging;
|
||||
std::vector<HWND> trayButtons; // ordered by Z order (for win10)
|
||||
|
||||
@@ -427,7 +427,7 @@ BEGIN
|
||||
IDS_SKIN_ERR_LOAD_FILE "Failed to load the variation skin file %s.\r\n"
|
||||
IDS_SKIN_ERR_LOAD "Error loading %s\n%s"
|
||||
IDS_SKIN_ERR_VERSION "The selected skin is not compatible with this version of the start menu.\r\n"
|
||||
IDS_MENU_TITLE "== Open-Shell Menu =="
|
||||
IDS_MENU_TITLE "Open-Shell Menu %d.%d.%d"
|
||||
IDS_DEFAULT_SKIN "<No Skin>"
|
||||
IDS_CONTROLS_SETTINGS "Controls"
|
||||
IDS_OPEN_NOTHING "Nothing"
|
||||
@@ -1082,7 +1082,7 @@ BEGIN
|
||||
IDS_MIN_HEIGHT_TIP "The main menu will be at least as tall as this many search results"
|
||||
IDS_GLASS_OVERRIDE "Override glass color"
|
||||
IDS_GLASS_OVERRIDE_TIP "Check this to override the system glass color to use in the menu"
|
||||
IDS_GLASS_COLOR "Menu glass color"
|
||||
IDS_GLASS_COLOR "Menu glass color (RRGGBB)"
|
||||
IDS_GLASS_COLOR_TIP "Select the glass color to use in the menu. How much this color affects the menu will depend on the selected skin"
|
||||
IDS_GLASS_INTENSITY "Menu glass intensity"
|
||||
IDS_GLASS_INTENSITY_TIP "Select the intensity (brightness) for the glass color in the menu (0 - dark, 100 - bright)"
|
||||
@@ -1144,17 +1144,17 @@ BEGIN
|
||||
IDS_STRING7024 "Shadows on glass#The text and the arrows in the second column of the main menu will have a drop shadow"
|
||||
IDS_STRING7025 "Opaque"
|
||||
IDS_STRING7026 "Main menu color"
|
||||
IDS_STRING7027 "Custom color#Select custom color for the main menu"
|
||||
IDS_STRING7027 "Custom color (RRGGBB)#Select custom color for the main menu"
|
||||
IDS_STRING7028 "Sub-menu color"
|
||||
IDS_STRING7029 "Custom color#Select custom color for the sub-menus"
|
||||
IDS_STRING7029 "Custom color (RRGGBB)#Select custom color for the sub-menus"
|
||||
IDS_STRING7030 "Silver"
|
||||
IDS_STRING7031 "Gold"
|
||||
IDS_STRING7032 "Steel"
|
||||
IDS_STRING7033 "Titanium"
|
||||
IDS_STRING7034 "Image for first column#Select custom image for the first column of the main menu"
|
||||
IDS_STRING7035 "Image for second column#Select custom image for the second column of the main menu"
|
||||
IDS_STRING7036 "Text color for first column#Select custom color for the first column of the main menu text"
|
||||
IDS_STRING7037 "Text color for second column#Select custom color for the second column of the main menu text"
|
||||
IDS_STRING7036 "Text color for first column (RRGGBB)#Select custom color for the first column of the main menu text"
|
||||
IDS_STRING7037 "Text color for second column (RRGGBB)#Select custom color for the second column of the main menu text"
|
||||
IDS_STRING7038 "Text size#Select custom size for the main menu text"
|
||||
END
|
||||
|
||||
@@ -1249,7 +1249,7 @@ BEGIN
|
||||
IDS_TASK_AEROGLASS_TIP "The taskbar will have glass transparency that is compatible with the Aero Glass mod"
|
||||
IDS_TASK_OPACITY "Taskbar opacity"
|
||||
IDS_TASK_OPACITY_TIP "Set the opacity for the taskbar (0 - transparent, 100 - opaque)"
|
||||
IDS_TASK_COLOR "Taskbar color"
|
||||
IDS_TASK_COLOR "Taskbar color (RRGGBB)"
|
||||
IDS_TASK_COLOR_TIP "Set the color for the taskbar"
|
||||
IDS_PCSETTINGS "Settings"
|
||||
IDS_PCSETTINGS_TIP "Shows the modern Settings window"
|
||||
@@ -1288,7 +1288,7 @@ BEGIN
|
||||
IDS_TASK_BORDERS "Border sizes"
|
||||
IDS_TASK_BORDERS_TIP "Select how many pixel on each side of the texture to exclude from stretching"
|
||||
IDS_TASKBAR_SETTINGS "Taskbar"
|
||||
IDS_TASK_TEXTCOLOR "Taskbar text color"
|
||||
IDS_TASK_TEXTCOLOR "Taskbar text color (RRGGBB)"
|
||||
IDS_TASK_TEXTCOLOR_TIP "Select the color for the text on the taskbar"
|
||||
IDS_SELECT_LAST "Select the last item in shutdown menu"
|
||||
IDS_SELECT_LAST_TIP "When this is checked, the last item will be selected by default when the shutdown menu is opened with the keyboard"
|
||||
@@ -1300,7 +1300,7 @@ BEGIN
|
||||
IDS_NO_DBLCLICK "Single-click to open folder shortcuts"
|
||||
IDS_NO_DBLCLICK_TIP "When this is checked, single-clicking shortcuts (links) to folders will open them in explorer. Hovering over the shortcut will still expand sub-menus"
|
||||
IDS_BOLD_SETTINGS "Highlight modified settings"
|
||||
IDS_BOLD_SETTINGS_TIP "When this is checked, settings that have been modified from their defaults will be highlighted in bold"
|
||||
IDS_BOLD_SETTINGS_TIP "When this is checked, settings that have been modified will be highlighted in bold"
|
||||
IDS_SEARCH_HINT "Custom search hint"
|
||||
IDS_SEARCH_HINT_TIP "When this is checked, the hint text in the search box will be replaced"
|
||||
IDS_NEW_SEARCH_HINT "Custom search hint text"
|
||||
|
||||
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
@@ -9,6 +9,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "ModernSettings.h"
|
||||
#include "ModernSettingsShellFolder.h"
|
||||
#include "ResourceHelper.h"
|
||||
#include <propkey.h>
|
||||
#include <strsafe.h>
|
||||
#include <Uxtheme.h>
|
||||
@@ -181,7 +182,7 @@ HICON IconFromGlyph(UINT glyph, UINT size)
|
||||
HDC dc = CreateCompatibleDC(nullptr);
|
||||
SelectObject(dc, info.hbmColor);
|
||||
|
||||
HFONT font = CreateFontW(size, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, L"Segoe MDL2 Assets");
|
||||
HFONT font = CreateFontW(size, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, IsWin11() ? L"Segoe Fluent Icons" : L"Segoe MDL2 Assets");
|
||||
SelectObject(dc, font);
|
||||
|
||||
RECT rc{};
|
||||
|
||||
@@ -21,5 +21,5 @@ deploy:
|
||||
on:
|
||||
APPVEYOR_ACCOUNT_NAME: passionate-coder
|
||||
auth_token:
|
||||
secure: 01CsOFRdj9KFb1hp/RlFK/F1UzGhzwGQfok6OoqcL1ipbOwRF//Phbdm7iaFVWIx
|
||||
secure: D0QZnRZfea3qJlWOwrxE6M2jrbiSrOfz/6U7RzdeeG8N0qNDFKI7LFjYyw2I/PcR
|
||||
prerelease: true
|
||||
|
||||