aboutsummaryrefslogtreecommitdiff
path: root/src/app-indicator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/app-indicator.c')
-rw-r--r--src/app-indicator.c205
1 files changed, 184 insertions, 21 deletions
diff --git a/src/app-indicator.c b/src/app-indicator.c
index f4e9173..167e17f 100644
--- a/src/app-indicator.c
+++ b/src/app-indicator.c
@@ -80,6 +80,8 @@ struct _AppIndicatorPrivate {
guint32 ordering_index;
gchar * label;
gchar * label_guide;
+ gchar * accessible_desc;
+ gchar * att_accessible_desc;
guint label_change_idle;
GtkStatusIcon * status_icon;
@@ -117,7 +119,9 @@ enum {
PROP_CATEGORY,
PROP_STATUS,
PROP_ICON_NAME,
+ PROP_ICON_DESC,
PROP_ATTENTION_ICON_NAME,
+ PROP_ATTENTION_ICON_DESC,
PROP_ICON_THEME_PATH,
PROP_CONNECTED,
PROP_LABEL,
@@ -131,7 +135,9 @@ enum {
#define PROP_CATEGORY_S "category"
#define PROP_STATUS_S "status"
#define PROP_ICON_NAME_S "icon-name"
+#define PROP_ICON_DESC_S "icon-desc"
#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name"
+#define PROP_ATTENTION_ICON_DESC_S "attention-icon-desc"
#define PROP_ICON_THEME_PATH_S "icon-theme-path"
#define PROP_CONNECTED_S "connected"
#define PROP_LABEL_S "label"
@@ -263,12 +269,24 @@ app_indicator_class_init (AppIndicatorClass *klass)
The name of the regular icon that is shown for the indicator.
*/
g_object_class_install_property(object_class,
- PROP_ICON_NAME,
+ PROP_ICON_NAME,
g_param_spec_string (PROP_ICON_NAME_S,
- "An icon for the indicator",
- "The default icon that is shown for the indicator.",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT));
+ "An icon for the indicator",
+ "The default icon that is shown for the indicator.",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ AppIndicator:icon-desc:
+
+ The description of the regular icon that is shown for the indicator.
+ */
+ g_object_class_install_property(object_class,
+ PROP_ICON_DESC,
+ g_param_spec_string (PROP_ICON_DESC_S,
+ "A description of the icon for the indicator",
+ "A description of the default icon that is shown for the indicator.",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
AppIndicator:attention-icon-name:
@@ -284,6 +302,19 @@ app_indicator_class_init (AppIndicatorClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
+ AppIndicator:attention-icon-desc:
+
+ If the indicator sets it's status to %APP_INDICATOR_STATUS_ATTENTION
+ then this textual description of the icon shown.
+ */
+ g_object_class_install_property (object_class,
+ PROP_ATTENTION_ICON_DESC,
+ g_param_spec_string (PROP_ATTENTION_ICON_DESC_S,
+ "A description of the icon to show when the indicator request attention.",
+ "When the indicator is an attention mode this should describe the icon shown",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
AppIndicator:icon-theme-path:
An additional place to look for icon names that may be installed by the
@@ -442,7 +473,6 @@ app_indicator_class_init (AppIndicatorClass *klass)
_application_service_marshal_VOID__STRING_STRING,
G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
-
/**
AppIndicator::connection-changed:
@arg0: The #AppIndicator object
@@ -579,11 +609,6 @@ app_indicator_dispose (GObject *object)
AppIndicator *self = APP_INDICATOR (object);
AppIndicatorPrivate *priv = self->priv;
- if (priv->dbus_registration != 0) {
- g_dbus_connection_unregister_object(priv->connection, priv->dbus_registration);
- priv->dbus_registration = 0;
- }
-
if (priv->shorties != NULL) {
g_object_unref(G_OBJECT(priv->shorties));
priv->shorties = NULL;
@@ -632,6 +657,11 @@ app_indicator_dispose (GObject *object)
g_signal_emit (self, signals[CONNECTION_CHANGED], 0, FALSE);
}
+ if (priv->dbus_registration != 0) {
+ g_dbus_connection_unregister_object(priv->connection, priv->dbus_registration);
+ priv->dbus_registration = 0;
+ }
+
if (priv->connection != NULL) {
g_object_unref(G_OBJECT(priv->connection));
priv->connection = NULL;
@@ -688,6 +718,16 @@ app_indicator_finalize (GObject *object)
priv->label_guide = NULL;
}
+ if (priv->accessible_desc != NULL) {
+ g_free(priv->accessible_desc);
+ priv->accessible_desc = NULL;
+ }
+
+ if (priv->att_accessible_desc != NULL) {
+ g_free(priv->att_accessible_desc);
+ priv->att_accessible_desc = NULL;
+ }
+
if (priv->path != NULL) {
g_free(priv->path);
priv->path = NULL;
@@ -747,14 +787,29 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu
break;
case PROP_ICON_NAME:
- app_indicator_set_icon (APP_INDICATOR (object),
- g_value_get_string (value));
+ app_indicator_set_icon_full (APP_INDICATOR (object),
+ g_value_get_string (value),
+ priv->accessible_desc);
+ check_connect (self);
+ break;
+
+ case PROP_ICON_DESC:
+ app_indicator_set_icon_full (APP_INDICATOR (object),
+ priv->icon_name,
+ g_value_get_string (value));
check_connect (self);
break;
case PROP_ATTENTION_ICON_NAME:
- app_indicator_set_attention_icon (APP_INDICATOR (object),
- g_value_get_string (value));
+ app_indicator_set_attention_icon_full (APP_INDICATOR (object),
+ g_value_get_string (value),
+ priv->att_accessible_desc);
+ break;
+
+ case PROP_ATTENTION_ICON_DESC:
+ app_indicator_set_attention_icon_full (APP_INDICATOR (object),
+ priv->attention_icon_name,
+ g_value_get_string (value));
break;
case PROP_ICON_THEME_PATH:
@@ -846,10 +901,18 @@ app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GPa
g_value_set_string (value, priv->icon_name);
break;
+ case PROP_ICON_DESC:
+ g_value_set_string (value, priv->accessible_desc);
+ break;
+
case PROP_ATTENTION_ICON_NAME:
g_value_set_string (value, priv->attention_icon_name);
break;
+ case PROP_ATTENTION_ICON_DESC:
+ g_value_set_string (value, priv->att_accessible_desc);
+ break;
+
case PROP_ICON_THEME_PATH:
g_value_set_string (value, priv->icon_theme_path);
break;
@@ -999,6 +1062,10 @@ bus_get_prop (GDBusConnection * connection, const gchar * sender, const gchar *
return g_variant_new_string(priv->label_guide ? priv->label_guide : "");
} else if (g_strcmp0(property, "XAyatanaOrderingIndex") == 0) {
return g_variant_new_uint32(priv->ordering_index);
+ } else if (g_strcmp0(property, "IconAccessibleDesc") == 0) {
+ return g_variant_new_string(priv->accessible_desc ? priv->accessible_desc : "");
+ } else if (g_strcmp0(property, "AttentionAccessibleDesc") == 0) {
+ return g_variant_new_string(priv->att_accessible_desc ? priv->att_accessible_desc : "");
}
*error = g_error_new(0, 0, "Unknown property: %s", property);
@@ -1613,20 +1680,51 @@ app_indicator_set_status (AppIndicator *self, AppIndicatorStatus status)
@self: The #AppIndicator object to use
@icon_name: The name of the attention icon to set for this indicator
- Wrapper function for property #AppIndicator:attention-icon-name.
+ Wrapper for app_indicator_set_attention_icon_full() with a NULL
+ description.
+
+ Deprecated: Use app_indicator_set_attention_icon_full() instead.
*/
void
app_indicator_set_attention_icon (AppIndicator *self, const gchar *icon_name)
{
+ return app_indicator_set_attention_icon_full(self, icon_name, NULL);
+}
+
+/**
+ app_indicator_set_attention_icon_full:
+ @self: The #AppIndicator object to use
+ @icon_name: The name of the attention icon to set for this indicator
+ @icon_desc: A textual description of the icon
+
+ Wrapper function for property #AppIndicator:attention-icon-name.
+*/
+void
+app_indicator_set_attention_icon_full (AppIndicator *self, const gchar *icon_name, const gchar * icon_desc)
+{
g_return_if_fail (IS_APP_INDICATOR (self));
g_return_if_fail (icon_name != NULL);
+ gboolean changed = FALSE;
if (g_strcmp0 (self->priv->attention_icon_name, icon_name) != 0) {
- if (self->priv->attention_icon_name)
+ if (self->priv->attention_icon_name) {
g_free (self->priv->attention_icon_name);
+ }
self->priv->attention_icon_name = g_strdup(icon_name);
+ changed = TRUE;
+ }
+ if (g_strcmp0(self->priv->att_accessible_desc, icon_desc) != 0) {
+ if (self->priv->att_accessible_desc) {
+ g_free (self->priv->att_accessible_desc);
+ }
+
+ self->priv->att_accessible_desc = g_strdup(icon_name);
+ changed = TRUE;
+ }
+
+ if (changed) {
g_signal_emit (self, signals[NEW_ATTENTION_ICON], 0, TRUE);
if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) {
@@ -1655,23 +1753,56 @@ app_indicator_set_attention_icon (AppIndicator *self, const gchar *icon_name)
@self: The #AppIndicator object to use
@icon_name: The icon name to set.
+ Wrapper function for app_indicator_set_icon_full() with a NULL
+ description.
+
+ Deprecated: Use app_indicator_set_icon_full()
+**/
+void
+app_indicator_set_icon (AppIndicator *self, const gchar *icon_name)
+{
+ return app_indicator_set_icon_full(self, icon_name, NULL);
+}
+
+/**
+ app_indicator_set_icon_full:
+ @self: The #AppIndicator object to use
+ @icon_name: The icon name to set.
+ @icon_desc: A textual description of the icon for accessibility
+
Sets the default icon to use when the status is active but
not set to attention. In most cases, this should be the
application icon for the program.
- Wrapper function for property #AppIndicator:icon-name.
+
+ Wrapper function for property #AppIndicator:icon-name and
+ #AppIndicator::icon-description.
**/
void
-app_indicator_set_icon (AppIndicator *self, const gchar *icon_name)
+app_indicator_set_icon_full (AppIndicator *self, const gchar *icon_name, const gchar * icon_desc)
{
g_return_if_fail (IS_APP_INDICATOR (self));
g_return_if_fail (icon_name != NULL);
+ gboolean changed = FALSE;
if (g_strcmp0 (self->priv->icon_name, icon_name) != 0) {
- if (self->priv->icon_name)
+ if (self->priv->icon_name) {
g_free (self->priv->icon_name);
+ }
self->priv->icon_name = g_strdup(icon_name);
+ changed = TRUE;
+ }
+
+ if (g_strcmp0(self->priv->accessible_desc, icon_desc) != 0) {
+ if (self->priv->accessible_desc != NULL) {
+ g_free(self->priv->accessible_desc);
+ }
+ self->priv->accessible_desc = g_strdup(icon_desc);
+ changed = TRUE;
+ }
+
+ if (changed) {
g_signal_emit (self, signals[NEW_ICON], 0, TRUE);
if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) {
@@ -1930,6 +2061,22 @@ app_indicator_get_icon (AppIndicator *self)
}
/**
+ app_indicator_get_icon_desc:
+ @self: The #AppIndicator object to use
+
+ Wrapper function for property #AppIndicator:icon-desc.
+
+ Return value: The current icon description.
+*/
+const gchar *
+app_indicator_get_icon_desc (AppIndicator *self)
+{
+ g_return_val_if_fail (IS_APP_INDICATOR (self), NULL);
+
+ return self->priv->accessible_desc;
+}
+
+/**
app_indicator_get_icon_theme_path:
@self: The #AppIndicator object to use
@@ -1962,13 +2109,29 @@ app_indicator_get_attention_icon (AppIndicator *self)
}
/**
+ app_indicator_get_attention_icon_desc:
+ @self: The #AppIndicator object to use
+
+ Wrapper function for property #AppIndicator:attention-icon-desc.
+
+ Return value: The current attention icon description.
+*/
+const gchar *
+app_indicator_get_attention_icon_desc (AppIndicator *self)
+{
+ g_return_val_if_fail (IS_APP_INDICATOR (self), NULL);
+
+ return self->priv->att_accessible_desc;
+}
+
+/**
app_indicator_get_menu:
@self: The #AppIndicator object to use
Gets the menu being used for this application indicator.
Wrapper function for property #AppIndicator:menu.
- Return value: A #GtkMenu object or %NULL if one hasn't been set.
+ Return value: (transfer none): A #GtkMenu object or %NULL if one hasn't been set.
*/
GtkMenu *
app_indicator_get_menu (AppIndicator *self)