[gtk+/wip/csd-for-review] Redo window button layout parsing



commit c55966e0fdfaa2dff6e195ef3c9a08476ad1dc82
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Mar 10 17:06:54 2013 -0400

    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.

 gtk/gtkwindow.c |  131 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 69 insertions(+), 62 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 849f681..3b38088 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]