mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-06 07:48:38 +09:00
parent
6a03b3bc1a
commit
1f90db3750
7 changed files with 126 additions and 5 deletions
|
|
@ -267,6 +267,23 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor &aColor)
|
|||
case eColorID__moz_cellhighlight:
|
||||
idx = COLOR_3DFACE;
|
||||
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_accentcolortext:
|
||||
res = GetAccentColorText(aColor);
|
||||
if (NS_SUCCEEDED(res)) {
|
||||
return res;
|
||||
}
|
||||
aColor = NS_RGB(0, 0, 0);
|
||||
return NS_OK;
|
||||
case eColorID__moz_win_mediatext:
|
||||
if (IsVistaOrLater() && IsAppThemed()) {
|
||||
res = ::GetColorFromTheme(eUXMediaToolbar,
|
||||
|
|
@ -705,3 +722,68 @@ 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;
|
||||
}
|
||||
|
||||
/* static */ nsresult
|
||||
nsLookAndFeel::GetAccentColorText(nscolor& aColor)
|
||||
{
|
||||
nscolor accentColor;
|
||||
nsresult rv = GetAccentColor(accentColor);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
// We want the color that we return for text that will be drawn over
|
||||
// a background that has the accent color to have good contrast with
|
||||
// the accent color. Windows itself uses either white or black text
|
||||
// depending on how light or dark the accent color is. We do the same
|
||||
// here based on the luminance of the accent color with a threshhold
|
||||
// value and formula that are specified in the UWP guidelines.
|
||||
// See: https://docs.microsoft.com/en-us/windows/uwp/style/color
|
||||
|
||||
float luminance = (NS_GET_R(accentColor) * 2 +
|
||||
NS_GET_G(accentColor) * 5 +
|
||||
NS_GET_B(accentColor)) / 8;
|
||||
|
||||
aColor = (luminance <= 128) ? NS_RGB(255, 255, 255) : NS_RGB(0, 0, 0);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue