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.h180
1 files changed, 180 insertions, 0 deletions
diff --git a/widget/gtk/nsLookAndFeel.h b/widget/gtk/nsLookAndFeel.h
new file mode 100644
index 0000000000..b62c0bb468
--- /dev/null
+++ b/widget/gtk/nsLookAndFeel.h
@@ -0,0 +1,180 @@
+/* -*- 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;
+
+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;
+
+ void GetThemeInfo(nsACString&) override;
+
+ static const nscolor kBlack = NS_RGB(0, 0, 0);
+ static const nscolor kWhite = NS_RGB(255, 255, 255);
+ void OnColorSchemeSettingChanged();
+
+ protected:
+ static bool WidgetUsesImage(WidgetNodeType aNodeType);
+ void RecordLookAndFeelSpecificTelemetry() override;
+ static bool ShouldHonorThemeScrollbarColors();
+ mozilla::Maybe<ColorScheme> ComputeColorSchemeSetting();
+
+ // 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;
+
+ // NOTE(emilio): This is unused, but if we need to we can use it to override
+ // system colors with standins like we do for the non-native theme.
+ bool mCompatibleWithHTMLLightColors = false;
+
+ // Cached fonts
+ nsString mDefaultFontName;
+ nsString mButtonFontName;
+ nsString mFieldFontName;
+ nsString mMenuFontName;
+ gfxFontStyle mDefaultFontStyle;
+ gfxFontStyle mButtonFontStyle;
+ gfxFontStyle mFieldFontStyle;
+ gfxFontStyle mMenuFontStyle;
+
+ // Cached colors
+ nscolor mInfoBackground = kWhite;
+ nscolor mInfoText = kBlack;
+ nscolor mMenuBackground = kWhite;
+ nscolor mMenuText = kBlack;
+ nscolor mMenuTextInactive = kWhite;
+ nscolor mMenuHover = kWhite;
+ nscolor mMenuHoverText = kBlack;
+ nscolor mButtonDefault = kWhite;
+ nscolor mButtonText = kBlack;
+ nscolor mButtonHoverText = kBlack;
+ nscolor mButtonHoverFace = kWhite;
+ nscolor mButtonActiveText = kBlack;
+ nscolor mFrameOuterLightBorder = kBlack;
+ nscolor mFrameInnerDarkBorder = kBlack;
+ nscolor mOddCellBackground = kWhite;
+ nscolor mNativeHyperLinkText = kBlack;
+ nscolor mNativeVisitedHyperLinkText = kBlack;
+ nscolor mComboBoxText = kBlack;
+ nscolor mComboBoxBackground = kWhite;
+ nscolor mFieldText = kBlack;
+ nscolor mFieldBackground = kWhite;
+ nscolor mMozWindowText = kBlack;
+ nscolor mMozWindowBackground = kWhite;
+ nscolor mMozWindowActiveBorder = kBlack;
+ nscolor mMozWindowInactiveBorder = kBlack;
+ nscolor mMozCellHighlightBackground = kWhite;
+ nscolor mMozCellHighlightText = kBlack;
+ nscolor mTextSelectedText = kBlack;
+ nscolor mTextSelectedBackground = kWhite;
+ nscolor mAccentColor = kWhite;
+ nscolor mAccentColorText = kWhite;
+ nscolor mSelectedItem = kWhite;
+ nscolor mSelectedItemText = kBlack;
+ nscolor mMozColHeaderText = kBlack;
+ nscolor mMozColHeaderHoverText = kBlack;
+ nscolor mTitlebarText = kBlack;
+ nscolor mTitlebarBackground = kWhite;
+ nscolor mTitlebarInactiveText = kBlack;
+ nscolor mTitlebarInactiveBackground = kWhite;
+ 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;
+ }
+
+ RefPtr<GDBusProxy> mDBusSettingsProxy;
+ 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;
+
+ void EnsureInit() {
+ if (mInitialized) {
+ return;
+ }
+ Initialize();
+ }
+
+ void Initialize();
+
+ void RestoreSystemTheme();
+ void InitializeGlobalSettings();
+ void ConfigureAndInitializeAltTheme();
+ void ConfigureFinalEffectiveTheme();
+};
+
+#endif