summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@imendio.com>2006-03-21 09:36:46 +0000
committerAnders Carlsson <andersca@src.gnome.org>2006-03-21 09:36:46 +0000
commit03c29e1123594581c15288351f713b7d6571aede (patch)
tree059e8c9fd2b7e5dc1848d971cb8cce6bded8672f /gdk
parent6b1510bf232f3cdd584819e15b50299a22500097 (diff)
downloadgdk-pixbuf-03c29e1123594581c15288351f713b7d6571aede.tar.gz
Implement gdk_window_scroll.
2006-03-21 Anders Carlsson <andersca@imendio.com> * gdk/quartz/gdkgeometry-quartz.c: (gdk_window_scroll): Implement gdk_window_scroll.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/quartz/gdkgeometry-quartz.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/gdk/quartz/gdkgeometry-quartz.c b/gdk/quartz/gdkgeometry-quartz.c
index b7ad4c95b..379f24119 100644
--- a/gdk/quartz/gdkgeometry-quartz.c
+++ b/gdk/quartz/gdkgeometry-quartz.c
@@ -27,8 +27,54 @@ gdk_window_scroll (GdkWindow *window,
gint dx,
gint dy)
{
+ NSRect visible_nsrect;
+ GdkRectangle visible_rect, scrolled_rect;
+ GdkRegion *visible_region, *scrolled_region;
+ GdkRectangle *rects;
+ gint n_rects, i;
+ GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
+ GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+ GList *list;
+
g_return_if_fail (GDK_IS_WINDOW (window));
+
+ visible_nsrect = [impl->view visibleRect];
+
+ visible_rect.x = visible_nsrect.origin.x;
+ visible_rect.y = visible_nsrect.origin.y;
+ visible_rect.width = visible_nsrect.size.width;
+ visible_rect.height = visible_nsrect.size.height;
+
+ scrolled_rect = visible_rect;
+ scrolled_rect.x += dx;
+ scrolled_rect.y += dy;
+
+ gdk_rectangle_intersect (&visible_rect, &scrolled_rect, &scrolled_rect);
+
+ visible_region = gdk_region_rectangle (&visible_rect);
+ scrolled_region = gdk_region_rectangle (&scrolled_rect);
+
+ gdk_region_subtract (visible_region, scrolled_region);
+
+ [impl->view scrollRect:[impl->view bounds] by:NSMakeSize(dx, dy)];
+
+ gdk_region_get_rectangles (visible_region, &rects, &n_rects);
+ for (i = 0; i < n_rects; i++)
+ [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y, rects[i].width, rects[i].height)];
- /* FIXME: Implement */
+ g_free (rects);
+
+ gdk_region_destroy (visible_region);
+ gdk_region_destroy (scrolled_region);
+
+ /* Move child windows */
+ for (list = private->children; list; list = list->next)
+ {
+ GdkWindowObject *child = GDK_WINDOW_OBJECT (list->data);
+
+ gdk_window_move (list->data,
+ child->x + dx,
+ child->y + dy);
+ }
}