summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdk/gdkdraw.c12
-rw-r--r--gdk/gdkdrawable.h1
-rw-r--r--gdk/gdkpixmap.c2
-rw-r--r--gdk/gdkwindow.c68
-rw-r--r--gdk/quartz/gdkdrawable-quartz.c1
-rw-r--r--gdk/win32/gdkdrawable-win32.c2
-rw-r--r--gdk/x11/gdkdrawable-x11.c2
7 files changed, 77 insertions, 11 deletions
diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c
index 8c5d4227ac..321b883cb3 100644
--- a/gdk/gdkdraw.c
+++ b/gdk/gdkdraw.c
@@ -663,16 +663,18 @@ gdk_draw_drawable (GdkDrawable *drawable,
composite_impl = GDK_WINDOW_OBJECT (src)->impl;
else
composite_impl = composite;
-
+
/* TODO: For non-native windows this may copy stuff from other overlapping
- windows. We should clip that and clear that area in the destination instead. */
-
- GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable (drawable, gc, composite_impl,
+ windows. We should clip that and (for windows with bg != None) clear that
+ area in the destination instead. */
+
+ GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable (drawable, gc,
+ composite_impl, src,
xsrc - composite_x_offset,
ysrc - composite_y_offset,
xdest, ydest,
width, height);
-
+
g_object_unref (composite);
}
diff --git a/gdk/gdkdrawable.h b/gdk/gdkdrawable.h
index 50904fc2e7..1d8d69471d 100644
--- a/gdk/gdkdrawable.h
+++ b/gdk/gdkdrawable.h
@@ -100,6 +100,7 @@ struct _GdkDrawableClass
void (*draw_drawable) (GdkDrawable *drawable,
GdkGC *gc,
GdkDrawable *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,
diff --git a/gdk/gdkpixmap.c b/gdk/gdkpixmap.c
index de735b91f0..e4d8869286 100644
--- a/gdk/gdkpixmap.c
+++ b/gdk/gdkpixmap.c
@@ -72,6 +72,7 @@ static void gdk_pixmap_draw_text_wc (GdkDrawable *drawable,
static void gdk_pixmap_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkPixmap *original_src,
gint xsrc,
gint ysrc,
gint xdest,
@@ -374,6 +375,7 @@ static void
gdk_pixmap_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkPixmap *original_src,
gint xsrc,
gint ysrc,
gint xdest,
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 1f2388b60f..a2b5d6d618 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -126,6 +126,7 @@ static void gdk_window_draw_text_wc (GdkDrawable *drawable,
static void gdk_window_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,
@@ -3426,6 +3427,7 @@ static void
gdk_window_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,
@@ -3435,7 +3437,7 @@ gdk_window_draw_drawable (GdkDrawable *drawable,
{
GdkWindowObject *private = (GdkWindowObject *)drawable;
OFFSET_GC (gc);
-
+
if (GDK_WINDOW_DESTROYED (drawable))
return;
@@ -3445,9 +3447,8 @@ gdk_window_draw_drawable (GdkDrawable *drawable,
GdkWindowPaint *paint = private->paint_stack->data;
SETUP_PAINT_GC_CLIP (gc);
gdk_draw_drawable (pixmap_impl (paint->pixmap), gc,
- src, xsrc, ysrc,
+ src, xsrc, ysrc,
xdest - x_offset, ydest - y_offset, width, height);
-
RESTORE_PAINT_GC_CLIP (gc);
}
else
@@ -3458,6 +3459,59 @@ gdk_window_draw_drawable (GdkDrawable *drawable,
xdest - x_offset, ydest - y_offset,
width, height);
RESTORE_DIRECT_GC_CLIP(gc);
+
+ /* We might have drawn from an obscured part of a client
+ side window, if so we need to send graphics exposures */
+ if (_gdk_gc_get_exposures (gc) &&
+ GDK_IS_WINDOW (original_src))
+ {
+ GdkRegion *exposure_region;
+ GdkRegion *clip;
+ GdkRectangle r;
+
+ r.x = xdest;
+ r.y = ydest;
+ r.width = width;
+ r.height = height;
+ exposure_region = gdk_region_rectangle (&r);
+
+ if (_gdk_gc_get_subwindow (gc) == GDK_CLIP_BY_CHILDREN)
+ clip = private->clip_region_with_children;
+ else
+ clip = private->clip_region;
+ gdk_region_intersect (exposure_region, clip);
+
+ clip = _gdk_gc_get_clip_region (gc);
+ if (clip)
+ {
+ gdk_region_offset (exposure_region,
+ old_clip_x,
+ old_clip_y);
+ gdk_region_intersect (exposure_region, clip);
+ gdk_region_offset (exposure_region,
+ -old_clip_x,
+ -old_clip_y);
+ }
+
+ /* Note: We don't clip by the clip mask if set, so this
+ may invalidate to much */
+
+ /* Remove the area that is correctly copied from the src.
+ * Note that xsrc/ysrc has been corrected for abs_x/y offsets already,
+ * which need to be undone */
+ clip = gdk_drawable_get_visible_region (original_src);
+ gdk_region_offset (clip,
+ xdest - (xsrc - GDK_WINDOW_OBJECT (original_src)->abs_x),
+ ydest - (ysrc - GDK_WINDOW_OBJECT (original_src)->abs_y));
+ gdk_region_subtract (exposure_region, clip);
+ gdk_region_destroy (clip);
+
+ gdk_window_invalidate_region (GDK_WINDOW (private),
+ exposure_region,
+ _gdk_gc_get_subwindow (gc) == GDK_INCLUDE_INFERIORS);
+
+ gdk_region_destroy (exposure_region);
+ }
}
RESTORE_GC (gc);
@@ -5012,8 +5066,10 @@ gdk_window_invalidate_maybe_recurse (GdkWindow *window,
if (GDK_WINDOW_DESTROYED (window))
return;
-
- if (private->input_only || !GDK_WINDOW_IS_MAPPED (window))
+
+ if (private->input_only ||
+ !GDK_WINDOW_IS_MAPPED (window) ||
+ gdk_region_empty (region))
return;
visible_region = gdk_drawable_get_visible_region (window);
@@ -5086,7 +5142,7 @@ gdk_window_invalidate_maybe_recurse (GdkWindow *window,
gdk_window_schedule_update ((GdkWindow *)impl_window);
}
}
-
+
gdk_region_destroy (visible_region);
}
diff --git a/gdk/quartz/gdkdrawable-quartz.c b/gdk/quartz/gdkdrawable-quartz.c
index 72b678c0c5..673da06477 100644
--- a/gdk/quartz/gdkdrawable-quartz.c
+++ b/gdk/quartz/gdkdrawable-quartz.c
@@ -326,6 +326,7 @@ static void
gdk_quartz_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,
diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c
index 4ccf0b3b60..18997ad0ab 100644
--- a/gdk/win32/gdkdrawable-win32.c
+++ b/gdk/win32/gdkdrawable-win32.c
@@ -87,6 +87,7 @@ static void gdk_win32_draw_text_wc (GdkDrawable *drawable,
static void gdk_win32_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,
@@ -1143,6 +1144,7 @@ static void
gdk_win32_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,
diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c
index e6ea4f1853..90d5c9e8a1 100644
--- a/gdk/x11/gdkdrawable-x11.c
+++ b/gdk/x11/gdkdrawable-x11.c
@@ -88,6 +88,7 @@ static void gdk_x11_draw_text_wc (GdkDrawable *drawable,
static void gdk_x11_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,
@@ -618,6 +619,7 @@ static void
gdk_x11_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
+ GdkDrawable *original_src,
gint xsrc,
gint ysrc,
gint xdest,