Lots of changes the major change is GdkPaintable is not implemented by window

This code also requires a major redo of the cairo implementation now in
cairo cvs.
This commit is contained in:
Michael David Emmel 2006-07-14 00:17:52 +00:00
parent 6a246cb5b8
commit 73d7327b35
8 changed files with 427 additions and 113 deletions

View File

@ -1,3 +1,20 @@
2006-07-13 Michael Emmel <mike.emmel@gmail.com>
* gdk/directfb/gdkdrawable-directfb.c
Remove +1 in fill and draw rect this may be wrong.
Commented out update calls left for reference the should not be needed.
Comment out subsurface for cairo remove when proved its not needed
* gdk/directfb/gdkkeys-directfb.c
Allow multiple calls and return if initalized
* gdk/directfb/gdkmain-directfb.c
Make sure string is malloced since its freed by apps
* gdk/directfb/gdkprivate-directfb.c
Added back pointer to window for paintable impl
* gdk/directfb/gdkvisual-directfb.c
Fix for Bug 346733 make sure visual list is populated
* gdk/directfb/gdkwindow-directfb.c
Finally removed uneeded pixmap buffering now implements GdkPainter
2006-07-11 Emmanuele Bassi <ebassi@gnome.org>
* gtk/gtkrecentchooser.c (gtk_recent_chooser_set_show_numbers),

View File

@ -1,3 +1,20 @@
2006-07-13 Michael Emmel <mike.emmel@gmail.com>
* gdk/directfb/gdkdrawable-directfb.c
Remove +1 in fill and draw rect this may be wrong.
Commented out update calls left for reference the should not be needed.
Comment out subsurface for cairo remove when proved its not needed
* gdk/directfb/gdkkeys-directfb.c
Allow multiple calls and return if initalized
* gdk/directfb/gdkmain-directfb.c
Make sure string is malloced since its freed by apps
* gdk/directfb/gdkprivate-directfb.c
Added back pointer to window for paintable impl
* gdk/directfb/gdkvisual-directfb.c
Fix for Bug 346733 make sure visual list is populated
* gdk/directfb/gdkwindow-directfb.c
Finally removed uneeded pixmap buffering now implements GdkPainter
2006-07-11 Emmanuele Bassi <ebassi@gnome.org>
* gtk/gtkrecentchooser.c (gtk_recent_chooser_set_show_numbers),

View File

@ -32,6 +32,7 @@
#include <config.h>
#include "gdk.h"
#include <assert.h>
#include <string.h>
@ -456,17 +457,17 @@ _gdk_directfb_draw_rectangle (GdkDrawable *drawable,
else
{
DFBRegion region = { x, y, x + width+1, y + height+1 };
DFBRegion region = { x, y, x + width, y + height };
impl->surface->SetClip (impl->surface, &region);
/* DirectFB does not draw rectangles the X way. Using DirectFB,
a filled Rectangle has the same size as a drawn one, while
X draws the rectangle one pixel taller and wider. */
impl->surface->DrawRectangle (impl->surface,
x, y, width + 1, height + 1);
x, y, width , height);
impl->surface->SetClip (impl->surface, NULL);
_gdk_directfb_update (impl, &region);
//_gdk_directfb_update (impl, &region);
}
}
@ -679,7 +680,7 @@ gdk_directfb_draw_points (GdkDrawable *drawable,
gdk_region_destroy (clip);
_gdk_directfb_update (impl, &region);
//_gdk_directfb_update (impl, &region);
}
static void
@ -759,7 +760,7 @@ gdk_directfb_draw_segments (GdkDrawable *drawable,
region.y2 = segs->y2;
}
_gdk_directfb_update (impl, &region);
//_gdk_directfb_update (impl, &region);
}
static void
@ -828,7 +829,7 @@ gdk_directfb_draw_lines (GdkDrawable *drawable,
gdk_region_destroy (clip);
_gdk_directfb_update (impl, &region);
//_gdk_directfb_update (impl, &region);
}
static void
@ -1078,14 +1079,17 @@ gdk_directfb_ref_cairo_surface (GdkDrawable *drawable)
GdkDrawableImplDirectFB *impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
IDirectFB *dfb = GDK_DISPLAY_DFB(gdk_drawable_get_display(drawable))->directfb;
if (!impl->cairo_surface) {
IDirectFBSurface *surface;
if (impl->surface->GetSubSurface (impl->surface, NULL, &surface) == DFB_OK) {
impl->cairo_surface = cairo_directfb_surface_create (dfb, surface);
// IDirectFBSurface *surface;
// if (impl->surface->GetSubSurface (impl->surface, NULL, &surface) == DFB_OK) {
//impl->cairo_surface = cairo_directfb_surface_create (dfb, surface);
g_assert( impl->surface != NULL);
impl->cairo_surface = cairo_directfb_surface_create (dfb,impl->surface);
g_assert( impl->cairo_surface != NULL);
cairo_surface_set_user_data (impl->cairo_surface,
&gdk_directfb_cairo_key, drawable,
gdk_directfb_cairo_surface_destroy);
surface->Release (surface);
}
// surface->Release (surface);
//}
} else {
cairo_surface_reference (impl->cairo_surface);
}

