From b531c560bb046c359598a07a08cfaeaa973090c2 Mon Sep 17 00:00:00 2001 From: Krzysztof Klimonda Date: Sat, 20 Mar 2010 00:55:03 +0100 Subject: Fix the missing icon on theme change if old icon has different name Some applications (like Transmission) use different icon name for Notification Area to display monochrome icon. To make sure that the icon we display exists after user changes theme use indicator_image_helper () from libindicator to keep track of the icon. --- src/libappindicator/app-indicator.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index 1dce0a0..2e6d8d1 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -35,6 +35,8 @@ License version 3 and version 2.1 along with this program. If not, see #include #include +#include + #include "libappindicator/app-indicator.h" #include "libappindicator/app-indicator-enum-types.h" @@ -812,6 +814,13 @@ fallback_timer_expire (gpointer data) return FALSE; } +/* emit a NEW_ICON signal in response for the theme change */ +static void +theme_changed_cb (GtkIconTheme * theme, gpointer user_data) +{ + g_signal_emit (user_data, signals[NEW_ICON], 0, TRUE); +} + /* Creates a StatusIcon that can be used when the application indicator area isn't available. */ static GtkStatusIcon * @@ -827,6 +836,8 @@ fallback (AppIndicator * self) G_CALLBACK(status_icon_changes), icon); g_signal_connect(G_OBJECT(self), APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, G_CALLBACK(status_icon_changes), icon); + g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), + "changed", G_CALLBACK(theme_changed_cb), self); status_icon_changes(self, icon); @@ -849,22 +860,26 @@ static void status_icon_changes (AppIndicator * self, gpointer data) { GtkStatusIcon * icon = GTK_STATUS_ICON(data); + GtkImage *image = indicator_image_helper (self->priv->icon_name); switch (app_indicator_get_status(self)) { case APP_INDICATOR_STATUS_PASSIVE: gtk_status_icon_set_visible(icon, FALSE); - gtk_status_icon_set_from_icon_name(icon, app_indicator_get_icon(self)); + gtk_status_icon_set_from_pixbuf(icon, gtk_image_get_pixbuf (image)); break; case APP_INDICATOR_STATUS_ACTIVE: - gtk_status_icon_set_from_icon_name(icon, app_indicator_get_icon(self)); + gtk_status_icon_set_from_pixbuf(icon, gtk_image_get_pixbuf (image)); gtk_status_icon_set_visible(icon, TRUE); break; case APP_INDICATOR_STATUS_ATTENTION: - gtk_status_icon_set_from_icon_name(icon, app_indicator_get_attention_icon(self)); + gtk_status_icon_set_from_pixbuf(icon, gtk_image_get_pixbuf (image)); gtk_status_icon_set_visible(icon, TRUE); break; }; + g_object_ref_sink (image); + g_object_unref (image); + return; } -- cgit v1.2.3