File: nsLookAndFeel.h

package info (click to toggle)
firefox 149.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,767,760 kB
  • sloc: cpp: 7,416,064; javascript: 6,752,859; ansic: 3,774,850; python: 1,250,473; xml: 641,578; asm: 439,191; java: 186,617; sh: 56,634; makefile: 18,856; objc: 13,092; perl: 12,763; pascal: 5,960; yacc: 4,583; cs: 3,846; lex: 1,720; ruby: 1,002; php: 436; lisp: 258; awk: 105; sql: 66; sed: 53; csh: 10; exp: 6
file content (181 lines) | stat: -rw-r--r-- 4,932 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/* -*- 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 _nsLookAndFeel
#define _nsLookAndFeel

#include <windows.h>

#include "mozilla/EnumeratedArray.h"
#include "nsXPLookAndFeel.h"
#include "gfxFont.h"

/*
 * Gesture System Metrics
 */
#ifndef SM_DIGITIZER
#  define SM_DIGITIZER 94
#  define TABLET_CONFIG_NONE 0x00000000
#  define NID_INTEGRATED_TOUCH 0x00000001
#  define NID_EXTERNAL_TOUCH 0x00000002
#  define NID_INTEGRATED_PEN 0x00000004
#  define NID_EXTERNAL_PEN 0x00000008
#  define NID_MULTI_INPUT 0x00000040
#  define NID_READY 0x00000080
#endif

/*
 * Tablet mode detection
 */
#ifndef SM_SYSTEMDOCKED
#  define SM_CONVERTIBLESLATEMODE 0x00002003
#  define SM_SYSTEMDOCKED 0x00002004
#endif

/*
 * Color constant inclusive bounds for GetSysColor
 */
#define SYS_COLOR_MIN 0
#define SYS_COLOR_MAX 30
#define SYS_COLOR_COUNT (SYS_COLOR_MAX - SYS_COLOR_MIN + 1)

// Undocumented SPI, see bug 1712669 comment 4.
#define MOZ_SPI_CURSORSIZE 0x2028
#define MOZ_SPI_SETCURSORSIZE 0x2029

namespace mozilla::widget::WinRegistry {
class KeyWatcher;
}

enum class UXThemeClass : uint8_t {
  Button = 0,
  Edit,
  Toolbar,
  Progress,
  Tab,
  Trackbar,
  Combobox,
  Listview,
  Menu,
  NumClasses
};

// This class makes sure we don't attempt to open a theme if the previous
// loading attempt has failed because OpenThemeData is a heavy task and
// it's less likely that the API returns a different result.
class UXThemeHandle final {
  mozilla::Maybe<HANDLE> mHandle;

 public:
  UXThemeHandle() = default;
  ~UXThemeHandle();

  // Disallow copy and move
  UXThemeHandle(const UXThemeHandle&) = delete;
  UXThemeHandle(UXThemeHandle&&) = delete;
  UXThemeHandle& operator=(const UXThemeHandle&) = delete;
  UXThemeHandle& operator=(UXThemeHandle&&) = delete;

  operator HANDLE();
  void OpenOnce(LPCWSTR aClassList);
  void Close();
};

class nsLookAndFeel final : public nsXPLookAndFeel {
 public:
  nsLookAndFeel();
  virtual ~nsLookAndFeel();

  static HANDLE GetTheme(UXThemeClass);

  void NativeInit() final;
  void RefreshImpl() override;
  nsresult NativeGetInt(IntID, int32_t& aResult) override;
  nsresult NativeGetFloat(FloatID, float& aResult) override;
  nsresult NativeGetColor(ColorID, ColorScheme, nscolor& aResult) override;
  bool NativeGetFont(FontID aID, nsString& aFontName,
                     gfxFontStyle& aFontStyle) override;
  char16_t GetPasswordCharacterImpl() override;

  nsresult GetKeyboardLayoutImpl(nsACString& aLayout) override;

  bool NeedsMicaWorkaround() const {
    // If there's a custom accent inactive color, and "Show accent color on
    // titlebars and window borders" is set, that causes DWM to unconditionally
    // draw a titlebar.
    // See https://aka.ms/AAv5eie and bug 1954963.
    return mTitlebarColors.mUseAccent &&
           mTitlebarColors.mAccentInactive.isSome();
  }

 private:
  struct TitlebarColors {
    // NOTE: These are the DWM accent colors, which might not match the
    // UISettings/UWP accent color in some cases, see bug 1796730.
    mozilla::Maybe<nscolor> mAccent;
    mozilla::Maybe<nscolor> mAccentText;
    mozilla::Maybe<nscolor> mAccentInactive;
    mozilla::Maybe<nscolor> mAccentInactiveText;

    bool mUseAccent = false;

    struct Set {
      nscolor mBg = 0;
      nscolor mFg = 0;
      nscolor mBorder = 0;
    };

    Set mActiveLight;
    Set mActiveDark;

    Set mInactiveLight;
    Set mInactiveDark;

    const Set& Get(mozilla::ColorScheme aScheme, bool aActive) const {
      if (aScheme == mozilla::ColorScheme::Dark) {
        return aActive ? mActiveDark : mInactiveDark;
      }
      return aActive ? mActiveLight : mInactiveLight;
    }
  };

  TitlebarColors ComputeTitlebarColors();

  nscolor GetColorForSysColorIndex(int index);

  LookAndFeelFont GetLookAndFeelFontInternal(const LOGFONTW& aLogFont,
                                             bool aUseShellDlg);

  uint32_t SystemColorFilter();

  LookAndFeelFont GetLookAndFeelFont(LookAndFeel::FontID anID);

  // Cached colors and flags indicating success in their retrieval.
  mozilla::Maybe<nscolor> mColorMenuHoverText;

  mozilla::Maybe<nscolor> mDarkHighlight;
  mozilla::Maybe<nscolor> mDarkHighlightText;

  TitlebarColors mTitlebarColors;

  nscolor mColorAccent = 0;
  nscolor mColorAccentText = 0;

  nscolor mSysColorTable[SYS_COLOR_COUNT]{0};
  bool mHighContrastOn = false;

  mozilla::EnumeratedArray<UXThemeClass, UXThemeHandle,
                           size_t(UXThemeClass::NumClasses)>
      mThemeHandles;

  mozilla::UniquePtr<mozilla::widget::WinRegistry::KeyWatcher>
      mColorFilterWatcher;
  uint32_t mCurrentColorFilter = 0;

  bool mInitialized = false;
  void EnsureInit();
};

#endif