Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2514)

Unified Diff: chrome/browser/themes/theme_service_win.cc

Issue 1744483002: Monitor the system native frame color on Win 10. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/themes/theme_service_win.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/themes/theme_service_win.cc
diff --git a/chrome/browser/themes/theme_service_win.cc b/chrome/browser/themes/theme_service_win.cc
new file mode 100644
index 0000000000000000000000000000000000000000..6573ee805a029f94e83960f40e599815e0c02505
--- /dev/null
+++ b/chrome/browser/themes/theme_service_win.cc
@@ -0,0 +1,67 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/themes/theme_service_win.h"
+
+#include "base/bind.h"
+#include "base/win/windows_version.h"
+#include "chrome/browser/themes/theme_properties.h"
+#include "grit/theme_resources.h"
+#include "skia/ext/skia_utils_win.h"
+#include "ui/base/win/shell.h"
+
+ThemeServiceWin::ThemeServiceWin() {
+ // This just checks for Windows 10 instead of calling ShouldUseDwmFrameColor()
+ // because we want to monitor the frame color even when a custom frame is in
+ // use, so that it will be correct if at any time the user switches to the
+ // native frame.
+ if (base::win::GetVersion() >= base::win::VERSION_WIN10) {
+ dwm_key_.reset(new base::win::RegKey(
+ HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\DWM", KEY_READ));
+ OnDwmKeyUpdated();
+ }
+}
+
+ThemeServiceWin::~ThemeServiceWin() {
+}
+
+bool ThemeServiceWin::ShouldUseNativeFrame() const {
+ return !HasCustomImage(IDR_THEME_FRAME) && ui::win::IsAeroGlassEnabled();
+}
+
+SkColor ThemeServiceWin::GetDefaultColor(int id, bool incognito) const {
+ if (ShouldUseDwmFrameColor()) {
+ // Active native windows on Windows 10 may have a custom frame color.
+ if (id == ThemeProperties::COLOR_FRAME)
+ return dwm_frame_color_;
+
+ // Inactive native windows on Windows 10 always have a white frame.
+ if (id == ThemeProperties::COLOR_FRAME_INACTIVE)
+ return SK_ColorWHITE;
+ }
+
+ return ThemeService::GetDefaultColor(id, incognito);
+}
+
+bool ThemeServiceWin::ShouldUseDwmFrameColor() const {
+ return ShouldUseNativeFrame() &&
+ (base::win::GetVersion() >= base::win::VERSION_WIN10);
+}
+
+void ThemeServiceWin::OnDwmKeyUpdated() {
+ // Attempt to read the accent color.
+ DWORD accent_color, color_prevalence;
+ dwm_frame_color_ =
+ ((dwm_key_->ReadValueDW(L"ColorPrevalence", &color_prevalence) ==
+ ERROR_SUCCESS) &&
+ (color_prevalence == 1) &&
+ (dwm_key_->ReadValueDW(L"AccentColor", &accent_color) == ERROR_SUCCESS))
+ ? skia::COLORREFToSkColor(accent_color)
+ : SK_ColorWHITE;
+
+ // Watch for future changes.
+ if (!dwm_key_->StartWatching(base::Bind(
+ &ThemeServiceWin::OnDwmKeyUpdated, base::Unretained(this))))
+ dwm_key_.reset();
+}
« no previous file with comments | « chrome/browser/themes/theme_service_win.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698