aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrzysztof Klimonda <kklimonda@laptop>2010-03-20 00:55:03 +0100
committerKrzysztof Klimonda <kklimonda@laptop>2010-03-20 00:55:03 +0100
commitb531c560bb046c359598a07a08cfaeaa973090c2 (patch)
tree73569c47d0b989c5ad1da500e301a33bc3800aa5
parent65febbd636ebe580a34a7e59b083e6210fbadee5 (diff)
downloadayatana-indicator-application-b531c560bb046c359598a07a08cfaeaa973090c2.tar.gz
ayatana-indicator-application-b531c560bb046c359598a07a08cfaeaa973090c2.tar.bz2
ayatana-indicator-application-b531c560bb046c359598a07a08cfaeaa973090c2.zip
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.
-rw-r--r--src/libappindicator/app-indicator.c21
1 files 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 <libdbusmenu-glib/server.h>
#include <libdbusmenu-gtk/client.h>
+#include <libindicator/indicator-image-helper.h>
+
#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;
}