[gdl] Remove public members from GdlDockItem



commit 37a3bfe38bb615fe986cbdfcc85464cc0ab4c17c
Author: SÃbastien Granjoux <seb sfo free fr>
Date:   Sun Aug 5 12:55:48 2012 +0200

    Remove public members from GdlDockItem

 gdl/gdl-dock-bar.c      |    7 +-
 gdl/gdl-dock-item.c     |  468 +++++++++++++++++++++++++++++++++++++----------
 gdl/gdl-dock-item.h     |  171 ++++++++++-------
 gdl/gdl-dock-master.c   |   20 +--
 gdl/gdl-dock-notebook.c |   74 ++++----
 gdl/gdl-dock-paned.c    |   84 ++++-----
 6 files changed, 564 insertions(+), 260 deletions(-)
---
diff --git a/gdl/gdl-dock-bar.c b/gdl/gdl-dock-bar.c
index 53358a5..e1aa606 100644
--- a/gdl/gdl-dock-bar.c
+++ b/gdl/gdl-dock-bar.c
@@ -268,7 +268,6 @@ gdl_dock_bar_item_clicked (GtkWidget   *button,
     g_assert (dockbar != NULL);
     g_object_set_data (G_OBJECT (item), "GdlDockBar", NULL);
 
-    GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_ICONIFIED);
     gdl_dock_item_show_item (item);
 }
 
@@ -379,10 +378,10 @@ update_dock_items (GdlDockBar *dockbar, gboolean full_update)
             GdlDockItem *item = GDL_DOCK_ITEM (l->data);
 
             if (g_slist_index (dockbar->priv->items, item) != -1 &&
-                !GDL_DOCK_ITEM_ICONIFIED (item))
+                !gdl_dock_item_is_iconified (item))
                 gdl_dock_bar_remove_item (dockbar, item);
             else if (g_slist_index (dockbar->priv->items, item) == -1 &&
-                GDL_DOCK_ITEM_ICONIFIED (item) &&
+                gdl_dock_item_is_iconified (item) &&
                 !gdl_dock_item_is_placeholder (item))
                 gdl_dock_bar_add_item (dockbar, item);
         }
@@ -392,7 +391,7 @@ update_dock_items (GdlDockBar *dockbar, gboolean full_update)
 
             if (g_slist_index (dockbar->priv->items, item) != -1)
                 gdl_dock_bar_remove_item (dockbar, item);
-            if (GDL_DOCK_ITEM_ICONIFIED (item) &&
+            if (gdl_dock_item_is_iconified (item) &&
                 !gdl_dock_item_is_placeholder (item))
                 gdl_dock_bar_add_item (dockbar, item);
         }
diff --git a/gdl/gdl-dock-item.c b/gdl/gdl-dock-item.c
index 99b48de..837b92c 100644
--- a/gdl/gdl-dock-item.c
+++ b/gdl/gdl-dock-item.c
@@ -64,7 +64,9 @@
 
 /* ----- Private prototypes ----- */
 
