In order to do it, expose the button padding to CSS via env(), and make the buttons just use the regular drawing. This slightly changes the padding to the end of the titlebar to match one half of the inter-button spacing, rather that however much padding the headerbar has. We could improve on this slightly by also exposing the headerbar padding and applying that to the last button, but that's not terribly easy to do due to us supporting re-ordering of the titlebar buttons, and reversing their placement, so it'd involve some rather hacky CSS. Not impossible, but not trivial, and this looks good enough IMO. Differential Revision: https://phabricator.services.mozilla.com/D202616
213 lines
6.2 KiB
C++
213 lines
6.2 KiB
C++
/* -*- 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;
|
|
int32_t mTitlebarButtonSpacing = 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
|