View File

@ -1670,6 +1670,8 @@ _gdk_directfb_keyboard_init (void)
if (!keyboard)
return;
if( directfb_keymap )
return;
keyboard->GetDescription (keyboard, &desc);
_gdk_display->keymap=g_object_new (gdk_keymap_get_type (), NULL);
@ -1682,7 +1684,6 @@ _gdk_directfb_keyboard_init (void)
length = directfb_max_keycode - desc.min_keycode + 1;
g_assert (directfb_keymap == NULL);
directfb_keymap = g_new0 (guint, 4 * length);

View File

@ -105,7 +105,7 @@ _gdk_windowing_exit (void)
gchar *
gdk_get_display (void)
{
return "DirectFB";
return g_strdup (gdk_display_get_name (gdk_display_get_default ()));
}

View File

@ -70,7 +70,6 @@ struct _GdkDrawableImplDirectFB
GdkRegion *paint_region;
gint paint_depth;
gint width;
gint height;
gint abs_x;
@ -140,6 +139,7 @@ typedef struct
struct _GdkWindowImplDirectFB
{
GdkDrawableImplDirectFB drawable;
GdkWindow *gdkWindow;
IDirectFBWindow *window;

View File

@ -54,12 +54,12 @@ static GdkVisualDirectFB * gdk_directfb_visual_create (DFBSurfacePixelFormat pi
static DFBSurfacePixelFormat formats[] =
{
DSPF_RGB32,
DSPF_ARGB,
DSPF_LUT8,
DSPF_RGB32,
DSPF_RGB24,
DSPF_RGB16,
DSPF_ARGB1555,
DSPF_LUT8,
DSPF_RGB332
};
@ -133,6 +133,10 @@ _gdk_visual_init ()
If you want to use a special pixelformat that is not registered
here, you can create it using the DirectFB-specific function
gdk_directfb_visual_by_format().
Note:
changed to do all formats but we should redo this code
to ensure the base format ARGB LUT8 RGB etc then add ones supported
by the hardware
*/
for (i = 0, c = 0; i < G_N_ELEMENTS (formats); i++)
{
@ -143,12 +147,13 @@ _gdk_visual_init ()
desc.width = 8;
desc.height = 8;
desc.pixelformat = formats[i];
//call direct so fail silently is ok
if (_gdk_display->directfb->CreateSurface (_gdk_display->directfb,
&desc, &src) != DFB_OK)
&desc, &src) != DFB_OK)
continue;
visuals[i] = gdk_directfb_visual_create (formats[i]);
dest->GetAccelerationMask (dest, src, &acc);
if (acc & DFXL_BLIT || formats[i] == dlc.pixelformat)
@ -162,17 +167,11 @@ _gdk_visual_init ()
dest->Release (dest);
//fallback to ARGB
//fallback to ARGB must be supported
if (!system_visual)
{
for (i = 0; i < G_N_ELEMENTS (formats); i++) {
if (formats[i] == DSPF_ARGB ) {
if( visuals[i] == NULL )
visuals[i] = gdk_directfb_visual_create (formats[i]);
system_visual = visuals[i];
break;
}
}
g_assert (visuals[DSPF_ARGB] != NULL);
system_visual = GDK_VISUAL(visuals[DSPF_ARGB]);
}
g_assert (system_visual != NULL);
@ -210,10 +209,12 @@ gdk_visual_get_best_with_depth (gint depth)
for (i = 0; visuals[i]; i++)
{
GdkVisual *visual = GDK_VISUAL (visuals[i]);
if( visuals[i] ) {
GdkVisual *visual = GDK_VISUAL (visuals[i]);
if (depth == visual->depth)
return visual;
if (depth == visual->depth)
return visual;
}
}
return NULL;
@ -226,10 +227,12 @@ gdk_visual_get_best_with_type (GdkVisualType visual_type)
for (i = 0; visuals[i]; i++)
{
GdkVisual *visual = GDK_VISUAL (visuals[i]);
if( visuals[i] ) {
GdkVisual *visual = GDK_VISUAL (visuals[i]);
if (visual_type == visual->type)
return visual;
if (visual_type == visual->type)
return visual;
}
}
return NULL;
@ -243,10 +246,12 @@ gdk_visual_get_best_with_both (gint depth,
for (i = 0; visuals[i]; i++)
{
GdkVisual *visual = GDK_VISUAL (visuals[i]);
if( visuals[i] ) {
GdkVisual *visual = GDK_VISUAL (visuals[i]);
if (depth == visual->depth && visual_type == visual->type)
return visual;
if (depth == visual->depth && visual_type == visual->type)
return visual;
}
}
return system_visual;
@ -285,7 +290,10 @@ gdk_screen_list_visuals (GdkScreen *screen)
gint i;
for (i = 0; visuals[i]; i++)
list = g_list_append (list, visuals[i]);
if( visuals[i] ) {
GdkVisual * vis = GDK_VISUAL(visuals[i]);
list = g_list_append (list,vis);
}
return list;
}
@ -313,7 +321,7 @@ gdk_directfb_visual_by_format (DFBSurfacePixelFormat pixel_format)
/* first check if one the registered visuals matches */
for (i = 0; visuals[i]; i++)
if (visuals[i]->format == pixel_format)
if ( visuals[i] && visuals[i]->format == pixel_format)
return GDK_VISUAL (visuals[i]);
/* none matched, try to create a new one for this pixel_format */
@ -332,9 +340,7 @@ gdk_directfb_visual_by_format (DFBSurfacePixelFormat pixel_format)
test->Release (test);
}
visuals[i] = gdk_directfb_visual_create (pixel_format);
return GDK_VISUAL (visuals[i]);
return GDK_VISUAL(gdk_directfb_visual_create (pixel_format));
}
GdkScreen *

