Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37039889
en ru br
Репозитории ALT

Группа :: Graphical desktop/MATE
Пакет: mate-control-center

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: mate-control-center_fv-gd-toolbar-sync-to-latest-libgd-suitable-for-mate.patch
Скачать


diff -upr mate-control-center/font-viewer/gd-main-toolbar.c mate-control-center-test/font-viewer/gd-main-toolbar.c
--- mate-control-center/font-viewer/gd-main-toolbar.c	2015-08-30 21:29:23.096452237 +0200
+++ mate-control-center-test/font-viewer/gd-main-toolbar.c	2015-08-30 21:28:49.876105000 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 Red Hat, Inc.
+ * Copyright (c) 2011, 2012 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by 
@@ -26,6 +26,12 @@
 
 G_DEFINE_TYPE (GdMainToolbar, gd_main_toolbar, GTK_TYPE_TOOLBAR)
 
+typedef enum {
+  CHILD_NORMAL = 0,
+  CHILD_TOGGLE = 1,
+  CHILD_MENU = 2,
+} ChildType;
+
 struct _GdMainToolbarPrivate {
   GtkSizeGroup *size_group;
   GtkSizeGroup *vertical_size_group;
@@ -35,12 +41,25 @@ struct _GdMainToolbarPrivate {
   GtkToolItem *right_group;
 
   GtkWidget *left_grid;
+  GtkWidget *center_grid;
 
+  GtkWidget *labels_grid;
   GtkWidget *title_label;
   GtkWidget *detail_label;
 
+  GtkWidget *modes_box;
+
+  GtkWidget *center_menu;
+  GtkWidget *center_menu_child;
+
   GtkWidget *right_grid;
 
+  gboolean show_modes;
+};
+
+enum {
+        PROP_0,
+        PROP_SHOW_MODES,
 };
 
 static void
@@ -54,30 +73,102 @@ gd_main_toolbar_dispose (GObject *obj)
   G_OBJECT_CLASS (gd_main_toolbar_parent_class)->dispose (obj);
 }
 
-static gint
-get_icon_margin (void)
+static GtkWidget *
+get_empty_button (ChildType type)
 {
-  gint toolbar_size, menu_size;
+  GtkWidget *button;
+
+  switch (type)
+    {
+    case CHILD_MENU:
+      button = gtk_menu_button_new ();
+      break;
+    case CHILD_TOGGLE:
+      button = gtk_toggle_button_new ();
+      break;
+    case CHILD_NORMAL:
+    default:
+      button = gtk_button_new ();
+      break;
+    }
 
-  gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &menu_size, NULL);
-  gtk_icon_size_lookup (GTK_ICON_SIZE_LARGE_TOOLBAR, &toolbar_size, NULL);
-  return (gint) floor ((toolbar_size - menu_size) / 2.0);
+  return button;
+}
+
+static GtkWidget *
+get_symbolic_button (const gchar *icon_name,
+                     ChildType    type)
+{
+  GtkWidget *button, *w;
+
+  switch (type)
+    {
+    case CHILD_MENU:
+      button = gtk_menu_button_new ();
+      gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (button)));
+      break;
+    case CHILD_TOGGLE:
+      button = gtk_toggle_button_new ();
+      break;
+    case CHILD_NORMAL:
+    default:
+      button = gtk_button_new ();
+      break;
+    }
+
+  gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised");
+  gtk_style_context_add_class (gtk_widget_get_style_context (button), "image-button");
+
+  w = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
+  gtk_widget_show (w);
+  gtk_container_add (GTK_CONTAINER (button), w);
+
+  return button;
+}
+
+static GtkWidget *
+get_text_button (const gchar *label,
+                 ChildType    type)
+{
+  GtkWidget *button, *w;
+
+  switch (type)
+    {
+    case CHILD_MENU:
+      button = gtk_menu_button_new ();
+      gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (button)));
+
+      w = gtk_label_new (label);
+      gtk_widget_show (w);
+      gtk_container_add (GTK_CONTAINER (button), w);
+      break;
+    case CHILD_TOGGLE:
+      button = gtk_toggle_button_new_with_label (label);
+      break;
+    case CHILD_NORMAL:
+    default:
+      button = gtk_button_new_with_label (label);
+      break;
+    }
+
+  gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised");
+  gtk_style_context_add_class (gtk_widget_get_style_context (button), "text-button");
+
+  return button;
 }
 
 static GtkSizeGroup *
-get_vertical_size_group (void)
+get_vertical_size_group (GdMainToolbar *self)
 {
   GtkSizeGroup *retval;
-  GtkWidget *w, *dummy;
-  gint icon_margin;
-
-  icon_margin = get_icon_margin ();
+  GtkWidget *dummy;
+  GtkToolItem *container;
 
-  dummy = gtk_toggle_button_new ();
-  w = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
-  g_object_set (w, "margin", icon_margin, NULL);
-  gtk_container_add (GTK_CONTAINER (dummy), w);
-  gtk_widget_show_all (dummy);
+  dummy = get_text_button ("Dummy", CHILD_NORMAL);
+  container = gtk_tool_item_new ();
+  gtk_widget_set_no_show_all (GTK_WIDGET (container), TRUE);
+  gtk_container_add (GTK_CONTAINER (container), dummy);
+  gtk_toolbar_insert (GTK_TOOLBAR (self), container, -1);
 
   retval = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
   gtk_size_group_add_widget (retval, dummy);
@@ -85,32 +176,79 @@ get_vertical_size_group (void)
   return retval;
 }
 
-static GtkWidget *
-get_symbolic_button (const gchar *icon_name)
+gboolean
+gd_main_toolbar_get_show_modes (GdMainToolbar *self)
 {
-  GtkWidget *button, *w;
+  return self->priv->show_modes;
+}
 
-  button = gtk_button_new ();
-  gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised");
+void
+gd_main_toolbar_set_show_modes (GdMainToolbar *self,
+                                gboolean show_modes)
+{
+  if (self->priv->show_modes == show_modes)
+    return;
 
-  w = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
-  g_object_set (w, "margin", get_icon_margin (), NULL);
-  gtk_widget_show (w);
-  gtk_container_add (GTK_CONTAINER (button), w);
+  self->priv->show_modes = show_modes;
+  if (self->priv->show_modes)
+    {
+      gtk_widget_set_no_show_all (self->priv->labels_grid, TRUE);
+      gtk_widget_hide (self->priv->labels_grid);
 
-  return button;
+      gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_FILL);
+      gtk_widget_set_no_show_all (self->priv->modes_box, FALSE);
+      gtk_widget_show_all (self->priv->modes_box);
+    }
+  else
+    {
+      gtk_widget_set_no_show_all (self->priv->modes_box, TRUE);
+      gtk_widget_hide (self->priv->modes_box);
+
+      gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_CENTER);
+      gtk_widget_set_no_show_all (self->priv->labels_grid, FALSE);
+      gtk_widget_show_all (self->priv->labels_grid);
+    }
+
+  g_object_notify (G_OBJECT (self), "show-modes");
 }
 
