[gnome-panel] status-notifier: respect the menu-icon-size setting



commit 223143c53e2c3e1335a2d425632e7f55b68b08c5
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Tue Jan 30 23:45:10 2018 +0200

    status-notifier: respect the menu-icon-size setting

 modules/status-notifier/sn-dbus-menu-item.c |   40 ++++++++++++++++++++++-----
 modules/status-notifier/sn-dbus-menu-item.h |    8 +++++-
 modules/status-notifier/sn-dbus-menu.c      |   23 ++++++++++++++-
 modules/status-notifier/sn-dbus-menu.h      |    4 ++-
 modules/status-notifier/sn-item.c           |    2 +-
 5 files changed, 65 insertions(+), 12 deletions(-)
---
diff --git a/modules/status-notifier/sn-dbus-menu-item.c b/modules/status-notifier/sn-dbus-menu-item.c
index 8bbed4f..95a3ab9 100644
--- a/modules/status-notifier/sn-dbus-menu-item.c
+++ b/modules/status-notifier/sn-dbus-menu-item.c
@@ -23,14 +23,15 @@
 
 static void
 set_image_from_icon_name (GpImageMenuItem *item,
-                          const gchar     *icon_name)
+                          const gchar     *icon_name,
+                          guint            icon_size)
 {
   GtkWidget *image;
 
   image = gtk_image_new ();
 
   gtk_image_set_from_icon_name (GTK_IMAGE (image), icon_name, GTK_ICON_SIZE_MENU);
-  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
+  gtk_image_set_pixel_size (GTK_IMAGE (image), icon_size);
 
   gp_image_menu_item_set_image (item, image);
 }
@@ -61,14 +62,15 @@ get_pixbuf_at_size (GdkPixbuf *pixbuf,
 
 static void
 set_image_from_pixbuf (GpImageMenuItem *item,
-                       GdkPixbuf       *pixbuf)
+                       GdkPixbuf       *pixbuf,
+                       guint            icon_size)
 {
   GtkWidget *image;
   GdkPixbuf *tmp;
 
   image = gtk_image_new ();
 
-  tmp = get_pixbuf_at_size (pixbuf, 16);
+  tmp = get_pixbuf_at_size (pixbuf, icon_size);
   gtk_image_set_from_pixbuf (GTK_IMAGE (image), tmp);
   g_object_unref (tmp);
 
@@ -79,16 +81,18 @@ static void
 update_icon (SnDBusMenuItem *item)
 {
   GpImageMenuItem *menu_item;
+  guint icon_size;
 
   if (!GP_IS_IMAGE_MENU_ITEM (item->item))
     return;
 
   menu_item = GP_IMAGE_MENU_ITEM (item->item);
+  icon_size = gp_applet_get_menu_icon_size (GP_APPLET (item->applet));
 
   if (item->icon_name)
-    set_image_from_icon_name (menu_item, item->icon_name);
+    set_image_from_icon_name (menu_item, item->icon_name, icon_size);
   else if (item->icon_data)
-    set_image_from_pixbuf (menu_item, item->icon_data);
+    set_image_from_pixbuf (menu_item, item->icon_data, icon_size);
   else
     gp_image_menu_item_set_image (menu_item, NULL);
 }
@@ -195,8 +199,17 @@ sn_shortcuts_free (SnShortcut **shortcuts)
   g_free (shortcuts);
 }
 
+static void
+menu_icon_size_cb (GpApplet       *applet,
+                   GParamSpec     *pspec,
+                   SnDBusMenuItem *item)
+{
+  update_icon (item);
+}
+
 SnDBusMenuItem *
