Merge lp:~cimi/overlay-scrollbar/remove-parent into lp:overlay-scrollbar

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
Reviewer Review Type Date Requested Status
Loïc Molinari (community) Approve
Review via email: mp+55312@code.launchpad.net

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.
Revision history for this message
Loïc Molinari (loic.molinari) wrote :

I love it when you remove code. It's simpler and very likely faster.

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

Subscribers

People subscribed via source and target branches