Take shaped windows in consideration when generating clip region.

2001-01-12  Alexander Larsson  <alexl@redhat.com>

	* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
	windows in consideration when generating clip region.

	* gdk/linux-fb/gdkfb.h:
	Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.

	* gdk/linux-fb/gdkprivate-fb.h:
	Add shape to GdkWindowFBDatat.
	exported gdk_fb_window_get_abs_shape().
	removed gdk_fb_draw_lines declaration.

	* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
	Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
	send focus changes when there is a grabbed window.
	(gdk_window_get_pointer): Handle shaped windows.
	(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
	(gdk_fb_window_peek_shape): Returns the shape for a window,
	handles GDK_FB_USE_CHILD_SHAPE.
	(gdk_fb_window_get_abs_shape): Returns the shape of the window,
	offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
	(gdk_window_shape_combine_mask): Implement.

	* gtk/gtkwindow-decorate.c:
	HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
	setting the shape of a window makes the window transparent.
This commit is contained in:
Alexander Larsson 2001-01-12 15:45:26 +00:00 committed by Alexander Larsson
parent 696f0626bc
commit 058c2d9320
12 changed files with 385 additions and 23 deletions

View File

@ -1,3 +1,31 @@
2001-01-12 Alexander Larsson <alexl@redhat.com>
* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
windows in consideration when generating clip region.
* gdk/linux-fb/gdkfb.h:
Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.
* gdk/linux-fb/gdkprivate-fb.h:
Add shape to GdkWindowFBDatat.
exported gdk_fb_window_get_abs_shape().
removed gdk_fb_draw_lines declaration.
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
send focus changes when there is a grabbed window.
(gdk_window_get_pointer): Handle shaped windows.
(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
(gdk_fb_window_peek_shape): Returns the shape for a window,
handles GDK_FB_USE_CHILD_SHAPE.
(gdk_fb_window_get_abs_shape): Returns the shape of the window,
offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
(gdk_window_shape_combine_mask): Implement.
* gtk/gtkwindow-decorate.c:
HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
setting the shape of a window makes the window transparent.
2001-01-11 Havoc Pennington <hp@redhat.com> 2001-01-11 Havoc Pennington <hp@redhat.com>
* gtk/gtktreemodelsimple.h: Oops, broke some macros * gtk/gtktreemodelsimple.h: Oops, broke some macros

View File

@ -1,3 +1,31 @@
2001-01-12 Alexander Larsson <alexl@redhat.com>
* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
windows in consideration when generating clip region.
* gdk/linux-fb/gdkfb.h:
Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.
* gdk/linux-fb/gdkprivate-fb.h:
Add shape to GdkWindowFBDatat.
exported gdk_fb_window_get_abs_shape().
removed gdk_fb_draw_lines declaration.
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
send focus changes when there is a grabbed window.
(gdk_window_get_pointer): Handle shaped windows.
(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
(gdk_fb_window_peek_shape): Returns the shape for a window,
handles GDK_FB_USE_CHILD_SHAPE.
(gdk_fb_window_get_abs_shape): Returns the shape of the window,
offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
(gdk_window_shape_combine_mask): Implement.
* gtk/gtkwindow-decorate.c:
HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
setting the shape of a window makes the window transparent.
2001-01-11 Havoc Pennington <hp@redhat.com> 2001-01-11 Havoc Pennington <hp@redhat.com>
* gtk/gtktreemodelsimple.h: Oops, broke some macros * gtk/gtktreemodelsimple.h: Oops, broke some macros

View File

@ -1,3 +1,31 @@
2001-01-12 Alexander Larsson <alexl@redhat.com>
* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
windows in consideration when generating clip region.
* gdk/linux-fb/gdkfb.h:
Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.
* gdk/linux-fb/gdkprivate-fb.h:
Add shape to GdkWindowFBDatat.
exported gdk_fb_window_get_abs_shape().
removed gdk_fb_draw_lines declaration.
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
send focus changes when there is a grabbed window.
(gdk_window_get_pointer): Handle shaped windows.
(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
(gdk_fb_window_peek_shape): Returns the shape for a window,
handles GDK_FB_USE_CHILD_SHAPE.
(gdk_fb_window_get_abs_shape): Returns the shape of the window,
offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
(gdk_window_shape_combine_mask): Implement.
* gtk/gtkwindow-decorate.c:
HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
setting the shape of a window makes the window transparent.
2001-01-11 Havoc Pennington <hp@redhat.com> 2001-01-11 Havoc Pennington <hp@redhat.com>
* gtk/gtktreemodelsimple.h: Oops, broke some macros * gtk/gtktreemodelsimple.h: Oops, broke some macros

View File

@ -1,3 +1,31 @@
2001-01-12 Alexander Larsson <alexl@redhat.com>
* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
windows in consideration when generating clip region.
* gdk/linux-fb/gdkfb.h:
Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.
* gdk/linux-fb/gdkprivate-fb.h:
Add shape to GdkWindowFBDatat.
exported gdk_fb_window_get_abs_shape().
removed gdk_fb_draw_lines declaration.
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
send focus changes when there is a grabbed window.
(gdk_window_get_pointer): Handle shaped windows.
(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
(gdk_fb_window_peek_shape): Returns the shape for a window,
handles GDK_FB_USE_CHILD_SHAPE.
(gdk_fb_window_get_abs_shape): Returns the shape of the window,
offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
(gdk_window_shape_combine_mask): Implement.
* gtk/gtkwindow-decorate.c:
HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
setting the shape of a window makes the window transparent.
2001-01-11 Havoc Pennington <hp@redhat.com> 2001-01-11 Havoc Pennington <hp@redhat.com>
* gtk/gtktreemodelsimple.h: Oops, broke some macros * gtk/gtktreemodelsimple.h: Oops, broke some macros

View File

@ -1,3 +1,31 @@
2001-01-12 Alexander Larsson <alexl@redhat.com>
* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
windows in consideration when generating clip region.
* gdk/linux-fb/gdkfb.h:
Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.
* gdk/linux-fb/gdkprivate-fb.h:
Add shape to GdkWindowFBDatat.
exported gdk_fb_window_get_abs_shape().
removed gdk_fb_draw_lines declaration.
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
send focus changes when there is a grabbed window.
(gdk_window_get_pointer): Handle shaped windows.
(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
(gdk_fb_window_peek_shape): Returns the shape for a window,
handles GDK_FB_USE_CHILD_SHAPE.
(gdk_fb_window_get_abs_shape): Returns the shape of the window,
offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
(gdk_window_shape_combine_mask): Implement.
* gtk/gtkwindow-decorate.c:
HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
setting the shape of a window makes the window transparent.
2001-01-11 Havoc Pennington <hp@redhat.com> 2001-01-11 Havoc Pennington <hp@redhat.com>
* gtk/gtktreemodelsimple.h: Oops, broke some macros * gtk/gtktreemodelsimple.h: Oops, broke some macros

View File

@ -1,3 +1,31 @@
2001-01-12 Alexander Larsson <alexl@redhat.com>
* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
windows in consideration when generating clip region.
* gdk/linux-fb/gdkfb.h:
Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.
* gdk/linux-fb/gdkprivate-fb.h:
Add shape to GdkWindowFBDatat.
exported gdk_fb_window_get_abs_shape().
removed gdk_fb_draw_lines declaration.
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
send focus changes when there is a grabbed window.
(gdk_window_get_pointer): Handle shaped windows.
(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
(gdk_fb_window_peek_shape): Returns the shape for a window,
handles GDK_FB_USE_CHILD_SHAPE.
(gdk_fb_window_get_abs_shape): Returns the shape of the window,
offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
(gdk_window_shape_combine_mask): Implement.
* gtk/gtkwindow-decorate.c:
HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
setting the shape of a window makes the window transparent.
2001-01-11 Havoc Pennington <hp@redhat.com> 2001-01-11 Havoc Pennington <hp@redhat.com>
* gtk/gtktreemodelsimple.h: Oops, broke some macros * gtk/gtktreemodelsimple.h: Oops, broke some macros

View File

@ -1,3 +1,31 @@
2001-01-12 Alexander Larsson <alexl@redhat.com>
* gdk/linux-fb/gdkdrawable-fb2.c (gdk_fb_clip_region): Take shaped
windows in consideration when generating clip region.
* gdk/linux-fb/gdkfb.h:
Huge HACK. Added GDK_FB_USE_CHILD_SHAPE.
* gdk/linux-fb/gdkprivate-fb.h:
Add shape to GdkWindowFBDatat.
exported gdk_fb_window_get_abs_shape().
removed gdk_fb_draw_lines declaration.
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_impl_fb_init):
Init shape to NULL. (gdk_fb_window_send_crossing_events): Don't
send focus changes when there is a grabbed window.
(gdk_window_get_pointer): Handle shaped windows.
(gdk_fb_region_create_from_bitmap): Convert bitmap to region.
(gdk_fb_window_peek_shape): Returns the shape for a window,
handles GDK_FB_USE_CHILD_SHAPE.
(gdk_fb_window_get_abs_shape): Returns the shape of the window,
offseted to absolute positions. Handles GDK_FB_USE_CHILD_SHAPE.
(gdk_window_shape_combine_mask): Implement.
* gtk/gtkwindow-decorate.c:
HACK! Set GDK_FB_USE_CHILD_SHAPE on window->frame to make sure
setting the shape of a window makes the window transparent.
2001-01-11 Havoc Pennington <hp@redhat.com> 2001-01-11 Havoc Pennington <hp@redhat.com>
* gtk/gtktreemodelsimple.h: Oops, broke some macros * gtk/gtktreemodelsimple.h: Oops, broke some macros

View File

@ -304,9 +304,10 @@ gdk_fb_clip_region (GdkDrawable *drawable,
gboolean do_children) gboolean do_children)
{ {
GdkRectangle draw_rect; GdkRectangle draw_rect;
GdkRegion *real_clip_region, *tmpreg; GdkRegion *real_clip_region, *tmpreg, *shape;
gboolean skipit = FALSE; gboolean skipit = FALSE;
GdkDrawableFBData *private; GdkDrawableFBData *private;
GdkWindowObject *parent;
private = GDK_DRAWABLE_FBDATA (drawable); private = GDK_DRAWABLE_FBDATA (drawable);
@ -330,6 +331,21 @@ gdk_fb_clip_region (GdkDrawable *drawable,
if (skipit) if (skipit)
return real_clip_region; return real_clip_region;
if (GDK_IS_WINDOW (private->wrapper))
{
parent = GDK_WINDOW_P (private->wrapper);
while (parent != (GdkWindowObject *)gdk_parent_root)
{
shape = gdk_fb_window_get_abs_shape (GDK_DRAWABLE (parent));
if (shape)
{
gdk_region_intersect (real_clip_region, shape);
gdk_region_destroy (shape);
}
parent = parent->parent;
}
}
if (gc && GDK_GC_FBDATA(gc)->values.subwindow_mode == GDK_INCLUDE_INFERIORS) if (gc && GDK_GC_FBDATA(gc)->values.subwindow_mode == GDK_INCLUDE_INFERIORS)
do_children = FALSE; do_children = FALSE;
@ -347,6 +363,7 @@ gdk_fb_clip_region (GdkDrawable *drawable,
else else
parentwin = (GdkWindow *)GDK_WINDOW_P (lastwin)->parent; parentwin = (GdkWindow *)GDK_WINDOW_P (lastwin)->parent;
/* Remove the areas of all overlapping windows above parentwin in the hiearachy */
for (; parentwin; lastwin = parentwin, parentwin = (GdkWindow *)GDK_WINDOW_P (parentwin)->parent) for (; parentwin; lastwin = parentwin, parentwin = (GdkWindow *)GDK_WINDOW_P (parentwin)->parent)
{ {
GList *cur; GList *cur;
@ -364,6 +381,13 @@ gdk_fb_clip_region (GdkDrawable *drawable,
tmpreg = gdk_region_rectangle (&draw_rect); tmpreg = gdk_region_rectangle (&draw_rect);
shape = gdk_fb_window_get_abs_shape (impl_private->wrapper);
if (shape)
{
gdk_region_intersect (tmpreg, shape);
gdk_region_destroy (shape);
}
gdk_region_subtract (real_clip_region, tmpreg); gdk_region_subtract (real_clip_region, tmpreg);
gdk_region_destroy (tmpreg); gdk_region_destroy (tmpreg);
} }

View File

@ -29,6 +29,8 @@ typedef enum {
GDK_FB_270_DEGREES GDK_FB_270_DEGREES
} GdkFBAngle; } GdkFBAngle;
#define GDK_FB_USE_CHILD_SHAPE ((void *)1)
/* FB specific functions: */ /* FB specific functions: */
typedef gboolean (*GdkWindowChildChanged) (GdkWindow *window, typedef gboolean (*GdkWindowChildChanged) (GdkWindow *window,
@ -39,10 +41,10 @@ typedef void (*GdkWindowChildGetPos) (GdkWindow *window,
gint *x, gint *y, gint *x, gint *y,
gpointer user_data); gpointer user_data);
void gdk_fb_window_set_child_handler (GdkWindow *window, void gdk_fb_window_set_child_handler (GdkWindow *window,
GdkWindowChildChanged changed, GdkWindowChildChanged changed,
GdkWindowChildGetPos get_pos, GdkWindowChildGetPos get_pos,
gpointer user_data); gpointer user_data);
void gdk_fb_set_rotation (GdkFBAngle angle); void gdk_fb_set_rotation (GdkFBAngle angle);

View File

@ -111,6 +111,8 @@ struct _GdkWindowFBData
GdkCursor *cursor; GdkCursor *cursor;
GHashTable *properties; GHashTable *properties;
GdkRegion *shape; /* Can also be GDK_FB_USE_CHILD_SHAPE */
GdkEventMask event_mask; GdkEventMask event_mask;
gboolean realized : 1; gboolean realized : 1;
}; };
@ -269,6 +271,7 @@ void gdk_fb_window_move_resize (GdkWindow *window,
gint height, gint height,
gboolean send_expose_events); gboolean send_expose_events);
GdkWindow *gdk_fb_window_find_focus (void); GdkWindow *gdk_fb_window_find_focus (void);
GdkRegion *gdk_fb_window_get_abs_shape (GdkDrawable *window);
GdkGC * _gdk_fb_gc_new (GdkDrawable *drawable, GdkGC * _gdk_fb_gc_new (GdkDrawable *drawable,
GdkGCValues *values, GdkGCValues *values,
GdkGCValuesMask values_mask); GdkGCValuesMask values_mask);
@ -344,10 +347,6 @@ void gdk_fb_draw_rectangle (GdkDrawable *drawable,
gint y, gint y,
gint width, gint width,
gint height); gint height);
void gdk_fb_draw_lines (GdkDrawable *drawable,
GdkGC *gc,
GdkPoint *points,
gint npoints);
void gdk_fb_fill_spans (GdkDrawable *real_drawable, void gdk_fb_fill_spans (GdkDrawable *real_drawable,
GdkGC *gc, GdkGC *gc,
GdkSpan *spans, GdkSpan *spans,

View File

@ -41,12 +41,13 @@ static gpointer parent_class = NULL;
static void recompute_drawable (GdkDrawable *drawable); static void recompute_drawable (GdkDrawable *drawable);
static void gdk_fb_window_raise (GdkWindow *window); static void gdk_fb_window_raise (GdkWindow *window);
static GdkRegion* gdk_window_fb_get_visible_region (GdkDrawable *drawable); static GdkRegion* gdk_window_fb_get_visible_region (GdkDrawable *drawable);
static GdkRegion *gdk_fb_window_peek_shape (GdkDrawable *window);
typedef struct typedef struct
{ {
GdkWindowChildChanged changed; GdkWindowChildChanged changed;
GdkWindowChildGetPos get_pos; GdkWindowChildGetPos get_pos;
gpointer user_data; gpointer user_data;
} GdkWindowChildHandlerData; } GdkWindowChildHandlerData;
static void static void
@ -96,6 +97,7 @@ gdk_window_impl_fb_init (GdkWindowFBData *impl)
impl->drawable_data.depth = gdk_display->modeinfo.bits_per_pixel; impl->drawable_data.depth = gdk_display->modeinfo.bits_per_pixel;
impl->drawable_data.colormap = gdk_colormap_get_system (); impl->drawable_data.colormap = gdk_colormap_get_system ();
impl->event_mask = GDK_STRUCTURE_MASK; impl->event_mask = GDK_STRUCTURE_MASK;
impl->shape = NULL;
} }
GType GType
@ -703,7 +705,8 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
} }
if ((mode != GDK_CROSSING_GRAB) && if ((mode != GDK_CROSSING_GRAB) &&
(b != gdk_fb_window_containing_pointer)) (b != gdk_fb_window_containing_pointer) &&
!only_grabbed_window)
{ {
gdk_fb_send_focus_change (gdk_fb_window_containing_pointer, b); gdk_fb_send_focus_change (gdk_fb_window_containing_pointer, b);
gdk_window_unref (gdk_fb_window_containing_pointer); gdk_window_unref (gdk_fb_window_containing_pointer);
@ -1534,6 +1537,7 @@ gdk_window_get_pointer (GdkWindow *window,
int winy = 0; int winy = 0;
int x_int, y_int; int x_int, y_int;
GdkModifierType my_mask; GdkModifierType my_mask;
GdkRegion *shape;
g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL); g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
@ -1555,8 +1559,10 @@ gdk_window_get_pointer (GdkWindow *window,
return_val = NULL; return_val = NULL;
shape = gdk_fb_window_peek_shape (window);
if ((winx >= 0) && (winx < GDK_DRAWABLE_IMPL_FBDATA (window)->width) && if ((winx >= 0) && (winx < GDK_DRAWABLE_IMPL_FBDATA (window)->width) &&
(winy >= 0) && (winy < GDK_DRAWABLE_IMPL_FBDATA (window)->height)) (winy >= 0) && (winy < GDK_DRAWABLE_IMPL_FBDATA (window)->height) &&
(!shape || gdk_region_point_in (shape, winx, winy)))
{ {
GdkWindowObject *private; GdkWindowObject *private;
GdkWindowObject *sub; GdkWindowObject *sub;
@ -1573,10 +1579,12 @@ gdk_window_get_pointer (GdkWindow *window,
if (!sub->mapped) if (!sub->mapped)
continue; continue;
shape = gdk_fb_window_peek_shape (GDK_WINDOW (sub));
if (subx >= sub->x && if (subx >= sub->x &&
(subx < (GDK_DRAWABLE_IMPL_FBDATA (sub)->width + sub->x)) && (subx < (GDK_DRAWABLE_IMPL_FBDATA (sub)->width + sub->x)) &&
(suby >= sub->y) && (suby >= sub->y) &&
(suby < (GDK_DRAWABLE_IMPL_FBDATA (sub)->height + sub->y))) (suby < (GDK_DRAWABLE_IMPL_FBDATA (sub)->height + sub->y)) &&
(!shape || gdk_region_point_in (shape, subx - sub->x, suby - sub->y)))
{ {
subx -= sub->x; subx -= sub->x;
suby -= sub->y; suby -= sub->y;
@ -1652,18 +1660,146 @@ gdk_window_add_colormap_windows (GdkWindow *window)
/* N/A */ /* N/A */
} }
/*
* This needs the X11 shape extension. GdkRegion*
* If not available, shaped windows will look gdk_fb_region_create_from_bitmap (GdkBitmap *bitmap)
* ugly, but programs still work. Stefan Wille {
*/ GdkDrawableFBData *private;
GdkRegion *region;
GdkRectangle rect;
gboolean in_rect;
gint x;
guchar bit_mask;
guchar *src;
g_return_val_if_fail(bitmap != NULL, NULL);
g_return_val_if_fail(GDK_IS_PIXMAP(bitmap), NULL);
private = GDK_DRAWABLE_IMPL_FBDATA (bitmap);
g_return_val_if_fail(private->depth == 1, NULL);
region = gdk_region_new();
rect.height = 1;
in_rect = FALSE; /* Haven't started a rectangle yet */
for (rect.y = 0; rect.y < private->height; (rect.y)++)
{
src = private->mem + rect.y * private->rowstride;
bit_mask = 1;
for (x = 0; x < private->width; x++)
{
if ((*src & bit_mask) && !in_rect)
{
/* Start of rect */
in_rect = TRUE;
rect.x = x;
}
else if (!(*src & bit_mask) && in_rect)
{
/* End of rect */
in_rect = FALSE;
rect.width = x - rect.x;
gdk_region_union_with_rect (region, &rect);
}
if (bit_mask == 1<<7)
{
bit_mask = 1;
src++;
}
else
bit_mask <<= 1;
}
if (in_rect)
{
/* Past end of line */
in_rect = FALSE;
rect.width = x - rect.x;
gdk_region_union_with_rect (region, &rect);
}
}
return region;
}
static GdkRegion *
gdk_fb_window_peek_shape (GdkDrawable *window)
{
if (!GDK_IS_WINDOW (window))
return NULL;
if (GDK_WINDOW_IMPL_FBDATA (window)->shape == NULL)
return NULL;
if (GDK_WINDOW_IMPL_FBDATA (window)->shape == GDK_FB_USE_CHILD_SHAPE)
{
GList *children;
children = ((GdkWindowObject*)window)->children;
if (children)
return gdk_fb_window_peek_shape ((GdkDrawable *)children->data);
else
return NULL;
}
return GDK_WINDOW_IMPL_FBDATA (window)->shape;
}
GdkRegion *
gdk_fb_window_get_abs_shape (GdkDrawable *window)
{
GdkRegion *shape;
if (!GDK_IS_WINDOW (window))
return NULL;
if (GDK_WINDOW_IMPL_FBDATA (window)->shape == NULL)
return NULL;
if (GDK_WINDOW_IMPL_FBDATA (window)->shape == GDK_FB_USE_CHILD_SHAPE)
{
GList *children;
children = ((GdkWindowObject*)window)->children;
if (children)
return gdk_fb_window_get_abs_shape ((GdkDrawable *)children->data);
else
return NULL;
}
shape = gdk_region_copy (GDK_WINDOW_IMPL_FBDATA (window)->shape);
gdk_region_offset (shape,
GDK_DRAWABLE_IMPL_FBDATA (window)->abs_x,
GDK_DRAWABLE_IMPL_FBDATA (window)->abs_y);
return shape;
}
void void
gdk_window_shape_combine_mask (GdkWindow *window, gdk_window_shape_combine_mask (GdkWindow *window,
GdkBitmap *mask, GdkBitmap *mask,
gint x, gint y) gint x, gint y)
{ {
GdkWindowFBData *private;
g_return_if_fail (window != NULL); g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window)); 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);
/* Warning. HUGE hack */
if (mask == GDK_FB_USE_CHILD_SHAPE)
private->shape = GDK_FB_USE_CHILD_SHAPE;
else if (mask)
{
private->shape = gdk_fb_region_create_from_bitmap (mask);
gdk_region_offset (private->shape, x, y);
}
else
private->shape = NULL;
} }
void void
@ -1712,9 +1848,9 @@ gdk_window_set_group (GdkWindow *window,
void void
gdk_fb_window_set_child_handler (GdkWindow *window, gdk_fb_window_set_child_handler (GdkWindow *window,
GdkWindowChildChanged changed, GdkWindowChildChanged changed,
GdkWindowChildGetPos get_pos, GdkWindowChildGetPos get_pos,
gpointer user_data) gpointer user_data)
{ {
GdkWindowChildHandlerData *data; GdkWindowChildHandlerData *data;

View File

@ -266,8 +266,13 @@ gtk_decorated_window_realize (GtkWindow *window)
gtk_decorated_window_inner_change, gtk_decorated_window_inner_change,
gtk_decorated_window_inner_get_pos, gtk_decorated_window_inner_get_pos,
window); window);
/* This is a huge hack to make frames have the same shape as
the window they wrap */
gdk_window_shape_combine_mask (window->frame, GDK_FB_USE_CHILD_SHAPE, 0, 0);
} }
static void static void
gtk_decorated_window_unrealize (GtkWindow *window) gtk_decorated_window_unrealize (GtkWindow *window)
{ {