summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdk/quartz/GdkQuartzView.c7
-rw-r--r--gdk/quartz/gdkgeometry-quartz.c26
-rw-r--r--gdk/quartz/gdkprivate-quartz.h3
-rw-r--r--gdk/quartz/gdkwindow-quartz.c34
-rw-r--r--gdk/quartz/gdkwindow-quartz.h2
5 files changed, 60 insertions, 12 deletions
diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c
index 761b07fb30..5d643eb984 100644
--- a/gdk/quartz/GdkQuartzView.c
+++ b/gdk/quartz/GdkQuartzView.c
@@ -72,6 +72,13 @@
if (NSEqualRects (rect, NSZeroRect))
return;
+ /* Clear our own bookkeeping of regions that need display */
+ if (impl->needs_display_region)
+ {
+ gdk_region_destroy (impl->needs_display_region);
+ impl->needs_display_region = NULL;
+ }
+
[self getRectsBeingDrawn:&drawn_rects count:&count];
/* Note: arbitrary limit here to not degrade performace too much. It would
diff --git a/gdk/quartz/gdkgeometry-quartz.c b/gdk/quartz/gdkgeometry-quartz.c
index 3e0a26f2b1..06a31f10cc 100644
--- a/gdk/quartz/gdkgeometry-quartz.c
+++ b/gdk/quartz/gdkgeometry-quartz.c
@@ -29,6 +29,32 @@ _gdk_quartz_window_queue_translation (GdkWindow *window,
gint dx,
gint dy)
{
+ GdkWindowObject *private = (GdkWindowObject *)window;
+ GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
+
+ int i, n_rects;
+ GdkRegion *intersection;
+ GdkRectangle *rects;
+
+ /* We will intersect the known region that needs display with the given
+ * area. This intersection will be translated by dx, dy. For the end
+ * result, we will also set that it needs display.
+ */
+
+ if (!impl->needs_display_region)
+ return;
+
+ intersection = gdk_region_copy (impl->needs_display_region);
+ gdk_region_intersect (intersection, area);
+ gdk_region_offset (intersection, dx, dy);
+
+ gdk_region_get_rectangles (intersection, &rects, &n_rects);
+
+ for (i = 0; i < n_rects; i++)
+ _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
+
+ g_free (rects);
+ gdk_region_destroy (intersection);
}
gboolean
diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h
index 2152b6ea43..52834b36d5 100644
--- a/gdk/quartz/gdkprivate-quartz.h
+++ b/gdk/quartz/gdkprivate-quartz.h
@@ -149,6 +149,9 @@ void _gdk_quartz_window_did_resign_main (GdkWindow *window);
void _gdk_quartz_window_debug_highlight (GdkWindow *window,
gint number);
+void _gdk_quartz_window_set_needs_display_in_rect (GdkWindow *window,
+ GdkRectangle *rect);
+
/* Events */
typedef enum {
GDK_QUARTZ_EVENT_SUBTYPE_EVENTLOOP
diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
index a7aaf916c2..bbff7fb90e 100644
--- a/gdk/quartz/gdkwindow-quartz.c
+++ b/gdk/quartz/gdkwindow-quartz.c
@@ -348,11 +348,29 @@ gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
}
void
+_gdk_quartz_window_set_needs_display_in_rect (GdkWindow *window,
+ GdkRectangle *rect)
+{
+ GdkWindowObject *private;
+ GdkWindowImplQuartz *impl;
+
+ private = GDK_WINDOW_OBJECT (window);
+ impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+ if (!impl->needs_display_region)
+ impl->needs_display_region = gdk_region_new ();
+
+ gdk_region_union_with_rect (impl->needs_display_region, rect);
+
+ [impl->view setNeedsDisplayInRect:NSMakeRect (rect->x, rect->y,
+ rect->width, rect->height)];
+
+}
+
+void
_gdk_windowing_window_process_updates_recurse (GdkWindow *window,
GdkRegion *region)
{
- GdkWindowObject *private = (GdkWindowObject *)window;
- GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
int i, n_rects;
GdkRectangle *rects;
@@ -389,10 +407,7 @@ _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
gdk_region_get_rectangles (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)];
- }
+ _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
g_free (rects);
@@ -1294,12 +1309,7 @@ move_resize_window_internal (GdkWindow *window,
gdk_region_get_rectangles (expose_region, &rects, &n_rects);
for (n = 0; n < n_rects; ++n)
- {
- [impl->view setNeedsDisplayInRect:NSMakeRect (rects[n].x,
- rects[n].y,
- rects[n].width,
- rects[n].height)];
- }
+ _gdk_quartz_window_set_needs_display_in_rect (window, &rects[n]);
g_free (rects);
}
diff --git a/gdk/quartz/gdkwindow-quartz.h b/gdk/quartz/gdkwindow-quartz.h
index 89f2ec06bf..8d47512344 100644
--- a/gdk/quartz/gdkwindow-quartz.h
+++ b/gdk/quartz/gdkwindow-quartz.h
@@ -59,6 +59,8 @@ struct _GdkWindowImplQuartz
/* Sorted by z-order */
GList *sorted_children;
+
+ GdkRegion *needs_display_region;
};
struct _GdkWindowImplQuartzClass