Bug 1344910, part 1 - Add a '-moz-win-accentcolor' color keyword to expose the Win10 accent color. r=jimm

MozReview-Commit-ID: DtRcuizKRH2
This commit is contained in:
Jonathan Watt 2017-06-05 12:19:51 +01:00
Родитель 1efe403de8
Коммит c1c70a354c
7 изменённых файлов: 78 добавлений и 5 удалений

Просмотреть файл

@ -747,6 +747,7 @@ CSS_KEY(button-focus, button_focus)
CSS_KEY(-moz-win-media-toolbox, _moz_win_media_toolbox) CSS_KEY(-moz-win-media-toolbox, _moz_win_media_toolbox)
CSS_KEY(-moz-win-communications-toolbox, _moz_win_communications_toolbox) CSS_KEY(-moz-win-communications-toolbox, _moz_win_communications_toolbox)
CSS_KEY(-moz-win-browsertabbar-toolbox, _moz_win_browsertabbar_toolbox) CSS_KEY(-moz-win-browsertabbar-toolbox, _moz_win_browsertabbar_toolbox)
CSS_KEY(-moz-win-accentcolor, _moz_win_accentcolor)
CSS_KEY(-moz-win-mediatext, _moz_win_mediatext) CSS_KEY(-moz-win-mediatext, _moz_win_mediatext)
CSS_KEY(-moz-win-communicationstext, _moz_win_communicationstext) CSS_KEY(-moz-win-communicationstext, _moz_win_communicationstext)
CSS_KEY(-moz-win-glass, _moz_win_glass) CSS_KEY(-moz-win-glass, _moz_win_glass)

Просмотреть файл

