static void gdl_dock_object_destroy (GtkWidget *dock_object) { GdlDockObject *object; g_return_if_fail (GDL_IS_DOCK_OBJECT (dock_object)); object = GDL_DOCK_OBJECT (dock_object); if (gdl_dock_object_is_compound (object)) { /* detach our dock object children if we have some, and even if we are not attached, so they can get notification */ gdl_dock_object_freeze (object); gtk_container_foreach (GTK_CONTAINER (object), (GtkCallback) gdl_dock_object_foreach_detach, NULL); object->priv->reduce_pending = FALSE; gdl_dock_object_thaw (object); } /* detach ourselves */ gdl_dock_object_detach (object, FALSE); /* finally unbind us */ if (object->priv->master) gdl_dock_object_unbind (object); GTK_WIDGET_CLASS(gdl_dock_object_parent_class)->destroy (dock_object); }
static void gdl_dock_object_real_detach (GdlDockObject *object, gboolean recursive) { GdlDockObject *parent; GtkWidget *widget; g_return_if_fail (object != NULL); /* detach children */ if (recursive && gdl_dock_object_is_compound (object)) { gtk_container_foreach (GTK_CONTAINER (object), (GtkCallback) gdl_dock_object_detach, GINT_TO_POINTER (recursive)); } /* detach the object itself */ object->priv->attached = FALSE; #ifndef GDL_DISABLE_DEPRECATED object->deprecated_flags &= ~GDL_DOCK_ATTACHED; #endif parent = gdl_dock_object_get_parent_object (object); widget = GTK_WIDGET (object); if (gtk_widget_get_parent (widget)) gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (GTK_WIDGET (widget))), widget); if (parent) gdl_dock_object_reduce (parent); }
static void gdl_dock_object_real_detach (GdlDockObject *object, gboolean recursive) { GdlDockObject *parent; GtkWidget *widget; g_return_if_fail (object != NULL); /* detach children */ if (recursive && gdl_dock_object_is_compound (object)) { gtk_container_foreach (GTK_CONTAINER (object), (GtkCallback) gdl_dock_object_detach, GINT_TO_POINTER (recursive)); } /* detach the object itself */ GDL_DOCK_OBJECT_UNSET_FLAGS (object, GDL_DOCK_ATTACHED); parent = gdl_dock_object_get_parent_object (object); widget = GTK_WIDGET (object); if (widget->parent) gtk_container_remove (GTK_CONTAINER (widget->parent), widget); if (parent) gdl_dock_object_reduce (parent); }
static void gdl_dock_object_hide (GtkWidget *widget) { if (gdl_dock_object_is_compound (GDL_DOCK_OBJECT (widget))) { gtk_container_foreach (GTK_CONTAINER (widget), (GtkCallback) gdl_dock_object_foreach_automatic, gtk_widget_hide); } GDL_CALL_PARENT (GTK_WIDGET_CLASS, hide, (widget)); }
static void gdl_dock_object_hide (GtkWidget *widget) { if (gdl_dock_object_is_compound (GDL_DOCK_OBJECT (widget))) { gtk_container_foreach (GTK_CONTAINER (widget), (GtkCallback) gdl_dock_object_foreach_automatic, gtk_widget_hide); } GTK_WIDGET_CLASS (gdl_dock_object_parent_class)->hide (widget); }
static void foreach_lock_unlock (GdlDockItem *item, gboolean locked) { if (!GDL_IS_DOCK_ITEM (item)) return; g_object_set (item, "locked", locked, NULL); if (gdl_dock_object_is_compound (GDL_DOCK_OBJECT (item))) gtk_container_foreach (GTK_CONTAINER (item), (GtkCallback) foreach_lock_unlock, GINT_TO_POINTER (locked)); }
/** * gdl_dock_object_child_placement: * @object: the dock object we are asking for child placement * @child: the child of the @object we want the placement for * @placement: (allow-none): where to return the placement information * * This function returns information about placement of a child dock * object inside another dock object. The function returns %TRUE if * @child is effectively a child of @object. @placement should * normally be initially setup to %GDL_DOCK_NONE. If it's set to some * other value, this function will not touch the stored value if the * specified placement is "compatible" with the actual placement of * the child. * * @placement can be %NULL, in which case the function simply tells if * @child is attached to @object. * * Returns: %TRUE if @child is a child of @object. */ gboolean gdl_dock_object_child_placement (GdlDockObject *object, GdlDockObject *child, GdlDockPlacement *placement) { g_return_val_if_fail (object != NULL && child != NULL, FALSE); /* simple case */ if (!gdl_dock_object_is_compound (object)) return FALSE; if (GDL_DOCK_OBJECT_GET_CLASS (object)->child_placement) return GDL_DOCK_OBJECT_GET_CLASS (object)->child_placement (object, child, placement); else return FALSE; }
/** * gdl_dock_object_child_placement: * @object: the dock object we are asking for child placement * @child: the child of the @object we want the placement for * @placement: where to return the placement information * * This function returns information about placement of a child dock * object inside another dock object. The function returns %TRUE if * @child is effectively a child of @object. @placement should * normally be initially setup to %GDL_DOCK_NONE. If it's set to some * other value, this function will not touch the stored value if the * specified placement is "compatible" with the actual placement of * the child. * * @placement can be %NULL, in which case the function simply tells if * @child is attached to @object. * * Returns: %TRUE if @child is a child of @object. */ gboolean gdl_dock_object_child_placement (GdlDockObject *object, GdlDockObject *child, GdlDockPlacement *placement) { g_return_val_if_fail (object != NULL && child != NULL, FALSE); /* simple case */ if (!gdl_dock_object_is_compound (object)) return FALSE; return GDL_CALL_VIRTUAL_WITH_DEFAULT (object, GDL_DOCK_OBJECT_GET_CLASS, child_placement, (object, child, placement), FALSE); }
static void set_switcher_style_foreach (GtkWidget *obj, gpointer user_data) { GdlSwitcherStyle style = GPOINTER_TO_INT (user_data); if (!GDL_IS_DOCK_ITEM (obj)) return; if (GDL_IS_DOCK_NOTEBOOK (obj)) { GtkWidget *child = GDL_DOCK_ITEM (obj)->child; if (GDL_IS_SWITCHER (child)) { g_object_set (child, "switcher-style", style, NULL); } } else if (gdl_dock_object_is_compound (GDL_DOCK_OBJECT (obj))) { gtk_container_foreach (GTK_CONTAINER (obj), set_switcher_style_foreach, user_data); } }
static void gdl_dock_object_real_reduce (GdlDockObject *object) { GdlDockObject *parent; GList *children; g_return_if_fail (object != NULL); if (!gdl_dock_object_is_compound (object)) return; parent = gdl_dock_object_get_parent_object (object); children = gtk_container_get_children (GTK_CONTAINER (object)); if (g_list_length (children) <= 1) { GList *l; GList *dchildren = NULL; /* detach ourselves and then re-attach our children to our current parent. if we are not currently attached, the children are detached */ if (parent) gdl_dock_object_freeze (parent); gdl_dock_object_freeze (object); /* Detach the children before detaching this object, since in this * way the children can have access to the whole object hierarchy. * Set the InDetach flag now, so the children know that this object * is going to be detached. */ for (l = children; l; l = l->next) { GdlDockObject *child; if (!GDL_IS_DOCK_OBJECT (l->data)) continue; child = GDL_DOCK_OBJECT (l->data); g_object_ref (child); gdl_dock_object_detach (child, FALSE); if (parent) dchildren = g_list_append (dchildren, child); } /* Now it can be detached */ gdl_dock_object_detach (object, FALSE); /* After detaching the reduced object, we can add the children (the only child in fact) to the new parent */ for (l = dchildren; l; l = l->next) { gtk_container_add (GTK_CONTAINER (parent), l->data); g_object_unref (l->data); } g_list_free (dchildren); /* sink the widget, so any automatic floating widget is destroyed */ g_object_ref_sink (object); /* don't reenter */ object->priv->reduce_pending = FALSE; gdl_dock_object_thaw (object); if (parent) gdl_dock_object_thaw (parent); } g_list_free (children); }