diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2012-06-07 23:27:01 -0400 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2012-06-07 23:50:34 -0400 |
commit | 6c5baeb7626eda6629fc6642c9eb513ef8bc5c8e (patch) | |
tree | db88221bacedc6853a9e853291acbd16f2c48ab8 | |
parent | d9fafc1f0f53139bbc3eef432c98ede145b6724d (diff) | |
download | nautilus-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.c | 111 | ||||
-rw-r--r-- | eel/eel-canvas.h | 16 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-canvas-item.c | 36 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-container.c | 126 |
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); } |