-static GtkWidget *
-get_text_button (const gchar *label)
+static void
+gd_main_toolbar_set_property (GObject      *object,
+                              guint         prop_id,
+                              const GValue *value,
+                              GParamSpec   *pspec)
 {
-  GtkWidget *w;
 
-  w = gtk_button_new_with_label (label);
-  gtk_widget_set_vexpand (w, TRUE);
-  gtk_style_context_add_class (gtk_widget_get_style_context (w), "raised");
+  GdMainToolbar *self = GD_MAIN_TOOLBAR (object);
 
-  return w;
+  switch (prop_id)
+    {
+    case PROP_SHOW_MODES:
+      gd_main_toolbar_set_show_modes (GD_MAIN_TOOLBAR (self), g_value_get_boolean (value));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gd_main_toolbar_get_property (GObject    *object,
+                              guint       prop_id,
+                              GValue     *value,
+                              GParamSpec *pspec)
+{
+  GdMainToolbar *self = GD_MAIN_TOOLBAR (object);
+
+  switch (prop_id)
+    {
+    case PROP_SHOW_MODES:
+      g_value_set_boolean (value, self->priv->show_modes);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
 }
 
 static void
@@ -122,7 +260,7 @@ gd_main_toolbar_constructed (GObject *ob
 
   G_OBJECT_CLASS (gd_main_toolbar_parent_class)->constructed (obj);
 
-  self->priv->vertical_size_group = get_vertical_size_group ();
+  self->priv->vertical_size_group = get_vertical_size_group (self);
 
   /* left section */
   self->priv->left_group = gtk_tool_item_new ();
@@ -135,30 +273,41 @@ gd_main_toolbar_constructed (GObject *ob
   self->priv->left_grid = gtk_grid_new ();
   gtk_grid_set_column_spacing (GTK_GRID (self->priv->left_grid), 12);
   gtk_container_add (GTK_CONTAINER (self->priv->left_group), self->priv->left_grid);
+  gtk_widget_set_halign (self->priv->left_grid, GTK_ALIGN_START);
 
   /* center section */
   self->priv->center_group = gtk_tool_item_new ();
   gtk_tool_item_set_expand (self->priv->center_group, TRUE);
   gtk_toolbar_insert (tb, self->priv->center_group, -1);
+  self->priv->center_grid = gtk_grid_new ();
+  gtk_widget_set_halign (self->priv->center_grid, GTK_ALIGN_CENTER);
+  gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_CENTER);
+  gtk_container_add (GTK_CONTAINER (self->priv->center_group), self->priv->center_grid);
   gtk_size_group_add_widget (self->priv->vertical_size_group,
                              GTK_WIDGET (self->priv->center_group));
 
   /* centered label group */
-  grid = gtk_grid_new ();
-  gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
-  gtk_widget_set_valign (grid, GTK_ALIGN_CENTER);
+  self->priv->labels_grid = grid = gtk_grid_new ();
   gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
-  gtk_container_add (GTK_CONTAINER (self->priv->center_group), grid);
+  gtk_container_add (GTK_CONTAINER (self->priv->center_grid), grid);
 
   self->priv->title_label = gtk_label_new (NULL);
   gtk_label_set_ellipsize (GTK_LABEL (self->priv->title_label), PANGO_ELLIPSIZE_END);
   gtk_container_add (GTK_CONTAINER (grid), self->priv->title_label);
 
   self->priv->detail_label = gtk_label_new (NULL);
+  gtk_label_set_ellipsize (GTK_LABEL (self->priv->detail_label), PANGO_ELLIPSIZE_END);
   gtk_widget_set_no_show_all (self->priv->detail_label, TRUE);
   gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->detail_label), "dim-label");
   gtk_container_add (GTK_CONTAINER (grid), self->priv->detail_label);
 
+  /* centered mode group */
+  self->priv->modes_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+  gtk_box_set_homogeneous (GTK_BOX (self->priv->modes_box), TRUE);
+  gtk_widget_set_no_show_all (self->priv->modes_box, TRUE);
+  gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->modes_box), "linked");
+  gtk_container_add (GTK_CONTAINER (self->priv->center_grid), self->priv->modes_box);
+
   /* right section */
   self->priv->right_group = gtk_tool_item_new ();
   gtk_widget_set_margin_start (GTK_WIDGET (self->priv->right_group), 12);
@@ -169,6 +318,7 @@ gd_main_toolbar_constructed (GObject *ob
   self->priv->right_grid = gtk_grid_new ();
   gtk_grid_set_column_spacing (GTK_GRID (self->priv->right_grid), 12);
   gtk_container_add (GTK_CONTAINER (self->priv->right_group), self->priv->right_grid);
+  gtk_widget_set_halign (self->priv->right_grid, GTK_ALIGN_END);
 
   self->priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
   gtk_size_group_add_widget (self->priv->size_group, GTK_WIDGET (self->priv->left_group));
@@ -188,8 +338,18 @@ gd_main_toolbar_class_init (GdMainToolba
 
   oclass = G_OBJECT_CLASS (klass);
   oclass->constructed = gd_main_toolbar_constructed;
+  oclass->set_property = gd_main_toolbar_set_property;
+  oclass->get_property = gd_main_toolbar_get_property;
   oclass->dispose = gd_main_toolbar_dispose;
 
+  g_object_class_install_property (oclass,
+                                   PROP_SHOW_MODES,
+                                   g_param_spec_boolean ("show-modes",
+                                                         "Show Modes",
+                                                         "Show Modes",
+                                                         FALSE,
+                                                         G_PARAM_READWRITE));
+
   g_type_class_add_private (klass, sizeof (GdMainToolbarPrivate));
 }
 
@@ -203,6 +363,8 @@ gd_main_toolbar_clear (GdMainToolbar *se
   /* clear all added buttons */
   gtk_container_foreach (GTK_CONTAINER (self->priv->left_grid),
                          (GtkCallback) gtk_widget_destroy, self);
+  gtk_container_foreach (GTK_CONTAINER (self->priv->modes_box),
+                         (GtkCallback) gtk_widget_destroy, self);
   gtk_container_foreach (GTK_CONTAINER (self->priv->right_grid), 
                          (GtkCallback) gtk_widget_destroy, self);
 }
@@ -255,6 +417,129 @@ gd_main_toolbar_new (void)
   return g_object_new (GD_TYPE_MAIN_TOOLBAR, NULL);
 }
 
