Bug 1478519 - Support prefers-reduced-motion for GTK. r?karlt
The corresponding setting for prefers-reduced-motion on GTK is
gtk-enable-animations I belive.
https://developer.gnome.org/gtk3/stable/GtkSettings.html#GtkSettings--gtk-enable-animations
MozReview-Commit-ID: GvfLYfntKym
--- a/widget/gtk/nsLookAndFeel.cpp
+++ b/widget/gtk/nsLookAndFeel.cpp
@@ -665,16 +665,27 @@ nsLookAndFeel::GetIntImpl(IntID aID, int
case eIntID_GTKCSDMinimizeButton:
EnsureInit();
aResult = mCSDMinimizeButton;
break;
case eIntID_GTKCSDCloseButton:
EnsureInit();
aResult = mCSDCloseButton;
break;
+ case eIntID_PrefersReducedMotion: {
+ GtkSettings *settings;
+ gboolean enableAnimations;
+
+ settings = gtk_settings_get_default();
+ g_object_get(settings,
+ "gtk-enable-animations",
+ &enableAnimations, nullptr);
+ aResult = enableAnimations ? 0 : 1;
+ break;
+ }
default:
aResult = 0;
res = NS_ERROR_FAILURE;
}
return res;
}
--- a/widget/gtk/nsWindow.cpp
+++ b/widget/gtk/nsWindow.cpp
@@ -206,17 +206,17 @@ static gboolean property_notify_event_cb
static gboolean scroll_event_cb (GtkWidget *widget,
GdkEventScroll *event);
static gboolean visibility_notify_event_cb(GtkWidget *widget,
GdkEventVisibility *event);
static void hierarchy_changed_cb (GtkWidget *widget,
GtkWidget *previous_toplevel);
static gboolean window_state_event_cb (GtkWidget *widget,
GdkEventWindowState *event);
-static void theme_changed_cb (GtkSettings *settings,
+static void settings_changed_cb (GtkSettings *settings,
GParamSpec *pspec,
nsWindow *data);
static void check_resize_cb (GtkContainer* container,
gpointer user_data);
static void screen_composited_changed_cb (GdkScreen* screen,
gpointer user_data);
static void widget_composited_changed_cb (GtkWidget* widget,
gpointer user_data);
@@ -729,17 +729,17 @@ nsWindow::Destroy()
// Ensure any resources assigned to the window get cleaned up first
// to avoid double-freeing.
mSurfaceProvider.CleanupResources();
#endif
ClearCachedResources();
g_signal_handlers_disconnect_by_func(gtk_settings_get_default(),
- FuncToGpointer(theme_changed_cb),
+ FuncToGpointer(settings_changed_cb),
this);
nsIRollupListener* rollupListener = nsBaseWidget::GetActiveRollupListener();
if (rollupListener) {
nsCOMPtr<nsIWidget> rollupWidget = rollupListener->GetRollupWidget();
if (static_cast<nsIWidget *>(this) == rollupWidget) {
rollupListener->Rollup(0, false, nullptr, nullptr);
}
@@ -4012,20 +4012,23 @@ nsWindow::Create(nsIWidget* aParent,
FuncToGpointer(screen_composited_changed_cb), 0)) {
g_signal_connect(screen, "composited-changed",
G_CALLBACK(screen_composited_changed_cb), nullptr);
}
GtkSettings* default_settings = gtk_settings_get_default();
g_signal_connect_after(default_settings,
"notify::gtk-theme-name",
- G_CALLBACK(theme_changed_cb), this);
+ G_CALLBACK(settings_changed_cb), this);
g_signal_connect_after(default_settings,
"notify::gtk-font-name",
- G_CALLBACK(theme_changed_cb), this);
+ G_CALLBACK(settings_changed_cb), this);
+ g_signal_connect_after(default_settings,
+ "notify::gtk-enable-animations",
+ G_CALLBACK(settings_changed_cb), this);
}
if (mContainer) {
// Widget signals
g_signal_connect(mContainer, "unrealize",
G_CALLBACK(container_unrealize_cb), nullptr);
g_signal_connect_after(mContainer, "size_allocate",
G_CALLBACK(size_allocate_cb), nullptr);
@@ -6044,17 +6047,17 @@ window_state_event_cb (GtkWidget *widget
return FALSE;
window->OnWindowStateEvent(widget, event);
return FALSE;
}
static void
-theme_changed_cb (GtkSettings *settings, GParamSpec *pspec, nsWindow *data)
+settings_changed_cb (GtkSettings *settings, GParamSpec *pspec, nsWindow *data)
{
RefPtr<nsWindow> window = data;
window->ThemeChanged();
}
static void
check_resize_cb (GtkContainer* container, gpointer user_data)
{