summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-06-07 23:27:01 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-06-07 23:50:34 -0400
commit6c5baeb7626eda6629fc6642c9eb513ef8bc5c8e (patch)
treedb88221bacedc6853a9e853291acbd16f2c48ab8
parentd9fafc1f0f53139bbc3eef432c98ede145b6724d (diff)
downloadnautilus-6c5baeb7626eda6629fc6642c9eb513ef8bc5c8e.tar.gz
a11y: fix accessibility implementation for NautilusIconContainer
Clean up a11y code and make sure inheritance for EelCanvasAccessible->NautilusIconContainerAccessible and for EelCanvasItemAccessible->NautilusIconCanvasItemAccessible work properly. This makes the ATK state machinery in EelCanvasItemAccessible work again, which fixes https://bugzilla.gnome.org/show_bug.cgi?id=677509
-rw-r--r--eel/eel-canvas.c111
-rw-r--r--eel/eel-canvas.h16
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.c36
-rw-r--r--libnautilus-private/nautilus-icon-container.c126
4 files changed, 103 insertions, 186 deletions
diff --git a/eel/eel-canvas.c b/eel/eel-canvas.c
index ebca1bbde..a17bbf79a 100644
--- a/eel/eel-canvas.c
+++ b/eel/eel-canvas.c
@@ -4122,74 +4122,32 @@ eel_canvas_item_accessible_ref_state_set (AtkObject *accessible)
}
static void
-eel_canvas_item_accessible_class_init (AtkObjectClass *klass)
+eel_canvas_item_accessible_class_init (EelCanvasItemAccessibleClass *klass)
{
+ AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass);
+
accessible_item_parent_class = g_type_class_peek_parent (klass);
- klass->initialize = eel_canvas_item_accessible_initialize;
- klass->ref_state_set = eel_canvas_item_accessible_ref_state_set;
+ atk_class->initialize = eel_canvas_item_accessible_initialize;
+ atk_class->ref_state_set = eel_canvas_item_accessible_ref_state_set;
}
-static GType
-eel_canvas_item_accessible_get_type (void)
+static void
+eel_canvas_item_accessible_init (EelCanvasItemAccessible *self)
{
- static GType type = 0;
-
- if (!type) {
- static const GInterfaceInfo atk_component_info = {
- (GInterfaceInitFunc) eel_canvas_item_accessible_component_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
- AtkObjectFactory *factory;
- GType parent_atk_type;
- GTypeQuery query;
- GTypeInfo tinfo = { 0 };
-
- factory = atk_registry_get_factory (atk_get_default_registry(),
- G_TYPE_INITIALLY_UNOWNED);
- if (!factory) {
- return G_TYPE_INVALID;
- }
- parent_atk_type = atk_object_factory_get_accessible_type (factory);
- if (!parent_atk_type) {
- return G_TYPE_INVALID;
- }
- g_type_query (parent_atk_type, &query);
- tinfo.class_init = (GClassInitFunc) eel_canvas_item_accessible_class_init;
- tinfo.class_size = query.class_size;
- tinfo.instance_size = query.instance_size;
- type = g_type_register_static (parent_atk_type,
- "EelCanvasItemAccessibility",
- &tinfo, 0);
-
- g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
- &atk_component_info);
-
- }
- return type;
}
-static AtkObject *
-eel_canvas_item_accessible_create (GObject *for_object)
-{
- GType type;
- AtkObject *accessible;
- EelCanvasItem *item;
-
- item = EEL_CANVAS_ITEM (for_object);
- g_return_val_if_fail (item != NULL, NULL);
+G_DEFINE_TYPE_WITH_CODE (EelCanvasItemAccessible,
+ eel_canvas_item_accessible,
+ ATK_TYPE_GOBJECT_ACCESSIBLE,
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT,
+ eel_canvas_item_accessible_component_interface_init));
- type = eel_canvas_item_accessible_get_type ();
- if (type == G_TYPE_INVALID) {
- return atk_no_op_object_new (for_object);
- }
-
- accessible = g_object_new (type, NULL);
- atk_object_initialize (accessible, for_object);
- return accessible;
-}
+typedef AtkObjectFactory EelCanvasItemAccessibleFactory;
+typedef AtkObjectFactoryClass EelCanvasItemAccessibleFactoryClass;
+G_DEFINE_TYPE (EelCanvasItemAccessibleFactory, eel_canvas_item_accessible_factory,
+ ATK_TYPE_OBJECT_FACTORY)
static GType
eel_canvas_item_accessible_factory_get_accessible_type (void)
@@ -4198,15 +4156,19 @@ eel_canvas_item_accessible_factory_get_accessible_type (void)
}
static AtkObject*
-eel_canvas_item_accessible_factory_create_accessible (GObject *obj)
+eel_canvas_item_accessible_factory_create_accessible (GObject *for_object)
{
AtkObject *accessible;
- g_return_val_if_fail (G_IS_OBJECT (obj), NULL);
+ accessible = g_object_new (eel_canvas_item_accessible_get_type (), NULL);
+ atk_object_initialize (accessible, for_object);
+ return accessible;
+}
- accessible = eel_canvas_item_accessible_create (obj);
+static void
+eel_canvas_item_accessible_factory_init (EelCanvasItemAccessibleFactory *self)
+{
- return accessible;
}
static void
@@ -4215,31 +4177,6 @@ eel_canvas_item_accessible_factory_class_init (AtkObjectFactoryClass *klass)
klass->create_accessible = eel_canvas_item_accessible_factory_create_accessible;
klass->get_accessible_type = eel_canvas_item_accessible_factory_get_accessible_type;
}
-
-static GType
-eel_canvas_item_accessible_factory_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo tinfo = {
- sizeof (AtkObjectFactoryClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) eel_canvas_item_accessible_factory_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (AtkObjectFactory),
- 0, /* n_preallocs */
- NULL
- };
- type = g_type_register_static (ATK_TYPE_OBJECT_FACTORY,
- "EelCanvasItemAccessibilityFactory",
- &tinfo, 0);
- }
-
- return type;
-}
/* Class initialization function for EelCanvasItemClass */
static void
diff --git a/eel/eel-canvas.h b/eel/eel-canvas.h
index 1853936bf..685bfa6a1 100644
--- a/eel/eel-canvas.h
+++ b/eel/eel-canvas.h
@@ -515,7 +515,7 @@ void eel_canvas_world_to_window (EelCanvas *canvas,
double worldx, double worldy, double *winx, double *winy);
/* Accessible implementation */
-GType eel_canvas_accessible_get_type(void);
+GType eel_canvas_accessible_get_type (void);
typedef struct _EelCanvasAccessible EelCanvasAccessible;
struct _EelCanvasAccessible
@@ -529,6 +529,20 @@ struct _EelCanvasAccessibleClass
GtkAccessibleClass parent_class;
};
+GType eel_canvas_item_accessible_get_type (void);
+
+typedef struct _EelCanvasItemAccessible EelCanvasItemAccessible;
+struct _EelCanvasItemAccessible
+{
+ GtkAccessible parent;
+};
+
+typedef struct _EelCanvasItemAccessibleClass EelCanvasItemAccessibleClass;
+struct _EelCanvasItemAccessibleClass
+{
+ GtkAccessibleClass parent_class;
+};
+
G_END_DECLS
#endif
diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c
index 2a1a127c8..fbe2d26de 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.c
+++ b/libnautilus-private/nautilus-icon-canvas-item.c
@@ -2196,12 +2196,16 @@ typedef struct {
gint action_number;
} NautilusIconCanvasItemAccessibleActionContext;
-static GType nautilus_icon_canvas_item_accessible_get_type (void);
+typedef struct {
+ EelCanvasItemAccessible parent;
+ NautilusIconCanvasItemAccessiblePrivate *priv;
+} NautilusIconCanvasItemAccessible;
+
+typedef struct {
+ EelCanvasItemAccessibleClass parent_class;
+} NautilusIconCanvasItemAccessibleClass;
-#define GET_PRIV(o) \
- G_TYPE_INSTANCE_GET_PRIVATE(o,\
- nautilus_icon_canvas_item_accessible_get_type (),\
- NautilusIconCanvasItemAccessiblePrivate);
+#define GET_ACCESSIBLE_PRIV(o) ((NautilusIconCanvasItemAccessible *) o)->priv;
/* accessible AtkAction interface */
static gboolean
@@ -2303,7 +2307,7 @@ nautilus_icon_canvas_item_accessible_action_get_description (AtkAction *accessib
g_assert (i < LAST_ACTION);
- priv = GET_PRIV (accessible);
+ priv = GET_ACCESSIBLE_PRIV (accessible);
if (priv->action_descriptions[i]) {
return priv->action_descriptions[i];
@@ -2338,7 +2342,7 @@ nautilus_icon_canvas_item_accessible_action_set_description (AtkAction *accessib
g_assert (i < LAST_ACTION);
- priv = GET_PRIV (accessible);
+ priv = GET_ACCESSIBLE_PRIV (accessible);
if (priv->action_descriptions[i]) {
g_free (priv->action_descriptions[i]);
@@ -2442,7 +2446,7 @@ nautilus_icon_canvas_item_accessible_get_image_description (AtkImage *image)
NautilusIconContainer *container;
char *description;
- priv = GET_PRIV (image);
+ priv = GET_ACCESSIBLE_PRIV (image);
if (priv->image_description) {
return priv->image_description;
@@ -2521,7 +2525,7 @@ nautilus_icon_canvas_item_accessible_set_image_description (AtkImage *image,
{
NautilusIconCanvasItemAccessiblePrivate *priv;
- priv = GET_PRIV (image);
+ priv = GET_ACCESSIBLE_PRIV (image);
g_free (priv->image_description);
priv->image_description = g_strdup (description);
@@ -2735,17 +2739,9 @@ nautilus_icon_canvas_item_accessible_text_interface_init (AtkTextIface *iface)
iface->get_offset_at_point = nautilus_icon_canvas_item_accessible_get_offset_at_point;
}
-typedef struct {
- AtkGObjectAccessible parent;
-} NautilusIconCanvasItemAccessible;
-
-typedef struct {
- AtkGObjectAccessibleClass parent_class;
-} NautilusIconCanvasItemAccessibleClass;
-
G_DEFINE_TYPE_WITH_CODE (NautilusIconCanvasItemAccessible,
nautilus_icon_canvas_item_accessible,
- ATK_TYPE_GOBJECT_ACCESSIBLE,
+ eel_canvas_item_accessible_get_type (),
G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE,
nautilus_icon_canvas_item_accessible_image_interface_init)
G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT,
@@ -2808,7 +2804,7 @@ nautilus_icon_canvas_item_accessible_finalize (GObject *object)
NautilusIconCanvasItemAccessiblePrivate *priv;
int i;
- priv = GET_PRIV (object);
+ priv = GET_ACCESSIBLE_PRIV (object);
for (i = 0; i < LAST_ACTION; i++) {
g_free (priv->action_descriptions[i]);
@@ -2850,6 +2846,8 @@ nautilus_icon_canvas_item_accessible_class_init (NautilusIconCanvasItemAccessibl
static void
nautilus_icon_canvas_item_accessible_init (NautilusIconCanvasItemAccessible *self)
{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, nautilus_icon_canvas_item_accessible_get_type (),
+ NautilusIconCanvasItemAccessiblePrivate);
}
/* dummy typedef */
diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index 1a06c815f..d6a59a5ac 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -205,10 +205,6 @@ static int compare_icons_vertical (NautilusIconContainer *container,
static void store_layout_timestamps_now (NautilusIconContainer *container);
static void remove_search_entry_timeout (NautilusIconContainer *container);
-static gpointer accessible_parent_class;
-
-static GQuark accessible_private_data_quark = 0;
-
static const char *nautilus_icon_container_accessible_action_names[] = {
"activate",
"menu",
@@ -8479,20 +8475,16 @@ nautilus_icon_container_set_highlighted_for_clipboard (NautilusIconContainer *co
}
/* NautilusIconContainerAccessible */
-
-static NautilusIconContainerAccessiblePrivate *
-accessible_get_priv (AtkObject *accessible)
-{
+typedef struct {
+ EelCanvasAccessible parent;
NautilusIconContainerAccessiblePrivate *priv;
-
- priv = g_object_get_qdata (G_OBJECT (accessible),
- accessible_private_data_quark);
+} NautilusIconContainerAccessible;
- return priv;
-}
+typedef EelCanvasAccessibleClass NautilusIconContainerAccessibleClass;
-/* AtkAction interface */
+#define GET_ACCESSIBLE_PRIV(o) ((NautilusIconContainerAccessible *) o)->priv
+/* AtkAction interface */
static gboolean
nautilus_icon_container_accessible_do_action (AtkAction *accessible, int i)
{
@@ -8541,7 +8533,7 @@ nautilus_icon_container_accessible_action_get_description (AtkAction *accessible
g_assert (i < LAST_ACTION);
- priv = accessible_get_priv (ATK_OBJECT (accessible));
+ priv = GET_ACCESSIBLE_PRIV (accessible);
if (priv->action_descriptions[i]) {
return priv->action_descriptions[i];
@@ -8576,7 +8568,7 @@ nautilus_icon_container_accessible_action_set_description (AtkAction *accessible
g_assert (i < LAST_ACTION);
- priv = accessible_get_priv (ATK_OBJECT (accessible));
+ priv = GET_ACCESSIBLE_PRIV (accessible);
if (priv->action_descriptions[i]) {
g_free (priv->action_descriptions[i]);
@@ -8608,8 +8600,7 @@ nautilus_icon_container_accessible_update_selection (AtkObject *accessible)
NautilusIcon *icon;
container = NAUTILUS_ICON_CONTAINER (gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)));
-
- priv = accessible_get_priv (accessible);
+ priv = GET_ACCESSIBLE_PRIV (accessible);
if (priv->selection) {
g_list_free (priv->selection);
@@ -8685,7 +8676,6 @@ nautilus_icon_container_accessible_cleared_cb (NautilusIconContainer *container,
g_signal_emit_by_name (data, "children_changed", 0, NULL, NULL);
}
-
static gboolean
nautilus_icon_container_accessible_add_selection (AtkSelection *accessible,
int i)
@@ -8741,13 +8731,13 @@ static AtkObject *
nautilus_icon_container_accessible_ref_selection (AtkSelection *accessible,
int i)
{
- AtkObject *atk_object;
NautilusIconContainerAccessiblePrivate *priv;
+ AtkObject *atk_object;
GList *item;
NautilusIcon *icon;
nautilus_icon_container_accessible_update_selection (ATK_OBJECT (accessible));
- priv = accessible_get_priv (ATK_OBJECT (accessible));
+ priv = GET_ACCESSIBLE_PRIV (accessible);
item = (g_list_nth (priv->selection, i));
@@ -8767,14 +8757,13 @@ nautilus_icon_container_accessible_ref_selection (AtkSelection *accessible,
static int
nautilus_icon_container_accessible_get_selection_count (AtkSelection *accessible)
{
- int count;
NautilusIconContainerAccessiblePrivate *priv;
+ int count;
+ priv = GET_ACCESSIBLE_PRIV (accessible);
nautilus_icon_container_accessible_update_selection (ATK_OBJECT (accessible));
- priv = accessible_get_priv (ATK_OBJECT (accessible));
-
count = g_list_length (priv->selection);
-
+
return count;
}
@@ -8806,8 +8795,8 @@ static gboolean
nautilus_icon_container_accessible_remove_selection (AtkSelection *accessible,
int i)
{
- NautilusIconContainer *container;
NautilusIconContainerAccessiblePrivate *priv;
+ NautilusIconContainer *container;
GList *l;
GList *selection;
NautilusIcon *icon;
@@ -8818,11 +8807,10 @@ nautilus_icon_container_accessible_remove_selection (AtkSelection *accessible,
return FALSE;
}
+ container = NAUTILUS_ICON_CONTAINER (widget);
nautilus_icon_container_accessible_update_selection (ATK_OBJECT (accessible));
- priv = accessible_get_priv (ATK_OBJECT (accessible));
- container = NAUTILUS_ICON_CONTAINER (widget);
-
+ priv = GET_ACCESSIBLE_PRIV (accessible);
l = g_list_nth (priv->selection, i);
if (l) {
icon = l->data;
@@ -8908,6 +8896,7 @@ nautilus_icon_container_accessible_get_n_children (AtkObject *accessible)
if (container->details->rename_widget) {
i++;
}
+
return i;
}
@@ -8934,7 +8923,7 @@ nautilus_icon_container_accessible_ref_child (AtkObject *accessible, int i)
atk_object = atk_gobject_accessible_for_object (G_OBJECT (icon->item));
g_object_ref (atk_object);
-
+
return atk_object;
} else {
if (i == g_list_length (container->details->icons)) {
@@ -8949,37 +8938,36 @@ nautilus_icon_container_accessible_ref_child (AtkObject *accessible, int i)
}
}
+G_DEFINE_TYPE_WITH_CODE (NautilusIconContainerAccessible, nautilus_icon_container_accessible,
+ eel_canvas_accessible_get_type (),
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, nautilus_icon_container_accessible_action_interface_init)
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, nautilus_icon_container_accessible_selection_interface_init))
+
static void
nautilus_icon_container_accessible_initialize (AtkObject *accessible,
gpointer data)
{
NautilusIconContainer *container;
- NautilusIconContainerAccessiblePrivate *priv;
- if (ATK_OBJECT_CLASS (accessible_parent_class)->initialize) {
- ATK_OBJECT_CLASS (accessible_parent_class)->initialize (accessible, data);
+ if (ATK_OBJECT_CLASS (nautilus_icon_container_accessible_parent_class)->initialize) {
+ ATK_OBJECT_CLASS (nautilus_icon_container_accessible_parent_class)->initialize (accessible, data);
}
- priv = g_new0 (NautilusIconContainerAccessiblePrivate, 1);
- g_object_set_qdata (G_OBJECT (accessible),
- accessible_private_data_quark,
- priv);
-
if (GTK_IS_ACCESSIBLE (accessible)) {
nautilus_icon_container_accessible_update_selection
(ATK_OBJECT (accessible));
container = NAUTILUS_ICON_CONTAINER (gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)));
- g_signal_connect (G_OBJECT (container), "selection_changed",
+ g_signal_connect (container, "selection_changed",
G_CALLBACK (nautilus_icon_container_accessible_selection_changed_cb),
accessible);
- g_signal_connect (G_OBJECT (container), "icon_added",
+ g_signal_connect (container, "icon_added",
G_CALLBACK (nautilus_icon_container_accessible_icon_added_cb),
accessible);
- g_signal_connect (G_OBJECT (container), "icon_removed",
+ g_signal_connect (container, "icon_removed",
G_CALLBACK (nautilus_icon_container_accessible_icon_removed_cb),
accessible);
- g_signal_connect (G_OBJECT (container), "cleared",
+ g_signal_connect (container, "cleared",
G_CALLBACK (nautilus_icon_container_accessible_cleared_cb),
accessible);
}
@@ -8991,7 +8979,8 @@ nautilus_icon_container_accessible_finalize (GObject *object)
NautilusIconContainerAccessiblePrivate *priv;
int i;
- priv = accessible_get_priv (ATK_OBJECT (object));
+ priv = GET_ACCESSIBLE_PRIV (object);
+
if (priv->selection) {
g_list_free (priv->selection);
}
@@ -9001,63 +8990,42 @@ nautilus_icon_container_accessible_finalize (GObject *object)
g_free (priv->action_descriptions[i]);
}
}
-
- g_free (priv);
- G_OBJECT_CLASS (accessible_parent_class)->finalize (object);
+ G_OBJECT_CLASS (nautilus_icon_container_accessible_parent_class)->finalize (object);
}
static void
-nautilus_icon_container_accessible_class_init (AtkObjectClass *klass)
+nautilus_icon_container_accessible_init (NautilusIconContainerAccessible *self)
{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, nautilus_icon_container_accessible_get_type (),
+ NautilusIconContainerAccessiblePrivate);
+}
- accessible_parent_class = g_type_class_peek_parent (klass);
+static void
+nautilus_icon_container_accessible_class_init (NautilusIconContainerAccessibleClass *klass)
+{
+ AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = nautilus_icon_container_accessible_finalize;
- klass->get_n_children = nautilus_icon_container_accessible_get_n_children;
- klass->ref_child = nautilus_icon_container_accessible_ref_child;
- klass->initialize = nautilus_icon_container_accessible_initialize;
+ atk_class->get_n_children = nautilus_icon_container_accessible_get_n_children;
+ atk_class->ref_child = nautilus_icon_container_accessible_ref_child;
+ atk_class->initialize = nautilus_icon_container_accessible_initialize;
- accessible_private_data_quark = g_quark_from_static_string ("icon-container-accessible-private-data");
+ g_type_class_add_private (klass, sizeof (NautilusIconContainerAccessiblePrivate));
}
static AtkObject *
get_accessible (GtkWidget *widget)
{
- static GType type = 0;
AtkObject *accessible;
if ((accessible = eel_accessibility_get_atk_object (widget))) {
return accessible;
}
- if (!type) {
- const GInterfaceInfo atk_action_info = {
- (GInterfaceInitFunc) nautilus_icon_container_accessible_action_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- const GInterfaceInfo atk_selection_info = {
- (GInterfaceInitFunc) nautilus_icon_container_accessible_selection_interface_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL
- };
-
- type = eel_accessibility_create_accessible_gtype
- ("NautilusIconContainerAccessible",
- widget,
- (GClassInitFunc) nautilus_icon_container_accessible_class_init);
-
- g_type_add_interface_static (type, ATK_TYPE_ACTION,
- &atk_action_info);
- g_type_add_interface_static (type, ATK_TYPE_SELECTION,
- &atk_selection_info);
- }
-
- accessible = g_object_new (type, "widget", widget, NULL);
+ accessible = g_object_new (nautilus_icon_container_accessible_get_type (), "widget", widget, NULL);
return eel_accessibility_set_atk_object_return (widget, accessible);
}