diff options
author | Alexander Larsson <alla@lysator.liu.se> | 2001-06-13 21:40:37 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2001-06-13 21:40:37 +0000 |
commit | be12f525266d91ca2977ff92bc1524ad5a60e5e2 (patch) | |
tree | b967976abe4158ade3b90cbb9cef0ca24e03d168 /gdk/linux-fb | |
parent | b858eb9f59976522592449b40a15e73b2006de57 (diff) | |
download | gdk-pixbuf-be12f525266d91ca2977ff92bc1524ad5a60e5e2.tar.gz |
Unify shaped window code and make it repaint the area that used to be part
2001-06-13 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkwindow-fb.c:
Unify shaped window code and make it repaint the area that used
to be part of the shape, but isn't anymore.
Diffstat (limited to 'gdk/linux-fb')
-rw-r--r-- | gdk/linux-fb/gdkwindow-fb.c | 88 |
1 files changed, 61 insertions, 27 deletions
diff --git a/gdk/linux-fb/gdkwindow-fb.c b/gdk/linux-fb/gdkwindow-fb.c index 894165030..e5d415475 100644 --- a/gdk/linux-fb/gdkwindow-fb.c +++ b/gdk/linux-fb/gdkwindow-fb.c @@ -1868,31 +1868,79 @@ gdk_fb_window_get_abs_shape (GdkDrawable *window) return shape; } -void -gdk_window_shape_combine_mask (GdkWindow *window, - GdkBitmap *mask, - gint x, gint y) + +static void +_gdk_window_shape_combine_region (GdkWindow *window, + GdkRegion *shape, + gint x, + gint y) { GdkWindowFBData *private; + GdkDrawableFBData *drawable_private; + GdkRegion *old_region = NULL; + GdkRegion *new_region = NULL; + GdkRectangle rect; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); private = GDK_WINDOW_IMPL_FBDATA (window); + drawable_private = GDK_DRAWABLE_IMPL_FBDATA (window); + + if (GDK_WINDOW_IS_MAPPED (window)) + { + old_region = gdk_fb_window_get_abs_shape (window); + if (old_region == NULL) + { + rect.x = drawable_private->llim_x; + rect.y = drawable_private->llim_y; + rect.width = drawable_private->lim_x - rect.x; + rect.height = drawable_private->lim_y - rect.y; + old_region = gdk_region_rectangle (&rect); + } + } if (private->shape && private->shape != GDK_FB_USE_CHILD_SHAPE) gdk_region_destroy (private->shape); - /* Warning. HUGE hack */ - if (mask == GDK_FB_USE_CHILD_SHAPE) - private->shape = GDK_FB_USE_CHILD_SHAPE; - else if (mask) + if (shape) { - private->shape = gdk_fb_region_create_from_bitmap (mask); - gdk_region_offset (private->shape, x, y); + private->shape = shape; + if (shape != GDK_FB_USE_CHILD_SHAPE) + gdk_region_offset (private->shape, x, y); } else private->shape = NULL; + + if (GDK_WINDOW_IS_MAPPED (window)) + { + new_region = gdk_fb_window_get_abs_shape (window); + if (new_region == NULL) + { + rect.x = drawable_private->llim_x; + rect.y = drawable_private->llim_y; + rect.width = drawable_private->lim_x - rect.x; + rect.height = drawable_private->lim_y - rect.y; + new_region = gdk_region_rectangle (&rect); + } + + gdk_region_subtract (old_region, new_region); + gdk_region_destroy (new_region); + gdk_window_invalidate_region (gdk_parent_root, old_region, TRUE); + gdk_region_destroy (old_region); + } +} + +void +gdk_window_shape_combine_mask (GdkWindow *window, + GdkBitmap *mask, + gint x, gint y) +{ + _gdk_window_shape_combine_region (window, + (mask == GDK_FB_USE_CHILD_SHAPE)? + GDK_FB_USE_CHILD_SHAPE : + gdk_fb_region_create_from_bitmap (mask), + x, y); } void @@ -1901,23 +1949,9 @@ gdk_window_shape_combine_region (GdkWindow *window, gint x, gint y) { - GdkWindowFBData *private; - - g_return_if_fail (window != NULL); - g_return_if_fail (GDK_IS_WINDOW (window)); - - private = GDK_WINDOW_IMPL_FBDATA (window); - - if (private->shape && private->shape != GDK_FB_USE_CHILD_SHAPE) - gdk_region_destroy (private->shape); - - if (shape) - { - private->shape = gdk_region_copy (shape); - gdk_region_offset (private->shape, x, y); - } - else - private->shape = NULL; + _gdk_window_shape_combine_region (window, + gdk_region_copy (shape), + x, y); } void |