static void gdl_dock_notify_cb (GObject *object, GParamSpec *pspec, gpointer user_data) { GdlDock *dock; g_return_if_fail (object != NULL || GDL_IS_DOCK (object)); dock = GDL_DOCK (object); dock->_priv->auto_title = FALSE; gdl_dock_set_title (dock); }
static void gdl_dock_notify_cb (GObject *object, GParamSpec *pspec, gpointer user_data) { GdlDock *dock; gchar* long_name; g_return_if_fail (object != NULL || GDL_IS_DOCK (object)); g_object_get (object, "long-name", &long_name, NULL); if (long_name) { dock = GDL_DOCK (object); dock->priv->auto_title = FALSE; gdl_dock_set_title (dock); } g_free (long_name); }
static void gdl_dock_dock (GdlDockObject *object, GdlDockObject *requestor, GdlDockPlacement position, GValue *user_data) { GdlDock *dock; g_return_if_fail (GDL_IS_DOCK (object)); /* only dock items allowed at this time */ g_return_if_fail (GDL_IS_DOCK_ITEM (requestor)); dock = GDL_DOCK (object); if (position == GDL_DOCK_FLOATING) { GdlDockItem *item = GDL_DOCK_ITEM (requestor); gint x, y, width, height; if (user_data && G_VALUE_HOLDS (user_data, GDK_TYPE_RECTANGLE)) { GdkRectangle *rect; rect = g_value_get_boxed (user_data); x = rect->x; y = rect->y; width = rect->width; height = rect->height; } else { x = y = 0; width = height = -1; } gdl_dock_add_floating_item (dock, item, x, y, width, height); } else if (dock->root) { /* This is somewhat a special case since we know which item to pass the request on because we only have on child */ gdl_dock_object_dock (dock->root, requestor, position, NULL); gdl_dock_set_title (dock); } else { /* Item about to be added is root item. */ GtkWidget *widget = GTK_WIDGET (requestor); dock->root = requestor; GDL_DOCK_OBJECT_SET_FLAGS (requestor, GDL_DOCK_ATTACHED); gtk_widget_set_parent (widget, GTK_WIDGET (dock)); gdl_dock_item_show_grip (GDL_DOCK_ITEM (requestor)); /* Realize the item (create its corresponding GdkWindow) when GdlDock has been realized. */ if (GTK_WIDGET_REALIZED (dock)) gtk_widget_realize (widget); /* Map the widget if it's visible and the parent is visible and has been mapped. This is done to make sure that the GdkWindow is visible. */ if (GTK_WIDGET_VISIBLE (dock) && GTK_WIDGET_VISIBLE (widget)) { if (GTK_WIDGET_MAPPED (dock)) gtk_widget_map (widget); /* Make the widget resize. */ gtk_widget_queue_resize (widget); } gdl_dock_set_title (dock); } }
static GObject * gdl_dock_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_param) { GObject *g_object; g_object = GDL_CALL_PARENT_WITH_DEFAULT (G_OBJECT_CLASS, constructor, (type, n_construct_properties, construct_param), NULL); if (g_object) { GdlDock *dock = GDL_DOCK (g_object); GdlDockMaster *master; /* create a master for the dock if none was provided in the construction */ master = GDL_DOCK_OBJECT_GET_MASTER (GDL_DOCK_OBJECT (dock)); if (!master) { GDL_DOCK_OBJECT_UNSET_FLAGS (dock, GDL_DOCK_AUTOMATIC); master = g_object_new (GDL_TYPE_DOCK_MASTER, NULL); /* the controller owns the master ref */ gdl_dock_object_bind (GDL_DOCK_OBJECT (dock), G_OBJECT (master)); } if (dock->_priv->floating) { GdlDockObject *controller; /* create floating window for this dock */ dock->_priv->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_object_set_data (G_OBJECT (dock->_priv->window), "dock", dock); /* set position and default size */ gtk_window_set_position (GTK_WINDOW (dock->_priv->window), GTK_WIN_POS_MOUSE); gtk_window_set_default_size (GTK_WINDOW (dock->_priv->window), dock->_priv->width, dock->_priv->height); gtk_window_set_type_hint (GTK_WINDOW (dock->_priv->window), GDK_WINDOW_TYPE_HINT_NORMAL); /* metacity ignores this */ gtk_window_move (GTK_WINDOW (dock->_priv->window), dock->_priv->float_x, dock->_priv->float_y); /* connect to the configure event so we can track down window geometry */ g_signal_connect (dock->_priv->window, "configure_event", (GCallback) gdl_dock_floating_configure_event_cb, dock); /* set the title and connect to the long_name notify queue so we can reset the title when this prop changes */ gdl_dock_set_title (dock); g_signal_connect (dock, "notify::long-name", (GCallback) gdl_dock_notify_cb, NULL); gtk_container_add (GTK_CONTAINER (dock->_priv->window), GTK_WIDGET (dock)); g_signal_connect (dock->_priv->window, "delete_event", G_CALLBACK (gdl_dock_floating_window_delete_event_cb), NULL); } GDL_DOCK_OBJECT_SET_FLAGS (dock, GDL_DOCK_ATTACHED); } return g_object; }