-sn_dbus_menu_item_new (GVariant *props)
+sn_dbus_menu_item_new (SnApplet *applet,
+                       GVariant *props)
 {
   SnDBusMenuItem *item;
   GVariantIter iter;
@@ -205,6 +218,8 @@ sn_dbus_menu_item_new (GVariant *props)
 
   item = g_new0 (SnDBusMenuItem, 1);
 
+  item->applet = applet;
+
   item->enabled = TRUE;
   item->toggle_state = -1;
   item->visible = TRUE;
@@ -268,6 +283,11 @@ sn_dbus_menu_item_new (GVariant *props)
         {
           item->item = gp_image_menu_item_new ();
 
+          item->menu_icon_size_id = g_signal_connect (item->applet,
+                                                      "notify::menu-icon-size",
+                                                      G_CALLBACK (menu_icon_size_cb),
+                                                      item);
+
           update_icon (item);
         }
 
@@ -323,6 +343,12 @@ sn_dubs_menu_item_free (gpointer data)
   if (item == NULL)
     return;
 
+  if (item->menu_icon_size_id != 0)
+    {
+      g_signal_handler_disconnect (item->applet, item->menu_icon_size_id);
+      item->menu_icon_size_id = 0;
+    }
+
   g_clear_pointer (&item->accessible_desc, g_free);
   g_clear_pointer (&item->children_display, g_free);
   g_clear_pointer (&item->disposition, g_free);
diff --git a/modules/status-notifier/sn-dbus-menu-item.h b/modules/status-notifier/sn-dbus-menu-item.h
index c89de5c..b943ff3 100644
--- a/modules/status-notifier/sn-dbus-menu-item.h
+++ b/modules/status-notifier/sn-dbus-menu-item.h
@@ -19,6 +19,7 @@
 #define SN_DUBS_MENU_ITEM_H
 
 #include <gtk/gtk.h>
+#include "sn-applet.h"
 
 G_BEGIN_DECLS
 
@@ -30,6 +31,8 @@ typedef struct
 
 typedef struct
 {
+  SnApplet    *applet;
+
   gchar       *accessible_desc;
   gchar       *children_display;
   gchar       *disposition;
@@ -47,9 +50,12 @@ typedef struct
   GtkMenu     *submenu;
 
   gulong       activate_id;
+
+  gulong       menu_icon_size_id;
 } SnDBusMenuItem;
 
-SnDBusMenuItem *sn_dbus_menu_item_new          (GVariant       *props);
+SnDBusMenuItem *sn_dbus_menu_item_new          (SnApplet       *applet,
+                                                GVariant       *props);
 
 void            sn_dubs_menu_item_free         (gpointer        data);
 
diff --git a/modules/status-notifier/sn-dbus-menu.c b/modules/status-notifier/sn-dbus-menu.c
index 4f28f49..2d7e567 100644
--- a/modules/status-notifier/sn-dbus-menu.c
+++ b/modules/status-notifier/sn-dbus-menu.c
@@ -25,6 +25,8 @@ struct _SnDBusMenu
 {
   GtkMenu        parent;
 
+  SnApplet      *applet;
+
   GHashTable    *items;
 
   GCancellable  *cancellable;
@@ -40,6 +42,8 @@ enum
 {
   PROP_0,
 
+  PROP_APPLET,
+
   PROP_BUS_NAME,
   PROP_OBJECT_PATH,
 
@@ -97,7 +101,7 @@ layout_update_item (SnDBusMenu *menu,
 
   if (item == NULL)
     {
-      item = sn_dbus_menu_item_new (props);
+      item = sn_dbus_menu_item_new (menu->applet, props);
 
       g_object_set_data (G_OBJECT (item->item), "item-id", GUINT_TO_POINTER (id));
       gtk_menu_shell_append (GTK_MENU_SHELL (gtk_menu), item->item);
@@ -378,6 +382,8 @@ sn_dbus_menu_dispose (GObject *object)
 
   menu = SN_DBUS_MENU (object);
 
+  menu->applet = NULL;
+
   if (menu->name_id > 0)
     {
       g_bus_unwatch_name (menu->name_id);
@@ -418,6 +424,11 @@ sn_dbus_menu_set_property (GObject      *object,
 
   switch (property_id)
     {
+      case PROP_APPLET:
+        g_assert (menu->applet == NULL);
+        menu->applet = g_value_get_object (value);
+        break;
+
       case PROP_BUS_NAME:
         menu->bus_name = g_value_dup_string (value);
         break;
@@ -435,6 +446,12 @@ sn_dbus_menu_set_property (GObject      *object,
 static void
 install_properties (GObjectClass *object_class)
 {
+  properties[PROP_APPLET] =
+    g_param_spec_object ("applet", "Applet", "Applet",
+                         SN_TYPE_APPLET,
+                         G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE |
+                         G_PARAM_STATIC_STRINGS);
+
   properties[PROP_BUS_NAME] =
     g_param_spec_string ("bus-name", "bus-name", "bus-name", NULL,
                          G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE |
@@ -471,10 +488,12 @@ sn_dbus_menu_init (SnDBusMenu *menu)
 }
 
 GtkMenu *
-sn_dbus_menu_new (const gchar *bus_name,
+sn_dbus_menu_new (SnApplet    *applet,
+                  const gchar *bus_name,
                   const gchar *object_path)
 {
   return g_object_new (SN_TYPE_DBUS_MENU,
+                       "applet", applet,
                        "bus-name", bus_name,
                        "object-path", object_path,
                        NULL);
diff --git a/modules/status-notifier/sn-dbus-menu.h b/modules/status-notifier/sn-dbus-menu.h
index 39907d0..4c40768 100644
--- a/modules/status-notifier/sn-dbus-menu.h
+++ b/modules/status-notifier/sn-dbus-menu.h
@@ -19,13 +19,15 @@
 #define SN_DBUS_MENU_H
 
 #include <gtk/gtk.h>
+#include "sn-applet.h"
 
 G_BEGIN_DECLS
 
 #define SN_TYPE_DBUS_MENU sn_dbus_menu_get_type ()
 G_DECLARE_FINAL_TYPE (SnDBusMenu, sn_dbus_menu, SN, DBUS_MENU, GtkMenu)
 
-GtkMenu *sn_dbus_menu_new (const gchar *bus_name,
+GtkMenu *sn_dbus_menu_new (SnApplet    *applet,
+                           const gchar *bus_name,
                            const gchar *object_path);
 
 G_END_DECLS
diff --git a/modules/status-notifier/sn-item.c b/modules/status-notifier/sn-item.c
index a5254e9..eb1ae29 100644
--- a/modules/status-notifier/sn-item.c
+++ b/modules/status-notifier/sn-item.c
@@ -248,7 +248,7 @@ sn_item_ready (SnItem *item)
     return;
 
   priv = sn_item_get_instance_private (item);
-  priv->menu = sn_dbus_menu_new (priv->bus_name, menu);
+  priv->menu = sn_dbus_menu_new (priv->applet, priv->bus_name, menu);
   g_object_ref_sink (priv->menu);
 }
 


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