Merge lp:~cimi/overlay-scrollbar/remove-parent into lp:overlay-scrollbar
- remove-parent
- Merge into trunk
Proposed by
Andrea Cimitan
Status: | Merged |
---|---|
Merged at revision: | 181 |
Proposed branch: | lp:~cimi/overlay-scrollbar/remove-parent |
Merge into: | lp:overlay-scrollbar |
Diff against target: |
381 lines (+47/-168) 1 file modified
os/os-scrollbar.c (+47/-168) |
To merge this branch: | bzr merge lp:~cimi/overlay-scrollbar/remove-parent |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Loïc Molinari (community) | Approve | ||
Review via email: mp+55312@code.launchpad.net |
Commit message
Description of the change
there's no reason why we should use a pointer to the parent and connect callbacks to it. let's deprecate it
To post a comment you must log in.
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-03-29 10:35:30 +0000 | |||
3 | +++ os/os-scrollbar.c 2011-03-29 11:04:35 +0000 | |||
4 | @@ -46,7 +46,6 @@ | |||
5 | 46 | GtkAllocation thumb_all; | 46 | GtkAllocation thumb_all; |
6 | 47 | GObject *pager; | 47 | GObject *pager; |
7 | 48 | GtkWidget *thumb; | 48 | GtkWidget *thumb; |
8 | 49 | GtkWidget *parent; | ||
9 | 50 | GtkAdjustment *adjustment; | 49 | GtkAdjustment *adjustment; |
10 | 51 | GtkOrientation orientation; | 50 | GtkOrientation orientation; |
11 | 52 | gboolean button_press_event; | 51 | gboolean button_press_event; |
12 | @@ -70,7 +69,6 @@ | |||
13 | 70 | static void os_scrollbar_grab_notify (GtkWidget *widget, gboolean was_grabbed); | 69 | static void os_scrollbar_grab_notify (GtkWidget *widget, gboolean was_grabbed); |
14 | 71 | static void os_scrollbar_hide (GtkWidget *widget); | 70 | static void os_scrollbar_hide (GtkWidget *widget); |
15 | 72 | static void os_scrollbar_map (GtkWidget *widget); | 71 | static void os_scrollbar_map (GtkWidget *widget); |
16 | 73 | static void os_scrollbar_parent_set (GtkWidget *widget, GtkWidget *old_parent); | ||
17 | 74 | static void os_scrollbar_realize (GtkWidget *widget); | 72 | static void os_scrollbar_realize (GtkWidget *widget); |
18 | 75 | static void os_scrollbar_show (GtkWidget *widget); | 73 | static void os_scrollbar_show (GtkWidget *widget); |
19 | 76 | static void os_scrollbar_size_allocate (GtkWidget *widget, GdkRectangle *allocation); | 74 | static void os_scrollbar_size_allocate (GtkWidget *widget, GdkRectangle *allocation); |
20 | @@ -91,7 +89,6 @@ | |||
21 | 91 | static gint os_scrollbar_sanitize_y (OsScrollbar *scrollbar, gint y); | 89 | static gint os_scrollbar_sanitize_y (OsScrollbar *scrollbar, gint y); |
22 | 92 | static void os_scrollbar_store_window_position (OsScrollbar *scrollbar); | 90 | static void os_scrollbar_store_window_position (OsScrollbar *scrollbar); |
23 | 93 | static void os_scrollbar_swap_adjustment (OsScrollbar *scrollbar, GtkAdjustment *adjustment); | 91 | static void os_scrollbar_swap_adjustment (OsScrollbar *scrollbar, GtkAdjustment *adjustment); |
24 | 94 | static void os_scrollbar_swap_parent (OsScrollbar *scrollbar, GtkWidget *parent); | ||
25 | 95 | static void os_scrollbar_swap_thumb (OsScrollbar *scrollbar, GtkWidget *thumb); | 92 | static void os_scrollbar_swap_thumb (OsScrollbar *scrollbar, GtkWidget *thumb); |
26 | 96 | static gboolean thumb_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data); | 93 | static gboolean thumb_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data); |
27 | 97 | static gboolean thumb_button_release_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data); | 94 | static gboolean thumb_button_release_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data); |
28 | @@ -104,8 +101,6 @@ | |||
29 | 104 | static void pager_set_state (OsScrollbar *scrollbar); | 101 | static void pager_set_state (OsScrollbar *scrollbar); |
30 | 105 | static void adjustment_changed_cb (GtkAdjustment *adjustment, gpointer user_data); | 102 | static void adjustment_changed_cb (GtkAdjustment *adjustment, gpointer user_data); |
31 | 106 | static void adjustment_value_changed_cb (GtkAdjustment *adjustment, gpointer user_data); | 103 | static void adjustment_value_changed_cb (GtkAdjustment *adjustment, gpointer user_data); |
32 | 107 | static void parent_realize_cb (GtkWidget *widget, gpointer user_data); | ||
33 | 108 | static void parent_unrealize_cb (GtkWidget *widget, gpointer user_data); | ||
34 | 109 | static gboolean toplevel_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data); | 104 | static gboolean toplevel_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data); |
35 | 110 | static GdkFilterReturn toplevel_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer user_data); | 105 | static GdkFilterReturn toplevel_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer user_data); |
36 | 111 | static gboolean toplevel_leave_notify_event_cb (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data); | 106 | static gboolean toplevel_leave_notify_event_cb (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data); |
37 | @@ -481,7 +476,7 @@ | |||
38 | 481 | 476 | ||
39 | 482 | priv = scrollbar->priv; | 477 | priv = scrollbar->priv; |
40 | 483 | 478 | ||
42 | 484 | gdk_window_get_origin (gtk_widget_get_window (priv->parent), &win_x, &win_y); | 479 | gdk_window_get_origin (gtk_widget_get_window (GTK_WIDGET (scrollbar)), &win_x, &win_y); |
43 | 485 | 480 | ||
44 | 486 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) | 481 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) |
45 | 487 | { | 482 | { |
46 | @@ -527,38 +522,6 @@ | |||
47 | 527 | } | 522 | } |
48 | 528 | } | 523 | } |
49 | 529 | 524 | ||
50 | 530 | /* Swap the parent pointer. */ | ||
51 | 531 | static void | ||
52 | 532 | os_scrollbar_swap_parent (OsScrollbar *scrollbar, | ||
53 | 533 | GtkWidget *parent) | ||
54 | 534 | { | ||
55 | 535 | OsScrollbarPrivate *priv; | ||
56 | 536 | |||
57 | 537 | priv = scrollbar->priv; | ||
58 | 538 | |||
59 | 539 | if (priv->parent != NULL) | ||
60 | 540 | { | ||
61 | 541 | g_signal_handlers_disconnect_by_func (G_OBJECT (priv->parent), | ||
62 | 542 | G_CALLBACK (parent_realize_cb), scrollbar); | ||
63 | 543 | g_signal_handlers_disconnect_by_func (G_OBJECT (priv->parent), | ||
64 | 544 | G_CALLBACK (parent_unrealize_cb), scrollbar); | ||
65 | 545 | |||
66 | 546 | g_object_unref (priv->parent); | ||
67 | 547 | } | ||
68 | 548 | |||
69 | 549 | priv->parent = parent; | ||
70 | 550 | |||
71 | 551 | if (priv->parent != NULL) | ||
72 | 552 | { | ||
73 | 553 | g_object_ref_sink (priv->parent); | ||
74 | 554 | |||
75 | 555 | g_signal_connect (G_OBJECT (priv->parent), "realize", | ||
76 | 556 | G_CALLBACK (parent_realize_cb), scrollbar); | ||
77 | 557 | g_signal_connect (G_OBJECT (priv->parent), "unrealize", | ||
78 | 558 | G_CALLBACK (parent_unrealize_cb), scrollbar); | ||
79 | 559 | } | ||
80 | 560 | } | ||
81 | 561 | |||
82 | 562 | /* Swap the thumb pointer. */ | 525 | /* Swap the thumb pointer. */ |
83 | 563 | static void | 526 | static void |
84 | 564 | os_scrollbar_swap_thumb (OsScrollbar *scrollbar, | 527 | os_scrollbar_swap_thumb (OsScrollbar *scrollbar, |
85 | @@ -628,9 +591,8 @@ | |||
86 | 628 | scrollbar = OS_SCROLLBAR (user_data); | 591 | scrollbar = OS_SCROLLBAR (user_data); |
87 | 629 | priv = scrollbar->priv; | 592 | priv = scrollbar->priv; |
88 | 630 | 593 | ||
92 | 631 | /* os_scrollbar_map (widget);*/ | 594 | gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (scrollbar)))); |
93 | 632 | gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (gtk_widget_get_toplevel (priv->parent))); | 595 | os_present_gdk_window_with_timestamp (GTK_WIDGET (scrollbar), event->time); |
91 | 633 | os_present_gdk_window_with_timestamp (priv->parent, event->time); | ||
94 | 634 | 596 | ||
95 | 635 | priv->button_press_event = TRUE; | 597 | priv->button_press_event = TRUE; |
96 | 636 | priv->motion_notify_event = FALSE; | 598 | priv->motion_notify_event = FALSE; |
97 | @@ -752,7 +714,7 @@ | |||
98 | 752 | priv = scrollbar->priv; | 714 | priv = scrollbar->priv; |
99 | 753 | 715 | ||
100 | 754 | xid = GDK_WINDOW_XID (gtk_widget_get_window (priv->thumb)); | 716 | xid = GDK_WINDOW_XID (gtk_widget_get_window (priv->thumb)); |
102 | 755 | xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (priv->parent)); | 717 | xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (scrollbar))); |
103 | 756 | display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (scrollbar))); | 718 | display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (scrollbar))); |
104 | 757 | 719 | ||
105 | 758 | changes.sibling = xid_parent; | 720 | changes.sibling = xid_parent; |
106 | @@ -818,7 +780,6 @@ | |||
107 | 818 | scrollbar = OS_SCROLLBAR (user_data); | 780 | scrollbar = OS_SCROLLBAR (user_data); |
108 | 819 | priv = scrollbar->priv; | 781 | priv = scrollbar->priv; |
109 | 820 | 782 | ||
110 | 821 | /* XXX improve speed by not rendering when moving */ | ||
111 | 822 | if (priv->button_press_event) | 783 | if (priv->button_press_event) |
112 | 823 | { | 784 | { |
113 | 824 | gint x, y; | 785 | gint x, y; |
114 | @@ -953,8 +914,8 @@ | |||
115 | 953 | 914 | ||
116 | 954 | priv = scrollbar->priv; | 915 | priv = scrollbar->priv; |
117 | 955 | 916 | ||
120 | 956 | if (gdk_screen_get_active_window (gtk_widget_get_screen (priv->parent)) != | 917 | if (gdk_screen_get_active_window (gtk_widget_get_screen (GTK_WIDGET (scrollbar))) != |
121 | 957 | gtk_widget_get_window (priv->parent)) | 918 | gtk_widget_get_window (GTK_WIDGET (scrollbar))) |
122 | 958 | os_pager_set_active (OS_PAGER (priv->pager), FALSE); | 919 | os_pager_set_active (OS_PAGER (priv->pager), FALSE); |
123 | 959 | else | 920 | else |
124 | 960 | os_pager_set_active (OS_PAGER (priv->pager), TRUE); | 921 | os_pager_set_active (OS_PAGER (priv->pager), TRUE); |
125 | @@ -1021,59 +982,6 @@ | |||
126 | 1021 | pager_move (scrollbar); | 982 | pager_move (scrollbar); |
127 | 1022 | } | 983 | } |
128 | 1023 | 984 | ||
129 | 1024 | static void | ||
130 | 1025 | parent_realize_cb (GtkWidget *widget, | ||
131 | 1026 | gpointer user_data) | ||
132 | 1027 | { | ||
133 | 1028 | OsScrollbar *scrollbar; | ||
134 | 1029 | OsScrollbarPrivate *priv; | ||
135 | 1030 | |||
136 | 1031 | scrollbar = OS_SCROLLBAR (user_data); | ||
137 | 1032 | priv = scrollbar->priv; | ||
138 | 1033 | |||
139 | 1034 | if (priv->filter == FALSE && priv->proximity == TRUE) | ||
140 | 1035 | { | ||
141 | 1036 | priv->filter = TRUE; | ||
142 | 1037 | gdk_window_add_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); | ||
143 | 1038 | } | ||
144 | 1039 | |||
145 | 1040 | g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), "configure-event", | ||
146 | 1041 | G_CALLBACK (toplevel_configure_event_cb), scrollbar); | ||
147 | 1042 | g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), "leave-notify-event", | ||
148 | 1043 | G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); | ||
149 | 1044 | |||
150 | 1045 | os_scrollbar_calc_layout_pager (scrollbar, priv->adjustment->value); | ||
151 | 1046 | |||
152 | 1047 | os_pager_set_parent (OS_PAGER (priv->pager), priv->parent); | ||
153 | 1048 | |||
154 | 1049 | os_scrollbar_store_window_position (scrollbar); | ||
155 | 1050 | } | ||
156 | 1051 | |||
157 | 1052 | static void | ||
158 | 1053 | parent_unrealize_cb (GtkWidget *widget, | ||
159 | 1054 | gpointer user_data) | ||
160 | 1055 | { | ||
161 | 1056 | OsScrollbar *scrollbar; | ||
162 | 1057 | OsScrollbarPrivate *priv; | ||
163 | 1058 | |||
164 | 1059 | scrollbar = OS_SCROLLBAR (user_data); | ||
165 | 1060 | priv = scrollbar->priv; | ||
166 | 1061 | |||
167 | 1062 | /* FIXME(Cimi) check if | ||
168 | 1063 | * gtk_widget_get_window (priv->parent) and | ||
169 | 1064 | * gtk_widget_get_toplevel (priv->parent)) | ||
170 | 1065 | * are ready to use, otherwise we might need to store them in priv */ | ||
171 | 1066 | |||
172 | 1067 | gdk_window_remove_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); | ||
173 | 1068 | |||
174 | 1069 | g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), | ||
175 | 1070 | G_CALLBACK (toplevel_configure_event_cb), scrollbar); | ||
176 | 1071 | g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), | ||
177 | 1072 | G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); | ||
178 | 1073 | |||
179 | 1074 | os_pager_set_parent (OS_PAGER (priv->pager), NULL); | ||
180 | 1075 | } | ||
181 | 1076 | |||
182 | 1077 | static gboolean | 985 | static gboolean |
183 | 1078 | toplevel_configure_event_cb (GtkWidget *widget, | 986 | toplevel_configure_event_cb (GtkWidget *widget, |
184 | 1079 | GdkEventConfigure *event, | 987 | GdkEventConfigure *event, |
185 | @@ -1112,7 +1020,6 @@ | |||
186 | 1112 | priv = scrollbar->priv; | 1020 | priv = scrollbar->priv; |
187 | 1113 | xevent = gdkxevent; | 1021 | xevent = gdkxevent; |
188 | 1114 | 1022 | ||
189 | 1115 | g_return_val_if_fail (priv->parent != NULL, GDK_FILTER_CONTINUE); | ||
190 | 1116 | g_return_val_if_fail (priv->pager != NULL, GDK_FILTER_CONTINUE); | 1023 | g_return_val_if_fail (priv->pager != NULL, GDK_FILTER_CONTINUE); |
191 | 1117 | g_return_val_if_fail (priv->thumb != NULL, GDK_FILTER_CONTINUE); | 1024 | g_return_val_if_fail (priv->thumb != NULL, GDK_FILTER_CONTINUE); |
192 | 1118 | 1025 | ||
193 | @@ -1135,7 +1042,7 @@ | |||
194 | 1135 | { | 1042 | { |
195 | 1136 | gint x, y, x_pos, y_pos; | 1043 | gint x, y, x_pos, y_pos; |
196 | 1137 | 1044 | ||
198 | 1138 | gdk_window_get_origin (gtk_widget_get_window (priv->parent), &x_pos, &y_pos); | 1045 | gdk_window_get_origin (gtk_widget_get_window (GTK_WIDGET (scrollbar)), &x_pos, &y_pos); |
199 | 1139 | 1046 | ||
200 | 1140 | x = priv->thumb_all.x; | 1047 | x = priv->thumb_all.x; |
201 | 1141 | y = CLAMP (xevent->xmotion.y - priv->slider.height / 2, | 1048 | y = CLAMP (xevent->xmotion.y - priv->slider.height / 2, |
202 | @@ -1150,7 +1057,6 @@ | |||
203 | 1150 | } | 1057 | } |
204 | 1151 | 1058 | ||
205 | 1152 | gtk_widget_show (GTK_WIDGET (priv->thumb)); | 1059 | gtk_widget_show (GTK_WIDGET (priv->thumb)); |
206 | 1153 | /* os_scrollbar_map (GTK_WIDGET (scrollbar));*/ | ||
207 | 1154 | } | 1060 | } |
208 | 1155 | else | 1061 | else |
209 | 1156 | { | 1062 | { |
210 | @@ -1171,7 +1077,7 @@ | |||
211 | 1171 | { | 1077 | { |
212 | 1172 | gint x, y, x_pos, y_pos; | 1078 | gint x, y, x_pos, y_pos; |
213 | 1173 | 1079 | ||
215 | 1174 | gdk_window_get_origin (gtk_widget_get_window (priv->parent), &x_pos, &y_pos); | 1080 | gdk_window_get_origin (gtk_widget_get_window (GTK_WIDGET (scrollbar)), &x_pos, &y_pos); |
216 | 1175 | 1081 | ||
217 | 1176 | x = CLAMP (xevent->xmotion.x - priv->slider.width / 2, | 1082 | x = CLAMP (xevent->xmotion.x - priv->slider.width / 2, |
218 | 1177 | priv->thumb_all.x + priv->overlay.x, | 1083 | priv->thumb_all.x + priv->overlay.x, |
219 | @@ -1186,7 +1092,6 @@ | |||
220 | 1186 | } | 1092 | } |
221 | 1187 | 1093 | ||
222 | 1188 | gtk_widget_show (GTK_WIDGET (priv->thumb)); | 1094 | gtk_widget_show (GTK_WIDGET (priv->thumb)); |
223 | 1189 | /* os_scrollbar_map (GTK_WIDGET (scrollbar));*/ | ||
224 | 1190 | } | 1095 | } |
225 | 1191 | else | 1096 | else |
226 | 1192 | { | 1097 | { |
227 | @@ -1204,8 +1109,8 @@ | |||
228 | 1204 | /* code to check if the window is active */ | 1109 | /* code to check if the window is active */ |
229 | 1205 | if (xevent->type == PropertyNotify) | 1110 | if (xevent->type == PropertyNotify) |
230 | 1206 | { | 1111 | { |
233 | 1207 | if (gdk_screen_get_active_window (gtk_widget_get_screen (priv->parent)) != | 1112 | if (gdk_screen_get_active_window (gtk_widget_get_screen (GTK_WIDGET (scrollbar))) != |
234 | 1208 | gtk_widget_get_window (priv->parent)) | 1113 | gtk_widget_get_window (GTK_WIDGET (scrollbar))) |
235 | 1209 | { | 1114 | { |
236 | 1210 | gtk_widget_hide (GTK_WIDGET (priv->thumb)); | 1115 | gtk_widget_hide (GTK_WIDGET (priv->thumb)); |
237 | 1211 | os_pager_set_active (OS_PAGER (priv->pager), FALSE); | 1116 | os_pager_set_active (OS_PAGER (priv->pager), FALSE); |
238 | @@ -1255,7 +1160,6 @@ | |||
239 | 1255 | widget_class->hide = os_scrollbar_hide; | 1160 | widget_class->hide = os_scrollbar_hide; |
240 | 1256 | widget_class->map = os_scrollbar_map; | 1161 | widget_class->map = os_scrollbar_map; |
241 | 1257 | widget_class->realize = os_scrollbar_realize; | 1162 | widget_class->realize = os_scrollbar_realize; |
242 | 1258 | widget_class->parent_set = os_scrollbar_parent_set; | ||
243 | 1259 | widget_class->show = os_scrollbar_show; | 1163 | widget_class->show = os_scrollbar_show; |
244 | 1260 | widget_class->size_allocate = os_scrollbar_size_allocate; | 1164 | widget_class->size_allocate = os_scrollbar_size_allocate; |
245 | 1261 | widget_class->unmap = os_scrollbar_unmap; | 1165 | widget_class->unmap = os_scrollbar_unmap; |
246 | @@ -1308,7 +1212,6 @@ | |||
247 | 1308 | priv = scrollbar->priv; | 1212 | priv = scrollbar->priv; |
248 | 1309 | 1213 | ||
249 | 1310 | os_scrollbar_swap_adjustment (scrollbar, NULL); | 1214 | os_scrollbar_swap_adjustment (scrollbar, NULL); |
250 | 1311 | os_scrollbar_swap_parent (scrollbar, NULL); | ||
251 | 1312 | os_scrollbar_swap_thumb (scrollbar, NULL); | 1215 | os_scrollbar_swap_thumb (scrollbar, NULL); |
252 | 1313 | 1216 | ||
253 | 1314 | if (priv->pager != NULL) | 1217 | if (priv->pager != NULL) |
254 | @@ -1357,73 +1260,40 @@ | |||
255 | 1357 | if (priv->fullsize == FALSE) | 1260 | if (priv->fullsize == FALSE) |
256 | 1358 | os_pager_show (OS_PAGER (priv->pager)); | 1261 | os_pager_show (OS_PAGER (priv->pager)); |
257 | 1359 | 1262 | ||
259 | 1360 | if (gtk_widget_get_realized (priv->parent) && priv->filter == FALSE) | 1263 | if (gtk_widget_get_realized (widget) && priv->filter == FALSE) |
260 | 1361 | { | 1264 | { |
261 | 1362 | priv->filter = TRUE; | 1265 | priv->filter = TRUE; |
320 | 1363 | gdk_window_add_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); | 1266 | gdk_window_add_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); |
321 | 1364 | } | 1267 | } |
264 | 1365 | |||
265 | 1366 | #if 0 | ||
266 | 1367 | Display *display; | ||
267 | 1368 | GtkWidget *parent; | ||
268 | 1369 | XWindowChanges changes; | ||
269 | 1370 | guint32 xid, xid_parent; | ||
270 | 1371 | unsigned int value_mask = CWSibling | CWStackMode; | ||
271 | 1372 | int res; | ||
272 | 1373 | |||
273 | 1374 | parent = gtk_widget_get_parent (widget); | ||
274 | 1375 | |||
275 | 1376 | xid = GDK_WINDOW_XID (gtk_widget_get_window (widget)); | ||
276 | 1377 | xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (parent)); | ||
277 | 1378 | display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (widget)); | ||
278 | 1379 | |||
279 | 1380 | changes.sibling = xid_parent; | ||
280 | 1381 | changes.stack_mode = Above; | ||
281 | 1382 | |||
282 | 1383 | gdk_error_trap_push (); | ||
283 | 1384 | XConfigureWindow (display, xid, value_mask, &changes); | ||
284 | 1385 | |||
285 | 1386 | gdk_flush (); | ||
286 | 1387 | if ((res = gdk_error_trap_pop ())) | ||
287 | 1388 | { | ||
288 | 1389 | XEvent event; | ||
289 | 1390 | Window xroot = gdk_x11_get_default_root_xwindow (); | ||
290 | 1391 | |||
291 | 1392 | /* Synthetic ConfigureRequest (so it looks to the window manager | ||
292 | 1393 | * like a normal ConfigureRequest) so it can handle that | ||
293 | 1394 | * and *actually* Configure the window without errors | ||
294 | 1395 | */ | ||
295 | 1396 | event.type = ConfigureRequest; | ||
296 | 1397 | |||
297 | 1398 | /* The WM will know the event is synthetic since the send_event | ||
298 | 1399 | * field is always set */ | ||
299 | 1400 | event.xconfigurerequest.window = xid; | ||
300 | 1401 | event.xconfigurerequest.parent = xid_parent; | ||
301 | 1402 | event.xconfigurerequest.detail = changes.stack_mode; | ||
302 | 1403 | event.xconfigurerequest.above = changes.sibling; | ||
303 | 1404 | event.xconfigurerequest.value_mask = value_mask; | ||
304 | 1405 | |||
305 | 1406 | /* Sends the event to the root window (which the WM has the Selection | ||
306 | 1407 | * on) so now Compiz will get a ConfigureRequest for the scrollbar | ||
307 | 1408 | * to stack relative to the reparented window */ | ||
308 | 1409 | XSendEvent (display, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &event); | ||
309 | 1410 | |||
310 | 1411 | g_warning ("Received X error: %d, working around\n", res); | ||
311 | 1412 | } | ||
312 | 1413 | #endif | ||
313 | 1414 | } | ||
314 | 1415 | |||
315 | 1416 | static void | ||
316 | 1417 | os_scrollbar_parent_set (GtkWidget *widget, | ||
317 | 1418 | GtkWidget *old_parent) | ||
318 | 1419 | { | ||
319 | 1420 | os_scrollbar_swap_parent (OS_SCROLLBAR (widget), gtk_widget_get_parent (widget)); | ||
322 | 1421 | } | 1268 | } |
323 | 1422 | 1269 | ||
324 | 1423 | static void | 1270 | static void |
325 | 1424 | os_scrollbar_realize (GtkWidget *widget) | 1271 | os_scrollbar_realize (GtkWidget *widget) |
326 | 1425 | { | 1272 | { |
327 | 1273 | OsScrollbar *scrollbar; | ||
328 | 1274 | OsScrollbarPrivate *priv; | ||
329 | 1275 | |||
330 | 1276 | scrollbar = OS_SCROLLBAR (widget); | ||
331 | 1277 | priv = scrollbar->priv; | ||
332 | 1278 | |||
333 | 1426 | GTK_WIDGET_CLASS (g_type_class_peek (GTK_TYPE_WIDGET))->realize (widget); | 1279 | GTK_WIDGET_CLASS (g_type_class_peek (GTK_TYPE_WIDGET))->realize (widget); |
334 | 1280 | |||
335 | 1281 | if (priv->filter == FALSE && priv->proximity == TRUE) | ||
336 | 1282 | { | ||
337 | 1283 | priv->filter = TRUE; | ||
338 | 1284 | gdk_window_add_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); | ||
339 | 1285 | } | ||
340 | 1286 | |||
341 | 1287 | g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)), "configure-event", | ||
342 | 1288 | G_CALLBACK (toplevel_configure_event_cb), scrollbar); | ||
343 | 1289 | g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)), "leave-notify-event", | ||
344 | 1290 | G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); | ||
345 | 1291 | |||
346 | 1292 | os_scrollbar_calc_layout_pager (scrollbar, priv->adjustment->value); | ||
347 | 1293 | |||
348 | 1294 | os_pager_set_parent (OS_PAGER (priv->pager), widget); | ||
349 | 1295 | |||
350 | 1296 | os_scrollbar_store_window_position (scrollbar); | ||
351 | 1427 | } | 1297 | } |
352 | 1428 | 1298 | ||
353 | 1429 | static void | 1299 | static void |
354 | @@ -1513,10 +1383,10 @@ | |||
355 | 1513 | 1383 | ||
356 | 1514 | gtk_widget_hide (priv->thumb); | 1384 | gtk_widget_hide (priv->thumb); |
357 | 1515 | 1385 | ||
359 | 1516 | if (gtk_widget_get_realized (priv->parent) && priv->filter == TRUE) | 1386 | if (gtk_widget_get_realized (widget) && priv->filter == TRUE) |
360 | 1517 | { | 1387 | { |
361 | 1518 | priv->filter = FALSE; | 1388 | priv->filter = FALSE; |
363 | 1519 | gdk_window_remove_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); | 1389 | gdk_window_remove_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); |
364 | 1520 | } | 1390 | } |
365 | 1521 | } | 1391 | } |
366 | 1522 | 1392 | ||
367 | @@ -1531,6 +1401,15 @@ | |||
368 | 1531 | 1401 | ||
369 | 1532 | gtk_widget_hide (priv->thumb); | 1402 | gtk_widget_hide (priv->thumb); |
370 | 1533 | 1403 | ||
371 | 1404 | gdk_window_remove_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); | ||
372 | 1405 | |||
373 | 1406 | g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (widget)), | ||
374 | 1407 | G_CALLBACK (toplevel_configure_event_cb), scrollbar); | ||
375 | 1408 | g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (widget)), | ||
376 | 1409 | G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); | ||
377 | 1410 | |||
378 | 1411 | os_pager_set_parent (OS_PAGER (priv->pager), NULL); | ||
379 | 1412 | |||
380 | 1534 | GTK_WIDGET_CLASS (g_type_class_peek (GTK_TYPE_WIDGET))->unrealize (widget); | 1413 | GTK_WIDGET_CLASS (g_type_class_peek (GTK_TYPE_WIDGET))->unrealize (widget); |
381 | 1535 | } | 1414 | } |
382 | 1536 | 1415 |
I love it when you remove code. It's simpler and very likely faster.