aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-gnome/gtk+/gtk+-2.12.7/range-no-redraw.patch
blob: d577dc69c8a94c53f5a6e5c22a53bf0e503876dc (plain)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
5f084ea0849d5967a3c22821542ecaaa8accb398

Upstream-Status: Inappropriate [enable feature]

diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index bd95351..64e0e59 100644
--- gtk/gtkrange.c
+++ gtk/gtkrange.c
@@ -109,6 +109,8 @@ struct _GtkRangeLayout
   GtkSensitivityType upper_sensitivity;
 
   gdouble fill_level;
+
+  guint motion_idle_id;
 };
 
 
@@ -205,6 +207,8 @@ static gboolean      gtk_range_real_change_value        (GtkRange      *range,
 static void          gtk_range_update_value             (GtkRange      *range);
 static gboolean      gtk_range_key_press                (GtkWidget     *range,
 							 GdkEventKey   *event);
+static void          gtk_range_add_motion_idle          (GtkRange *range);
+static void          gtk_range_remove_motion_idle       (GtkRange *range);
 
 
 static guint signals[LAST_SIGNAL];
@@ -1167,6 +1171,7 @@ gtk_range_destroy (GtkObject *object)
 
   gtk_range_remove_step_timer (range);
   gtk_range_remove_update_timer (range);
+  gtk_range_remove_motion_idle (range);
   
   if (range->adjustment)
     {
@@ -1276,6 +1281,7 @@ gtk_range_unrealize (GtkWidget *widget)
 
   gtk_range_remove_step_timer (range);
   gtk_range_remove_update_timer (range);
+  gtk_range_remove_motion_idle (range);
   
   gdk_window_set_user_data (range->event_window, NULL);
   gdk_window_destroy (range->event_window);
@@ -2165,7 +2171,7 @@ gtk_range_motion_notify (GtkWidget      *widget,
     gtk_widget_queue_draw (widget);
 
   if (range->layout->grab_location == MOUSE_SLIDER)
-    update_slider_position (range, x, y);
+    gtk_range_add_motion_idle (range);
 
   /* We handled the event if the mouse was in the range_rect */
   return range->layout->mouse_location != MOUSE_OUTSIDE;
@@ -3335,9 +3341,10 @@ initial_timeout (gpointer data)
   g_object_get (settings, "gtk-timeout-repeat", &timeout, NULL);
 
   range = GTK_RANGE (data);
-  range->timer->timeout_id = gdk_threads_add_timeout (timeout * SCROLL_DELAY_FACTOR,
-                                            second_timeout,
-                                            range);
+  range->timer->timeout_id =
+    gdk_threads_add_timeout (timeout * SCROLL_DELAY_FACTOR,
+                             second_timeout,
+                             range);
   /* remove self */
   return FALSE;
 }
@@ -3357,9 +3364,8 @@ gtk_range_add_step_timer (GtkRange      *range,
 
   range->timer = g_new (GtkRangeStepTimer, 1);
 
-  range->timer->timeout_id = gdk_threads_add_timeout (timeout,
-                                            initial_timeout,
-                                            range);
+  range->timer->timeout_id =
+    gdk_threads_add_timeout (timeout, initial_timeout, range);
   range->timer->step = step;
 
   gtk_range_scroll (range, range->timer->step);
@@ -3397,9 +3403,8 @@ gtk_range_reset_update_timer (GtkRange *range)
 {
   gtk_range_remove_update_timer (range);
 
-  range->update_timeout_id = gdk_threads_add_timeout (UPDATE_DELAY,
-                                            update_timeout,
-                                            range);
+  range->update_timeout_id =
+    gdk_threads_add_timeout (UPDATE_DELAY, update_timeout, range);
 }
 
 static void
@@ -3412,5 +3417,40 @@ gtk_range_remove_update_timer (GtkRange *range)
     }
 }
 
+static gboolean
+motion_idle (gpointer data)
+{
+  GtkRange *range = data;
+  GtkRangeLayout *layout = range->layout;
+
+  update_slider_position (range, layout->mouse_x, layout->mouse_y); 
+
+  layout->motion_idle_id = 0;
+
+  return FALSE;
+}
+
+static void
+gtk_range_add_motion_idle (GtkRange *range)
+{
+  if (!range->layout->motion_idle_id)
+    {
+      range->layout->motion_idle_id =
+        gdk_threads_add_idle_full (GDK_PRIORITY_REDRAW,
+                                   motion_idle, range,
+                                   NULL);
+    }
+}
+
+static void
+gtk_range_remove_motion_idle (GtkRange *range)
+{
+  if (range->layout->motion_idle_id != 0)
+    {
+      g_source_remove (range->layout->motion_idle_id);
+      range->layout->motion_idle_id = 0;
+    }
+}
+
 #define __GTK_RANGE_C__
 #include "gtkaliasdef.c"