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
=== modified file 'os/os-scrollbar.c'
--- os/os-scrollbar.c 2011-03-29 10:35:30 +0000
+++ os/os-scrollbar.c 2011-03-29 11:04:35 +0000
@@ -46,7 +46,6 @@
46 GtkAllocation thumb_all;46 GtkAllocation thumb_all;
47 GObject *pager;47 GObject *pager;
48 GtkWidget *thumb;48 GtkWidget *thumb;
49 GtkWidget *parent;
50 GtkAdjustment *adjustment;49 GtkAdjustment *adjustment;
51 GtkOrientation orientation;50 GtkOrientation orientation;
52 gboolean button_press_event;51 gboolean button_press_event;
@@ -70,7 +69,6 @@
70static void os_scrollbar_grab_notify (GtkWidget *widget, gboolean was_grabbed);69static void os_scrollbar_grab_notify (GtkWidget *widget, gboolean was_grabbed);
71static void os_scrollbar_hide (GtkWidget *widget);70static void os_scrollbar_hide (GtkWidget *widget);
72static void os_scrollbar_map (GtkWidget *widget);71static void os_scrollbar_map (GtkWidget *widget);
73static void os_scrollbar_parent_set (GtkWidget *widget, GtkWidget *old_parent);
74static void os_scrollbar_realize (GtkWidget *widget);72static void os_scrollbar_realize (GtkWidget *widget);
75static void os_scrollbar_show (GtkWidget *widget);73static void os_scrollbar_show (GtkWidget *widget);
76static void os_scrollbar_size_allocate (GtkWidget *widget, GdkRectangle *allocation);74static void os_scrollbar_size_allocate (GtkWidget *widget, GdkRectangle *allocation);
@@ -91,7 +89,6 @@
91static gint os_scrollbar_sanitize_y (OsScrollbar *scrollbar, gint y);89static gint os_scrollbar_sanitize_y (OsScrollbar *scrollbar, gint y);
92static void os_scrollbar_store_window_position (OsScrollbar *scrollbar);90static void os_scrollbar_store_window_position (OsScrollbar *scrollbar);
93static void os_scrollbar_swap_adjustment (OsScrollbar *scrollbar, GtkAdjustment *adjustment);91static void os_scrollbar_swap_adjustment (OsScrollbar *scrollbar, GtkAdjustment *adjustment);
94static void os_scrollbar_swap_parent (OsScrollbar *scrollbar, GtkWidget *parent);
95static void os_scrollbar_swap_thumb (OsScrollbar *scrollbar, GtkWidget *thumb);92static void os_scrollbar_swap_thumb (OsScrollbar *scrollbar, GtkWidget *thumb);
96static gboolean thumb_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data);93static gboolean thumb_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data);
97static gboolean thumb_button_release_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data);94static gboolean thumb_button_release_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data);
@@ -104,8 +101,6 @@
104static void pager_set_state (OsScrollbar *scrollbar);101static void pager_set_state (OsScrollbar *scrollbar);
105static void adjustment_changed_cb (GtkAdjustment *adjustment, gpointer user_data);102static void adjustment_changed_cb (GtkAdjustment *adjustment, gpointer user_data);
106static void adjustment_value_changed_cb (GtkAdjustment *adjustment, gpointer user_data);103static void adjustment_value_changed_cb (GtkAdjustment *adjustment, gpointer user_data);
107static void parent_realize_cb (GtkWidget *widget, gpointer user_data);
108static void parent_unrealize_cb (GtkWidget *widget, gpointer user_data);
109static gboolean toplevel_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data);104static gboolean toplevel_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data);
110static GdkFilterReturn toplevel_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer user_data);105static GdkFilterReturn toplevel_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer user_data);
111static gboolean toplevel_leave_notify_event_cb (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data);106static gboolean toplevel_leave_notify_event_cb (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data);
@@ -481,7 +476,7 @@
481476
482 priv = scrollbar->priv;477 priv = scrollbar->priv;
483478
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);
485480
486 if (priv->orientation == GTK_ORIENTATION_VERTICAL)481 if (priv->orientation == GTK_ORIENTATION_VERTICAL)
487 {482 {
@@ -527,38 +522,6 @@
527 }522 }
528}523}
529524
530/* Swap the parent pointer. */
531static void
532os_scrollbar_swap_parent (OsScrollbar *scrollbar,
533 GtkWidget *parent)
534{
535 OsScrollbarPrivate *priv;
536
537 priv = scrollbar->priv;
538
539 if (priv->parent != NULL)
540 {
541 g_signal_handlers_disconnect_by_func (G_OBJECT (priv->parent),
542 G_CALLBACK (parent_realize_cb), scrollbar);
543 g_signal_handlers_disconnect_by_func (G_OBJECT (priv->parent),
544 G_CALLBACK (parent_unrealize_cb), scrollbar);
545
546 g_object_unref (priv->parent);
547 }
548
549 priv->parent = parent;
550
551 if (priv->parent != NULL)
552 {
553 g_object_ref_sink (priv->parent);
554
555 g_signal_connect (G_OBJECT (priv->parent), "realize",
556 G_CALLBACK (parent_realize_cb), scrollbar);
557 g_signal_connect (G_OBJECT (priv->parent), "unrealize",
558 G_CALLBACK (parent_unrealize_cb), scrollbar);
559 }
560}
561
562/* Swap the thumb pointer. */525/* Swap the thumb pointer. */
563static void526static void
564os_scrollbar_swap_thumb (OsScrollbar *scrollbar,527os_scrollbar_swap_thumb (OsScrollbar *scrollbar,
@@ -628,9 +591,8 @@
628 scrollbar = OS_SCROLLBAR (user_data);591 scrollbar = OS_SCROLLBAR (user_data);
629 priv = scrollbar->priv;592 priv = scrollbar->priv;
630593
631/* os_scrollbar_map (widget);*/594 gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (scrollbar))));
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);
633 os_present_gdk_window_with_timestamp (priv->parent, event->time);
634596
635 priv->button_press_event = TRUE;597 priv->button_press_event = TRUE;
636 priv->motion_notify_event = FALSE;598 priv->motion_notify_event = FALSE;
@@ -752,7 +714,7 @@
752 priv = scrollbar->priv;714 priv = scrollbar->priv;
753715
754 xid = GDK_WINDOW_XID (gtk_widget_get_window (priv->thumb));716 xid = GDK_WINDOW_XID (gtk_widget_get_window (priv->thumb));
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)));
756 display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (scrollbar)));718 display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (scrollbar)));
757719
758 changes.sibling = xid_parent;720 changes.sibling = xid_parent;
@@ -818,7 +780,6 @@
818 scrollbar = OS_SCROLLBAR (user_data);780 scrollbar = OS_SCROLLBAR (user_data);
819 priv = scrollbar->priv;781 priv = scrollbar->priv;
820782
821 /* XXX improve speed by not rendering when moving */
822 if (priv->button_press_event)783 if (priv->button_press_event)
823 {784 {
824 gint x, y;785 gint x, y;
@@ -953,8 +914,8 @@
953914
954 priv = scrollbar->priv;915 priv = scrollbar->priv;
955916
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))) !=
957 gtk_widget_get_window (priv->parent))918 gtk_widget_get_window (GTK_WIDGET (scrollbar)))
958 os_pager_set_active (OS_PAGER (priv->pager), FALSE);919 os_pager_set_active (OS_PAGER (priv->pager), FALSE);
959 else920 else
960 os_pager_set_active (OS_PAGER (priv->pager), TRUE);921 os_pager_set_active (OS_PAGER (priv->pager), TRUE);
@@ -1021,59 +982,6 @@
1021 pager_move (scrollbar);982 pager_move (scrollbar);
1022}983}
1023984
1024static void
1025parent_realize_cb (GtkWidget *widget,
1026 gpointer user_data)
1027{
1028 OsScrollbar *scrollbar;
1029 OsScrollbarPrivate *priv;
1030
1031 scrollbar = OS_SCROLLBAR (user_data);
1032 priv = scrollbar->priv;
1033
1034 if (priv->filter == FALSE && priv->proximity == TRUE)
1035 {
1036 priv->filter = TRUE;
1037 gdk_window_add_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar);
1038 }
1039
1040 g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), "configure-event",
1041 G_CALLBACK (toplevel_configure_event_cb), scrollbar);
1042 g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (priv->parent)), "leave-notify-event",
1043 G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar);
1044
1045 os_scrollbar_calc_layout_pager (scrollbar, priv->adjustment->value);
1046
1047 os_pager_set_parent (OS_PAGER (priv->pager), priv->parent);
1048
1049 os_scrollbar_store_window_position (scrollbar);
1050}
1051
1052static void
1053parent_unrealize_cb (GtkWidget *widget,
1054 gpointer user_data)
1055{
1056 OsScrollbar *scrollbar;
1057 OsScrollbarPrivate *priv;
1058
1059 scrollbar = OS_SCROLLBAR (user_data);
1060 priv = scrollbar->priv;
1061
1062 /* FIXME(Cimi) check if
1063 * gtk_widget_get_window (priv->parent) and
1064 * gtk_widget_get_toplevel (priv->parent))
1065 * are ready to use, otherwise we might need to store them in priv */
1066
1067 gdk_window_remove_filter (gtk_widget_get_window (priv->parent), toplevel_filter_func, scrollbar);
1068
1069 g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (priv->parent)),
1070 G_CALLBACK (toplevel_configure_event_cb), scrollbar);
1071 g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (priv->parent)),
1072 G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar);
1073
1074 os_pager_set_parent (OS_PAGER (priv->pager), NULL);
1075}
1076
1077static gboolean985static gboolean
1078toplevel_configure_event_cb (GtkWidget *widget,986toplevel_configure_event_cb (GtkWidget *widget,
1079 GdkEventConfigure *event,987 GdkEventConfigure *event,
@@ -1112,7 +1020,6 @@
1112 priv = scrollbar->priv;1020 priv = scrollbar->priv;
1113 xevent = gdkxevent;1021 xevent = gdkxevent;
11141022
1115 g_return_val_if_fail (priv->parent != NULL, GDK_FILTER_CONTINUE);
1116 g_return_val_if_fail (priv->pager != NULL, GDK_FILTER_CONTINUE);1023 g_return_val_if_fail (priv->pager != NULL, GDK_FILTER_CONTINUE);
1117 g_return_val_if_fail (priv->thumb != NULL, GDK_FILTER_CONTINUE);1024 g_return_val_if_fail (priv->thumb != NULL, GDK_FILTER_CONTINUE);
11181025
@@ -1135,7 +1042,7 @@
1135 {1042 {
1136 gint x, y, x_pos, y_pos;1043 gint x, y, x_pos, y_pos;
11371044
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);
11391046
1140 x = priv->thumb_all.x;1047 x = priv->thumb_all.x;
1141 y = CLAMP (xevent->xmotion.y - priv->slider.height / 2,1048 y = CLAMP (xevent->xmotion.y - priv->slider.height / 2,
@@ -1150,7 +1057,6 @@
1150 }1057 }
11511058
1152 gtk_widget_show (GTK_WIDGET (priv->thumb));1059 gtk_widget_show (GTK_WIDGET (priv->thumb));
1153/* os_scrollbar_map (GTK_WIDGET (scrollbar));*/
1154 }1060 }
1155 else1061 else
1156 {1062 {
@@ -1171,7 +1077,7 @@
1171 {1077 {
1172 gint x, y, x_pos, y_pos;1078 gint x, y, x_pos, y_pos;
11731079
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);
11751081
1176 x = CLAMP (xevent->xmotion.x - priv->slider.width / 2,1082 x = CLAMP (xevent->xmotion.x - priv->slider.width / 2,
1177 priv->thumb_all.x + priv->overlay.x,1083 priv->thumb_all.x + priv->overlay.x,
@@ -1186,7 +1092,6 @@
1186 }1092 }
11871093
1188 gtk_widget_show (GTK_WIDGET (priv->thumb));1094 gtk_widget_show (GTK_WIDGET (priv->thumb));
1189/* os_scrollbar_map (GTK_WIDGET (scrollbar));*/
1190 }1095 }
1191 else1096 else
1192 {1097 {
@@ -1204,8 +1109,8 @@
1204 /* code to check if the window is active */1109 /* code to check if the window is active */
1205 if (xevent->type == PropertyNotify)1110 if (xevent->type == PropertyNotify)
1206 {1111 {
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))) !=
1208 gtk_widget_get_window (priv->parent))1113 gtk_widget_get_window (GTK_WIDGET (scrollbar)))
1209 {1114 {
1210 gtk_widget_hide (GTK_WIDGET (priv->thumb));1115 gtk_widget_hide (GTK_WIDGET (priv->thumb));
1211 os_pager_set_active (OS_PAGER (priv->pager), FALSE);1116 os_pager_set_active (OS_PAGER (priv->pager), FALSE);
@@ -1255,7 +1160,6 @@
1255 widget_class->hide = os_scrollbar_hide;1160 widget_class->hide = os_scrollbar_hide;
1256 widget_class->map = os_scrollbar_map;1161 widget_class->map = os_scrollbar_map;
1257 widget_class->realize = os_scrollbar_realize;1162 widget_class->realize = os_scrollbar_realize;
1258 widget_class->parent_set = os_scrollbar_parent_set;
1259 widget_class->show = os_scrollbar_show;1163 widget_class->show = os_scrollbar_show;
1260 widget_class->size_allocate = os_scrollbar_size_allocate;1164 widget_class->size_allocate = os_scrollbar_size_allocate;
1261 widget_class->unmap = os_scrollbar_unmap;1165 widget_class->unmap = os_scrollbar_unmap;
@@ -1308,7 +1212,6 @@
1308 priv = scrollbar->priv;1212 priv = scrollbar->priv;
13091213
1310 os_scrollbar_swap_adjustment (scrollbar, NULL);1214 os_scrollbar_swap_adjustment (scrollbar, NULL);
1311 os_scrollbar_swap_parent (scrollbar, NULL);
1312 os_scrollbar_swap_thumb (scrollbar, NULL);1215 os_scrollbar_swap_thumb (scrollbar, NULL);
13131216
1314 if (priv->pager != NULL)1217 if (priv->pager != NULL)
@@ -1357,73 +1260,40 @@
1357 if (priv->fullsize == FALSE)1260 if (priv->fullsize == FALSE)
1358 os_pager_show (OS_PAGER (priv->pager));1261 os_pager_show (OS_PAGER (priv->pager));
13591262
1360 if (gtk_widget_get_realized (priv->parent) && priv->filter == FALSE)1263 if (gtk_widget_get_realized (widget) && priv->filter == FALSE)
1361 {1264 {
1362 priv->filter = TRUE;1265 priv->filter = TRUE;
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);
1364 }1267 }
1365
1366#if 0
1367 Display *display;
1368 GtkWidget *parent;
1369 XWindowChanges changes;
1370 guint32 xid, xid_parent;
1371 unsigned int value_mask = CWSibling | CWStackMode;
1372 int res;
1373
1374 parent = gtk_widget_get_parent (widget);
1375
1376 xid = GDK_WINDOW_XID (gtk_widget_get_window (widget));
1377 xid_parent = GDK_WINDOW_XID (gtk_widget_get_window (parent));
1378 display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (widget));
1379
1380 changes.sibling = xid_parent;
1381 changes.stack_mode = Above;
1382
1383 gdk_error_trap_push ();
1384 XConfigureWindow (display, xid, value_mask, &changes);
1385
1386 gdk_flush ();
1387 if ((res = gdk_error_trap_pop ()))
1388 {
1389 XEvent event;
1390 Window xroot = gdk_x11_get_default_root_xwindow ();
1391
1392 /* Synthetic ConfigureRequest (so it looks to the window manager
1393 * like a normal ConfigureRequest) so it can handle that
1394 * and *actually* Configure the window without errors
1395 */
1396 event.type = ConfigureRequest;
1397
1398 /* The WM will know the event is synthetic since the send_event
1399 * field is always set */
1400 event.xconfigurerequest.window = xid;
1401 event.xconfigurerequest.parent = xid_parent;
1402 event.xconfigurerequest.detail = changes.stack_mode;
1403 event.xconfigurerequest.above = changes.sibling;
1404 event.xconfigurerequest.value_mask = value_mask;
1405
1406 /* Sends the event to the root window (which the WM has the Selection
1407 * on) so now Compiz will get a ConfigureRequest for the scrollbar
1408 * to stack relative to the reparented window */
1409 XSendEvent (display, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &event);
1410
1411 g_warning ("Received X error: %d, working around\n", res);
1412 }
1413#endif
1414}
1415
1416static void
1417os_scrollbar_parent_set (GtkWidget *widget,
1418 GtkWidget *old_parent)
1419{
1420 os_scrollbar_swap_parent (OS_SCROLLBAR (widget), gtk_widget_get_parent (widget));
1421}1268}
14221269
1423static void1270static void
1424os_scrollbar_realize (GtkWidget *widget)1271os_scrollbar_realize (GtkWidget *widget)
1425{1272{
1273 OsScrollbar *scrollbar;
1274 OsScrollbarPrivate *priv;
1275
1276 scrollbar = OS_SCROLLBAR (widget);
1277 priv = scrollbar->priv;
1278
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);
1280
1281 if (priv->filter == FALSE && priv->proximity == TRUE)
1282 {
1283 priv->filter = TRUE;
1284 gdk_window_add_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar);
1285 }
1286
1287 g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)), "configure-event",
1288 G_CALLBACK (toplevel_configure_event_cb), scrollbar);
1289 g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)), "leave-notify-event",
1290 G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar);
1291
1292 os_scrollbar_calc_layout_pager (scrollbar, priv->adjustment->value);
1293
1294 os_pager_set_parent (OS_PAGER (priv->pager), widget);
1295
1296 os_scrollbar_store_window_position (scrollbar);
1427}1297}
14281298
1429static void1299static void
@@ -1513,10 +1383,10 @@
15131383
1514 gtk_widget_hide (priv->thumb);1384 gtk_widget_hide (priv->thumb);
15151385
1516 if (gtk_widget_get_realized (priv->parent) && priv->filter == TRUE)1386 if (gtk_widget_get_realized (widget) && priv->filter == TRUE)
1517 {1387 {
1518 priv->filter = FALSE;1388 priv->filter = FALSE;
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);
1520 }1390 }
1521}1391}
15221392
@@ -1531,6 +1401,15 @@
15311401
1532 gtk_widget_hide (priv->thumb);1402 gtk_widget_hide (priv->thumb);
15331403
1404 gdk_window_remove_filter (gtk_widget_get_window (widget), toplevel_filter_func, scrollbar);
1405
1406 g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (widget)),
1407 G_CALLBACK (toplevel_configure_event_cb), scrollbar);
1408 g_signal_handlers_disconnect_by_func (G_OBJECT (gtk_widget_get_toplevel (widget)),
1409 G_CALLBACK (toplevel_leave_notify_event_cb), scrollbar);
1410
1411 os_pager_set_parent (OS_PAGER (priv->pager), NULL);
1412
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);
1535}1414}
15361415

Subscribers

People subscribed via source and target branches