diff options
-rw-r--r-- | bindings/mono/Makefile.am | 1 | ||||
-rw-r--r-- | bindings/mono/libappindicator-api.metadata | 6 | ||||
-rw-r--r-- | bindings/python/appindicator.defs | 15 | ||||
-rw-r--r-- | docs/reference/libappindicator-sections.txt | 3 | ||||
-rw-r--r-- | example/simple-client.c | 29 | ||||
-rw-r--r-- | src/app-indicator.c | 161 | ||||
-rw-r--r-- | src/app-indicator.h | 13 | ||||
-rw-r--r-- | src/notification-item.xml | 5 | ||||
-rw-r--r-- | tests/test-libappindicator.c | 110 |
9 files changed, 342 insertions, 1 deletions
diff --git a/bindings/mono/Makefile.am b/bindings/mono/Makefile.am index dfaa41f..80c03e3 100644 --- a/bindings/mono/Makefile.am +++ b/bindings/mono/Makefile.am @@ -94,6 +94,7 @@ $(API): $(MIDDLE_API) Makefile.am -e "s|PROP_LABEL_S|label|" \ -e "s|PROP_LABEL_GUIDE_S|label-guide|" \ -e "s|PROP_ORDERING_INDEX_S|ordering-index|" \ + -e "s|PROP_ACCESSIBLE_DESC_S|accessible-name|" \ $< > $@ api_includes = $(GTK_SHARP_CFLAGS) diff --git a/bindings/mono/libappindicator-api.metadata b/bindings/mono/libappindicator-api.metadata index e241ecf..e610c88 100644 --- a/bindings/mono/libappindicator-api.metadata +++ b/bindings/mono/libappindicator-api.metadata @@ -7,6 +7,8 @@ <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='new_status']" name="cname">new-status</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='new_label']" name="name">NewLabel</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='new_label']" name="cname">new-label</attr> + <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='new_accessible_desc']" name="name">NewAccessibleDesc</attr> + <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='new_accessible_desc']" name="cname">new-accessible-desc</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='connection_changed']" name="name">ConnectionChanged</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='connection_changed']" name="cname">connection-changed</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='scroll_event']" name="name">ScrollEvent</attr> @@ -26,6 +28,7 @@ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_CONNECTED_S']" name="name">Connected</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_LABEL_S']" name="name">Label</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_LABEL_GUIDE_S']" name="name">LabelGuide</attr> + <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_ACCESSIBLE_DESC_S']" name="name">AccessibleDesc</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_ORDERING_INDEX_S']" name="name">OrderingIndex</attr> <attr path="/api/namespace/object[@cname='AppIndicator']/method[@name='SetMenu']" name="name">SetMenu</attr> @@ -40,6 +43,7 @@ <remove-node path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_X_LABEL_S']" /> <remove-node path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_X_LABEL_GUIDE_S']" /> <remove-node path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_X_ORDERING_INDEX_S']" /> + <remove-node path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_X_ACCESSIBLE_DESC_S']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_get_id']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_get_status']" /> @@ -50,6 +54,7 @@ <remove-node path="/api/namespace/object/method[@cname='app_indicator_get_label']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_get_label_guide']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_get_ordering_index']" /> + <remove-node path="/api/namespace/object/method[@cname='app_indicator_get_accessible_desc']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_status']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_icon']" /> @@ -57,4 +62,5 @@ <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_attention_icon']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_label']" /> <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_ordering_index']" /> + <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_accessible_desc']" /> </metadata> diff --git a/bindings/python/appindicator.defs b/bindings/python/appindicator.defs index 5027a6d..cc8ae75 100644 --- a/bindings/python/appindicator.defs +++ b/bindings/python/appindicator.defs @@ -72,6 +72,15 @@ ) ) +(define-method set_accessible_desc + (of-object "AppIndicator") + (c-name "app_indicator_set_accessible_desc") + (return-type "none") + (parameters + '("const-gchar*" "accessible_desc" (null-ok)) + ) +) + (define-method set_ordering_index (of-object "AppIndicator") (c-name "app_indicator_set_ordering_index") @@ -146,6 +155,12 @@ (return-type "const-gchar*") ) +(define-method get_accessible_desc + (of-object "AppIndicator") + (c-name "app_indicator_get_accessible_desc") + (return-type "const-gchar*") +) + (define-method get_ordering_index (of-object "AppIndicator") (c-name "app_indicator_get_ordering_index") diff --git a/docs/reference/libappindicator-sections.txt b/docs/reference/libappindicator-sections.txt index 41ff7fa..602e8d9 100644 --- a/docs/reference/libappindicator-sections.txt +++ b/docs/reference/libappindicator-sections.txt @@ -10,6 +10,7 @@ APP_INDICATOR_SIGNAL_NEW_ICON APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON APP_INDICATOR_SIGNAL_NEW_STATUS APP_INDICATOR_SIGNAL_NEW_LABEL +APP_INDICATOR_SIGNAL_NEW_ACCESSIBLE_DESC APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH APP_INDICATOR_SIGNAL_CONNECTION_CHANGED AppIndicatorCategory @@ -27,6 +28,7 @@ app_indicator_set_menu app_indicator_set_icon app_indicator_set_icon_theme_path app_indicator_set_label +app_indicator_set_accessible_desc app_indicator_set_ordering_index app_indicator_get_id app_indicator_get_category @@ -37,6 +39,7 @@ app_indicator_get_attention_icon app_indicator_get_menu app_indicator_get_label app_indicator_get_label_guide +app_indicator_get_accessible_desc app_indicator_get_ordering_index app_indicator_build_menu_from_desktop </SECTION> diff --git a/example/simple-client.c b/example/simple-client.c index 1cf06dc..5d464ac 100644 --- a/example/simple-client.c +++ b/example/simple-client.c @@ -27,6 +27,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. GMainLoop * mainloop = NULL; static gboolean active = TRUE; static gboolean can_haz_label = TRUE; +static gboolean can_haz_a11yname = TRUE; static void label_toggle_cb (GtkWidget * widget, gpointer data) @@ -43,6 +44,20 @@ label_toggle_cb (GtkWidget * widget, gpointer data) } static void +a11yname_toggle_cb (GtkWidget * widget, gpointer data) +{ + can_haz_a11yname = !can_haz_a11yname; + + if (can_haz_a11yname) { + gtk_menu_item_set_label(GTK_MENU_ITEM(widget), "Hide accessible description"); + } else { + gtk_menu_item_set_label(GTK_MENU_ITEM(widget), "Show accessible description"); + } + + return; +} + +static void activate_clicked_cb (GtkWidget *widget, gpointer data) { AppIndicator * ci = APP_INDICATOR(data); @@ -146,6 +161,13 @@ percent_change (gpointer user_data) } else { app_indicator_set_label (APP_INDICATOR(user_data), NULL, NULL); } + if (can_haz_a11yname) { + gchar * percentstr = g_strdup_printf("%d%%", percentage + 1); + app_indicator_set_accessible_desc (APP_INDICATOR(user_data), percentstr); + g_free(percentstr); + } else { + app_indicator_set_accessible_desc (APP_INDICATOR(user_data), NULL); + } return TRUE; } @@ -222,6 +244,13 @@ main (int argc, char ** argv) gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show(item); + item = gtk_menu_item_new_with_label ("Show accessible description"); + a11yname_toggle_cb(item, ci); + g_signal_connect (item, "activate", + G_CALLBACK (a11yname_toggle_cb), ci); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show(item); + app_indicator_set_menu (ci, GTK_MENU (menu)); mainloop = g_main_loop_new(NULL, FALSE); diff --git a/src/app-indicator.c b/src/app-indicator.c index f4e9173..c3da8ed 100644 --- a/src/app-indicator.c +++ b/src/app-indicator.c @@ -80,7 +80,9 @@ struct _AppIndicatorPrivate { guint32 ordering_index; gchar * label; gchar * label_guide; + gchar * accessible_desc; guint label_change_idle; + guint accessible_desc_change_idle; GtkStatusIcon * status_icon; gint fallback_timer; @@ -104,6 +106,7 @@ enum { CONNECTION_CHANGED, NEW_ICON_THEME_PATH, SCROLL_EVENT, + NEW_ACCESSIBLE_DESC, LAST_SIGNAL }; @@ -123,7 +126,8 @@ enum { PROP_LABEL, PROP_LABEL_GUIDE, PROP_ORDERING_INDEX, - PROP_DBUS_MENU_SERVER + PROP_DBUS_MENU_SERVER, + PROP_ACCESSIBLE_DESC }; /* The strings so that they can be slowly looked up. */ @@ -138,6 +142,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_ACCESSIBLE_DESC_S "accessible-desc" /* Private macro, shhhh! */ #define APP_INDICATOR_GET_PRIVATE(o) \ @@ -165,6 +170,7 @@ static void app_indicator_set_property (GObject * object, guint prop_id, const G static void app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* Other stuff */ static void signal_label_change (AppIndicator * self); +static void signal_accessible_desc_change (AppIndicator * self); static void check_connect (AppIndicator * self); static void register_service_cb (GObject * obj, GAsyncResult * res, gpointer user_data); static void start_fallback_timer (AppIndicator * self, gboolean disable_timeout); @@ -346,6 +352,22 @@ app_indicator_class_init (AppIndicatorClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** + AppIndicator:accessible-desc: + + A string that describes the indicator in text form. This string is + used to identify the indicator to users of assistive technologies, such + as screen readers. If the indicator has a label, then duplicating the + contents of the label is fine, if the label alone conveys enough + information about the state of the indicator to the user. + */ + g_object_class_install_property(object_class, + PROP_ACCESSIBLE_DESC, + g_param_spec_string (PROP_ACCESSIBLE_DESC_S, + "A string that describes the indicator in text form.", + "This string should convey a description of the indicator's current status, for users who use assistive technologies.", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** AppIndicator:ordering-index: The ordering index is an odd parameter, and if you think you don't need @@ -442,6 +464,21 @@ app_indicator_class_init (AppIndicatorClass *klass) _application_service_marshal_VOID__STRING_STRING, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); + /** + AppIndicator::new-accessible-desc: + @arg0: The #AppIndicator object + @arg1: The string for the accessible description + + Emitted when #AppIndicator:accessible_desc changes. + */ + signals[NEW_ACCESSIBLE_DESC] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ACCESSIBLE_DESC, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AppIndicatorClass, new_accessible_desc), + NULL, NULL, + _application_service_marshal_VOID__STRING_STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + /** AppIndicator::connection-changed: @@ -548,6 +585,7 @@ app_indicator_init (AppIndicator *self) priv->label = NULL; priv->label_guide = NULL; priv->label_change_idle = 0; + priv->accessible_desc_change_idle = 0; priv->watcher_proxy = NULL; priv->connection = NULL; @@ -611,6 +649,11 @@ app_indicator_dispose (GObject *object) priv->label_change_idle = 0; } + if (priv->accessible_desc_change_idle != 0) { + g_source_remove(priv->accessible_desc_change_idle); + priv->accessible_desc_change_idle = 0; + } + if (priv->menu != NULL) { g_signal_handlers_disconnect_by_func (G_OBJECT (priv->menu), client_menu_changed, @@ -688,6 +731,11 @@ 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->path != NULL) { g_free(priv->path); priv->path = NULL; @@ -799,6 +847,24 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu } break; } + case PROP_ACCESSIBLE_DESC: { + gchar * olda11ydesc = priv->accessible_desc; + priv->accessible_desc = g_value_dup_string(value); + + if (g_strcmp0(olda11ydesc, priv->accessible_desc) != 0) { + signal_accessible_desc_change(APP_INDICATOR(object)); + } + + if (priv->accessible_desc != NULL && priv->accessible_desc[0] == '\0') { + g_free(priv->accessible_desc); + priv->accessible_desc = NULL; + } + + if (olda11ydesc != NULL) { + g_free(olda11ydesc); + } + break; + } case PROP_ORDERING_INDEX: priv->ordering_index = g_value_get_uint(value); break; @@ -877,6 +943,10 @@ app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GPa g_value_set_string (value, priv->label_guide); break; + case PROP_ACCESSIBLE_DESC: + g_value_set_string (value, priv->accessible_desc); + break; + case PROP_ORDERING_INDEX: g_value_set_uint(value, priv->ordering_index); break; @@ -999,6 +1069,8 @@ 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, "AccessibleDesc") == 0) { + return g_variant_new_string(priv->accessible_desc ? priv->accessible_desc : ""); } *error = g_error_new(0, 0, "Unknown property: %s", property); @@ -1055,6 +1127,55 @@ signal_label_change (AppIndicator * self) return; } +/* Sends the accessible description changed signal and resets the source ID */ +static gboolean +signal_accessible_desc_change_idle (gpointer user_data) +{ + AppIndicator * self = (AppIndicator *)user_data; + AppIndicatorPrivate *priv = self->priv; + + gchar * accessible_desc = priv->accessible_desc != NULL ? priv->accessible_desc : ""; + + g_signal_emit(G_OBJECT(self), signals[NEW_ACCESSIBLE_DESC], 0, + accessible_desc, TRUE); + if (priv->dbus_registration != 0 && priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(priv->connection, + NULL, + priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "NewAccessibleDesc", + g_variant_new("(s)", accessible_desc), + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewAccessibleDesc: %s", error->message); + g_error_free(error); + } + } + + priv->accessible_desc_change_idle = 0; + + return FALSE; +} + +/* Sets up an idle function to send the accessible description + changed signal so that we don't send it too many times. */ +static void +signal_accessible_desc_change (AppIndicator * self) +{ + AppIndicatorPrivate *priv = self->priv; + + /* don't set it twice */ + if (priv->accessible_desc_change_idle != 0) { + return; + } + + priv->accessible_desc_change_idle = g_idle_add(signal_accessible_desc_change_idle, self); + return; +} + /* This function is used to see if we have enough information to connect to things. If we do, and we're not connected, it connects for us. */ @@ -1721,6 +1842,28 @@ app_indicator_set_label (AppIndicator *self, const gchar * label, const gchar * } /** + app_indicator_set_accessible_desc: + @self: The #AppIndicator object to use + @accessible_desc: The accessible description used by assistive technologies. + + This is a wrapper function for the #AppIndicator:accessible_desc + property. This function can take #NULL as @accessible_desc and + will clear the entry. +*/ +void +app_indicator_set_accessible_desc (AppIndicator *self, const gchar * accessible_desc) +{ + g_return_if_fail (IS_APP_INDICATOR (self)); + /* Note: The accessible description can be NULL, it's okay */ + + g_object_set(G_OBJECT(self), + PROP_ACCESSIBLE_DESC_S, accessible_desc == NULL ? "" : accessible_desc, + NULL); + + return; +} + +/** app_indicator_set_icon_theme_path: @self: The #AppIndicator object to use @icon_theme_path: The icon theme path to set. @@ -2015,6 +2158,22 @@ app_indicator_get_label_guide (AppIndicator *self) } /** + app_indicator_get_accessible_desc: + @self: The #AppIndicator object to use + + Wrapper function for property #AppIndicator:accessible_desc. + + Return value: The current accessible description. +*/ +const gchar * +app_indicator_get_accessible_desc (AppIndicator *self) +{ + g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); + + return self->priv->accessible_desc; +} + +/** app_indicator_get_ordering_index: @self: The #AppIndicator object to use diff --git a/src/app-indicator.h b/src/app-indicator.h index 2a30b22..0e693bd 100644 --- a/src/app-indicator.h +++ b/src/app-indicator.h @@ -112,6 +112,11 @@ G_BEGIN_DECLS String identifier for the #AppIndicator::scroll-event signal. */ +/** + APP_INDICATOR_SIGNAL_NEW_ACCESSIBLE_DESC: + + String identifier for the #AppIndicator::new-accessible-desc signal. +*/ #define APP_INDICATOR_SIGNAL_NEW_ICON "new-icon" #define APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" #define APP_INDICATOR_SIGNAL_NEW_STATUS "new-status" @@ -119,6 +124,7 @@ G_BEGIN_DECLS #define APP_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" #define APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH "new-icon-theme-path" #define APP_INDICATOR_SIGNAL_SCROLL_EVENT "scroll-event" +#define APP_INDICATOR_SIGNAL_NEW_ACCESSIBLE_DESC "new-accessible-desc" /** AppIndicatorCategory: @@ -168,6 +174,7 @@ typedef struct _AppIndicatorPrivate AppIndicatorPrivate; @new_status: Slot for #AppIndicator::new-status. @new_icon_theme_path: Slot for #AppIndicator::new-icon-theme-path @new_label: Slot for #AppIndicator::new-label. + @new_accessible_desc: Slot for #AppIndicator::new-accessible-desc. @connection_changed: Slot for #AppIndicator::connection-changed. @scroll-event: Slot for #AppIndicator::scroll-event @app_indicator_reserved_ats: Reserved for future use. @@ -204,6 +211,9 @@ struct _AppIndicatorClass { const gchar *label, const gchar *guide, gpointer user_data); + void (* new_accessible_desc) (AppIndicator *indicator, + const gchar *accessible_desc); + /* Local Signals */ void (* connection_changed) (AppIndicator * indicator, @@ -274,6 +284,8 @@ void app_indicator_set_icon (AppIndicator void app_indicator_set_label (AppIndicator *self, const gchar *label, const gchar *guide); +void app_indicator_set_accessible_desc(AppIndicator *self, + const gchar *accessible_desc); void app_indicator_set_icon_theme_path(AppIndicator *self, const gchar *icon_theme_path); void app_indicator_set_ordering_index (AppIndicator *self, @@ -289,6 +301,7 @@ const gchar * app_indicator_get_attention_icon (AppIndicator * GtkMenu * app_indicator_get_menu (AppIndicator *self); const gchar * app_indicator_get_label (AppIndicator *self); const gchar * app_indicator_get_label_guide (AppIndicator *self); +const gchar * app_indicator_get_accessible_desc(AppIndicator *self); guint32 app_indicator_get_ordering_index (AppIndicator *self); /* Helpers */ diff --git a/src/notification-item.xml b/src/notification-item.xml index 127eb3a..3e5b3ff 100644 --- a/src/notification-item.xml +++ b/src/notification-item.xml @@ -15,6 +15,7 @@ <property name="XAyatanaLabel" type="s" access="read" /> <property name="XAyatanaLabelGuide" type="s" access="read" /> <property name="XAyatanaOrderingIndex" type="u" access="read" /> + <property name="AccessibleDesc" type="s" access="read" /> <!-- Methods --> <method name="Scroll"> @@ -37,5 +38,9 @@ <arg type="s" name="label" direction="out" /> <arg type="s" name="guide" direction="out" /> </signal> + <signal name="AccessibleDesc"> + <arg type="s" name="accessible_desc" direction="out" /> + </signal> + </interface> </node> diff --git a/tests/test-libappindicator.c b/tests/test-libappindicator.c index cadf783..d62226e 100644 --- a/tests/test-libappindicator.c +++ b/tests/test-libappindicator.c @@ -228,6 +228,46 @@ test_libappindicator_set_label (void) } void +test_libappindicator_set_accessible_desc (void) +{ + AppIndicator * ci = app_indicator_new ("my-id", + "my-name", + APP_INDICATOR_CATEGORY_APPLICATION_STATUS); + + g_assert(ci != NULL); + g_assert(app_indicator_get_accessible_desc(ci) == NULL); + + /* First check all the clearing modes, this is important as + we're going to use them later, we need them to work. */ + app_indicator_set_accessible_desc(ci, NULL); + + g_assert(app_indicator_get_accessible_desc(ci) == NULL); + + app_indicator_set_accessible_desc(ci, ""); + + g_assert(app_indicator_get_accessible_desc(ci) == NULL); + + app_indicator_set_accessible_desc(ci, "accessible_desc"); + + g_assert(g_strcmp0(app_indicator_get_accessible_desc(ci), "accessible_desc") == 0); + + app_indicator_set_accessible_desc(ci, NULL); + + g_assert(app_indicator_get_accessible_desc(ci) == NULL); + + app_indicator_set_accessible_desc(ci, "accessible_desc2"); + + g_assert(g_strcmp0(app_indicator_get_accessible_desc(ci), "accessible_desc2") == 0); + + app_indicator_set_accessible_desc(ci, "trick-accessible_desc"); + + g_assert(g_strcmp0(app_indicator_get_accessible_desc(ci), "trick-accessible_desc") == 0); + + g_object_unref(G_OBJECT(ci)); + return; +} + +void test_libappindicator_set_menu (void) { AppIndicator * ci = app_indicator_new ("my-id", @@ -287,6 +327,14 @@ label_signals_cb (AppIndicator * appindicator, gchar * label, gchar * guide, gpo } void +accessible_desc_signals_cb (AppIndicator * appindicator, gchar * accessible_desc, gpointer user_data) +{ + gint * accessible_desc_signals_count = (gint *)user_data; + (*accessible_desc_signals_count)++; + return; +} + +void label_signals_check (void) { while (g_main_context_pending(NULL)) { @@ -297,6 +345,16 @@ label_signals_check (void) } void +accessible_desc_signals_check (void) +{ + while (g_main_context_pending(NULL)) { + g_main_context_iteration(NULL, TRUE); + } + + return; +} + +void test_libappindicator_label_signals (void) { gint label_signals_count = 0; @@ -348,6 +406,56 @@ test_libappindicator_label_signals (void) } void +test_libappindicator_accessible_desc_signals (void) +{ + gint accessible_desc_signals_count = 0; + AppIndicator * ci = app_indicator_new ("my-id", + "my-name", + APP_INDICATOR_CATEGORY_APPLICATION_STATUS); + + g_assert(ci != NULL); + g_assert(app_indicator_get_accessible_desc(ci) == NULL); + + g_signal_connect(G_OBJECT(ci), APP_INDICATOR_SIGNAL_NEW_ACCESSIBLE_DESC, G_CALLBACK(accessible_desc_signals_cb), &accessible_desc_signals_count); + + /* Shouldn't be a signal as it should be stuck in idle */ + app_indicator_set_accessible_desc(ci, "accessible_desc"); + g_assert(accessible_desc_signals_count == 0); + + /* Should show up after idle processing */ + accessible_desc_signals_check(); + g_assert(accessible_desc_signals_count == 1); + + /* Shouldn't signal with no change */ + accessible_desc_signals_count = 0; + app_indicator_set_accessible_desc(ci, "accessible_desc"); + accessible_desc_signals_check(); + g_assert(accessible_desc_signals_count == 0); + + /* Change one, we should get one signal */ + app_indicator_set_accessible_desc(ci, "accessible_desc2"); + accessible_desc_signals_check(); + g_assert(accessible_desc_signals_count == 1); + + /* Change several times, one signal */ + accessible_desc_signals_count = 0; + app_indicator_set_accessible_desc(ci, "accessible_desc1"); + app_indicator_set_accessible_desc(ci, "accessible_desc1"); + app_indicator_set_accessible_desc(ci, "accessible_desc2"); + app_indicator_set_accessible_desc(ci, "accessible_desc3"); + accessible_desc_signals_check(); + g_assert(accessible_desc_signals_count == 1); + + /* Clear should signal too */ + accessible_desc_signals_count = 0; + app_indicator_set_accessible_desc(ci, NULL); + accessible_desc_signals_check(); + g_assert(accessible_desc_signals_count == 1); + + return; +} + +void test_libappindicator_desktop_menu (void) { AppIndicator * ci = app_indicator_new ("my-id-desktop-menu", @@ -428,6 +536,8 @@ test_libappindicator_props_suite (void) g_test_add_func ("/indicator-application/libappindicator/label_signals", test_libappindicator_label_signals); g_test_add_func ("/indicator-application/libappindicator/desktop_menu", test_libappindicator_desktop_menu); g_test_add_func ("/indicator-application/libappindicator/desktop_menu_bad",test_libappindicator_desktop_menu_bad); + g_test_add_func ("/indicator-application/libappindicator/set_accessible_desc",test_libappindicator_set_accessible_desc); + g_test_add_func ("/indicator-application/libappindicator/accessible_desc_signals",test_libappindicator_accessible_desc_signals); return; } |