diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.in | 2 | ||||
-rw-r--r-- | src/app-indicator.c | 164 | ||||
-rw-r--r-- | src/app-indicator.h | 3 | ||||
-rw-r--r-- | src/appindicator3-0.1.pc.in | 2 | ||||
-rw-r--r-- | src/application-service-marshal.c | 2 | ||||
-rw-r--r-- | src/gen-notification-item.xml.c | 3 | ||||
-rw-r--r-- | src/notification-item.xml | 3 |
7 files changed, 164 insertions, 15 deletions
diff --git a/src/Makefile.in b/src/Makefile.in index 18baa3d..ac56485 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -268,6 +268,8 @@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@ MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@ +MONO_NUNIT_CFLAGS = @MONO_NUNIT_CFLAGS@ +MONO_NUNIT_LIBS = @MONO_NUNIT_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ diff --git a/src/app-indicator.c b/src/app-indicator.c index c2f0f69..6c693e8 100644 --- a/src/app-indicator.c +++ b/src/app-indicator.c @@ -78,6 +78,7 @@ struct _AppIndicatorPrivate { GtkWidget *sec_activate_target; gboolean sec_activate_enabled; guint32 ordering_index; + gchar * title; gchar * label; gchar * label_guide; gchar * accessible_desc; @@ -127,7 +128,8 @@ enum { PROP_LABEL, PROP_LABEL_GUIDE, PROP_ORDERING_INDEX, - PROP_DBUS_MENU_SERVER + PROP_DBUS_MENU_SERVER, + PROP_TITLE }; /* The strings so that they can be slowly looked up. */ @@ -144,6 +146,7 @@ enum { #define PROP_LABEL_GUIDE_S "label-guide" #define PROP_ORDERING_INDEX_S "ordering-index" #define PROP_DBUS_MENU_SERVER_S "dbus-menu-server" +#define PROP_TITLE_S "title" /* Private macro, shhhh! */ #define APP_INDICATOR_GET_PRIVATE(o) \ @@ -251,7 +254,7 @@ app_indicator_class_init (AppIndicatorClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); /** - * AppIndicator: + * AppIndicator:status: * * Whether the indicator is shown or requests attention. Defaults to * 'Passive'. @@ -410,6 +413,21 @@ app_indicator_class_init (AppIndicatorClass *klass) "DBusmenu server which is available for testing the application indicators.", DBUSMENU_TYPE_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * AppIndicator:title: + * + * Provides a way to refer to this application indicator in a human + * readable form. This is used in the Unity desktop in the HUD as + * the first part of the menu entries to distinguish them from the + * focused application's entries. + */ + g_object_class_install_property(object_class, + PROP_TITLE, + g_param_spec_string (PROP_TITLE_S, + "Title of the application indicator", + "A human readable way to refer to this application indicator in the UI.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* Signals */ @@ -575,6 +593,7 @@ app_indicator_init (AppIndicator *self) priv->menu = NULL; priv->menuservice = NULL; priv->ordering_index = 0; + priv->title = NULL; priv->label = NULL; priv->label_guide = NULL; priv->label_change_idle = 0; @@ -716,6 +735,11 @@ app_indicator_finalize (GObject *object) priv->icon_theme_path = NULL; } + if (priv->title != NULL) { + g_free(priv->title); + priv->title = NULL; + } + if (priv->label != NULL) { g_free(priv->label); priv->label = NULL; @@ -830,20 +854,51 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu gchar * oldlabel = priv->label; priv->label = g_value_dup_string(value); - if (g_strcmp0(oldlabel, priv->label) != 0) { - signal_label_change(APP_INDICATOR(object)); - } - if (priv->label != NULL && priv->label[0] == '\0') { g_free(priv->label); priv->label = NULL; } + if (g_strcmp0(oldlabel, priv->label) != 0) { + signal_label_change(APP_INDICATOR(object)); + } + if (oldlabel != NULL) { g_free(oldlabel); } break; } + case PROP_TITLE: { + gchar * oldtitle = priv->title; + priv->title = g_value_dup_string(value); + + if (priv->title != NULL && priv->title[0] == '\0') { + g_free(priv->title); + priv->title = NULL; + } + + if (g_strcmp0(oldtitle, priv->title) != 0 && self->priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(self->priv->connection, + NULL, + self->priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "NewTitle", + NULL, + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewTitle: %s", error->message); + g_error_free(error); + } + } + + if (oldtitle != NULL) { + g_free(oldtitle); + } + break; + } case PROP_LABEL_GUIDE: { gchar * oldguide = priv->label_guide; priv->label_guide = g_value_dup_string(value); @@ -956,6 +1011,10 @@ app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GPa g_value_set_object(value, priv->menuservice); break; + case PROP_TITLE: + g_value_set_string(value, priv->title); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1062,6 +1121,8 @@ bus_get_prop (GDBusConnection * connection, const gchar * sender, const gchar * return g_variant_new_string(priv->icon_name ? priv->icon_name : ""); } else if (g_strcmp0(property, "AttentionIconName") == 0) { return g_variant_new_string(priv->attention_icon_name ? priv->attention_icon_name : ""); + } else if (g_strcmp0(property, "Title") == 0) { + return g_variant_new_string(priv->title ? priv->title : ""); } else if (g_strcmp0(property, "IconThemePath") == 0) { return g_variant_new_string(priv->icon_theme_path ? priv->icon_theme_path : ""); } else if (g_strcmp0(property, "Menu") == 0) { @@ -1523,20 +1584,52 @@ status_icon_changes (AppIndicator * self, gpointer data) GtkStatusIcon * icon = GTK_STATUS_ICON(data); gchar *longname = NULL; + /* add the icon_theme_path once if needed */ + GtkIconTheme *icon_theme = gtk_icon_theme_get_default(); + if (self->priv->icon_theme_path != NULL) + { + gchar **path; + gint n_elements, i; + gboolean found=FALSE; + gtk_icon_theme_get_search_path(icon_theme, &path, &n_elements); + for (i=0; i< n_elements || path[i] == NULL; i++) + { + if(g_strcmp0(path[i], self->priv->icon_theme_path) == 0) + { + found=TRUE; + break; + } + } + if(!found) + gtk_icon_theme_append_search_path(icon_theme, self->priv->icon_theme_path); + g_strfreev (path); + } + switch (app_indicator_get_status(self)) { case APP_INDICATOR_STATUS_PASSIVE: - longname = append_panel_icon_suffix(app_indicator_get_icon(self)); - gtk_status_icon_set_visible(icon, FALSE); - gtk_status_icon_set_from_icon_name(icon, longname); + /* hide first to avoid that the change is visible to the user */ + gtk_status_icon_set_visible(icon, FALSE); + longname = append_panel_icon_suffix(app_indicator_get_icon(self)); + if (gtk_icon_theme_has_icon (icon_theme, longname)) + gtk_status_icon_set_from_icon_name(icon, longname); + else + gtk_status_icon_set_from_icon_name(icon, app_indicator_get_icon(self)); break; case APP_INDICATOR_STATUS_ACTIVE: - longname = append_panel_icon_suffix(app_indicator_get_icon(self)); - gtk_status_icon_set_from_icon_name(icon, longname); + longname = append_panel_icon_suffix(app_indicator_get_icon(self)); + if (gtk_icon_theme_has_icon (icon_theme, longname)) + gtk_status_icon_set_from_icon_name(icon, longname); + else + gtk_status_icon_set_from_icon_name(icon, app_indicator_get_icon(self)); gtk_status_icon_set_visible(icon, TRUE); break; case APP_INDICATOR_STATUS_ATTENTION: - longname = append_panel_icon_suffix(app_indicator_get_attention_icon(self)); - gtk_status_icon_set_from_icon_name(icon, longname); + /* get the _attention_ icon here */ + longname = append_panel_icon_suffix(app_indicator_get_attention_icon(self)); + if (gtk_icon_theme_has_icon (icon_theme, longname)) + gtk_status_icon_set_from_icon_name(icon, longname); + else + gtk_status_icon_set_from_icon_name(icon, app_indicator_get_icon(self)); gtk_status_icon_set_visible(icon, TRUE); break; }; @@ -2095,6 +2188,33 @@ app_indicator_set_secondary_activate_target (AppIndicator *self, GtkWidget *menu } /** + * app_indicator_set_title: + * @self: The #AppIndicator + * @title: (allow-none): Title of the app indicator + * + * Sets the title of the application indicator, or how it should be referred + * in a human readable form. This string should be UTF-8 and localized as it + * expected that users will set it. + * + * In the Unity desktop the most prominent place that this is show will be + * in the HUD. HUD listings for this application indicator will start with + * the title as the first part of the line for the menu items. + * + * Setting @title to %NULL removes the title. + */ +void +app_indicator_set_title (AppIndicator *self, const gchar * title) +{ + g_return_if_fail (IS_APP_INDICATOR (self)); + + g_object_set(G_OBJECT(self), + PROP_TITLE_S, title == NULL ? "": title, + NULL); + + return; +} + +/** * app_indicator_get_id: * @self: The #AppIndicator object to use * @@ -2223,6 +2343,24 @@ app_indicator_get_attention_icon_desc (AppIndicator *self) } /** + * app_indicator_get_title: + * @self: The #AppIndicator object to use + * + * Gets the title of the application indicator. See the function + * app_indicator_set_title() for information on the title. + * + * Return value: The current title. + */ +const gchar * +app_indicator_get_title (AppIndicator *self) +{ + g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); + + return self->priv->title; +} + + +/** * app_indicator_get_menu: * @self: The #AppIndicator object to use * diff --git a/src/app-indicator.h b/src/app-indicator.h index 6922248..8ae20b0 100644 --- a/src/app-indicator.h +++ b/src/app-indicator.h @@ -285,6 +285,8 @@ void app_indicator_set_ordering_index (AppIndicator guint32 ordering_index); void app_indicator_set_secondary_activate_target (AppIndicator *self, GtkWidget *menuitem); +void app_indicator_set_title (AppIndicator *self, + const gchar *title); /* Get properties */ const gchar * app_indicator_get_id (AppIndicator *self); @@ -295,6 +297,7 @@ const gchar * app_indicator_get_icon_desc (AppIndic const gchar * app_indicator_get_icon_theme_path (AppIndicator *self); const gchar * app_indicator_get_attention_icon (AppIndicator *self); const gchar * app_indicator_get_attention_icon_desc (AppIndicator *self); +const gchar * app_indicator_get_title (AppIndicator *self); GtkMenu * app_indicator_get_menu (AppIndicator *self); const gchar * app_indicator_get_label (AppIndicator *self); diff --git a/src/appindicator3-0.1.pc.in b/src/appindicator3-0.1.pc.in index 0ffe409..f59ac70 100644 --- a/src/appindicator3-0.1.pc.in +++ b/src/appindicator3-0.1.pc.in @@ -4,7 +4,7 @@ libdir=@libdir@ bindir=@bindir@ includedir=@includedir@ -Cflags: -I${includedir}/libappindicator-0.1 +Cflags: -I${includedir}/libappindicator3-0.1 Requires: dbusmenu-glib-0.4 gtk+-3.0 Libs: -L${libdir} -lappindicator3 diff --git a/src/application-service-marshal.c b/src/application-service-marshal.c index d077981..ac6ea3b 100644 --- a/src/application-service-marshal.c +++ b/src/application-service-marshal.c @@ -5,7 +5,7 @@ #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) -#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_char(v) g_value_get_schar (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) diff --git a/src/gen-notification-item.xml.c b/src/gen-notification-item.xml.c index 0a442a8..0bc6ab2 100644 --- a/src/gen-notification-item.xml.c +++ b/src/gen-notification-item.xml.c @@ -11,6 +11,7 @@ const char * _notification_item = " <property name=\"IconAccessibleDesc\" type=\"s\" access=\"read\" />\n" " <property name=\"AttentionIconName\" type=\"s\" access=\"read\" />\n" " <property name=\"AttentionAccessibleDesc\" type=\"s\" access=\"read\" />\n" +" <property name=\"Title\" type=\"s\" access=\"read\" />\n" " <!-- An additional path to add to the theme search path\n" " to find the icons specified above. -->\n" " <property name=\"IconThemePath\" type=\"s\" access=\"read\" />\n" @@ -47,6 +48,8 @@ const char * _notification_item = " <arg type=\"s\" name=\"label\" direction=\"out\" />\n" " <arg type=\"s\" name=\"guide\" direction=\"out\" />\n" " </signal>\n" +" <signal name=\"NewTitle\">\n" +" </signal>\n" "\n" " </interface>\n" "</node>\n" diff --git a/src/notification-item.xml b/src/notification-item.xml index 589a438..c93afd7 100644 --- a/src/notification-item.xml +++ b/src/notification-item.xml @@ -10,6 +10,7 @@ <property name="IconAccessibleDesc" type="s" access="read" /> <property name="AttentionIconName" type="s" access="read" /> <property name="AttentionAccessibleDesc" type="s" access="read" /> + <property name="Title" type="s" access="read" /> <!-- An additional path to add to the theme search path to find the icons specified above. --> <property name="IconThemePath" type="s" access="read" /> @@ -46,6 +47,8 @@ <arg type="s" name="label" direction="out" /> <arg type="s" name="guide" direction="out" /> </signal> + <signal name="NewTitle"> + </signal> </interface> </node> |