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
|
/* vim: se cin sw=2 ts=2 et : */
/* -*- 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 __UXThemeData_h__
#define __UXThemeData_h__
#include <windows.h>
#include <uxtheme.h>
#include "nscore.h"
#include "mozilla/LookAndFeel.h"
#include "mozilla/Maybe.h"
#include "WinUtils.h"
#include "nsWindowDefs.h"
enum nsUXThemeClass {
eUXButton = 0,
eUXEdit,
eUXRebar,
eUXMediaRebar,
eUXCommunicationsRebar,
eUXBrowserTabBarRebar,
eUXToolbar,
eUXMediaToolbar,
eUXCommunicationsToolbar,
eUXProgress,
eUXTab,
eUXTrackbar,
eUXSpin,
eUXStatus,
eUXCombobox,
eUXHeader,
eUXListview,
eUXMenu,
eUXWindowFrame,
eUXNumClasses
};
enum CmdButtonIdx {
CMDBUTTONIDX_MINIMIZE = 0,
CMDBUTTONIDX_RESTORE,
CMDBUTTONIDX_CLOSE,
CMDBUTTONIDX_BUTTONBOX
};
class nsUXThemeData {
// 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 ThemeHandle final {
mozilla::Maybe<HANDLE> mHandle;
public:
ThemeHandle() = default;
~ThemeHandle();
// Disallow copy and move
ThemeHandle(const ThemeHandle&) = delete;
ThemeHandle(ThemeHandle&&) = delete;
ThemeHandle& operator=(const ThemeHandle&) = delete;
ThemeHandle& operator=(ThemeHandle&&) = delete;
operator HANDLE();
void OpenOnce(HWND aWindow, LPCWSTR aClassList);
void Close();
};
static ThemeHandle sThemes[eUXNumClasses];
// We initialize sCommandButtonBoxMetrics separately as a performance
// optimization to avoid fetching dummy values for sCommandButtonMetrics
// when we don't need those.
static SIZE sCommandButtonMetrics[3];
static bool sCommandButtonMetricsInitialized;
static SIZE sCommandButtonBoxMetrics;
static bool sCommandButtonBoxMetricsInitialized;
static const wchar_t* GetClassName(nsUXThemeClass);
static void EnsureCommandButtonMetrics();
static void EnsureCommandButtonBoxMetrics();
public:
static bool sTitlebarInfoPopulatedAero;
static bool sTitlebarInfoPopulatedThemed;
static bool sIsDefaultWindowsTheme;
static bool sIsHighContrastOn;
static void Invalidate();
static HANDLE GetTheme(nsUXThemeClass cls);
static HMODULE GetThemeDLL();
// nsWindow calls this to update desktop settings info
static void UpdateTitlebarInfo(HWND aWnd);
static SIZE GetCommandButtonMetrics(CmdButtonIdx aMetric) {
EnsureCommandButtonMetrics();
return sCommandButtonMetrics[aMetric];
}
static SIZE GetCommandButtonBoxMetrics() {
EnsureCommandButtonBoxMetrics();
return sCommandButtonBoxMetrics;
}
static void UpdateNativeThemeInfo();
static bool IsDefaultWindowTheme();
static bool IsHighContrastOn();
static bool AreFlatMenusEnabled();
static bool IsAppThemed();
};
#endif // __UXThemeData_h__
|