diff options
author | Kristian Rietveld <kris@gtk.org> | 2010-07-24 10:52:10 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2010-08-10 21:02:29 +0200 |
commit | 23c9cee274102d19232644f526dfa927cf85d1cd (patch) | |
tree | 758bbf99a2d31a8043129d5b1f9077001f397468 | |
parent | 6a48a042c7a2f61707eeb1f7bfa6438f63be7c04 (diff) | |
download | gtk+-23c9cee274102d19232644f526dfa927cf85d1cd.tar.gz |
quartz: Fix up _gdk_quartz_window_translate
-rw-r--r-- | gdk/quartz/gdkgeometry-quartz.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/gdk/quartz/gdkgeometry-quartz.c b/gdk/quartz/gdkgeometry-quartz.c index bde84aad94..bd602e33df 100644 --- a/gdk/quartz/gdkgeometry-quartz.c +++ b/gdk/quartz/gdkgeometry-quartz.c @@ -22,32 +22,48 @@ #include "gdkprivate-quartz.h" -/* FIXME: Tis function has never been compiled. - * Please make it work. */ void _gdk_quartz_window_translate (GdkWindow *window, cairo_region_t *area, gint dx, gint dy) { + cairo_region_t *invalidate, *scrolled; GdkWindowObject *private = (GdkWindowObject *)window; GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl; GdkRectangle extents; cairo_region_get_extents (area, &extents); - [window_impl->view scrollRect:NSMakeRect (extents.x, extents.y, extents.width, extents.height) - by:NSMakeSize (dx, dy)]; + [impl->view scrollRect:NSMakeRect (extents.x - dx, extents.y - dy, + extents.width, extents.height) + by:NSMakeSize (dx, dy)]; if (impl->needs_display_region) { + cairo_region_t *intersection; + + /* Invalidate already invalidated area that was moved at new + * location. + */ intersection = cairo_region_copy (impl->needs_display_region); - cairo_region_intersect_rectangle (intersection, extents); + cairo_region_intersect (intersection, area); cairo_region_translate (intersection, dx, dy); _gdk_quartz_window_set_needs_display_in_region (window, intersection); cairo_region_destroy (intersection); } + + /* Calculate newly exposed area that needs invalidation */ + scrolled = cairo_region_copy (area); + cairo_region_translate (scrolled, dx, dy); + + invalidate = cairo_region_copy (area); + cairo_region_subtract (invalidate, scrolled); + cairo_region_destroy (scrolled); + + _gdk_quartz_window_set_needs_display_in_region (window, invalidate); + cairo_region_destroy (invalidate); } gboolean |