[gtk+/a11y] Convert GailNotebookPage to GtkNotebookPageAccessible
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/a11y] Convert GailNotebookPage to GtkNotebookPageAccessible
- Date: Fri, 1 Jul 2011 04:50:52 +0000 (UTC)
commit e9dc6f0e483b28e1566bb62431b9a8b0494576ed
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jul 1 00:10:39 2011 -0400
Convert GailNotebookPage to GtkNotebookPageAccessible
At the same time, drop the AtkText implementation, and simplify
accordingly. Test output has been updated to match.
gtk/a11y/Makefile.am | 4 +-
gtk/a11y/gailnotebookpage.c | 792 ----------------------------------
gtk/a11y/gailnotebookpage.h | 63 ---
gtk/a11y/gailwidget.c | 4 +-
gtk/a11y/gtknotebookaccessible.c | 6 +-
gtk/a11y/gtknotebookpageaccessible.c | 318 ++++++++++++++
gtk/a11y/gtknotebookpageaccessible.h | 61 +++
tests/a11y/about.txt | 8 +-
tests/a11y/notebook.txt | 68 +---
tests/a11y/pickers.txt | 4 +-
10 files changed, 393 insertions(+), 935 deletions(-)
---
diff --git a/gtk/a11y/Makefile.am b/gtk/a11y/Makefile.am
index 01f5cbc..4db9a34 100644
--- a/gtk/a11y/Makefile.am
+++ b/gtk/a11y/Makefile.am
@@ -26,7 +26,7 @@ gail_c_sources = \
gailmenushell.c \
gailmenuitem.c \
gtknotebookaccessible.c \
- gailnotebookpage.c \
+ gtknotebookpageaccessible.c \
gtkpanedaccessible.c \
gtkprogressbaraccessible.c \
gtkradiobuttonaccessible.c \
@@ -77,7 +77,7 @@ gail_private_h_sources = \
gailmenushell.h \
gailmenuitem.h \
gtknotebookaccessible.h \
- gailnotebookpage.h \
+ gtknotebookpageaccessible.h \
gtkpanedaccessible.h \
gtkprogressbaraccessible.h \
gtkradiobuttonaccessible.h \
diff --git a/gtk/a11y/gailwidget.c b/gtk/a11y/gailwidget.c
index bf0e5b3..2efdebf 100644
--- a/gtk/a11y/gailwidget.c
+++ b/gtk/a11y/gailwidget.c
@@ -26,7 +26,7 @@
#include <gdk/x11/gdkx.h>
#endif
#include "gailwidget.h"
-#include "gailnotebookpage.h"
+#include "gtknotebookpageaccessible.h"
extern GtkWidget *focus_widget;
@@ -525,7 +525,7 @@ gail_widget_get_index_in_parent (AtkObject *accessible)
parent = accessible->accessible_parent;
- if (GAIL_IS_NOTEBOOK_PAGE (parent))
+ if (GTK_IS_NOTEBOOK_PAGE_ACCESSIBLE (parent))
return 0;
else
{
diff --git a/gtk/a11y/gtknotebookaccessible.c b/gtk/a11y/gtknotebookaccessible.c
index 0b935b9..6a3eae7 100644
--- a/gtk/a11y/gtknotebookaccessible.c
+++ b/gtk/a11y/gtknotebookaccessible.c
@@ -22,7 +22,7 @@
#include <string.h>
#include <gtk/gtk.h>
#include "gtknotebookaccessible.h"
-#include "gailnotebookpage.h"
+#include "gtknotebookpageaccessible.h"
static void atk_selection_interface_init (AtkSelectionIface *iface);
@@ -92,7 +92,7 @@ create_notebook_page_accessible (GtkNotebookAccessible *accessible,
{
AtkObject *obj;
- obj = gail_notebook_page_new (accessible, child);
+ obj = gtk_notebook_page_accessible_new (accessible, child);
g_hash_table_insert (accessible->pages, child, obj);
atk_object_set_parent (obj, ATK_OBJECT (accessible));
g_signal_emit_by_name (accessible, "children_changed::add", page_num, obj, NULL);
@@ -127,7 +127,7 @@ page_removed_cb (GtkNotebook *notebook,
g_return_if_fail (obj);
g_signal_emit_by_name (accessible, "children_changed::remove",
page_num, obj, NULL);
- gail_notebook_page_invalidate (GAIL_NOTEBOOK_PAGE (obj));
+ gtk_notebook_page_accessible_invalidate (GTK_NOTEBOOK_PAGE_ACCESSIBLE (obj));
g_hash_table_remove (accessible->pages, widget);
}
diff --git a/gtk/a11y/gtknotebookpageaccessible.c b/gtk/a11y/gtknotebookpageaccessible.c
new file mode 100644
index 0000000..3e3dfc2
--- /dev/null
+++ b/gtk/a11y/gtknotebookpageaccessible.c
@@ -0,0 +1,318 @@
+/* GAIL - The GNOME Accessibility Implementation Library
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include "gtknotebookpageaccessible.h"
+
+
+static void atk_component_interface_init (AtkComponentIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GtkNotebookPageAccessible, gtk_notebook_page_accessible, ATK_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
+
+
+static GtkWidget *
+find_label_child (GtkContainer *container)
+{
+ GList *children, *tmp_list;
+ GtkWidget *child;
+
+ children = gtk_container_get_children (container);
+
+ child = NULL;
+ for (tmp_list = children; tmp_list != NULL; tmp_list = tmp_list->next)
+ {
+ if (GTK_IS_LABEL (tmp_list->data))
+ {
+ child = GTK_WIDGET (tmp_list->data);
+ break;
+ }
+ else if (GTK_IS_CONTAINER (tmp_list->data))
+ {
+ child = find_label_child (GTK_CONTAINER (tmp_list->data));
+ if (child)
+ break;
+ }
+ }
+ g_list_free (children);
+
+ return child;
+}
+
+static GtkWidget *
+get_label_from_notebook_page (GtkNotebookPageAccessible *page)
+{
+ GtkWidget *child;
+ GtkNotebook *notebook;
+
+ notebook = GTK_NOTEBOOK (gtk_accessible_get_widget (page->notebook));
+ if (!notebook)
+ return NULL;
+
+ if (!gtk_notebook_get_show_tabs (notebook))
+ return NULL;
+
+ child = gtk_notebook_get_tab_label (notebook, page->child);
+
+ if (GTK_IS_LABEL (child))
+ return child;
+
+ if (GTK_IS_CONTAINER (child))
+ child = find_label_child (GTK_CONTAINER (child));
+
+ return child;
+}
+
+static const gchar *
+gtk_notebook_page_accessible_get_name (AtkObject *accessible)
+{
+ GtkWidget *label;
+
+ if (accessible->name != NULL)
+ return accessible->name;
+
+ label = get_label_from_notebook_page (GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible));
+ if (GTK_IS_LABEL (label))
+ return gtk_label_get_text (GTK_LABEL (label));
+
+ return NULL;
+}
+
+static AtkObject *
+gtk_notebook_page_accessible_get_parent (AtkObject *accessible)
+{
+ GtkNotebookPageAccessible *page;
+
+ page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible);
+
+ return ATK_OBJECT (page->notebook);
+}
+
+static gint
+gtk_notebook_page_accessible_get_n_children (AtkObject *accessible)
+{
+ return 1;
+}
+
+static AtkObject *
+gtk_notebook_page_accessible_ref_child (AtkObject *accessible,
+ gint i)
+{
+ AtkObject *child_obj;
+ GtkNotebookPageAccessible *page = NULL;
+
+ if (i != 0)
+ return NULL;
+
+ page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible);
+ if (!page->child)
+ return NULL;
+
+ child_obj = gtk_widget_get_accessible (page->child);
+ g_object_ref (child_obj);
+
+ return child_obj;
+}
+
+static AtkStateSet *
+gtk_notebook_page_accessible_ref_state_set (AtkObject *accessible)
+{
+ AtkStateSet *state_set, *label_state_set, *merged_state_set;
+ AtkObject *atk_label;
+ GtkWidget *label;
+
+ state_set = ATK_OBJECT_CLASS (gtk_notebook_page_accessible_parent_class)->ref_state_set (accessible);
+
+ label = get_label_from_notebook_page (GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible));
+ if (label)
+ {
+ atk_label = gtk_widget_get_accessible (label);
+ label_state_set = atk_object_ref_state_set (atk_label);
+ merged_state_set = atk_state_set_or_sets (state_set, label_state_set);
+ g_object_unref (label_state_set);
+ g_object_unref (state_set);
+ }
+ else
+ {
+ AtkObject *child;
+
+ child = atk_object_ref_accessible_child (accessible, 0);
+ if (!child)
+ return state_set;
+
+ merged_state_set = state_set;
+ state_set = atk_object_ref_state_set (child);
+ if (atk_state_set_contains_state (state_set, ATK_STATE_VISIBLE))
+ {
+ atk_state_set_add_state (merged_state_set, ATK_STATE_VISIBLE);
+ if (atk_state_set_contains_state (state_set, ATK_STATE_ENABLED))
+ atk_state_set_add_state (merged_state_set, ATK_STATE_ENABLED);
+ if (atk_state_set_contains_state (state_set, ATK_STATE_SHOWING))
+ atk_state_set_add_state (merged_state_set, ATK_STATE_SHOWING);
+
+ }
+ g_object_unref (state_set);
+ g_object_unref (child);
+ }
+ return merged_state_set;
+}
+
+static gint
+gtk_notebook_page_accessible_get_index_in_parent (AtkObject *accessible)
+{
+ GtkNotebookPageAccessible *page;
+
+ page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (accessible);
+ if (!page->child)
+ return -1;
+
+ return gtk_notebook_page_num (GTK_NOTEBOOK (gtk_accessible_get_widget (page->notebook)),
+ page->child);
+}
+
+static void
+gtk_notebook_page_accessible_class_init (GtkNotebookPageAccessibleClass *klass)
+{
+ AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
+
+ class->get_name = gtk_notebook_page_accessible_get_name;
+ class->get_parent = gtk_notebook_page_accessible_get_parent;
+ class->get_n_children = gtk_notebook_page_accessible_get_n_children;
+ class->ref_child = gtk_notebook_page_accessible_ref_child;
+ class->ref_state_set = gtk_notebook_page_accessible_ref_state_set;
+ class->get_index_in_parent = gtk_notebook_page_accessible_get_index_in_parent;
+}
+
+static void
+gtk_notebook_page_accessible_init (GtkNotebookPageAccessible *page)
+{
+}
+
+static void
+notify_tab_label (GObject *object,
+ GParamSpec *pspec,
+ AtkObject *atk_obj)
+{
+ if (atk_obj->name == NULL)
+ g_object_notify (G_OBJECT (atk_obj), "accessible-name");
+ g_signal_emit_by_name (atk_obj, "visible-data-changed");
+}
+
+AtkObject *
+gtk_notebook_page_accessible_new (GtkNotebookAccessible *notebook,
+ GtkWidget *child)
+{
+ GObject *object;
+ AtkObject *atk_object;
+ GtkNotebookPageAccessible *page;
+
+ g_return_val_if_fail (GTK_IS_NOTEBOOK_ACCESSIBLE (notebook), NULL);
+ g_return_val_if_fail (GTK_WIDGET (child), NULL);
+
+ object = g_object_new (GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE, NULL);
+
+ page = GTK_NOTEBOOK_PAGE_ACCESSIBLE (object);
+ page->notebook = GTK_ACCESSIBLE (notebook);
+ page->child = child;
+
+ atk_object = ATK_OBJECT (page);
+ atk_object->role = ATK_ROLE_PAGE_TAB;
+ atk_object->layer = ATK_LAYER_WIDGET;
+
+ g_signal_connect (gtk_accessible_get_widget (page->notebook),
+ "child-notify::tab-label",
+ G_CALLBACK (notify_tab_label), page);
+
+ return atk_object;
+}
+
+void
+gtk_notebook_page_accessible_invalidate (GtkNotebookPageAccessible *page)
+{
+ AtkObject *obj = ATK_OBJECT (page);
+ GtkWidget *notebook;
+
+ notebook = gtk_accessible_get_widget (page->notebook);
+ if (notebook)
+ g_signal_handlers_disconnect_by_func (notebook, notify_tab_label, page);
+
+ atk_object_notify_state_change (obj, ATK_STATE_DEFUNCT, TRUE);
+ atk_object_set_parent (obj, NULL);
+ page->notebook = NULL;
+ page->child = NULL;
+}
+
+static AtkObject*
+gtk_notebook_page_accessible_ref_accessible_at_point (AtkComponent *component,
+ gint x,
+ gint y,
+ AtkCoordType coord_type)
+{
+ /* There is only one child so we return it */
+ AtkObject* child;
+
+ child = atk_object_ref_accessible_child (ATK_OBJECT (component), 0);
+
+ return child;
+}
+
+static void
+gtk_notebook_page_accessible_get_extents (AtkComponent *component,
+ gint *x,
+ gint *y,
+ gint *width,
+ gint *height,
+ AtkCoordType coord_type)
+{
+ GtkWidget *label;
+ AtkObject *atk_label;
+
+ label = get_label_from_notebook_page (GTK_NOTEBOOK_PAGE_ACCESSIBLE (component));
+ if (!label)
+ {
+ AtkObject *child;
+
+ *width = 0;
+ *height = 0;
+
+ child = atk_object_ref_accessible_child (ATK_OBJECT (component), 0);
+ if (!child)
+ return;
+
+ atk_component_get_position (ATK_COMPONENT (child), x, y, coord_type);
+ g_object_unref (child);
+ }
+ else
+ {
+ atk_label = gtk_widget_get_accessible (label);
+ atk_component_get_extents (ATK_COMPONENT (atk_label),
+ x, y, width, height, coord_type);
+ }
+}
+
+static void
+atk_component_interface_init (AtkComponentIface *iface)
+{
+ /* We use the default implementations for contains, get_position, get_size */
+ iface->ref_accessible_at_point = gtk_notebook_page_accessible_ref_accessible_at_point;
+ iface->get_extents = gtk_notebook_page_accessible_get_extents;
+}
diff --git a/gtk/a11y/gtknotebookpageaccessible.h b/gtk/a11y/gtknotebookpageaccessible.h
new file mode 100644
index 0000000..c402845
--- /dev/null
+++ b/gtk/a11y/gtknotebookpageaccessible.h
@@ -0,0 +1,61 @@
+/* GAIL - The GNOME Accessibility Implementation Library
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GTK_NOTEBOOK_PAGE_ACCESSIBLE_H__
+#define __GTK_NOTEBOOK_PAGE_ACCESSIBLE_H__
+
+#include "gtknotebookaccessible.h"
+#include "gailtextutil.h"
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE (gtk_notebook_page_accessible_get_type ())
+#define GTK_NOTEBOOK_PAGE_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE, GtkNotebookPageAccessible))
+#define GTK_NOTEBOOK_PAGE_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE, GtkNotebookPageAccessibleClass))
+#define GTK_IS_NOTEBOOK_PAGE_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE))
+#define GTK_IS_NOTEBOOK_PAGE_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE))
+#define GTK_NOTEBOOK_PAGE_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_NOTEBOOK_PAGE_ACCESSIBLE, GtkNotebookPageAccessibleClass))
+
+typedef struct _GtkNotebookPageAccessible GtkNotebookPageAccessible;
+typedef struct _GtkNotebookPageAccessibleClass GtkNotebookPageAccessibleClass;
+
+struct _GtkNotebookPageAccessible
+{
+ AtkObject parent;
+
+ GtkAccessible *notebook;
+
+ GtkWidget *child;
+};
+
+struct _GtkNotebookPageAccessibleClass
+{
+ AtkObjectClass parent_class;
+};
+
+GType gtk_notebook_page_accessible_get_type (void);
+
+AtkObject *gtk_notebook_page_accessible_new (GtkNotebookAccessible *notebook,
+ GtkWidget *child);
+
+void gtk_notebook_page_accessible_invalidate (GtkNotebookPageAccessible *page);
+
+G_END_DECLS
+
+#endif /* __GTK_NOTEBOOK_PAGE_ACCESSIBLE_H__ */
diff --git a/tests/a11y/about.txt b/tests/a11y/about.txt
index 49d5aa2..59dc07d 100644
--- a/tests/a11y/about.txt
+++ b/tests/a11y/about.txt
@@ -86,8 +86,8 @@ window1
layer: widget
alpha: 1
<AtkSelection>
- selected children: unnamed-GailNotebookPage-4
- unnamed-GailNotebookPage-4
+ selected children: unnamed-GtkNotebookPageAccessible-4
+ unnamed-GtkNotebookPageAccessible-4
"page tab"
parent: unnamed-GtkNotebookAccessible-3
index: 0
@@ -95,10 +95,6 @@ window1
<AtkComponent>
layer: widget
alpha: 1
- <AtkText>
- text: (null)
- character count: 0
- caret offset: 0
unnamed-GailContainer-5
"filler"
index: 0
diff --git a/tests/a11y/notebook.txt b/tests/a11y/notebook.txt
index bf6b116..6f5d744 100644
--- a/tests/a11y/notebook.txt
+++ b/tests/a11y/notebook.txt
@@ -16,8 +16,8 @@ window1
layer: widget
alpha: 1
<AtkSelection>
- selected children: Tab 1
- Tab 1
+ selected children: unnamed-GtkNotebookPageAccessible-0
+ unnamed-GtkNotebookPageAccessible-0
"page tab"
parent: notebook1
index: 0
@@ -26,37 +26,6 @@ window1
<AtkComponent>
layer: widget
alpha: 1
- <AtkText>
- text: Tab 1
- character count: 5
- caret offset: 0
- default attributes: bg-color: <omitted>
- bg-full-height: 0
- bg-stipple: false
- direction: <omitted>
- editable: false
- family-name: <omitted>
- fg-color: <omitted>
- fg-stipple: false
- indent: 0
- invisible: false
- justification: left
- language: <omitted>
- left-margin: 0
- pixels-above-lines: 0
- pixels-below-lines: 0
- pixels-inside-wrap: 0
- right-margin: 0
- rise: 0
- scale: 1
- size: <omitted>
- stretch: <omitted>
- strikethrough: false
- style: <omitted>
- underline: none
- variant: <omitted>
- weight: <omitted>
- wrap-mode: word
page1
"push button"
index: 0
@@ -103,7 +72,7 @@ window1
<AtkAction>
action 0 name: click
action 0 keybinding: <Alt>y
- Tab 2
+ unnamed-GtkNotebookPageAccessible-1
"page tab"
parent: notebook1
index: 1
@@ -112,37 +81,6 @@ window1
<AtkComponent>
layer: widget
alpha: 1
- <AtkText>
- text: Tab 2
- character count: 5
- caret offset: 0
- default attributes: bg-color: <omitted>
- bg-full-height: 0
- bg-stipple: false
- direction: <omitted>
- editable: false
- family-name: <omitted>
- fg-color: <omitted>
- fg-stipple: false
- indent: 0
- invisible: false
- justification: left
- language: <omitted>
- left-margin: 0
- pixels-above-lines: 0
- pixels-below-lines: 0
- pixels-inside-wrap: 0
- right-margin: 0
- rise: 0
- scale: 1
- size: <omitted>
- stretch: <omitted>
- strikethrough: false
- style: <omitted>
- underline: none
- variant: <omitted>
- weight: <omitted>
- wrap-mode: word
page2
"push button"
index: 1
diff --git a/tests/a11y/pickers.txt b/tests/a11y/pickers.txt
index 4ef41f7..e5e3ce0 100644
--- a/tests/a11y/pickers.txt
+++ b/tests/a11y/pickers.txt
@@ -70,7 +70,7 @@ window1
image description: (null)
<AtkAction>
action 0 name: click
- unnamed-GailComboBox-0
+ unnamed-GtkComboBoxAccessible-0
"combo box"
parent: button4
index: 1
@@ -84,7 +84,7 @@ window1
<AtkSelection>
unnamed-GailMenu-1
"menu"
- parent: unnamed-GailComboBox-0
+ parent: unnamed-GtkComboBoxAccessible-0
index: 0
state: enabled selectable sensitive
toolkit: gail
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]