summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2006-06-12 03:53:19 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2006-06-12 03:53:19 +0000
commit12ea9660091c6e9db2dd7258240cb39ba453ea16 (patch)
tree1363f35489d7f948399c7cc8fd96647f0b3fac33
parent35756b38644511ec02ffa10ab482204a38215733 (diff)
downloadgdk-pixbuf-12ea9660091c6e9db2dd7258240cb39ba453ea16.tar.gz
Add an accessible implementation in order to make the buttons visible to
2006-06-11 Matthias Clasen <mclasen@redhat.com> * gtk/gtkassistant.c: Add an accessible implementation in order to make the buttons visible to a11y tools. (pointed out by David Malcolm)
-rw-r--r--ChangeLog4
-rw-r--r--ChangeLog.pre-2-104
-rw-r--r--gtk/gtkassistant.c190
3 files changed, 198 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 894a62adf..d03bd08f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2006-06-11 Matthias Clasen <mclasen@redhat.com>
+ * gtk/gtkassistant.c: Add an accessible implementation in
+ order to make the buttons visible to a11y tools. (pointed out
+ by David Malcolm)
+
* gtk/gtkprintoperation-win32.c: Store scale as a percentage.
(#344560, Christian Persch)
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 894a62adf..d03bd08f0 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,5 +1,9 @@
2006-06-11 Matthias Clasen <mclasen@redhat.com>
+ * gtk/gtkassistant.c: Add an accessible implementation in
+ order to make the buttons visible to a11y tools. (pointed out
+ by David Malcolm)
+
* gtk/gtkprintoperation-win32.c: Store scale as a percentage.
(#344560, Christian Persch)
diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c
index ee353d81e..bdbcc6e57 100644
--- a/gtk/gtkassistant.c
+++ b/gtk/gtkassistant.c
@@ -25,8 +25,11 @@
#include <config.h>
+#include <atk/atk.h>
+
#include "gtkassistant.h"
+#include "gtkaccessible.h"
#include "gtkbutton.h"
#include "gtkhbox.h"
#include "gtkhbbox.h"
@@ -114,6 +117,8 @@ static void gtk_assistant_get_child_property (GtkContainer *container,
GValue *value,
GParamSpec *pspec);
+static AtkObject *gtk_assistant_get_accessible (GtkWidget *widget);
+
enum
{
CHILD_PROP_0,
@@ -162,6 +167,7 @@ gtk_assistant_class_init (GtkAssistantClass *class)
widget_class->delete_event = gtk_assistant_delete_event;
widget_class->expose_event = gtk_assistant_expose;
widget_class->focus = gtk_assistant_focus;
+ widget_class->get_accessible = gtk_assistant_get_accessible;
container_class->add = gtk_assistant_add;
container_class->remove = gtk_assistant_remove;
@@ -2161,5 +2167,189 @@ gtk_assistant_update_buttons_state (GtkAssistant *assistant)
}
+
+/* accessible implementation */
+
+static gint
+gtk_assistant_accessible_get_n_children (AtkObject *accessible)
+{
+ GtkAssistant *assistant;
+ GtkWidget *widget;
+
+ widget = GTK_ACCESSIBLE (accessible)->widget;
+
+ if (!widget)
+ return 0;
+
+ assistant = GTK_ASSISTANT (widget);
+
+ return g_list_length (assistant->priv->pages) + 1;
+}
+
+
+static AtkObject *
+gtk_assistant_accessible_ref_child (AtkObject *accessible,
+ gint index)
+{
+ GtkAssistant *assistant;
+ GtkAssistantPrivate *priv;
+ GtkWidget *widget, *child;
+ gint n_pages;
+ AtkObject *obj;
+
+ widget = GTK_ACCESSIBLE (accessible)->widget;
+ if (!widget)
+ return NULL;
+
+ assistant = GTK_ASSISTANT (widget);
+ priv = assistant->priv;
+ n_pages = g_list_length (priv->pages);
+
+ if (index < 0)
+ return NULL;
+ else if (index < n_pages)
+ {
+ GtkAssistantPage *page = g_list_nth_data (priv->pages, index / 2);
+
+ child = page->page;
+ }
+ else if (index == n_pages)
+ {
+ child = priv->action_area;
+ }
+ else
+ return NULL;
+
+ obj = gtk_widget_get_accessible (child);
+
+ return g_object_ref (obj);
+}
+
+static void
+gtk_assistant_accessible_class_init (AtkObjectClass *class)
+{
+ class->get_n_children = gtk_assistant_accessible_get_n_children;
+ class->ref_child = gtk_assistant_accessible_ref_child;
+}
+
+static GType
+gtk_assistant_accessible_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type)
+ {
+ /*
+ * Figure out the size of the class and instance
+ * we are deriving from
+ */
+ AtkObjectFactory *factory;
+ GType derived_type;
+ GTypeQuery query;
+ GType derived_atk_type;
+
+ derived_type = g_type_parent (GTK_TYPE_ASSISTANT);
+ factory = atk_registry_get_factory (atk_get_default_registry (),
+ derived_type);
+ derived_atk_type = atk_object_factory_get_accessible_type (factory);
+ g_type_query (derived_atk_type, &query);
+
+ type = g_type_register_static_simple (derived_atk_type,
+ "GtkAssistantAccessible",
+ query.class_size,
+ (GClassInitFunc) gtk_assistant_accessible_class_init,
+ query.instance_size,
+ NULL, 0);
+ }
+
+ return type;
+}
+
+static AtkObject *
+gtk_assistant_accessible_new (GObject *obj)
+{
+ AtkObject *accessible;
+
+ g_return_val_if_fail (GTK_IS_ASSISTANT (obj), NULL);
+
+ accessible = g_object_new (gtk_assistant_accessible_get_type (), NULL);
+ atk_object_initialize (accessible, obj);
+
+ return accessible;
+}
+
+static GType
+gtk_assistant_accessible_factory_get_accessible_type (void)
+{
+ return gtk_assistant_accessible_get_type ();
+}
+
+static AtkObject*
+gtk_assistant_accessible_factory_create_accessible (GObject *obj)
+{
+ return gtk_assistant_accessible_new (obj);
+}
+
+static void
+gtk_assistant_accessible_factory_class_init (AtkObjectFactoryClass *class)
+{
+ class->create_accessible = gtk_assistant_accessible_factory_create_accessible;
+ class->get_accessible_type = gtk_assistant_accessible_factory_get_accessible_type;
+}
+
+static GType
+gtk_assistant_accessible_factory_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type)
+ {
+ type = g_type_register_static_simple (ATK_TYPE_OBJECT_FACTORY,
+ "GtkAssistantAccessibleFactory",
+ sizeof (AtkObjectFactoryClass),
+ (GClassInitFunc) gtk_assistant_accessible_factory_class_init,
+ sizeof (AtkObjectFactory),
+ NULL, 0);
+ }
+
+ return type;
+}
+
+static AtkObject *
+gtk_assistant_get_accessible (GtkWidget *widget)
+{
+ static gboolean first_time = TRUE;
+
+ if (first_time)
+ {
+ AtkObjectFactory *factory;
+ AtkRegistry *registry;
+ GType derived_type;
+ GType derived_atk_type;
+
+ /*
+ * Figure out whether accessibility is enabled by looking at the
+ * type of the accessible object which would be created for
+ * the parent type of GtkAssistant.
+ */
+ derived_type = g_type_parent (GTK_TYPE_ASSISTANT);
+
+ registry = atk_get_default_registry ();
+ factory = atk_registry_get_factory (registry,
+ derived_type);
+ derived_atk_type = atk_object_factory_get_accessible_type (factory);
+ if (g_type_is_a (derived_atk_type, GTK_TYPE_ACCESSIBLE))
+ {
+ atk_registry_set_factory_type (registry,
+ GTK_TYPE_ASSISTANT,
+ gtk_assistant_accessible_factory_get_type ());
+ }
+ first_time = FALSE;
+ }
+
+ return GTK_WIDGET_CLASS (gtk_assistant_parent_class)->get_accessible (widget);
+}
+
+
#define __GTK_ASSISTANT_C__
#include "gtkaliasdef.c"