[gtk+] gtkwindow: Have a separate "titlebar" pointer for decorations we create ourselves
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gtkwindow: Have a separate "titlebar" pointer for decorations we create ourselves
- Date: Thu, 22 Aug 2013 13:42:41 +0000 (UTC)
commit a95cabd787e083b121ca09f3aa032e243fef24c7
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Wed Aug 21 14:59:44 2013 -0400
gtkwindow: Have a separate "titlebar" pointer for decorations we create ourselves
This cleans up the code a bit.
https://bugzilla.gnome.org/show_bug.cgi?id=706529
gtk/gtkwindow.c | 316 ++++++++++++++++++++++++++++---------------------------
1 files changed, 162 insertions(+), 154 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 30aff5e..71fc55b 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -148,6 +148,7 @@ struct _GtkWindowPrivate
gint title_height;
GtkWidget *title_box;
+ GtkWidget *titlebar;
GtkWidget *titlebar_icon;
GtkWidget *titlebar_min_button;
GtkWidget *titlebar_max_button;
@@ -1805,8 +1806,8 @@ gtk_window_set_title (GtkWindow *window,
if (gtk_widget_get_realized (widget))
gdk_window_set_title (gtk_widget_get_window (widget), priv->title);
- if (GTK_IS_HEADER_BAR (priv->title_box) && !priv->custom_title)
- gtk_header_bar_set_title (GTK_HEADER_BAR (priv->title_box), priv->title);
+ if (priv->titlebar != NULL)
+ gtk_header_bar_set_title (GTK_HEADER_BAR (priv->titlebar), priv->title);
g_object_notify (G_OBJECT (window), "title");
}
@@ -3463,6 +3464,7 @@ unset_titlebar (GtkWindow *window)
{
gtk_widget_unparent (priv->title_box);
priv->title_box = NULL;
+ priv->titlebar = NULL;
priv->titlebar_icon = NULL;
priv->titlebar_min_button = NULL;
priv->titlebar_max_button = NULL;
@@ -5050,6 +5052,10 @@ update_window_buttons (GtkWindow *window)
GtkWindowPrivate *priv = window->priv;
gboolean maximized;
GtkTextDirection direction;
+ gchar *layout_desc;
+ gchar **tokens, **t;
+ gint i, j;
+ GdkPixbuf *icon = NULL;
if (priv->title_box == NULL)
return;
@@ -5068,147 +5074,171 @@ update_window_buttons (GtkWindow *window)
gtk_widget_show (priv->title_box);
}
- if (priv->custom_title)
+ if (priv->titlebar == NULL)
return;
- if (priv->decorated &&
- priv->client_decorated)
+ if (priv->titlebar_icon)
+ {
+ icon = gtk_image_get_pixbuf (GTK_IMAGE (priv->titlebar_icon));
+ if (icon)
+ g_object_ref (icon);
+ gtk_widget_destroy (priv->titlebar_icon);
+ priv->titlebar_icon = NULL;
+ }
+ if (priv->titlebar_min_button)
+ {
+ gtk_widget_destroy (priv->titlebar_min_button);
+ priv->titlebar_min_button = NULL;
+ }
+ if (priv->titlebar_max_button)
{
- gchar *layout_desc;
- gchar **tokens, **t;
- gint i, j;
- GdkPixbuf *icon = NULL;
+ gtk_widget_destroy (priv->titlebar_max_button);
+ priv->titlebar_max_button = NULL;
+ }
+ if (priv->titlebar_close_button)
+ {
+ gtk_widget_destroy (priv->titlebar_close_button);
+ priv->titlebar_close_button = NULL;
+ }
- if (priv->titlebar_icon)
- {
- icon = gtk_image_get_pixbuf (GTK_IMAGE (priv->titlebar_icon));
- if (icon)
- g_object_ref (icon);
- gtk_widget_destroy (priv->titlebar_icon);
- priv->titlebar_icon = NULL;
- }
- if (priv->titlebar_min_button)
- {
- gtk_widget_destroy (priv->titlebar_min_button);
- priv->titlebar_min_button = NULL;
- }
- if (priv->titlebar_max_button)
- {
- gtk_widget_destroy (priv->titlebar_max_button);
- priv->titlebar_max_button = NULL;
- }
- if (priv->titlebar_close_button)
+ gtk_widget_style_get (GTK_WIDGET (window),
+ "decoration-button-layout", &layout_desc,
+ NULL);
+
+ tokens = g_strsplit (layout_desc, ":", 2);
+ if (tokens)
+ {
+ for (i = 0; i < 2; i++)
{
- gtk_widget_destroy (priv->titlebar_close_button);
- priv->titlebar_close_button = NULL;
- }
+ GtkWidget *box;
- gtk_widget_style_get (GTK_WIDGET (window),
- "decoration-button-layout", &layout_desc,
- NULL);
+ if (tokens[i] == NULL)
+ continue;
- tokens = g_strsplit (layout_desc, ":", 2);
- if (tokens)
- {
- for (i = 0; i < 2; i++)
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_widget_show (box);
+ gtk_widget_set_margin_bottom (box, 6);
+ if ((direction == GTK_TEXT_DIR_LTR && i == 0) ||
+ (direction == GTK_TEXT_DIR_RTL && i == 1))
+ gtk_style_context_add_class (gtk_widget_get_style_context (box), "left");
+ else
+ gtk_style_context_add_class (gtk_widget_get_style_context (box), "right");
+ if (i == 0)
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (priv->title_box), box);
+ else
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), box);
+
+ t = g_strsplit (tokens[i], ",", -1);
+ for (j = 0; t[j]; j++)
{
- GtkWidget *box;
-
- if (tokens[i] == NULL)
- continue;
-
- box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
- gtk_widget_show (box);
- gtk_widget_set_margin_bottom (box, 6);
- if ((direction == GTK_TEXT_DIR_LTR && i == 0) ||
- (direction == GTK_TEXT_DIR_RTL && i == 1))
- gtk_style_context_add_class (gtk_widget_get_style_context (box), "left");
- else
- gtk_style_context_add_class (gtk_widget_get_style_context (box), "right");
- if (i == 0)
- gtk_header_bar_pack_start (GTK_HEADER_BAR (priv->title_box), box);
- else
- gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), box);
-
- t = g_strsplit (tokens[i], ",", -1);
- for (j = 0; t[j]; j++)
- {
- GtkWidget *button = NULL;
- GtkWidget *image = NULL;
+ GtkWidget *button = NULL;
+ GtkWidget *image = NULL;
- if (strcmp (t[j], "icon") == 0)
- {
- button = gtk_image_new ();
- gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
- gtk_widget_set_size_request (button, 20, 20);
- gtk_widget_show (button);
- if (icon != NULL)
- {
- gtk_image_set_from_pixbuf (GTK_IMAGE (button), icon);
- g_object_unref (icon);
- }
- else
- gtk_widget_hide (button);
-
- priv->titlebar_icon = button;
- }
- else if (strcmp (t[j], "minimize") == 0 &&
- priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
- {
- button = gtk_button_new ();
- gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
- image = gtk_image_new_from_icon_name ("window-minimize-symbolic", GTK_ICON_SIZE_MENU);
- g_object_set (image, "use-fallback", TRUE, NULL);
- gtk_container_add (GTK_CONTAINER (button), image);
- gtk_widget_set_can_focus (button, FALSE);
- gtk_widget_show_all (button);
- g_signal_connect (button, "clicked",
- G_CALLBACK (gtk_window_titlebar_min_clicked), window);
- priv->titlebar_min_button = button;
- }
- else if (strcmp (t[j], "maximize") == 0 &&
- priv->resizable &&
- priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
- {
- const gchar *icon_name;
-
- icon_name = maximized ? "window-restore-symbolic" : "window-maximize-symbolic";
- button = gtk_button_new ();
- gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
- image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
- g_object_set (image, "use-fallback", TRUE, NULL);
- gtk_container_add (GTK_CONTAINER (button), image);
- gtk_widget_set_can_focus (button, FALSE);
- gtk_widget_show_all (button);
- g_signal_connect (button, "clicked",
- G_CALLBACK (gtk_window_titlebar_max_clicked), window);
- priv->titlebar_max_button = button;
- }
- else if (strcmp (t[j], "close") == 0 &&
- priv->deletable &&
- priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+ if (strcmp (t[j], "icon") == 0)
+ {
+ button = gtk_image_new ();
+ gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
+ gtk_widget_set_size_request (button, 20, 20);
+ gtk_widget_show (button);
+ if (icon != NULL)
{
- button = gtk_button_new ();
- image = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU);
- gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
- g_object_set (image, "use-fallback", TRUE, NULL);
- gtk_container_add (GTK_CONTAINER (button), image);
- gtk_widget_set_can_focus (button, FALSE);
- gtk_widget_show_all (button);
- g_signal_connect_swapped (button, "clicked",
- G_CALLBACK (gtk_window_close), window);
- priv->titlebar_close_button = button;
+ gtk_image_set_from_pixbuf (GTK_IMAGE (button), icon);
+ g_object_unref (icon);
}
+ else
+ gtk_widget_hide (button);
- if (button)
- gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
+ priv->titlebar_icon = button;
+ }
+ else if (strcmp (t[j], "minimize") == 0 &&
+ priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+ {
+ button = gtk_button_new ();
+ gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
+ image = gtk_image_new_from_icon_name ("window-minimize-symbolic", GTK_ICON_SIZE_MENU);
+ g_object_set (image, "use-fallback", TRUE, NULL);
+ gtk_container_add (GTK_CONTAINER (button), image);
+ gtk_widget_set_can_focus (button, FALSE);
+ gtk_widget_show_all (button);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (gtk_window_titlebar_min_clicked), window);
+ priv->titlebar_min_button = button;
+ }
+ else if (strcmp (t[j], "maximize") == 0 &&
+ priv->resizable &&
+ priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+ {
+ const gchar *icon_name;
+
+ icon_name = maximized ? "window-restore-symbolic" : "window-maximize-symbolic";
+ button = gtk_button_new ();
+ gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
+ image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
+ g_object_set (image, "use-fallback", TRUE, NULL);
+ gtk_container_add (GTK_CONTAINER (button), image);
+ gtk_widget_set_can_focus (button, FALSE);
+ gtk_widget_show_all (button);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (gtk_window_titlebar_max_clicked), window);
+ priv->titlebar_max_button = button;
}
- g_strfreev (t);
+ else if (strcmp (t[j], "close") == 0 &&
+ priv->deletable &&
+ priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+ {
+ button = gtk_button_new ();
+ image = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_style_context_add_class (gtk_widget_get_style_context (button), "titlebutton");
+ g_object_set (image, "use-fallback", TRUE, NULL);
+ gtk_container_add (GTK_CONTAINER (button), image);
+ gtk_widget_set_can_focus (button, FALSE);
+ gtk_widget_show_all (button);
+ g_signal_connect_swapped (button, "clicked",
+ G_CALLBACK (gtk_window_close), window);
+ priv->titlebar_close_button = button;
+ }
+
+ if (button)
+ gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
}
- g_strfreev (tokens);
+ g_strfreev (t);
}
- g_free (layout_desc);
+ g_strfreev (tokens);
}
+ g_free (layout_desc);
+}
+
+static GtkWidget *
+create_titlebar (GtkWindow *window)
+{
+ GtkWindowPrivate *priv = window->priv;
+ GtkWidget *label;
+ GtkWidget *titlebar;
+ GtkStyleContext *context;
+ gchar *title;
+
+ titlebar = gtk_header_bar_new ();
+ g_object_set (titlebar,
+ "spacing", 0,
+ "hpadding", 0,
+ "vpadding", 0,
+ NULL);
+ context = gtk_widget_get_style_context (titlebar);
+ gtk_style_context_add_class (context, GTK_STYLE_CLASS_TITLEBAR);
+
+ title = g_markup_printf_escaped ("<b>%s</b>",
+ priv->title ? priv->title : get_default_title ());
+ label = gtk_label_new (title);
+ g_free (title);
+ g_object_set (label,
+ "use-markup", TRUE,
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ "margin", 6,
+ NULL);
+
+ gtk_header_bar_set_custom_title (GTK_HEADER_BAR (titlebar), label);
+
+ return titlebar;
}
static void
@@ -5216,9 +5246,6 @@ create_decoration (GtkWidget *widget)
{
GtkWindow *window = GTK_WINDOW (widget);
GtkWindowPrivate *priv = window->priv;
- GtkStyleContext *context;
- gchar *title;
- GtkWidget *label;
/* Client decorations already created */
if (priv->client_decorated)
@@ -5254,29 +5281,10 @@ create_decoration (GtkWidget *widget)
if (priv->title_box == NULL)
{
- priv->title_box = gtk_header_bar_new ();
- g_object_set (priv->title_box,
- "spacing", 0,
- "hpadding", 0,
- "vpadding", 0,
- NULL);
- context = gtk_widget_get_style_context (priv->title_box);
- gtk_style_context_add_class (context, GTK_STYLE_CLASS_TITLEBAR);
- gtk_widget_set_parent (priv->title_box, widget);
-
- title = g_markup_printf_escaped ("<b>%s</b>",
- priv->title ? priv->title : get_default_title ());
- label = gtk_label_new (title);
- g_free (title);
- g_object_set (label,
- "use-markup", TRUE,
- "ellipsize", PANGO_ELLIPSIZE_END,
- "margin", 6,
- NULL);
-
- gtk_header_bar_set_custom_title (GTK_HEADER_BAR (priv->title_box), label);
-
- gtk_widget_show_all (priv->title_box);
+ priv->titlebar = create_titlebar (window);
+ gtk_widget_set_parent (priv->titlebar, widget);
+ gtk_widget_show_all (priv->titlebar);
+ priv->title_box = priv->titlebar;
}
update_window_buttons (window);
@@ -7364,7 +7372,7 @@ gtk_window_forall (GtkContainer *container,
(* callback) (child, callback_data);
if (priv->title_box != NULL &&
- (priv->custom_title || include_internals))
+ (priv->titlebar == NULL || include_internals))
(* callback) (priv->title_box, callback_data);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]