Hi, On Mon, 2009-02-16 at 21:34 +0100, Josselin Mouette wrote: > Le lundi 16 février 2009 à 20:49 +0100, Sven Neumann a écrit : > > Please note that I can only commit changes to trunk (and then merge them > > to the gtk-2-14 branch). There's no point in applying changes to the > > gtk-2-12 branch as that branch is obsolete. > > The patches I pointed to you apply to the 2.14 branch. I haven’t tried > with trunk, though. > > > Currently it appears that neither gtk-2-14 nor gtk+ trunk compile if the > > DirectFB backend is selected. We need to address this before anything > > else. So is there a patch that deals with the internal API changes so > > that the tree can at least be compiled again? That would be the first > > patch that gets committed. > > The two Ubuntu patches may be what you are looking for, since version > 2.14.7 builds fine using them. > > > > There are also some patches coming from Ubuntu, but I don’t know if > > > there are corresponding reports in bugzilla: > > > http://patch-tracking.debian.net/patch/series/view/gtk+2.0/2.14.7-1/071_correct_directfb_declarations.patch > > > http://patch-tracking.debian.net/patch/series/view/gtk+2.0/2.14.7-1/072_workaround_directfb_build.patch
OK, I have had a look at these and it looks like 071_correct_directfb_declarations.patch could be useful to get current GTK+ trunk (and gtk-2-14) to work with DirectFB again. I've done some cleanups to the patch and made sure that all functions of GdkWindowImpl are implemented in the DirectFB backend. Unfortunately I can't test this right now as I need DirectFB 1.3.0 on my system and cairo pulls in the older DirectFB lib from /usr/lib. So if someone wants to give this some testing, I have attached the patch to this mail. This patch applies cleanly against gtk+ trunk and gtk-2-14. Sven
Index: gdk/directfb/gdkgeometry-directfb.c =================================================================== --- gdk/directfb/gdkgeometry-directfb.c (revision 22340) +++ gdk/directfb/gdkgeometry-directfb.c (working copy) @@ -41,9 +41,9 @@ void -_gdk_windowing_window_get_offsets (GdkWindow *window, - gint *x_offset, - gint *y_offset) +_gdk_directfb_window_get_offsets (GdkWindow *window, + gint *x_offset, + gint *y_offset) { if (x_offset) *x_offset = 0; @@ -69,9 +69,9 @@ _gdk_windowing_window_queue_antiexpose ( * brings in from offscreen areas are invalidated. **/ void -gdk_window_scroll (GdkWindow *window, - gint dx, - gint dy) +_gdk_directfb_window_scroll (GdkWindow *window, + gint dx, + gint dy) { GdkWindowObject *private; GdkDrawableImplDirectFB *impl; @@ -161,10 +161,10 @@ gdk_window_scroll (GdkWindow *window, * Since: 2.8 **/ void -gdk_window_move_region (GdkWindow *window, - const GdkRegion *region, - gint dx, - gint dy) +_gdk_directfb_window_move_region (GdkWindow *window, + const GdkRegion *region, + gint dx, + gint dy) { GdkWindowObject *private; GdkDrawableImplDirectFB *impl; Index: gdk/directfb/gdkwindow-directfb.c =================================================================== --- gdk/directfb/gdkwindow-directfb.c (revision 22340) +++ gdk/directfb/gdkwindow-directfb.c (working copy) @@ -33,6 +33,7 @@ #include "config.h" #include "gdk.h" +#include "gdkwindowimpl.h" #include "gdkwindow.h" #include "gdkdirectfb.h" @@ -67,6 +68,9 @@ static void gdk_window_impl_directfb_ini static void gdk_window_impl_directfb_class_init (GdkWindowImplDirectFBClass *klass); static void gdk_window_impl_directfb_finalize (GObject *object); +static void gdk_window_impl_iface_init (GdkWindowImplIface *iface); + + typedef struct { GdkWindowChildChanged changed; @@ -98,9 +102,8 @@ gdk_window_directfb_process_all_updates tmp_list = old_update_windows; while (tmp_list) { - GdkWindowObject *private = GDK_WINDOW_OBJECT( tmp_list->data ); - GdkWindowImplDirectFB *wimpl = GDK_WINDOW_IMPL_DIRECTFB( private->impl ); - + GdkWindowObject *private = GDK_WINDOW_OBJECT( tmp_list->data ); + if (private->update_freeze_count) { D_DEBUG_AT( GDKDFB_Updates, " -> %p frozen [%4d,%4d-%4dx%4d] (%d boxes)\n", @@ -115,7 +118,7 @@ gdk_window_directfb_process_all_updates wimpl->flips.num_regions ); gdk_window_process_updates(tmp_list->data,TRUE); } - + g_object_unref (tmp_list->data); tmp_list = tmp_list->next; } @@ -220,6 +223,13 @@ gdk_window_impl_directfb_get_type (void) NULL }; + const GInterfaceInfo window_impl_info = + { + (GInterfaceInitFunc) gdk_window_impl_iface_init, + NULL, + NULL + }; + object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_DIRECTFB, "GdkWindowImplDirectFB", &object_info, 0); @@ -227,6 +237,9 @@ gdk_window_impl_directfb_get_type (void) GDK_TYPE_PAINTABLE, &paintable_info); + g_type_add_interface_static (object_type, + GDK_TYPE_WINDOW_IMPL, + &window_impl_info); } return object_type; @@ -406,6 +419,7 @@ _gdk_windowing_window_init (void) _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL); private = GDK_WINDOW_OBJECT (_gdk_parent_root); + private->impl = g_object_new (_gdk_window_impl_get_type (), NULL); impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl); private->window_type = GDK_WINDOW_ROOT; @@ -647,8 +661,8 @@ gdk_directfb_window_new (GdkWindow GdkWindow * _gdk_window_new (GdkWindow *parent, - GdkWindowAttr *attributes, - gint attributes_mask) + GdkWindowAttr *attributes, + gint attributes_mask) { g_return_val_if_fail (attributes != NULL, NULL); @@ -1230,28 +1244,19 @@ show_window_internal (GdkWindow *window, } } -void -gdk_window_show_unraised (GdkWindow *window) -{ - g_return_if_fail (GDK_IS_WINDOW (window)); - - D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window ); - - show_window_internal (window, FALSE); -} - -void -gdk_window_show (GdkWindow *window) +static void +gdk_directfb_window_show (GdkWindow *window, + gboolean raise) { g_return_if_fail (GDK_IS_WINDOW (window)); D_DEBUG_AT( GDKDFB_Window, "%s( %p )\n", __FUNCTION__, window ); - show_window_internal (window, TRUE); + show_window_internal (window, raise); } -void -gdk_window_hide (GdkWindow *window) +static void +gdk_directfb_window_hide (GdkWindow *window) { GdkWindowObject *private; GdkWindowImplDirectFB *impl; @@ -1276,11 +1281,11 @@ gdk_window_hide (GdkWindow *window) if (!private->input_only && private->parent) { - _gdk_windowing_window_clear_area (GDK_WINDOW (private->parent), - private->x, - private->y, - impl->drawable.width, - impl->drawable.height); + gdk_window_clear_area (GDK_WINDOW (private->parent), + private->x, + private->y, + impl->drawable.width, + impl->drawable.height); } event_win = gdk_directfb_other_event_window (window, GDK_UNMAP); @@ -1299,8 +1304,8 @@ gdk_window_hide (GdkWindow *window) } } -void -gdk_window_withdraw (GdkWindow *window) +static void +gdk_directfb_window_withdraw (GdkWindow *window) { g_return_if_fail (GDK_IS_WINDOW (window)); @@ -1309,80 +1314,6 @@ gdk_window_withdraw (GdkWindow *window) } void -gdk_window_move (GdkWindow *window, - gint x, - gint y) -{ - GdkWindowObject *private; - GdkWindowImplDirectFB *impl; - - g_return_if_fail (GDK_IS_WINDOW (window)); - - private = GDK_WINDOW_OBJECT (window); - impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl); - - if (impl->window) - { - private->x = x; - private->y = y; - impl->window->MoveTo (impl->window, x, y); - } - else - { - gint width=impl->drawable.width; - gint height=impl->drawable.height; - GdkRectangle old = - { private->x, private->y,width,height }; - - _gdk_directfb_move_resize_child (window, x, y, width, height); - _gdk_directfb_calc_abs (window); - - if (GDK_WINDOW_IS_MAPPED (private)) - { - GdkWindow *mousewin; - GdkRectangle new = { x, y, width, height }; - - gdk_rectangle_union (&new, &old, &new); - gdk_window_invalidate_rect (GDK_WINDOW (private->parent), &new,TRUE); - - /* The window the pointer is in might have changed */ - mousewin = gdk_window_at_pointer (NULL, NULL); - gdk_directfb_window_send_crossing_events (NULL, mousewin, - GDK_CROSSING_NORMAL); - } - } -} - -void -gdk_window_resize (GdkWindow *window, - gint width, - gint height) -{ - GdkWindowObject *private; - gint x, y; - - g_return_if_fail (GDK_IS_WINDOW (window)); - - private = GDK_WINDOW_OBJECT (window); - - x = private->x; - y = private->y; - - if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD)) - { - GdkWindowChildHandlerData *data; - - data = g_object_get_data (G_OBJECT (private->parent), - "gdk-window-child-handler"); - - if (data) - (*data->get_pos) (window, &x, &y, data->user_data); - } - - gdk_window_move_resize (window, x, y, width, height); -} - -void _gdk_directfb_move_resize_child (GdkWindow *window, gint x, gint y, @@ -1439,12 +1370,13 @@ _gdk_directfb_move_resize_child (GdkWind } } -void -gdk_window_move_resize (GdkWindow *window, - gint x, - gint y, - gint width, - gint height) +static void +gdk_directfb_window_move_resize (GdkWindow *window, + gboolean with_move, + gint x, + gint y, + gint width, + gint height) { GdkWindowObject *private; GdkWindowImplDirectFB *impl; @@ -1510,11 +1442,11 @@ gdk_window_move_resize (GdkWindow *windo } } -void -_gdk_window_reparent (GdkWindow *window, - GdkWindow *new_parent, - gint x, - gint y) +static gboolean +gdk_directfb_window_reparent (GdkWindow *window, + GdkWindow *new_parent, + gint x, + gint y) { GdkWindowObject *window_private; GdkWindowObject *parent_private; @@ -1523,10 +1455,10 @@ _gdk_window_reparent (GdkWindow *window, GdkWindowImplDirectFB *parent_impl; GdkVisual *visual; - g_return_if_fail (GDK_IS_WINDOW (window)); + g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); if (GDK_WINDOW_DESTROYED (window)) - return; + return FALSE; if (!new_parent) new_parent = _gdk_parent_root; @@ -1539,7 +1471,7 @@ _gdk_window_reparent (GdkWindow *window, /* already parented */ if( window_private->parent == (GdkWindowObject *)new_parent ) - return; + return FALSE; window_private->parent = (GdkWindowObject *) new_parent; @@ -1593,7 +1525,7 @@ _gdk_window_reparent (GdkWindow *window, { g_assert(0); _gdk_window_destroy (window, FALSE); - return; + return FALSE; } /* we hold a reference count on ourselves */ g_object_ref (window); @@ -1609,14 +1541,17 @@ _gdk_window_reparent (GdkWindow *window, &rect, &impl->drawable.surface); } + + return TRUE; } -void -_gdk_windowing_window_clear_area (GdkWindow *window, - gint x, - gint y, - gint width, - gint height) +static void +gdk_directfb_window_clear_area (GdkWindow *window, + gint x, + gint y, + gint width, + gint height, + gboolean send_expose) { GdkWindowObject *private; GdkDrawableImplDirectFB *impl; @@ -1700,51 +1635,8 @@ _gdk_windowing_window_clear_area (GdkWin g_object_unref (gc); } -void -_gdk_windowing_window_clear_area_e (GdkWindow *window, - gint x, - gint y, - gint width, - gint height) -{ - GdkRectangle rect; - GdkWindowObject *private; - GdkWindowImplDirectFB *impl; - - D_DEBUG_AT( GDKDFB_Window, "%s( %p, %4d,%4d-%4dx%4d )\n", __FUNCTION__, window, x, y, width, height ); - - g_return_if_fail (GDK_IS_WINDOW (window)); - - private = GDK_WINDOW_OBJECT (window); - impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl); - - /** - Follow XClearArea definition for zero height width - **/ - if( width == 0 ) - width = impl->drawable.width-x; - if( height == 0 ) - height = impl->drawable.height-y; - - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - - g_return_if_fail (GDK_IS_WINDOW (window)); - - if (GDK_WINDOW_DESTROYED (window)) { - D_DEBUG_AT( GDKDFB_Window, " -> DESTROYED!\n" ); - return; - } - - _gdk_windowing_window_clear_area (window, x, y, width, height); - - gdk_window_invalidate_rect (window, &rect, TRUE); -} - -void -gdk_window_raise (GdkWindow *window) +static void +gdk_window_directfb_raise (GdkWindow *window) { GdkWindowImplDirectFB *impl; @@ -1774,8 +1666,8 @@ gdk_window_raise (GdkWindow *window) } } -void -gdk_window_lower (GdkWindow *window) +static void +gdk_window_directfb_lower (GdkWindow *window) { GdkWindowImplDirectFB *impl; @@ -1875,9 +1767,9 @@ gdk_window_set_role (GdkWindow *window * Since: 2.12 * **/ -void +void gdk_window_set_startup_id (GdkWindow *window, - const gchar *startup_id) + const gchar *startup_id) { } @@ -1907,9 +1799,9 @@ gdk_window_set_transient_for (GdkWindow root->children = g_list_insert (root->children, window, i); } -void -gdk_window_set_background (GdkWindow *window, - const GdkColor *color) +static void +gdk_directfb_window_set_background (GdkWindow *window, + const GdkColor *color) { GdkWindowObject *private; @@ -1930,10 +1822,10 @@ gdk_window_set_background (GdkWindow *wi private->bg_pixmap = NULL; } -void -gdk_window_set_back_pixmap (GdkWindow *window, - GdkPixmap *pixmap, - gint parent_relative) +static void +gdk_directfb_window_set_back_pixmap (GdkWindow *window, + GdkPixmap *pixmap, + gboolean parent_relative) { GdkWindowObject *private; GdkPixmap *old_pixmap; @@ -1972,9 +1864,9 @@ gdk_window_set_back_pixmap (GdkWindow *w } } -void -gdk_window_set_cursor (GdkWindow *window, - GdkCursor *cursor) +static void +gdk_directfb_window_set_cursor (GdkWindow *window, + GdkCursor *cursor) { GdkWindowImplDirectFB *impl; GdkCursor *old_cursor; @@ -2011,13 +1903,13 @@ gdk_window_set_cursor (GdkWindow *window gdk_cursor_unref (old_cursor); } -void -gdk_window_get_geometry (GdkWindow *window, - gint *x, - gint *y, - gint *width, - gint *height, - gint *depth) +static void +gdk_directfb_window_get_geometry (GdkWindow *window, + gint *x, + gint *y, + gint *width, + gint *height, + gint *depth) { GdkWindowObject *private; GdkDrawableImplDirectFB *impl; @@ -2078,10 +1970,10 @@ _gdk_directfb_calc_abs (GdkWindow *windo } } -gboolean -gdk_window_get_origin (GdkWindow *window, - gint *x, - gint *y) +static gboolean +gdk_directfb_window_get_origin (GdkWindow *window, + gint *x, + gint *y) { g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); @@ -2215,8 +2107,8 @@ _gdk_windowing_window_get_pointer (displ } -GdkEventMask -gdk_window_get_events (GdkWindow *window) +static GdkEventMask +gdk_directfb_window_get_events (GdkWindow *window) { g_return_val_if_fail (GDK_IS_WINDOW (window), 0); @@ -2226,9 +2118,9 @@ gdk_window_get_events (GdkWindow *window return GDK_WINDOW_OBJECT (window)->event_mask; } -void -gdk_window_set_events (GdkWindow *window, - GdkEventMask event_mask) +static void +gdk_directfb_window_set_events (GdkWindow *window, + GdkEventMask event_mask) { g_return_if_fail (GDK_IS_WINDOW (window)); @@ -2240,27 +2132,27 @@ gdk_window_set_events (GdkWindow *win GDK_WINDOW_OBJECT (window)->event_mask = event_mask; } -void -gdk_window_shape_combine_mask (GdkWindow *window, - GdkBitmap *mask, - gint x, - gint y) +static void +gdk_directfb_window_shape_combine_mask (GdkWindow *window, + GdkBitmap *mask, + gint x, + gint y) { } void gdk_window_input_shape_combine_mask (GdkWindow *window, - GdkBitmap *mask, - gint x, - gint y) + GdkBitmap *mask, + gint x, + gint y) { } -void -gdk_window_shape_combine_region (GdkWindow *window, - const GdkRegion *shape_region, - gint offset_x, - gint offset_y) +static void +gdk_directfb_window_shape_combine_region (GdkWindow *window, + const GdkRegion *shape_region, + gint offset_x, + gint offset_y) { } @@ -2584,13 +2476,13 @@ gdk_window_set_functions (GdkWindow g_message("unimplemented %s", __FUNCTION__); } -void -gdk_window_set_child_shapes (GdkWindow *window) +static void +gdk_directfb_window_set_child_shapes (GdkWindow *window) { } -void -gdk_window_merge_child_shapes (GdkWindow *window) +static void +gdk_directfb_window_merge_child_shapes (GdkWindow *window) { } @@ -2604,9 +2496,9 @@ gdk_window_merge_child_input_shapes (Gdk { } -gboolean -gdk_window_set_static_gravities (GdkWindow *window, - gboolean use_static) +static gboolean +gdk_directfb_window_set_static_gravities (GdkWindow *window, + gboolean use_static) { g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); @@ -3153,11 +3045,11 @@ gdk_window_impl_directfb_begin_paint_reg D_DEBUG_AT( GDKDFB_Window, " -> [%2d] %4d,%4d-%4dx%4d\n", i, GDKDFB_RECTANGLE_VALS_FROM_BOX( box ) ); - _gdk_windowing_window_clear_area (GDK_WINDOW(wimpl->gdkWindow), - box->x1, - box->y1, - box->x2 - box->x1, - box->y2 - box->y1); + gdk_window_clear_area (GDK_WINDOW(wimpl->gdkWindow), + box->x1, + box->y1, + box->x2 - box->x1, + box->y2 - box->y1); } } @@ -3281,6 +3173,33 @@ _gdk_windowing_window_set_composited (Gd { } +static void +gdk_window_impl_iface_init (GdkWindowImplIface *iface) +{ + iface->show = gdk_directfb_window_show; + iface->hide = gdk_directfb_window_hide; + iface->withdraw = gdk_directfb_window_withdraw; + iface->raise = gdk_window_directfb_raise; + iface->lower = gdk_window_directfb_lower; + iface->move_resize = gdk_directfb_window_move_resize; + iface->move_region = _gdk_directfb_window_move_region; + iface->scroll = _gdk_directfb_window_scroll; + iface->clear_area = gdk_directfb_window_clear_area; + iface->set_background = gdk_directfb_window_set_background; + iface->set_back_pixmap = gdk_directfb_window_set_back_pixmap; + iface->get_events = gdk_directfb_window_get_events; + iface->set_events = gdk_directfb_window_set_events; + iface->reparent = gdk_directfb_window_reparent; + iface->set_cursor = gdk_directfb_window_set_cursor; + iface->get_geometry = gdk_directfb_window_get_geometry; + iface->get_origin = gdk_directfb_window_get_origin; + iface->get_offsets = _gdk_directfb_window_get_offsets; + iface->shape_combine_mask = gdk_directfb_window_shape_combine_mask; + iface->shape_combine_region = gdk_directfb_window_shape_combine_region; + iface->set_child_shapes = gdk_directfb_window_set_child_shapes; + iface->merge_child_shapes = gdk_directfb_window_merge_child_shapes; + iface->set_static_gravities = gdk_directfb_window_set_static_gravities; +} #define __GDK_WINDOW_X11_C__ #include "gdkaliasdef.c" Index: gdk/directfb/gdkprivate-directfb.h =================================================================== --- gdk/directfb/gdkprivate-directfb.h (revision 22340) +++ gdk/directfb/gdkprivate-directfb.h (working copy) @@ -172,6 +172,17 @@ void gdk_directfb_window_id_table void gdk_directfb_window_id_table_remove (DFBWindowID dfb_id); GdkWindow * gdk_directfb_window_id_table_lookup (DFBWindowID dfb_id); +void _gdk_directfb_window_get_offsets (GdkWindow *window, + gint *x_offset, + gint *y_offset); +void _gdk_directfb_window_scroll (GdkWindow *window, + gint dx, + gint dy); +void _gdk_directfb_window_move_region (GdkWindow *window, + const GdkRegion *region, + gint dx, + gint dy); + typedef struct {
_______________________________________________ directfb-dev mailing list directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev