Merge lp:~cimi/overlay-scrollbar/new-scrolling-modes into lp:overlay-scrollbar
- new-scrolling-modes
- Merge into trunk
Proposed by
Andrea Cimitan
Status: | Merged |
---|---|
Approved by: | Ted Gould |
Approved revision: | 319 |
Merged at revision: | 319 |
Proposed branch: | lp:~cimi/overlay-scrollbar/new-scrolling-modes |
Merge into: | lp:overlay-scrollbar |
Diff against target: |
516 lines (+228/-67) 1 file modified
os/os-scrollbar.c (+228/-67) |
To merge this branch: | bzr merge lp:~cimi/overlay-scrollbar/new-scrolling-modes |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ted Gould (community) | Approve | ||
Review via email: mp+84294@code.launchpad.net |
Commit message
Description of the change
Use modifier keys (right now, control), to allow new scrolling modes.
To post a comment you must log in.
Revision history for this message
Ted Gould (ted) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'os/os-scrollbar.c' | |||
2 | --- os/os-scrollbar.c 2011-11-30 21:15:01 +0000 | |||
3 | +++ os/os-scrollbar.c 2011-12-02 17:10:28 +0000 | |||
4 | @@ -46,6 +46,9 @@ | |||
5 | 46 | /* Min duration of the scrolling. */ | 46 | /* Min duration of the scrolling. */ |
6 | 47 | #define MIN_DURATION_SCROLLING 250 | 47 | #define MIN_DURATION_SCROLLING 250 |
7 | 48 | 48 | ||
8 | 49 | /* Modifier key used to slow down actions. */ | ||
9 | 50 | #define MODIFIER_KEY GDK_CONTROL_MASK | ||
10 | 51 | |||
11 | 49 | /* Timeout assumed for PropertyNotify _NET_ACTIVE_WINDOW event. */ | 52 | /* Timeout assumed for PropertyNotify _NET_ACTIVE_WINDOW event. */ |
12 | 50 | #define TIMEOUT_PRESENT_WINDOW 400 | 53 | #define TIMEOUT_PRESENT_WINDOW 400 |
13 | 51 | 54 | ||
14 | @@ -61,6 +64,11 @@ | |||
15 | 61 | /* Timeout before hiding in ms, after leaving the toplevel. */ | 64 | /* Timeout before hiding in ms, after leaving the toplevel. */ |
16 | 62 | #define TIMEOUT_TOPLEVEL_HIDE 200 | 65 | #define TIMEOUT_TOPLEVEL_HIDE 200 |
17 | 63 | 66 | ||
18 | 67 | typedef enum { | ||
19 | 68 | OS_SCROLL_PAGE, | ||
20 | 69 | OS_SCROLL_STEP | ||
21 | 70 | } OsScrollType; | ||
22 | 71 | |||
23 | 64 | typedef enum | 72 | typedef enum |
24 | 65 | { | 73 | { |
25 | 66 | OS_SIDE_TOP, | 74 | OS_SIDE_TOP, |
26 | @@ -74,10 +82,11 @@ | |||
27 | 74 | OS_STATE_NONE = 0, | 82 | OS_STATE_NONE = 0, |
28 | 75 | OS_STATE_CONNECTED = 1, | 83 | OS_STATE_CONNECTED = 1, |
29 | 76 | OS_STATE_DETACHED = 2, | 84 | OS_STATE_DETACHED = 2, |
34 | 77 | OS_STATE_FULLSIZE = 4, | 85 | OS_STATE_FINE_SCROLL = 4, |
35 | 78 | OS_STATE_INTERNAL = 8, | 86 | OS_STATE_FULLSIZE = 8, |
36 | 79 | OS_STATE_LOCKED = 16, | 87 | OS_STATE_INTERNAL = 16, |
37 | 80 | OS_STATE_RECONNECTING = 32 | 88 | OS_STATE_LOCKED = 32, |
38 | 89 | OS_STATE_RECONNECTING = 64 | ||
39 | 81 | } OsStateFlags; | 90 | } OsStateFlags; |
40 | 82 | 91 | ||
41 | 83 | typedef enum | 92 | typedef enum |
42 | @@ -119,8 +128,9 @@ | |||
43 | 119 | gboolean hidable_thumb; | 128 | gboolean hidable_thumb; |
44 | 120 | gboolean window_button_press; /* FIXME(Cimi) to replace with X11 input events. */ | 129 | gboolean window_button_press; /* FIXME(Cimi) to replace with X11 input events. */ |
45 | 121 | gdouble value; | 130 | gdouble value; |
48 | 122 | gint slide_initial_slider_position; | 131 | gfloat fine_scroll_multiplier; |
49 | 123 | gint slide_initial_coordinate; | 132 | gfloat slide_initial_slider_position; |
50 | 133 | gfloat slide_initial_coordinate; | ||
51 | 124 | gint64 present_time; | 134 | gint64 present_time; |
52 | 125 | guint32 source_deactivate_bar_id; | 135 | guint32 source_deactivate_bar_id; |
53 | 126 | guint32 source_hide_thumb_id; | 136 | guint32 source_hide_thumb_id; |
54 | @@ -171,6 +181,97 @@ | |||
55 | 171 | static void os_scrollbar_dispose (GObject *object); | 181 | static void os_scrollbar_dispose (GObject *object); |
56 | 172 | static void os_scrollbar_finalize (GObject *object); | 182 | static void os_scrollbar_finalize (GObject *object); |
57 | 173 | 183 | ||
58 | 184 | /* Calculate slide_initial_slider_position with more precision. */ | ||
59 | 185 | static void | ||
60 | 186 | calc_precise_slide_values (OsScrollbar *scrollbar, | ||
61 | 187 | gfloat x_coordinate, | ||
62 | 188 | gfloat y_coordinate) | ||
63 | 189 | { | ||
64 | 190 | OsScrollbarPrivate *priv; | ||
65 | 191 | gdouble adjustment_value; | ||
66 | 192 | |||
67 | 193 | priv = scrollbar->priv; | ||
68 | 194 | |||
69 | 195 | adjustment_value = gtk_adjustment_get_value (priv->adjustment); | ||
70 | 196 | |||
71 | 197 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) | ||
72 | 198 | { | ||
73 | 199 | gdouble y1, y2, trough_length, height; | ||
74 | 200 | |||
75 | 201 | y1 = 0; | ||
76 | 202 | trough_length = priv->trough.height; | ||
77 | 203 | |||
78 | 204 | if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) != 0) | ||
79 | 205 | height = (trough_length * (gtk_adjustment_get_page_size (priv->adjustment) / | ||
80 | 206 | (gtk_adjustment_get_upper (priv->adjustment) - | ||
81 | 207 | gtk_adjustment_get_lower (priv->adjustment)))); | ||
82 | 208 | else | ||
83 | 209 | height = gtk_range_get_min_slider_size (GTK_RANGE (scrollbar)); | ||
84 | 210 | |||
85 | 211 | height = MAX (height, gtk_range_get_min_slider_size (GTK_RANGE (scrollbar))); | ||
86 | 212 | |||
87 | 213 | if (gtk_adjustment_get_upper (priv->adjustment) - | ||
88 | 214 | gtk_adjustment_get_lower (priv->adjustment) - | ||
89 | 215 | gtk_adjustment_get_page_size (priv->adjustment) != 0) | ||
90 | 216 | y1 = (trough_length - height) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) / | ||
91 | 217 | (gtk_adjustment_get_upper (priv->adjustment) - | ||
92 | 218 | gtk_adjustment_get_lower (priv->adjustment) - | ||
93 | 219 | gtk_adjustment_get_page_size (priv->adjustment))); | ||
94 | 220 | |||
95 | 221 | y2 = 0; | ||
96 | 222 | height = priv->slider.height; | ||
97 | 223 | |||
98 | 224 | if (gtk_adjustment_get_upper (priv->adjustment) - | ||
99 | 225 | gtk_adjustment_get_lower (priv->adjustment) - | ||
100 | 226 | gtk_adjustment_get_page_size (priv->adjustment) != 0) | ||
101 | 227 | y2 = (trough_length - height) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) / | ||
102 | 228 | (gtk_adjustment_get_upper (priv->adjustment) - | ||
103 | 229 | gtk_adjustment_get_lower (priv->adjustment) - | ||
104 | 230 | gtk_adjustment_get_page_size (priv->adjustment))); | ||
105 | 231 | |||
106 | 232 | priv->slide_initial_slider_position = CLAMP (MIN (y1, y2), 0, trough_length); | ||
107 | 233 | priv->slide_initial_coordinate = y_coordinate; | ||
108 | 234 | } | ||
109 | 235 | else | ||
110 | 236 | { | ||
111 | 237 | gdouble x1, x2, trough_length, width; | ||
112 | 238 | |||
113 | 239 | x1 = 0; | ||
114 | 240 | trough_length = priv->trough.width; | ||
115 | 241 | |||
116 | 242 | if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) != 0) | ||
117 | 243 | width = (trough_length * (gtk_adjustment_get_page_size (priv->adjustment) / | ||
118 | 244 | (gtk_adjustment_get_upper (priv->adjustment) - | ||
119 | 245 | gtk_adjustment_get_lower (priv->adjustment)))); | ||
120 | 246 | else | ||
121 | 247 | width = gtk_range_get_min_slider_size (GTK_RANGE (scrollbar)); | ||
122 | 248 | |||
123 | 249 | width = MAX (width, gtk_range_get_min_slider_size (GTK_RANGE (scrollbar))); | ||
124 | 250 | |||
125 | 251 | if (gtk_adjustment_get_upper (priv->adjustment) - | ||
126 | 252 | gtk_adjustment_get_lower (priv->adjustment) - | ||
127 | 253 | gtk_adjustment_get_page_size (priv->adjustment) != 0) | ||
128 | 254 | x1 = (trough_length - width) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) / | ||
129 | 255 | (gtk_adjustment_get_upper (priv->adjustment) - | ||
130 | 256 | gtk_adjustment_get_lower (priv->adjustment) - | ||
131 | 257 | gtk_adjustment_get_page_size (priv->adjustment))); | ||
132 | 258 | |||
133 | 259 | x2 = 0; | ||
134 | 260 | width = priv->slider.width; | ||
135 | 261 | |||
136 | 262 | if (gtk_adjustment_get_upper (priv->adjustment) - | ||
137 | 263 | gtk_adjustment_get_lower (priv->adjustment) - | ||
138 | 264 | gtk_adjustment_get_page_size (priv->adjustment) != 0) | ||
139 | 265 | x2 = (trough_length - width) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) / | ||
140 | 266 | (gtk_adjustment_get_upper (priv->adjustment) - | ||
141 | 267 | gtk_adjustment_get_lower (priv->adjustment) - | ||
142 | 268 | gtk_adjustment_get_page_size (priv->adjustment))); | ||
143 | 269 | |||
144 | 270 | priv->slide_initial_slider_position = CLAMP (MIN (x1, x2), 0, trough_length); | ||
145 | 271 | priv->slide_initial_coordinate = x_coordinate; | ||
146 | 272 | } | ||
147 | 273 | } | ||
148 | 274 | |||
149 | 174 | /* Calculate bar layout info. */ | 275 | /* Calculate bar layout info. */ |
150 | 175 | static void | 276 | static void |
151 | 176 | calc_layout_bar (OsScrollbar *scrollbar, | 277 | calc_layout_bar (OsScrollbar *scrollbar, |
152 | @@ -393,9 +494,9 @@ | |||
153 | 393 | } | 494 | } |
154 | 394 | 495 | ||
155 | 395 | /* Traduce coordinates into GtkRange values. */ | 496 | /* Traduce coordinates into GtkRange values. */ |
157 | 396 | static gdouble | 497 | static inline gdouble |
158 | 397 | coord_to_value (OsScrollbar *scrollbar, | 498 | coord_to_value (OsScrollbar *scrollbar, |
160 | 398 | gint coord) | 499 | gfloat coord) |
161 | 399 | { | 500 | { |
162 | 400 | OsScrollbarPrivate *priv; | 501 | OsScrollbarPrivate *priv; |
163 | 401 | gdouble frac; | 502 | gdouble frac; |
164 | @@ -1010,6 +1111,24 @@ | |||
165 | 1010 | 1111 | ||
166 | 1011 | /* Adjustment functions. */ | 1112 | /* Adjustment functions. */ |
167 | 1012 | 1113 | ||
168 | 1114 | /* Calculate fine_scroll_multiplier. */ | ||
169 | 1115 | static void | ||
170 | 1116 | calc_fine_scroll_multiplier (OsScrollbar *scrollbar) | ||
171 | 1117 | { | ||
172 | 1118 | OsScrollbarPrivate *priv; | ||
173 | 1119 | |||
174 | 1120 | priv = scrollbar->priv; | ||
175 | 1121 | |||
176 | 1122 | /* FIXME(Cimi) Not sure about this calculation... | ||
177 | 1123 | * However seems to work "enough" well. */ | ||
178 | 1124 | priv->fine_scroll_multiplier = MIN ((priv->orientation == GTK_ORIENTATION_VERTICAL ? | ||
179 | 1125 | priv->trough.height : priv->trough.width) / | ||
180 | 1126 | (gtk_adjustment_get_upper (priv->adjustment) - | ||
181 | 1127 | gtk_adjustment_get_lower (priv->adjustment) - | ||
182 | 1128 | gtk_adjustment_get_page_size (priv->adjustment)), | ||
183 | 1129 | 1); | ||
184 | 1130 | } | ||
185 | 1131 | |||
186 | 1013 | static void | 1132 | static void |
187 | 1014 | adjustment_changed_cb (GtkAdjustment *adjustment, | 1133 | adjustment_changed_cb (GtkAdjustment *adjustment, |
188 | 1015 | gpointer user_data) | 1134 | gpointer user_data) |
189 | @@ -1046,6 +1165,7 @@ | |||
190 | 1046 | 1165 | ||
191 | 1047 | calc_layout_bar (scrollbar, gtk_adjustment_get_value (adjustment)); | 1166 | calc_layout_bar (scrollbar, gtk_adjustment_get_value (adjustment)); |
192 | 1048 | calc_layout_slider (scrollbar, gtk_adjustment_get_value (adjustment)); | 1167 | calc_layout_slider (scrollbar, gtk_adjustment_get_value (adjustment)); |
193 | 1168 | calc_fine_scroll_multiplier (scrollbar); | ||
194 | 1049 | 1169 | ||
195 | 1050 | if (!(priv->event & OS_EVENT_ENTER_NOTIFY) && | 1170 | if (!(priv->event & OS_EVENT_ENTER_NOTIFY) && |
196 | 1051 | !(priv->event & OS_EVENT_MOTION_NOTIFY)) | 1171 | !(priv->event & OS_EVENT_MOTION_NOTIFY)) |
197 | @@ -1395,7 +1515,9 @@ | |||
198 | 1395 | priv->event |= OS_EVENT_BUTTON_PRESS; | 1515 | priv->event |= OS_EVENT_BUTTON_PRESS; |
199 | 1396 | priv->event &= ~(OS_EVENT_MOTION_NOTIFY); | 1516 | priv->event &= ~(OS_EVENT_MOTION_NOTIFY); |
200 | 1397 | 1517 | ||
202 | 1398 | if (event->button == 2) | 1518 | /* Middle-click or shift+left-click for "jump to" action. */ |
203 | 1519 | if (event->button == 2 || | ||
204 | 1520 | (event->button == 1 && (event->state & GDK_SHIFT_MASK))) | ||
205 | 1399 | { | 1521 | { |
206 | 1400 | /* Reconnect the thumb with the bar. */ | 1522 | /* Reconnect the thumb with the bar. */ |
207 | 1401 | gdouble new_value; | 1523 | gdouble new_value; |
208 | @@ -1450,16 +1572,7 @@ | |||
209 | 1450 | } | 1572 | } |
210 | 1451 | } | 1573 | } |
211 | 1452 | 1574 | ||
222 | 1453 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) | 1575 | calc_precise_slide_values (scrollbar, event->x_root, event->y_root); |
213 | 1454 | { | ||
214 | 1455 | priv->slide_initial_slider_position = MIN (priv->slider.y, priv->overlay.y); | ||
215 | 1456 | priv->slide_initial_coordinate = event->y_root; | ||
216 | 1457 | } | ||
217 | 1458 | else | ||
218 | 1459 | { | ||
219 | 1460 | priv->slide_initial_slider_position = MIN (priv->slider.x, priv->overlay.x); | ||
220 | 1461 | priv->slide_initial_coordinate = event->x_root; | ||
221 | 1462 | } | ||
223 | 1463 | 1576 | ||
224 | 1464 | priv->pointer.x = event->x; | 1577 | priv->pointer.x = event->x; |
225 | 1465 | priv->pointer.y = event->y; | 1578 | priv->pointer.y = event->y; |
226 | @@ -1469,26 +1582,32 @@ | |||
227 | 1469 | return FALSE; | 1582 | return FALSE; |
228 | 1470 | } | 1583 | } |
229 | 1471 | 1584 | ||
231 | 1472 | /* Page down, with animation. */ | 1585 | /* Scroll down, with animation. */ |
232 | 1473 | static void | 1586 | static void |
234 | 1474 | page_down (OsScrollbar *scrollbar) | 1587 | scroll_down (OsScrollbar *scrollbar, |
235 | 1588 | OsScrollType scroll_type) | ||
236 | 1475 | { | 1589 | { |
237 | 1476 | OsScrollbarPrivate *priv; | 1590 | OsScrollbarPrivate *priv; |
239 | 1477 | gdouble new_value; | 1591 | gdouble new_value, increment; |
240 | 1478 | gint32 duration; | 1592 | gint32 duration; |
241 | 1479 | 1593 | ||
242 | 1480 | priv = scrollbar->priv; | 1594 | priv = scrollbar->priv; |
243 | 1481 | 1595 | ||
244 | 1596 | /* Either step down or page down. */ | ||
245 | 1597 | if (scroll_type == OS_SCROLL_STEP) | ||
246 | 1598 | increment = gtk_adjustment_get_step_increment (priv->adjustment); | ||
247 | 1599 | else | ||
248 | 1600 | increment = gtk_adjustment_get_page_increment (priv->adjustment); | ||
249 | 1601 | |||
250 | 1482 | /* If a scrolling animation is running, | 1602 | /* If a scrolling animation is running, |
251 | 1483 | * stop it and add the new value. */ | 1603 | * stop it and add the new value. */ |
252 | 1484 | if (os_animation_is_running (priv->animation)) | 1604 | if (os_animation_is_running (priv->animation)) |
253 | 1485 | { | 1605 | { |
254 | 1486 | os_animation_stop (priv->animation, NULL); | 1606 | os_animation_stop (priv->animation, NULL); |
256 | 1487 | new_value = priv->value + gtk_adjustment_get_page_increment (priv->adjustment); | 1607 | new_value = priv->value + increment; |
257 | 1488 | } | 1608 | } |
258 | 1489 | else | 1609 | else |
261 | 1490 | new_value = gtk_adjustment_get_value (priv->adjustment) + | 1610 | new_value = gtk_adjustment_get_value (priv->adjustment) + increment; |
260 | 1491 | gtk_adjustment_get_page_increment (priv->adjustment); | ||
262 | 1492 | 1611 | ||
263 | 1493 | priv->value = CLAMP (new_value, | 1612 | priv->value = CLAMP (new_value, |
264 | 1494 | gtk_adjustment_get_lower (priv->adjustment), | 1613 | gtk_adjustment_get_lower (priv->adjustment), |
265 | @@ -1499,8 +1618,10 @@ | |||
266 | 1499 | return; | 1618 | return; |
267 | 1500 | 1619 | ||
268 | 1501 | /* Calculate and set the duration. */ | 1620 | /* Calculate and set the duration. */ |
271 | 1502 | duration = MIN_DURATION_SCROLLING + ((priv->value - gtk_adjustment_get_value (priv->adjustment)) / | 1621 | if (scroll_type == OS_SCROLL_STEP) |
272 | 1503 | gtk_adjustment_get_page_increment (priv->adjustment)) * | 1622 | duration = MIN_DURATION_SCROLLING; |
273 | 1623 | else | ||
274 | 1624 | duration = MIN_DURATION_SCROLLING + ((priv->value - gtk_adjustment_get_value (priv->adjustment)) / increment) * | ||
275 | 1504 | (MAX_DURATION_SCROLLING - MIN_DURATION_SCROLLING); | 1625 | (MAX_DURATION_SCROLLING - MIN_DURATION_SCROLLING); |
276 | 1505 | os_animation_set_duration (priv->animation, duration); | 1626 | os_animation_set_duration (priv->animation, duration); |
277 | 1506 | 1627 | ||
278 | @@ -1508,26 +1629,32 @@ | |||
279 | 1508 | os_animation_start (priv->animation); | 1629 | os_animation_start (priv->animation); |
280 | 1509 | } | 1630 | } |
281 | 1510 | 1631 | ||
283 | 1511 | /* Page up, with animation. */ | 1632 | /* Scroll up, with animation. */ |
284 | 1512 | static void | 1633 | static void |
286 | 1513 | page_up (OsScrollbar *scrollbar) | 1634 | scroll_up (OsScrollbar *scrollbar, |
287 | 1635 | OsScrollType scroll_type) | ||
288 | 1514 | { | 1636 | { |
289 | 1515 | OsScrollbarPrivate *priv; | 1637 | OsScrollbarPrivate *priv; |
291 | 1516 | gdouble new_value; | 1638 | gdouble new_value, increment; |
292 | 1517 | gint32 duration; | 1639 | gint32 duration; |
293 | 1518 | 1640 | ||
294 | 1519 | priv = scrollbar->priv; | 1641 | priv = scrollbar->priv; |
295 | 1520 | 1642 | ||
296 | 1643 | /* Either step up or page up. */ | ||
297 | 1644 | if (scroll_type == OS_SCROLL_STEP) | ||
298 | 1645 | increment = gtk_adjustment_get_step_increment (priv->adjustment); | ||
299 | 1646 | else | ||
300 | 1647 | increment = gtk_adjustment_get_page_increment (priv->adjustment); | ||
301 | 1648 | |||
302 | 1521 | /* If a scrolling animation is running, | 1649 | /* If a scrolling animation is running, |
303 | 1522 | * stop it and subtract the new value. */ | 1650 | * stop it and subtract the new value. */ |
304 | 1523 | if (os_animation_is_running (priv->animation)) | 1651 | if (os_animation_is_running (priv->animation)) |
305 | 1524 | { | 1652 | { |
306 | 1525 | os_animation_stop (priv->animation, NULL); | 1653 | os_animation_stop (priv->animation, NULL); |
308 | 1526 | new_value = priv->value - gtk_adjustment_get_page_increment (priv->adjustment); | 1654 | new_value = priv->value - increment; |
309 | 1527 | } | 1655 | } |
310 | 1528 | else | 1656 | else |
313 | 1529 | new_value = gtk_adjustment_get_value (priv->adjustment) - | 1657 | new_value = gtk_adjustment_get_value (priv->adjustment) - increment; |
312 | 1530 | gtk_adjustment_get_page_increment (priv->adjustment); | ||
314 | 1531 | 1658 | ||
315 | 1532 | priv->value = CLAMP (new_value, | 1659 | priv->value = CLAMP (new_value, |
316 | 1533 | gtk_adjustment_get_lower (priv->adjustment), | 1660 | gtk_adjustment_get_lower (priv->adjustment), |
317 | @@ -1538,9 +1665,11 @@ | |||
318 | 1538 | return; | 1665 | return; |
319 | 1539 | 1666 | ||
320 | 1540 | /* Calculate and set the duration. */ | 1667 | /* Calculate and set the duration. */ |
324 | 1541 | duration = MIN_DURATION_SCROLLING + ((gtk_adjustment_get_value (priv->adjustment) - priv->value) / | 1668 | if (scroll_type == OS_SCROLL_STEP) |
325 | 1542 | gtk_adjustment_get_page_increment (priv->adjustment)) * | 1669 | duration = MIN_DURATION_SCROLLING; |
326 | 1543 | (MAX_DURATION_SCROLLING - MIN_DURATION_SCROLLING); | 1670 | else |
327 | 1671 | duration = MIN_DURATION_SCROLLING + ((gtk_adjustment_get_value (priv->adjustment) - priv->value) / increment) * | ||
328 | 1672 | (MAX_DURATION_SCROLLING - MIN_DURATION_SCROLLING); | ||
329 | 1544 | os_animation_set_duration (priv->animation, duration); | 1673 | os_animation_set_duration (priv->animation, duration); |
330 | 1545 | 1674 | ||
331 | 1546 | /* Start the scrolling animation. */ | 1675 | /* Start the scrolling animation. */ |
332 | @@ -1565,22 +1694,32 @@ | |||
333 | 1565 | 1694 | ||
334 | 1566 | gtk_window_set_transient_for (GTK_WINDOW (widget), NULL); | 1695 | gtk_window_set_transient_for (GTK_WINDOW (widget), NULL); |
335 | 1567 | 1696 | ||
336 | 1697 | /* Don't trigger actions on thumb dragging or jump-to scrolling. */ | ||
337 | 1568 | if (event->button == 1 && | 1698 | if (event->button == 1 && |
338 | 1699 | !(event->state & GDK_SHIFT_MASK) && | ||
339 | 1569 | !(priv->event & OS_EVENT_MOTION_NOTIFY)) | 1700 | !(priv->event & OS_EVENT_MOTION_NOTIFY)) |
340 | 1570 | { | 1701 | { |
341 | 1702 | OsScrollType scroll_type; | ||
342 | 1703 | |||
343 | 1704 | /* Type of the scroll to perform. */ | ||
344 | 1705 | if (event->state & MODIFIER_KEY) | ||
345 | 1706 | scroll_type = OS_SCROLL_STEP; | ||
346 | 1707 | else | ||
347 | 1708 | scroll_type = OS_SCROLL_PAGE; | ||
348 | 1709 | |||
349 | 1571 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) | 1710 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) |
350 | 1572 | { | 1711 | { |
351 | 1573 | if (priv->pointer.y < priv->slider.height / 2) | 1712 | if (priv->pointer.y < priv->slider.height / 2) |
353 | 1574 | page_up (scrollbar); | 1713 | scroll_up (scrollbar, scroll_type); |
354 | 1575 | else | 1714 | else |
356 | 1576 | page_down (scrollbar); | 1715 | scroll_down (scrollbar, scroll_type); |
357 | 1577 | } | 1716 | } |
358 | 1578 | else | 1717 | else |
359 | 1579 | { | 1718 | { |
360 | 1580 | if (priv->pointer.x < priv->slider.width / 2) | 1719 | if (priv->pointer.x < priv->slider.width / 2) |
362 | 1581 | page_up (scrollbar); | 1720 | scroll_up (scrollbar, scroll_type); |
363 | 1582 | else | 1721 | else |
365 | 1583 | page_down (scrollbar); | 1722 | scroll_down (scrollbar, scroll_type); |
366 | 1584 | } | 1723 | } |
367 | 1585 | } | 1724 | } |
368 | 1586 | 1725 | ||
369 | @@ -1746,8 +1885,8 @@ | |||
370 | 1746 | gint mouse_y) | 1885 | gint mouse_y) |
371 | 1747 | { | 1886 | { |
372 | 1748 | OsScrollbarPrivate *priv; | 1887 | OsScrollbarPrivate *priv; |
373 | 1888 | gfloat c; | ||
374 | 1749 | gint delta; | 1889 | gint delta; |
375 | 1750 | gint c; | ||
376 | 1751 | gdouble new_value; | 1890 | gdouble new_value; |
377 | 1752 | 1891 | ||
378 | 1753 | priv = scrollbar->priv; | 1892 | priv = scrollbar->priv; |
379 | @@ -1757,7 +1896,11 @@ | |||
380 | 1757 | else | 1896 | else |
381 | 1758 | delta = mouse_x - priv->slide_initial_coordinate; | 1897 | delta = mouse_x - priv->slide_initial_coordinate; |
382 | 1759 | 1898 | ||
384 | 1760 | c = priv->slide_initial_slider_position + delta; | 1899 | /* With fine scroll, slow down the scroll. */ |
385 | 1900 | if (priv->state & OS_STATE_FINE_SCROLL) | ||
386 | 1901 | c = priv->slide_initial_slider_position + delta * priv->fine_scroll_multiplier; | ||
387 | 1902 | else | ||
388 | 1903 | c = priv->slide_initial_slider_position + delta; | ||
389 | 1761 | 1904 | ||
390 | 1762 | new_value = coord_to_value (scrollbar, c); | 1905 | new_value = coord_to_value (scrollbar, c); |
391 | 1763 | 1906 | ||
392 | @@ -1802,16 +1945,7 @@ | |||
393 | 1802 | if (priv->state & OS_STATE_RECONNECTING) | 1945 | if (priv->state & OS_STATE_RECONNECTING) |
394 | 1803 | { | 1946 | { |
395 | 1804 | /* It's a reconnecting animation. */ | 1947 | /* It's a reconnecting animation. */ |
406 | 1805 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) | 1948 | calc_precise_slide_values (scrollbar, event->x_root, event->y_root); |
397 | 1806 | { | ||
398 | 1807 | priv->slide_initial_slider_position = MIN (priv->slider.y, priv->overlay.y); | ||
399 | 1808 | priv->slide_initial_coordinate = event->y_root; | ||
400 | 1809 | } | ||
401 | 1810 | else | ||
402 | 1811 | { | ||
403 | 1812 | priv->slide_initial_slider_position = MIN (priv->slider.x, priv->overlay.x); | ||
404 | 1813 | priv->slide_initial_coordinate = event->x_root; | ||
405 | 1814 | } | ||
407 | 1815 | } | 1949 | } |
408 | 1816 | else | 1950 | else |
409 | 1817 | { | 1951 | { |
410 | @@ -1820,6 +1954,34 @@ | |||
411 | 1820 | } | 1954 | } |
412 | 1821 | } | 1955 | } |
413 | 1822 | 1956 | ||
414 | 1957 | /* Check for modifier keys. */ | ||
415 | 1958 | if (event->state & MODIFIER_KEY) | ||
416 | 1959 | { | ||
417 | 1960 | /* You pressed the modifier key for the first time, | ||
418 | 1961 | * let's deal with it. */ | ||
419 | 1962 | if (!(priv->state & OS_STATE_FINE_SCROLL)) | ||
420 | 1963 | { | ||
421 | 1964 | calc_fine_scroll_multiplier (scrollbar); | ||
422 | 1965 | calc_precise_slide_values (scrollbar, event->x_root, event->y_root); | ||
423 | 1966 | |||
424 | 1967 | priv->state |= OS_STATE_FINE_SCROLL; | ||
425 | 1968 | } | ||
426 | 1969 | |||
427 | 1970 | priv->state &= ~(OS_STATE_CONNECTED); | ||
428 | 1971 | } | ||
429 | 1972 | else | ||
430 | 1973 | { | ||
431 | 1974 | /* You released the modifier key for the first time, | ||
432 | 1975 | * let's deal with it. */ | ||
433 | 1976 | if (priv->state & OS_STATE_FINE_SCROLL) | ||
434 | 1977 | { | ||
435 | 1978 | /* Recalculate slider positions. */ | ||
436 | 1979 | calc_precise_slide_values (scrollbar, event->x_root, event->y_root); | ||
437 | 1980 | |||
438 | 1981 | priv->state &= ~(OS_STATE_FINE_SCROLL); | ||
439 | 1982 | } | ||
440 | 1983 | } | ||
441 | 1984 | |||
442 | 1823 | /* Behave differently when the thumb is connected or not. */ | 1985 | /* Behave differently when the thumb is connected or not. */ |
443 | 1824 | if (priv->state & OS_STATE_CONNECTED) | 1986 | if (priv->state & OS_STATE_CONNECTED) |
444 | 1825 | { | 1987 | { |
445 | @@ -1867,7 +2029,7 @@ | |||
446 | 1867 | } | 2029 | } |
447 | 1868 | else | 2030 | else |
448 | 1869 | { | 2031 | { |
450 | 1870 | /* This is a fine scroll, works subtly different. | 2032 | /* This is a disconnected scroll, works subtly different. |
451 | 1871 | * It has to take care of reconnection, | 2033 | * It has to take care of reconnection, |
452 | 1872 | * and scrolling is not allowed when hitting an edge. */ | 2034 | * and scrolling is not allowed when hitting an edge. */ |
453 | 1873 | 2035 | ||
454 | @@ -1887,7 +2049,7 @@ | |||
455 | 1887 | y = priv->thumb_win.y; | 2049 | y = priv->thumb_win.y; |
456 | 1888 | } | 2050 | } |
457 | 1889 | 2051 | ||
459 | 1890 | /* Fine scroll while detached, | 2052 | /* Disconnected scroll while detached, |
460 | 1891 | * do not scroll when hitting an edge. */ | 2053 | * do not scroll when hitting an edge. */ |
461 | 1892 | if ((priv->orientation == GTK_ORIENTATION_VERTICAL && | 2054 | if ((priv->orientation == GTK_ORIENTATION_VERTICAL && |
462 | 1893 | y > priv->thumb_win.y && | 2055 | y > priv->thumb_win.y && |
463 | @@ -1905,9 +2067,10 @@ | |||
464 | 1905 | capture_movement (scrollbar, event->x_root, event->y_root); | 2067 | capture_movement (scrollbar, event->x_root, event->y_root); |
465 | 1906 | } | 2068 | } |
466 | 1907 | else if (!os_animation_is_running (priv->animation) && | 2069 | else if (!os_animation_is_running (priv->animation) && |
468 | 1908 | !(priv->state & OS_STATE_DETACHED)) | 2070 | !(priv->state & OS_STATE_DETACHED) && |
469 | 2071 | !(priv->state & OS_STATE_FINE_SCROLL)) | ||
470 | 1909 | { | 2072 | { |
472 | 1910 | /* Animate scrolling till reaches the edge. */ | 2073 | /* Animate scrolling till reaches the edge. */ |
473 | 1911 | if ((priv->orientation == GTK_ORIENTATION_VERTICAL && y <= priv->thumb_win.y) || | 2074 | if ((priv->orientation == GTK_ORIENTATION_VERTICAL && y <= priv->thumb_win.y) || |
474 | 1912 | (priv->orientation == GTK_ORIENTATION_HORIZONTAL && x <= priv->thumb_win.x)) | 2075 | (priv->orientation == GTK_ORIENTATION_HORIZONTAL && x <= priv->thumb_win.x)) |
475 | 1913 | priv->value = gtk_adjustment_get_lower (priv->adjustment); | 2076 | priv->value = gtk_adjustment_get_lower (priv->adjustment); |
476 | @@ -2026,7 +2189,12 @@ | |||
477 | 2026 | /* Stop the scrolling animation if it's running. */ | 2189 | /* Stop the scrolling animation if it's running. */ |
478 | 2027 | os_animation_stop (priv->animation, NULL); | 2190 | os_animation_stop (priv->animation, NULL); |
479 | 2028 | 2191 | ||
481 | 2029 | delta = get_wheel_delta (scrollbar, event->direction); | 2192 | /* Slow down scroll wheel with the modifier key pressed, |
482 | 2193 | * by a 0.2 factor. */ | ||
483 | 2194 | if (event->state & MODIFIER_KEY) | ||
484 | 2195 | delta = get_wheel_delta (scrollbar, event->direction) * 0.2; | ||
485 | 2196 | else | ||
486 | 2197 | delta = get_wheel_delta (scrollbar, event->direction); | ||
487 | 2030 | 2198 | ||
488 | 2031 | gtk_adjustment_set_value (priv->adjustment, | 2199 | gtk_adjustment_set_value (priv->adjustment, |
489 | 2032 | CLAMP (gtk_adjustment_get_value (priv->adjustment) + delta, | 2200 | CLAMP (gtk_adjustment_get_value (priv->adjustment) + delta, |
490 | @@ -2041,16 +2209,7 @@ | |||
491 | 2041 | 2209 | ||
492 | 2042 | /* we need to update the slide values | 2210 | /* we need to update the slide values |
493 | 2043 | * with the current position. */ | 2211 | * with the current position. */ |
504 | 2044 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) | 2212 | calc_precise_slide_values (scrollbar, event->x_root, event->y_root); |
495 | 2045 | { | ||
496 | 2046 | priv->slide_initial_slider_position = MIN (priv->slider.y, priv->overlay.y); | ||
497 | 2047 | priv->slide_initial_coordinate = event->y_root; | ||
498 | 2048 | } | ||
499 | 2049 | else | ||
500 | 2050 | { | ||
501 | 2051 | priv->slide_initial_slider_position = MIN (priv->slider.x, priv->overlay.x); | ||
502 | 2052 | priv->slide_initial_coordinate = event->x_root; | ||
503 | 2053 | } | ||
505 | 2054 | } | 2213 | } |
506 | 2055 | 2214 | ||
507 | 2056 | return FALSE; | 2215 | return FALSE; |
508 | @@ -2793,6 +2952,8 @@ | |||
509 | 2793 | priv->thumb_win.x = 0; | 2952 | priv->thumb_win.x = 0; |
510 | 2794 | priv->thumb_win.y = 0; | 2953 | priv->thumb_win.y = 0; |
511 | 2795 | 2954 | ||
512 | 2955 | priv->fine_scroll_multiplier = 1.0; | ||
513 | 2956 | |||
514 | 2796 | priv->source_deactivate_bar_id = 0; | 2957 | priv->source_deactivate_bar_id = 0; |
515 | 2797 | priv->source_hide_thumb_id = 0; | 2958 | priv->source_hide_thumb_id = 0; |
516 | 2798 | priv->source_show_thumb_id = 0; | 2959 | priv->source_show_thumb_id = 0; |