Merge lp:~cimi/overlay-scrollbar/visual-connection into lp:overlay-scrollbar
- visual-connection
- Merge into trunk
Proposed by
Andrea Cimitan
Status: | Merged |
---|---|
Merged at revision: | 233 |
Proposed branch: | lp:~cimi/overlay-scrollbar/visual-connection |
Merge into: | lp:overlay-scrollbar |
Diff against target: |
543 lines (+253/-28) 4 files modified
os/os-pager.c (+174/-5) os/os-private.h (+6/-0) os/os-scrollbar.c (+73/-14) os/os-thumb.c (+0/-9) |
To merge this branch: | bzr merge lp:~cimi/overlay-scrollbar/visual-connection |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ted Gould (community) | Approve | ||
Review via email: mp+60852@code.launchpad.net |
Commit message
Description of the change
Add a visual connection between pager and thumb when detached
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-pager.c' | |||
2 | --- os/os-pager.c 2011-04-27 00:44:09 +0000 | |||
3 | +++ os/os-pager.c 2011-05-12 23:41:31 +0000 | |||
4 | @@ -39,11 +39,14 @@ | |||
5 | 39 | 39 | ||
6 | 40 | struct _OsPagerPrivate { | 40 | struct _OsPagerPrivate { |
7 | 41 | GdkWindow *pager_window; | 41 | GdkWindow *pager_window; |
8 | 42 | GdkWindow *connection_window; | ||
9 | 42 | GtkWidget *parent; | 43 | GtkWidget *parent; |
10 | 43 | GdkRectangle mask; | 44 | GdkRectangle mask; |
11 | 45 | GdkRectangle connection_mask; /* in theory not needed, but easier to read. */ | ||
12 | 44 | GdkRectangle allocation; | 46 | GdkRectangle allocation; |
13 | 45 | OsAnimation *animation; | 47 | OsAnimation *animation; |
14 | 46 | gboolean active; | 48 | gboolean active; |
15 | 49 | gboolean detached; | ||
16 | 47 | gboolean visible; | 50 | gboolean visible; |
17 | 48 | gfloat weight; | 51 | gfloat weight; |
18 | 49 | gint width; | 52 | gint width; |
19 | @@ -57,6 +60,7 @@ | |||
20 | 57 | static void os_pager_change_state_cb (gfloat weight, gpointer user_data); | 60 | static void os_pager_change_state_cb (gfloat weight, gpointer user_data); |
21 | 58 | static void os_pager_create (OsPager *pager); | 61 | static void os_pager_create (OsPager *pager); |
22 | 59 | static void os_pager_draw (OsPager *pager); | 62 | static void os_pager_draw (OsPager *pager); |
23 | 63 | static void os_pager_draw_connection (OsPager *pager); | ||
24 | 60 | static void os_pager_mask (OsPager *pager); | 64 | static void os_pager_mask (OsPager *pager); |
25 | 61 | static void os_pager_notify_gtk_theme_name_cb (GObject *object, GParamSpec* pspec, gpointer user_data); | 65 | static void os_pager_notify_gtk_theme_name_cb (GObject *object, GParamSpec* pspec, gpointer user_data); |
26 | 62 | 66 | ||
27 | @@ -85,7 +89,21 @@ | |||
28 | 85 | 89 | ||
29 | 86 | /* Instead reparenting, | 90 | /* Instead reparenting, |
30 | 87 | * which doesn't seem to work well, | 91 | * which doesn't seem to work well, |
32 | 88 | * destroy the window. */ | 92 | * destroy the two windows. */ |
33 | 93 | if (priv->connection_window != NULL) | ||
34 | 94 | { | ||
35 | 95 | /* From the Gdk documentation: | ||
36 | 96 | * "Note that a window will not be destroyed | ||
37 | 97 | * automatically when its reference count | ||
38 | 98 | * reaches zero. You must call | ||
39 | 99 | * gdk_window_destroy () | ||
40 | 100 | * yourself before that happens". */ | ||
41 | 101 | gdk_window_destroy (priv->connection_window); | ||
42 | 102 | |||
43 | 103 | g_object_unref (priv->connection_window); | ||
44 | 104 | priv->connection_window = NULL; | ||
45 | 105 | } | ||
46 | 106 | |||
47 | 89 | if (priv->pager_window != NULL) | 107 | if (priv->pager_window != NULL) |
48 | 90 | { | 108 | { |
49 | 91 | /* From the Gdk documentation: | 109 | /* From the Gdk documentation: |
50 | @@ -107,14 +125,30 @@ | |||
51 | 107 | attributes.visual = gtk_widget_get_visual (priv->parent); | 125 | attributes.visual = gtk_widget_get_visual (priv->parent); |
52 | 108 | attributes.colormap = gtk_widget_get_colormap (priv->parent); | 126 | attributes.colormap = gtk_widget_get_colormap (priv->parent); |
53 | 109 | 127 | ||
54 | 128 | /* connection_window */ | ||
55 | 129 | priv->connection_window = gdk_window_new (gtk_widget_get_window (priv->parent), | ||
56 | 130 | &attributes, | ||
57 | 131 | GDK_WA_VISUAL | GDK_WA_COLORMAP); | ||
58 | 132 | |||
59 | 133 | g_object_ref_sink (priv->connection_window); | ||
60 | 134 | |||
61 | 135 | gdk_window_set_transient_for (priv->connection_window, | ||
62 | 136 | gtk_widget_get_window (priv->parent)); | ||
63 | 137 | |||
64 | 138 | gdk_window_input_shape_combine_region (priv->connection_window, | ||
65 | 139 | gdk_region_new (), | ||
66 | 140 | 0, 0); | ||
67 | 141 | |||
68 | 142 | /* pager_window */ | ||
69 | 110 | priv->pager_window = gdk_window_new (gtk_widget_get_window (priv->parent), | 143 | priv->pager_window = gdk_window_new (gtk_widget_get_window (priv->parent), |
70 | 111 | &attributes, | 144 | &attributes, |
71 | 112 | GDK_WA_VISUAL | GDK_WA_COLORMAP); | 145 | GDK_WA_VISUAL | GDK_WA_COLORMAP); |
72 | 113 | 146 | ||
73 | 114 | g_object_ref_sink (priv->pager_window); | 147 | g_object_ref_sink (priv->pager_window); |
74 | 115 | 148 | ||
75 | 149 | /* stay above the connection_window */ | ||
76 | 116 | gdk_window_set_transient_for (priv->pager_window, | 150 | gdk_window_set_transient_for (priv->pager_window, |
78 | 117 | gtk_widget_get_window (priv->parent)); | 151 | priv->connection_window); |
79 | 118 | 152 | ||
80 | 119 | gdk_window_input_shape_combine_region (priv->pager_window, | 153 | gdk_window_input_shape_combine_region (priv->pager_window, |
81 | 120 | gdk_region_new (), | 154 | gdk_region_new (), |
82 | @@ -137,10 +171,11 @@ | |||
83 | 137 | if (priv->parent == NULL) | 171 | if (priv->parent == NULL) |
84 | 138 | return; | 172 | return; |
85 | 139 | 173 | ||
86 | 174 | os_pager_draw_connection (pager); | ||
87 | 140 | os_pager_draw (pager); | 175 | os_pager_draw (pager); |
88 | 141 | } | 176 | } |
89 | 142 | 177 | ||
91 | 143 | /* Draw on the pager. */ | 178 | /* Draw on the pager_window. */ |
92 | 144 | static void | 179 | static void |
93 | 145 | os_pager_draw (OsPager *pager) | 180 | os_pager_draw (OsPager *pager) |
94 | 146 | { | 181 | { |
95 | @@ -179,7 +214,30 @@ | |||
96 | 179 | gdk_window_invalidate_rect (gtk_widget_get_window (priv->parent), &priv->allocation, TRUE); | 214 | gdk_window_invalidate_rect (gtk_widget_get_window (priv->parent), &priv->allocation, TRUE); |
97 | 180 | } | 215 | } |
98 | 181 | 216 | ||
100 | 182 | /* Mask the pager. */ | 217 | /* Draw on the connection_window. */ |
101 | 218 | static void | ||
102 | 219 | os_pager_draw_connection (OsPager *pager) | ||
103 | 220 | { | ||
104 | 221 | GdkColor color; | ||
105 | 222 | OsPagerPrivate *priv; | ||
106 | 223 | |||
107 | 224 | priv = pager->priv; | ||
108 | 225 | |||
109 | 226 | /* 0.6 is taken from os_thumb_expose. */ | ||
110 | 227 | color.red = 65535 * 0.6; | ||
111 | 228 | color.green = 65535 * 0.6; | ||
112 | 229 | color.blue = 65535 * 0.6; | ||
113 | 230 | |||
114 | 231 | gdk_colormap_alloc_color (gdk_drawable_get_colormap (priv->connection_window), &color, FALSE, TRUE); | ||
115 | 232 | |||
116 | 233 | gdk_window_set_background (priv->connection_window, &color); | ||
117 | 234 | |||
118 | 235 | gdk_window_clear (priv->connection_window); | ||
119 | 236 | |||
120 | 237 | gdk_window_invalidate_rect (gtk_widget_get_window (priv->parent), &priv->allocation, TRUE); | ||
121 | 238 | } | ||
122 | 239 | |||
123 | 240 | /* Mask the pager_window. */ | ||
124 | 183 | static void | 241 | static void |
125 | 184 | os_pager_mask (OsPager *pager) | 242 | os_pager_mask (OsPager *pager) |
126 | 185 | { | 243 | { |
127 | @@ -194,6 +252,21 @@ | |||
128 | 194 | gdk_window_clear (priv->pager_window); | 252 | gdk_window_clear (priv->pager_window); |
129 | 195 | } | 253 | } |
130 | 196 | 254 | ||
131 | 255 | /* Mask the connection_window. */ | ||
132 | 256 | static void | ||
133 | 257 | os_pager_mask_connection (OsPager *pager) | ||
134 | 258 | { | ||
135 | 259 | OsPagerPrivate *priv; | ||
136 | 260 | |||
137 | 261 | priv = pager->priv; | ||
138 | 262 | |||
139 | 263 | gdk_window_shape_combine_region (priv->connection_window, | ||
140 | 264 | gdk_region_rectangle (&priv->connection_mask), | ||
141 | 265 | 0, 0); | ||
142 | 266 | |||
143 | 267 | gdk_window_clear (priv->connection_window); | ||
144 | 268 | } | ||
145 | 269 | |||
146 | 197 | static void | 270 | static void |
147 | 198 | os_pager_notify_gtk_theme_name_cb (GObject* gobject, | 271 | os_pager_notify_gtk_theme_name_cb (GObject* gobject, |
148 | 199 | GParamSpec* pspec, | 272 | GParamSpec* pspec, |
149 | @@ -205,9 +278,12 @@ | |||
150 | 205 | pager = OS_PAGER (user_data); | 278 | pager = OS_PAGER (user_data); |
151 | 206 | priv = pager->priv; | 279 | priv = pager->priv; |
152 | 207 | 280 | ||
154 | 208 | if (priv->parent == NULL || priv->pager_window == NULL) | 281 | if (priv->parent == NULL || |
155 | 282 | priv->pager_window == NULL || | ||
156 | 283 | priv->connection_window == NULL) | ||
157 | 209 | return; | 284 | return; |
158 | 210 | 285 | ||
159 | 286 | os_pager_draw_connection (pager); | ||
160 | 211 | os_pager_draw (pager); | 287 | os_pager_draw (pager); |
161 | 212 | } | 288 | } |
162 | 213 | 289 | ||
163 | @@ -249,9 +325,11 @@ | |||
164 | 249 | mask.width = 1; | 325 | mask.width = 1; |
165 | 250 | mask.height = 1; | 326 | mask.height = 1; |
166 | 251 | 327 | ||
167 | 328 | priv->connection_mask = mask; | ||
168 | 252 | priv->mask = mask; | 329 | priv->mask = mask; |
169 | 253 | 330 | ||
170 | 254 | priv->active = FALSE; | 331 | priv->active = FALSE; |
171 | 332 | priv->detached = FALSE; | ||
172 | 255 | priv->visible = FALSE; | 333 | priv->visible = FALSE; |
173 | 256 | 334 | ||
174 | 257 | priv->weight = 1.0f; | 335 | priv->weight = 1.0f; |
175 | @@ -278,6 +356,20 @@ | |||
176 | 278 | priv->animation = NULL; | 356 | priv->animation = NULL; |
177 | 279 | } | 357 | } |
178 | 280 | 358 | ||
179 | 359 | if (priv->connection_window != NULL) | ||
180 | 360 | { | ||
181 | 361 | /* From the Gdk documentation: | ||
182 | 362 | * "Note that a window will not be destroyed | ||
183 | 363 | * automatically when its reference count | ||
184 | 364 | * reaches zero. You must call | ||
185 | 365 | * gdk_window_destroy () | ||
186 | 366 | * yourself before that happens". */ | ||
187 | 367 | gdk_window_destroy (priv->connection_window); | ||
188 | 368 | |||
189 | 369 | g_object_unref (priv->connection_window); | ||
190 | 370 | priv->connection_window = NULL; | ||
191 | 371 | } | ||
192 | 372 | |||
193 | 281 | if (priv->pager_window != NULL) | 373 | if (priv->pager_window != NULL) |
194 | 282 | { | 374 | { |
195 | 283 | /* From the Gdk documentation: | 375 | /* From the Gdk documentation: |
196 | @@ -322,6 +414,34 @@ | |||
197 | 322 | } | 414 | } |
198 | 323 | 415 | ||
199 | 324 | /** | 416 | /** |
200 | 417 | * os_pager_connect: | ||
201 | 418 | * @pager: a #OsPager | ||
202 | 419 | * @mask: a #GdkRectangle with the position and dimension of the connection | ||
203 | 420 | * | ||
204 | 421 | * Moves and resizes connection. | ||
205 | 422 | **/ | ||
206 | 423 | void | ||
207 | 424 | os_pager_connect (OsPager *pager, | ||
208 | 425 | GdkRectangle mask) | ||
209 | 426 | { | ||
210 | 427 | OsPagerPrivate *priv; | ||
211 | 428 | |||
212 | 429 | g_return_if_fail (OS_PAGER (pager)); | ||
213 | 430 | |||
214 | 431 | priv = pager->priv; | ||
215 | 432 | |||
216 | 433 | if (!rectangle_changed (priv->connection_mask, mask)) | ||
217 | 434 | return; | ||
218 | 435 | |||
219 | 436 | priv->connection_mask = mask; | ||
220 | 437 | |||
221 | 438 | if (priv->parent == NULL) | ||
222 | 439 | return; | ||
223 | 440 | |||
224 | 441 | os_pager_mask_connection (pager); | ||
225 | 442 | } | ||
226 | 443 | |||
227 | 444 | /** | ||
228 | 325 | * os_pager_hide: | 445 | * os_pager_hide: |
229 | 326 | * @pager: a #OsPager | 446 | * @pager: a #OsPager |
230 | 327 | * | 447 | * |
231 | @@ -344,6 +464,7 @@ | |||
232 | 344 | /* if there's an animation currently running, stop it. */ | 464 | /* if there's an animation currently running, stop it. */ |
233 | 345 | os_animation_stop (priv->animation); | 465 | os_animation_stop (priv->animation); |
234 | 346 | 466 | ||
235 | 467 | gdk_window_hide (priv->connection_window); | ||
236 | 347 | gdk_window_hide (priv->pager_window); | 468 | gdk_window_hide (priv->pager_window); |
237 | 348 | } | 469 | } |
238 | 349 | 470 | ||
239 | @@ -419,6 +540,41 @@ | |||
240 | 419 | } | 540 | } |
241 | 420 | 541 | ||
242 | 421 | /** | 542 | /** |
243 | 543 | * os_pager_set_detached: | ||
244 | 544 | * @pager: a #OsPager | ||
245 | 545 | * @detached: whether the pager is detached or not | ||
246 | 546 | * | ||
247 | 547 | * Changes the detached state of @pager. | ||
248 | 548 | **/ | ||
249 | 549 | void | ||
250 | 550 | os_pager_set_detached (OsPager *pager, | ||
251 | 551 | gboolean detached) | ||
252 | 552 | { | ||
253 | 553 | OsPagerPrivate *priv; | ||
254 | 554 | |||
255 | 555 | g_return_if_fail (OS_PAGER (pager)); | ||
256 | 556 | |||
257 | 557 | priv = pager->priv; | ||
258 | 558 | |||
259 | 559 | if (priv->detached != detached) | ||
260 | 560 | { | ||
261 | 561 | priv->detached = detached; | ||
262 | 562 | |||
263 | 563 | if (priv->parent == NULL) | ||
264 | 564 | return; | ||
265 | 565 | |||
266 | 566 | if (priv->detached) | ||
267 | 567 | { | ||
268 | 568 | gdk_window_show (priv->connection_window); | ||
269 | 569 | |||
270 | 570 | gdk_window_clear (priv->connection_window); | ||
271 | 571 | } | ||
272 | 572 | else | ||
273 | 573 | gdk_window_hide (priv->connection_window); | ||
274 | 574 | } | ||
275 | 575 | } | ||
276 | 576 | |||
277 | 577 | /** | ||
278 | 422 | * os_pager_set_parent: | 578 | * os_pager_set_parent: |
279 | 423 | * @pager: a #OsPager | 579 | * @pager: a #OsPager |
280 | 424 | * @parent: a #GtkWidget | 580 | * @parent: a #GtkWidget |
281 | @@ -453,9 +609,16 @@ | |||
282 | 453 | priv->weight = 1.0f; | 609 | priv->weight = 1.0f; |
283 | 454 | 610 | ||
284 | 455 | os_pager_create (pager); | 611 | os_pager_create (pager); |
285 | 612 | os_pager_draw_connection (pager); | ||
286 | 456 | os_pager_draw (pager); | 613 | os_pager_draw (pager); |
287 | 457 | os_pager_mask (pager); | 614 | os_pager_mask (pager); |
288 | 458 | 615 | ||
289 | 616 | gdk_window_move_resize (priv->connection_window, | ||
290 | 617 | priv->allocation.x, | ||
291 | 618 | priv->allocation.y, | ||
292 | 619 | priv->allocation.width, | ||
293 | 620 | priv->allocation.height); | ||
294 | 621 | |||
295 | 459 | gdk_window_move_resize (priv->pager_window, | 622 | gdk_window_move_resize (priv->pager_window, |
296 | 460 | priv->allocation.x, | 623 | priv->allocation.x, |
297 | 461 | priv->allocation.y, | 624 | priv->allocation.y, |
298 | @@ -521,6 +684,12 @@ | |||
299 | 521 | if (priv->parent == NULL) | 684 | if (priv->parent == NULL) |
300 | 522 | return; | 685 | return; |
301 | 523 | 686 | ||
302 | 687 | gdk_window_move_resize (priv->connection_window, | ||
303 | 688 | rectangle.x, | ||
304 | 689 | rectangle.y, | ||
305 | 690 | rectangle.width, | ||
306 | 691 | rectangle.height); | ||
307 | 692 | |||
308 | 524 | gdk_window_move_resize (priv->pager_window, | 693 | gdk_window_move_resize (priv->pager_window, |
309 | 525 | rectangle.x, | 694 | rectangle.x, |
310 | 526 | rectangle.y, | 695 | rectangle.y, |
311 | 527 | 696 | ||
312 | === modified file 'os/os-private.h' | |||
313 | --- os/os-private.h 2011-05-06 15:46:50 +0000 | |||
314 | +++ os/os-private.h 2011-05-12 23:41:31 +0000 | |||
315 | @@ -208,12 +208,18 @@ | |||
316 | 208 | 208 | ||
317 | 209 | void os_pager_hide (OsPager *overlay); | 209 | void os_pager_hide (OsPager *overlay); |
318 | 210 | 210 | ||
319 | 211 | void os_pager_connect (OsPager *overlay, | ||
320 | 212 | GdkRectangle mask); | ||
321 | 213 | |||
322 | 211 | void os_pager_move_resize (OsPager *overlay, | 214 | void os_pager_move_resize (OsPager *overlay, |
323 | 212 | GdkRectangle mask); | 215 | GdkRectangle mask); |
324 | 213 | 216 | ||
325 | 214 | void os_pager_set_active (OsPager *overlay, | 217 | void os_pager_set_active (OsPager *overlay, |
326 | 215 | gboolean active); | 218 | gboolean active); |
327 | 216 | 219 | ||
328 | 220 | void os_pager_set_detached (OsPager *overlay, | ||
329 | 221 | gboolean detached); | ||
330 | 222 | |||
331 | 217 | void os_pager_set_parent (OsPager *pager, | 223 | void os_pager_set_parent (OsPager *pager, |
332 | 218 | GtkWidget *parent); | 224 | GtkWidget *parent); |
333 | 219 | 225 | ||
334 | 220 | 226 | ||
335 | === modified file 'os/os-scrollbar.c' | |||
336 | --- os/os-scrollbar.c 2011-05-08 14:06:01 +0000 | |||
337 | +++ os/os-scrollbar.c 2011-05-12 23:41:31 +0000 | |||
338 | @@ -494,10 +494,8 @@ | |||
339 | 494 | gpointer user_data) | 494 | gpointer user_data) |
340 | 495 | { | 495 | { |
341 | 496 | OsScrollbar *scrollbar; | 496 | OsScrollbar *scrollbar; |
342 | 497 | OsScrollbarPrivate *priv; | ||
343 | 498 | 497 | ||
344 | 499 | scrollbar = OS_SCROLLBAR (object); | 498 | scrollbar = OS_SCROLLBAR (object); |
345 | 500 | priv = scrollbar->priv; | ||
346 | 501 | 499 | ||
347 | 502 | os_scrollbar_swap_adjustment (scrollbar, gtk_range_get_adjustment (GTK_RANGE (object))); | 500 | os_scrollbar_swap_adjustment (scrollbar, gtk_range_get_adjustment (GTK_RANGE (object))); |
348 | 503 | } | 501 | } |
349 | @@ -854,14 +852,12 @@ | |||
350 | 854 | { | 852 | { |
351 | 855 | Display *display; | 853 | Display *display; |
352 | 856 | OsScrollbar *scrollbar; | 854 | OsScrollbar *scrollbar; |
353 | 857 | OsScrollbarPrivate *priv; | ||
354 | 858 | XWindowChanges changes; | 855 | XWindowChanges changes; |
355 | 859 | guint32 xid, xid_parent; | 856 | guint32 xid, xid_parent; |
356 | 860 | unsigned int value_mask = CWSibling | CWStackMode; | 857 | unsigned int value_mask = CWSibling | CWStackMode; |
357 | 861 | int res; | 858 | int res; |
358 | 862 | 859 | ||
359 | 863 | scrollbar = OS_SCROLLBAR (user_data); | 860 | scrollbar = OS_SCROLLBAR (user_data); |
360 | 864 | priv = scrollbar->priv; | ||
361 | 865 | 861 | ||
362 | 866 | xid = GDK_WINDOW_XID (gtk_widget_get_window (widget)); | 862 | xid = GDK_WINDOW_XID (gtk_widget_get_window (widget)); |
363 | 867 | xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (scrollbar))); | 863 | xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (scrollbar))); |
364 | @@ -1027,6 +1023,8 @@ | |||
365 | 1027 | scrollbar = OS_SCROLLBAR (user_data); | 1023 | scrollbar = OS_SCROLLBAR (user_data); |
366 | 1028 | priv = scrollbar->priv; | 1024 | priv = scrollbar->priv; |
367 | 1029 | 1025 | ||
368 | 1026 | priv->value_changed_event = TRUE; | ||
369 | 1027 | |||
370 | 1030 | delta = os_scrollbar_get_wheel_delta (scrollbar, event->direction); | 1028 | delta = os_scrollbar_get_wheel_delta (scrollbar, event->direction); |
371 | 1031 | 1029 | ||
372 | 1032 | gtk_adjustment_set_value (priv->adjustment, | 1030 | gtk_adjustment_set_value (priv->adjustment, |
373 | @@ -1051,6 +1049,8 @@ | |||
374 | 1051 | priv->button_press_event = FALSE; | 1049 | priv->button_press_event = FALSE; |
375 | 1052 | priv->motion_notify_event = FALSE; | 1050 | priv->motion_notify_event = FALSE; |
376 | 1053 | priv->enter_notify_event = FALSE; | 1051 | priv->enter_notify_event = FALSE; |
377 | 1052 | |||
378 | 1053 | os_pager_set_detached (OS_PAGER (priv->pager), FALSE); | ||
379 | 1054 | } | 1054 | } |
380 | 1055 | 1055 | ||
381 | 1056 | /* Move the pager to the right position. */ | 1056 | /* Move the pager to the right position. */ |
382 | @@ -1169,7 +1169,10 @@ | |||
383 | 1169 | { | 1169 | { |
384 | 1170 | /* if we're dragging the thumb, it can't be detached. */ | 1170 | /* if we're dragging the thumb, it can't be detached. */ |
385 | 1171 | if (priv->motion_notify_event) | 1171 | if (priv->motion_notify_event) |
387 | 1172 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | 1172 | { |
388 | 1173 | os_pager_set_detached (OS_PAGER (priv->pager), FALSE); | ||
389 | 1174 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | ||
390 | 1175 | } | ||
391 | 1173 | else | 1176 | else |
392 | 1174 | { | 1177 | { |
393 | 1175 | gint x_pos, y_pos; | 1178 | gint x_pos, y_pos; |
394 | @@ -1177,19 +1180,73 @@ | |||
395 | 1177 | 1180 | ||
396 | 1178 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) | 1181 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) |
397 | 1179 | { | 1182 | { |
403 | 1180 | if ((priv->win_y + priv->overlay.y > y_pos + priv->slider.height) || | 1183 | if (priv->win_y + priv->overlay.y > y_pos + priv->slider.height) |
404 | 1181 | (priv->win_y + priv->overlay.y + priv->overlay.height < y_pos)) | 1184 | { |
405 | 1182 | os_thumb_set_detached (OS_THUMB (priv->thumb), TRUE); | 1185 | GdkRectangle mask; |
406 | 1183 | else | 1186 | |
407 | 1184 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | 1187 | mask.x = 0; |
408 | 1188 | mask.y = y_pos + priv->slider.height / 2 - priv->win_y; | ||
409 | 1189 | mask.width = DEFAULT_PAGER_WIDTH; | ||
410 | 1190 | mask.height = priv->overlay.y - mask.y; | ||
411 | 1191 | |||
412 | 1192 | os_pager_connect (OS_PAGER (priv->pager), mask); | ||
413 | 1193 | os_pager_set_detached (OS_PAGER (priv->pager), TRUE); | ||
414 | 1194 | |||
415 | 1195 | os_thumb_set_detached (OS_THUMB (priv->thumb), TRUE); | ||
416 | 1196 | } | ||
417 | 1197 | else if (priv->win_y + priv->overlay.y + priv->overlay.height < y_pos) | ||
418 | 1198 | { | ||
419 | 1199 | GdkRectangle mask; | ||
420 | 1200 | |||
421 | 1201 | mask.x = 0; | ||
422 | 1202 | mask.y = priv->overlay.y + priv->overlay.height; | ||
423 | 1203 | mask.width = DEFAULT_PAGER_WIDTH; | ||
424 | 1204 | mask.height = y_pos + priv->slider.height / 2 - priv->win_y - mask.y; | ||
425 | 1205 | |||
426 | 1206 | os_pager_connect (OS_PAGER (priv->pager), mask); | ||
427 | 1207 | os_pager_set_detached (OS_PAGER (priv->pager), TRUE); | ||
428 | 1208 | |||
429 | 1209 | os_thumb_set_detached (OS_THUMB (priv->thumb), TRUE); | ||
430 | 1210 | } | ||
431 | 1211 | else | ||
432 | 1212 | { | ||
433 | 1213 | os_pager_set_detached (OS_PAGER (priv->pager), FALSE); | ||
434 | 1214 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | ||
435 | 1215 | } | ||
436 | 1185 | } | 1216 | } |
437 | 1186 | else | 1217 | else |
438 | 1187 | { | 1218 | { |
442 | 1188 | if ((priv->win_x + priv->overlay.x > x_pos + priv->slider.width) || | 1219 | if (priv->win_x + priv->overlay.x > x_pos + priv->slider.width) |
443 | 1189 | (priv->win_x + priv->overlay.x + priv->overlay.width < x_pos)) | 1220 | { |
444 | 1190 | os_thumb_set_detached (OS_THUMB (priv->thumb), TRUE); | 1221 | GdkRectangle mask; |
445 | 1222 | |||
446 | 1223 | mask.x = x_pos + priv->slider.width / 2 - priv->win_x; | ||
447 | 1224 | mask.y = 0; | ||
448 | 1225 | mask.width = priv->overlay.x - mask.x; | ||
449 | 1226 | mask.height = DEFAULT_PAGER_WIDTH; | ||
450 | 1227 | |||
451 | 1228 | os_pager_connect (OS_PAGER (priv->pager), mask); | ||
452 | 1229 | os_pager_set_detached (OS_PAGER (priv->pager), TRUE); | ||
453 | 1230 | |||
454 | 1231 | os_thumb_set_detached (OS_THUMB (priv->thumb), TRUE); | ||
455 | 1232 | } | ||
456 | 1233 | else if (priv->win_x + priv->overlay.x + priv->overlay.width < x_pos) | ||
457 | 1234 | { | ||
458 | 1235 | GdkRectangle mask; | ||
459 | 1236 | |||
460 | 1237 | mask.x = priv->overlay.y + priv->overlay.height; | ||
461 | 1238 | mask.y = 0; | ||
462 | 1239 | mask.width = x_pos + priv->slider.width / 2 - priv->win_x - mask.x; | ||
463 | 1240 | mask.height = DEFAULT_PAGER_WIDTH; | ||
464 | 1241 | |||
465 | 1242 | os_pager_connect (OS_PAGER (priv->pager), mask); | ||
466 | 1243 | os_pager_set_detached (OS_PAGER (priv->pager), TRUE); | ||
467 | 1244 | } | ||
468 | 1191 | else | 1245 | else |
470 | 1192 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | 1246 | { |
471 | 1247 | os_pager_set_detached (OS_PAGER (priv->pager), FALSE); | ||
472 | 1248 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | ||
473 | 1249 | } | ||
474 | 1193 | } | 1250 | } |
475 | 1194 | } | 1251 | } |
476 | 1195 | } | 1252 | } |
477 | @@ -1431,6 +1488,7 @@ | |||
478 | 1431 | os_scrollbar_move_thumb (scrollbar, priv->win_x, priv->win_y + priv->slider.y); | 1488 | os_scrollbar_move_thumb (scrollbar, priv->win_x, priv->win_y + priv->slider.y); |
479 | 1432 | } | 1489 | } |
480 | 1433 | 1490 | ||
481 | 1491 | os_pager_set_detached (OS_PAGER (priv->pager), FALSE); | ||
482 | 1434 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | 1492 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); |
483 | 1435 | gtk_widget_show (GTK_WIDGET (priv->thumb)); | 1493 | gtk_widget_show (GTK_WIDGET (priv->thumb)); |
484 | 1436 | } | 1494 | } |
485 | @@ -1471,6 +1529,7 @@ | |||
486 | 1471 | os_scrollbar_move_thumb (scrollbar, priv->win_x + priv->slider.x, priv->win_y); | 1529 | os_scrollbar_move_thumb (scrollbar, priv->win_x + priv->slider.x, priv->win_y); |
487 | 1472 | } | 1530 | } |
488 | 1473 | 1531 | ||
489 | 1532 | os_pager_set_detached (OS_PAGER (priv->pager), FALSE); | ||
490 | 1474 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); | 1533 | os_thumb_set_detached (OS_THUMB (priv->thumb), FALSE); |
491 | 1475 | gtk_widget_show (GTK_WIDGET (priv->thumb)); | 1534 | gtk_widget_show (GTK_WIDGET (priv->thumb)); |
492 | 1476 | } | 1535 | } |
493 | 1477 | 1536 | ||
494 | === modified file 'os/os-thumb.c' | |||
495 | --- os/os-thumb.c 2011-05-08 14:06:01 +0000 | |||
496 | +++ os/os-thumb.c 2011-05-12 23:41:31 +0000 | |||
497 | @@ -138,12 +138,9 @@ | |||
498 | 138 | gpointer user_data) | 138 | gpointer user_data) |
499 | 139 | { | 139 | { |
500 | 140 | OsThumb *thumb; | 140 | OsThumb *thumb; |
501 | 141 | OsThumbPrivate *priv; | ||
502 | 142 | 141 | ||
503 | 143 | thumb = OS_THUMB (user_data); | 142 | thumb = OS_THUMB (user_data); |
504 | 144 | 143 | ||
505 | 145 | priv = thumb->priv; | ||
506 | 146 | |||
507 | 147 | if (weight < 1.0f) | 144 | if (weight < 1.0f) |
508 | 148 | gtk_window_set_opacity (GTK_WINDOW (thumb), fabs (weight - 1.0f)); | 145 | gtk_window_set_opacity (GTK_WINDOW (thumb), fabs (weight - 1.0f)); |
509 | 149 | else | 146 | else |
510 | @@ -379,7 +376,6 @@ | |||
511 | 379 | GdkEventExpose *event) | 376 | GdkEventExpose *event) |
512 | 380 | { | 377 | { |
513 | 381 | GtkAllocation allocation; | 378 | GtkAllocation allocation; |
514 | 382 | GtkStateType state_type_down, state_type_up; | ||
515 | 383 | GtkStyle *style; | 379 | GtkStyle *style; |
516 | 384 | OsThumb *thumb; | 380 | OsThumb *thumb; |
517 | 385 | OsThumbPrivate *priv; | 381 | OsThumbPrivate *priv; |
518 | @@ -393,9 +389,6 @@ | |||
519 | 393 | thumb = OS_THUMB (widget); | 389 | thumb = OS_THUMB (widget); |
520 | 394 | priv = thumb->priv; | 390 | priv = thumb->priv; |
521 | 395 | 391 | ||
522 | 396 | state_type_down = GTK_STATE_NORMAL; | ||
523 | 397 | state_type_up = GTK_STATE_NORMAL; | ||
524 | 398 | |||
525 | 399 | gtk_widget_get_allocation (widget, &allocation); | 392 | gtk_widget_get_allocation (widget, &allocation); |
526 | 400 | 393 | ||
527 | 401 | x = 0; | 394 | x = 0; |
528 | @@ -445,7 +438,6 @@ | |||
529 | 445 | if ((priv->orientation == GTK_ORIENTATION_VERTICAL && (priv->pointer_y < height / 2)) || | 438 | if ((priv->orientation == GTK_ORIENTATION_VERTICAL && (priv->pointer_y < height / 2)) || |
530 | 446 | (priv->orientation == GTK_ORIENTATION_HORIZONTAL && (priv->pointer_x < width / 2))) | 439 | (priv->orientation == GTK_ORIENTATION_HORIZONTAL && (priv->pointer_x < width / 2))) |
531 | 447 | { | 440 | { |
532 | 448 | state_type_up = GTK_STATE_ACTIVE; | ||
533 | 449 | cairo_pattern_add_color_stop_rgba (pat, 0.0, 0.8, 0.8, 0.8, 0.8); | 441 | cairo_pattern_add_color_stop_rgba (pat, 0.0, 0.8, 0.8, 0.8, 0.8); |
534 | 450 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 1.0, 1.0, 1.0, 0.0); | 442 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 1.0, 1.0, 1.0, 0.0); |
535 | 451 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 0.8, 0.8, 0.8, 0.5); | 443 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 0.8, 0.8, 0.8, 0.5); |
536 | @@ -453,7 +445,6 @@ | |||
537 | 453 | } | 445 | } |
538 | 454 | else | 446 | else |
539 | 455 | { | 447 | { |
540 | 456 | state_type_down = GTK_STATE_ACTIVE; | ||
541 | 457 | cairo_pattern_add_color_stop_rgba (pat, 0.0, 1.0, 1.0, 1.0, 0.8); | 448 | cairo_pattern_add_color_stop_rgba (pat, 0.0, 1.0, 1.0, 1.0, 0.8); |
542 | 458 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 1.0, 1.0, 1.0, 0.0); | 449 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 1.0, 1.0, 1.0, 0.0); |
543 | 459 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 0.8, 0.8, 0.8, 0.5); | 450 | cairo_pattern_add_color_stop_rgba (pat, 0.49, 0.8, 0.8, 0.8, 0.5); |