static void glade_gtk_header_bar_set_size (GObject * object, const GValue * value) { GList *l, *next, *children; GtkWidget *child; guint new_size, old_size, i; g_return_if_fail (GTK_IS_HEADER_BAR (object)); d(g_message ("Setting size to %d", g_value_get_int (value))); if (glade_util_object_is_loading (object)) return; children = gtk_container_get_children (GTK_CONTAINER (object)); l = children; while (l) { next = l->next; if (l->data == gtk_header_bar_get_custom_title (GTK_HEADER_BAR (object)) || (!glade_widget_get_from_gobject (l->data) && !GLADE_IS_PLACEHOLDER (l->data))) children = g_list_delete_link (children, l); l = next; } old_size = g_list_length (children); new_size = g_value_get_int (value); if (old_size == new_size) { g_list_free (children); return; } for (i = old_size; i < new_size; i++) { GtkWidget *placeholder = glade_placeholder_new (); gtk_header_bar_pack_start (GTK_HEADER_BAR (object), placeholder); } for (l = g_list_last (children); l && old_size > new_size; l = l->prev) { child = l->data; if (glade_widget_get_from_gobject (child) || !GLADE_IS_PLACEHOLDER (child)) continue; gtk_container_remove (GTK_CONTAINER (object), child); old_size--; } g_list_free (children); }
static void change_subtitle (GtkButton *button, gpointer data) { if (!GTK_IS_HEADER_BAR (header)) return; if (gtk_header_bar_get_subtitle (GTK_HEADER_BAR (header)) == NULL) { gtk_header_bar_set_subtitle (GTK_HEADER_BAR (header), "(subtle subtitle)"); } else { gtk_header_bar_set_subtitle (GTK_HEADER_BAR (header), NULL); } }
// This API exists since gtk+ 3.10 extern void gtk_window_set_titlebar (GtkWindow *window, GtkWidget *titlebar) { if(!is_compatible_gtk_version() || !are_csd_disabled()) { orig_gtk_window_set_titlebar(window, titlebar); return; } if (titlebar && is_gtk_version_larger_or_equal (3, 16, 1)) { /* We have to reimplement gtk_window_set_titlebar ourselves, since * those Gtk versions don't support turning CSD off anymore. * This mainly does the same things as the original function * (consisting of adding the title bar widget + connecting signals), * but it will not enable CSD and not set the client_decorated flag * in the window private space. (We wouldn't know which bit it is * anyway.) */ gtk_window_private_info_t private_info = gtk_window_private_info (); char *priv = G_TYPE_INSTANCE_GET_PRIVATE (window, gtk_window_type, char); gboolean was_mapped = FALSE; GtkWidget *widget = GTK_WIDGET (window); GtkWidget **title_box_ptr = NULL; /* Something went wrong, so just stick with the original * implementation. */ if (private_info.title_box_offset < 0 || !priv) goto orig_impl; title_box_ptr = (GtkWidget **) &priv[private_info.title_box_offset]; if (!*title_box_ptr) { was_mapped = gtk_widget_get_mapped (widget); if (gtk_widget_get_realized (widget)) { g_warning ("gtk_window_set_titlebar() called on a realized window"); gtk_widget_unrealize (widget); } } /* Remove any potential old title bar. We can't call * the static unset_titlebar() directly (not available), * so we call the full function; that shouldn't have * any side effects. */ orig_gtk_window_set_titlebar (window, NULL); /* The solid-csd class is not removed when the titlebar * is unset in Gtk (it's probably a bug), so unset it * here explicitly, in case it's set. */ gtk_style_context_remove_class (gtk_widget_get_style_context (widget), "solid-csd"); /* We need to store the titlebar in priv->title_box, * which is where title_box_ptr points to. Then we * need to reparent the title bar and connect signals * if it's a GtkHeaderBar. Apart from CSD enablement, * this is what the original function boils down to. */ *title_box_ptr = titlebar; gtk_widget_set_parent (*title_box_ptr, widget); if (GTK_IS_HEADER_BAR (titlebar)) { g_signal_connect (titlebar, "notify::title", G_CALLBACK (private_info.on_titlebar_title_notify), window); private_info.on_titlebar_title_notify (GTK_HEADER_BAR (titlebar), NULL, window); } gtk_style_context_add_class (gtk_widget_get_style_context (titlebar), GTK_STYLE_CLASS_TITLEBAR); if (was_mapped) gtk_widget_map (widget); return; }