summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2013-03-10 17:06:54 -0400
committerMatthias Clasen <mclasen@redhat.com>2013-03-10 17:06:54 -0400
commitc55966e0fdfaa2dff6e195ef3c9a08476ad1dc82 (patch)
tree6aa711ae6880a5324390fc04950330cdef872c68
parent91abc523115fd8cbb3307341b233b3e5fbd1eda6 (diff)
downloadgtk+-c55966e0fdfaa2dff6e195ef3c9a08476ad1dc82.tar.gz
Redo window button layout parsing
We now allow buttons at the left and right side, they can be specified like this: menu,close:minimize,maximize. Also, change the default button layout back to have just a close button on the right.
-rw-r--r--gtk/gtkwindow.c131
1 files changed, 69 insertions, 62 deletions
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 849f681f27..3b38088f3d 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -1060,7 +1060,7 @@ gtk_window_class_init (GtkWindowClass *klass)
g_param_spec_string ("decoration-button-layout",
P_("Decorated button layout"),
P_("Decorated button layout"),
- "minimize,maximize,close",
+ ":close",
GTK_PARAM_READABLE));
gtk_widget_class_install_style_property (widget_class,
@@ -3617,7 +3617,6 @@ icon_list_from_theme (GtkWidget *widget,
return list;
}
-
static void
gtk_window_realize_icon (GtkWindow *window)
{
@@ -4905,60 +4904,86 @@ update_window_buttons (GtkWindow *window)
if (priv->client_decorated)
{
gchar *layout_desc;
- gchar **tokens;
- gint i;
-
- gtk_widget_style_get (GTK_WIDGET (window),
- "decoration-button-layout", &layout_desc,
- NULL);
- tokens = g_strsplit (layout_desc, ",", -1);
+ gchar **tokens, **t;
+ gint i, j;
- if (priv->title_min_button != NULL)
+ if (priv->title_min_button)
{
- if (strstr (layout_desc, "minimize") &&
- priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
- gtk_widget_show (priv->title_min_button);
- else
- gtk_widget_hide (priv->title_min_button);
+ gtk_widget_destroy (priv->title_min_button);
+ priv->title_min_button = NULL;
}
-
- if (priv->title_max_button != NULL)
+ if (priv->title_max_button)
{
- if (priv->resizable &&
- strstr (layout_desc, "maximize") &&
- priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
- gtk_widget_show (priv->title_max_button);
- else
- gtk_widget_hide (priv->title_max_button);
+ gtk_widget_destroy (priv->title_max_button);
+ priv->title_max_button = NULL;
}
-
- if (priv->title_close_button != NULL)
+ if (priv->title_close_button)
{
- if (priv->deletable &&
- strstr (layout_desc, "close") &&
- priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
- gtk_widget_show_all (priv->title_close_button);
- else
- gtk_widget_hide (priv->title_close_button);
+ gtk_widget_destroy (priv->title_close_button);
+ priv->title_close_button = NULL;
}
-#if 0
- if (priv->title_box != NULL)
- {
- gtk_widget_show (priv->title_box);
+ gtk_widget_style_get (GTK_WIDGET (window),
+ "decoration-button-layout", &layout_desc,
+ NULL);
- for (i = 0; tokens[i] != 0; i++)
+ tokens = g_strsplit (layout_desc, ":", 2);
+ if (tokens)
+ {
+ for (i = 0; i < 2; i++)
{
- if (strcmp (tokens[i], "minimize") == 0)
- gtk_box_reorder_child (GTK_BOX (priv->title_box), priv->title_min_button, 0);
- else if (strcmp (tokens[i], "maximize") == 0)
- gtk_box_reorder_child (GTK_BOX (priv->title_box), priv->title_max_button, 0);
- else if (strcmp (tokens[i], "close") == 0)
- gtk_box_reorder_child (GTK_BOX (priv->title_box), priv->title_close_button, 0);
+ if (tokens[i] == NULL)
+ continue;
+
+ t = g_strsplit (tokens[i], ",", -1);
+ for (j = 0; t[j]; j++)
+ {
+ if (strcmp (t[j], "minimize") == 0 &&
+ priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+ {
+ priv->title_min_button = gtk_button_new_with_label ("_");
+ gtk_widget_set_can_focus (priv->title_min_button, FALSE);
+ gtk_widget_show (priv->title_min_button);
+ g_signal_connect (priv->title_min_button, "clicked",
+ G_CALLBACK (gtk_window_title_min_clicked), window);
+ if (i == 0)
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (priv->title_box), priv->title_min_button);
+ else
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), priv->title_min_button);
+ }
+ else if (strcmp (t[j], "maximize") == 0 &&
+ priv->resizable &&
+ priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+ {
+ priv->title_max_button = gtk_button_new_with_label ("\342\226\253");
+ gtk_widget_set_can_focus (priv->title_max_button, FALSE);
+ gtk_widget_show (priv->title_max_button);
+ g_signal_connect (priv->title_max_button, "clicked",
+ G_CALLBACK (gtk_window_title_max_clicked), window);
+ if (i == 0)
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (priv->title_box), priv->title_max_button);
+ else
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), priv->title_max_button);
+ }
+ else if (strcmp (t[j], "close") == 0 &&
+ priv->deletable &&
+ priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+ {
+ priv->title_close_button = gtk_button_new_with_label ("×");
+ gtk_widget_set_can_focus (priv->title_close_button, FALSE);
+ gtk_widget_show (priv->title_close_button);
+ g_signal_connect (priv->title_close_button, "clicked",
+ G_CALLBACK (gtk_window_title_close_clicked), window);
+ if (i == 0)
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (priv->title_box), priv->title_close_button);
+ else
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), priv->title_close_button);
+ }
+ }
+ g_strfreev (t);
}
+ g_strfreev (tokens);
}
-#endif
- g_strfreev (tokens);
g_free (layout_desc);
}
else
@@ -5025,24 +5050,6 @@ create_decoration (GtkWidget *widget)
title = get_default_title (); /* copied from X backend */
gtk_header_bar_set_title (GTK_HEADER_BAR (priv->title_box), title);
- priv->title_close_button = gtk_button_new_with_label ("×");
- gtk_widget_set_can_focus (priv->title_close_button, FALSE);
- gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), priv->title_close_button);
- g_signal_connect (priv->title_close_button, "clicked",
- G_CALLBACK (gtk_window_title_close_clicked), window);
-
- priv->title_max_button = gtk_button_new_with_label ("\342\226\253");
- gtk_widget_set_can_focus (priv->title_max_button, FALSE);
- gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), priv->title_max_button);
- g_signal_connect (priv->title_max_button, "clicked",
- G_CALLBACK (gtk_window_title_max_clicked), window);
-
- priv->title_min_button = gtk_button_new_with_label ("_");
- gtk_widget_set_can_focus (priv->title_min_button, FALSE);
- gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->title_box), priv->title_min_button);
- g_signal_connect (priv->title_min_button, "clicked",
- G_CALLBACK (gtk_window_title_min_clicked), window);
-
gtk_widget_show_all (priv->title_box);
update_window_buttons (window);