mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 05:41:12 +00:00
2cb7aeff33
Backed out changeset 5670c9582add (bug 1417709) Backed out changeset 50f0febe43a0 (bug 1417709) Backed out changeset 29e6c0d82193 (bug 1417709) Backed out changeset e3a6c5b74595 (bug 1417709) Backed out changeset a0fe569c86c0 (bug 1417709)
1055 lines
31 KiB
C++
1055 lines
31 KiB
C++
/* -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "mozilla/ArrayUtils.h"
|
|
|
|
#include "nscore.h"
|
|
|
|
#include "nsXPLookAndFeel.h"
|
|
#include "nsLookAndFeel.h"
|
|
#include "HeadlessLookAndFeel.h"
|
|
#include "nsCRT.h"
|
|
#include "nsFont.h"
|
|
#include "mozilla/dom/ContentChild.h"
|
|
#include "mozilla/Preferences.h"
|
|
#include "mozilla/ServoStyleSet.h"
|
|
#include "mozilla/gfx/2D.h"
|
|
#include "mozilla/widget/WidgetMessageUtils.h"
|
|
|
|
#include "gfxPlatform.h"
|
|
#include "gfxPrefs.h"
|
|
#include "qcms.h"
|
|
|
|
#ifdef DEBUG
|
|
#include "nsSize.h"
|
|
#endif
|
|
|
|
using namespace mozilla;
|
|
|
|
nsLookAndFeelIntPref nsXPLookAndFeel::sIntPrefs[] =
|
|
{
|
|
{ "ui.caretBlinkTime",
|
|
eIntID_CaretBlinkTime,
|
|
false, 0 },
|
|
{ "ui.caretWidth",
|
|
eIntID_CaretWidth,
|
|
false, 0 },
|
|
{ "ui.caretVisibleWithSelection",
|
|
eIntID_ShowCaretDuringSelection,
|
|
false, 0 },
|
|
{ "ui.submenuDelay",
|
|
eIntID_SubmenuDelay,
|
|
false, 0 },
|
|
{ "ui.dragThresholdX",
|
|
eIntID_DragThresholdX,
|
|
false, 0 },
|
|
{ "ui.dragThresholdY",
|
|
eIntID_DragThresholdY,
|
|
false, 0 },
|
|
{ "ui.useAccessibilityTheme",
|
|
eIntID_UseAccessibilityTheme,
|
|
false, 0 },
|
|
{ "ui.menusCanOverlapOSBar",
|
|
eIntID_MenusCanOverlapOSBar,
|
|
false, 0 },
|
|
{ "ui.useOverlayScrollbars",
|
|
eIntID_UseOverlayScrollbars,
|
|
false, 0 },
|
|
{ "ui.scrollbarDisplayOnMouseMove",
|
|
eIntID_ScrollbarDisplayOnMouseMove,
|
|
false, 0 },
|
|
{ "ui.scrollbarFadeBeginDelay",
|
|
eIntID_ScrollbarFadeBeginDelay,
|
|
false, 0 },
|
|
{ "ui.scrollbarFadeDuration",
|
|
eIntID_ScrollbarFadeDuration,
|
|
false, 0 },
|
|
{ "ui.showHideScrollbars",
|
|
eIntID_ShowHideScrollbars,
|
|
false, 0 },
|
|
{ "ui.skipNavigatingDisabledMenuItem",
|
|
eIntID_SkipNavigatingDisabledMenuItem,
|
|
false, 0 },
|
|
{ "ui.treeOpenDelay",
|
|
eIntID_TreeOpenDelay,
|
|
false, 0 },
|
|
{ "ui.treeCloseDelay",
|
|
eIntID_TreeCloseDelay,
|
|
false, 0 },
|
|
{ "ui.treeLazyScrollDelay",
|
|
eIntID_TreeLazyScrollDelay,
|
|
false, 0 },
|
|
{ "ui.treeScrollDelay",
|
|
eIntID_TreeScrollDelay,
|
|
false, 0 },
|
|
{ "ui.treeScrollLinesMax",
|
|
eIntID_TreeScrollLinesMax,
|
|
false, 0 },
|
|
{ "accessibility.tabfocus",
|
|
eIntID_TabFocusModel,
|
|
false, 0 },
|
|
{ "ui.alertNotificationOrigin",
|
|
eIntID_AlertNotificationOrigin,
|
|
false, 0 },
|
|
{ "ui.scrollToClick",
|
|
eIntID_ScrollToClick,
|
|
false, 0 },
|
|
{ "ui.IMERawInputUnderlineStyle",
|
|
eIntID_IMERawInputUnderlineStyle,
|
|
false, 0 },
|
|
{ "ui.IMESelectedRawTextUnderlineStyle",
|
|
eIntID_IMESelectedRawTextUnderlineStyle,
|
|
false, 0 },
|
|
{ "ui.IMEConvertedTextUnderlineStyle",
|
|
eIntID_IMEConvertedTextUnderlineStyle,
|
|
false, 0 },
|
|
{ "ui.IMESelectedConvertedTextUnderlineStyle",
|
|
eIntID_IMESelectedConvertedTextUnderline,
|
|
false, 0 },
|
|
{ "ui.SpellCheckerUnderlineStyle",
|
|
eIntID_SpellCheckerUnderlineStyle,
|
|
false, 0 },
|
|
{ "ui.scrollbarButtonAutoRepeatBehavior",
|
|
eIntID_ScrollbarButtonAutoRepeatBehavior,
|
|
false, 0 },
|
|
{ "ui.tooltipDelay",
|
|
eIntID_TooltipDelay,
|
|
false, 0 },
|
|
{ "ui.contextMenuOffsetVertical",
|
|
eIntID_ContextMenuOffsetVertical,
|
|
false, 0 },
|
|
{ "ui.contextMenuOffsetHorizontal",
|
|
eIntID_ContextMenuOffsetHorizontal,
|
|
false, 0 },
|
|
{ "ui.GtkCSDAvailable",
|
|
eIntID_GTKCSDAvailable,
|
|
false, 0 },
|
|
{ "ui.GtkCSDMinimizeButton",
|
|
eIntID_GTKCSDMinimizeButton,
|
|
false, 0 },
|
|
{ "ui.GtkCSDMaximizeButton",
|
|
eIntID_GTKCSDMaximizeButton,
|
|
false, 0 },
|
|
{ "ui.GtkCSDCloseButton",
|
|
eIntID_GTKCSDCloseButton,
|
|
false, 0 }
|
|
};
|
|
|
|
nsLookAndFeelFloatPref nsXPLookAndFeel::sFloatPrefs[] =
|
|
{
|
|
{ "ui.IMEUnderlineRelativeSize",
|
|
eFloatID_IMEUnderlineRelativeSize,
|
|
false, 0 },
|
|
{ "ui.SpellCheckerUnderlineRelativeSize",
|
|
eFloatID_SpellCheckerUnderlineRelativeSize,
|
|
false, 0 },
|
|
{ "ui.caretAspectRatio",
|
|
eFloatID_CaretAspectRatio,
|
|
false, 0 },
|
|
};
|
|
|
|
|
|
// This array MUST be kept in the same order as the color list in LookAndFeel.h.
|
|
/* XXX If you add any strings longer than
|
|
* "ui.-moz-mac-active-source-list-selection"
|
|
* to the following array then you MUST update the
|
|
* sizes of the sColorPrefs array in nsXPLookAndFeel.h
|
|
*/
|
|
const char nsXPLookAndFeel::sColorPrefs[][41] =
|
|
{
|
|
"ui.windowBackground",
|
|
"ui.windowForeground",
|
|
"ui.widgetBackground",
|
|
"ui.widgetForeground",
|
|
"ui.widgetSelectBackground",
|
|
"ui.widgetSelectForeground",
|
|
"ui.widget3DHighlight",
|
|
"ui.widget3DShadow",
|
|
"ui.textBackground",
|
|
"ui.textForeground",
|
|
"ui.textSelectBackground",
|
|
"ui.textSelectForeground",
|
|
"ui.textSelectForegroundCustom",
|
|
"ui.textSelectBackgroundDisabled",
|
|
"ui.textSelectBackgroundAttention",
|
|
"ui.textHighlightBackground",
|
|
"ui.textHighlightForeground",
|
|
"ui.IMERawInputBackground",
|
|
"ui.IMERawInputForeground",
|
|
"ui.IMERawInputUnderline",
|
|
"ui.IMESelectedRawTextBackground",
|
|
"ui.IMESelectedRawTextForeground",
|
|
"ui.IMESelectedRawTextUnderline",
|
|
"ui.IMEConvertedTextBackground",
|
|
"ui.IMEConvertedTextForeground",
|
|
"ui.IMEConvertedTextUnderline",
|
|
"ui.IMESelectedConvertedTextBackground",
|
|
"ui.IMESelectedConvertedTextForeground",
|
|
"ui.IMESelectedConvertedTextUnderline",
|
|
"ui.SpellCheckerUnderline",
|
|
"ui.activeborder",
|
|
"ui.activecaption",
|
|
"ui.appworkspace",
|
|
"ui.background",
|
|
"ui.buttonface",
|
|
"ui.buttonhighlight",
|
|
"ui.buttonshadow",
|
|
"ui.buttontext",
|
|
"ui.captiontext",
|
|
"ui.graytext",
|
|
"ui.highlight",
|
|
"ui.highlighttext",
|
|
"ui.inactiveborder",
|
|
"ui.inactivecaption",
|
|
"ui.inactivecaptiontext",
|
|
"ui.infobackground",
|
|
"ui.infotext",
|
|
"ui.menu",
|
|
"ui.menutext",
|
|
"ui.scrollbar",
|
|
"ui.threeddarkshadow",
|
|
"ui.threedface",
|
|
"ui.threedhighlight",
|
|
"ui.threedlightshadow",
|
|
"ui.threedshadow",
|
|
"ui.window",
|
|
"ui.windowframe",
|
|
"ui.windowtext",
|
|
"ui.-moz-buttondefault",
|
|
"ui.-moz-field",
|
|
"ui.-moz-fieldtext",
|
|
"ui.-moz-dialog",
|
|
"ui.-moz-dialogtext",
|
|
"ui.-moz-dragtargetzone",
|
|
"ui.-moz-cellhighlight",
|
|
"ui.-moz_cellhighlighttext",
|
|
"ui.-moz-html-cellhighlight",
|
|
"ui.-moz-html-cellhighlighttext",
|
|
"ui.-moz-buttonhoverface",
|
|
"ui.-moz_buttonhovertext",
|
|
"ui.-moz_menuhover",
|
|
"ui.-moz_menuhovertext",
|
|
"ui.-moz_menubartext",
|
|
"ui.-moz_menubarhovertext",
|
|
"ui.-moz_eventreerow",
|
|
"ui.-moz_oddtreerow",
|
|
"ui.-moz-mac-buttonactivetext",
|
|
"ui.-moz_mac_chrome_active",
|
|
"ui.-moz_mac_chrome_inactive",
|
|
"ui.-moz-mac-defaultbuttontext",
|
|
"ui.-moz-mac-focusring",
|
|
"ui.-moz-mac-menuselect",
|
|
"ui.-moz-mac-menushadow",
|
|
"ui.-moz-mac-menutextdisable",
|
|
"ui.-moz-mac-menutextselect",
|
|
"ui.-moz_mac_disabledtoolbartext",
|
|
"ui.-moz-mac-secondaryhighlight",
|
|
"ui.-moz-mac-vibrancy-light",
|
|
"ui.-moz-mac-vibrancy-dark",
|
|
"ui.-moz-mac-vibrant-titlebar-light",
|
|
"ui.-moz-mac-vibrant-titlebar-dark",
|
|
"ui.-moz-mac-menupopup",
|
|
"ui.-moz-mac-menuitem",
|
|
"ui.-moz-mac-active-menuitem",
|
|
"ui.-moz-mac-source-list",
|
|
"ui.-moz-mac-source-list-selection",
|
|
"ui.-moz-mac-active-source-list-selection",
|
|
"ui.-moz-mac-tooltip",
|
|
"ui.-moz-win-mediatext",
|
|
"ui.-moz-win-communicationstext",
|
|
"ui.-moz-nativehyperlinktext",
|
|
"ui.-moz-comboboxtext",
|
|
"ui.-moz-combobox"
|
|
};
|
|
|
|
int32_t nsXPLookAndFeel::sCachedColors[LookAndFeel::eColorID_LAST_COLOR] = {0};
|
|
int32_t nsXPLookAndFeel::sCachedColorBits[COLOR_CACHE_SIZE] = {0};
|
|
|
|
bool nsXPLookAndFeel::sInitialized = false;
|
|
bool nsXPLookAndFeel::sUseNativeColors = true;
|
|
bool nsXPLookAndFeel::sUseStandinsForNativeColors = false;
|
|
bool nsXPLookAndFeel::sFindbarModalHighlight = false;
|
|
|
|
nsXPLookAndFeel* nsXPLookAndFeel::sInstance = nullptr;
|
|
bool nsXPLookAndFeel::sShutdown = false;
|
|
|
|
// static
|
|
nsXPLookAndFeel*
|
|
nsXPLookAndFeel::GetInstance()
|
|
{
|
|
if (sInstance) {
|
|
return sInstance;
|
|
}
|
|
|
|
NS_ENSURE_TRUE(!sShutdown, nullptr);
|
|
|
|
if (gfxPlatform::IsHeadless()) {
|
|
sInstance = new widget::HeadlessLookAndFeel();
|
|
} else {
|
|
sInstance = new nsLookAndFeel();
|
|
}
|
|
return sInstance;
|
|
}
|
|
|
|
// static
|
|
void
|
|
nsXPLookAndFeel::Shutdown()
|
|
{
|
|
if (sShutdown) {
|
|
return;
|
|
}
|
|
sShutdown = true;
|
|
delete sInstance;
|
|
sInstance = nullptr;
|
|
}
|
|
|
|
nsXPLookAndFeel::nsXPLookAndFeel() : LookAndFeel()
|
|
{
|
|
}
|
|
|
|
// static
|
|
void
|
|
nsXPLookAndFeel::IntPrefChanged(nsLookAndFeelIntPref *data)
|
|
{
|
|
if (!data) {
|
|
return;
|
|
}
|
|
|
|
int32_t intpref;
|
|
nsresult rv = Preferences::GetInt(data->name, &intpref);
|
|
if (NS_FAILED(rv)) {
|
|
return;
|
|
}
|
|
data->intVar = intpref;
|
|
data->isSet = true;
|
|
#ifdef DEBUG_akkana
|
|
printf("====== Changed int pref %s to %d\n", data->name, data->intVar);
|
|
#endif
|
|
}
|
|
|
|
// static
|
|
void
|
|
nsXPLookAndFeel::FloatPrefChanged(nsLookAndFeelFloatPref *data)
|
|
{
|
|
if (!data) {
|
|
return;
|
|
}
|
|
|
|
int32_t intpref;
|
|
nsresult rv = Preferences::GetInt(data->name, &intpref);
|
|
if (NS_FAILED(rv)) {
|
|
return;
|
|
}
|
|
data->floatVar = (float)intpref / 100.0f;
|
|
data->isSet = true;
|
|
#ifdef DEBUG_akkana
|
|
printf("====== Changed float pref %s to %f\n", data->name, data->floatVar);
|
|
#endif
|
|
}
|
|
|
|
// static
|
|
void
|
|
nsXPLookAndFeel::ColorPrefChanged (unsigned int index, const char *prefName)
|
|
{
|
|
nsAutoString colorStr;
|
|
nsresult rv = Preferences::GetString(prefName, colorStr);
|
|
if (NS_FAILED(rv)) {
|
|
return;
|
|
}
|
|
if (!colorStr.IsEmpty()) {
|
|
nscolor thecolor;
|
|
if (colorStr[0] == char16_t('#')) {
|
|
if (NS_HexToRGBA(nsDependentString(colorStr, 1),
|
|
nsHexColorType::NoAlpha, &thecolor)) {
|
|
int32_t id = NS_PTR_TO_INT32(index);
|
|
CACHE_COLOR(id, thecolor);
|
|
}
|
|
} else if (NS_ColorNameToRGB(colorStr, &thecolor)) {
|
|
int32_t id = NS_PTR_TO_INT32(index);
|
|
CACHE_COLOR(id, thecolor);
|
|
#ifdef DEBUG_akkana
|
|
printf("====== Changed color pref %s to 0x%lx\n",
|
|
prefName, thecolor);
|
|
#endif
|
|
}
|
|
} else {
|
|
// Reset to the default color, by clearing the cache
|
|
// to force lookup when the color is next used
|
|
int32_t id = NS_PTR_TO_INT32(index);
|
|
CLEAR_COLOR_CACHE(id);
|
|
}
|
|
}
|
|
|
|
void
|
|
nsXPLookAndFeel::InitFromPref(nsLookAndFeelIntPref* aPref)
|
|
{
|
|
int32_t intpref;
|
|
nsresult rv = Preferences::GetInt(aPref->name, &intpref);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
aPref->isSet = true;
|
|
aPref->intVar = intpref;
|
|
}
|
|
}
|
|
|
|
void
|
|
nsXPLookAndFeel::InitFromPref(nsLookAndFeelFloatPref* aPref)
|
|
{
|
|
int32_t intpref;
|
|
nsresult rv = Preferences::GetInt(aPref->name, &intpref);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
aPref->isSet = true;
|
|
aPref->floatVar = (float)intpref / 100.0f;
|
|
}
|
|
}
|
|
|
|
void
|
|
nsXPLookAndFeel::InitColorFromPref(int32_t i)
|
|
{
|
|
nsAutoString colorStr;
|
|
nsresult rv = Preferences::GetString(sColorPrefs[i], colorStr);
|
|
if (NS_FAILED(rv) || colorStr.IsEmpty()) {
|
|
return;
|
|
}
|
|
nscolor thecolor;
|
|
if (colorStr[0] == char16_t('#')) {
|
|
nsAutoString hexString;
|
|
colorStr.Right(hexString, colorStr.Length() - 1);
|
|
if (NS_HexToRGBA(hexString, nsHexColorType::NoAlpha, &thecolor)) {
|
|
CACHE_COLOR(i, thecolor);
|
|
}
|
|
} else if (NS_ColorNameToRGB(colorStr, &thecolor)) {
|
|
CACHE_COLOR(i, thecolor);
|
|
}
|
|
}
|
|
|
|
// static
|
|
void
|
|
nsXPLookAndFeel::OnPrefChanged(const char* aPref, void* aClosure)
|
|
{
|
|
|
|
// looping in the same order as in ::Init
|
|
|
|
nsDependentCString prefName(aPref);
|
|
unsigned int i;
|
|
for (i = 0; i < ArrayLength(sIntPrefs); ++i) {
|
|
if (prefName.Equals(sIntPrefs[i].name)) {
|
|
IntPrefChanged(&sIntPrefs[i]);
|
|
return;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < ArrayLength(sFloatPrefs); ++i) {
|
|
if (prefName.Equals(sFloatPrefs[i].name)) {
|
|
FloatPrefChanged(&sFloatPrefs[i]);
|
|
return;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < ArrayLength(sColorPrefs); ++i) {
|
|
if (prefName.Equals(sColorPrefs[i])) {
|
|
ColorPrefChanged(i, sColorPrefs[i]);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Read values from the user's preferences.
|
|
// This is done once at startup, but since the user's preferences
|
|
// haven't actually been read yet at that time, we also have to
|
|
// set a callback to inform us of changes to each pref.
|
|
//
|
|
void
|
|
nsXPLookAndFeel::Init()
|
|
{
|
|
MOZ_RELEASE_ASSERT(NS_IsMainThread());
|
|
|
|
// Say we're already initialized, and take the chance that it might fail;
|
|
// protects against some other process writing to our static variables.
|
|
sInitialized = true;
|
|
|
|
// XXX If we could reorganize the pref names, we should separate the branch
|
|
// for each types. Then, we could reduce the unnecessary loop from
|
|
// nsXPLookAndFeel::OnPrefChanged().
|
|
Preferences::RegisterPrefixCallback(OnPrefChanged, "ui.");
|
|
// We really do just want the accessibility.tabfocus pref, not other prefs
|
|
// that start with that string.
|
|
Preferences::RegisterCallback(OnPrefChanged, "accessibility.tabfocus");
|
|
|
|
unsigned int i;
|
|
for (i = 0; i < ArrayLength(sIntPrefs); ++i) {
|
|
InitFromPref(&sIntPrefs[i]);
|
|
}
|
|
|
|
for (i = 0; i < ArrayLength(sFloatPrefs); ++i) {
|
|
InitFromPref(&sFloatPrefs[i]);
|
|
}
|
|
|
|
for (i = 0; i < ArrayLength(sColorPrefs); ++i) {
|
|
InitColorFromPref(i);
|
|
}
|
|
|
|
Preferences::AddBoolVarCache(&sUseNativeColors,
|
|
"ui.use_native_colors",
|
|
sUseNativeColors);
|
|
Preferences::AddBoolVarCache(&sUseStandinsForNativeColors,
|
|
"ui.use_standins_for_native_colors",
|
|
sUseStandinsForNativeColors);
|
|
Preferences::AddBoolVarCache(&sFindbarModalHighlight,
|
|
"findbar.modalHighlight",
|
|
sFindbarModalHighlight);
|
|
|
|
if (XRE_IsContentProcess()) {
|
|
mozilla::dom::ContentChild* cc =
|
|
mozilla::dom::ContentChild::GetSingleton();
|
|
|
|
LookAndFeel::SetIntCache(cc->LookAndFeelCache());
|
|
// This is only ever used once during initialization, and can be cleared now.
|
|
cc->LookAndFeelCache().Clear();
|
|
}
|
|
}
|
|
|
|
nsXPLookAndFeel::~nsXPLookAndFeel()
|
|
{
|
|
NS_ASSERTION(sInstance == this,
|
|
"This destroying instance isn't the singleton instance");
|
|
sInstance = nullptr;
|
|
}
|
|
|
|
bool
|
|
nsXPLookAndFeel::IsSpecialColor(ColorID aID, nscolor &aColor)
|
|
{
|
|
switch (aID) {
|
|
case eColorID_TextSelectForeground:
|
|
return (aColor == NS_DONT_CHANGE_COLOR);
|
|
case eColorID_IMESelectedRawTextBackground:
|
|
case eColorID_IMESelectedConvertedTextBackground:
|
|
case eColorID_IMERawInputBackground:
|
|
case eColorID_IMEConvertedTextBackground:
|
|
case eColorID_IMESelectedRawTextForeground:
|
|
case eColorID_IMESelectedConvertedTextForeground:
|
|
case eColorID_IMERawInputForeground:
|
|
case eColorID_IMEConvertedTextForeground:
|
|
case eColorID_IMERawInputUnderline:
|
|
case eColorID_IMEConvertedTextUnderline:
|
|
case eColorID_IMESelectedRawTextUnderline:
|
|
case eColorID_IMESelectedConvertedTextUnderline:
|
|
case eColorID_SpellCheckerUnderline:
|
|
return NS_IS_SELECTION_SPECIAL_COLOR(aColor);
|
|
default:
|
|
/*
|
|
* In GetColor(), every color that is not a special color is color
|
|
* corrected. Use false to make other colors color corrected.
|
|
*/
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
nsXPLookAndFeel::ColorIsNotCSSAccessible(ColorID aID)
|
|
{
|
|
bool result = false;
|
|
|
|
switch (aID) {
|
|
case eColorID_WindowBackground:
|
|
case eColorID_WindowForeground:
|
|
case eColorID_WidgetBackground:
|
|
case eColorID_WidgetForeground:
|
|
case eColorID_WidgetSelectBackground:
|
|
case eColorID_WidgetSelectForeground:
|
|
case eColorID_Widget3DHighlight:
|
|
case eColorID_Widget3DShadow:
|
|
case eColorID_TextBackground:
|
|
case eColorID_TextForeground:
|
|
case eColorID_TextSelectBackground:
|
|
case eColorID_TextSelectForeground:
|
|
case eColorID_TextSelectBackgroundDisabled:
|
|
case eColorID_TextSelectBackgroundAttention:
|
|
case eColorID_TextHighlightBackground:
|
|
case eColorID_TextHighlightForeground:
|
|
case eColorID_IMERawInputBackground:
|
|
case eColorID_IMERawInputForeground:
|
|
case eColorID_IMERawInputUnderline:
|
|
case eColorID_IMESelectedRawTextBackground:
|
|
case eColorID_IMESelectedRawTextForeground:
|
|
case eColorID_IMESelectedRawTextUnderline:
|
|
case eColorID_IMEConvertedTextBackground:
|
|
case eColorID_IMEConvertedTextForeground:
|
|
case eColorID_IMEConvertedTextUnderline:
|
|
case eColorID_IMESelectedConvertedTextBackground:
|
|
case eColorID_IMESelectedConvertedTextForeground:
|
|
case eColorID_IMESelectedConvertedTextUnderline:
|
|
case eColorID_SpellCheckerUnderline:
|
|
result = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
nscolor
|
|
nsXPLookAndFeel::GetStandinForNativeColor(ColorID aID)
|
|
{
|
|
nscolor result = NS_RGB(0xFF, 0xFF, 0xFF);
|
|
|
|
// The stand-in colors are taken from the Windows 7 Aero theme
|
|
// except Mac-specific colors which are taken from Mac OS 10.7.
|
|
switch (aID) {
|
|
// CSS 2 colors:
|
|
case eColorID_activeborder: result = NS_RGB(0xB4, 0xB4, 0xB4); break;
|
|
case eColorID_activecaption: result = NS_RGB(0x99, 0xB4, 0xD1); break;
|
|
case eColorID_appworkspace: result = NS_RGB(0xAB, 0xAB, 0xAB); break;
|
|
case eColorID_background: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID_buttonface: result = NS_RGB(0xF0, 0xF0, 0xF0); break;
|
|
case eColorID_buttonhighlight: result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID_buttonshadow: result = NS_RGB(0xA0, 0xA0, 0xA0); break;
|
|
case eColorID_buttontext: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID_captiontext: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID_graytext: result = NS_RGB(0x6D, 0x6D, 0x6D); break;
|
|
case eColorID_highlight: result = NS_RGB(0x33, 0x99, 0xFF); break;
|
|
case eColorID_highlighttext: result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID_inactiveborder: result = NS_RGB(0xF4, 0xF7, 0xFC); break;
|
|
case eColorID_inactivecaption: result = NS_RGB(0xBF, 0xCD, 0xDB); break;
|
|
case eColorID_inactivecaptiontext:
|
|
result = NS_RGB(0x43, 0x4E, 0x54); break;
|
|
case eColorID_infobackground: result = NS_RGB(0xFF, 0xFF, 0xE1); break;
|
|
case eColorID_infotext: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID_menu: result = NS_RGB(0xF0, 0xF0, 0xF0); break;
|
|
case eColorID_menutext: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID_scrollbar: result = NS_RGB(0xC8, 0xC8, 0xC8); break;
|
|
case eColorID_threeddarkshadow: result = NS_RGB(0x69, 0x69, 0x69); break;
|
|
case eColorID_threedface: result = NS_RGB(0xF0, 0xF0, 0xF0); break;
|
|
case eColorID_threedhighlight: result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID_threedlightshadow: result = NS_RGB(0xE3, 0xE3, 0xE3); break;
|
|
case eColorID_threedshadow: result = NS_RGB(0xA0, 0xA0, 0xA0); break;
|
|
case eColorID_window: result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID_windowframe: result = NS_RGB(0x64, 0x64, 0x64); break;
|
|
case eColorID_windowtext: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_buttondefault:
|
|
result = NS_RGB(0x69, 0x69, 0x69); break;
|
|
case eColorID__moz_field: result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID__moz_fieldtext: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_dialog: result = NS_RGB(0xF0, 0xF0, 0xF0); break;
|
|
case eColorID__moz_dialogtext: result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_dragtargetzone:
|
|
result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID__moz_cellhighlight:
|
|
result = NS_RGB(0xF0, 0xF0, 0xF0); break;
|
|
case eColorID__moz_cellhighlighttext:
|
|
result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_html_cellhighlight:
|
|
result = NS_RGB(0x33, 0x99, 0xFF); break;
|
|
case eColorID__moz_html_cellhighlighttext:
|
|
result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID__moz_buttonhoverface:
|
|
result = NS_RGB(0xF0, 0xF0, 0xF0); break;
|
|
case eColorID__moz_buttonhovertext:
|
|
result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_menuhover:
|
|
result = NS_RGB(0x33, 0x99, 0xFF); break;
|
|
case eColorID__moz_menuhovertext:
|
|
result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_menubartext:
|
|
result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_menubarhovertext:
|
|
result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_oddtreerow:
|
|
result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID__moz_mac_chrome_active:
|
|
result = NS_RGB(0xB2, 0xB2, 0xB2); break;
|
|
case eColorID__moz_mac_chrome_inactive:
|
|
result = NS_RGB(0xE1, 0xE1, 0xE1); break;
|
|
case eColorID__moz_mac_focusring:
|
|
result = NS_RGB(0x60, 0x9D, 0xD7); break;
|
|
case eColorID__moz_mac_menuselect:
|
|
result = NS_RGB(0x38, 0x75, 0xD7); break;
|
|
case eColorID__moz_mac_menushadow:
|
|
result = NS_RGB(0xA3, 0xA3, 0xA3); break;
|
|
case eColorID__moz_mac_menutextdisable:
|
|
result = NS_RGB(0x88, 0x88, 0x88); break;
|
|
case eColorID__moz_mac_menutextselect:
|
|
result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID__moz_mac_disabledtoolbartext:
|
|
result = NS_RGB(0x3F, 0x3F, 0x3F); break;
|
|
case eColorID__moz_mac_secondaryhighlight:
|
|
result = NS_RGB(0xD4, 0xD4, 0xD4); break;
|
|
case eColorID__moz_mac_vibrancy_light:
|
|
case eColorID__moz_mac_vibrant_titlebar_light:
|
|
result = NS_RGB(0xf7, 0xf7, 0xf7); break;
|
|
case eColorID__moz_mac_vibrancy_dark:
|
|
case eColorID__moz_mac_vibrant_titlebar_dark:
|
|
result = NS_RGB(0x28, 0x28, 0x28); break;
|
|
case eColorID__moz_mac_menupopup:
|
|
result = NS_RGB(0xe6, 0xe6, 0xe6); break;
|
|
case eColorID__moz_mac_menuitem:
|
|
result = NS_RGB(0xe6, 0xe6, 0xe6); break;
|
|
case eColorID__moz_mac_active_menuitem:
|
|
result = NS_RGB(0x0a, 0x64, 0xdc); break;
|
|
case eColorID__moz_mac_source_list:
|
|
result = NS_RGB(0xf7, 0xf7, 0xf7); break;
|
|
case eColorID__moz_mac_source_list_selection:
|
|
result = NS_RGB(0xc8, 0xc8, 0xc8); break;
|
|
case eColorID__moz_mac_active_source_list_selection:
|
|
result = NS_RGB(0x0a, 0x64, 0xdc); break;
|
|
case eColorID__moz_mac_tooltip:
|
|
result = NS_RGB(0xf7, 0xf7, 0xf7); 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_accentcolortext:
|
|
result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_win_mediatext:
|
|
result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID__moz_win_communicationstext:
|
|
result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
case eColorID__moz_nativehyperlinktext:
|
|
result = NS_RGB(0x00, 0x66, 0xCC); break;
|
|
case eColorID__moz_comboboxtext:
|
|
result = NS_RGB(0x00, 0x00, 0x00); break;
|
|
case eColorID__moz_combobox:
|
|
result = NS_RGB(0xFF, 0xFF, 0xFF); break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// All these routines will return NS_OK if they have a value,
|
|
// in which case the nsLookAndFeel should use that value;
|
|
// otherwise we'll return NS_ERROR_NOT_AVAILABLE, in which case, the
|
|
// platform-specific nsLookAndFeel should use its own values instead.
|
|
//
|
|
nsresult
|
|
nsXPLookAndFeel::GetColorImpl(ColorID aID, bool aUseStandinsForNativeColors,
|
|
nscolor &aResult)
|
|
{
|
|
if (!sInitialized)
|
|
Init();
|
|
|
|
// define DEBUG_SYSTEM_COLOR_USE if you want to debug system color
|
|
// use in a skin that uses them. When set, it will make all system
|
|
// color pairs that are appropriate for foreground/background
|
|
// pairing the same. This means if the skin is using system colors
|
|
// correctly you will not be able to see *any* text.
|
|
#undef DEBUG_SYSTEM_COLOR_USE
|
|
|
|
#ifdef DEBUG_SYSTEM_COLOR_USE
|
|
{
|
|
nsresult rv = NS_OK;
|
|
switch (aID) {
|
|
// css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
|
|
case eColorID_activecaption:
|
|
// active window caption background
|
|
case eColorID_captiontext:
|
|
// text in active window caption
|
|
aResult = NS_RGB(0xff, 0x00, 0x00);
|
|
break;
|
|
|
|
case eColorID_highlight:
|
|
// background of selected item
|
|
case eColorID_highlighttext:
|
|
// text of selected item
|
|
aResult = NS_RGB(0xff, 0xff, 0x00);
|
|
break;
|
|
|
|
case eColorID_inactivecaption:
|
|
// inactive window caption
|
|
case eColorID_inactivecaptiontext:
|
|
// text in inactive window caption
|
|
aResult = NS_RGB(0x66, 0x66, 0x00);
|
|
break;
|
|
|
|
case eColorID_infobackground:
|
|
// tooltip background color
|
|
case eColorID_infotext:
|
|
// tooltip text color
|
|
aResult = NS_RGB(0x00, 0xff, 0x00);
|
|
break;
|
|
|
|
case eColorID_menu:
|
|
// menu background
|
|
case eColorID_menutext:
|
|
// menu text
|
|
aResult = NS_RGB(0x00, 0xff, 0xff);
|
|
break;
|
|
|
|
case eColorID_threedface:
|
|
case eColorID_buttonface:
|
|
// 3-D face color
|
|
case eColorID_buttontext:
|
|
// text on push buttons
|
|
aResult = NS_RGB(0x00, 0x66, 0x66);
|
|
break;
|
|
|
|
case eColorID_window:
|
|
case eColorID_windowtext:
|
|
aResult = NS_RGB(0x00, 0x00, 0xff);
|
|
break;
|
|
|
|
// from the CSS3 working draft (not yet finalized)
|
|
// http://www.w3.org/tr/2000/wd-css3-userint-20000216.html#color
|
|
|
|
case eColorID__moz_field:
|
|
case eColorID__moz_fieldtext:
|
|
aResult = NS_RGB(0xff, 0x00, 0xff);
|
|
break;
|
|
|
|
case eColorID__moz_dialog:
|
|
case eColorID__moz_dialogtext:
|
|
aResult = NS_RGB(0x66, 0x00, 0x66);
|
|
break;
|
|
|
|
default:
|
|
rv = NS_ERROR_NOT_AVAILABLE;
|
|
}
|
|
if (NS_SUCCEEDED(rv))
|
|
return rv;
|
|
}
|
|
#endif // DEBUG_SYSTEM_COLOR_USE
|
|
|
|
if (aUseStandinsForNativeColors &&
|
|
(ColorIsNotCSSAccessible(aID) || !sUseStandinsForNativeColors)) {
|
|
aUseStandinsForNativeColors = false;
|
|
}
|
|
|
|
if (!aUseStandinsForNativeColors && IS_COLOR_CACHED(aID)) {
|
|
aResult = sCachedColors[aID];
|
|
return NS_OK;
|
|
}
|
|
|
|
// There are no system color settings for these, so set them manually
|
|
#ifndef XP_MACOSX
|
|
if (aID == eColorID_TextSelectBackgroundDisabled) {
|
|
// This is used to gray out the selection when it's not focused
|
|
// Used with nsISelectionController::SELECTION_DISABLED
|
|
aResult = NS_RGB(0xb0, 0xb0, 0xb0);
|
|
return NS_OK;
|
|
}
|
|
#endif
|
|
|
|
if (aID == eColorID_TextSelectBackgroundAttention) {
|
|
if (sFindbarModalHighlight) {
|
|
aResult = NS_RGBA(0, 0, 0, 0);
|
|
return NS_OK;
|
|
}
|
|
|
|
// This makes the selection stand out when typeaheadfind is on
|
|
// Used with nsISelectionController::SELECTION_ATTENTION
|
|
aResult = NS_RGB(0x38, 0xd8, 0x78);
|
|
return NS_OK;
|
|
}
|
|
|
|
if (aID == eColorID_TextHighlightBackground) {
|
|
// This makes the matched text stand out when findbar highlighting is on
|
|
// Used with nsISelectionController::SELECTION_FIND
|
|
aResult = NS_RGB(0xef, 0x0f, 0xff);
|
|
return NS_OK;
|
|
}
|
|
|
|
if (aID == eColorID_TextHighlightForeground) {
|
|
// The foreground color for the matched text in findbar highlighting
|
|
// Used with nsISelectionController::SELECTION_FIND
|
|
aResult = NS_RGB(0xff, 0xff, 0xff);
|
|
return NS_OK;
|
|
}
|
|
|
|
if (sUseNativeColors && aUseStandinsForNativeColors) {
|
|
aResult = GetStandinForNativeColor(aID);
|
|
return NS_OK;
|
|
}
|
|
|
|
if (sUseNativeColors && NS_SUCCEEDED(NativeGetColor(aID, aResult))) {
|
|
if (!mozilla::ServoStyleSet::IsInServoTraversal()) {
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
// Make sure the preferences are initialized. In the normal run,
|
|
// they would already be, because gfxPlatform would have been created,
|
|
// but with some addon, that is not the case. See Bug 1357307.
|
|
gfxPrefs::GetSingleton();
|
|
if ((gfxPlatform::GetCMSMode() == eCMSMode_All) &&
|
|
!IsSpecialColor(aID, aResult)) {
|
|
qcms_transform *transform = gfxPlatform::GetCMSInverseRGBTransform();
|
|
if (transform) {
|
|
uint8_t color[3];
|
|
color[0] = NS_GET_R(aResult);
|
|
color[1] = NS_GET_G(aResult);
|
|
color[2] = NS_GET_B(aResult);
|
|
qcms_transform_data(transform, color, color, 1);
|
|
aResult = NS_RGB(color[0], color[1], color[2]);
|
|
}
|
|
}
|
|
|
|
CACHE_COLOR(aID, aResult);
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
nsresult
|
|
nsXPLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult)
|
|
{
|
|
if (!sInitialized)
|
|
Init();
|
|
|
|
// Set the default values for these prefs. but allow different platforms
|
|
// to override them in their nsLookAndFeel if desired.
|
|
switch (aID) {
|
|
case eIntID_ScrollButtonLeftMouseButtonAction:
|
|
aResult = 0;
|
|
return NS_OK;
|
|
case eIntID_ScrollButtonMiddleMouseButtonAction:
|
|
aResult = 3;
|
|
return NS_OK;
|
|
case eIntID_ScrollButtonRightMouseButtonAction:
|
|
aResult = 3;
|
|
return NS_OK;
|
|
default:
|
|
/*
|
|
* The metrics above are hardcoded platform defaults. All the other
|
|
* metrics are stored in sIntPrefs and can be changed at runtime.
|
|
*/
|
|
break;
|
|
}
|
|
|
|
for (unsigned int i = 0; i < ArrayLength(sIntPrefs); ++i) {
|
|
if (sIntPrefs[i].isSet && (sIntPrefs[i].id == aID)) {
|
|
aResult = sIntPrefs[i].intVar;
|
|
return NS_OK;
|
|
}
|
|
}
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
nsresult
|
|
nsXPLookAndFeel::GetFloatImpl(FloatID aID, float &aResult)
|
|
{
|
|
if (!sInitialized)
|
|
Init();
|
|
|
|
for (unsigned int i = 0; i < ArrayLength(sFloatPrefs); ++i) {
|
|
if (sFloatPrefs[i].isSet && sFloatPrefs[i].id == aID) {
|
|
aResult = sFloatPrefs[i].floatVar;
|
|
return NS_OK;
|
|
}
|
|
}
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
void
|
|
nsXPLookAndFeel::RefreshImpl()
|
|
{
|
|
// Wipe out our color cache.
|
|
uint32_t i;
|
|
for (i = 0; i < eColorID_LAST_COLOR; i++)
|
|
sCachedColors[i] = 0;
|
|
for (i = 0; i < COLOR_CACHE_SIZE; i++)
|
|
sCachedColorBits[i] = 0;
|
|
}
|
|
|
|
nsTArray<LookAndFeelInt>
|
|
nsXPLookAndFeel::GetIntCacheImpl()
|
|
{
|
|
return nsTArray<LookAndFeelInt>();
|
|
}
|
|
|
|
namespace mozilla {
|
|
|
|
// static
|
|
nsresult
|
|
LookAndFeel::GetColor(ColorID aID, nscolor* aResult)
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetColorImpl(aID, false, *aResult);
|
|
}
|
|
|
|
nsresult
|
|
LookAndFeel::GetColor(ColorID aID, bool aUseStandinsForNativeColors,
|
|
nscolor* aResult)
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetColorImpl(aID,
|
|
aUseStandinsForNativeColors, *aResult);
|
|
}
|
|
|
|
// static
|
|
nsresult
|
|
LookAndFeel::GetInt(IntID aID, int32_t* aResult)
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetIntImpl(aID, *aResult);
|
|
}
|
|
|
|
// static
|
|
nsresult
|
|
LookAndFeel::GetFloat(FloatID aID, float* aResult)
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetFloatImpl(aID, *aResult);
|
|
}
|
|
|
|
// static
|
|
bool
|
|
LookAndFeel::GetFont(FontID aID, nsString& aName, gfxFontStyle& aStyle,
|
|
float aDevPixPerCSSPixel)
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetFontImpl(aID, aName, aStyle,
|
|
aDevPixPerCSSPixel);
|
|
}
|
|
|
|
// static
|
|
char16_t
|
|
LookAndFeel::GetPasswordCharacter()
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetPasswordCharacterImpl();
|
|
}
|
|
|
|
// static
|
|
bool
|
|
LookAndFeel::GetEchoPassword()
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetEchoPasswordImpl();
|
|
}
|
|
|
|
// static
|
|
uint32_t
|
|
LookAndFeel::GetPasswordMaskDelay()
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetPasswordMaskDelayImpl();
|
|
}
|
|
|
|
// static
|
|
void
|
|
LookAndFeel::Refresh()
|
|
{
|
|
nsLookAndFeel::GetInstance()->RefreshImpl();
|
|
}
|
|
|
|
// static
|
|
void
|
|
LookAndFeel::NativeInit()
|
|
{
|
|
nsLookAndFeel::GetInstance()->NativeInit();
|
|
}
|
|
|
|
// static
|
|
nsTArray<LookAndFeelInt>
|
|
LookAndFeel::GetIntCache()
|
|
{
|
|
return nsLookAndFeel::GetInstance()->GetIntCacheImpl();
|
|
}
|
|
|
|
// static
|
|
void
|
|
LookAndFeel::SetIntCache(const nsTArray<LookAndFeelInt>& aLookAndFeelIntCache)
|
|
{
|
|
return nsLookAndFeel::GetInstance()->SetIntCacheImpl(aLookAndFeelIntCache);
|
|
}
|
|
|
|
} // namespace mozilla
|