[gtk+] Convert GailToplevel to GtkToplevelAccessible
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Convert GailToplevel to GtkToplevelAccessible
- Date: Sat, 9 Jul 2011 02:39:36 +0000 (UTC)
commit 56fb725a7e99f89a2f939b457ebe160c5c5fede2
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jul 8 22:39:00 2011 -0400
Convert GailToplevel to GtkToplevelAccessible
gtk/a11y/Makefile.am | 4 +-
gtk/a11y/gail.c | 1 -
gtk/a11y/gailtoplevel.c | 368 --------------------------------------
gtk/a11y/gailtoplevel.h | 52 ------
gtk/a11y/gailutil.c | 6 +-
gtk/a11y/gtktoplevelaccessible.c | 283 +++++++++++++++++++++++++++++
gtk/a11y/gtktoplevelaccessible.h | 52 ++++++
gtk/a11y/gtkwindowaccessible.c | 6 +-
8 files changed, 343 insertions(+), 429 deletions(-)
---
diff --git a/gtk/a11y/Makefile.am b/gtk/a11y/Makefile.am
index 05f04d7..e9e96e1 100644
--- a/gtk/a11y/Makefile.am
+++ b/gtk/a11y/Makefile.am
@@ -46,7 +46,7 @@ gail_c_sources = \
gailtextcell.c \
gtktextviewaccessible.c \
gtktogglebuttonaccessible.c \
- gailtoplevel.c \
+ gtktoplevelaccessible.c \
gtktreeviewaccessible.c \
gailutil.c \
gtkwidgetaccessible.c \
@@ -97,7 +97,7 @@ gail_private_h_sources = \
gailtextcell.h \
gtktextviewaccessible.h \
gtktogglebuttonaccessible.h \
- gailtoplevel.h \
+ gtktoplevelaccessible.h \
gtktreeviewaccessible.h \
gailutil.h \
gtkwindowaccessible.h
diff --git a/gtk/a11y/gail.c b/gtk/a11y/gail.c
index f15e878..06d8b5e 100644
--- a/gtk/a11y/gail.c
+++ b/gtk/a11y/gail.c
@@ -23,7 +23,6 @@
#include <stdlib.h>
#include <gtk/gtkx.h>
-#include "gailtoplevel.h"
#include "gailutil.h"
diff --git a/gtk/a11y/gailutil.c b/gtk/a11y/gailutil.c
index b443426..053f148 100644
--- a/gtk/a11y/gailutil.c
+++ b/gtk/a11y/gailutil.c
@@ -23,7 +23,7 @@
#include <string.h>
#include <gtk/gtk.h>
#include "gailutil.h"
-#include "gailtoplevel.h"
+#include "gtktoplevelaccessible.h"
#include "gtkwindowaccessible.h"
static void gail_util_class_init (GailUtilClass *klass);
@@ -320,12 +320,12 @@ gail_util_remove_key_event_listener (guint listener_key)
}
}
-static AtkObject*
+static AtkObject *
gail_util_get_root (void)
{
if (!root)
{
- root = g_object_new (GAIL_TYPE_TOPLEVEL, NULL);
+ root = g_object_new (GTK_TYPE_TOPLEVEL_ACCESSIBLE, NULL);
atk_object_initialize (root, NULL);
}
diff --git a/gtk/a11y/gtktoplevelaccessible.c b/gtk/a11y/gtktoplevelaccessible.c
new file mode 100644
index 0000000..51062e0
--- /dev/null
+++ b/gtk/a11y/gtktoplevelaccessible.c
@@ -0,0 +1,283 @@
+/* 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 <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtkx.h>
+
+#include "gtktoplevelaccessible.h"
+
+
+G_DEFINE_TYPE (GtkToplevelAccessible, gtk_toplevel_accessible, ATK_TYPE_OBJECT)
+
+static void
+gtk_toplevel_accessible_initialize (AtkObject *accessible,
+ gpointer data)
+{
+ ATK_OBJECT_CLASS (gtk_toplevel_accessible_parent_class)->initialize (accessible, data);
+
+ accessible->role = ATK_ROLE_APPLICATION;
+ accessible->name = g_get_prgname ();
+ accessible->accessible_parent = NULL;
+}
+
+static void
+gtk_toplevel_accessible_object_finalize (GObject *obj)
+{
+ GtkToplevelAccessible *toplevel = GTK_TOPLEVEL_ACCESSIBLE (obj);
+
+ if (toplevel->window_list)
+ g_list_free (toplevel->window_list);
+
+ G_OBJECT_CLASS (gtk_toplevel_accessible_parent_class)->finalize (obj);
+}
+
+static gint
+gtk_toplevel_accessible_get_n_children (AtkObject *obj)
+{
+ GtkToplevelAccessible *toplevel = GTK_TOPLEVEL_ACCESSIBLE (obj);
+
+ return g_list_length (toplevel->window_list);
+}
+
+static AtkObject *
+gtk_toplevel_accessible_ref_child (AtkObject *obj,
+ gint i)
+{
+ GtkToplevelAccessible *toplevel;
+ GtkWidget *widget;
+ AtkObject *atk_obj;
+
+ toplevel = GTK_TOPLEVEL_ACCESSIBLE (obj);
+ widget = g_list_nth_data (toplevel->window_list, i);
+ if (!widget)
+ return NULL;
+
+ atk_obj = gtk_widget_get_accessible (widget);
+
+ g_object_ref (atk_obj);
+
+ return atk_obj;
+}
+
+static gboolean
+is_combo_window (GtkWidget *widget)
+{
+ GtkWidget *child;
+ AtkObject *obj;
+
+ child = gtk_bin_get_child (GTK_BIN (widget));
+
+ if (!GTK_IS_EVENT_BOX (child))
+ return FALSE;
+
+ child = gtk_bin_get_child (GTK_BIN (child));
+
+ if (!GTK_IS_FRAME (child))
+ return FALSE;
+
+ child = gtk_bin_get_child (GTK_BIN (child));
+
+ if (!GTK_IS_SCROLLED_WINDOW (child))
+ return FALSE;
+
+ obj = gtk_widget_get_accessible (child);
+ obj = atk_object_get_parent (obj);
+
+ return FALSE;
+}
+
+static gboolean
+is_attached_menu_window (GtkWidget *widget)
+{
+ GtkWidget *child;
+
+ child = gtk_bin_get_child (GTK_BIN (widget));
+ if (GTK_IS_MENU (child))
+ {
+ GtkWidget *attach;
+
+ attach = gtk_menu_get_attach_widget (GTK_MENU (child));
+ /* Allow for menu belonging to the Panel Menu, which is a GtkButton */
+ if (GTK_IS_MENU_ITEM (attach) || GTK_IS_BUTTON (attach))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+gtk_toplevel_accessible_class_init (GtkToplevelAccessibleClass *klass)
+{
+ AtkObjectClass *class = ATK_OBJECT_CLASS(klass);
+ GObjectClass *g_object_class = G_OBJECT_CLASS(klass);
+
+ class->initialize = gtk_toplevel_accessible_initialize;
+ class->get_n_children = gtk_toplevel_accessible_get_n_children;
+ class->ref_child = gtk_toplevel_accessible_ref_child;
+ class->get_parent = NULL;
+
+ g_object_class->finalize = gtk_toplevel_accessible_object_finalize;
+}
+
+static void
+remove_child (GtkToplevelAccessible *toplevel,
+ GtkWindow *window)
+{
+ AtkObject *atk_obj = ATK_OBJECT (toplevel);
+ GList *l;
+ guint window_count = 0;
+ AtkObject *child;
+
+ if (toplevel->window_list)
+ {
+ GtkWindow *tmp_window;
+
+ for (l = toplevel->window_list; l; l = l->next)
+ {
+ tmp_window = GTK_WINDOW (l->data);
+
+ if (window == tmp_window)
+ {
+ /* Remove the window from the window_list & emit the signal */
+ toplevel->window_list = g_list_delete_link (toplevel->window_list, l);
+ child = gtk_widget_get_accessible (GTK_WIDGET (window));
+ g_signal_emit_by_name (atk_obj, "children-changed::remove",
+ window_count, child, NULL);
+ atk_object_set_parent (child, NULL);
+ break;
+ }
+
+ window_count++;
+ }
+ }
+}
+
+static gboolean
+show_event_watcher (GSignalInvocationHint *ihint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ GtkToplevelAccessible *toplevel = GTK_TOPLEVEL_ACCESSIBLE (data);
+ AtkObject *atk_obj = ATK_OBJECT (toplevel);
+ GObject *object;
+ GtkWidget *widget;
+ gint n_children;
+ AtkObject *child;
+
+ object = g_value_get_object (param_values + 0);
+
+ if (!GTK_IS_WINDOW (object))
+ return TRUE;
+
+ widget = GTK_WIDGET (object);
+ if (gtk_widget_get_parent (widget) ||
+ is_attached_menu_window (widget) ||
+#ifdef GDK_WINDOWING_X11
+ GTK_IS_PLUG (widget) ||
+#endif
+ is_combo_window (widget))
+ return TRUE;
+
+ child = gtk_widget_get_accessible (widget);
+ if (atk_object_get_role (child) == ATK_ROLE_REDUNDANT_OBJECT ||
+ atk_object_get_role (child) == ATK_ROLE_TOOL_TIP)
+ return TRUE;
+
+ /* Add the window to the list & emit the signal */
+ toplevel->window_list = g_list_append (toplevel->window_list, widget);
+ n_children = g_list_length (toplevel->window_list);
+
+ atk_object_set_parent (child, atk_obj);
+ g_signal_emit_by_name (atk_obj, "children-changed::add",
+ n_children - 1, child, NULL);
+
+ g_signal_connect_swapped (G_OBJECT(object), "destroy",
+ G_CALLBACK (remove_child), toplevel);
+
+ return TRUE;
+}
+
+static gboolean
+hide_event_watcher (GSignalInvocationHint *ihint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ GtkToplevelAccessible *toplevel = GTK_TOPLEVEL_ACCESSIBLE (data);
+ GObject *object;
+
+ object = g_value_get_object (param_values + 0);
+
+ if (!GTK_IS_WINDOW (object))
+ return TRUE;
+
+ remove_child (toplevel, GTK_WINDOW (object));
+ return TRUE;
+}
+
+static void
+gtk_toplevel_accessible_init (GtkToplevelAccessible *toplevel)
+{
+ GtkWindow *window;
+ GtkWidget *widget;
+ GList *l;
+ guint signal_id;
+
+ l = toplevel->window_list = gtk_window_list_toplevels ();
+
+ while (l)
+ {
+ window = GTK_WINDOW (l->data);
+ widget = GTK_WIDGET (window);
+ if (!window ||
+ !gtk_widget_get_visible (widget) ||
+ is_attached_menu_window (widget) ||
+#ifdef GDK_WINDOWING_X11
+ GTK_IS_PLUG (window) ||
+#endif
+ gtk_widget_get_parent (GTK_WIDGET (window)))
+ {
+ GList *temp_l = l->next;
+
+ toplevel->window_list = g_list_delete_link (toplevel->window_list, l);
+ l = temp_l;
+ }
+ else
+ {
+ g_signal_connect_swapped (G_OBJECT (window), "destroy",
+ G_CALLBACK (remove_child), toplevel);
+ l = l->next;
+ }
+ }
+
+ g_type_class_ref (GTK_TYPE_WINDOW);
+
+ signal_id = g_signal_lookup ("show", GTK_TYPE_WINDOW);
+ g_signal_add_emission_hook (signal_id, 0,
+ show_event_watcher, toplevel, (GDestroyNotify) NULL);
+
+ signal_id = g_signal_lookup ("hide", GTK_TYPE_WINDOW);
+ g_signal_add_emission_hook (signal_id, 0,
+ hide_event_watcher, toplevel, (GDestroyNotify) NULL);
+}
diff --git a/gtk/a11y/gtktoplevelaccessible.h b/gtk/a11y/gtktoplevelaccessible.h
new file mode 100644
index 0000000..1a3f59e
--- /dev/null
+++ b/gtk/a11y/gtktoplevelaccessible.h
@@ -0,0 +1,52 @@
+/* GAIL - The GNOME Accessibility Implementation Library
+ * Copyright 2001 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_TOPLEVEL_ACCESSIBLE_H__
+#define __GTK_TOPLEVEL_ACCESSIBLE_H__
+
+#include <atk/atk.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_TOPLEVEL_ACCESSIBLE (gtk_toplevel_accessible_get_type ())
+#define GTK_TOPLEVEL_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TOPLEVEL_ACCESSIBLE, GtkToplevelAccessible))
+#define GTK_TOPLEVEL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TOPLEVEL_ACCESSIBLE, GtkToplevelAccessibleClass))
+#define GTK_IS_TOPLEVEL_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TOPLEVEL_ACCESSIBLE))
+#define GTK_IS_TOPLEVEL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TOPLEVEL_ACCESSIBLE))
+#define GTK_TOPLEVEL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TOPLEVEL_ACCESSIBLE, GtkToplevelAccessibleClass))
+
+typedef struct _GtkToplevelAccessible GtkToplevelAccessible;
+typedef struct _GtkToplevelAccessibleClass GtkToplevelAccessibleClass;
+
+struct _GtkToplevelAccessible
+{
+ AtkObject parent;
+ GList *window_list;
+};
+
+struct _GtkToplevelAccessibleClass
+{
+ AtkObjectClass parent_class;
+};
+
+GType gtk_toplevel_accessible_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GTK_TOPLEVEL_ACCESSIBLE_H__ */
diff --git a/gtk/a11y/gtkwindowaccessible.c b/gtk/a11y/gtkwindowaccessible.c
index d166e23..30ff77b 100644
--- a/gtk/a11y/gtkwindowaccessible.c
+++ b/gtk/a11y/gtkwindowaccessible.c
@@ -24,7 +24,7 @@
#include <gtk/gtkx.h>
#include "gtkwindowaccessible.h"
-#include "gailtoplevel.h"
+#include "gtktoplevelaccessible.h"
enum {
ACTIVATE,
@@ -227,9 +227,9 @@ gtk_window_accessible_get_index_in_parent (AtkObject *accessible)
if (GTK_IS_WINDOW (widget))
{
GtkWindow *window = GTK_WINDOW (widget);
- if (GAIL_IS_TOPLEVEL (atk_obj))
+ if (GTK_IS_TOPLEVEL_ACCESSIBLE (atk_obj))
{
- GailToplevel* toplevel = GAIL_TOPLEVEL (atk_obj);
+ GtkToplevelAccessible *toplevel = GTK_TOPLEVEL_ACCESSIBLE (atk_obj);
index = g_list_index (toplevel->window_list, window);
}
else
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]