diff options
Diffstat (limited to 'widget/gtk/nsLookAndFeel.h')
-rw-r--r-- | widget/gtk/nsLookAndFeel.h | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/widget/gtk/nsLookAndFeel.h b/widget/gtk/nsLookAndFeel.h new file mode 100644 index 0000000000..56608d331f --- /dev/null +++ b/widget/gtk/nsLookAndFeel.h @@ -0,0 +1,211 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:expandtab:shiftwidth=2:tabstop=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 __nsLookAndFeel +#define __nsLookAndFeel + +#include "X11UndefineNone.h" +#include "nsXPLookAndFeel.h" +#include "nsCOMPtr.h" +#include "gfxFont.h" + +enum WidgetNodeType : int; +struct _GtkStyle; +typedef struct _GDBusProxy GDBusProxy; +typedef struct _GtkCssProvider GtkCssProvider; +typedef struct _GFile GFile; +typedef struct _GFileMonitor GFileMonitor; + +namespace mozilla { +enum class StyleGtkThemeFamily : uint8_t; +} + +class nsLookAndFeel final : public nsXPLookAndFeel { + public: + nsLookAndFeel(); + virtual ~nsLookAndFeel(); + + void NativeInit() final; + void RefreshImpl() override; + nsresult NativeGetInt(IntID aID, int32_t& aResult) override; + nsresult NativeGetFloat(FloatID aID, float& aResult) override; + nsresult NativeGetColor(ColorID, ColorScheme, nscolor& aResult) override; + bool NativeGetFont(FontID aID, nsString& aFontName, + gfxFontStyle& aFontStyle) override; + + char16_t GetPasswordCharacterImpl() override; + bool GetEchoPasswordImpl() override; + + bool GetDefaultDrawInTitlebar() override; + + nsXPLookAndFeel::TitlebarAction GetTitlebarAction( + TitlebarEvent aEvent) override; + + void GetThemeInfo(nsACString&) override; + + static const nscolor kBlack = NS_RGB(0, 0, 0); + static const nscolor kWhite = NS_RGB(255, 255, 255); + void OnColorSchemeSettingChanged(); + + struct ColorPair { + nscolor mBg = kWhite; + nscolor mFg = kBlack; + }; + + using ThemeFamily = mozilla::StyleGtkThemeFamily; + + protected: + static bool WidgetUsesImage(WidgetNodeType aNodeType); + void RecordLookAndFeelSpecificTelemetry() override; + static bool ShouldHonorThemeScrollbarColors(); + mozilla::Maybe<ColorScheme> ComputeColorSchemeSetting(); + + void WatchDBus(); + void UnwatchDBus(); + + // We use up to two themes (one light, one dark), which might have different + // sets of fonts and colors. + struct PerThemeData { + nsCString mName; + bool mIsDark = false; + bool mHighContrast = false; + bool mPreferDarkTheme = false; + + ThemeFamily mFamily{0}; + + // Cached fonts + nsString mDefaultFontName; + nsString mButtonFontName; + nsString mFieldFontName; + nsString mMenuFontName; + gfxFontStyle mDefaultFontStyle; + gfxFontStyle mButtonFontStyle; + gfxFontStyle mFieldFontStyle; + gfxFontStyle mMenuFontStyle; + + // Cached colors + nscolor mGrayText = kBlack; + ColorPair mInfo; + ColorPair mMenu; + ColorPair mMenuHover; + ColorPair mHeaderBar; + ColorPair mHeaderBarInactive; + ColorPair mButton; + ColorPair mButtonHover; + ColorPair mButtonActive; + nscolor mButtonBorder = kBlack; + nscolor mThreeDHighlight = kBlack; + nscolor mThreeDShadow = kBlack; + nscolor mOddCellBackground = kWhite; + nscolor mNativeHyperLinkText = kBlack; + nscolor mNativeVisitedHyperLinkText = kBlack; + // FIXME: This doesn't seem like it'd be sound since we use Window for + // -moz-Combobox... But I guess we rely on chrome code not setting + // appearance: none on selects or overriding the color if they do. + nscolor mComboBoxText = kBlack; + ColorPair mField; + ColorPair mWindow; + ColorPair mDialog; + ColorPair mSidebar; + nscolor mSidebarBorder = kBlack; + + nscolor mMozWindowActiveBorder = kBlack; + nscolor mMozWindowInactiveBorder = kBlack; + + ColorPair mCellHighlight; + ColorPair mSelectedText; + ColorPair mAccent; + ColorPair mSelectedItem; + + ColorPair mMozColHeader; + ColorPair mMozColHeaderHover; + ColorPair mMozColHeaderActive; + + ColorPair mTitlebar; + ColorPair mTitlebarInactive; + + nscolor mThemedScrollbar = kWhite; + nscolor mThemedScrollbarInactive = kWhite; + nscolor mThemedScrollbarThumb = kBlack; + nscolor mThemedScrollbarThumbHover = kBlack; + nscolor mThemedScrollbarThumbActive = kBlack; + nscolor mThemedScrollbarThumbInactive = kBlack; + + float mCaretRatio = 0.0f; + int32_t mTitlebarRadius = 0; + char16_t mInvisibleCharacter = 0; + bool mMenuSupportsDrag = false; + + void Init(); + nsresult GetColor(ColorID, nscolor&) const; + bool GetFont(FontID, nsString& aFontName, gfxFontStyle&) const; + void InitCellHighlightColors(); + }; + + PerThemeData mSystemTheme; + + // If the system theme is light, a dark theme. Otherwise, a light theme. The + // alternative theme to the current one is preferred, but otherwise we fall + // back to Adwaita / Adwaita Dark, respectively. + PerThemeData mAltTheme; + + const PerThemeData& LightTheme() const { + return mSystemTheme.mIsDark ? mAltTheme : mSystemTheme; + } + + const PerThemeData& DarkTheme() const { + return mSystemTheme.mIsDark ? mSystemTheme : mAltTheme; + } + + const PerThemeData& EffectiveTheme() const { + return mSystemThemeOverridden ? mAltTheme : mSystemTheme; + } + + uint32_t mDBusID = 0; + RefPtr<GDBusProxy> mDBusSettingsProxy; + RefPtr<GFile> mKdeColors; + RefPtr<GFileMonitor> mKdeColorsMonitor; + mozilla::Maybe<ColorScheme> mColorSchemePreference; + int32_t mCaretBlinkTime = 0; + int32_t mCaretBlinkCount = -1; + bool mCSDMaximizeButton = false; + bool mCSDMinimizeButton = false; + bool mCSDCloseButton = false; + bool mCSDReversedPlacement = false; + bool mPrefersReducedMotion = false; + bool mInitialized = false; + bool mSystemThemeOverridden = false; + int32_t mCSDMaximizeButtonPosition = 0; + int32_t mCSDMinimizeButtonPosition = 0; + int32_t mCSDCloseButtonPosition = 0; + TitlebarAction mDoubleClickAction = TitlebarAction::None; + TitlebarAction mMiddleClickAction = TitlebarAction::None; + + RefPtr<GtkCssProvider> mRoundedCornerProvider; + void UpdateRoundedBottomCornerStyles(); + + void ClearRoundedCornerProvider(); + + void EnsureInit() { + if (mInitialized) { + return; + } + Initialize(); + } + + void Initialize(); + + void RestoreSystemTheme(); + void InitializeGlobalSettings(); + // Returns whether we found an alternative theme. + bool ConfigureAltTheme(); + void ConfigureAndInitializeAltTheme(); + void ConfigureFinalEffectiveTheme(); + void MaybeApplyAdwaitaOverrides(); +}; + +#endif |