View File

@ -44,6 +44,7 @@
#include "gdkinternals.h"
#include "gdkalias.h"
#include "cairo.h"
#include <assert.h>
static GdkRegion * gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable);
static void gdk_window_impl_directfb_set_colormap (GdkDrawable *drawable,
@ -60,11 +61,76 @@ typedef struct
} GdkWindowChildHandlerData;
/* Code for dirty-region queueing
*/
static GSList *update_windows = NULL;
static guint update_idle = 0;
static gboolean debug_updates = FALSE;
static void
gdk_window_directfb_process_all_updates (void)
{
GSList *old_update_windows = update_windows;
GSList *tmp_list = update_windows;
if (update_idle)
g_source_remove (update_idle);
update_windows = NULL;
update_idle = 0;
g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
while (tmp_list)
{
GdkWindowObject *private = (GdkWindowObject *)tmp_list->data;
if (private->update_freeze_count)
update_windows = g_slist_prepend (update_windows, private);
else
gdk_window_process_updates(tmp_list->data,TRUE);
g_object_unref (tmp_list->data);
tmp_list = tmp_list->next;
}
g_slist_free (old_update_windows);
}
static gboolean
gdk_window_update_idle (gpointer data)
{
GDK_THREADS_ENTER ();
gdk_window_directfb_process_all_updates ();
GDK_THREADS_LEAVE ();
return FALSE;
}
static void
gdk_window_schedule_update (GdkWindow *window)
{
if (window && GDK_WINDOW_OBJECT (window)->update_freeze_count)
return;
if (!update_idle)
{
update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
gdk_window_update_idle, NULL, NULL);
}
}
static GdkWindow *gdk_directfb_window_containing_pointer = NULL;
static GdkWindow *gdk_directfb_focused_window = NULL;
static gpointer parent_class = NULL;
GdkWindow * _gdk_parent_root = NULL;
static void
gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface);
GType
@ -87,9 +153,20 @@ gdk_window_impl_directfb_get_type (void)
(GInstanceInitFunc) gdk_window_impl_directfb_init,
};
static const GInterfaceInfo paintable_info =
{
(GInterfaceInitFunc) gdk_window_impl_directfb_paintable_init,
NULL,
NULL
};
object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB,
"GdkWindowImplDirectFB",
&object_info, 0);
g_type_add_interface_static (object_type,
GDK_TYPE_PAINTABLE,
&paintable_info);
}
return object_type;
@ -176,7 +253,7 @@ gdk_window_impl_directfb_get_visible_region (GdkDrawable *drawable)
DFBRectangle drect = { 0, 0, 0, 0 };
if (priv->surface)
priv->surface->GetVisibleRectangle (priv->surface, &drect);
priv->surface->GetVisibleRectangle (priv->surface, &drect);
rect.x= drect.x;
rect.y= drect.y;
rect.width=drect.w;
@ -223,8 +300,9 @@ create_directfb_window (GdkWindowImplDirectFB *impl,
}
if ((desc->flags & DWDESC_CAPS) && (desc->caps & DWCAPS_INPUTONLY))
{
impl->drawable.surface = NULL;
else
} else
window->GetSurface (window, &impl->drawable.surface);
if (window_options)
@ -258,7 +336,8 @@ _gdk_windowing_window_init (void)
private->window_type = GDK_WINDOW_ROOT;
private->state = 0;
private->children = NULL;
impl->drawable.paint_region = NULL;
impl->gdkWindow = _gdk_parent_root;
impl->window = NULL;
impl->drawable.abs_x = 0;
impl->drawable.abs_y = 0;
@ -331,6 +410,7 @@ gdk_directfb_window_new (GdkWindow *parent,
impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl);
impl->drawable.wrapper = GDK_DRAWABLE (window);
impl->gdkWindow = window;
private->x = x;
private->y = y;
@ -420,9 +500,9 @@ gdk_directfb_window_new (GdkWindow *parent,
impl->window=NULL;
if (!private->input_only && parent_impl->drawable.surface)
{
DFBRectangle rect =
{ x, y, impl->drawable.width, impl->drawable.height };
parent_impl->drawable.surface->GetSubSurface (parent_impl->drawable.surface,
&rect,
&impl->drawable.surface);
@ -1191,8 +1271,12 @@ _gdk_directfb_move_resize_child (GdkWindow *window,
{
if (impl->drawable.surface)
{
GdkDrawableImplDirectFB *dimpl;
dimpl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
impl->drawable.surface->Release (impl->drawable.surface);
impl->drawable.surface = NULL;
cairo_surface_destroy(dimpl->cairo_surface);
dimpl->cairo_surface= NULL;
}
parent_impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (private->parent)->impl);
@ -1214,6 +1298,9 @@ _gdk_directfb_move_resize_child (GdkWindow *window,
_gdk_directfb_move_resize_child (list->data,
private->x, private->y,
impl->drawable.width, impl->drawable.height);
//FIXEME should this really happen ?
if( impl->drawable.surface )
impl->drawable.surface->GetPosition(impl->drawable.surface,&x,&y);
}
}
@ -1287,7 +1374,7 @@ gdk_window_move_resize (GdkWindow *window,
}
}
}
//XXX BROKE if top LEVEL WINDOW ~~~
void
gdk_window_reparent (GdkWindow *window,
GdkWindow *new_parent,
@ -2345,73 +2432,6 @@ gdk_window_set_static_gravities (GdkWindow *window,
return FALSE;
}
#if 0
void
gdk_window_begin_paint_region (GdkWindow *window,
GdkRegion *region)
{
GdkDrawableImplDirectFB *impl;
gint i;
g_return_if_fail (GDK_IS_WINDOW (window));
impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
impl->buffered = TRUE;
impl->paint_depth++;
if (!region)
return;
if (impl->paint_region)
gdk_region_union (impl->paint_region, region);
else
impl->paint_region = gdk_region_copy (region);
for (i = 0; i < region->numRects; i++)
{
GdkRegionBox *box = &region->rects[i];
_gdk_windowing_window_clear_area (window,
box->x1,
box->y1,
box->x2 - box->x1,
box->y2 - box->y1);
}
}
void
gdk_window_end_paint (GdkWindow *window)
{
GdkDrawableImplDirectFB *impl;
g_return_if_fail (GDK_IS_WINDOW (window));
impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
g_return_if_fail (impl->paint_depth > 0);
impl->paint_depth--;
if (impl->paint_depth == 0)
{
impl->buffered = FALSE;
if (impl->paint_region)
{
DFBRegion reg = { impl->paint_region->extents.x1,
impl->paint_region->extents.y1,
impl->paint_region->extents.x2 - 1,
impl->paint_region->extents.y2 - 1 };
_gdk_directfb_update (impl, &reg);
gdk_region_destroy (impl->paint_region);
impl->paint_region = NULL;
}
}
}
#endif
void
gdk_window_begin_resize_drag (GdkWindow *window,
@ -2739,6 +2759,255 @@ gdk_window_set_urgency_hint (GdkWindow *window,
}
static void
gdk_window_impl_directfb_invalidate_maybe_recurse (GdkPaintable *paintable,
GdkRegion *region,
gboolean (*child_func) (GdkWindow *, gpointer),
gpointer user_data)
{
GdkWindow *window;
GdkWindowObject *private;
GdkWindowImplDirectFB *wimpl;
GdkDrawableImplDirectFB *impl;
wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
impl = (GdkDrawableImplDirectFB *)wimpl;
window = wimpl->gdkWindow;
private = (GdkWindowObject *)window;
GdkRegion *visible_region;
GList *tmp_list;
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
if (private->input_only || !GDK_WINDOW_IS_MAPPED (window))
return;
visible_region = gdk_drawable_get_visible_region (window);
gdk_region_intersect (visible_region, region);
tmp_list = private->children;
while (tmp_list)
{
GdkWindowObject *child = tmp_list->data;
if (!child->input_only)
{
GdkRegion *child_region;
GdkRectangle child_rect;
gdk_window_get_position ((GdkWindow *)child,
&child_rect.x, &child_rect.y);
gdk_drawable_get_size ((GdkDrawable *)child,
&child_rect.width, &child_rect.height);
child_region = gdk_region_rectangle (&child_rect);
/* remove child area from the invalid area of the parent */
if (GDK_WINDOW_IS_MAPPED (child) && !child->shaped)
gdk_region_subtract (visible_region, child_region);
if (child_func && (*child_func) ((GdkWindow *)child, user_data))
{
gdk_region_offset (region, - child_rect.x, - child_rect.y);
gdk_region_offset (child_region, - child_rect.x, - child_rect.y);
gdk_region_intersect (child_region, region);
gdk_window_invalidate_maybe_recurse ((GdkWindow *)child,
child_region, child_func, user_data);
gdk_region_offset (region, child_rect.x, child_rect.y);
}
gdk_region_destroy (child_region);
}
tmp_list = tmp_list->next;
}
if (!gdk_region_empty (visible_region))
{
//if (debug_updates)
// draw_ugly_color (window, region);
if (private->update_area)
{
gdk_region_union (private->update_area, visible_region);
}
else
{
update_windows = g_slist_prepend (update_windows, window);
private->update_area = gdk_region_copy (visible_region);
gdk_window_schedule_update (window);
}
}
gdk_region_destroy (visible_region);
}
static void
gdk_window_impl_directfb_process_updates (GdkPaintable *paintable,
gboolean update_children)
{
GdkWindow *window;
GdkWindowObject *private;
GdkWindowImplDirectFB *wimpl;
GdkDrawableImplDirectFB *impl;
wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
impl = (GdkDrawableImplDirectFB *)wimpl;
window = wimpl->gdkWindow;
private = (GdkWindowObject *)window;
gboolean save_region = FALSE;
/* If an update got queued during update processing, we can get a
* window in the update queue that has an empty update_area.
* just ignore it.
*/
if (private->update_area)
{
GdkRegion *update_area = private->update_area;
private->update_area = NULL;
if (_gdk_event_func && gdk_window_is_viewable (window))
{
GdkRectangle window_rect;
GdkRegion *expose_region;
GdkRegion *window_region;
gint width, height;
//if (debug_updates)
// {
/* Make sure we see the red invalid area before redrawing. */
// gdk_display_sync (gdk_drawable_get_display (window));
//g_usleep (70000);
//}
save_region = _gdk_windowing_window_queue_antiexpose (window, update_area);
if (save_region)
expose_region = gdk_region_copy (update_area);
else
expose_region = update_area;
gdk_drawable_get_size (GDK_DRAWABLE (private), &width, &height);
window_rect.x = 0;
window_rect.y = 0;
window_rect.width = width;
window_rect.height = height;
window_region = gdk_region_rectangle (&window_rect);
gdk_region_intersect (expose_region,
window_region);
gdk_region_destroy (window_region);
if (!gdk_region_empty (expose_region) &&
(private->event_mask & GDK_EXPOSURE_MASK))
{
GdkEvent event;
event.expose.type = GDK_EXPOSE;
event.expose.window = g_object_ref (window);
event.expose.send_event = FALSE;
event.expose.count = 0;
event.expose.region = expose_region;
gdk_region_get_clipbox (expose_region, &event.expose.area);
(*_gdk_event_func) (&event, _gdk_event_data);
g_object_unref (window);
}
if (expose_region != update_area)
gdk_region_destroy (expose_region);
}
if (!save_region)
gdk_region_destroy (update_area);
}
}
static void
gdk_window_impl_directfb_begin_paint_region (GdkPaintable *paintable,
GdkRegion *region)
{
GdkDrawableImplDirectFB *impl;
GdkWindowImplDirectFB *wimpl;
gint i;
wimpl = GDK_WINDOW_IMPL_DIRECTFB (paintable);
impl = (GdkDrawableImplDirectFB *)wimpl;
impl->buffered = TRUE;
impl->paint_depth++;
if (!region)
return;
if (impl->paint_region)
gdk_region_union (impl->paint_region, region);
else
impl->paint_region = gdk_region_copy (region);
for (i = 0; i < region->numRects; i++)
{
GdkRegionBox *box = &region->rects[i];
_gdk_windowing_window_clear_area (GDK_WINDOW(wimpl->gdkWindow),
box->x1,
box->y1,
box->x2 - box->x1,
box->y2 - box->y1);
}
}
static void
gdk_window_impl_directfb_end_paint (GdkPaintable *paintable)
{
GdkDrawableImplDirectFB *impl;
impl = GDK_DRAWABLE_IMPL_DIRECTFB (paintable);
g_return_if_fail (impl->paint_depth > 0);
impl->paint_depth--;
if (impl->paint_depth == 0)
{
impl->buffered = FALSE;
if (impl->paint_region)
{
DFBRegion reg = { impl->paint_region->extents.x1,
impl->paint_region->extents.y1,
impl->paint_region->extents.x2 - 1,
impl->paint_region->extents.y2 - 1 };
_gdk_directfb_update (impl, &reg);
gdk_region_destroy (impl->paint_region);
impl->paint_region = NULL;
}
}
}
static void
gdk_window_impl_directfb_paintable_init (GdkPaintableIface *iface)
{
iface->begin_paint_region = gdk_window_impl_directfb_begin_paint_region;
iface->end_paint = gdk_window_impl_directfb_end_paint;
iface->invalidate_maybe_recurse = gdk_window_impl_directfb_invalidate_maybe_recurse;
iface->process_updates = gdk_window_impl_directfb_process_updates;
}
#define __GDK_WINDOW_X11_C__
#include "gdkaliasdef.c"