Skip to content

Commit 68bf4e2

Browse files
committed
Tweaks
1 parent c850d0d commit 68bf4e2

File tree

12 files changed

+262
-207
lines changed

12 files changed

+262
-207
lines changed

include/DarkModeSubclass.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ namespace DarkMode
315315
DMLIB_API COLORREF setHotEdgeColor(COLORREF clrNew);
316316
DMLIB_API COLORREF setDisabledEdgeColor(COLORREF clrNew);
317317

318-
DMLIB_API void setThemeColors(Colors* colors);
318+
DMLIB_API void setThemeColors(const Colors* colors);
319319
DMLIB_API void updateThemeBrushesAndPens();
320320

321321
[[nodiscard]] DMLIB_API COLORREF getBackgroundColor();
@@ -357,7 +357,7 @@ namespace DarkMode
357357
DMLIB_API COLORREF setHeaderTextColor(COLORREF clrNew);
358358
DMLIB_API COLORREF setHeaderEdgeColor(COLORREF clrNew);
359359

360-
DMLIB_API void setViewColors(ColorsView* colors);
360+
DMLIB_API void setViewColors(const ColorsView* colors);
361361
DMLIB_API void updateViewBrushesAndPens();
362362

363363
[[nodiscard]] DMLIB_API COLORREF getViewBackgroundColor();

