Bug 1478519 - Support prefers-reduced-motion for GTK. r?karlt draft
authorHiroyuki Ikezoe <hikezoe@mozilla.com>
Fri, 27 Jul 2018 14:42:14 +0900
changeset 823382 ac8578c8716fc56ac739b92bc3f443caf991f333
parent 823380 d854fb147dfd2d43850388fee9d6152d58691b65
push id117655
push userhikezoe@mozilla.com
push dateFri, 27 Jul 2018 05:42:38 +0000
reviewerskarlt
bugs1478519
milestone63.0a1
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
widget/gtk/nsLookAndFeel.cpp
widget/gtk/nsWindow.cpp
--- 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)
 {