static void gdl_dock_object_destroy (GtkObject *gtk_object) { GdlDockObject *object; g_return_if_fail (GDL_IS_DOCK_OBJECT (gtk_object)); object = GDL_DOCK_OBJECT (gtk_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->reduce_pending = FALSE; gdl_dock_object_thaw (object); } if (GDL_DOCK_OBJECT_ATTACHED (object)) { /* detach ourselves */ gdl_dock_object_detach (object, FALSE); } /* finally unbind us */ if (object->master) gdl_dock_object_unbind (object); GDL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (gtk_object)); }
void gdl_dock_object_dock (GdlDockObject *object, GdlDockObject *requestor, GdlDockPlacement position, GValue *other_data) { GdlDockObject *parent; g_return_if_fail (object != NULL && requestor != NULL); if (object == requestor) return; if (!object->master) g_warning (_("Dock operation requested in a non-bound object %p. " "The application might crash"), object); PF; if (!gdl_dock_object_is_bound (requestor)) gdl_dock_object_bind (requestor, object->master); if (requestor->master != object->master) { g_warning (_("Cannot dock %p to %p because they belong to different masters"), requestor, object); return; } /* first, see if we can optimize things by reordering */ if (position != GDL_DOCK_NONE) { parent = gdl_dock_object_get_parent_object (object); if (gdl_dock_object_reorder (object, requestor, position, other_data) || (parent && gdl_dock_object_reorder (parent, requestor, position, other_data))) return; } /* freeze the object, since under some conditions it might be destroyed when detaching the requestor */ gdl_dock_object_freeze (object); /* detach the requestor before docking */ g_object_ref (requestor); if (GDL_DOCK_OBJECT_ATTACHED (requestor)) gdl_dock_object_detach (requestor, FALSE); if (position != GDL_DOCK_NONE) g_signal_emit (object, gdl_dock_object_signals [DOCK], 0, requestor, position, other_data); dbg(1, "done"); g_object_unref (requestor); gdl_dock_object_thaw (object); }
void gdl_dock_object_detach (GdlDockObject *object, gboolean recursive) { g_return_if_fail (object != NULL); if (!GDL_IS_DOCK_OBJECT (object)) return; if (!GDL_DOCK_OBJECT_ATTACHED (object)) return; /* freeze the object to avoid reducing while detaching children */ gdl_dock_object_freeze (object); GDL_DOCK_OBJECT_SET_FLAGS (object, GDL_DOCK_IN_DETACH); g_signal_emit (object, gdl_dock_object_signals [DETACH], 0, recursive); GDL_DOCK_OBJECT_UNSET_FLAGS (object, GDL_DOCK_IN_DETACH); gdl_dock_object_thaw (object); }
void gdl_dock_object_unbind (GdlDockObject *object) { g_return_if_fail (object != NULL); g_object_ref (object); /* detach the object first */ if (GDL_DOCK_OBJECT_ATTACHED (object)) gdl_dock_object_detach (object, TRUE); if (object->master) { GObject *master = object->master; g_object_remove_weak_pointer (master, (gpointer *) &object->master); object->master = NULL; gdl_dock_master_remove (GDL_DOCK_MASTER (master), object); g_object_notify (G_OBJECT (object), "master"); } g_object_unref (object); }
static void on_update_widget_view_menuitem (gpointer key, gpointer wid, gpointer data) { GtkCheckMenuItem *menuitem; GdlDockItem *dockitem; dockitem = g_object_get_data (G_OBJECT (wid), "dockitem"); menuitem = g_object_get_data (G_OBJECT (wid), "menuitem"); g_signal_handlers_block_by_func (menuitem, G_CALLBACK (on_toggle_widget_view), dockitem); if (GDL_DOCK_OBJECT_ATTACHED (dockitem)) gtk_check_menu_item_set_active (menuitem, TRUE); else gtk_check_menu_item_set_active (menuitem, FALSE); g_signal_handlers_unblock_by_func (menuitem, G_CALLBACK (on_toggle_widget_view), dockitem); }
static void gdl_dock_reduce (GdlDockObject *object) { GdlDock *dock = GDL_DOCK (object); if (dock->root) return; if (GDL_DOCK_OBJECT_AUTOMATIC (dock)) { gtk_widget_destroy (GTK_WIDGET (dock)); } else if (!GDL_DOCK_OBJECT_ATTACHED (dock)) { /* if the user explicitly detached the object */ if (dock->_priv->floating) gtk_widget_hide (GTK_WIDGET (dock)); else { GtkWidget *widget = GTK_WIDGET (object); if (widget->parent) gtk_container_remove (GTK_CONTAINER (widget->parent), widget); } } }