+ gtk_pizza_adjust_allocations (pizza, -dx, -dy);
+
+ if (pizza->shadow_type == GTK_MYSHADOW_NONE)
+ border = 0;
+ else
+ if (pizza->shadow_type == GTK_MYSHADOW_THIN)
+ border = 1;
+ else
+ border = 2;
+
+ x = 0;
+ y = 0;
+ w = widget->allocation.width - 2*border;
+ h = widget->allocation.height - 2*border;
+
+ if (dx > 0)
+ {
+ if (gravity_works)
+ {
+ gdk_window_resize (pizza->bin_window,
+ w + dx,
+ h);
+ gdk_window_move (pizza->bin_window, x-dx, y);
+ gdk_window_move_resize (pizza->bin_window, x, y, w, h );
+ }
+ else
+ {
+ /* FIXME */
+ }
+
+ gtk_pizza_expose_area (pizza,
+ MAX ((gint)w - dx, 0),
+ 0,
+ MIN (dx, w),
+ h);
+ }
+ else if (dx < 0)
+ {
+ if (gravity_works)
+ {
+ gdk_window_move_resize (pizza->bin_window,
+ x + dx,
+ y,
+ w - dx,
+ h);
+ gdk_window_move (pizza->bin_window, x, y);
+ gdk_window_resize (pizza->bin_window, w, h );
+ }
+ else
+ {
+ /* FIXME */
+ }
+
+ gtk_pizza_expose_area (pizza,
+ 0,
+ 0,
+ MIN (-dx, w),
+ h);
+ }
+
+ if (dy > 0)
+ {
+ if (gravity_works)
+ {
+ gdk_window_resize (pizza->bin_window, w, h + dy);
+ gdk_window_move (pizza->bin_window, x, y-dy);
+ gdk_window_move_resize (pizza->bin_window,
+ x, y, w, h );
+ }
+ else
+ {
+ /* FIXME */
+ }
+
+ gtk_pizza_expose_area (pizza,
+ 0,
+ MAX ((gint)h - dy, 0),
+ w,
+ MIN (dy, h));
+ }
+ else if (dy < 0)
+ {
+ if (gravity_works)
+ {
+ gdk_window_move_resize (pizza->bin_window,
+ x, y+dy, w, h - dy );
+ gdk_window_move (pizza->bin_window, x, y);
+ gdk_window_resize (pizza->bin_window, w, h );
+ }
+ else
+ {
+ /* FIXME */
+ }
+ gtk_pizza_expose_area (pizza,
+ 0,
+ 0,
+ w,
+ MIN (-dy, (gint)h));
+ }
+
+ gtk_pizza_position_children (pizza);
+
+ /* We have to make sure that all exposes from this scroll get
+ * processed before we scroll again, or the expose events will
+ * have invalid coordinates.
+ *
+ * We also do expose events for other windows, since otherwise
+ * their updating will fall behind the scrolling
+ *
+ * This also avoids a problem in pre-1.0 GTK where filters don't
+ * have access to configure events that were compressed.
+ */
+
+ gdk_flush();
+ while (XCheckIfEvent(GDK_WINDOW_XDISPLAY (pizza->bin_window),
+ &xevent,
+ gtk_pizza_expose_predicate,
+ (XPointer)&GDK_WINDOW_XWINDOW (pizza->bin_window)))
+ {
+ GdkEvent event;
+ GtkWidget *event_widget;
+
+ if ((xevent.xany.window == GDK_WINDOW_XWINDOW (pizza->bin_window)) &&
+ (gtk_pizza_filter (&xevent, &event, pizza) == GDK_FILTER_REMOVE))
+ continue;
+
+ if (xevent.type == Expose)
+ {
+ event.expose.window = gdk_window_lookup (xevent.xany.window);
+ gdk_window_get_user_data (event.expose.window,
+ (gpointer *)&event_widget);
+
+ if (event_widget)
+ {
+ event.expose.type = GDK_EXPOSE;
+ event.expose.area.x = xevent.xexpose.x;
+ event.expose.area.y = xevent.xexpose.y;
+ event.expose.area.width = xevent.xexpose.width;
+ event.expose.area.height = xevent.xexpose.height;
+ event.expose.count = xevent.xexpose.count;
+
+ gdk_window_ref (event.expose.window);
+ gtk_widget_event (event_widget, &event);
+ gdk_window_unref (event.expose.window);
+ }
+ }