-static void  gdl_dock_item_class_init    (GdlDockItemClass *class);
+static void  gdl_dock_item_base_class_init (GdlDockItemClass *class);
+static void  gdl_dock_item_class_init     (GdlDockItemClass *class);
+static void  gdl_dock_item_init		  (GdlDockItem *item);
 
 static GObject *gdl_dock_item_constructor (GType                  type,
                                            guint                  n_construct_properties,
@@ -191,6 +193,18 @@ static guint gdl_dock_item_signals [LAST_SIGNAL] = { 0 };
     (GDL_DOCK_ITEM_HAS_GRIP (item))
 
 struct _GdlDockItemPrivate {
+    GtkWidget *child;
+
+    GdlDockItemBehavior  behavior;
+    GtkOrientation       orientation;
+
+    guint                iconified: 1;
+    guint                resize : 1;
+    guint                in_predrag : 1;
+    guint                in_drag : 1;
+    
+    gint                 dragoff_x, dragoff_y;
+    
     GtkWidget *menu;
 
     gboolean   grip_shown;
@@ -209,6 +223,8 @@ struct _GdlDockItemPrivate {
 };
 
 struct _GdlDockItemClassPrivate {
+    gboolean        has_grip;
+    
     GtkCssProvider *css;
 };
 
@@ -219,8 +235,44 @@ struct _GdlDockItemClassPrivate {
 
 /* ----- Private functions ----- */
 
-G_DEFINE_TYPE_WITH_CODE (GdlDockItem, gdl_dock_item, GDL_TYPE_DOCK_OBJECT,
-                         g_type_add_class_private (g_define_type_id, sizeof (GdlDockItemClassPrivate)))
+/* It is not possible to use G_DEFINE_TYPE_* macro for GdlDockItem because it
+ * has some class private data. The priv pointer has to be initialized in
+ * the base class initialization function because this function is called for
+ * each derived type.
+ */
+
+static gpointer gdl_dock_item_parent_class = NULL;
+
+GType
+gdl_dock_item_get_type (void)
+{
+    static GType gtype = 0;
+
+    if (G_UNLIKELY (gtype == 0)) {
+        const GTypeInfo gtype_info = {
+	    sizeof (GdlDockItemClass),
+	    (GBaseInitFunc) gdl_dock_item_base_class_init,
+	    NULL,
+	    (GClassInitFunc) gdl_dock_item_class_init,
+	    NULL,		/* class_finalize */
+	    NULL,		/* class_data */
+	    sizeof (GdlDockItem),
+	    0,		/* n_preallocs */
+	    (GInstanceInitFunc) gdl_dock_item_init,
+	    NULL,		/* value_table */
+        };
+
+        gtype = g_type_register_static (GDL_TYPE_DOCK_OBJECT,
+                                        "GdlDockItem",
+                                        &gtype_info,
+                                        0);
+
+        g_type_add_class_private (gtype, sizeof (GdlDockItemClassPrivate));
+    }
+
+    return gtype;
+}
+
 
 static void
 add_tab_bindings (GtkBindingSet    *binding_set,
@@ -257,6 +309,12 @@ add_arrow_bindings (GtkBindingSet    *binding_set,
 }
 
 static void
+gdl_dock_item_base_class_init (GdlDockItemClass *klass)
+{
+    klass->priv = G_TYPE_CLASS_GET_PRIVATE (klass, GDL_TYPE_DOCK_ITEM, GdlDockItemClassPrivate);
+}
+
+static void
 gdl_dock_item_class_init (GdlDockItemClass *klass)
 {
     GObjectClass       *object_class;
@@ -269,6 +327,8 @@ gdl_dock_item_class_init (GdlDockItemClass *klass)
        "}";
     GtkBindingSet      *binding_set;
 
+    gdl_dock_item_parent_class = g_type_class_peek_parent (klass);
+    
     object_class = G_OBJECT_CLASS (klass);
     widget_class = GTK_WIDGET_CLASS (klass);
     container_class = GTK_CONTAINER_CLASS (klass);
@@ -303,7 +363,7 @@ gdl_dock_item_class_init (GdlDockItemClass *klass)
     dock_object_class->dock = gdl_dock_item_dock;
     dock_object_class->present = gdl_dock_item_present;
 
-    klass->has_grip = TRUE;
+    klass->priv->has_grip = TRUE;
     klass->dock_drag_begin = NULL;
     klass->dock_drag_motion = NULL;
     klass->dock_drag_end = NULL;
@@ -545,8 +605,6 @@ gdl_dock_item_class_init (GdlDockItemClass *klass)
     g_type_class_add_private (object_class, sizeof (GdlDockItemPrivate));
 
     /* set the style */
-    klass->priv = G_TYPE_CLASS_GET_PRIVATE (klass, GDL_TYPE_DOCK_ITEM, GdlDockItemClassPrivate);
-
     klass->priv->css = gtk_css_provider_new ();
     gtk_css_provider_load_from_data (klass->priv->css, style, -1, NULL);
 }
@@ -561,15 +619,18 @@ gdl_dock_item_init (GdlDockItem *item)
     gtk_widget_set_has_window (GTK_WIDGET (item), TRUE);
     gtk_widget_set_can_focus (GTK_WIDGET (item), TRUE);
 
-    item->child = NULL;
-
-    item->orientation = GTK_ORIENTATION_VERTICAL;
-    item->behavior = GDL_DOCK_ITEM_BEH_NORMAL;
+    item->priv->child = NULL;
 
-    item->resize = TRUE;
+    item->priv->orientation = GTK_ORIENTATION_VERTICAL;
+    item->priv->behavior = GDL_DOCK_ITEM_BEH_NORMAL;
 
-    item->dragoff_x = item->dragoff_y = 0;
+    item->priv->iconified = FALSE;
+    
+    item->priv->resize = TRUE;
 
+    item->priv->dragoff_x = item->priv->dragoff_y = 0;
+    item->priv->in_predrag = item->priv->in_drag = FALSE;
+   
     item->priv->menu = NULL;
 
     item->priv->preferred_width = item->priv->preferred_height = -1;
@@ -684,32 +745,24 @@ gdl_dock_item_set_property  (GObject      *g_object,
             gdl_dock_item_set_orientation (item, g_value_get_enum (value));
             break;
         case PROP_RESIZE:
-            item->resize = g_value_get_boolean (value);
+            item->priv->resize = g_value_get_boolean (value);
             gtk_widget_queue_resize (GTK_WIDGET (item));
             break;
         case PROP_BEHAVIOR:
         {
-            GdlDockItemBehavior old_beh = item->behavior;
-            item->behavior = g_value_get_flags (value);
-
-            if ((old_beh ^ item->behavior) & GDL_DOCK_ITEM_BEH_LOCKED) {
-                gdl_dock_object_layout_changed_notify (GDL_DOCK_OBJECT (item));
-                g_object_notify (g_object, "locked");
-                gdl_dock_item_showhide_grip (item);
-            }
-
+            gdl_dock_item_set_behavior_flags (item, g_value_get_flags (value), TRUE);
             break;
         }
         case PROP_LOCKED:
         {
-            GdlDockItemBehavior old_beh = item->behavior;
+            GdlDockItemBehavior old_beh = item->priv->behavior;
 
             if (g_value_get_boolean (value))
-                item->behavior |= GDL_DOCK_ITEM_BEH_LOCKED;
+                item->priv->behavior |= GDL_DOCK_ITEM_BEH_LOCKED;
             else
-                item->behavior &= ~GDL_DOCK_ITEM_BEH_LOCKED;
+                item->priv->behavior &= ~GDL_DOCK_ITEM_BEH_LOCKED;
 
-            if (old_beh ^ item->behavior) {
+            if (old_beh ^ item->priv->behavior) {
                 gdl_dock_item_showhide_grip (item);
                 g_object_notify (g_object, "behavior");
 
@@ -725,10 +778,10 @@ gdl_dock_item_set_property  (GObject      *g_object,
             break;
         case PROP_ICONIFIED:
             if (g_value_get_boolean (value)) {
-                if (!GDL_DOCK_ITEM_ICONIFIED (item)) gdl_dock_item_iconify_item (item);
+                if (!item->priv->iconified) gdl_dock_item_iconify_item (item);
             }
-            else if (GDL_DOCK_ITEM_ICONIFIED (item)) {
-                GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_ICONIFIED);
+            else if (item->priv->iconified) {
+                item->priv->iconified = FALSE;
                 gtk_widget_show (GTK_WIDGET (item));
                 gtk_widget_queue_resize (GTK_WIDGET (item));
             }
@@ -737,7 +790,7 @@ gdl_dock_item_set_property  (GObject      *g_object,
             if (g_value_get_boolean (value)) {
                 gtk_widget_hide (GTK_WIDGET (item));
             } else {
-                if (!GDL_DOCK_ITEM_ICONIFIED (item) && !gdl_dock_item_is_placeholder (item))
+                if (!item->priv->iconified && !gdl_dock_item_is_placeholder (item))
                     gtk_widget_show (GTK_WIDGET (item));
 	    }
             break;
@@ -757,13 +810,13 @@ gdl_dock_item_get_property  (GObject      *g_object,
 
     switch (prop_id) {
         case PROP_ORIENTATION:
-            g_value_set_enum (value, item->orientation);
+            g_value_set_enum (value, item->priv->orientation);
             break;
         case PROP_RESIZE:
-            g_value_set_boolean (value, item->resize);
+            g_value_set_boolean (value, item->priv->resize);
             break;
         case PROP_BEHAVIOR:
-            g_value_set_flags (value, item->behavior);
+            g_value_set_flags (value, item->priv->behavior);
             break;
         case PROP_LOCKED:
             g_value_set_boolean (value, !GDL_DOCK_ITEM_NOT_LOCKED (item));
@@ -775,7 +828,7 @@ gdl_dock_item_get_property  (GObject      *g_object,
             g_value_set_int (value, item->priv->preferred_height);
             break;
         case PROP_ICONIFIED:
-            g_value_set_boolean (value, GDL_DOCK_ITEM_ICONIFIED (item));
+            g_value_set_boolean (value, gdl_dock_item_is_iconified (item));
             break;
         case PROP_CLOSED:
             g_value_set_boolean (value, gdl_dock_item_is_closed (item));
@@ -825,18 +878,18 @@ gdl_dock_item_add (GtkContainer *container,
         return;
     }
 
-    if (item->child != NULL) {
+    if (item->priv->child != NULL) {
         g_warning (_("Attempting to add a widget with type %s to a %s, "
                      "but it can only contain one widget at a time; "
                      "it already contains a widget of type %s"),
                      G_OBJECT_TYPE_NAME (widget),
                      G_OBJECT_TYPE_NAME (item),
-                     G_OBJECT_TYPE_NAME (item->child));
+                     G_OBJECT_TYPE_NAME (item->priv->child));
         return;
     }
 
     gtk_widget_set_parent (widget, GTK_WIDGET (item));
-    item->child = widget;
+    item->priv->child = widget;
 }
 
 static void
@@ -860,12 +913,12 @@ gdl_dock_item_remove (GtkContainer *container,
 
     gdl_dock_item_drag_end (item, TRUE);
 
-    g_return_if_fail (item->child == widget);
+    g_return_if_fail (item->priv->child == widget);
 
     was_visible = gtk_widget_get_visible (widget);
 
     gtk_widget_unparent (widget);
-    item->child = NULL;
+    item->priv->child = NULL;
 
     if (was_visible)
         gtk_widget_queue_resize (GTK_WIDGET (container));
@@ -884,8 +937,8 @@ gdl_dock_item_forall (GtkContainer *container,
     if (include_internals && item->priv->grip)
         (* callback) (item->priv->grip, callback_data);
 
-    if (item->child)
-        (* callback) (item->child, callback_data);
+    if (item->priv->child)
+        (* callback) (item->priv->child, callback_data);
 }
 
 static GType
@@ -893,7 +946,7 @@ gdl_dock_item_child_type (GtkContainer *container)
 {
     g_return_val_if_fail (GDL_IS_DOCK_ITEM (container), G_TYPE_NONE);
 
-    if (!GDL_DOCK_ITEM (container)->child)
+    if (!GDL_DOCK_ITEM (container)->priv->child)
         return GTK_TYPE_WIDGET;
     else
         return G_TYPE_NONE;
@@ -928,23 +981,23 @@ gdl_dock_item_get_preferred_width (GtkWidget *widget,
 
     /* If our child is not visible, we still request its size, since
        we won't have any useful hint for our size otherwise.  */
-    if (item->child)
-        gtk_widget_get_preferred_width (item->child, &child_min, &child_nat);
+    if (item->priv->child)
+        gtk_widget_get_preferred_width (item->priv->child, &child_min, &child_nat);
     else
         child_min = child_nat = 0;
 
-    if (item->orientation == GTK_ORIENTATION_HORIZONTAL) {
+    if (item->priv->orientation == GTK_ORIENTATION_HORIZONTAL) {
         if (GDL_DOCK_ITEM_GRIP_SHOWN (item)) {
             gtk_widget_get_preferred_width (item->priv->grip, minimum, natural);
         } else
             *minimum = *natural = 0;
 
-        if (item->child) {
+        if (item->priv->child) {
             *minimum += child_min;
             *natural += child_nat;
         }
     } else {
-        if (item->child) {
+        if (item->priv->child) {
             *minimum = child_min;
             *natural = child_nat;
         } else
@@ -975,13 +1028,13 @@ gdl_dock_item_get_preferred_height (GtkWidget *widget,
 
     /* If our child is not visible, we still request its size, since
        we won't have any useful hint for our size otherwise.  */
-    if (item->child)
-        gtk_widget_get_preferred_height (item->child, &child_min, &child_nat);
+    if (item->priv->child)
+        gtk_widget_get_preferred_height (item->priv->child, &child_min, &child_nat);
     else
         child_min = child_nat = 0;
 
-    if (item->orientation == GTK_ORIENTATION_HORIZONTAL) {
-        if (item->child) {
+    if (item->priv->orientation == GTK_ORIENTATION_HORIZONTAL) {
+        if (item->priv->child) {
             *minimum = child_min;
             *natural = child_nat;
         } else
@@ -992,7 +1045,7 @@ gdl_dock_item_get_preferred_height (GtkWidget *widget,
         } else
             *minimum = *natural = 0;
 
-        if (item->child) {
+        if (item->priv->child) {
             *minimum += child_min;
             *natural += child_nat;
         }
@@ -1030,7 +1083,7 @@ gdl_dock_item_size_allocate (GtkWidget     *widget,
                                 allocation->width,
                                 allocation->height);
 
-    if (item->child && gtk_widget_get_visible (item->child)) {
+    if (item->priv->child && gtk_widget_get_visible (item->priv->child)) {
         GtkAllocation  child_allocation;
         GtkStyleContext *context;
         GtkStateFlags state;
@@ -1053,7 +1106,7 @@ gdl_dock_item_size_allocate (GtkWidget     *widget,
 
             gtk_widget_get_preferred_size (item->priv->grip, &grip_req, NULL);
 
-            if (item->orientation == GTK_ORIENTATION_HORIZONTAL) {
+            if (item->priv->orientation == GTK_ORIENTATION_HORIZONTAL) {
                 child_allocation.x += grip_req.width;
                 child_allocation.width -= grip_req.width;
                 grip_alloc.width = grip_req.width;
@@ -1070,7 +1123,7 @@ gdl_dock_item_size_allocate (GtkWidget     *widget,
             child_allocation.width = 0;
         if (child_allocation.height < 0)
             child_allocation.height = 0;
-        gtk_widget_size_allocate (item->child, &child_allocation);
+        gtk_widget_size_allocate (item->priv->child, &child_allocation);
     }
 }
 
@@ -1088,10 +1141,10 @@ gdl_dock_item_map (GtkWidget *widget)
 
     gdk_window_show (gtk_widget_get_window (widget));
 
-    if (item->child
-        && gtk_widget_get_visible (item->child)
-        && !gtk_widget_get_mapped (item->child))
-        gtk_widget_map (item->child);
+    if (item->priv->child
+        && gtk_widget_get_visible (item->priv->child)
+        && !gtk_widget_get_mapped (item->priv->child))
+        gtk_widget_map (item->priv->child);
 
     if (item->priv->grip
         && gtk_widget_get_visible (GTK_WIDGET (item->priv->grip))
@@ -1113,8 +1166,8 @@ gdl_dock_item_unmap (GtkWidget *widget)
 
     gdk_window_hide (gtk_widget_get_window (widget));
 
-    if (item->child)
-	gtk_widget_unmap (item->child);
+    if (item->priv->child)
+	gtk_widget_unmap (item->priv->child);
 
     if (item->priv->grip)
         gtk_widget_unmap (item->priv->grip);
@@ -1159,8 +1212,8 @@ gdl_dock_item_realize (GtkWidget *widget)
     gtk_style_context_set_background (gtk_widget_get_style_context (widget),
                                       window);
 
-    if (item->child)
-        gtk_widget_set_parent_window (item->child, window);
+    if (item->priv->child)
+        gtk_widget_set_parent_window (item->priv->child, window);
 
     if (item->priv->grip)
         gtk_widget_set_parent_window (item->priv->grip, window);
@@ -1171,7 +1224,7 @@ gdl_dock_item_move_focus_child (GdlDockItem      *item,
                                 GtkDirectionType  dir)
 {
     g_return_if_fail (GDL_IS_DOCK_ITEM (item));
-    gtk_widget_child_focus (GTK_WIDGET (item->child), dir);
+    gtk_widget_child_focus (GTK_WIDGET (item->priv->child), dir);
 }
 
 #define EVENT_IN_GRIP_EVENT_WINDOW(ev,gr) \
@@ -1203,7 +1256,7 @@ gdl_dock_item_button_changed (GtkWidget      *widget,
     gtk_widget_get_allocation (item->priv->grip, &allocation);
 
     /* Check if user clicked on the drag handle. */
-    switch (item->orientation) {
+    switch (item->priv->orientation) {
     case GTK_ORIENTATION_HORIZONTAL:
         in_handle = event->x < allocation.width;
         break;
@@ -1226,7 +1279,7 @@ gdl_dock_item_button_changed (GtkWidget      *widget,
             item->priv->start_x = event->x;
             item->priv->start_y = event->y;
 
-            GDL_DOCK_OBJECT_SET_FLAGS (item, GDL_DOCK_IN_PREDRAG);
+            item->priv->in_predrag = TRUE;
 
             gdl_dock_item_grip_set_cursor (GDL_DOCK_ITEM_GRIP (item->priv->grip), TRUE);
 
@@ -1263,21 +1316,21 @@ gdl_dock_item_motion (GtkWidget      *widget,
     if (!EVENT_IN_GRIP_EVENT_WINDOW (event, item->priv->grip))
         return FALSE;
 
-    if (GDL_DOCK_ITEM_IN_PREDRAG (item)) {
+    if (item->priv->in_predrag) {
         if (gtk_drag_check_threshold (widget,
                                       item->priv->start_x,
                                       item->priv->start_y,
                                       event->x,
                                       event->y)) {
-            GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_IN_PREDRAG);
-            item->dragoff_x = item->priv->start_x;
-            item->dragoff_y = item->priv->start_y;
+            item->priv->in_predrag = FALSE;
+            item->priv->dragoff_x = item->priv->start_x;
+            item->priv->dragoff_y = item->priv->start_y;
 
             gdl_dock_item_drag_start (item);
         }
     }
 
-    if (!GDL_DOCK_ITEM_IN_DRAG (item))
+    if (!item->priv->in_drag)
         return FALSE;
 
     new_x = event->x_root;
@@ -1360,7 +1413,7 @@ gdl_dock_item_dock_request (GdlDockObject  *object,
         request->rect.width = alloc.width;
         request->rect.height = alloc.height;
 
-        GdlDockItemBehavior behavior = GDL_DOCK_ITEM(object)->behavior;
+        GdlDockItemBehavior behavior = GDL_DOCK_ITEM(object)->priv->behavior;
 
         /* Calculate docking indicator rectangle size for new locations. Only
            do this when we're not over the item's current location. */
@@ -1635,8 +1688,8 @@ gdl_dock_item_dock (GdlDockObject    *object,
     {
         /* Activate the page we just added */
         GdlDockItem* notebook = GDL_DOCK_ITEM (gdl_dock_object_get_parent_object (requestor));
-        gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook->child),
-                               gtk_notebook_page_num (GTK_NOTEBOOK (notebook->child), GTK_WIDGET (requestor)));
+        gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook->priv->child),
+                               gtk_notebook_page_num (GTK_NOTEBOOK (notebook->priv->child), GTK_WIDGET (requestor)));
     }
 
     if (parent)
@@ -1677,7 +1730,7 @@ gdl_dock_item_popup_menu (GdlDockItem  *item,
                                    GTK_WIDGET (item),
                                    gdl_dock_item_detach_menu);
 
-        if (item->behavior & GDL_DOCK_ITEM_BEH_LOCKED) {
+        if (item->priv->behavior & GDL_DOCK_ITEM_BEH_LOCKED) {
             /* UnLock menuitem */
             mitem = gtk_menu_item_new_with_label (_("UnLock"));
             gtk_menu_shell_append (GTK_MENU_SHELL (item->priv->menu),
@@ -1710,7 +1763,7 @@ gdl_dock_item_drag_start (GdlDockItem *item)
     if (!gtk_widget_get_realized (GTK_WIDGET (item)))
         gtk_widget_realize (GTK_WIDGET (item));
 
-    GDL_DOCK_OBJECT_SET_FLAGS (item, GDL_DOCK_IN_DRAG);
+    item->priv->in_drag = TRUE;
 
     /* grab the keyboard & pointer. The pointer has already been grabbed by the grip
      * window when it has received a press button event. See gdk_pointer_grab. */
@@ -1724,16 +1777,16 @@ static gboolean
 gdl_dock_item_drag_end (GdlDockItem *item,
                         gboolean     cancel)
 {
-    if (GDL_DOCK_ITEM_IN_DRAG (item)) {
+    if (item->priv->in_drag) {
         /* Release pointer & keyboard. */
         gtk_grab_remove (gtk_grab_get_current ());
         g_signal_emit (item, gdl_dock_item_signals [DOCK_DRAG_END], 0, cancel);
         gtk_widget_grab_focus (GTK_WIDGET (item));
 
-        GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_IN_DRAG);
+        item->priv->in_drag = FALSE;
     }
-    else if (GDL_DOCK_ITEM_IN_PREDRAG (item)) {
-        GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_IN_PREDRAG);
+    else if (item->priv->in_predrag) {
+        item->priv->in_predrag = FALSE;
     }
     else {
         /* No drag not pre-drag has been started */
@@ -1763,15 +1816,15 @@ gdl_dock_item_tab_button (GtkWidget      *widget,
     case 1:
         /* set dragoff_{x,y} as we the user clicked on the middle of the
            drag handle */
-        switch (item->orientation) {
+        switch (item->priv->orientation) {
         case GTK_ORIENTATION_HORIZONTAL:
             gtk_widget_get_allocation (GTK_WIDGET (data), &allocation);
-            /*item->dragoff_x = item->priv->grip_size / 2;*/
-            item->dragoff_y = allocation.height / 2;
+            /*item->priv->dragoff_x = item->priv->grip_size / 2;*/
+            item->priv->dragoff_y = allocation.height / 2;
             break;
         case GTK_ORIENTATION_VERTICAL:
-            /*item->dragoff_x = GTK_WIDGET (data)->allocation.width / 2;*/
-            item->dragoff_y = item->priv->grip_size / 2;
+            /*item->priv->dragoff_x = GTK_WIDGET (data)->allocation.width / 2;*/
+            item->priv->dragoff_y = item->priv->grip_size / 2;
             break;
         };
         gdl_dock_item_drag_start (item);
@@ -1831,7 +1884,7 @@ static void
 gdl_dock_item_real_set_orientation (GdlDockItem    *item,
                                     GtkOrientation  orientation)
 {
-    item->orientation = orientation;
+    item->priv->orientation = orientation;
 
     if (gtk_widget_is_drawable (GTK_WIDGET (item)))
         gtk_widget_queue_draw (GTK_WIDGET (item));
@@ -1955,7 +2008,7 @@ gdl_dock_item_dock_to (GdlDockItem      *item,
     g_return_if_fail (item != NULL);
     g_return_if_fail (item != target);
     g_return_if_fail (target != NULL || position == GDL_DOCK_FLOATING);
-    g_return_if_fail ((item->behavior & GDL_DOCK_ITEM_BEH_NEVER_FLOATING) == 0 || position != GDL_DOCK_FLOATING);
+    g_return_if_fail ((item->priv->behavior & GDL_DOCK_ITEM_BEH_NEVER_FLOATING) == 0 || position != GDL_DOCK_FLOATING);
 
     if (position == GDL_DOCK_FLOATING || !target) {
         GdlDockObject *controller;
@@ -1971,7 +2024,7 @@ gdl_dock_item_dock_to (GdlDockItem      *item,
            re-docking... does this make sense now? */
 
         /* Create new floating dock for widget. */
-        item->dragoff_x = item->dragoff_y = 0;
+        item->priv->dragoff_x = item->priv->dragoff_y = 0;
         gdl_dock_add_floating_item (GDL_DOCK (controller),
                                     item, 0, 0, -1, -1);
 
@@ -2001,13 +2054,13 @@ gdl_dock_item_set_orientation (GdlDockItem    *item,
 
     g_return_if_fail (item != NULL);
 
-    if (item->orientation != orientation) {
+    if (item->priv->orientation != orientation) {
         /* push the property down the hierarchy if our child supports it */
-        if (item->child != NULL) {
+        if (item->priv->child != NULL) {
             pspec = g_object_class_find_property (
-                G_OBJECT_GET_CLASS (item->child), "orientation");
+                G_OBJECT_GET_CLASS (item->priv->child), "orientation");
             if (pspec && pspec->value_type == GTK_TYPE_ORIENTATION)
-                g_object_set (G_OBJECT (item->child),
+                g_object_set (G_OBJECT (item->priv->child),
                               "orientation", orientation,
                               NULL);
         };
@@ -2018,6 +2071,110 @@ gdl_dock_item_set_orientation (GdlDockItem    *item,
 }
 
 /**
+ * gdl_dock_item_get_orientation:
+ * @item: a #GdlDockItem
+ *
+ * Retrieves the orientation of the object.
+ *
+ * Return value: the orientation of the object.
+ *
+ * Since: 3.6
+ */
+GtkOrientation
+gdl_dock_item_get_orientation (GdlDockItem *item)
+{
+    g_return_val_if_fail (GDL_IS_DOCK_ITEM (item), GTK_ORIENTATION_HORIZONTAL);
+
+    return item->priv->orientation;
+}
+
+/**
+ * gdl_dock_item_set_behavior_flags:
+ * @item: The dock item which will get it's behavior set.
+ * @behavior: Behavior flags to turn on
+ * @clear: Whether to clear state before turning on @flags
+ * 
+ * This function sets the behavior of the dock item.
+ *
+ * Since: 3.6
+ */
+void
+gdl_dock_item_set_behavior_flags (GdlDockItem *item,
+                                  GdlDockItemBehavior behavior,
+                                  gboolean clear)
+{
+    GdlDockItemBehavior old_beh = item->priv->behavior;
+    g_return_if_fail (GDL_IS_DOCK_ITEM (item));
+
+    if (clear)
+        item->priv->behavior = behavior;
+    else
+        item->priv->behavior |= behavior;
+
+    if ((old_beh ^ behavior) & GDL_DOCK_ITEM_BEH_LOCKED) {
+        gdl_dock_object_layout_changed_notify (GDL_DOCK_OBJECT (item));
+        g_object_notify (G_OBJECT (item), "locked");
+        gdl_dock_item_showhide_grip (item);
+    }
+}
+
+/**
+ * gdl_dock_item_unset_behavior_flags:
+ * @item: The dock item which will get it's behavior set.
+ * @behavior: Behavior flags to turn off
+ * 
+ * This function sets the behavior of the dock item.
+ *
+ * Since: 3.6
+ */
+void
+gdl_dock_item_unset_behavior_flags (GdlDockItem *item,
+                                    GdlDockItemBehavior behavior)
+{
+    GdlDockItemBehavior old_beh = item->priv->behavior;
+    g_return_if_fail (GDL_IS_DOCK_ITEM (item));
+
+    item->priv->behavior &= ~behavior;
+
+    if ((old_beh ^ behavior) & GDL_DOCK_ITEM_BEH_LOCKED) {
+        gdl_dock_object_layout_changed_notify (GDL_DOCK_OBJECT (item));
+        g_object_notify (G_OBJECT (item), "locked");
+        gdl_dock_item_showhide_grip (item);
+    }
+}
+
+/**
+ * gdl_dock_item_get_behavior_flags:
+ * @item: a #GdlDockItem
+ *
+ * Retrieves the behavior of the item.
+ *
+ * Return value: the behavior of the item.
+ *
+ * Since: 3.6
+ */
+GdlDockItemBehavior
+gdl_dock_item_get_behavior_flags (GdlDockItem *item)
+{
+    GdlDockItemBehavior behavior;
+    g_return_val_if_fail (GDL_IS_DOCK_ITEM (item), GDL_DOCK_ITEM_BEH_NORMAL);
+
+    behavior = item->priv->behavior;
+    if (!(behavior & GDL_DOCK_ITEM_BEH_NO_GRIP) && !(GDL_DOCK_ITEM_GET_CLASS (item)->priv->has_grip))
+        behavior |= GDL_DOCK_ITEM_BEH_NO_GRIP;
+    if (behavior & GDL_DOCK_ITEM_BEH_LOCKED)
+        behavior |= GDL_DOCK_ITEM_BEH_CANT_ICONIFY |
+                    GDL_DOCK_ITEM_BEH_CANT_ICONIFY |
+                    GDL_DOCK_ITEM_BEH_CANT_DOCK_TOP |
+                    GDL_DOCK_ITEM_BEH_CANT_DOCK_BOTTOM |
+                    GDL_DOCK_ITEM_BEH_CANT_DOCK_LEFT |
+                    GDL_DOCK_ITEM_BEH_CANT_DOCK_RIGHT |
+                    GDL_DOCK_ITEM_BEH_CANT_DOCK_CENTER;
+    
+    return behavior;
+}
+
+/**
  * gdl_dock_item_get_tablabel:
  * @item: The dock item from which to get the tab label widget.
  *
@@ -2213,7 +2370,7 @@ gdl_dock_item_iconify_item (GdlDockItem *item)
 {
     g_return_if_fail (item != NULL);
 
-    GDL_DOCK_OBJECT_SET_FLAGS (item, GDL_DOCK_ICONIFIED);
+    item->priv->iconified = TRUE;
     gtk_widget_hide (GTK_WIDGET (item));
 }
 
@@ -2237,7 +2394,7 @@ gdl_dock_item_show_item (GdlDockItem *item)
             toplevel = gdl_dock_object_get_controller (GDL_DOCK_OBJECT (item));
             if (toplevel == GDL_DOCK_OBJECT (item)) return;
         
-            if (item->behavior & GDL_DOCK_ITEM_BEH_NEVER_FLOATING) {
+            if (item->priv->behavior & GDL_DOCK_ITEM_BEH_NEVER_FLOATING) {
                 g_warning("Object %s has no default position and flag GDL_DOCK_ITEM_BEH_NEVER_FLOATING is set.\n",
                           gdl_dock_object_get_name (GDL_DOCK_OBJECT (item)));
                 return;
@@ -2253,7 +2410,7 @@ gdl_dock_item_show_item (GdlDockItem *item)
             return;
     }
 
-    GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_ICONIFIED);
+    item->priv->iconified = FALSE;
     gtk_widget_show (GTK_WIDGET (item));
 
     return;
@@ -2309,6 +2466,31 @@ gdl_dock_item_preferred_size (GdlDockItem    *item,
 }
 
 /**
+ * gdl_dock_item_get_drag_area:
+ * @item: The dock item to get the preferred size of.
+ * @req: A pointer to a #GdkRectangle that will receive the drag position
+ *
+ * Gets the size and the position of the drag window in pixels.
+ * 
+ * Since: 3.6
+ */
+void
+gdl_dock_item_get_drag_area (GdlDockItem    *item,
+                             GdkRectangle   *rect)
+{
+    GtkAllocation allocation;
+
+    g_return_if_fail (GDL_IS_DOCK_ITEM (item));
+    g_return_if_fail (rect != NULL);
+
+    rect->x = item->priv->dragoff_x;
+    rect->y = item->priv->dragoff_y;
+    gtk_widget_get_allocation (GTK_WIDGET (item), &allocation);
+    rect->width = MAX (item->priv->preferred_width, allocation.width);
+    rect->height = MAX (item->priv->preferred_height, allocation.height);
+}
+
+/**
  * gdl_dock_item_or_child_has_focus:
  * @item: The dock item to be checked
  *
@@ -2353,7 +2535,7 @@ gdl_dock_item_or_child_has_focus (GdlDockItem *item)
 gboolean 
 gdl_dock_item_is_placeholder (GdlDockItem *item)
 {
-    return item->child == NULL;
+    return item->priv->child == NULL;
 }
 
 /**
@@ -2368,11 +2550,103 @@ gdl_dock_item_is_placeholder (GdlDockItem *item)
  * Since: 3.6
  */
 gboolean
-gdl_dock_item_is_closed (GdlDockItem      *item)
+gdl_dock_item_is_closed (GdlDockItem *item)
 {
+    g_return_val_if_fail (GDL_IS_DOCK_ITEM (item), FALSE);
+
     return gdl_dock_object_is_closed (GDL_DOCK_OBJECT (item));
 }
 
+/**
+ * gdl_dock_item_is_iconified:
+ * @item: The dock item to be checked
+ *
+ * Checks whether a given #GdlDockItem is iconified.
+ * 
+ * Returns: %TRUE if the dock item is iconified.
+ *
+ * Since: 3.6
+ */
+gboolean
+gdl_dock_item_is_iconified (GdlDockItem *item)
+{
+    g_return_val_if_fail (GDL_IS_DOCK_ITEM (item), FALSE);
+    
+    return item->priv->iconified;
+}
+
+/**
+ * gdl_dock_item_set_child:
+ * @item: a #GdlDockItem
+ * @widget: (allow-none): a #GtkWidget
+ *
+ * Set a new child for the #GdlDockItem. This child is different from the
+ * children using the #GtkContainer interface. It is a private child reserved
+ * for the widget implementation.
+ *
+ * If a child is already present, it will be replaced. If @widget is %NULL the
+ * child will be removed.
+ *    
+ * Since: 3.6
+ */
+void
+gdl_dock_item_set_child (GdlDockItem *item,
+                         GtkWidget *child)
+{
+    g_return_if_fail (GDL_IS_DOCK_ITEM (item));
+
+    if (item->priv->child != NULL) {
+        gtk_widget_unparent (item->priv->child);
+        item->priv->child = NULL;
+    }
+
+    if (child != NULL) {
+        gtk_widget_set_parent (child, GTK_WIDGET (item));
+        item->priv->child = child;
+    }
+}
+
+/**
+ * gdl_dock_item_get_child:
+ * @item: a #GdlDockItem
+ *
+ * Gets the child of the #GdlDockItem, or %NULL if the item contains
+ * no child widget. The returned widget does not have a reference
+ * added, so you do not need to unref it.
+ *
+ * Return value: (transfer none): pointer to child of the #GdlDockItem
+ *
+ * Since: 3.6
+ */
+GtkWidget*
+gdl_dock_item_get_child (GdlDockItem *item)
+{
+    g_return_val_if_fail (GDL_IS_DOCK_ITEM (item), NULL);
+
+    return item->priv->child;
+}
+
+
+/**
+ * gdl_dock_item_class_set_has_grip:
+ * @item: a #GdlDockItemClass
+ * @has_grip: %TRUE is the dock item has a grip
+ *
+ * Define in the corresponding kind of dock item has a grip. Even if an item
+ * has a grip it can be hidden.
+ *    
+ * Since: 3.6
+ */
+void
+gdl_dock_item_class_set_has_grip (GdlDockItemClass *item_class,
+                                  gboolean         has_grip)
+{
+    g_return_if_fail (GDL_IS_DOCK_ITEM_CLASS (item_class));
+
+    item_class->priv->has_grip = has_grip;
+}
+
+
 
 /* ----- gtk orientation type exporter/importer ----- */
 
diff --git a/gdl/gdl-dock-item.h b/gdl/gdl-dock-item.h
index ccf3bfb..a5ae07a 100644
--- a/gdl/gdl-dock-item.h
+++ b/gdl/gdl-dock-item.h
@@ -79,6 +79,7 @@ typedef enum {
 } GdlDockItemBehavior;
 
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GdlDockItemFlags:
  * @GDL_DOCK_IN_DRAG: item is in a drag operation
@@ -88,6 +89,7 @@ typedef enum {
  *
  * Status flag of a GdlDockItem. Don't use unless you derive a widget from GdlDockItem
  *
+ * Deprecated: 3.6: Use your own private data instead.
  **/
 typedef enum {
     GDL_DOCK_IN_DRAG             = 1 << GDL_DOCK_OBJECT_FLAGS_SHIFT,
@@ -95,6 +97,7 @@ typedef enum {
     GDL_DOCK_ICONIFIED           = 1 << (GDL_DOCK_OBJECT_FLAGS_SHIFT + 2),
     GDL_DOCK_USER_ACTION         = 1 << (GDL_DOCK_OBJECT_FLAGS_SHIFT + 3)
 } GdlDockItemFlags;
+#endif
 
 typedef struct _GdlDockItem             GdlDockItem;
 typedef struct _GdlDockItemPrivate      GdlDockItemPrivate;
@@ -103,16 +106,8 @@ typedef struct _GdlDockItemClassPrivate GdlDockItemClassPrivate;
 
 struct _GdlDockItem {
     GdlDockObject        object;
-
-    GtkWidget           *child;
-    GdlDockItemBehavior  behavior;
-    GtkOrientation       orientation;
-
-    guint                resize : 1;
-
-    gint                 dragoff_x, dragoff_y;    /* these need to be
-                                                     accesible from
-                                                     outside */
+    
+    /* < private> */
     GdlDockItemPrivate  *priv;
 };
 
@@ -121,8 +116,6 @@ struct _GdlDockItemClass {
 
     GdlDockItemClassPrivate *priv;
 
-    gboolean            has_grip;
-
     /* virtuals */
     void     (* set_orientation)  (GdlDockItem    *item,
                                    GtkOrientation  orientation);
@@ -148,8 +141,10 @@ struct _GdlDockItemClass {
  * Deprecated: 3.6: Use GDL_DOCK_OBJECT_FLAGS instead
  */
 #define GDL_DOCK_ITEM_FLAGS(item)     (GDL_DOCK_OBJECT (item)->flags)
+#endif
 
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GDL_DOCK_ITEM_SET_FLAGS:
  * @item: A #GdlDockObject
@@ -161,7 +156,9 @@ struct _GdlDockItemClass {
  */
 #define GDL_DOCK_ITEM_SET_FLAGS(item,flag) \
     G_STMT_START { (GDL_DOCK_OBJECT_FLAGS (item) |= (flag)); } G_STMT_END
+#endif
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GDL_DOCK_ITEM_UNSET_FLAGS:
  * @item: A #GdlDockObject
@@ -173,47 +170,62 @@ struct _GdlDockItemClass {
  */
 #define GDL_DOCK_ITEM_UNSET_FLAGS(item,flag) \
     G_STMT_START { (GDL_DOCK_OBJECT_FLAGS (item) &= ~(flag)); } G_STMT_END
-
 #endif
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GDL_DOCK_ITEM_IN_DRAG:
  * @item: A #GdlDockObject
  *
  * Evaluates to %TRUE if the user is dragging the item.
+ *
+ * Deprecated: 3.6: Use a private flag instead
  */
 #define GDL_DOCK_ITEM_IN_DRAG(item) \
     ((GDL_DOCK_OBJECT_FLAGS (item) & GDL_DOCK_IN_DRAG) != 0)
+#endif
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GDL_DOCK_ITEM_IN_PREDRAG:
  * @item: A #GdlDockObject
  *
  * Evaluates to %TRUE if the user has clicked on the item but hasn't made a big
  * enough move to start the drag operation.
+ *
+ * Deprecated: 3.6: Use a private flag instead
  */
 #define GDL_DOCK_ITEM_IN_PREDRAG(item) \
     ((GDL_DOCK_OBJECT_FLAGS (item) & GDL_DOCK_IN_PREDRAG) != 0)
+#endif
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GDL_DOCK_ITEM_ICONIFIED:
  * @item: A #GdlDockObject
  *
  * Evaluates to %TRUE if the item is iconified, appearing only as a button in
  * the dock bar.
+ *
+ * Deprecated: 3.6: Use GDL_DOCK_OBJECT_UNSET_FLAGS instead
  */
 #define GDL_DOCK_ITEM_ICONIFIED(item) \
     ((GDL_DOCK_OBJECT_FLAGS (item) & GDL_DOCK_ICONIFIED) != 0)
+#endif
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GDL_DOCK_ITEM_USER_ACTION:
  * @item: A #GdlDockObject
  *
  * Evaluates to %TRUE if the user currently use the item, by example dragging
  * division of a #GdlDockPaned object.
+ *
+ * Deprecated: 3.6: Use a private flag instead
  */
 #define GDL_DOCK_ITEM_USER_ACTION(item) \
     ((GDL_DOCK_OBJECT_FLAGS (item) & GDL_DOCK_USER_ACTION) != 0)
+#endif
 
 /**
  * GDL_DOCK_ITEM_NOT_LOCKED:
@@ -221,16 +233,20 @@ struct _GdlDockItemClass {
  *
  * Evaluates to %TRUE the item can be moved, closed, or iconified.
  */
-#define GDL_DOCK_ITEM_NOT_LOCKED(item) !((item)->behavior & GDL_DOCK_ITEM_BEH_LOCKED)
+#define GDL_DOCK_ITEM_NOT_LOCKED(item) ((gdl_dock_item_get_behavior_flags(item) & GDL_DOCK_ITEM_BEH_LOCKED) == 0)
+
 
+#ifndef GDL_DISABLE_DEPRECATED
 /**
  * GDL_DOCK_ITEM_NO_GRIP:
  * @item: A #GdlDockObject
  *
  * Evaluates to %TRUE the item has not handle, so it cannot be moved.
+ *
+ * Deprecated: 3.6: Use !GDL_DOCK_ITEM_HAS_GRIP instead
  */
-#define GDL_DOCK_ITEM_NO_GRIP(item) ((item)->behavior & GDL_DOCK_ITEM_BEH_NO_GRIP)
-
+#define GDL_DOCK_ITEM_NO_GRIP(item) ((gdl_dock_item_get_behavior_flags(item) & GDL_DOCK_ITEM_BEH_NO_GRIP) != 0)
+#endif
 
 /**
  * GDL_DOCK_ITEM_HAS_GRIP:
@@ -238,8 +254,7 @@ struct _GdlDockItemClass {
  *
  * Evaluates to %TRUE the item has a handle, so it can be moved.
  */
-#define GDL_DOCK_ITEM_HAS_GRIP(item) ((GDL_DOCK_ITEM_GET_CLASS (item)->has_grip)&& \
-		! GDL_DOCK_ITEM_NO_GRIP (item))
+#define GDL_DOCK_ITEM_HAS_GRIP(item) ((gdl_dock_item_get_behavior_flags (item) & GDL_DOCK_ITEM_BEH_NO_GRIP) == 0)
 
 /**
  * GDL_DOCK_ITEM_CANT_CLOSE:
@@ -247,9 +262,7 @@ struct _GdlDockItemClass {
  *
  * Evaluates to %TRUE the item cannot be closed.
  */
-#define GDL_DOCK_ITEM_CANT_CLOSE(item) \
-    ((((item)->behavior & GDL_DOCK_ITEM_BEH_CANT_CLOSE) != 0)|| \
-     ! GDL_DOCK_ITEM_NOT_LOCKED(item))
+#define GDL_DOCK_ITEM_CANT_CLOSE(item) ((gdl_dock_item_get_behavior_flags(item) & GDL_DOCK_ITEM_BEH_CANT_CLOSE) != 0)
 
 /**
  * GDL_DOCK_ITEM_CANT_ICONIFY:
@@ -257,71 +270,89 @@ struct _GdlDockItemClass {
  *
  * Evaluates to %TRUE the item cannot be iconifyed.
  */
-#define GDL_DOCK_ITEM_CANT_ICONIFY(item) \
-    ((((item)->behavior & GDL_DOCK_ITEM_BEH_CANT_ICONIFY) != 0)|| \
-     ! GDL_DOCK_ITEM_NOT_LOCKED(item))
+#define GDL_DOCK_ITEM_CANT_ICONIFY(item) ((gdl_dock_item_get_behavior_flags(item) & GDL_DOCK_ITEM_BEH_CANT_ICONIFY) != 0)
 
 /* public interface */
 
-GtkWidget     *gdl_dock_item_new               (const gchar         *name,
-                                                const gchar         *long_name,
-                                                GdlDockItemBehavior  behavior);
-GtkWidget     *gdl_dock_item_new_with_stock    (const gchar         *name,
-                                                const gchar         *long_name,
-                                                const gchar         *stock_id,
-                                                GdlDockItemBehavior  behavior);
-
-GtkWidget     *gdl_dock_item_new_with_pixbuf_icon (const gchar         *name,
-                                                   const gchar         *long_name,
-                                                   const GdkPixbuf     *pixbuf_icon,
-                                                   GdlDockItemBehavior  behavior);
-
-GType          gdl_dock_item_get_type          (void);
-
-void           gdl_dock_item_dock_to           (GdlDockItem      *item,
-                                                GdlDockItem      *target,
-                                                GdlDockPlacement  position,
-                                                gint              docking_param);
-
-void           gdl_dock_item_set_orientation   (GdlDockItem    *item,
-                                                GtkOrientation  orientation);
-
-GtkWidget     *gdl_dock_item_get_tablabel      (GdlDockItem *item);
-void           gdl_dock_item_set_tablabel      (GdlDockItem *item,
-                                                GtkWidget   *tablabel);
-GtkWidget     *gdl_dock_item_get_grip          (GdlDockItem *item);
-void           gdl_dock_item_hide_grip         (GdlDockItem *item);
-void           gdl_dock_item_show_grip         (GdlDockItem *item);
-void           gdl_dock_item_notify_selected   (GdlDockItem *item);
-void           gdl_dock_item_notify_deselected (GdlDockItem *item);
+GtkWidget     *gdl_dock_item_new                   (const gchar         *name,
+                                                    const gchar         *long_name,
+                                                    GdlDockItemBehavior  behavior);
+GtkWidget     *gdl_dock_item_new_with_stock        (const gchar         *name,
+                                                    const gchar         *long_name,
+                                                    const gchar         *stock_id,
+                                                    GdlDockItemBehavior  behavior);
+
+GtkWidget     *gdl_dock_item_new_with_pixbuf_icon  (const gchar      *name,
+                                                    const gchar      *long_name,
+                                                    const GdkPixbuf  *pixbuf_icon,
+                                                    GdlDockItemBehavior  behavior);
+
+GType          gdl_dock_item_get_type              (void);
+
+void           gdl_dock_item_dock_to               (GdlDockItem      *item,
+                                                    GdlDockItem      *target,
+                                                    GdlDockPlacement  position,
+                                                    gint              docking_param);
+
+void           gdl_dock_item_set_orientation       (GdlDockItem      *item,
+                                                    GtkOrientation    orientation);
+GtkOrientation gdl_dock_item_get_orientation       (GdlDockItem      *item);
+
+void           gdl_dock_item_set_behavior_flags    (GdlDockItem      *item,
+                                                    GdlDockItemBehavior behavior,
+                                                    gboolean clear);
+void           gdl_dock_item_unset_behavior_flags  (GdlDockItem      *item,
+                                                    GdlDockItemBehavior behavior);
+GdlDockItemBehavior gdl_dock_item_get_behavior_flags (GdlDockItem      *item);
+   
+GtkWidget     *gdl_dock_item_get_tablabel          (GdlDockItem      *item);
+void           gdl_dock_item_set_tablabel          (GdlDockItem      *item,
+                                                    GtkWidget        *tablabel);
+GtkWidget     *gdl_dock_item_get_grip              (GdlDockItem      *item);
+void           gdl_dock_item_hide_grip             (GdlDockItem      *item);
+void           gdl_dock_item_show_grip             (GdlDockItem      *item);
+void           gdl_dock_item_notify_selected       (GdlDockItem      *item);
+void           gdl_dock_item_notify_deselected     (GdlDockItem      *item);
 
 /* bind and unbind items to a dock */
-void           gdl_dock_item_bind              (GdlDockItem *item,
-                                                GtkWidget   *dock);
+void           gdl_dock_item_bind                  (GdlDockItem      *item,
+                                                    GtkWidget        *dock);
+
+void           gdl_dock_item_unbind                (GdlDockItem      *item);
+
+void           gdl_dock_item_hide_item             (GdlDockItem      *item);
+
+void           gdl_dock_item_iconify_item          (GdlDockItem      *item);
+
+void           gdl_dock_item_show_item             (GdlDockItem      *item);
 
-void           gdl_dock_item_unbind            (GdlDockItem *item);
+void           gdl_dock_item_lock                  (GdlDockItem      *item);
 
-void           gdl_dock_item_hide_item         (GdlDockItem      *item);
+void           gdl_dock_item_unlock                (GdlDockItem      *item);
 
-void           gdl_dock_item_iconify_item      (GdlDockItem *item);
+void           gdl_dock_item_set_default_position  (GdlDockItem      *item,
+                                                    GdlDockObject    *reference);
 
-void           gdl_dock_item_show_item         (GdlDockItem      *item);
+void           gdl_dock_item_preferred_size        (GdlDockItem      *item,
+                                                    GtkRequisition   *req);
+void           gdl_dock_item_get_drag_area         (GdlDockItem    *item,
+                                                    GdkRectangle   *rect);
 
-void           gdl_dock_item_lock              (GdlDockItem *item);
+gboolean       gdl_dock_item_or_child_has_focus    (GdlDockItem      *item);
 
-void           gdl_dock_item_unlock            (GdlDockItem *item);
+gboolean       gdl_dock_item_is_placeholder        (GdlDockItem      *item);
 
-void        gdl_dock_item_set_default_position (GdlDockItem      *item,
-                                                GdlDockObject    *reference);
+gboolean       gdl_dock_item_is_closed             (GdlDockItem      *item);
 
-void        gdl_dock_item_preferred_size       (GdlDockItem      *item,
-                                                GtkRequisition   *req);
+gboolean       gdl_dock_item_is_iconified          (GdlDockItem      *item);
 
-gboolean    gdl_dock_item_or_child_has_focus  (GdlDockItem      *item);
+void           gdl_dock_item_set_child             (GdlDockItem      *item,
+                                                    GtkWidget        *child);
+GtkWidget*     gdl_dock_item_get_child             (GdlDockItem      *item);
 
-gboolean    gdl_dock_item_is_placeholder       (GdlDockItem      *item);
+void           gdl_dock_item_class_set_has_grip    (GdlDockItemClass *item_class,
+                                                    gboolean         has_grip);
 
-gboolean       gdl_dock_item_is_closed         (GdlDockItem      *item);
 
 G_END_DECLS
 
diff --git a/gdl/gdl-dock-master.c b/gdl/gdl-dock-master.c
index 09df6d3..55912f8 100644
--- a/gdl/gdl-dock-master.c
+++ b/gdl/gdl-dock-master.c
@@ -601,10 +601,9 @@ gdl_dock_master_drag_motion (GdlDockItem *item,
 
 
     if (!may_dock) {
-        GtkRequisition req;
 	/* Special case for GdlDockItems : they must respect the flags */
 	if(GDL_IS_DOCK_ITEM(item)
-	&& GDL_DOCK_ITEM(item)->behavior & GDL_DOCK_ITEM_BEH_NEVER_FLOATING)
+	&& gdl_dock_item_get_behavior_flags (GDL_DOCK_ITEM(item)) & GDL_DOCK_ITEM_BEH_NEVER_FLOATING)
 	    return;
 
         dock = NULL;
@@ -612,12 +611,9 @@ gdl_dock_master_drag_motion (GdlDockItem *item,
             gdl_dock_object_get_toplevel (request->applicant));
         my_request.position = GDL_DOCK_FLOATING;
 
-        gdl_dock_item_preferred_size (GDL_DOCK_ITEM (request->applicant), &req);
-        my_request.rect.width = req.width;
-        my_request.rect.height = req.height;
-
-        my_request.rect.x = root_x - GDL_DOCK_ITEM (request->applicant)->dragoff_x;
-        my_request.rect.y = root_y - GDL_DOCK_ITEM (request->applicant)->dragoff_y;
+        gdl_dock_item_get_drag_area (GDL_DOCK_ITEM (request->applicant), &my_request.rect);
+        my_request.rect.x = root_x - my_request.rect.x;
+        my_request.rect.y = root_y - my_request.rect.y;
 
         /* setup extra docking information */
         if (G_IS_VALUE (&my_request.extra))
@@ -631,7 +627,7 @@ gdl_dock_master_drag_motion (GdlDockItem *item,
     /* it could be inserted in another floating dock			*/
     /* so check for the flag at this moment				*/
     else if(GDL_IS_DOCK_ITEM(item)
-	&& GDL_DOCK_ITEM(item)->behavior & GDL_DOCK_ITEM_BEH_NEVER_FLOATING
+	&& gdl_dock_item_get_behavior_flags (GDL_DOCK_ITEM(item)) & GDL_DOCK_ITEM_BEH_NEVER_FLOATING
 	&& dock != GDL_DOCK(master->priv->controller))
 	    return;
 
@@ -886,9 +882,9 @@ gdl_dock_master_add (GdlDockMaster *master,
 
         /* If the item is notebook, set the switcher style */
         if (GDL_IS_DOCK_NOTEBOOK (object) &&
-            GDL_IS_SWITCHER (GDL_DOCK_ITEM (object)->child))
+            GDL_IS_SWITCHER (gdl_dock_item_get_child (GDL_DOCK_ITEM (object))))
         {
-            g_object_set (GDL_DOCK_ITEM (object)->child, "switcher-style",
+            g_object_set (gdl_dock_item_get_child (GDL_DOCK_ITEM (object)), "switcher-style",
                           master->priv->switcher_style, NULL);
         }
 
@@ -1098,7 +1094,7 @@ set_switcher_style_foreach (GtkWidget *obj, gpointer user_data)
 
     if (GDL_IS_DOCK_NOTEBOOK (obj)) {
 
-        GtkWidget *child = GDL_DOCK_ITEM (obj)->child;
+        GtkWidget *child = gdl_dock_item_get_child (GDL_DOCK_ITEM (obj));
         if (GDL_IS_SWITCHER (child)) {
 
             g_object_set (child, "switcher-style", style, NULL);
diff --git a/gdl/gdl-dock-notebook.c b/gdl/gdl-dock-notebook.c
index 013dffe..a0705e5 100644
--- a/gdl/gdl-dock-notebook.c
+++ b/gdl/gdl-dock-notebook.c
@@ -148,7 +148,7 @@ gdl_dock_notebook_class_init (GdlDockNotebookClass *klass)
     object_class->present = gdl_dock_notebook_present;
     object_class->reorder = gdl_dock_notebook_reorder;
 
-    item_class->has_grip = FALSE;
+    gdl_dock_item_class_set_has_grip (item_class, FALSE);
     item_class->set_orientation = gdl_dock_notebook_set_orientation;
 
     g_object_class_install_property (
@@ -194,6 +194,7 @@ static void
 gdl_dock_notebook_init (GdlDockNotebook *notebook)
 {
     GdlDockItem *item = GDL_DOCK_ITEM (notebook);
+    GtkWidget *child;
     
     notebook->priv = G_TYPE_INSTANCE_GET_PRIVATE (notebook,
                                                   GDL_TYPE_DOCK_NOTEBOOK,
@@ -201,19 +202,19 @@ gdl_dock_notebook_init (GdlDockNotebook *notebook)
     notebook->priv->user_action = FALSE;
 
     /* create the container notebook */
-    item->child = gdl_switcher_new ();
-    gtk_widget_set_parent (item->child, GTK_WIDGET (notebook));
-    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (item->child), GTK_POS_BOTTOM);
-    g_signal_connect (item->child, "switch-page",
+    child = gdl_switcher_new ();
+    gdl_dock_item_set_child (item, child);    
+    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (child), GTK_POS_BOTTOM);
+    g_signal_connect (child, "switch-page",
                       (GCallback) gdl_dock_notebook_switch_page_cb, (gpointer) item);
-    g_signal_connect (item->child, "notify::page",
+    g_signal_connect (child, "notify::page",
                       (GCallback) gdl_dock_notebook_notify_cb, (gpointer) item);
-    g_signal_connect (item->child, "button-press-event",
+    g_signal_connect (child, "button-press-event",
                       (GCallback) gdl_dock_notebook_button_cb, (gpointer) item);
-    g_signal_connect (item->child, "button-release-event",
+    g_signal_connect (child, "button-release-event",
                       (GCallback) gdl_dock_notebook_button_cb, (gpointer) item);
-    gtk_notebook_set_scrollable (GTK_NOTEBOOK (item->child), TRUE);
-    gtk_widget_show (item->child);
+    gtk_notebook_set_scrollable (GTK_NOTEBOOK (child), TRUE);
+    gtk_widget_show (child);
 }
 
 static void
@@ -223,11 +224,13 @@ gdl_dock_notebook_set_property (GObject      *object,
                                 GParamSpec   *pspec)
 {
     GdlDockItem *item = GDL_DOCK_ITEM (object);
+    GtkWidget *child;
 
     switch (prop_id) {
         case PROP_PAGE:
-            if (item->child && GTK_IS_NOTEBOOK (item->child)) {
-                gtk_notebook_set_current_page (GTK_NOTEBOOK (item->child),
+            child = gdl_dock_item_get_child (item);
+            if (child && GTK_IS_NOTEBOOK (child)) {
+                gtk_notebook_set_current_page (GTK_NOTEBOOK (child),
                                                g_value_get_int (value));
             }
 
@@ -245,12 +248,14 @@ gdl_dock_notebook_get_property (GObject    *object,
                                 GParamSpec *pspec)
 {
     GdlDockItem *item = GDL_DOCK_ITEM (object);
+    GtkWidget *child;
 
     switch (prop_id) {
         case PROP_PAGE:
-            if (item->child && GTK_IS_NOTEBOOK (item->child)) {
+            child = gdl_dock_item_get_child (item);
+            if (child && GTK_IS_NOTEBOOK (child)) {
                 g_value_set_int (value, gtk_notebook_get_current_page
-                                 (GTK_NOTEBOOK (item->child)));
+                                 (GTK_NOTEBOOK (child)));
             }
 
             break;
@@ -271,10 +276,7 @@ gdl_dock_notebook_destroy (GtkWidget *object)
     GTK_WIDGET_CLASS (gdl_dock_notebook_parent_class)->destroy (object);
 
     /* after that we can remove the GtkNotebook */
-    if (item->child) {
-        gtk_widget_unparent (item->child);
-        item->child = NULL;
-    };
+    gdl_dock_item_set_child (item, NULL);
 }
 
 static void
@@ -326,6 +328,7 @@ gdl_dock_notebook_forall (GtkContainer *container,
 			  gpointer      callback_data)
 {
     GdlDockItem *item;
+    GtkWidget *child;
 
     g_return_if_fail (container != NULL);
     g_return_if_fail (GDL_IS_DOCK_NOTEBOOK (container));
@@ -338,8 +341,9 @@ gdl_dock_notebook_forall (GtkContainer *container,
     }
     else {
         item = GDL_DOCK_ITEM (container);
-        if (item->child)
-            gtk_container_foreach (GTK_CONTAINER (item->child), callback, callback_data);
+        child = gdl_dock_item_get_child (GDL_DOCK_ITEM (container));
+        if (child)
+            gtk_container_foreach (GTK_CONTAINER (child), callback, callback_data);
     }
 }
 
@@ -412,7 +416,7 @@ gdl_dock_notebook_dock (GdlDockObject    *object,
             if (other_data && G_VALUE_HOLDS (other_data, G_TYPE_INT))
                 position = g_value_get_int (other_data);
 
-            position = gdl_switcher_insert_page (GDL_SWITCHER (item->child),
+            position = gdl_switcher_insert_page (GDL_SWITCHER (gdl_dock_item_get_child (item)),
                                                  GTK_WIDGET (requestor), label,
                                                  long_name, long_name,
                                                  stock_id, pixbuf_icon, position);
@@ -421,7 +425,7 @@ gdl_dock_notebook_dock (GdlDockObject    *object,
                 /* Set current page to the newly docked widget. set current page
                  * really doesn't work if the page widget is not shown
                  */
-                    gtk_notebook_set_current_page (GTK_NOTEBOOK (item->child),
+                    gtk_notebook_set_current_page (GTK_NOTEBOOK (gdl_dock_item_get_child (item)),
                                                    position);
             }
             g_free (long_name);
@@ -436,11 +440,13 @@ static void
 gdl_dock_notebook_set_orientation (GdlDockItem    *item,
                                    GtkOrientation  orientation)
 {
-    if (item->child && GTK_IS_NOTEBOOK (item->child)) {
+    GtkWidget *child = gdl_dock_item_get_child (item);
+        
+    if (child && GTK_IS_NOTEBOOK (child)) {
         if (orientation == GTK_ORIENTATION_HORIZONTAL)
-            gtk_notebook_set_tab_pos (GTK_NOTEBOOK (item->child), GTK_POS_TOP);
+            gtk_notebook_set_tab_pos (GTK_NOTEBOOK (child), GTK_POS_TOP);
         else
-            gtk_notebook_set_tab_pos (GTK_NOTEBOOK (item->child), GTK_POS_LEFT);
+            gtk_notebook_set_tab_pos (GTK_NOTEBOOK (child), GTK_POS_LEFT);
     }
 
     GDL_DOCK_ITEM_CLASS (gdl_dock_notebook_parent_class)->set_orientation (item, orientation);
@@ -454,10 +460,10 @@ gdl_dock_notebook_child_placement (GdlDockObject    *object,
     GdlDockItem      *item = GDL_DOCK_ITEM (object);
     GdlDockPlacement  pos = GDL_DOCK_NONE;
 
-    if (item->child) {
+    if (gdl_dock_item_get_child (item)) {
         GList *children, *l;
 
-        children = gtk_container_get_children (GTK_CONTAINER (item->child));
+        children = gtk_container_get_children (GTK_CONTAINER (gdl_dock_item_get_child (item)));
         for (l = children; l; l = l->next) {
             if (l->data == (gpointer) child) {
                 pos = GDL_DOCK_CENTER;
@@ -480,13 +486,13 @@ static void
 gdl_dock_notebook_present (GdlDockObject *object,
                            GdlDockObject *child)
 {
-    GdlDockItem *item = GDL_DOCK_ITEM (object);
+    GtkWidget *notebook = gdl_dock_item_get_child (GDL_DOCK_ITEM (object));
     int i;
 
-    i = gtk_notebook_page_num (GTK_NOTEBOOK (item->child),
+    i = gtk_notebook_page_num (GTK_NOTEBOOK (notebook),
                                GTK_WIDGET (child));
     if (i >= 0)
-        gtk_notebook_set_current_page (GTK_NOTEBOOK (item->child), i);
+        gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), i);
 
     GDL_DOCK_OBJECT_CLASS (gdl_dock_notebook_parent_class)->present (object, child);
 }
@@ -497,12 +503,12 @@ gdl_dock_notebook_reorder (GdlDockObject    *object,
                            GdlDockPlacement  new_position,
                            GValue           *other_data)
 {
-    GdlDockItem *item = GDL_DOCK_ITEM (object);
+    GtkWidget *child = gdl_dock_item_get_child (GDL_DOCK_ITEM (object));
     gint         current_position, new_pos = -1;
     gboolean     handled = FALSE;
 
-    if (item->child && new_position == GDL_DOCK_CENTER) {
-        current_position = gtk_notebook_page_num (GTK_NOTEBOOK (item->child),
+    if (child && new_position == GDL_DOCK_CENTER) {
+        current_position = gtk_notebook_page_num (GTK_NOTEBOOK (child),
                                                   GTK_WIDGET (requestor));
         if (current_position >= 0) {
             handled = TRUE;
@@ -510,7 +516,7 @@ gdl_dock_notebook_reorder (GdlDockObject    *object,
             if (other_data && G_VALUE_HOLDS (other_data, G_TYPE_INT))
                 new_pos = g_value_get_int (other_data);
 
-            gtk_notebook_reorder_child (GTK_NOTEBOOK (item->child),
+            gtk_notebook_reorder_child (GTK_NOTEBOOK (child),
                                         GTK_WIDGET (requestor),
                                         new_pos);
         }
diff --git a/gdl/gdl-dock-paned.c b/gdl/gdl-dock-paned.c
index b446924..ed8637e 100644
--- a/gdl/gdl-dock-paned.c
+++ b/gdl/gdl-dock-paned.c
@@ -138,7 +138,7 @@ gdl_dock_paned_class_init (GdlDockPanedClass *klass)
     object_class->dock = gdl_dock_paned_dock;
     object_class->child_placement = gdl_dock_paned_child_placement;
 
-    item_class->has_grip = FALSE;
+    gdl_dock_item_class_set_has_grip (item_class, FALSE);
     item_class->set_orientation = gdl_dock_paned_set_orientation;
 
     g_object_class_install_property (
@@ -212,25 +212,23 @@ gdl_dock_paned_create_child (GdlDockPaned   *paned,
                              GtkOrientation  orientation)
 {
     GdlDockItem *item;
+    GtkWidget *child;
 
     item = GDL_DOCK_ITEM (paned);
 
-    if (item->child)
-        gtk_widget_unparent (GTK_WIDGET (item->child));
-
     /* create the container paned */
-    item->child = gtk_paned_new (orientation);
+    child = gtk_paned_new (orientation);
+    gdl_dock_item_set_child (item, child);
 
     /* get notification for propagation */
-    g_signal_connect (item->child, "notify::position",
+    g_signal_connect (child, "notify::position",
                       (GCallback) gdl_dock_paned_notify_cb, (gpointer) item);
-    g_signal_connect (item->child, "button-press-event",
+    g_signal_connect (child, "button-press-event",
                       (GCallback) gdl_dock_paned_button_cb, (gpointer) item);
-    g_signal_connect (item->child, "button-release-event",
+    g_signal_connect (child, "button-release-event",
                       (GCallback) gdl_dock_paned_button_cb, (gpointer) item);
 
-    gtk_widget_set_parent (item->child, GTK_WIDGET (item));
-    gtk_widget_show (item->child);
+    gtk_widget_show (child);
 }
 
 static GObject *
@@ -246,9 +244,9 @@ gdl_dock_paned_constructor (GType                  type,
     if (g_object) {
         GdlDockItem *item = GDL_DOCK_ITEM (g_object);
 
-        if (!item->child)
+        if (!gdl_dock_item_get_child (item))
             gdl_dock_paned_create_child (GDL_DOCK_PANED (g_object),
-                                         item->orientation);
+                                         gdl_dock_item_get_orientation (item));
         /* otherwise, the orientation was set as a construction
            parameter and the child is already created */
     }
@@ -263,11 +261,13 @@ gdl_dock_paned_set_property (GObject        *object,
                              GParamSpec     *pspec)
 {
     GdlDockItem *item = GDL_DOCK_ITEM (object);
+    GtkWidget *child;
 
     switch (prop_id) {
         case PROP_POSITION:
-            if (item->child && GTK_IS_PANED (item->child))
-                gtk_paned_set_position (GTK_PANED (item->child),
+            child = gdl_dock_item_get_child (item);
+            if (child && GTK_IS_PANED (child))
+                gtk_paned_set_position (GTK_PANED (child),
                                         g_value_get_uint (value));
             break;
         default:
@@ -283,12 +283,14 @@ gdl_dock_paned_get_property (GObject        *object,
                              GParamSpec     *pspec)
 {
     GdlDockItem *item = GDL_DOCK_ITEM (object);
+    GtkWidget *child;
 
     switch (prop_id) {
         case PROP_POSITION:
-            if (item->child && GTK_IS_PANED (item->child))
+            child = gdl_dock_item_get_child (item);
+            if (child && GTK_IS_PANED (child))
                 g_value_set_uint (value,
-                                  gtk_paned_get_position (GTK_PANED (item->child)));
+                                  gtk_paned_get_position (GTK_PANED (child)));
             else
                 g_value_set_uint (value, 0);
             break;
@@ -309,10 +311,7 @@ gdl_dock_paned_destroy (GtkWidget *object)
 
 
     /* after that we can remove the GtkNotebook */
-    if (item->child) {
-        gtk_widget_unparent (item->child);
-        item->child = NULL;
-    };
+    gdl_dock_item_set_child (item, NULL);
 }
 
 static void
@@ -329,18 +328,18 @@ gdl_dock_paned_add (GtkContainer *container,
     g_return_if_fail (GDL_IS_DOCK_ITEM (widget));
 
     item = GDL_DOCK_ITEM (container);
-    g_return_if_fail (item->child != NULL);
+    g_return_if_fail (gdl_dock_item_get_child (item) != NULL);
 
-    paned = GTK_PANED (item->child);
+    paned = GTK_PANED (gdl_dock_item_get_child (item));
     child1 = gtk_paned_get_child1 (paned);
     child2 = gtk_paned_get_child2 (paned);
     g_return_if_fail (!child1 || !child2);
 
     if (!child1)
-        pos = item->orientation == GTK_ORIENTATION_HORIZONTAL ?
+        pos = gdl_dock_item_get_orientation (item) == GTK_ORIENTATION_HORIZONTAL ?
             GDL_DOCK_LEFT : GDL_DOCK_TOP;
     else if (!child2)
-        pos = item->orientation == GTK_ORIENTATION_HORIZONTAL ?
+        pos = gdl_dock_item_get_orientation (item) == GTK_ORIENTATION_HORIZONTAL ?
             GDL_DOCK_RIGHT : GDL_DOCK_BOTTOM;
 
     if (pos != GDL_DOCK_NONE)
@@ -355,7 +354,7 @@ gdl_dock_paned_forall (GtkContainer *container,
                        GtkCallback   callback,
                        gpointer      callback_data)
 {
-    GdlDockItem *item;
+    GtkWidget *child;
 
     g_return_if_fail (container != NULL);
     g_return_if_fail (GDL_IS_DOCK_PANED (container));
@@ -367,18 +366,18 @@ gdl_dock_paned_forall (GtkContainer *container,
                            (container, include_internals, callback, callback_data);
     }
     else {
-        item = GDL_DOCK_ITEM (container);
-        if (item->child)
-            gtk_container_foreach (GTK_CONTAINER (item->child), callback, callback_data);
+        child = gdl_dock_item_get_child (GDL_DOCK_ITEM (container));
+        if (child)
+            gtk_container_foreach (GTK_CONTAINER (child), callback, callback_data);
     }
 }
 
 static GType
 gdl_dock_paned_child_type (GtkContainer *container)
 {
-    GdlDockItem *item = GDL_DOCK_ITEM (container);
+    GtkWidget *child = gdl_dock_item_get_child (GDL_DOCK_ITEM (container));
 
-    if (gtk_container_child_type (GTK_CONTAINER (item->child)) == G_TYPE_NONE)
+    if (gtk_container_child_type (GTK_CONTAINER (child)) == G_TYPE_NONE)
         return G_TYPE_NONE;
     else
         return GDL_TYPE_DOCK_ITEM;
@@ -510,7 +509,7 @@ gdl_dock_paned_dock_request (GdlDockObject  *object,
                 /* the pointer is on the handle, so snap to top/bottom
                    or left/right */
                 may_dock = TRUE;
-                if (item->orientation == GTK_ORIENTATION_HORIZONTAL) {
+                if (gdl_dock_item_get_orientation (item) == GTK_ORIENTATION_HORIZONTAL) {
                     if (rel_y < alloc.height / 2) {
                         my_request.position = GDL_DOCK_TOP;
                         my_request.rect.height *= SPLIT_RATIO;
@@ -571,9 +570,9 @@ gdl_dock_paned_dock (GdlDockObject    *object,
     gint      temp = 0;
 
     g_return_if_fail (GDL_IS_DOCK_PANED (object));
-    g_return_if_fail (GDL_DOCK_ITEM (object)->child != NULL);
+    g_return_if_fail (gdl_dock_item_get_child (GDL_DOCK_ITEM (object)) != NULL);
 
-    paned = GTK_PANED (GDL_DOCK_ITEM (object)->child);
+    paned = GTK_PANED (gdl_dock_item_get_child (GDL_DOCK_ITEM (object)));
 
     if (GDL_IS_DOCK_ITEM (requestor)) {
         g_object_get (G_OBJECT (requestor), "preferred_height", &temp, NULL);
@@ -589,7 +588,7 @@ gdl_dock_paned_dock (GdlDockObject    *object,
     child2 = gtk_paned_get_child2 (paned);
 
     /* see if we can dock the item in our paned */
-    switch (GDL_DOCK_ITEM (object)->orientation) {
+    switch (gdl_dock_item_get_orientation (GDL_DOCK_ITEM (object))) {
         case GTK_ORIENTATION_HORIZONTAL:
             if (!child1 && position == GDL_DOCK_LEFT) {
                 gtk_paned_pack1 (paned, GTK_WIDGET (requestor), TRUE, TRUE);
@@ -632,17 +631,16 @@ gdl_dock_paned_set_orientation (GdlDockItem    *item,
 
     g_return_if_fail (GDL_IS_DOCK_PANED (item));
 
-    if (item->child) {
-        old_paned = GTK_PANED (item->child);
+    if (gdl_dock_item_get_child (item)) {
+        old_paned = GTK_PANED (gdl_dock_item_get_child (item));
         g_object_ref (old_paned);
-        gtk_widget_unparent (GTK_WIDGET (old_paned));
-        item->child = NULL;
+        gdl_dock_item_set_child (item, NULL);
     }
 
     gdl_dock_paned_create_child (GDL_DOCK_PANED (item), orientation);
 
     if (old_paned) {
-        new_paned = GTK_PANED (item->child);
+        new_paned = GTK_PANED (gdl_dock_item_get_child (item));
         child1 = gtk_paned_get_child1 (old_paned);
         child2 = gtk_paned_get_child2 (old_paned);
 
@@ -672,13 +670,13 @@ gdl_dock_paned_child_placement (GdlDockObject    *object,
     GtkPaned         *paned;
     GdlDockPlacement  pos = GDL_DOCK_NONE;
 
-    if (item->child) {
-        paned = GTK_PANED (item->child);
+    if (gdl_dock_item_get_child (item)) {
+        paned = GTK_PANED (gdl_dock_item_get_child (item));
         if (GTK_WIDGET (child) == gtk_paned_get_child1 (paned))
-            pos = item->orientation == GTK_ORIENTATION_HORIZONTAL ?
+            pos = gdl_dock_item_get_orientation (item) == GTK_ORIENTATION_HORIZONTAL ?
                 GDL_DOCK_LEFT : GDL_DOCK_TOP;
         else if (GTK_WIDGET (child) == gtk_paned_get_child2 (paned))
-            pos = item->orientation == GTK_ORIENTATION_HORIZONTAL ?
+            pos = gdl_dock_item_get_orientation (item) == GTK_ORIENTATION_HORIZONTAL ?
                 GDL_DOCK_RIGHT : GDL_DOCK_BOTTOM;
     }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]