Skip to content

Commit e259b44

Browse files
committed
[libwin32darkmode] TGDarkMode.cpp: Use GetProcAddress() for some Vista+ functions.
These functions were added in Windows Vista: - BeginBufferedPaint() - BufferedPaintSetAlpha() - EndBufferedPaint() Need to use GetProcAddress() [in DarkMode.cpp]. Otherwise, the program won't run on Windows XP. See #487: Installer fails on Windows XP (cherry picked from commit 134bdf5)
1 parent 32c1aff commit e259b44

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

src/libwin32darkmode/DarkMode.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ fnSetWindowCompositionAttribute _SetWindowCompositionAttribute = nullptr;
4242
fnShouldSystemUseDarkMode _ShouldSystemUseDarkMode = nullptr;
4343
fnSetPreferredAppMode _SetPreferredAppMode = nullptr;
4444

45+
// UxTheme functions used by TGDarkMode.cpp, added in Windows Vista.
46+
fnBeginBufferedPaint _BeginBufferedPaint;
47+
fnBufferedPaintSetAlpha _BufferedPaintSetAlpha;
48+
fnEndBufferedPaint _EndBufferedPaint;
49+
50+
4551
bool g_darkModeSupported = false;
4652
bool g_darkModeEnabled = false;
4753
static DWORD g_buildNumber = 0;
@@ -199,12 +205,21 @@ int InitDarkModePFNs(void)
199205
_SetWindowCompositionAttribute = reinterpret_cast<fnSetWindowCompositionAttribute>(
200206
GetProcAddress(GetModuleHandle(_T("user32.dll")), "SetWindowCompositionAttribute"));
201207

208+
// UxTheme functions used by TGDarkMode.cpp, added in Windows Vista.
209+
_BeginBufferedPaint = reinterpret_cast<fnBeginBufferedPaint>(
210+
GetProcAddress(hUxtheme, "BeginBufferedPaint"));
211+
_BufferedPaintSetAlpha = reinterpret_cast<fnBufferedPaintSetAlpha>(
212+
GetProcAddress(hUxtheme, "BufferedPaintSetAlpha"));
213+
_EndBufferedPaint = reinterpret_cast<fnEndBufferedPaint>(
214+
GetProcAddress(hUxtheme, "EndBufferedPaint"));
215+
202216
if (_OpenNcThemeData &&
203217
// 1809 17763
204218
_ShouldAppsUseDarkMode && _AllowDarkModeForWindow &&
205219
(_AllowDarkModeForApp || _SetPreferredAppMode) &&
206220
//_FlushMenuThemes &&
207-
_RefreshImmersiveColorPolicyState && _IsDarkModeAllowedForWindow)
221+
_RefreshImmersiveColorPolicyState && _IsDarkModeAllowedForWindow &&
222+
_BeginBufferedPaint && _BufferedPaintSetAlpha && _EndBufferedPaint)
208223
{
209224
// Dark mode is supported.
210225

@@ -232,6 +247,10 @@ int InitDarkModePFNs(void)
232247
_SetWindowCompositionAttribute = nullptr;
233248
_ShouldSystemUseDarkMode = nullptr;
234249
_SetPreferredAppMode = nullptr;
250+
// UxTheme functions used by TGDarkMode.cpp.
251+
_BeginBufferedPaint = nullptr;
252+
_BufferedPaintSetAlpha = nullptr;
253+
_EndBufferedPaint = nullptr;
235254
FreeLibrary(hUxtheme);
236255
return 7;
237256
}

src/libwin32darkmode/DarkMode.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ extern fnSetWindowCompositionAttribute _SetWindowCompositionAttribute;
9898
extern fnShouldSystemUseDarkMode _ShouldSystemUseDarkMode;
9999
extern fnSetPreferredAppMode _SetPreferredAppMode;
100100

101+
// UxTheme functions used by TGDarkMode.cpp, added in Windows Vista.
102+
// TODO: Verify definition against Windows SDK.
103+
typedef HPAINTBUFFER (WINAPI *fnBeginBufferedPaint)(HDC hdcTarget, const RECT *prcTarget, BP_BUFFERFORMAT dwFormat, _In_ BP_PAINTPARAMS *pPaintParams, _Out_ HDC *phdc);
104+
typedef HRESULT (WINAPI *fnBufferedPaintSetAlpha)(HPAINTBUFFER hBufferedPaint, _In_ const RECT *prc, BYTE alpha);
105+
typedef HRESULT (WINAPI *fnEndBufferedPaint)(HPAINTBUFFER hBufferedPaintm, BOOL fUpdateTarget);
106+
107+
extern fnBeginBufferedPaint _BeginBufferedPaint;
108+
extern fnBufferedPaintSetAlpha _BufferedPaintSetAlpha;
109+
extern fnEndBufferedPaint _EndBufferedPaint;
110+
101111
extern bool g_darkModeSupported;
102112
extern bool g_darkModeEnabled;
103113

src/libwin32darkmode/TGDarkMode.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,13 @@ static void PaintControl(HWND hWnd, HDC hdc, RECT* prc, bool bDrawBorder)
259259
if (bDrawBorder)
260260
InflateRect(prc, 1, 1);
261261