+static GtkWidget *
+add_button_internal (GdMainToolbar *self,
+                     const gchar *icon_name,
+                     const gchar *label,
+                     gboolean pack_start,
+                     ChildType type)
+{
+  GtkWidget *button;
+
+  if (icon_name != NULL)
+    {
+      button = get_symbolic_button (icon_name, type);
+      if (label != NULL)
+        gtk_widget_set_tooltip_text (button, label);
+    }
+  else if (label != NULL)
+    {
+      button = get_text_button (label, type);
+    }
+  else
+    {
+      button = get_empty_button (type);
+    }
+
+  gd_main_toolbar_add_widget (self, button, pack_start);
+
+  gtk_widget_show_all (button);
+
+  return button;
+}
+
+/**
+ * gd_main_toolbar_set_labels_menu:
+ * @self:
+ * @menu: (allow-none):
+ *
+ */
+void
+gd_main_toolbar_set_labels_menu (GdMainToolbar *self,
+                                 GMenuModel    *menu)
+{
+  GtkWidget *button, *grid, *w;
+
+  if (menu == NULL &&
+      ((gtk_widget_get_parent (self->priv->labels_grid) == self->priv->center_grid) ||
+       self->priv->center_menu_child == NULL))
+    return;
+
+  if (menu != NULL)
+    {
+      g_object_ref (self->priv->labels_grid);
+      gtk_container_remove (GTK_CONTAINER (self->priv->center_grid),
+                            self->priv->labels_grid);
+
+      self->priv->center_menu_child = grid = gtk_grid_new ();
+      gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
+      gtk_container_add (GTK_CONTAINER (grid), self->priv->labels_grid);
+      g_object_unref (self->priv->labels_grid);
+
+      w = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
+      gtk_container_add (GTK_CONTAINER (grid), w);
+
+      self->priv->center_menu = button = gtk_menu_button_new ();
+      gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->center_menu),
+                                   "selection-menu");
+      gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (button)));
+      gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
+      gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), menu);
+      gtk_container_add (GTK_CONTAINER (self->priv->center_menu), grid);
+
+      gtk_container_add (GTK_CONTAINER (self->priv->center_grid), button);
+    }
+  else
+    {
+      g_object_ref (self->priv->labels_grid);
+      gtk_container_remove (GTK_CONTAINER (self->priv->center_menu_child),
+                            self->priv->labels_grid);
+      gtk_widget_destroy (self->priv->center_menu);
+
+      self->priv->center_menu = NULL;
+      self->priv->center_menu_child = NULL;
+
+      gtk_container_add (GTK_CONTAINER (self->priv->center_grid),
+                         self->priv->labels_grid);
+      g_object_unref (self->priv->labels_grid);
+    }
+
+  gtk_widget_show_all (self->priv->center_grid);
+}
+
+/**
+ * gd_main_toolbar_add_mode:
+ * @self:
+ * @label:
+ *
+ * Returns: (transfer none):
+ */
+GtkWidget *
+gd_main_toolbar_add_mode (GdMainToolbar *self,
+                          const gchar *label)
+{
+  GtkWidget *button;
+  GList *group;
+
+  button = gtk_radio_button_new_with_label (NULL, label);
+  gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
+  gtk_widget_set_size_request (button, 100, -1);
+  gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised");
+  gtk_style_context_add_class (gtk_widget_get_style_context (button), "text-button");
+
+  group = gtk_container_get_children (GTK_CONTAINER (self->priv->modes_box));
+  if (group != NULL)
+    {
+      gtk_radio_button_join_group (GTK_RADIO_BUTTON (button), GTK_RADIO_BUTTON (group->data));
+      g_list_free (group);
+    }
+
+  gtk_container_add (GTK_CONTAINER (self->priv->modes_box), button);
+  gtk_widget_show (button);
+
+  return button;
+}
+
 /**
  * gd_main_toolbar_add_button:
  * @self:
@@ -264,33 +549,66 @@ gd_main_toolbar_new (void)
  *
  * Returns: (transfer none):
  */
