diff options
Diffstat (limited to 'applets/notification_area/status-notifier')
7 files changed, 100 insertions, 44 deletions
diff --git a/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml b/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml index 609d3050..c7aa0ebd 100644 --- a/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml +++ b/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml @@ -69,12 +69,20 @@ <property name="IconThemePath" type="s" access="read" /> + <property name="ItemIsMenu" type="b" access="read" /> + <property name="Menu" type="o" access="read" /> - <property name="ItemIsMenu" type="b" access="read" /> + <property name="XAyatanaLabel" type="s" access="read" /> <signal name="NewIconThemePath"> <arg name="icon_theme_path" type="s" /> </signal> + + <signal name="XAyatanaNewLabel"> + <arg name="label" type="s" /> + <arg name="guide" type="s" /> + </signal> + </interface> </node> diff --git a/applets/notification_area/status-notifier/sn-dbus-menu-item.c b/applets/notification_area/status-notifier/sn-dbus-menu-item.c index 62f21ca7..07d1957e 100644 --- a/applets/notification_area/status-notifier/sn-dbus-menu-item.c +++ b/applets/notification_area/status-notifier/sn-dbus-menu-item.c @@ -16,11 +16,12 @@ */ #include <config.h> +#include <libmate-desktop/mate-image-menu-item.h> #include "sn-dbus-menu-item.h" static GdkPixbuf * -pxibuf_new (GVariant *variant) +pixbuf_new (GVariant *variant) { gsize length; const guchar *data; @@ -149,7 +150,7 @@ sn_dbus_menu_item_new (GVariant *props) else if (g_strcmp0 (prop, "icon-name") == 0) item->icon_name = g_variant_dup_string (value, NULL); else if (g_strcmp0 (prop, "icon-data") == 0) - item->icon_data = pxibuf_new (value); + item->icon_data = pixbuf_new (value); else if (g_strcmp0 (prop, "label") == 0) item->label = g_variant_dup_string (value, NULL); else if (g_strcmp0 (prop, "shortcut") == 0) @@ -203,8 +204,8 @@ sn_dbus_menu_item_new (GVariant *props) cairo_surface_destroy (surface); } - item->item = gtk_image_menu_item_new (); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + item->item = mate_image_menu_item_new (); + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), image); } @@ -252,7 +253,7 @@ sn_dbus_menu_item_new (GVariant *props) } void -sn_dubs_menu_item_free (gpointer data) +sn_dbus_menu_item_free (gpointer data) { SnDBusMenuItem *item; @@ -325,7 +326,7 @@ sn_dbus_menu_item_update_props (SnDBusMenuItem *item, image = NULL; } - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), image); } else if (g_strcmp0 (prop, "icon-data") == 0) @@ -333,7 +334,7 @@ sn_dbus_menu_item_update_props (SnDBusMenuItem *item, GtkWidget *image; g_clear_object (&item->icon_data); - item->icon_data = pxibuf_new (value); + item->icon_data = pixbuf_new (value); if (item->icon_data) { @@ -347,7 +348,7 @@ sn_dbus_menu_item_update_props (SnDBusMenuItem *item, image = NULL; } - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), image); } else if (g_strcmp0 (prop, "label") == 0) @@ -437,18 +438,18 @@ sn_dbus_menu_item_remove_props (SnDBusMenuItem *item, else if (g_strcmp0 (prop, "icon-name") == 0) { g_clear_pointer (&item->icon_name, g_free); - if (GTK_IS_IMAGE_MENU_ITEM (item->item)) + if (MATE_IS_IMAGE_MENU_ITEM (item->item)) { - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), NULL); } } else if (g_strcmp0 (prop, "icon-data") == 0) { g_clear_object (&item->icon_data); - if (GTK_IS_IMAGE_MENU_ITEM (item->item)) + if (MATE_IS_IMAGE_MENU_ITEM (item->item)) { - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), NULL); } } diff --git a/applets/notification_area/status-notifier/sn-dbus-menu-item.h b/applets/notification_area/status-notifier/sn-dbus-menu-item.h index c89de5c3..458417f2 100644 --- a/applets/notification_area/status-notifier/sn-dbus-menu-item.h +++ b/applets/notification_area/status-notifier/sn-dbus-menu-item.h @@ -16,7 +16,7 @@ */ #ifndef SN_DBUS_MENU_ITEM_H -#define SN_DUBS_MENU_ITEM_H +#define SN_DBUS_MENU_ITEM_H #include <gtk/gtk.h> @@ -51,7 +51,7 @@ typedef struct SnDBusMenuItem *sn_dbus_menu_item_new (GVariant *props); -void sn_dubs_menu_item_free (gpointer data); +void sn_dbus_menu_item_free (gpointer data); void sn_dbus_menu_item_update_props (SnDBusMenuItem *item, GVariant *props); diff --git a/applets/notification_area/status-notifier/sn-dbus-menu.c b/applets/notification_area/status-notifier/sn-dbus-menu.c index 03a95a4b..7b25c63f 100644 --- a/applets/notification_area/status-notifier/sn-dbus-menu.c +++ b/applets/notification_area/status-notifier/sn-dbus-menu.c @@ -419,8 +419,8 @@ sn_dbus_menu_finalize (GObject *object) menu = SN_DBUS_MENU (object); - g_free (menu->bus_name); - g_free (menu->object_path); + g_clear_pointer (&menu->bus_name, g_free); + g_clear_pointer (&menu->object_path, g_free); G_OBJECT_CLASS (sn_dbus_menu_parent_class)->finalize (object); } @@ -485,7 +485,7 @@ sn_dbus_menu_class_init (SnDBusMenuClass *menu_class) static void sn_dbus_menu_init (SnDBusMenu *menu) { - menu->items = g_hash_table_new_full (NULL, NULL, NULL, sn_dubs_menu_item_free); + menu->items = g_hash_table_new_full (NULL, NULL, NULL, sn_dbus_menu_item_free); menu->cancellable = g_cancellable_new (); } diff --git a/applets/notification_area/status-notifier/sn-host-v0.c b/applets/notification_area/status-notifier/sn-host-v0.c index 64da5da9..4ad6b359 100644 --- a/applets/notification_area/status-notifier/sn-host-v0.c +++ b/applets/notification_area/status-notifier/sn-host-v0.c @@ -193,7 +193,6 @@ register_host_cb (GObject *source_object, GError *error; SnHostV0 *v0; gchar **items; - gint i; error = NULL; sn_watcher_v0_gen_call_register_host_finish (SN_WATCHER_V0_GEN (source_object), @@ -224,7 +223,7 @@ register_host_cb (GObject *source_object, items = sn_watcher_v0_gen_dup_registered_items (v0->watcher); if (items) { - for (i = 0; items[i] != NULL; i++) + for (gint i = 0; items[i] != NULL; i++) add_registered_item (v0, items[i]); } diff --git a/applets/notification_area/status-notifier/sn-item-v0.c b/applets/notification_area/status-notifier/sn-item-v0.c index d218abad..9e66f361 100644 --- a/applets/notification_area/status-notifier/sn-item-v0.c +++ b/applets/notification_area/status-notifier/sn-item-v0.c @@ -59,6 +59,7 @@ struct _SnItemV0 gchar *title; gint32 window_id; gchar *icon_name; + gchar *label; SnIconPixmap **icon_pixmap; gchar *overlay_icon_name; SnIconPixmap **overlay_icon_pixmap; @@ -83,7 +84,7 @@ enum LAST_PROP }; -static GParamSpec *properties[LAST_PROP] = { NULL }; +static GParamSpec *obj_properties[LAST_PROP] = { NULL }; G_DEFINE_TYPE (SnItemV0, sn_item_v0, SN_TYPE_ITEM) @@ -155,7 +156,7 @@ compare_size (gconstpointer a, } static cairo_surface_t * -get_surface (SnItemV0 *v0, +get_surface (SnIconPixmap **icon_pixmap, GtkOrientation orientation, gint size) { @@ -164,10 +165,10 @@ get_surface (SnItemV0 *v0, SnIconPixmap *pixmap = NULL; GList *l; - g_assert (v0->icon_pixmap != NULL && v0->icon_pixmap[0] != NULL); + g_assert (icon_pixmap != NULL && icon_pixmap[0] != NULL); - for (i = 0; v0->icon_pixmap[i] != NULL; i++) - pixmaps = g_list_prepend (pixmaps, v0->icon_pixmap[i]); + for (i = 0; icon_pixmap[i] != NULL; i++) + pixmaps = g_list_prepend (pixmaps, icon_pixmap[i]); pixmaps = g_list_sort_with_data (pixmaps, compare_size, GUINT_TO_POINTER (orientation)); @@ -233,6 +234,9 @@ get_icon_by_name (const gchar *icon_name, NULL, GTK_ICON_LOOKUP_FORCE_SIZE, NULL); } +#define ICON_NAME_VALID(icon_name) (icon_name && icon_name[0] != '\0') +#define ICON_PIXMAP_VALID(icon_pixmap) (icon_pixmap && icon_pixmap[0] != NULL) + static void update (SnItemV0 *v0) { @@ -240,7 +244,9 @@ update (SnItemV0 *v0) GtkImage *image; SnTooltip *tip; gint icon_size; - gboolean visible; + const gchar *icon_name; + SnIconPixmap **icon_pixmap; + g_return_if_fail (SN_IS_ITEM_V0 (v0)); image = GTK_IMAGE (v0->image); @@ -250,23 +256,43 @@ update (SnItemV0 *v0) else icon_size = MAX (1, v0->effective_icon_size); - if (v0->icon_name != NULL && v0->icon_name[0] != '\0') + /* If the item requests attention and has a specific icon for it, use that + * instead of the default icon. */ + if (g_strcmp0 (v0->status, "NeedsAttention") == 0 && + (ICON_NAME_VALID (v0->attention_icon_name) || + ICON_PIXMAP_VALID (v0->attention_icon_pixmap))) + { + icon_name = v0->attention_icon_name; + icon_pixmap = v0->attention_icon_pixmap; + } + else + { + icon_name = v0->icon_name; + icon_pixmap = v0->icon_pixmap; + } + + if (ICON_NAME_VALID (icon_name)) { cairo_surface_t *surface; gint scale; scale = gtk_widget_get_scale_factor (GTK_WIDGET (image)); - surface = get_icon_by_name (v0->icon_name, icon_size, scale); + surface = get_icon_by_name (icon_name, icon_size, scale); if (!surface) { GdkPixbuf *pixbuf; /*try to find icons specified by path and filename*/ - pixbuf = gdk_pixbuf_new_from_file (v0->icon_name, NULL); + pixbuf = gdk_pixbuf_new_from_file (icon_name, NULL); if (pixbuf && icon_size > 1) { /*An icon specified by path and filename may be the wrong size for the tray */ - pixbuf = gdk_pixbuf_scale_simple (pixbuf, icon_size-2, icon_size-2, GDK_INTERP_BILINEAR); + GdkPixbuf *scaled_pixbuf; + + scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, icon_size-2, icon_size-2, GDK_INTERP_BILINEAR); + g_object_unref (pixbuf); + pixbuf = scaled_pixbuf; + surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale, NULL); } if (pixbuf) @@ -280,11 +306,11 @@ update (SnItemV0 *v0) gtk_image_set_from_surface (image, surface); cairo_surface_destroy (surface); } - else if (v0->icon_pixmap != NULL && v0->icon_pixmap[0] != NULL) + else if (ICON_PIXMAP_VALID (icon_pixmap)) { cairo_surface_t *surface; - surface = get_surface (v0, + surface = get_surface (icon_pixmap, gtk_orientable_get_orientation (GTK_ORIENTABLE (v0)), icon_size); if (surface != NULL) @@ -329,6 +355,7 @@ update (SnItemV0 *v0) gtk_widget_set_tooltip_markup (GTK_WIDGET (v0), NULL); } + gtk_button_set_label (GTK_BUTTON (v0), v0->label); accessible = gtk_widget_get_accessible (GTK_WIDGET (v0)); if (v0->title != NULL && *v0->title != '\0') @@ -339,7 +366,7 @@ update (SnItemV0 *v0) /* TODO: hide "Passive" items with a setting? */ /*Special case mate-polkit*/ if (g_strcmp0 (v0->status, "password-dialog") != 0){ - visible = g_strcmp0 (v0->status, "Passive") != 0; + gboolean visible = g_strcmp0 (v0->status, "Passive") != 0; gtk_widget_set_visible (GTK_WIDGET (v0), visible); } else @@ -638,7 +665,7 @@ update_title (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->title, g_free); + g_free (v0->title); v0->title = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -666,7 +693,7 @@ update_icon_name (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->icon_name, g_free); + g_free (v0->icon_name); v0->icon_name = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -717,7 +744,7 @@ update_overlay_icon_name (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->overlay_icon_name, g_free); + g_free (v0->overlay_icon_name); v0->overlay_icon_name = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -768,7 +795,7 @@ update_attention_icon_name (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->attention_icon_name, g_free); + g_free (v0->attention_icon_name); v0->attention_icon_name = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -790,7 +817,7 @@ update_attention_icon_pixmap (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->attention_icon_pixmap, icon_pixmap_free); + icon_pixmap_free (v0->attention_icon_pixmap); v0->attention_icon_pixmap = icon_pixmap_new (variant); g_clear_pointer (&variant, g_variant_unref); @@ -819,7 +846,7 @@ update_tooltip (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->tooltip, sn_tooltip_free); + sn_tooltip_free (v0->tooltip); v0->tooltip = sn_tooltip_new (variant); g_clear_pointer (&variant, g_variant_unref); @@ -848,6 +875,21 @@ new_status_cb (SnItemV0 *v0, } static void +new_label_cb (SnItemV0 *v0, + GVariant *parameters) +{ + GVariant *variant; + + variant = g_variant_get_child_value (parameters, 0); + + g_free (v0->label); + v0->label = g_variant_dup_string (variant, NULL); + g_variant_unref (variant); + + queue_update (v0); +} + +static void new_icon_theme_path_cb (SnItemV0 *v0, GVariant *parameters) { @@ -905,6 +947,8 @@ g_signal_cb (GDBusProxy *proxy, new_status_cb (v0, parameters); else if (g_strcmp0 (signal_name, "NewIconThemePath") == 0) new_icon_theme_path_cb (v0, parameters); + else if (g_strcmp0 (signal_name, "XAyatanaNewLabel") == 0) + new_label_cb (v0, parameters); else g_debug ("signal '%s' not handled!", signal_name); } @@ -975,6 +1019,8 @@ get_all_cb (GObject *source_object, v0->menu = g_variant_dup_string (value, NULL); else if (g_strcmp0 (key, "ItemIsMenu") == 0) v0->item_is_menu = g_variant_get_boolean (value); + else if (g_strcmp0 (key, "XAyatanaLabel") == 0) + v0->label = g_variant_dup_string (value, NULL); else g_debug ("property '%s' not handled!", key); @@ -1111,6 +1157,7 @@ sn_item_v0_finalize (GObject *object) g_clear_pointer (&v0->title, g_free); g_clear_pointer (&v0->icon_name, g_free); + g_clear_pointer (&v0->label, g_free); g_clear_pointer (&v0->icon_pixmap, icon_pixmap_free); g_clear_pointer (&v0->overlay_icon_name, g_free); g_clear_pointer (&v0->overlay_icon_pixmap, icon_pixmap_free); @@ -1345,15 +1392,15 @@ sn_item_v0_set_property (GObject *object, static void install_properties (GObjectClass *object_class) { - properties[PROP_ICON_SIZE] = + obj_properties[PROP_ICON_SIZE] = g_param_spec_int ("icon-size", "Icon size", "Icon size", 0, G_MAXINT, 16, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - properties[PROP_ICON_PADDING] = + obj_properties[PROP_ICON_PADDING] = g_param_spec_int ("icon-padding", "Icon padding", "Icon padding", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - g_object_class_install_properties (object_class, LAST_PROP, properties); + g_object_class_install_properties (object_class, LAST_PROP, obj_properties); } static void @@ -1395,7 +1442,7 @@ sn_item_v0_init (SnItemV0 *v0) v0->icon_size = 16; v0->effective_icon_size = 0; v0->image = gtk_image_new (); - gtk_container_add (GTK_CONTAINER (v0), v0->image); + gtk_button_set_image (GTK_BUTTON (v0), v0->image); gtk_widget_show (v0->image); } @@ -1465,7 +1512,7 @@ sn_item_v0_set_icon_size (SnItemV0 *v0, if (v0->icon_size != size) { v0->icon_size = size; - g_object_notify_by_pspec (G_OBJECT (v0), properties[PROP_ICON_SIZE]); + g_object_notify_by_pspec (G_OBJECT (v0), obj_properties[PROP_ICON_SIZE]); if (v0->id != NULL) queue_update (v0); diff --git a/applets/notification_area/status-notifier/sn-item.c b/applets/notification_area/status-notifier/sn-item.c index 3dd0d605..9677e67e 100644 --- a/applets/notification_area/status-notifier/sn-item.c +++ b/applets/notification_area/status-notifier/sn-item.c @@ -358,6 +358,7 @@ sn_item_ready (SnItem *item) priv = SN_ITEM (item)->priv; priv->menu = sn_dbus_menu_new (priv->bus_name, menu); g_object_ref_sink (priv->menu); + gtk_button_set_always_show_image (GTK_BUTTON (item),TRUE); } static const gchar * |