262-
HPAINTBUFFER hBufferedPaint = BeginBufferedPaint(hdc, prc, BPBF_TOPDOWNDIB, nullptr, &hdcPaint);
262+
HPAINTBUFFER hBufferedPaint = _BeginBufferedPaint(hdc, prc, BPBF_TOPDOWNDIB, nullptr, &hdcPaint);
263263
if (hdcPaint && hBufferedPaint) {
264264
RECT rc;
265265
GetWindowRect(hWnd, &rc);
266266

267267
PatBlt(hdcPaint, 0, 0, RECTWIDTH(rc), RECTHEIGHT(rc), BLACKNESS);
268-
BufferedPaintSetAlpha(hBufferedPaint, &rc, 0x00);
268+
_BufferedPaintSetAlpha(hBufferedPaint, &rc, 0x00);
269269

270270
///
271271
/// first blit white so list ctrls don't look ugly:
@@ -285,8 +285,8 @@ static void PaintControl(HWND hWnd, HDC hdc, RECT* prc, bool bDrawBorder)
285285
// don't make a possible border opaque, only the inner part of the control
286286
InflateRect(prc, -2, -2);
287287
// Make every pixel opaque
288-
BufferedPaintSetAlpha(hBufferedPaint, prc, 255);
289-
EndBufferedPaint(hBufferedPaint, TRUE);
288+
_BufferedPaintSetAlpha(hBufferedPaint, prc, 255);
289+
_EndBufferedPaint(hBufferedPaint, TRUE);
290290
}
291291
}
292292

@@ -408,7 +408,7 @@ LRESULT WINAPI TGDarkMode_ButtonSubclassProc(
408408
rcExclusion.bottom -= 2;
409409

410410
HDC hdcPaint = nullptr;
411-
HPAINTBUFFER hBufferedPaint = BeginBufferedPaint(hdc, &rcClient, BPBF_TOPDOWNDIB, &params, &hdcPaint);
411+
HPAINTBUFFER hBufferedPaint = _BeginBufferedPaint(hdc, &rcClient, BPBF_TOPDOWNDIB, &params, &hdcPaint);
412412
if (hdcPaint) {
413413
// now we again retrieve the font, but this time we select it into
414414
// the buffered DC:
@@ -419,7 +419,7 @@ LRESULT WINAPI TGDarkMode_ButtonSubclassProc(
419419
::SetBkColor(hdcPaint, g_darkBkColor);
420420
::ExtTextOut(hdcPaint, 0, 0, ETO_OPAQUE, &rcClient, nullptr, 0, nullptr);
421421

422-
BufferedPaintSetAlpha(hBufferedPaint, &ps.rcPaint, 0x00);
422+
_BufferedPaintSetAlpha(hBufferedPaint, &ps.rcPaint, 0x00);
423423

424424
DTTOPTS DttOpts = { sizeof(DTTOPTS) };
425425
DttOpts.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE;
@@ -471,7 +471,7 @@ LRESULT WINAPI TGDarkMode_ButtonSubclassProc(
471471
hFontOld = nullptr;
472472
}
473473

474-
EndBufferedPaint(hBufferedPaint, TRUE);
474+
_EndBufferedPaint(hBufferedPaint, TRUE);
475475
}
476476
CloseThemeData(hTheme);
477477
}
@@ -484,12 +484,12 @@ LRESULT WINAPI TGDarkMode_ButtonSubclassProc(
484484
HDC hdcPaint = nullptr;
485485
BP_PAINTPARAMS params = { sizeof(BP_PAINTPARAMS) };
486486
params.dwFlags = BPPF_ERASE;
487-
HPAINTBUFFER hBufferedPaint = BeginBufferedPaint(hdc, &rcClient, BPBF_TOPDOWNDIB, &params, &hdcPaint);
487+
HPAINTBUFFER hBufferedPaint = _BeginBufferedPaint(hdc, &rcClient, BPBF_TOPDOWNDIB, &params, &hdcPaint);
488488
if (hdcPaint && hBufferedPaint) {
489489
::SetBkColor(hdcPaint, g_darkBkColor);
490490
::ExtTextOut(hdcPaint, 0, 0, ETO_OPAQUE, &rcClient, nullptr, 0, nullptr);
491491

492-
BufferedPaintSetAlpha(hBufferedPaint, &ps.rcPaint, 0x00);
492+
_BufferedPaintSetAlpha(hBufferedPaint, &ps.rcPaint, 0x00);
493493

494494
LRESULT dwCheckState = SendMessage(hWnd, BM_GETCHECK, 0, 0);
495495
POINT pt;
@@ -639,7 +639,7 @@ LRESULT WINAPI TGDarkMode_ButtonSubclassProc(
639639
hFontOld = nullptr;
640640
}
641641

642-
EndBufferedPaint(hBufferedPaint, TRUE);
642+
_EndBufferedPaint(hBufferedPaint, TRUE);
643643
}
644644
CloseThemeData(hTheme);
645645
}

0 commit comments

Comments
 (0)