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"
|