summaryrefslogtreecommitdiff
path: root/gdk/directfb
diff options
context:
space:
mode:
authorMichael David Emmel <memmel@src.gnome.org>2006-07-14 00:17:52 +0000
committerMichael David Emmel <memmel@src.gnome.org>2006-07-14 00:17:52 +0000
commit73d7327b3541031ead8c32501317c431e9bf2736 (patch)
treee756b30de3aab975b4f081e88810bd0097f70eb5 /gdk/directfb
parent6a246cb5b84180e3f46f914a76a592a4e703118a (diff)
downloadgtk+-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.c26
-rw-r--r--gdk/directfb/gdkkeys-directfb.c3
-rw-r--r--gdk/directfb/gdkmain-directfb.c2
-rw-r--r--gdk/directfb/gdkprivate-directfb.h2
-rw-r--r--gdk/directfb/gdkvisual-directfb.c60
-rw-r--r--gdk/directfb/gdkwindow-directfb.c413
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, &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);
}
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 = &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"