diff options
author | Michael David Emmel <memmel@src.gnome.org> | 2006-07-14 00:17:52 +0000 |
---|---|---|
committer | Michael David Emmel <memmel@src.gnome.org> | 2006-07-14 00:17:52 +0000 |
commit | 73d7327b3541031ead8c32501317c431e9bf2736 (patch) | |
tree | e756b30de3aab975b4f081e88810bd0097f70eb5 /gdk/directfb | |
parent | 6a246cb5b84180e3f46f914a76a592a4e703118a (diff) | |
download | gtk+-73d7327b3541031ead8c32501317c431e9bf2736.tar.gz |
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.
Diffstat (limited to 'gdk/directfb')
-rw-r--r-- | gdk/directfb/gdkdrawable-directfb.c | 26 | ||||
-rw-r--r-- | gdk/directfb/gdkkeys-directfb.c | 3 | ||||
-rw-r--r-- | gdk/directfb/gdkmain-directfb.c | 2 | ||||
-rw-r--r-- | gdk/directfb/gdkprivate-directfb.h | 2 | ||||
-rw-r--r-- | gdk/directfb/gdkvisual-directfb.c | 60 | ||||
-rw-r--r-- | gdk/directfb/gdkwindow-directfb.c | 413 |
6 files changed, 393 insertions, 113 deletions
diff --git a/gdk/directfb/gdkdrawable-directfb.c b/gdk/directfb/gdkdrawable-directfb.c index 0f476e6b0d..924a26dce0 100644 --- a/gdk/directfb/gdkdrawable-directfb.c +++ b/gdk/directfb/gdkdrawable-directfb.c @@ -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, ®ion); /* 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, ®ion); + //_gdk_directfb_update (impl, ®ion); } } @@ -679,7 +680,7 @@ gdk_directfb_draw_points (GdkDrawable *drawable, gdk_region_destroy (clip); - _gdk_directfb_update (impl, ®ion); + //_gdk_directfb_update (impl, ®ion); } static void @@ -759,7 +760,7 @@ gdk_directfb_draw_segments (GdkDrawable *drawable, region.y2 = segs->y2; } - _gdk_directfb_update (impl, ®ion); + //_gdk_directfb_update (impl, ®ion); } static void @@ -828,7 +829,7 @@ gdk_directfb_draw_lines (GdkDrawable *drawable, gdk_region_destroy (clip); - _gdk_directfb_update (impl, ®ion); + //_gdk_directfb_update (impl, ®ion); } 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); } diff --git a/gdk/directfb/gdkkeys-directfb.c b/gdk/directfb/gdkkeys-directfb.c index 584a0ab94f..8577976a87 100644 --- a/gdk/directfb/gdkkeys-directfb.c +++ b/gdk/directfb/gdkkeys-directfb.c @@ -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); diff --git a/gdk/directfb/gdkmain-directfb.c b/gdk/directfb/gdkmain-directfb.c index 52e91772c7..56e000242e 100644 --- a/gdk/directfb/gdkmain-directfb.c +++ b/gdk/directfb/gdkmain-directfb.c @@ -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 ())); } diff --git a/gdk/directfb/gdkprivate-directfb.h b/gdk/directfb/gdkprivate-directfb.h index a9a5e5d40e..b4090bb828 100644 --- a/gdk/directfb/gdkprivate-directfb.h +++ b/gdk/directfb/gdkprivate-directfb.h @@ -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; diff --git a/gdk/directfb/gdkvisual-directfb.c b/gdk/directfb/gdkvisual-directfb.c index e9830fe786..fb20f570f4 100644 --- a/gdk/directfb/gdkvisual-directfb.c +++ b/gdk/directfb/gdkvisual-directfb.c @@ -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 * diff --git a/gdk/directfb/gdkwindow-directfb.c b/gdk/directfb/gdkwindow-directfb.c index ebf106df19..e045cb2aa3 100644 --- a/gdk/directfb/gdkwindow-directfb.c +++ b/gdk/directfb/gdkwindow-directfb.c @@ -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 = ®ion->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, ®); - - 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 = ®ion->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, ®); + + 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" |