summaryrefslogtreecommitdiff
path: root/Tools/msi/bundle/bootstrap
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2015-05-31 16:39:46 -0700
committerSteve Dower <steve.dower@microsoft.com>2015-05-31 16:39:46 -0700
commitac47ab86661bab685a40ab264b3504960a49ee1d (patch)
treedd65129205f12416b91987a34ddf7a67990fc71e /Tools/msi/bundle/bootstrap
parent7120712ef35d61785cf5b789457113f5f8363502 (diff)
downloadcpython-ac47ab86661bab685a40ab264b3504960a49ee1d.tar.gz
Issue #24293: Adds mapping from explicit colours to system colours to correctly handle user themes.
Diffstat (limited to 'Tools/msi/bundle/bootstrap')
-rw-r--r--Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp57
1 files changed, 52 insertions, 5 deletions
diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
index 7f5af74eb5..0c40be5ff5 100644
--- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
+++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
@@ -1475,6 +1475,8 @@ private:
POINT ptCursor = { };
HMONITOR hMonitor = nullptr;
MONITORINFO mi = { };
+ COLORREF fg, bg;
+ HBRUSH bgBrush;
// If the theme did not provide an icon, try using the icon from the bundle engine.
if (!hIcon) {
@@ -1484,12 +1486,23 @@ private:
}
}
+ fg = RGB(0, 0, 0);
+ bg = RGB(255, 255, 255);
+ bgBrush = (HBRUSH)(COLOR_WINDOW+1);
+ if (_theme->dwFontId < _theme->cFonts) {
+ THEME_FONT *font = &_theme->rgFonts[_theme->dwFontId];
+ fg = font->crForeground;
+ bg = font->crBackground;
+ bgBrush = font->hBackground;
+ RemapColor(&fg, &bg, &bgBrush);
+ }
+
// Register the window class and create the window.
wc.lpfnWndProc = PythonBootstrapperApplication::WndProc;
wc.hInstance = _hModule;
wc.hIcon = hIcon;
wc.hCursor = ::LoadCursorW(nullptr, (LPCWSTR)IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wc.hbrBackground = bgBrush;
wc.lpszMenuName = nullptr;
wc.lpszClassName = PYBA_WINDOW_CLASS;
if (!::RegisterClassW(&wc)) {
@@ -1704,12 +1717,12 @@ private:
}
break;
+ case WM_CTLCOLORSTATIC:
case WM_CTLCOLORBTN:
if (pBA) {
- HWND button = (HWND)lParam;
- DWORD style = GetWindowLong(button, GWL_STYLE) & BS_TYPEMASK;
- if (style == BS_COMMANDLINK || style == BS_DEFCOMMANDLINK) {
- return (LRESULT)pBA->_theme->rgFonts[pBA->_theme->dwFontId].hBackground;
+ HBRUSH brush = nullptr;
+ if (pBA->SetControlColor((HWND)lParam, (HDC)wParam, &brush)) {
+ return (LRESULT)brush;
}
}
break;
@@ -1782,6 +1795,40 @@ private:
return SUCCEEDED(hr);
}
+ void RemapColor(COLORREF *fg, COLORREF *bg, HBRUSH *bgBrush) {
+ if (*fg == RGB(0, 0, 0)) {
+ *fg = GetSysColor(COLOR_WINDOWTEXT);
+ } else if (*fg == RGB(128, 128, 128)) {
+ *fg = GetSysColor(COLOR_GRAYTEXT);
+ }
+ if (*bgBrush && *bg == RGB(255, 255, 255)) {
+ *bg = GetSysColor(COLOR_WINDOW);
+ *bgBrush = GetSysColorBrush(COLOR_WINDOW);
+ }
+ }
+
+ BOOL SetControlColor(HWND hWnd, HDC hDC, HBRUSH *brush) {
+ for (int i = 0; i < _theme->cControls; ++i) {
+ if (_theme->rgControls[i].hWnd != hWnd) {
+ continue;
+ }
+
+ DWORD fontId = _theme->rgControls[i].dwFontId;
+ if (fontId > _theme->cFonts) {
+ fontId = 0;
+ }
+ THEME_FONT *fnt = &_theme->rgFonts[fontId];
+
+ COLORREF fg = fnt->crForeground, bg = fnt->crBackground;
+ *brush = fnt->hBackground;
+ RemapColor(&fg, &bg, brush);
+ SetTextColor(hDC, fg);
+ SetBkColor(hDC, bg);
+
+ return TRUE;
+ }
+ return FALSE;
+ }
//
// OnShowFailure - display the failure page.