summaryrefslogtreecommitdiffstats
path: root/widget/gtk/nsLookAndFeel.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/gtk/nsLookAndFeel.h')
-rw-r--r--widget/gtk/nsLookAndFeel.h211
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