src/DarkModeSubclass.cpp

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ COLORREF DarkMode::setEdgeColor(COLORREF clrNew) { return getTheme().
251251
COLORREF DarkMode::setHotEdgeColor(COLORREF clrNew) { return getTheme().setColorHotEdge(clrNew); }
252252
COLORREF DarkMode::setDisabledEdgeColor(COLORREF clrNew) { return getTheme().setColorDisabledEdge(clrNew); }
253253

254-
void DarkMode::setThemeColors(Colors* colors)
254+
void DarkMode::setThemeColors(const Colors* colors)
255255
{
256256
if (colors != nullptr)
257257
{
@@ -301,7 +301,7 @@ COLORREF DarkMode::setHeaderHotBackgroundColor(COLORREF clrNew) { return getThem
301301
COLORREF DarkMode::setHeaderTextColor(COLORREF clrNew) { return getThemeView().setColorHeaderText(clrNew); }
302302
COLORREF DarkMode::setHeaderEdgeColor(COLORREF clrNew) { return getThemeView().setColorHeaderEdge(clrNew); }
303303

304-
void DarkMode::setViewColors(ColorsView* colors)
304+
void DarkMode::setViewColors(const ColorsView* colors)
305305
{
306306
if (colors != nullptr)
307307
{
@@ -1202,7 +1202,7 @@ static void setTabCtrlPaintSubclass(HWND hWnd)
12021202
* @see dmlib_subclass::TabPaintSubclass()
12031203
* @see setTabCtrlPaintSubclass()
12041204
*/
1205-
static void removeTabCtrlPaintSubclass(HWND hWnd)
1205+
static void removeTabCtrlPaintSubclass(HWND hWnd) noexcept
12061206
{
12071207
dmlib_subclass::RemoveSubclass<dmlib_subclass::TabData>(hWnd, dmlib_subclass::TabPaintSubclass, dmlib_subclass::SubclassID::tabPaint);
12081208
}
@@ -2516,39 +2516,11 @@ void DarkMode::enableSysLinkCtrlCtlColor(HWND hWnd)
25162516
*/
25172517
void DarkMode::setDarkTitleBarEx(HWND hWnd, bool useWin11Features)
25182518
{
2519-
static constexpr DWORD win10Build2004 = 19041;
2520-
static constexpr DWORD win11Mica = 22621;
2521-
if (DarkMode::getWindowsBuildNumber() >= win10Build2004)
2519+
if (static constexpr DWORD win10Build2004 = 19041;
2520+
DarkMode::getWindowsBuildNumber() >= win10Build2004)
25222521
{
25232522
const BOOL useDark = DarkMode::isExperimentalActive() ? TRUE : FALSE;
25242523
::DwmSetWindowAttribute(hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &useDark, sizeof(useDark));
2525-
2526-
if (useWin11Features && DarkMode::isAtLeastWindows11())
2527-
{
2528-
::DwmSetWindowAttribute(hWnd, DWMWA_WINDOW_CORNER_PREFERENCE, &g_dmCfg.m_roundCorner, sizeof(g_dmCfg.m_roundCorner));
2529-
::DwmSetWindowAttribute(hWnd, DWMWA_BORDER_COLOR, &g_dmCfg.m_borderColor, sizeof(g_dmCfg.m_borderColor));
2530-
2531-
bool canColorizeTitleBar = true;
2532-
2533-
if (DarkMode::getWindowsBuildNumber() >= win11Mica)
2534-
{
2535-
if (g_dmCfg.m_micaExtend && g_dmCfg.m_mica != DWMSBT_AUTO && !DarkMode::isWindowsModeEnabled() && (g_dmCfg.m_dmType == DarkModeType::dark))
2536-
{
2537-
static constexpr MARGINS margins{ -1, 0, 0, 0 };
2538-
::DwmExtendFrameIntoClientArea(hWnd, &margins);
2539-
}
2540-
2541-
::DwmSetWindowAttribute(hWnd, DWMWA_SYSTEMBACKDROP_TYPE, &g_dmCfg.m_mica, sizeof(g_dmCfg.m_mica));
2542-
2543-
canColorizeTitleBar = !g_dmCfg.m_micaExtend;
2544-
}
2545-
2546-
canColorizeTitleBar = g_dmCfg.m_colorizeTitleBar && canColorizeTitleBar && DarkMode::isEnabled();
2547-
const COLORREF clrDlg = canColorizeTitleBar ? DarkMode::getDlgBackgroundColor() : DWMWA_COLOR_DEFAULT;
2548-
const COLORREF clrText = canColorizeTitleBar ? DarkMode::getTextColor() : DWMWA_COLOR_DEFAULT;
2549-
::DwmSetWindowAttribute(hWnd, DWMWA_CAPTION_COLOR, &clrDlg, sizeof(clrDlg));
2550-
::DwmSetWindowAttribute(hWnd, DWMWA_TEXT_COLOR, &clrText, sizeof(clrText));
2551-
}
25522524
}
25532525
#if defined(_DARKMODELIB_ALLOW_OLD_OS) && (_DARKMODELIB_ALLOW_OLD_OS > 0)
25542526
else
@@ -2557,13 +2529,50 @@ void DarkMode::setDarkTitleBarEx(HWND hWnd, bool useWin11Features)
25572529
dmlib_win32api::RefreshTitleBarThemeColor(hWnd);
25582530
}
25592531
#endif
2532+
2533+
if (!DarkMode::isAtLeastWindows11())
2534+
{
25602535
// on Windows 10 title bar needs refresh when changing colors
2561-
if (DarkMode::isAtLeastWindows10() && !DarkMode::isAtLeastWindows11())
2536+
if (DarkMode::isAtLeastWindows10())
2537+
{
2538+
const bool isActive = (hWnd == ::GetActiveWindow()) && (hWnd == ::GetForegroundWindow());
2539+
::SendMessage(hWnd, WM_NCACTIVATE, static_cast<WPARAM>(!isActive), 0);
2540+
::SendMessage(hWnd, WM_NCACTIVATE, static_cast<WPARAM>(isActive), 0);
2541+
}
2542+
return;
2543+
}
2544+
2545+
if (!useWin11Features)
25622546
{
2563-
const bool isActive = (hWnd == ::GetActiveWindow()) && (hWnd == ::GetForegroundWindow());
2564-
::SendMessage(hWnd, WM_NCACTIVATE, static_cast<WPARAM>(!isActive), 0);
2565-
::SendMessage(hWnd, WM_NCACTIVATE, static_cast<WPARAM>(isActive), 0);
2547+
return;
25662548
}
2549+
2550+
::DwmSetWindowAttribute(hWnd, DWMWA_WINDOW_CORNER_PREFERENCE, &g_dmCfg.m_roundCorner, sizeof(g_dmCfg.m_roundCorner));
2551+
::DwmSetWindowAttribute(hWnd, DWMWA_BORDER_COLOR, &g_dmCfg.m_borderColor, sizeof(g_dmCfg.m_borderColor));
2552+
2553+
bool canColorizeTitleBar = true;
2554+
2555+
if (static constexpr DWORD win11Mica = 22621;
2556+
DarkMode::getWindowsBuildNumber() >= win11Mica)
2557+
{
2558+
if (g_dmCfg.m_micaExtend && g_dmCfg.m_mica != DWMSBT_AUTO
2559+
&& !DarkMode::isWindowsModeEnabled()
2560+
&& (g_dmCfg.m_dmType == DarkModeType::dark))
2561+
{
2562+
static constexpr MARGINS margins{ -1, 0, 0, 0 };
2563+
::DwmExtendFrameIntoClientArea(hWnd, &margins);
2564+
}
2565+
2566+
::DwmSetWindowAttribute(hWnd, DWMWA_SYSTEMBACKDROP_TYPE, &g_dmCfg.m_mica, sizeof(g_dmCfg.m_mica));
2567+
2568+
canColorizeTitleBar = !g_dmCfg.m_micaExtend;
2569+
}
2570+
2571+
canColorizeTitleBar = g_dmCfg.m_colorizeTitleBar && canColorizeTitleBar && DarkMode::isEnabled();
2572+
const COLORREF clrDlg = canColorizeTitleBar ? DarkMode::getDlgBackgroundColor() : DWMWA_COLOR_DEFAULT;
2573+
const COLORREF clrText = canColorizeTitleBar ? DarkMode::getTextColor() : DWMWA_COLOR_DEFAULT;
2574+
::DwmSetWindowAttribute(hWnd, DWMWA_CAPTION_COLOR, &clrDlg, sizeof(clrDlg));
2575+
::DwmSetWindowAttribute(hWnd, DWMWA_TEXT_COLOR, &clrText, sizeof(clrText));
25672576
}
25682577

25692578
/**

src/DmlibColor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace dmlib_win32api
2828
[[nodiscard]] bool IsDarkModeActive() noexcept;
2929
}
3030

31-
DarkMode::Colors dmlib_color::getLightColors()
31+
DarkMode::Colors dmlib_color::getLightColors() noexcept
3232
{
3333
return DarkMode::Colors{
3434
::GetSysColor(COLOR_3DFACE), // background

src/DmlibColor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
namespace dmlib_color
2020
{
2121
/// Converts 0xRRGGBB to COLORREF (0xBBGGRR) for GDI usage.
22-
constexpr COLORREF HEXRGB(DWORD rrggbb)
22+
constexpr COLORREF HEXRGB(DWORD rrggbb) noexcept
2323
{
2424
return
2525
((rrggbb & 0xFF0000) >> 16)
@@ -169,7 +169,7 @@ namespace dmlib_color
169169
dmlib_color::HEXRGB(0xE5E5E5) // header divider
170170
};
171171

172-
DarkMode::Colors getLightColors();
172+
DarkMode::Colors getLightColors() noexcept;
173173

174174
inline COLORREF setNewColor(COLORREF& clrOld, COLORREF clrNew) noexcept
175175
{

src/DmlibDpi.cpp

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -41,48 +41,51 @@ static fnIsValidDpiAwarenessContext pfIsValidDpiAwarenessContext = nullptr;
4141
static fnSetThreadDpiAwarenessContext pfSetThreadDpiAwarenessContext = nullptr;
4242
static fnOpenThemeDataForDpi pfOpenThemeDataForDpi = nullptr;
4343

44-
static UINT WINAPI DummyGetDpiForSystem() noexcept
44+
extern "C"
4545
{
46-
UINT dpi = USER_DEFAULT_SCREEN_DPI;
47-
if (HDC hdc = ::GetDC(nullptr); hdc != nullptr)
46+
static UINT WINAPI DummyGetDpiForSystem() noexcept
4847
{
49-
dpi = static_cast<UINT>(::GetDeviceCaps(hdc, LOGPIXELSX));
50-
::ReleaseDC(nullptr, hdc);
48+
UINT dpi = USER_DEFAULT_SCREEN_DPI;
49+
if (HDC hdc = ::GetDC(nullptr); hdc != nullptr)
50+
{
51+
dpi = static_cast<UINT>(::GetDeviceCaps(hdc, LOGPIXELSX));
52+
::ReleaseDC(nullptr, hdc);
53+
}
54+
return dpi;
5155
}
52-
return dpi;
53-
}
5456

55-
static UINT WINAPI DummyGetDpiForWindow([[maybe_unused]] HWND hwnd) noexcept
56-
{
57-
return DummyGetDpiForSystem();
58-
}
57+
static UINT WINAPI DummyGetDpiForWindow([[maybe_unused]] HWND hwnd) noexcept
58+
{
59+
return DummyGetDpiForSystem();
60+
}
5961

60-
static int WINAPI DummyGetSystemMetricsForDpi(int nIndex, UINT dpi) noexcept
61-
{
62-
return dmlib_dpi::scale(::GetSystemMetrics(nIndex), dpi);
63-
}
62+
static int WINAPI DummyGetSystemMetricsForDpi(int nIndex, UINT dpi) noexcept
63+
{
64+
return dmlib_dpi::scale(::GetSystemMetrics(nIndex), dpi);
65+
}
6466

65-
static BOOL WINAPI DummySystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, [[maybe_unused]] UINT dpi) noexcept
66-
{
67-
return ::SystemParametersInfoW(uiAction, uiParam, pvParam, fWinIni);
68-
}
67+
static BOOL WINAPI DummySystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, [[maybe_unused]] UINT dpi) noexcept
68+
{
69+
return ::SystemParametersInfoW(uiAction, uiParam, pvParam, fWinIni);
70+
}
6971

70-
[[nodiscard]] static BOOL WINAPI DummyIsValidDpiAwarenessContext([[maybe_unused]] DPI_AWARENESS_CONTEXT value) noexcept
71-
{
72-
return FALSE;
73-
}
72+
[[nodiscard]] static BOOL WINAPI DummyIsValidDpiAwarenessContext([[maybe_unused]] DPI_AWARENESS_CONTEXT value) noexcept
73+
{
74+
return FALSE;
75+
}
7476

75-
static DPI_AWARENESS_CONTEXT WINAPI DummySetThreadDpiAwarenessContext([[maybe_unused]] DPI_AWARENESS_CONTEXT dpiContext) noexcept
76-
{
77-
return nullptr;
78-
}
77+
static DPI_AWARENESS_CONTEXT WINAPI DummySetThreadDpiAwarenessContext([[maybe_unused]] DPI_AWARENESS_CONTEXT dpiContext) noexcept
78+
{
79+
return nullptr;
80+
}
7981

80-
static HTHEME WINAPI DummyOpenThemeDataForDpi(HWND hwnd, LPCWSTR pszClassList, [[maybe_unused]] UINT dpi) noexcept
81-
{
82-
return ::OpenThemeData(hwnd, pszClassList);
82+
static HTHEME WINAPI DummyOpenThemeDataForDpi(HWND hwnd, LPCWSTR pszClassList, [[maybe_unused]] UINT dpi) noexcept
83+
{
84+
return ::OpenThemeData(hwnd, pszClassList);
85+
}
8386
}
8487

85-
bool dmlib_dpi::InitDpiAPI()
88+
bool dmlib_dpi::InitDpiAPI() noexcept
8689
{
8790
if (HMODULE hUser32 = ::GetModuleHandleW(L"user32.dll"); hUser32 != nullptr)
8891
{

src/DmlibDpi.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@
2121

2222
#if defined(__GNUC__) || (WINVER < _WIN32_WINNT_WIN7)
2323
#ifndef WM_DPICHANGED
24-
#define WM_DPICHANGED 0x02E0
24+
#define WM_DPICHANGED 0x02E0
2525
#endif
2626

2727
#ifndef WM_DPICHANGED_BEFOREPARENT
28-
#define WM_DPICHANGED_BEFOREPARENT 0x02E2
28+
#define WM_DPICHANGED_BEFOREPARENT 0x02E2
2929
#endif
3030

3131
#ifndef WM_DPICHANGED_AFTERPARENT
32-
#define WM_DPICHANGED_AFTERPARENT 0x02E3
32+
#define WM_DPICHANGED_AFTERPARENT 0x02E3
3333
#endif
3434

3535
#ifndef WM_GETDPISCALEDSIZE
36-
#define WM_GETDPISCALEDSIZE 0x02E4
36+
#define WM_GETDPISCALEDSIZE 0x02E4
3737
#endif
3838
#endif
3939

@@ -51,7 +51,7 @@ namespace dmlib_dpi
5151
inline constexpr UINT kDefaultFontDpi = 72;
5252
inline constexpr UINT kDefaultFontScaleFactor = 100;
5353

54-
bool InitDpiAPI();
54+
bool InitDpiAPI() noexcept;
5555

5656
[[nodiscard]] UINT GetDpiForSystem() noexcept;
5757
[[nodiscard]] UINT GetDpiForWindow(HWND hWnd) noexcept;

src/DmlibHook.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ static DWORD WINAPI MyGetSysColor(int nIndex) noexcept
329329
*
330330
* @return `true` if the hook was installed successfully.
331331
*/
332-
bool dmlib_hook::hookSysColor()
332+
bool dmlib_hook::hookSysColor() noexcept
333333
{
334334
return HookFunction<fnGetSysColor>(
335335
g_hookDataGetSysColor,
@@ -346,7 +346,7 @@ bool dmlib_hook::hookSysColor()
346346
* It ensures that system colors return to normal without requiring
347347
* prior state checks.
348348
*/
349-
void dmlib_hook::unhookSysColor()
349+
void dmlib_hook::unhookSysColor() noexcept
350350
{
351351
UnhookFunction<fnGetSysColor>(g_hookDataGetSysColor);
352352
}
@@ -461,7 +461,7 @@ static HRESULT WINAPI MyDrawThemeBackgroundEx(
461461
*
462462
* @return `true` if the hook was installed successfully.
463463
*/
464-
bool dmlib_hook::hookThemeColor()
464+
bool dmlib_hook::hookThemeColor() noexcept
465465
{
466466
COLORREF clrMain = kMainPaneBgClr;
467467
COLORREF clrFooter = kFooterBgClr;
@@ -513,7 +513,7 @@ bool dmlib_hook::hookThemeColor()
513513
* It ensures that theme colors return to normal without requiring
514514
* prior state checks.
515515
*/
516-
void dmlib_hook::unhookThemeColor()
516+
void dmlib_hook::unhookThemeColor() noexcept
517517
{
518518
UnhookFunction<fnGetThemeColor>(g_hookDataGetThemeColor);
519519
UnhookFunction<fnDrawThemeBackgroundEx>(g_hookDataDrawThemeBackgroundEx);

src/DmlibHook.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ namespace dmlib_hook
2626
/// Overrides a specific system color with a custom color.
2727
void setMySysColor(int nIndex, COLORREF clr) noexcept;
2828
/// Hooks system color to support runtime customization.
29-
bool hookSysColor();
29+
bool hookSysColor() noexcept;
3030
/// Unhooks system color overrides and restores default color behavior.
31-
void unhookSysColor();
31+
void unhookSysColor() noexcept;
3232

3333
/// Hooks `GetThemeColor` and `DrawThemeBackgroundEx` to support dark colors.
34-
bool hookThemeColor();
34+
bool hookThemeColor() noexcept;
3535
/// Unhooks `GetThemeColor` and `DrawThemeBackgroundEx` overrides and restores default color behavior.
36-
void unhookThemeColor();
36+
void unhookThemeColor() noexcept;
3737
} // namespace dmlib_hook

src/DmlibSubclass.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ namespace dmlib_subclass
152152
{
153153
if (pData != nullptr)
154154
{
155-
std::unique_ptr<T> ptrData(pData);
155+
std::unique_ptr<T> u_ptrData(pData);
156+
u_ptrData.reset(nullptr);
156157
}
157158
}
158159
return ::RemoveWindowSubclass(hWnd, subclassProc, subclassID);
@@ -256,10 +257,10 @@ namespace dmlib_subclass
256257

257258
bool ensureBuffer(HDC hdc, const RECT& rcClient) noexcept
258259
{
259-
const int width = rcClient.right - rcClient.left;
260-
const int height = rcClient.bottom - rcClient.top;
261-
262-
if (m_szBuffer.cx != width || m_szBuffer.cy != height)
260+
if (const int width = rcClient.right - rcClient.left,
261+
height = rcClient.bottom - rcClient.top;
262+
m_szBuffer.cx != width
263+
|| m_szBuffer.cy != height)
263264
{
264265
releaseBuffer();
265266
m_hMemDC = ::CreateCompatibleDC(hdc);

0 commit comments

Comments
 (0)