summaryrefslogtreecommitdiff
path: root/gdk/quartz
diff options
context:
space:
mode:
authorKristian Rietveld <kris@gtk.org>2010-07-24 10:52:10 +0200
committerBenjamin Otte <otte@redhat.com>2010-08-10 21:02:29 +0200
commit23c9cee274102d19232644f526dfa927cf85d1cd (patch)
tree758bbf99a2d31a8043129d5b1f9077001f397468 /gdk/quartz
parent6a48a042c7a2f61707eeb1f7bfa6438f63be7c04 (diff)
downloadgtk+-23c9cee274102d19232644f526dfa927cf85d1cd.tar.gz
quartz: Fix up _gdk_quartz_window_translate
Diffstat (limited to 'gdk/quartz')
-rw-r--r--gdk/quartz/gdkgeometry-quartz.c26
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