1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/gfx/sys_color_change_listener.h"
11 #include "base/basictypes.h"
12 #include "base/memory/singleton.h"
13 #include "base/observer_list.h"
14 #include "ui/gfx/color_utils.h"
17 #include "ui/gfx/win/singleton_hwnd.h"
24 bool g_is_inverted_color_scheme = false;
25 bool g_is_inverted_color_scheme_initialized = false;
27 void UpdateInvertedColorScheme() {
29 int foreground_luminance = color_utils::GetLuminanceForColor(
30 color_utils::GetSysSkColor(COLOR_WINDOWTEXT));
31 int background_luminance = color_utils::GetLuminanceForColor(
32 color_utils::GetSysSkColor(COLOR_WINDOW));
33 HIGHCONTRAST high_contrast = {0};
34 high_contrast.cbSize = sizeof(HIGHCONTRAST);
35 g_is_inverted_color_scheme =
36 SystemParametersInfo(SPI_GETHIGHCONTRAST, 0, &high_contrast, 0) &&
37 ((high_contrast.dwFlags & HCF_HIGHCONTRASTON) != 0) &&
38 foreground_luminance > background_luminance;
39 g_is_inverted_color_scheme_initialized = true;
45 bool IsInvertedColorScheme() {
46 if (!g_is_inverted_color_scheme_initialized)
47 UpdateInvertedColorScheme();
48 return g_is_inverted_color_scheme;
52 class SysColorChangeObserver : public gfx::SingletonHwnd::Observer {
54 static SysColorChangeObserver* GetInstance();
56 void AddListener(SysColorChangeListener* listener);
57 void RemoveListener(SysColorChangeListener* listener);
60 friend struct DefaultSingletonTraits<SysColorChangeObserver>;
62 SysColorChangeObserver();
63 virtual ~SysColorChangeObserver();
65 virtual void OnWndProc(HWND hwnd,
68 LPARAM lparam) OVERRIDE;
70 ObserverList<SysColorChangeListener> listeners_;
74 SysColorChangeObserver* SysColorChangeObserver::GetInstance() {
75 return Singleton<SysColorChangeObserver>::get();
78 SysColorChangeObserver::SysColorChangeObserver() {
79 gfx::SingletonHwnd::GetInstance()->AddObserver(this);
82 SysColorChangeObserver::~SysColorChangeObserver() {
83 gfx::SingletonHwnd::GetInstance()->RemoveObserver(this);
86 void SysColorChangeObserver::AddListener(SysColorChangeListener* listener) {
87 listeners_.AddObserver(listener);
90 void SysColorChangeObserver::RemoveListener(SysColorChangeListener* listener) {
91 listeners_.RemoveObserver(listener);
94 void SysColorChangeObserver::OnWndProc(HWND hwnd,
98 if (message == WM_SYSCOLORCHANGE ||
99 (message == WM_SETTINGCHANGE && wparam == SPI_SETHIGHCONTRAST)) {
100 UpdateInvertedColorScheme();
101 FOR_EACH_OBSERVER(SysColorChangeListener, listeners_, OnSysColorChange());
106 ScopedSysColorChangeListener::ScopedSysColorChangeListener(
107 SysColorChangeListener* listener)
108 : listener_(listener) {
110 SysColorChangeObserver::GetInstance()->AddListener(listener_);
114 ScopedSysColorChangeListener::~ScopedSysColorChangeListener() {
116 SysColorChangeObserver::GetInstance()->RemoveListener(listener_);