]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkscrolledwindow.c
filechooser: Also convert get_uris() to returning native paths
[~andy/gtk] / gtk / gtkscrolledwindow.c
index a5dd811a192a2394a359700064ae1b81d4ce3693..99dab9ee94ca6e84a75914cf47d7d6e1a20eae15 100644 (file)
 #define TOUCH_BYPASS_CAPTURED_THRESHOLD 30
 
 /* Kinetic scrolling */
-#define FRAME_INTERVAL (1000 / 60)
 #define MAX_OVERSHOOT_DISTANCE 50
 #define FRICTION_DECELERATION 0.003
 #define OVERSHOOT_INVERSE_ACCELERATION 0.003
@@ -284,6 +283,8 @@ static gboolean _gtk_scrolled_window_set_adjustment_value      (GtkScrolledWindo
                                                                 gboolean           allow_overshooting,
                                                                 gboolean           snap_to_border);
 
+static void gtk_scrolled_window_cancel_deceleration (GtkScrolledWindow *scrolled_window);
+
 static guint signals[LAST_SIGNAL] = {0};
 
 G_DEFINE_TYPE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN)
@@ -2384,7 +2385,9 @@ _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindow *scrolled_window,
 }
 
 static gboolean
-scrolled_window_deceleration_cb (gpointer user_data)
+scrolled_window_deceleration_cb (GtkWidget         *widdget,
+                                 GdkFrameClock     *frame_clock,
+                                 gpointer           user_data)
 {
   KineticScrollData *data = user_data;
   GtkScrolledWindow *scrolled_window = data->scrolled_window;
@@ -2401,7 +2404,7 @@ scrolled_window_deceleration_cb (gpointer user_data)
   _gtk_scrolled_window_get_overshoot (scrolled_window,
                                       &old_overshoot_x, &old_overshoot_y);
 
-  current_time = g_get_monotonic_time ();
+  current_time = gdk_frame_clock_get_frame_time (frame_clock);
   elapsed = (current_time - data->last_deceleration_time) / 1000;
   data->last_deceleration_time = current_time;
 
@@ -2493,14 +2496,11 @@ scrolled_window_deceleration_cb (gpointer user_data)
         _gtk_scrolled_window_allocate_overshoot_window (scrolled_window);
     }
 
-  if (overshoot_x != 0 || overshoot_y != 0 ||
-      data->x_velocity != 0 || data->y_velocity != 0)
-    return TRUE;
-  else
-    {
-      priv->deceleration_id = 0;
-      return FALSE;
-    }
+  if (overshoot_x == 0 && overshoot_y == 0 &&
+      data->x_velocity == 0 && data->y_velocity == 0)
+    gtk_scrolled_window_cancel_deceleration (scrolled_window);
+
+  return G_SOURCE_CONTINUE;
 }
 
 static void
@@ -2510,7 +2510,8 @@ gtk_scrolled_window_cancel_deceleration (GtkScrolledWindow *scrolled_window)
 
   if (priv->deceleration_id)
     {
-      g_source_remove (priv->deceleration_id);
+      gtk_widget_remove_tick_callback (GTK_WIDGET (scrolled_window),
+                                       priv->deceleration_id);
       priv->deceleration_id = 0;
     }
 }
@@ -2519,12 +2520,15 @@ static void
 gtk_scrolled_window_start_deceleration (GtkScrolledWindow *scrolled_window)
 {
   GtkScrolledWindowPrivate *priv = scrolled_window->priv;
+  GdkFrameClock *frame_clock;
   KineticScrollData *data;
   gdouble angle;
 
+  frame_clock = gtk_widget_get_frame_clock (GTK_WIDGET (scrolled_window));
+
   data = g_new0 (KineticScrollData, 1);
   data->scrolled_window = scrolled_window;
-  data->last_deceleration_time = g_get_monotonic_time ();
+  data->last_deceleration_time = gdk_frame_clock_get_frame_time (frame_clock);
   data->x_velocity = priv->x_velocity;
   data->y_velocity = priv->y_velocity;
 
@@ -2536,10 +2540,10 @@ gtk_scrolled_window_start_deceleration (GtkScrolledWindow *scrolled_window)
   data->vel_sine = sin (angle);
 
   scrolled_window->priv->deceleration_id =
-    gdk_threads_add_timeout_full (G_PRIORITY_DEFAULT,
-                                  FRAME_INTERVAL,
+    gtk_widget_add_tick_callback (GTK_WIDGET (scrolled_window),
                                   scrolled_window_deceleration_cb,
-                                  data, (GDestroyNotify) g_free);
+                                  data,
+                                  (GDestroyNotify) g_free);
 }
 
 static gboolean
@@ -3392,7 +3396,7 @@ gtk_scrolled_window_realize (GtkWidget *widget)
   scrolled_window->priv->overshoot_window =
     gdk_window_new (gtk_widget_get_parent_window (widget),
                     &attributes, attributes_mask);
-  gdk_window_set_user_data (scrolled_window->priv->overshoot_window, widget);
+  gtk_widget_register_window (widget, scrolled_window->priv->overshoot_window);
 
   child_widget = gtk_bin_get_child (GTK_BIN (widget));
 
@@ -3408,7 +3412,7 @@ gtk_scrolled_window_unrealize (GtkWidget *widget)
 {
   GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
 
-  gdk_window_set_user_data (scrolled_window->priv->overshoot_window, NULL);
+  gtk_widget_unregister_window (widget, scrolled_window->priv->overshoot_window);
   gdk_window_destroy (scrolled_window->priv->overshoot_window);
   scrolled_window->priv->overshoot_window = NULL;