@ -1137,6 +1137,7 @@ const KTableEntry nsCSSProps::kColorKTable[] = {
{ eCSSKeyword__moz_oddtreerow, LookAndFeel::eColorID__moz_oddtreerow }, { eCSSKeyword__moz_oddtreerow, LookAndFeel::eColorID__moz_oddtreerow },
{ eCSSKeyword__moz_visitedhyperlinktext, NS_COLOR_MOZ_VISITEDHYPERLINKTEXT }, { eCSSKeyword__moz_visitedhyperlinktext, NS_COLOR_MOZ_VISITEDHYPERLINKTEXT },
{ eCSSKeyword_currentcolor, NS_COLOR_CURRENTCOLOR }, { eCSSKeyword_currentcolor, NS_COLOR_CURRENTCOLOR },
{ eCSSKeyword__moz_win_accentcolor, LookAndFeel::eColorID__moz_win_accentcolor },
{ eCSSKeyword__moz_win_mediatext, LookAndFeel::eColorID__moz_win_mediatext }, { eCSSKeyword__moz_win_mediatext, LookAndFeel::eColorID__moz_win_mediatext },
{ eCSSKeyword__moz_win_communicationstext, LookAndFeel::eColorID__moz_win_communicationstext }, { eCSSKeyword__moz_win_communicationstext, LookAndFeel::eColorID__moz_win_communicationstext },
{ eCSSKeyword__moz_nativehyperlinktext, LookAndFeel::eColorID__moz_nativehyperlinktext }, { eCSSKeyword__moz_nativehyperlinktext, LookAndFeel::eColorID__moz_nativehyperlinktext },

Просмотреть файл

@ -158,6 +158,8 @@ public:
// vista rebars // vista rebars
// accent color for title bar
eColorID__moz_win_accentcolor,
// media rebar text // media rebar text
eColorID__moz_win_mediatext, eColorID__moz_win_mediatext,
// communications rebar text // communications rebar text

Просмотреть файл

@ -658,6 +658,9 @@ nsXPLookAndFeel::GetStandinForNativeColor(ColorID aID)
result = NS_RGB(0x3F, 0x3F, 0x3F); break; result = NS_RGB(0x3F, 0x3F, 0x3F); break;
case eColorID__moz_mac_secondaryhighlight: case eColorID__moz_mac_secondaryhighlight:
result = NS_RGB(0xD4, 0xD4, 0xD4); break; result = NS_RGB(0xD4, 0xD4, 0xD4); break;
case eColorID__moz_win_accentcolor:
// Seems to be the default color (hardcoded because of bug 1065998)
result = NS_RGB(0x9E, 0x9E, 0x9E); break;
case eColorID__moz_win_mediatext: case eColorID__moz_win_mediatext:
result = NS_RGB(0xFF, 0xFF, 0xFF); break; result = NS_RGB(0xFF, 0xFF, 0xFF); break;
case eColorID__moz_win_communicationstext: case eColorID__moz_win_communicationstext:

Просмотреть файл

@ -262,6 +262,16 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor &aColor)
case eColorID__moz_cellhighlight: case eColorID__moz_cellhighlight:
idx = COLOR_3DFACE; idx = COLOR_3DFACE;
break; break;
case eColorID__moz_win_accentcolor:
res = GetAccentColor(aColor);
if (NS_SUCCEEDED(res)) {
return res;
}
NS_WARNING("Using fallback for accent color - UI code failed to use the "
"-moz-windows-accent-color-applies media query properly");
// Seems to be the default color (hardcoded because of bug 1065998)
aColor = NS_RGB(158, 158, 158);
return NS_OK;
case eColorID__moz_win_mediatext: case eColorID__moz_win_mediatext:
if (IsAppThemed()) { if (IsAppThemed()) {
res = ::GetColorFromTheme(eUXMediaToolbar, res = ::GetColorFromTheme(eUXMediaToolbar,
@ -747,3 +757,42 @@ nsLookAndFeel::SetIntCacheImpl(const nsTArray<LookAndFeelInt>& aLookAndFeelIntCa
} }
} }
/* static */ nsresult
nsLookAndFeel::GetAccentColor(nscolor& aColor)
{
nsresult rv;
if (!mDwmKey) {
mDwmKey = do_CreateInstance("@mozilla.org/windows-registry-key;1", &rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
}
rv = mDwmKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
NS_LITERAL_STRING("SOFTWARE\\Microsoft\\Windows\\DWM"),
nsIWindowsRegKey::ACCESS_QUERY_VALUE);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
// The ColorPrevalence value is set to 1 when the "Show color on title bar"
// setting in the Color section of Window's Personalization settings is
// turned on.
uint32_t accentColor, colorPrevalence;
if (NS_SUCCEEDED(mDwmKey->ReadIntValue(NS_LITERAL_STRING("AccentColor"), &accentColor)) &&
NS_SUCCEEDED(mDwmKey->ReadIntValue(NS_LITERAL_STRING("ColorPrevalence"), &colorPrevalence)) &&
colorPrevalence == 1) {
// The order of the color components in the DWORD stored in the registry
// happens to be the same order as we store the components in nscolor
// so we can just assign directly here.
aColor = accentColor;
rv = NS_OK;
} else {
rv = NS_ERROR_NOT_AVAILABLE;
}
mDwmKey->Close();
return rv;
}

Просмотреть файл

@ -9,6 +9,7 @@
#include "nsXPLookAndFeel.h" #include "nsXPLookAndFeel.h"
#include "gfxFont.h" #include "gfxFont.h"
#include "mozilla/RangedArray.h" #include "mozilla/RangedArray.h"
#include "nsIWindowsRegKey.h"
/* /*
* Gesture System Metrics * Gesture System Metrics
@ -51,6 +52,13 @@ public:
void SetIntCacheImpl(const nsTArray<LookAndFeelInt>& aLookAndFeelIntCache) override; void SetIntCacheImpl(const nsTArray<LookAndFeelInt>& aLookAndFeelIntCache) override;
private: private:
/**
* Fetches the Windows accent color from the Windows settings if
* the accent color is set to apply to the title bar, otherwise
* returns an error code.
*/
nsresult GetAccentColor(nscolor& aColor);
// Content process cached values that get shipped over from the browser // Content process cached values that get shipped over from the browser
// process. // process.
int32_t mUseAccessibilityTheme; int32_t mUseAccessibilityTheme;
@ -71,6 +79,8 @@ private:
mozilla::RangedArray<CachedSystemFont, mozilla::RangedArray<CachedSystemFont,
FontID_MINIMUM, FontID_MINIMUM,
FontID_MAXIMUM + 1 - FontID_MINIMUM> mSystemFontCache; FontID_MAXIMUM + 1 - FontID_MINIMUM> mSystemFontCache;
nsCOMPtr<nsIWindowsRegKey> mDwmKey;
}; };
#endif #endif

Просмотреть файл

@ -5197,12 +5197,19 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
case WM_SETTINGCHANGE: case WM_SETTINGCHANGE:
{ {
if (IsWin10OrLater() && mWindowType == eWindowType_invisible && lParam) { if (lParam) {
auto lParamString = reinterpret_cast<const wchar_t*>(lParam); auto lParamString = reinterpret_cast<const wchar_t*>(lParam);
if (!wcscmp(lParamString, L"UserInteractionMode")) { if (!wcscmp(lParamString, L"ImmersiveColorSet")) {
nsCOMPtr<nsIWindowsUIUtils> uiUtils(do_GetService("@mozilla.org/windows-ui-utils;1")); // WM_SYSCOLORCHANGE is not dispatched for accent color changes
if (uiUtils) { OnSysColorChanged();
uiUtils->UpdateTabletModeState(); break;
}
if (IsWin10OrLater() && mWindowType == eWindowType_invisible) {
if (!wcscmp(lParamString, L"UserInteractionMode")) {
nsCOMPtr<nsIWindowsUIUtils> uiUtils(do_GetService("@mozilla.org/windows-ui-utils;1"));
if (uiUtils) {
uiUtils->UpdateTabletModeState();
}
} }
} }
} }