diff options
Diffstat (limited to 'widget/LookAndFeel.h')
-rw-r--r-- | widget/LookAndFeel.h | 602 |
1 files changed, 602 insertions, 0 deletions
diff --git a/widget/LookAndFeel.h b/widget/LookAndFeel.h new file mode 100644 index 0000000000..aff5e4009c --- /dev/null +++ b/widget/LookAndFeel.h @@ -0,0 +1,602 @@ +/* -*- Mode: C++; tab-width: 2; 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/. */ + +#ifndef __LookAndFeel +#define __LookAndFeel + +#ifndef MOZILLA_INTERNAL_API +# error "This header is only usable from within libxul (MOZILLA_INTERNAL_API)." +#endif + +#include "nsDebug.h" +#include "nsColor.h" +#include "nsString.h" +#include "nsTArray.h" +#include "mozilla/widget/ThemeChangeKind.h" + +struct gfxFontStyle; + +namespace mozilla { + +namespace widget { +class FullLookAndFeel; +class LookAndFeelCache; +} // namespace widget + +enum class StyleSystemColor : uint8_t; + +class LookAndFeel { + public: + using ColorID = StyleSystemColor; + + // When modifying this list, also modify nsXPLookAndFeel::sIntPrefs + // in widget/xpwidgts/nsXPLookAndFeel.cpp. + enum class IntID { + // default, may be overriden by OS + CaretBlinkTime, + // pixel width of caret + CaretWidth, + // show the caret when text is selected? + ShowCaretDuringSelection, + // select textfields when focused via tab/accesskey? + SelectTextfieldsOnKeyFocus, + // delay before submenus open + SubmenuDelay, + // can popups overlap menu/task bar? + MenusCanOverlapOSBar, + // should overlay scrollbars be used? + UseOverlayScrollbars, + // allow H and V overlay scrollbars to overlap? + AllowOverlayScrollbarsOverlap, + // show/hide scrollbars based on activity + ShowHideScrollbars, + // skip navigating to disabled menu item? + SkipNavigatingDisabledMenuItem, + // begin a drag if the mouse is moved further than the threshold while the + // button is down + DragThresholdX, + DragThresholdY, + // Accessibility theme being used? + UseAccessibilityTheme, + + // position of scroll arrows in a scrollbar + ScrollArrowStyle, + // is scroll thumb proportional or fixed? + ScrollSliderStyle, + + // each button can take one of four values: + ScrollButtonLeftMouseButtonAction, + // 0 - scrolls one line, 1 - scrolls one page + ScrollButtonMiddleMouseButtonAction, + // 2 - scrolls to end, 3 - button ignored + ScrollButtonRightMouseButtonAction, + + // delay for opening spring loaded folders + TreeOpenDelay, + // delay for closing spring loaded folders + TreeCloseDelay, + // delay for triggering the tree scrolling + TreeLazyScrollDelay, + // delay for scrolling the tree + TreeScrollDelay, + // the maximum number of lines to be scrolled at ones + TreeScrollLinesMax, + // What type of tab-order to use + TabFocusModel, + // Should menu items blink when they're chosen? + ChosenMenuItemsShouldBlink, + + /* + * A Boolean value to determine whether the Windows accent color + * should be applied to the title bar. + * + * The value of this metric is not used on other platforms. These platforms + * should return NS_ERROR_NOT_IMPLEMENTED when queried for this metric. + */ + WindowsAccentColorInTitlebar, + + /* + * A Boolean value to determine whether the Windows default theme is + * being used. + * + * The value of this metric is not used on other platforms. These platforms + * should return NS_ERROR_NOT_IMPLEMENTED when queried for this metric. + */ + WindowsDefaultTheme, + + /* + * A Boolean value to determine whether the DWM compositor is being used + * + * This metric is not used on non-Windows platforms. These platforms + * should return NS_ERROR_NOT_IMPLEMENTED when queried for this metric. + */ + DWMCompositor, + + /* + * A Boolean value to determine whether Windows is themed (Classic vs. + * uxtheme) + * + * This is Windows-specific and is not implemented on other platforms + * (will return the default of NS_ERROR_FAILURE). + */ + WindowsClassic, + + /* + * A Boolean value to determine whether the current Windows desktop theme + * supports Aero Glass. + * + * This is Windows-specific and is not implemented on other platforms + * (will return the default of NS_ERROR_FAILURE). + */ + WindowsGlass, + + /* + * A Boolean value to determine whether the device is a touch enabled + * device. Currently this is only supported by the Windows 7 Touch API. + * + * Platforms that do not support this metric should return + * NS_ERROR_NOT_IMPLEMENTED when queried for this metric. + */ + TouchEnabled, + + /* + * A Boolean value to determine whether the Mac graphite theme is + * being used. + * + * The value of this metric is not used on other platforms. These platforms + * should return NS_ERROR_NOT_IMPLEMENTED when queried for this metric. + */ + MacGraphiteTheme, + + /* + * A Boolean value to determine whether the macOS Big Sur-specific + * theming should be used. + * + * The value of this metric is not used on non-Mac platforms. These + * platforms should return NS_ERROR_NOT_IMPLEMENTED when queried for this + * metric. + */ + MacBigSurTheme, + + /* + * AlertNotificationOrigin indicates from which corner of the + * screen alerts slide in, and from which direction (horizontal/vertical). + * 0, the default, represents bottom right, sliding vertically. + * Use any bitwise combination of the following constants: + * NS_ALERT_HORIZONTAL (1), NS_ALERT_LEFT (2), NS_ALERT_TOP (4). + * + * 6 4 + * +-----------+ + * 7| |5 + * | | + * 3| |1 + * +-----------+ + * 2 0 + */ + AlertNotificationOrigin, + + /** + * If true, clicking on a scrollbar (not as in dragging the thumb) defaults + * to scrolling the view corresponding to the clicked point. Otherwise, we + * only do so if the scrollbar is clicked using the middle mouse button or + * if shift is pressed when the scrollbar is clicked. + */ + ScrollToClick, + + /** + * IME and spell checker underline styles, the values should be + * NS_DECORATION_LINE_STYLE_*. They are defined below. + */ + IMERawInputUnderlineStyle, + IMESelectedRawTextUnderlineStyle, + IMEConvertedTextUnderlineStyle, + IMESelectedConvertedTextUnderline, + SpellCheckerUnderlineStyle, + + /** + * If this metric != 0, support window dragging on the menubar. + */ + MenuBarDrag, + /** + * Return the appropriate WindowsThemeIdentifier for the current theme. + */ + WindowsThemeIdentifier, + /** + * Return an appropriate os version identifier. + */ + OperatingSystemVersionIdentifier, + /** + * 0: scrollbar button repeats to scroll only when cursor is on the button. + * 1: scrollbar button repeats to scroll even if cursor is outside of it. + */ + ScrollbarButtonAutoRepeatBehavior, + /** + * Delay before showing a tooltip. + */ + TooltipDelay, + /* + * A Boolean value to determine whether Mac OS X Lion style swipe animations + * should be used. + */ + SwipeAnimationEnabled, + + /* + * Controls whether overlay scrollbars display when the user moves + * the mouse in a scrollable frame. + */ + ScrollbarDisplayOnMouseMove, + + /* + * Overlay scrollbar animation constants. + */ + ScrollbarFadeBeginDelay, + ScrollbarFadeDuration, + + /** + * Distance in pixels to offset the context menu from the cursor + * on open. + */ + ContextMenuOffsetVertical, + ContextMenuOffsetHorizontal, + + /* + * A boolean value indicating whether client-side decorations are + * supported by the user's GTK version. + */ + GTKCSDAvailable, + + /* + * A boolean value indicating whether GTK+ system titlebar should be + * disabled by default. + */ + GTKCSDHideTitlebarByDefault, + + /* + * A boolean value indicating whether client-side decorations should + * have transparent background. + */ + GTKCSDTransparentBackground, + + /* + * A boolean value indicating whether client-side decorations should + * contain a minimize button. + */ + GTKCSDMinimizeButton, + + /* + * A boolean value indicating whether client-side decorations should + * contain a maximize button. + */ + GTKCSDMaximizeButton, + + /* + * A boolean value indicating whether client-side decorations should + * contain a close button. + */ + GTKCSDCloseButton, + + /* + * A boolean value indicating whether titlebar buttons are located + * in left titlebar corner. + */ + GTKCSDReversedPlacement, + + /* + * A boolean value indicating whether or not the OS is using a dark theme, + * which we may want to switch to as well if not overridden by the user. + */ + SystemUsesDarkTheme, + + /** + * Corresponding to prefers-reduced-motion. + * https://drafts.csswg.org/mediaqueries-5/#prefers-reduced-motion + * 0: no-preference + * 1: reduce + */ + + PrefersReducedMotion, + /** + * Corresponding to PointerCapabilities in ServoTypes.h + * 0: None + * 1: Coarse + * 2: Fine + * 4: Hover + */ + PrimaryPointerCapabilities, + /** + * Corresponding to union of PointerCapabilities values in ServoTypes.h + * E.g. if there is a mouse and a digitizer, the value will be + * 'Coarse | Fine | Hover'. + */ + AllPointerCapabilities, + /** + * An Integer value that will represent the position of the Close button + * in GTK Client side decoration header. Its value will be between 0 and 2 + * if it is on the left side of the tabbar, otherwise it will be between + * 3 and 5. + */ + GTKCSDCloseButtonPosition, + + /** + * An Integer value that will represent the position of the Minimize button + * in GTK Client side decoration header. Its value will be between 0 and 2 + * if it is on the left side of the tabbar, otherwise it will be between + * 3 and 5. + */ + GTKCSDMinimizeButtonPosition, + + /** + * An Integer value that will represent the position of the Maximize button + * in GTK Client side decoration header. Its value will be between 0 and 2 + * if it is on the left side of the tabbar, otherwise it will be between + * 3 and 5. + */ + GTKCSDMaximizeButtonPosition, + + /* + * Not an ID; used to define the range of valid IDs. Must be last. + */ + End, + }; + + /** + * Windows themes we currently detect. + */ + enum WindowsTheme { + eWindowsTheme_Generic = 0, // unrecognized theme + eWindowsTheme_Classic, + eWindowsTheme_Aero, + eWindowsTheme_LunaBlue, + eWindowsTheme_LunaOlive, + eWindowsTheme_LunaSilver, + eWindowsTheme_Royale, + eWindowsTheme_Zune, + eWindowsTheme_AeroLite + }; + + /** + * Operating system versions. + */ + enum class OperatingSystemVersion { + Windows7 = 2, + Windows8, + Windows10, + Unknown + }; + + enum { + eScrollArrow_None = 0, + eScrollArrow_StartBackward = 0x1000, + eScrollArrow_StartForward = 0x0100, + eScrollArrow_EndBackward = 0x0010, + eScrollArrow_EndForward = 0x0001 + }; + + enum { + // single arrow at each end + eScrollArrowStyle_Single = + eScrollArrow_StartBackward | eScrollArrow_EndForward, + // both arrows at bottom/right, none at top/left + eScrollArrowStyle_BothAtBottom = + eScrollArrow_EndBackward | eScrollArrow_EndForward, + // both arrows at both ends + eScrollArrowStyle_BothAtEachEnd = + eScrollArrow_EndBackward | eScrollArrow_EndForward | + eScrollArrow_StartBackward | eScrollArrow_StartForward, + // both arrows at top/left, none at bottom/right + eScrollArrowStyle_BothAtTop = + eScrollArrow_StartBackward | eScrollArrow_StartForward + }; + + enum { eScrollThumbStyle_Normal, eScrollThumbStyle_Proportional }; + + // When modifying this list, also modify nsXPLookAndFeel::sFloatPrefs + // in widget/nsXPLookAndFeel.cpp. + enum class FloatID { + IMEUnderlineRelativeSize, + SpellCheckerUnderlineRelativeSize, + + // The width/height ratio of the cursor. If used, the CaretWidth int metric + // should be added to the calculated caret width. + CaretAspectRatio, + + // Not an ID; used to define the range of valid IDs. Must be last. + End, + }; + + // These constants must be kept in 1:1 correspondence with the + // NS_STYLE_FONT_* system font constants. + enum class FontID { + Caption = 1, // css2 + MINIMUM = Caption, + Icon, + Menu, + MessageBox, + SmallCaption, + StatusBar, + + Window, // css3 + Document, + Workspace, + Desktop, + Info, + Dialog, + Button, + PullDownMenu, + List, + Field, + + Tooltips, // moz + Widget, + MAXIMUM = Widget, + }; + + /** + * GetColor() return a native color value (might be overwritten by prefs) for + * aID. Some platforms don't return an error even if the index doesn't + * match any system colors. And also some platforms may initialize the + * return value even when it returns an error. Therefore, if you want to + * use a color for the default value, you should use the other GetColor() + * which returns nscolor directly. + * + * NOTE: + * ColorID::TextSelectForeground might return NS_DONT_CHANGE_COLOR. + * ColorID::IME* might return NS_TRANSPARENT, NS_SAME_AS_FOREGROUND_COLOR or + * NS_40PERCENT_FOREGROUND_COLOR. + * These values have particular meaning. Then, they are not an actual + * color value. + */ + static nsresult GetColor(ColorID aID, nscolor* aResult); + + /** + * This variant of GetColor() takes an extra Boolean parameter that allows + * the caller to ask that hard-coded color values be substituted for + * native colors (used when it is desireable to hide system colors to + * avoid system fingerprinting). + */ + static nsresult GetColor(ColorID aID, bool aUseStandinsForNativeColors, + nscolor* aResult); + + /** + * GetInt() and GetFloat() return a int or float value for aID. The result + * might be distance, time, some flags or a int value which has particular + * meaning. See each document at definition of each ID for the detail. + * The result is always 0 when they return error. Therefore, if you want to + * use a value for the default value, you should use the other method which + * returns int or float directly. + */ + static nsresult GetInt(IntID aID, int32_t* aResult); + static nsresult GetFloat(FloatID aID, float* aResult); + + static nscolor GetColor(ColorID aID, nscolor aDefault = NS_RGB(0, 0, 0)) { + nscolor result = NS_RGB(0, 0, 0); + if (NS_FAILED(GetColor(aID, &result))) { + return aDefault; + } + return result; + } + + static nscolor GetColorUsingStandins(ColorID aID, + nscolor aDefault = NS_RGB(0, 0, 0)) { + nscolor result = NS_RGB(0, 0, 0); + if (NS_FAILED(GetColor(aID, + true, // aUseStandinsForNativeColors + &result))) { + return aDefault; + } + return result; + } + + static int32_t GetInt(IntID aID, int32_t aDefault = 0) { + int32_t result; + if (NS_FAILED(GetInt(aID, &result))) { + return aDefault; + } + return result; + } + + static float GetFloat(FloatID aID, float aDefault = 0.0f) { + float result; + if (NS_FAILED(GetFloat(aID, &result))) { + return aDefault; + } + return result; + } + + /** + * Retrieve the name and style of a system-theme font. Returns true + * if the system theme specifies this font, false if a default should + * be used. In the latter case neither aName nor aStyle is modified. + * + * Size of the font should be in CSS pixels, not device pixels. + * + * @param aID Which system-theme font is wanted. + * @param aName The name of the font to use. + * @param aStyle Styling to apply to the font. + */ + static bool GetFont(FontID aID, nsString& aName, gfxFontStyle& aStyle); + + /** + * GetPasswordCharacter() returns a unicode character which should be used + * for a masked character in password editor. E.g., '*'. + */ + static char16_t GetPasswordCharacter(); + + /** + * If the latest character in password field shouldn't be hidden by the + * result of GetPasswordCharacter(), GetEchoPassword() returns TRUE. + * Otherwise, FALSE. + */ + static bool GetEchoPassword(); + + /** + * The millisecond to mask password value. + * This value is only valid when GetEchoPassword() returns true. + */ + static uint32_t GetPasswordMaskDelay(); + + /** + * When system look and feel is changed, Refresh() must be called. Then, + * cached data would be released. + */ + static void Refresh(); + + /** + * GTK's initialization code can't be run off main thread, call this + * if you plan on using LookAndFeel off main thread later. + * + * This initialized state may get reset due to theme changes, so it + * must be called prior to each potential off-main-thread LookAndFeel + * call, not just once. + */ + static void NativeInit(); + + /** + * If the implementation is caching values, these accessors allow the + * cache to be exported and imported. + */ + static widget::LookAndFeelCache GetCache(); + static void SetCache(const widget::LookAndFeelCache& aCache); + static void SetData(widget::FullLookAndFeel&& aTables); + static void NotifyChangedAllWindows(widget::ThemeChangeKind); +}; + +} // namespace mozilla + +// On the Mac, GetColor(ColorID::TextSelectForeground, color) returns this +// constant to specify that the foreground color should not be changed +// (ie. a colored text keeps its colors when selected). +// Of course if other plaforms work like the Mac, they can use it too. +#define NS_DONT_CHANGE_COLOR NS_RGB(0x01, 0x01, 0x01) + +// Similar with NS_DONT_CHANGE_COLOR, except NS_DONT_CHANGE_COLOR would returns +// complementary color if fg color is same as bg color. +// NS_CHANGE_COLOR_IF_SAME_AS_BG would returns +// ColorID::TextSelectForegroundCustom if fg and bg color are the same. +#define NS_CHANGE_COLOR_IF_SAME_AS_BG NS_RGB(0x02, 0x02, 0x02) + +// --------------------------------------------------------------------- +// Special colors for ColorID::IME* and ColorID::SpellCheckerUnderline +// --------------------------------------------------------------------- + +// For background color only. +#define NS_TRANSPARENT NS_RGBA(0x01, 0x00, 0x00, 0x00) +// For foreground color only. +#define NS_SAME_AS_FOREGROUND_COLOR NS_RGBA(0x02, 0x00, 0x00, 0x00) +#define NS_40PERCENT_FOREGROUND_COLOR NS_RGBA(0x03, 0x00, 0x00, 0x00) + +#define NS_IS_SELECTION_SPECIAL_COLOR(c) \ + ((c) == NS_TRANSPARENT || (c) == NS_SAME_AS_FOREGROUND_COLOR || \ + (c) == NS_40PERCENT_FOREGROUND_COLOR) + +// ------------------------------------------ +// Bits for IntID::AlertNotificationOrigin +// ------------------------------------------ + +#define NS_ALERT_HORIZONTAL 1 +#define NS_ALERT_LEFT 2 +#define NS_ALERT_TOP 4 + +#endif /* __LookAndFeel */ |