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);