-
 GtkWidget *
 gd_main_toolbar_add_button (GdMainToolbar *self,
                             const gchar *icon_name,
                             const gchar *label,
                             gboolean pack_start)
 {
-  GtkWidget *button;
+  return add_button_internal (self, icon_name, label, pack_start, CHILD_NORMAL);
+}
 
-  if (icon_name != NULL)
-    {
-      button = get_symbolic_button (icon_name);
-      if (label != NULL)
-        gtk_widget_set_tooltip_text (button, label);
-    }
-  else if (label != NULL)
-    {
-      button = get_text_button (label);
-    }
+/**
+ * gd_main_toolbar_add_menu:
+ * @self:
+ * @icon_name: (allow-none):
+ * @label: (allow-none):
+ * @pack_start:
+ *
+ * Returns: (transfer none):
+ */
+GtkWidget *
+gd_main_toolbar_add_menu (GdMainToolbar *self,
+                          const gchar *icon_name,
+                          const gchar *label,
+                          gboolean pack_start)
+{
+  return add_button_internal (self, icon_name, label, pack_start, CHILD_MENU);
+}
+
+/**
+ * gd_main_toolbar_add_toggle:
+ * @self:
+ * @icon_name: (allow-none):
+ * @label: (allow-none):
+ * @pack_start:
+ *
+ * Returns: (transfer none):
+ */
+GtkWidget *
+gd_main_toolbar_add_toggle (GdMainToolbar *self,
+                            const gchar *icon_name,
+                            const gchar *label,
+                            gboolean pack_start)
+{
+  return add_button_internal (self, icon_name, label, pack_start, CHILD_TOGGLE);
+}
 
+/**
+ * gd_main_toolbar_add_widget:
+ * @self:
+ * @widget:
+ * @pack_start:
+ *
+ */
+void
+gd_main_toolbar_add_widget (GdMainToolbar *self,
+                            GtkWidget *widget,
+                            gboolean pack_start)
+{
   if (pack_start)
-    gtk_container_add (GTK_CONTAINER (self->priv->left_grid), button);
+    gtk_container_add (GTK_CONTAINER (self->priv->left_grid), widget);
   else
-    gtk_container_add (GTK_CONTAINER (self->priv->right_grid), button);    
-
-  gtk_widget_show_all (button);
-
-  return button;
+    gtk_container_add (GTK_CONTAINER (self->priv->right_grid), widget);
 }
 
diff -upr mate-control-center/font-viewer/gd-main-toolbar.h mate-control-center-test/font-viewer/gd-main-toolbar.h
--- mate-control-center/font-viewer/gd-main-toolbar.h	2015-08-30 21:29:26.610488909 +0200
+++ mate-control-center-test/font-viewer/gd-main-toolbar.h	2015-08-30 20:35:45.001854000 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 Red Hat, Inc.
+ * Copyright (c) 2011, 2012 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by 
@@ -74,6 +74,12 @@ void        gd_main_toolbar_set_labels (
                                         const gchar *primary,
                                         const gchar *detail);
 
+void        gd_main_toolbar_set_labels_menu (GdMainToolbar *self,
+                                             GMenuModel    *menu);
+
+GtkWidget * gd_main_toolbar_add_mode (GdMainToolbar *self,
+                                      const gchar *label);
+
 void        gd_main_toolbar_clear (GdMainToolbar *self);
 
 GtkWidget * gd_main_toolbar_add_button (GdMainToolbar *self,
@@ -81,6 +87,25 @@ GtkWidget * gd_main_toolbar_add_button (
                                         const gchar *label,
                                         gboolean pack_start);
 
+GtkWidget * gd_main_toolbar_add_toggle (GdMainToolbar *self,
+                                        const gchar *icon_name,
+                                        const gchar *label,
+                                        gboolean pack_start);
+
+GtkWidget * gd_main_toolbar_add_menu (GdMainToolbar *self,
+                                      const gchar *icon_name,
+                                      const gchar *label,
+                                      gboolean pack_start);
+
+void        gd_main_toolbar_add_widget (GdMainToolbar *self,
+                                        GtkWidget *widget,
+                                        gboolean pack_start);
+
+gboolean    gd_main_toolbar_get_show_modes (GdMainToolbar *self);
+
+void        gd_main_toolbar_set_show_modes (GdMainToolbar *self,
+                                            gboolean show_modes);
+
 G_END_DECLS
 
 #endif /* __GD_MAIN_TOOLBAR_H__ */
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin