[gnome-shell] a11y: add a property accessible-name on StWidget
- From: Alejandro PiÃeiro Iglesias <apinheiro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] a11y: add a property accessible-name on StWidget
- Date: Mon, 19 Mar 2012 14:09:10 +0000 (UTC)
commit 67ef448471eaa1290b1a75aae912f97f127e92bd
Author: Alejandro PiÃeiro <apinheiro igalia com>
Date: Thu Mar 15 19:32:21 2012 +0100
a11y: add a property accessible-name on StWidget
https://bugzilla.gnome.org/show_bug.cgi?id=671378
src/st/st-widget.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++-
src/st/st-widget.h | 3 +
2 files changed, 109 insertions(+), 1 deletions(-)
---
diff --git a/src/st/st-widget.c b/src/st/st-widget.c
index 2a1af3b..27db9e1 100644
--- a/src/st/st-widget.c
+++ b/src/st/st-widget.c
@@ -72,6 +72,7 @@ struct _StWidgetPrivate
AtkStateSet *local_state_set;
ClutterActor *label_actor;
+ gchar *accessible_name;
/* Even though Clutter has first_child/last_child properties,
* we need to keep track of the old first/last children so
@@ -104,7 +105,8 @@ enum
PROP_HOVER,
PROP_CAN_FOCUS,
PROP_LABEL_ACTOR,
- PROP_ACCESSIBLE_ROLE
+ PROP_ACCESSIBLE_ROLE,
+ PROP_ACCESSIBLE_NAME
};
enum
@@ -185,6 +187,10 @@ st_widget_set_property (GObject *gobject,
st_widget_set_accessible_role (actor, g_value_get_enum (value));
break;
+ case PROP_ACCESSIBLE_NAME:
+ st_widget_set_accessible_name (actor, g_value_get_string (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
@@ -242,6 +248,10 @@ st_widget_get_property (GObject *gobject,
g_value_set_enum (value, st_widget_get_accessible_role (actor));
break;
+ case PROP_ACCESSIBLE_NAME:
+ g_value_set_string (value, priv->accessible_name);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
@@ -306,6 +316,7 @@ st_widget_finalize (GObject *gobject)
g_free (priv->style_class);
g_free (priv->pseudo_class);
g_object_unref (priv->local_state_set);
+ g_free (priv->accessible_name);
G_OBJECT_CLASS (st_widget_parent_class)->finalize (gobject);
}
@@ -947,6 +958,19 @@ st_widget_class_init (StWidgetClass *klass)
/**
+ * StWidget:accessible-name:
+ *
+ * Object instance's name for assistive technology access.
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_ACCESSIBLE_NAME,
+ g_param_spec_string ("accessible-name",
+ "Accessible name",
+ "Object instance's name for assistive technology access.",
+ NULL,
+ ST_PARAM_READWRITE));
+
+ /**
* StWidget::style-changed:
* @widget: the #StWidget
*
@@ -2191,6 +2215,52 @@ st_widget_set_label_actor (StWidget *widget,
}
/**
+ * st_widget_set_accessible_name:
+ * @widget: widget to set the accessible name for
+ * @name: (allow-none): a character string to be set as the accessible name
+ *
+ * This method sets @name as the accessible name for @widget.
+ *
+ * Usually you will have no need to set the accessible name for an
+ * object, as usually there is a label for most of the interface
+ * elements. So in general it is better to just use
+ * @st_widget_set_label_actor. This method is only required when you
+ * need to set an accessible name and there is no available label
+ * object.
+ *
+ */
+void
+st_widget_set_accessible_name (StWidget *widget,
+ const gchar *name)
+{
+ g_return_if_fail (ST_IS_WIDGET (widget));
+
+ if (widget->priv->accessible_name != NULL)
+ g_free (widget->priv->accessible_name);
+
+ widget->priv->accessible_name = g_strdup (name);
+ g_object_notify (G_OBJECT (widget), "accessible-name");
+}
+
+/**
+ * st_widget_get_accessible_name:
+ * @widget: widget to get the accessible name for
+ *
+ * Gets the accessible name for this widget. See
+ * st_widget_set_accessible_name() for more information.
+ *
+ * Return value: a character string representing the accessible name
+ * of the widget.
+ */
+const gchar *
+st_widget_get_accessible_name (StWidget *widget)
+{
+ g_return_val_if_fail (ST_IS_WIDGET (widget), NULL);
+
+ return widget->priv->accessible_name;
+}
+
+/**
* st_widget_set_accessible_role:
* @widget: widget to set the accessible role for
* @role: The role to use
@@ -2377,6 +2447,28 @@ st_widget_get_accessible (ClutterActor *actor)
return widget->priv->accessible;
}
+static const gchar *
+st_widget_accessible_get_name (AtkObject *obj)
+{
+ const gchar* name = NULL;
+
+ g_return_val_if_fail (ST_IS_WIDGET_ACCESSIBLE (obj), NULL);
+
+ name = ATK_OBJECT_CLASS (st_widget_accessible_parent_class)->get_name (obj);
+ if (name == NULL)
+ {
+ StWidget *widget = NULL;
+
+ widget = ST_WIDGET (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (obj)));
+
+ if (widget == NULL)
+ name = NULL;
+ else
+ name = widget->priv->accessible_name;
+ }
+
+ return name;
+}
static void
st_widget_accessible_class_init (StWidgetAccessibleClass *klass)
@@ -2389,6 +2481,7 @@ st_widget_accessible_class_init (StWidgetAccessibleClass *klass)
atk_class->ref_state_set = st_widget_accessible_ref_state_set;
atk_class->initialize = st_widget_accessible_initialize;
atk_class->get_role = st_widget_accessible_get_role;
+ atk_class->get_name = st_widget_accessible_get_name;
g_type_class_add_private (gobject_class, sizeof (StWidgetAccessiblePrivate));
}
@@ -2414,6 +2507,14 @@ st_widget_accessible_dispose (GObject *gobject)
}
static void
+on_accessible_name_notify (GObject *gobject,
+ GParamSpec *pspec,
+ AtkObject *accessible)
+{
+ g_object_notify (G_OBJECT (accessible), "accessible-name");
+}
+
+static void
st_widget_accessible_initialize (AtkObject *obj,
gpointer data)
{
@@ -2431,6 +2532,10 @@ st_widget_accessible_initialize (AtkObject *obj,
G_CALLBACK (on_label_notify),
obj);
+ g_signal_connect (data, "notify::accessible-name",
+ G_CALLBACK (on_accessible_name_notify),
+ obj);
+
/* Check the cached selected state and notify the first selection.
* Ie: it is required to ensure a first notification when Alt+Tab
* popup appears
diff --git a/src/st/st-widget.h b/src/st/st-widget.h
index 3dd4519..17a5c60 100644
--- a/src/st/st-widget.h
+++ b/src/st/st-widget.h
@@ -164,6 +164,9 @@ void st_widget_add_accessible_state (StWidget *widget,
AtkStateType state);
void st_widget_remove_accessible_state (StWidget *widget,
AtkStateType state);
+void st_widget_set_accessible_name (StWidget *widget,
+ const gchar *name);
+const gchar * st_widget_get_accessible_name (StWidget *widget);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]