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
|
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -4733,16 +4733,18 @@ pref("gfx.content.always-paint", false);
#ifdef ANDROID
pref("gfx.apitrace.enabled",false);
#endif
#ifdef MOZ_X11
#ifdef MOZ_WIDGET_GTK
pref("gfx.xrender.enabled",false);
+pref("widget.chrome.allow-gtk-dark-theme", false);
+pref("widget.content.allow-gtk-dark-theme", false);
#endif
#endif
#ifdef XP_WIN
// Whether to disable the automatic detection and use of direct2d.
pref("gfx.direct2d.disabled", false);
// Whether to attempt to enable Direct2D regardless of automatic detection or
diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp
--- a/widget/gtk/nsLookAndFeel.cpp
+++ b/widget/gtk/nsLookAndFeel.cpp
@@ -1128,26 +1128,39 @@ nsLookAndFeel::Init()
GdkRGBA color;
GtkStyleContext *style;
// Gtk manages a screen's CSS in the settings object so we
// ask Gtk to create it explicitly. Otherwise we may end up
// with wrong color theme, see Bug 972382
GtkSettings *settings = gtk_settings_get_for_screen(gdk_screen_get_default());
- // Disable dark theme because it interacts poorly with widget styling in
- // web content (see bug 1216658).
+ // Dark themes interacts poorly with widget styling (see bug 1216658).
+ // We disable dark themes by default for all processes (chrome, web content)
+ // but allow user to overide it by prefs.
+ const gchar* dark_setting = "gtk-application-prefer-dark-theme";
+ gboolean darkThemeDefault;
+ g_object_get(settings, dark_setting, &darkThemeDefault, nullptr);
+
// To avoid triggering reload of theme settings unnecessarily, only set the
// setting when necessary.
- const gchar* dark_setting = "gtk-application-prefer-dark-theme";
- gboolean dark;
- g_object_get(settings, dark_setting, &dark, nullptr);
-
- if (dark && !PR_GetEnv("MOZ_ALLOW_GTK_DARK_THEME")) {
- g_object_set(settings, dark_setting, FALSE, nullptr);
+ if (darkThemeDefault) {
+ bool allowDarkTheme;
+ if (XRE_IsContentProcess()) {
+ allowDarkTheme =
+ mozilla::Preferences::GetBool("widget.content.allow-gtk-dark-theme",
+ false);
+ } else {
+ allowDarkTheme = (PR_GetEnv("MOZ_ALLOW_GTK_DARK_THEME") != nullptr) ||
+ mozilla::Preferences::GetBool("widget.chrome.allow-gtk-dark-theme",
+ false);
+ }
+ if (!allowDarkTheme) {
+ g_object_set(settings, dark_setting, FALSE, nullptr);
+ }
}
// Scrollbar colors
style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL);
gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
sMozScrollbar = GDK_RGBA_TO_NS_RGBA(color);
ReleaseStyleContext(style);
|