mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-24 22:34:54 +02:00
Fix dark mode visual glichy in explorer panel under Windows 8.1
Add checks for 'DarkMode_Explorer' theme style Fix #11898, close #11913
This commit is contained in:
parent
e90284ea4b
commit
bbf3adb9bb
@ -257,7 +257,12 @@ constexpr bool CheckBuildNumber(DWORD buildNumber)
|
|||||||
buildNumber == 19043 || // 21H1
|
buildNumber == 19043 || // 21H1
|
||||||
buildNumber == 19044 || // 21H2
|
buildNumber == 19044 || // 21H2
|
||||||
(buildNumber > 19044 && buildNumber < 22000) || // Windows 10 any version > 21H2
|
(buildNumber > 19044 && buildNumber < 22000) || // Windows 10 any version > 21H2
|
||||||
buildNumber >= 22000); // Windows 11 insider builds
|
buildNumber >= 22000); // Windows 11 builds
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsWindows10() // or later OS version
|
||||||
|
{
|
||||||
|
return (g_buildNumber >= 17763);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsWindows11() // or later OS version
|
bool IsWindows11() // or later OS version
|
||||||
|
@ -15,4 +15,5 @@ void AllowDarkModeForApp(bool allow);
|
|||||||
void EnableDarkScrollBarForWindowAndChildren(HWND hwnd);
|
void EnableDarkScrollBarForWindowAndChildren(HWND hwnd);
|
||||||
void InitDarkMode();
|
void InitDarkMode();
|
||||||
void SetDarkMode(bool useDarkMode, bool fixDarkScrollbar);
|
void SetDarkMode(bool useDarkMode, bool fixDarkScrollbar);
|
||||||
|
bool IsWindows10();
|
||||||
bool IsWindows11();
|
bool IsWindows11();
|
||||||
|
@ -349,12 +349,16 @@ namespace NppDarkMode
|
|||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool g_isAtLeastWindows10 = false;
|
||||||
|
|
||||||
void initDarkMode()
|
void initDarkMode()
|
||||||
{
|
{
|
||||||
_options = configuredOptions();
|
_options = configuredOptions();
|
||||||
|
|
||||||
initExperimentalDarkMode();
|
initExperimentalDarkMode();
|
||||||
setDarkMode(_options.enable, true);
|
setDarkMode(_options.enable, true);
|
||||||
|
|
||||||
|
g_isAtLeastWindows10 = NppDarkMode::isWindows10();
|
||||||
}
|
}
|
||||||
|
|
||||||
// attempts to apply new options from NppParameters, sends NPPM_INTERNAL_REFRESHDARKMODE to hwnd's top level parent
|
// attempts to apply new options from NppParameters, sends NPPM_INTERNAL_REFRESHDARKMODE to hwnd's top level parent
|
||||||
@ -416,6 +420,11 @@ namespace NppDarkMode
|
|||||||
return g_darkModeSupported;
|
return g_darkModeSupported;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isWindows10()
|
||||||
|
{
|
||||||
|
return IsWindows10();
|
||||||
|
}
|
||||||
|
|
||||||
bool isWindows11()
|
bool isWindows11()
|
||||||
{
|
{
|
||||||
return IsWindows11();
|
return IsWindows11();
|
||||||
@ -449,9 +458,9 @@ namespace NppDarkMode
|
|||||||
return invert_c;
|
return invert_c;
|
||||||
}
|
}
|
||||||
|
|
||||||
TreeViewStyle treeViewStyle = TreeViewStyle::classic;
|
static TreeViewStyle g_treeViewStyle = TreeViewStyle::classic;
|
||||||
COLORREF treeViewBg = NppParameters::getInstance().getCurrentDefaultBgColor();
|
static COLORREF g_treeViewBg = NppParameters::getInstance().getCurrentDefaultBgColor();
|
||||||
double lighnessTreeView = 50.0;
|
static double g_lighnessTreeView = 50.0;
|
||||||
|
|
||||||
// adapted from https://stackoverflow.com/a/56678483
|
// adapted from https://stackoverflow.com/a/56678483
|
||||||
double calculatePerceivedLighness(COLORREF c)
|
double calculatePerceivedLighness(COLORREF c)
|
||||||
@ -1768,7 +1777,7 @@ namespace NppDarkMode
|
|||||||
};
|
};
|
||||||
|
|
||||||
Params p{
|
Params p{
|
||||||
NppDarkMode::isEnabled() ? L"DarkMode_Explorer" : nullptr
|
g_isAtLeastWindows10 && NppDarkMode::isEnabled() ? L"DarkMode_Explorer" : nullptr
|
||||||
, subclass
|
, subclass
|
||||||
, theme
|
, theme
|
||||||
};
|
};
|
||||||
@ -2005,7 +2014,7 @@ namespace NppDarkMode
|
|||||||
|
|
||||||
void autoThemeChildControls(HWND hwndParent)
|
void autoThemeChildControls(HWND hwndParent)
|
||||||
{
|
{
|
||||||
autoSubclassAndThemeChildControls(hwndParent, false, true);
|
autoSubclassAndThemeChildControls(hwndParent, false, g_isAtLeastWindows10);
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT darkToolBarNotifyCustomDraw(LPARAM lParam)
|
LRESULT darkToolBarNotifyCustomDraw(LPARAM lParam)
|
||||||
@ -2165,9 +2174,15 @@ namespace NppDarkMode
|
|||||||
{
|
{
|
||||||
lptvcd->clrText = NppDarkMode::getTextColor();
|
lptvcd->clrText = NppDarkMode::getTextColor();
|
||||||
lptvcd->clrTextBk = NppDarkMode::getHotBackgroundColor();
|
lptvcd->clrTextBk = NppDarkMode::getHotBackgroundColor();
|
||||||
::FillRect(lptvcd->nmcd.hdc, &lptvcd->nmcd.rc, NppDarkMode::getHotBackgroundBrush());
|
|
||||||
|
|
||||||
return CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT;
|
auto notifyResult = CDRF_DODEFAULT;
|
||||||
|
if (g_isAtLeastWindows10 || g_treeViewStyle == TreeViewStyle::light)
|
||||||
|
{
|
||||||
|
::FillRect(lptvcd->nmcd.hdc, &lptvcd->nmcd.rc, NppDarkMode::getHotBackgroundBrush());
|
||||||
|
notifyResult = CDRF_NOTIFYPOSTPAINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CDRF_NEWFONT | notifyResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CDRF_DODEFAULT;
|
return CDRF_DODEFAULT;
|
||||||
@ -2315,7 +2330,7 @@ namespace NppDarkMode
|
|||||||
void autoSubclassAndThemePluginDockWindow(HWND hwnd)
|
void autoSubclassAndThemePluginDockWindow(HWND hwnd)
|
||||||
{
|
{
|
||||||
SetWindowSubclass(hwnd, PluginDockWindowSubclass, g_pluginDockWindowSubclassID, 0);
|
SetWindowSubclass(hwnd, PluginDockWindowSubclass, g_pluginDockWindowSubclassID, 0);
|
||||||
NppDarkMode::autoSubclassAndThemeChildControls(hwnd);
|
NppDarkMode::autoSubclassAndThemeChildControls(hwnd, true, g_isAtLeastWindows10);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr UINT_PTR g_windowNotifySubclassID = 42;
|
constexpr UINT_PTR g_windowNotifySubclassID = 42;
|
||||||
@ -2534,7 +2549,7 @@ namespace NppDarkMode
|
|||||||
|
|
||||||
void setDarkExplorerTheme(HWND hwnd)
|
void setDarkExplorerTheme(HWND hwnd)
|
||||||
{
|
{
|
||||||
SetWindowTheme(hwnd, NppDarkMode::isEnabled() ? L"DarkMode_Explorer" : nullptr, nullptr);
|
SetWindowTheme(hwnd, g_isAtLeastWindows10 && NppDarkMode::isEnabled() ? L"DarkMode_Explorer" : nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDarkScrollBar(HWND hwnd)
|
void setDarkScrollBar(HWND hwnd)
|
||||||
@ -2625,29 +2640,29 @@ namespace NppDarkMode
|
|||||||
}
|
}
|
||||||
|
|
||||||
// range to determine when it should be better to use classic style
|
// range to determine when it should be better to use classic style
|
||||||
constexpr double middleGrayRange = 2.0;
|
constexpr double g_middleGrayRange = 2.0;
|
||||||
|
|
||||||
void calculateTreeViewStyle()
|
void calculateTreeViewStyle()
|
||||||
{
|
{
|
||||||
COLORREF bgColor = NppParameters::getInstance().getCurrentDefaultBgColor();
|
COLORREF bgColor = NppParameters::getInstance().getCurrentDefaultBgColor();
|
||||||
|
|
||||||
if (treeViewBg != bgColor || lighnessTreeView == 50.0)
|
if (g_treeViewBg != bgColor || g_lighnessTreeView == 50.0)
|
||||||
{
|
{
|
||||||
lighnessTreeView = calculatePerceivedLighness(bgColor);
|
g_lighnessTreeView = calculatePerceivedLighness(bgColor);
|
||||||
treeViewBg = bgColor;
|
g_treeViewBg = bgColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lighnessTreeView < (50.0 - middleGrayRange))
|
if (g_lighnessTreeView < (50.0 - g_middleGrayRange))
|
||||||
{
|
{
|
||||||
treeViewStyle = TreeViewStyle::dark;
|
g_treeViewStyle = TreeViewStyle::dark;
|
||||||
}
|
}
|
||||||
else if (lighnessTreeView > (50.0 + middleGrayRange))
|
else if (g_lighnessTreeView > (50.0 + g_middleGrayRange))
|
||||||
{
|
{
|
||||||
treeViewStyle = TreeViewStyle::light;
|
g_treeViewStyle = TreeViewStyle::light;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
treeViewStyle = TreeViewStyle::classic;
|
g_treeViewStyle = TreeViewStyle::classic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2656,7 +2671,7 @@ namespace NppDarkMode
|
|||||||
auto style = static_cast<long>(::GetWindowLongPtr(hwnd, GWL_STYLE));
|
auto style = static_cast<long>(::GetWindowLongPtr(hwnd, GWL_STYLE));
|
||||||
bool hasHotStyle = (style & TVS_TRACKSELECT) == TVS_TRACKSELECT;
|
bool hasHotStyle = (style & TVS_TRACKSELECT) == TVS_TRACKSELECT;
|
||||||
bool change = false;
|
bool change = false;
|
||||||
switch (treeViewStyle)
|
switch (g_treeViewStyle)
|
||||||
{
|
{
|
||||||
case TreeViewStyle::light:
|
case TreeViewStyle::light:
|
||||||
{
|
{
|
||||||
@ -2675,7 +2690,7 @@ namespace NppDarkMode
|
|||||||
style |= TVS_TRACKSELECT;
|
style |= TVS_TRACKSELECT;
|
||||||
change = true;
|
change = true;
|
||||||
}
|
}
|
||||||
SetWindowTheme(hwnd, L"DarkMode_Explorer", nullptr);
|
SetWindowTheme(hwnd, g_isAtLeastWindows10 ? L"DarkMode_Explorer" : nullptr, nullptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -87,6 +87,7 @@ namespace NppDarkMode
|
|||||||
bool isEnabledForPlugins();
|
bool isEnabledForPlugins();
|
||||||
bool isExperimentalSupported();
|
bool isExperimentalSupported();
|
||||||
|
|
||||||
|
bool isWindows10();
|
||||||
bool isWindows11();
|
bool isWindows11();
|
||||||
|
|
||||||
COLORREF invertLightness(COLORREF c);
|
COLORREF invertLightness(COLORREF c);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user