]> Pileus Git - ~andy/gtk/commitdiff
Implement gdk_window_scroll.
authorAnders Carlsson <andersca@imendio.com>
Tue, 21 Mar 2006 09:36:46 +0000 (09:36 +0000)
committerAnders Carlsson <andersca@src.gnome.org>
Tue, 21 Mar 2006 09:36:46 +0000 (09:36 +0000)
2006-03-21  Anders Carlsson  <andersca@imendio.com>

        * gdk/quartz/gdkgeometry-quartz.c:
        (gdk_window_scroll):
        Implement gdk_window_scroll.

ChangeLog
ChangeLog.pre-2-10
gdk/quartz/gdkgeometry-quartz.c

index 69fda700af087bfc01b4027b79d803950c01e7fe..f8e0920b8bad544d0ebfb49849d3cbdb08e8a9a7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-03-21  Anders Carlsson  <andersca@imendio.com>
+
+        * gdk/quartz/gdkgeometry-quartz.c:
+        (gdk_window_scroll):
+        Implement gdk_window_scroll.
+
 2006-03-21  Anders Carlsson  <andersca@imendio.com>
 
         * gdk/quartz/GdkQuartzWindow.c:
index 69fda700af087bfc01b4027b79d803950c01e7fe..f8e0920b8bad544d0ebfb49849d3cbdb08e8a9a7 100644 (file)
@@ -1,3 +1,9 @@
+2006-03-21  Anders Carlsson  <andersca@imendio.com>
+
+        * gdk/quartz/gdkgeometry-quartz.c:
+        (gdk_window_scroll):
+        Implement gdk_window_scroll.
+
 2006-03-21  Anders Carlsson  <andersca@imendio.com>
 
         * gdk/quartz/GdkQuartzWindow.c:
index b7ad4c95b8e9f68aeaa245802727d10e968f02b2..379f241192ebfc3f4d5f7313024cc957e43e32fd 100644 (file)
@@ -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);
+    }
 }