diff options
author | Anders Carlsson <andersca@imendio.com> | 2006-03-21 09:36:46 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@src.gnome.org> | 2006-03-21 09:36:46 +0000 |
commit | 03c29e1123594581c15288351f713b7d6571aede (patch) | |
tree | 059e8c9fd2b7e5dc1848d971cb8cce6bded8672f /gdk | |
parent | 6b1510bf232f3cdd584819e15b50299a22500097 (diff) | |
download | gdk-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.c | 48 |
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); + } } |