[Python-checkins] cpython (3.5): Issue #24293: Adds mapping from explicit colours to system colours to correctly

steve.dower python-checkins at python.org
Mon Jun 1 01:40:43 CEST 2015


https://hg.python.org/cpython/rev/c7210097ac90
changeset:   96434:c7210097ac90
branch:      3.5
parent:      96432:8a185bb62a25
user:        Steve Dower <steve.dower at microsoft.com>
date:        Sun May 31 16:39:46 2015 -0700
summary:
  Issue #24293: Adds mapping from explicit colours to system colours to correctly handle user themes.

files:
  Tools/msi/bundle/Default.thm                                 |  14 +-
  Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp |  57 +++++++++-
  2 files changed, 59 insertions(+), 12 deletions(-)


diff --git a/Tools/msi/bundle/Default.thm b/Tools/msi/bundle/Default.thm
--- a/Tools/msi/bundle/Default.thm
+++ b/Tools/msi/bundle/Default.thm
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Theme xmlns="http://wixtoolset.org/schemas/thmutil/2010">
-    <Window Background="ffff00" Width="640" Height="382" HexStyle="100a0000" FontId="0">#(loc.Caption)</Window>
-    <Font Id="0" Height="-12" Weight="500">Segoe UI</Font>
-    <Font Id="1" Height="-24" Weight="500">Segoe UI</Font>
-    <Font Id="2" Height="-22" Weight="500" Foreground="666666">Segoe UI</Font>
-    <Font Id="3" Height="-12" Weight="500">Segoe UI</Font>
-    <Font Id="4" Height="-12" Weight="500" Foreground="ff0000" Underline="yes">Segoe UI</Font>
-    <Font Id="5" Height="-12" Weight="500" Foreground="666666">Segoe UI</Font>
+    <Window Width="640" Height="382" HexStyle="100a0000" FontId="0">#(loc.Caption)</Window>
+    <Font Id="0" Height="-12" Weight="500" Foreground="000000" Background="ffffff">Segoe UI</Font>
+    <Font Id="1" Height="-24" Weight="500" Foreground="000000" Background="ffffff">Segoe UI</Font>
+    <Font Id="2" Height="-22" Weight="500" Foreground="808080" Background="ffffff">Segoe UI</Font>
+    <Font Id="3" Height="-12" Weight="500" Foreground="000000" Background="ffffff">Segoe UI</Font>
+    <Font Id="4" Height="-12" Weight="500" Foreground="ff0000" Background="ffffff" Underline="yes">Segoe UI</Font>
+    <Font Id="5" Height="-12" Weight="500" Foreground="808080" Background="ffffff">Segoe UI</Font>
 
     <Page Name="Help">
         <Text X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.HelpHeader)</Text>
diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
--- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
+++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
@@ -1475,6 +1475,8 @@
         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 @@
             }
         }
 
+        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 @@
             }
             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 @@
         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.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list