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:
|
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 | GtkAllocation thumb_all; |
6 | GObject *pager; |
7 | GtkWidget *thumb; |
8 | - GtkWidget *parent; |
9 | GtkAdjustment *adjustment; |
10 | GtkOrientation orientation; |
11 | gboolean button_press_event; |
12 | @@ -70,7 +69,6 @@ |
13 | static void os_scrollbar_grab_notify (GtkWidget *widget, gboolean was_grabbed); |
14 | static void os_scrollbar_hide (GtkWidget *widget); |
15 | static void os_scrollbar_map (GtkWidget *widget); |
16 | -static void os_scrollbar_parent_set (GtkWidget *widget, GtkWidget *old_parent); |
17 | static void os_scrollbar_realize (GtkWidget *widget); |
18 | static void os_scrollbar_show (GtkWidget *widget); |
19 | static void os_scrollbar_size_allocate (GtkWidget *widget, GdkRectangle *allocation); |
20 | @@ -91,7 +89,6 @@ |
21 | static gint os_scrollbar_sanitize_y (OsScrollbar *scrollbar, gint y); |
22 | static void os_scrollbar_store_window_position (OsScrollbar *scrollbar); |
23 | static void os_scrollbar_swap_adjustment (OsScrollbar *scrollbar, GtkAdjustment *adjustment); |
24 | -static void os_scrollbar_swap_parent (OsScrollbar *scrollbar, GtkWidget *parent); |
25 | static void os_scrollbar_swap_thumb (OsScrollbar *scrollbar, GtkWidget *thumb); |
26 | static gboolean thumb_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data); |
27 | static gboolean thumb_button_release_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data); |
28 | @@ -104,8 +101,6 @@ |
29 | static void pager_set_state (OsScrollbar *scrollbar); |
30 | static void adjustment_changed_cb (GtkAdjustment *adjustment, gpointer user_data); |
31 | static void adjustment_value_changed_cb (GtkAdjustment *adjustment, gpointer user_data); |
32 | -static void parent_realize_cb (GtkWidget *widget, gpointer user_data); |
33 | -static void parent_unrealize_cb (GtkWidget *widget, gpointer user_data); |
34 | static gboolean toplevel_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data); |
35 | static GdkFilterReturn toplevel_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer user_data); |
36 | static gboolean toplevel_leave_notify_event_cb (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data); |
37 | @@ -481,7 +476,7 @@ |
38 | |
39 | priv = scrollbar->priv; |
40 | |
41 | - gdk_window_get_origin (gtk_widget_get_window (priv->parent), &win_x, &win_y); |
42 | + gdk_window_get_origin (gtk_widget_get_window (GTK_WIDGET (scrollbar)), &win_x, &win_y); |
43 | |
44 | if (priv->orientation == GTK_ORIENTATION_VERTICAL) |
45 | { |
46 | @@ -527,38 +522,6 @@ |
47 | } |
48 | } |
49 | |
50 | -/* Swap the parent pointer. */ |
51 | -static void |
52 | -os_scrollbar_swap_parent (OsScrollbar *scrollbar, |
53 | - GtkWidget *parent) |
54 | -{ |
55 | - OsScrollbarPrivate *priv; |
56 | - |
57 | - priv = scrollbar->priv; |
58 | - |
59 | - if (priv->parent != NULL) |
60 | - { |
61 | - g_signal_handlers_disconnect_by_func (G_OBJECT (priv->parent), |
62 | - G_CALLBACK (parent_realize_cb), scrollbar); |
63 | - g_signal_handlers_disconnect_by_func (G_OBJECT (priv->parent), |
64 | - G_CALLBACK (parent_unrealize_cb), scrollbar); |
65 | - |
66 | - g_object_unref (priv->parent); |
67 | - } |
68 | - |
69 | - priv->parent = parent; |
70 | - |
71 | - if (priv->parent != NULL) |
72 | - { |
73 | - g_object_ref_sink (priv->parent); |
74 | - |
75 | - g_signal_connect (G_OBJECT (priv->parent), "realize", |
76 | - G_CALLBACK (parent_realize_cb), scrollbar); |
77 | - g_signal_connect (G_OBJECT (priv->parent), "unrealize", |
78 | - G_CALLBACK (parent_unrealize_cb), scrollbar); |
79 | - } |
80 | -} |
81 | - |
82 | /* Swap the thumb pointer. */ |
83 | static void |
84 | os_scrollbar_swap_thumb (OsScrollbar *scrollbar, |
85 | @@ -628,9 +591,8 @@ |
86 | scrollbar = OS_SCROLLBAR (user_data); |
87 | priv = scrollbar->priv; |
88 | |
89 | -/* os_scrollbar_map (widget);*/ |
90 | - gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (gtk_widget_get_toplevel (priv->parent))); |
91 | - os_present_gdk_window_with_timestamp (priv->parent, event->time); |
92 | + gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (scrollbar)))); |
93 | + os_present_gdk_window_with_timestamp (GTK_WIDGET (scrollbar), event->time); |
94 | |
95 | priv->button_press_event = TRUE; |
96 | priv->motion_notify_event = FALSE; |
97 | @@ -752,7 +714,7 @@ |
98 | priv = scrollbar->priv; |
99 | |
100 | xid = GDK_WINDOW_XID (gtk_widget_get_window (priv->thumb)); |
101 | - xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (priv->parent)); |
102 | + xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (scrollbar))); |
103 | display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (scrollbar))); |
104 | |
105 | changes.sibling = xid_parent; |
106 | @@ -818,7 +780,6 @@ |
107 | scrollbar = OS_SCROLLBAR (user_data); |
108 | priv = scrollbar->priv; |
109 | |
110 | - /* XXX improve speed by not rendering when moving */ |
111 | if (priv->button_press_event) |
112 | { |
113 | gint x, y; |
114 | @@ -953,8 +914,8 @@ |
115 | |
116 | priv = scrollbar->priv; |
117 | |
118 | - if (gdk_screen_get_active_window (gtk_widget_get_screen (priv->parent)) != |
119 | - gtk_widget_get_window (priv->parent)) |
120 | + if (gdk_screen_get_active_window (gtk_widget_get_screen (GTK_WIDGET (scrollbar))) != |
121 | + gtk_widget_get_window (GTK_WIDGET (scrollbar))) |
122 | os_pager_set_active (OS_PAGER (priv->pager), FALSE); |
123 | else |
124 | os_pager_set_active (OS_PAGER (priv->pager), TRUE); |
125 | @@ -1021,59 +982,6 @@ |
126 | pager_move (scrollbar); |
127 | } |
128 | |
129 | -static void |
130 | -parent_realize_cb (GtkWidget *widget, |
131 | - gpointer user_data) |
132 | -{ |
133 | - OsScrollbar *scrollbar; |
134 | - OsScrollbarPrivate *priv; |
135 | - |
136 | - scrollbar = OS_SCROLLBAR (user_data); |
137 | - priv = scrollbar->priv; |
138 | - |
139 | - if (priv->filter == FALSE && priv->proximity == TRUE) |
140 | - { |
141 | - priv->filter = TRUE; |
142 | - gdk_window_add_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); |
143 | - } |
144 | - |
145 | - g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), "configure-event", |
146 | - G_CALLBACK (toplevel_configure_event_cb), scrollbar); |
147 | - g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), "leave-notify-event", |
148 | - G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); |
149 | - |
150 | - os_scrollbar_calc_layout_pager (scrollbar, priv->adjustment->value); |
151 | - |
152 | - os_pager_set_parent (OS_PAGER (priv->pager), priv->parent); |
153 | - |
154 | - os_scrollbar_store_window_position (scrollbar); |
155 | -} |
156 | - |
157 | -static void |
158 | -parent_unrealize_cb (GtkWidget *widget, |
159 | - gpointer user_data) |
160 | -{ |
161 | - OsScrollbar *scrollbar; |
162 | - OsScrollbarPrivate *priv; |
163 | - |
164 | - scrollbar = OS_SCROLLBAR (user_data); |
165 | - priv = scrollbar->priv; |
166 | - |
167 | - /* FIXME(Cimi) check if |
168 | - * gtk_widget_get_window (priv->parent) and |
169 | - * gtk_widget_get_toplevel (priv->parent)) |
170 | - * are ready to use, otherwise we might need to store them in priv */ |
171 | - |
172 | - gdk_window_remove_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); |
173 | - |
174 | - g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), |
175 | - G_CALLBACK (toplevel_configure_event_cb), scrollbar); |
176 | - g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), |
177 | - G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); |
178 | - |
179 | - os_pager_set_parent (OS_PAGER (priv->pager), NULL); |
180 | -} |
181 | - |
182 | static gboolean |
183 | toplevel_configure_event_cb (GtkWidget *widget, |
184 | GdkEventConfigure *event, |
185 | @@ -1112,7 +1020,6 @@ |
186 | priv = scrollbar->priv; |
187 | xevent = gdkxevent; |
188 | |
189 | - g_return_val_if_fail (priv->parent != NULL, GDK_FILTER_CONTINUE); |
190 | g_return_val_if_fail (priv->pager != NULL, GDK_FILTER_CONTINUE); |
191 | g_return_val_if_fail (priv->thumb != NULL, GDK_FILTER_CONTINUE); |
192 | |
193 | @@ -1135,7 +1042,7 @@ |
194 | { |
195 | gint x, y, x_pos, y_pos; |
196 | |
197 | - gdk_window_get_origin (gtk_widget_get_window (priv->parent), &x_pos, &y_pos); |
198 | + gdk_window_get_origin (gtk_widget_get_window (GTK_WIDGET (scrollbar)), &x_pos, &y_pos); |
199 | |
200 | x = priv->thumb_all.x; |
201 | y = CLAMP (xevent->xmotion.y - priv->slider.height / 2, |
202 | @@ -1150,7 +1057,6 @@ |
203 | } |
204 | |
205 | gtk_widget_show (GTK_WIDGET (priv->thumb)); |
206 | -/* os_scrollbar_map (GTK_WIDGET (scrollbar));*/ |
207 | } |
208 | else |
209 | { |
210 | @@ -1171,7 +1077,7 @@ |
211 | { |
212 | gint x, y, x_pos, y_pos; |
213 | |
214 | - gdk_window_get_origin (gtk_widget_get_window (priv->parent), &x_pos, &y_pos); |
215 | + gdk_window_get_origin (gtk_widget_get_window (GTK_WIDGET (scrollbar)), &x_pos, &y_pos); |
216 | |
217 | x = CLAMP (xevent->xmotion.x - priv->slider.width / 2, |
218 | priv->thumb_all.x + priv->overlay.x, |
219 | @@ -1186,7 +1092,6 @@ |
220 | } |
221 | |
222 | gtk_widget_show (GTK_WIDGET (priv->thumb)); |
223 | -/* os_scrollbar_map (GTK_WIDGET (scrollbar));*/ |
224 | } |
225 | else |
226 | { |
227 | @@ -1204,8 +1109,8 @@ |
228 | /* code to check if the window is active */ |
229 | if (xevent->type == PropertyNotify) |
230 | { |
231 | - if (gdk_screen_get_active_window (gtk_widget_get_screen (priv->parent)) != |
232 | - gtk_widget_get_window (priv->parent)) |
233 | + if (gdk_screen_get_active_window (gtk_widget_get_screen (GTK_WIDGET (scrollbar))) != |
234 | + gtk_widget_get_window (GTK_WIDGET (scrollbar))) |
235 | { |
236 | gtk_widget_hide (GTK_WIDGET (priv->thumb)); |
237 | os_pager_set_active (OS_PAGER (priv->pager), FALSE); |
238 | @@ -1255,7 +1160,6 @@ |
239 | widget_class->hide = os_scrollbar_hide; |
240 | widget_class->map = os_scrollbar_map; |
241 | widget_class->realize = os_scrollbar_realize; |
242 | - widget_class->parent_set = os_scrollbar_parent_set; |
243 | widget_class->show = os_scrollbar_show; |
244 | widget_class->size_allocate = os_scrollbar_size_allocate; |
245 | widget_class->unmap = os_scrollbar_unmap; |
246 | @@ -1308,7 +1212,6 @@ |
247 | priv = scrollbar->priv; |
248 | |
249 | os_scrollbar_swap_adjustment (scrollbar, NULL); |
250 | - os_scrollbar_swap_parent (scrollbar, NULL); |
251 | os_scrollbar_swap_thumb (scrollbar, NULL); |
252 | |
253 | if (priv->pager != NULL) |
254 | @@ -1357,73 +1260,40 @@ |
255 | if (priv->fullsize == FALSE) |
256 | os_pager_show (OS_PAGER (priv->pager)); |
257 | |
258 | - if (gtk_widget_get_realized (priv->parent) && priv->filter == FALSE) |
259 | + if (gtk_widget_get_realized (widget) && priv->filter == FALSE) |
260 | { |
261 | priv->filter = TRUE; |
262 | - gdk_window_add_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); |
263 | - } |
264 | - |
265 | -#if 0 |
266 | - Display *display; |
267 | - GtkWidget *parent; |
268 | - XWindowChanges changes; |
269 | - guint32 xid, xid_parent; |
270 | - unsigned int value_mask = CWSibling | CWStackMode; |
271 | - int res; |
272 | - |
273 | - parent = gtk_widget_get_parent (widget); |
274 | - |
275 | - xid = GDK_WINDOW_XID (gtk_widget_get_window (widget)); |
276 | - xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (parent)); |
277 | - display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (widget)); |
278 | - |
279 | - changes.sibling = xid_parent; |
280 | - changes.stack_mode = Above; |
281 | - |
282 | - gdk_error_trap_push (); |
283 | - XConfigureWindow (display, xid, value_mask, &changes); |
284 | - |
285 | - gdk_flush (); |
286 | - if ((res = gdk_error_trap_pop ())) |
287 | - { |
288 | - XEvent event; |
289 | - Window xroot = gdk_x11_get_default_root_xwindow (); |
290 | - |
291 | - /* Synthetic ConfigureRequest (so it looks to the window manager |
292 | - * like a normal ConfigureRequest) so it can handle that |
293 | - * and *actually* Configure the window without errors |
294 | - */ |
295 | - event.type = ConfigureRequest; |
296 | - |
297 | - /* The WM will know the event is synthetic since the send_event |
298 | - * field is always set */ |
299 | - event.xconfigurerequest.window = xid; |
300 | - event.xconfigurerequest.parent = xid_parent; |
301 | - event.xconfigurerequest.detail = changes.stack_mode; |
302 | - event.xconfigurerequest.above = changes.sibling; |
303 | - event.xconfigurerequest.value_mask = value_mask; |
304 | - |
305 | - /* Sends the event to the root window (which the WM has the Selection |
306 | - * on) so now Compiz will get a ConfigureRequest for the scrollbar |
307 | - * to stack relative to the reparented window */ |
308 | - XSendEvent (display, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &event); |
309 | - |
310 | - g_warning ("Received X error: %d, working around\n", res); |
311 | - } |
312 | -#endif |
313 | -} |
314 | - |
315 | -static void |
316 | -os_scrollbar_parent_set (GtkWidget *widget, |
317 | - GtkWidget *old_parent) |
318 | -{ |
319 | - os_scrollbar_swap_parent (OS_SCROLLBAR (widget), gtk_widget_get_parent (widget)); |
320 | + gdk_window_add_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); |
321 | + } |
322 | } |
323 | |
324 | static void |
325 | os_scrollbar_realize (GtkWidget *widget) |
326 | { |
327 | + OsScrollbar *scrollbar; |
328 | + OsScrollbarPrivate *priv; |
329 | + |
330 | + scrollbar = OS_SCROLLBAR (widget); |
331 | + priv = scrollbar->priv; |
332 | + |
333 | GTK_WIDGET_CLASS (g_type_class_peek (GTK_TYPE_WIDGET))->realize (widget); |
334 | + |
335 | + if (priv->filter == FALSE && priv->proximity == TRUE) |
336 | + { |
337 | + priv->filter = TRUE; |
338 | + gdk_window_add_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); |
339 | + } |
340 | + |
341 | + g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)), "configure-event", |
342 | + G_CALLBACK (toplevel_configure_event_cb), scrollbar); |
343 | + g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)), "leave-notify-event", |
344 | + G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); |
345 | + |
346 | + os_scrollbar_calc_layout_pager (scrollbar, priv->adjustment->value); |
347 | + |
348 | + os_pager_set_parent (OS_PAGER (priv->pager), widget); |
349 | + |
350 | + os_scrollbar_store_window_position (scrollbar); |
351 | } |
352 | |
353 | static void |
354 | @@ -1513,10 +1383,10 @@ |
355 | |
356 | gtk_widget_hide (priv->thumb); |
357 | |
358 | - if (gtk_widget_get_realized (priv->parent) && priv->filter == TRUE) |
359 | + if (gtk_widget_get_realized (widget) && priv->filter == TRUE) |
360 | { |
361 | priv->filter = FALSE; |
362 | - gdk_window_remove_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar); |
363 | + gdk_window_remove_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); |
364 | } |
365 | } |
366 | |
367 | @@ -1531,6 +1401,15 @@ |
368 | |
369 | gtk_widget_hide (priv->thumb); |
370 | |
371 | + gdk_window_remove_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar); |
372 | + |
373 | + g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (widget)), |
374 | + G_CALLBACK (toplevel_configure_event_cb), scrollbar); |
375 | + g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (widget)), |
376 | + G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar); |
377 | + |
378 | + os_pager_set_parent (OS_PAGER (priv->pager), NULL); |
379 | + |
380 | GTK_WIDGET_CLASS (g_type_class_peek (GTK_TYPE_WIDGET))->unrealize (widget); |
381 | } |
382 |
I love it when you remove code. It's simpler and very likely faster.