1 /* GAIL - The GNOME Accessibility Implementation Library
2 * Copyright 2001 Sun Microsystems Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
26 #include "gailbooleancell.h"
27 #include "gailbutton.h"
29 #include "gailcheckmenuitem.h"
30 #include "gailcontainer.h"
31 #include "gailcontainercell.h"
32 #include "gailexpander.h"
33 #include "gailimagecell.h"
35 #include "gailmenushell.h"
36 #include "gailmenuitem.h"
37 #include "gailradiomenuitem.h"
38 #include "gailrenderercell.h"
39 #include "gailstatusbar.h"
40 #include "gailtextcell.h"
41 #include "gailtoplevel.h"
43 #include "gailwidget.h"
44 #include "gailwindow.h"
46 #include "gailfactory.h"
48 #define GNOME_ACCESSIBILITY_ENV "GNOME_ACCESSIBILITY"
50 static gboolean gail_focus_watcher (GSignalInvocationHint *ihint,
52 const GValue *param_values,
54 static gboolean gail_select_watcher (GSignalInvocationHint *ihint,
56 const GValue *param_values,
58 static gboolean gail_deselect_watcher (GSignalInvocationHint *ihint,
60 const GValue *param_values,
62 static gboolean gail_switch_page_watcher(GSignalInvocationHint *ihint,
64 const GValue *param_values,
66 static void gail_finish_select (GtkWidget *widget);
67 static void gail_map_cb (GtkWidget *widget);
68 static void gail_map_submenu_cb (GtkWidget *widget);
69 static gint gail_focus_idle_handler (gpointer data);
70 static void gail_focus_notify (GtkWidget *widget);
71 static void gail_focus_notify_when_idle (GtkWidget *widget);
73 static void gail_focus_tracker_init (void);
74 static void gail_focus_object_destroyed (gpointer data);
75 static void gail_focus_tracker (AtkObject *object);
76 static void gail_set_focus_widget (GtkWidget *focus_widget,
78 static void gail_set_focus_object (AtkObject *focus_obj,
81 GtkWidget* focus_widget = NULL;
82 static GtkWidget* next_focus_widget = NULL;
83 static gboolean was_deselect = FALSE;
84 static GtkWidget* subsequent_focus_widget = NULL;
85 static GtkWidget* focus_before_menu = NULL;
86 static guint focus_notify_handler = 0;
87 static guint focus_tracker_id = 0;
88 static GQuark quark_focus_object = 0;
90 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_WIDGET, GailWidget, gail_widget, GTK_TYPE_WIDGET)
91 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_CONTAINER, GailContainer, gail_container, GTK_TYPE_CONTAINER)
92 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_BUTTON, GailButton, gail_button, GTK_TYPE_BUTTON)
93 GAIL_IMPLEMENT_FACTORY_WITH_FUNC (GAIL_TYPE_MENU_ITEM, GailMenuItem, gail_menu_item, gail_menu_item_new)
94 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_MENU_SHELL, GailMenuShell, gail_menu_shell, GTK_TYPE_MENU_SHELL)
95 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_MENU, GailMenu, gail_menu, GTK_TYPE_MENU)
96 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_WINDOW, GailWindow, gail_window, GTK_TYPE_BIN)
97 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_STATUSBAR, GailStatusbar, gail_statusbar, GTK_TYPE_STATUSBAR)
98 GAIL_IMPLEMENT_FACTORY_WITH_FUNC (GAIL_TYPE_CHECK_MENU_ITEM, GailCheckMenuItem, gail_check_menu_item, gail_check_menu_item_new)
99 GAIL_IMPLEMENT_FACTORY_WITH_FUNC (GAIL_TYPE_RADIO_MENU_ITEM, GailRadioMenuItem, gail_radio_menu_item, gail_radio_menu_item_new)
100 GAIL_IMPLEMENT_FACTORY (GAIL_TYPE_EXPANDER, GailExpander, gail_expander, GTK_TYPE_EXPANDER)
101 GAIL_IMPLEMENT_FACTORY_WITH_FUNC_DUMMY (GAIL_TYPE_RENDERER_CELL, GailRendererCell, gail_renderer_cell, GTK_TYPE_CELL_RENDERER, gail_renderer_cell_new)
102 GAIL_IMPLEMENT_FACTORY_WITH_FUNC_DUMMY (GAIL_TYPE_BOOLEAN_CELL, GailBooleanCell, gail_boolean_cell, GTK_TYPE_CELL_RENDERER_TOGGLE, gail_boolean_cell_new)
103 GAIL_IMPLEMENT_FACTORY_WITH_FUNC_DUMMY (GAIL_TYPE_IMAGE_CELL, GailImageCell, gail_image_cell, GTK_TYPE_CELL_RENDERER_PIXBUF, gail_image_cell_new)
104 GAIL_IMPLEMENT_FACTORY_WITH_FUNC_DUMMY (GAIL_TYPE_TEXT_CELL, GailTextCell, gail_text_cell, GTK_TYPE_CELL_RENDERER_TEXT, gail_text_cell_new)
107 gail_get_accessible_for_widget (GtkWidget *widget,
110 AtkObject *obj = NULL;
116 if (GTK_IS_ENTRY (widget))
118 else if (GTK_IS_NOTEBOOK (widget))
120 GtkNotebook *notebook;
123 notebook = GTK_NOTEBOOK (widget);
124 page_num = gtk_notebook_get_current_page (notebook);
127 obj = gtk_widget_get_accessible (widget);
128 obj = atk_object_ref_accessible_child (obj, page_num);
129 g_object_unref (obj);
132 else if (GTK_IS_TOGGLE_BUTTON (widget))
134 GtkWidget *other_widget = gtk_widget_get_parent (widget);
135 if (GTK_IS_COMBO_BOX (other_widget))
137 gail_set_focus_widget (other_widget, widget);
138 widget = other_widget;
143 AtkObject *focus_object;
145 obj = gtk_widget_get_accessible (widget);
146 focus_object = g_object_get_qdata (G_OBJECT (obj), quark_focus_object);
148 * We check whether the object for this focus_object has been deleted.
149 * This can happen when navigating to an empty directory in nautilus.
152 if (ATK_IS_GOBJECT_ACCESSIBLE (focus_object))
154 if (!atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (focus_object)))
165 gail_focus_watcher (GSignalInvocationHint *ihint,
166 guint n_param_values,
167 const GValue *param_values,
174 object = g_value_get_object (param_values + 0);
175 g_return_val_if_fail (GTK_IS_WIDGET(object), FALSE);
177 event = g_value_get_boxed (param_values + 1);
178 widget = GTK_WIDGET (object);
180 if (event->type == GDK_FOCUS_CHANGE)
182 if (event->focus_change.in)
184 if (GTK_IS_WINDOW (widget))
186 GtkWidget *focus_widget;
190 window = GTK_WINDOW (widget);
191 focus_widget = gtk_window_get_focus (window);
192 g_object_get (window, "type", &type, NULL);
197 * If we already have a potential focus widget set this
198 * windows's focus widget to focus_before_menu so that
199 * it will be reported when menu item is unset.
201 if (next_focus_widget)
203 if (GTK_IS_MENU_ITEM (next_focus_widget) &&
206 void *vp_focus_before_menu = &focus_before_menu;
207 focus_before_menu = focus_widget;
208 g_object_add_weak_pointer (G_OBJECT (focus_before_menu), vp_focus_before_menu);
213 widget = focus_widget;
215 else if (type == GTK_WINDOW_POPUP)
217 if (GTK_IS_BIN (widget))
219 GtkWidget *child = gtk_bin_get_child (GTK_BIN (widget));
221 if (GTK_IS_WIDGET (child) && gtk_widget_has_grab (child))
223 if (GTK_IS_MENU_SHELL (child))
225 if (gtk_menu_shell_get_selected_item (GTK_MENU_SHELL (child)))
228 * We have a menu which has a menu item selected
229 * so we do not report focus on the menu.
237 else /* popup window has no children; this edge case occurs in some custom code (OOo for instance) */
242 else /* Widget is a non-popup toplevel with no focus children;
243 don't emit for this case either, as it's useless */
251 if (next_focus_widget)
255 toplevel = gtk_widget_get_toplevel (next_focus_widget);
256 if (toplevel == widget)
257 next_focus_widget = NULL;
265 if (event->type == GDK_MOTION_NOTIFY && gtk_widget_has_focus (widget))
267 if (widget == focus_widget)
278 #ifdef GDK_WINDOWING_X11
280 * If the focus widget is a GtkSocket without a plug
281 * then ignore the focus notification as the embedded
282 * plug will report a focus notification.
284 if (GTK_IS_SOCKET (widget) &&
285 gtk_socket_get_plug_window (GTK_SOCKET (widget)) != NULL)
290 * The widget may not yet be visible on the screen so we wait until it is.
292 gail_focus_notify_when_idle (widget);
297 gail_select_watcher (GSignalInvocationHint *ihint,
298 guint n_param_values,
299 const GValue *param_values,
305 object = g_value_get_object (param_values + 0);
306 g_return_val_if_fail (GTK_IS_WIDGET(object), FALSE);
308 widget = GTK_WIDGET (object);
310 if (!gtk_widget_get_mapped (widget))
312 g_signal_connect (widget, "map",
313 G_CALLBACK (gail_map_cb),
317 gail_finish_select (widget);
323 gail_finish_select (GtkWidget *widget)
325 if (GTK_IS_MENU_ITEM (widget))
327 GtkMenuItem* menu_item;
330 menu_item = GTK_MENU_ITEM (widget);
331 submenu = gtk_menu_item_get_submenu (menu_item);
333 !gtk_widget_get_mapped (submenu))
336 * If the submenu is not visble, wait until it is before
337 * reporting focus on the menu item.
341 handler_id = g_signal_handler_find (submenu,
343 g_signal_lookup ("map",
347 (gpointer) gail_map_submenu_cb,
350 g_signal_connect (submenu, "map",
351 G_CALLBACK (gail_map_submenu_cb),
356 * If we are waiting to report focus on a menubar or a menu item
357 * because of a previous deselect, cancel it.
360 focus_notify_handler &&
362 (GTK_IS_MENU_BAR (next_focus_widget) ||
363 GTK_IS_MENU_ITEM (next_focus_widget)))
365 void *vp_next_focus_widget = &next_focus_widget;
366 g_source_remove (focus_notify_handler);
367 g_object_remove_weak_pointer (G_OBJECT (next_focus_widget), vp_next_focus_widget);
368 next_focus_widget = NULL;
369 focus_notify_handler = 0;
370 was_deselect = FALSE;
374 * If previously focused widget is not a GtkMenuItem or a GtkMenu,
375 * keep track of it so we can return to it after menubar is deactivated
378 !GTK_IS_MENU_ITEM (focus_widget) &&
379 !GTK_IS_MENU (focus_widget))
381 void *vp_focus_before_menu = &focus_before_menu;
382 focus_before_menu = focus_widget;
383 g_object_add_weak_pointer (G_OBJECT (focus_before_menu), vp_focus_before_menu);
386 gail_focus_notify_when_idle (widget);
392 gail_map_cb (GtkWidget *widget)
394 gail_finish_select (widget);
398 gail_map_submenu_cb (GtkWidget *widget)
400 if (GTK_IS_MENU (widget))
402 GtkWidget *parent_menu_item;
404 parent_menu_item = gtk_menu_get_attach_widget (GTK_MENU (widget));
405 if (parent_menu_item)
406 gail_finish_select (parent_menu_item);
412 gail_deselect_watcher (GSignalInvocationHint *ihint,
413 guint n_param_values,
414 const GValue *param_values,
419 GtkWidget *menu_shell;
421 object = g_value_get_object (param_values + 0);
422 g_return_val_if_fail (GTK_IS_WIDGET(object), FALSE);
424 widget = GTK_WIDGET (object);
426 if (!GTK_IS_MENU_ITEM (widget))
429 if (subsequent_focus_widget == widget)
430 subsequent_focus_widget = NULL;
432 menu_shell = gtk_widget_get_parent (widget);
433 if (GTK_IS_MENU_SHELL (menu_shell))
435 GtkWidget *parent_menu_shell;
437 parent_menu_shell = gtk_menu_shell_get_parent_shell (GTK_MENU_SHELL (menu_shell));
438 if (parent_menu_shell)
440 GtkWidget *active_menu_item;
442 active_menu_item = gtk_menu_shell_get_selected_item (GTK_MENU_SHELL (parent_menu_shell));
443 if (active_menu_item)
445 gail_focus_notify_when_idle (active_menu_item);
450 if (!GTK_IS_MENU_BAR (menu_shell))
452 gail_focus_notify_when_idle (menu_shell);
461 gail_switch_page_watcher (GSignalInvocationHint *ihint,
462 guint n_param_values,
463 const GValue *param_values,
469 object = g_value_get_object (param_values + 0);
470 g_return_val_if_fail (GTK_IS_WIDGET(object), FALSE);
472 widget = GTK_WIDGET (object);
474 if (!GTK_IS_NOTEBOOK (widget))
477 if (gtk_notebook_get_current_page (GTK_NOTEBOOK (widget)) == -1)
480 gail_focus_notify_when_idle (widget);
485 gail_focus_idle_handler (gpointer data)
487 focus_notify_handler = 0;
489 * The widget which was to receive focus may have been removed
491 if (!next_focus_widget)
493 if (next_focus_widget != data)
498 void *vp_next_focus_widget = &next_focus_widget;
499 g_object_remove_weak_pointer (G_OBJECT (next_focus_widget), vp_next_focus_widget);
500 next_focus_widget = NULL;
503 gail_focus_notify (data);
509 gail_focus_notify (GtkWidget *widget)
514 if (widget != focus_widget)
518 void *vp_focus_widget = &focus_widget;
519 g_object_remove_weak_pointer (G_OBJECT (focus_widget), vp_focus_widget);
521 focus_widget = widget;
524 void *vp_focus_widget = &focus_widget;
525 g_object_add_weak_pointer (G_OBJECT (focus_widget), vp_focus_widget);
527 * The UI may not have been updated yet; e.g. in gtkhtml2
528 * html_view_layout() is called in a idle handler
530 if (focus_widget == focus_before_menu)
532 void *vp_focus_before_menu = &focus_before_menu;
533 g_object_remove_weak_pointer (G_OBJECT (focus_before_menu), vp_focus_before_menu);
534 focus_before_menu = NULL;
537 gail_focus_notify_when_idle (focus_widget);
542 atk_obj = gail_get_accessible_for_widget (focus_widget, &transient);
546 * Do not report focus on redundant object
549 (atk_object_get_role(atk_obj) != ATK_ROLE_REDUNDANT_OBJECT))
550 atk_focus_tracker_notify (atk_obj);
551 if (atk_obj && transient)
552 g_object_unref (atk_obj);
553 if (subsequent_focus_widget)
555 GtkWidget *tmp_widget = subsequent_focus_widget;
556 subsequent_focus_widget = NULL;
557 gail_focus_notify_when_idle (tmp_widget);
563 gail_focus_notify_when_idle (GtkWidget *widget)
565 if (focus_notify_handler)
570 * Ignore focus request when menu item is going to be focused.
573 if (GTK_IS_MENU_ITEM (next_focus_widget) && !GTK_IS_MENU_ITEM (widget))
576 if (next_focus_widget)
578 if (GTK_IS_MENU_ITEM (next_focus_widget) && GTK_IS_MENU_ITEM (widget))
580 if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (next_focus_widget)) == gtk_widget_get_parent (widget))
582 if (subsequent_focus_widget)
583 g_assert_not_reached ();
584 subsequent_focus_widget = widget;
589 g_source_remove (focus_notify_handler);
590 if (next_focus_widget)
592 void *vp_next_focus_widget = &next_focus_widget;
593 g_object_remove_weak_pointer (G_OBJECT (next_focus_widget), vp_next_focus_widget);
594 next_focus_widget = NULL;
599 * Ignore if focus is being set to NULL and we are waiting to set focus
606 void *vp_next_focus_widget = &next_focus_widget;
607 next_focus_widget = widget;
608 g_object_add_weak_pointer (G_OBJECT (next_focus_widget), vp_next_focus_widget);
613 * We are about to report focus as NULL so remove the weak pointer
614 * for the widget we were waiting to report focus on.
616 if (next_focus_widget)
618 void *vp_next_focus_widget = &next_focus_widget;
619 g_object_remove_weak_pointer (G_OBJECT (next_focus_widget), vp_next_focus_widget);
620 next_focus_widget = NULL;
624 focus_notify_handler = gdk_threads_add_idle (gail_focus_idle_handler, widget);
628 gail_deactivate_watcher (GSignalInvocationHint *ihint,
629 guint n_param_values,
630 const GValue *param_values,
636 GtkWidget *focus = NULL;
638 object = g_value_get_object (param_values + 0);
639 g_return_val_if_fail (GTK_IS_WIDGET(object), FALSE);
640 widget = GTK_WIDGET (object);
642 g_return_val_if_fail (GTK_IS_MENU_SHELL(widget), TRUE);
643 shell = GTK_MENU_SHELL(widget);
644 if (! gtk_menu_shell_get_parent_shell (shell))
645 focus = focus_before_menu;
648 * If we are waiting to report focus on a menubar or a menu item
649 * because of a previous deselect, cancel it.
652 focus_notify_handler &&
654 (GTK_IS_MENU_BAR (next_focus_widget) ||
655 GTK_IS_MENU_ITEM (next_focus_widget)))
657 void *vp_next_focus_widget = &next_focus_widget;
658 g_source_remove (focus_notify_handler);
659 g_object_remove_weak_pointer (G_OBJECT (next_focus_widget), vp_next_focus_widget);
660 next_focus_widget = NULL;
661 focus_notify_handler = 0;
662 was_deselect = FALSE;
664 gail_focus_notify_when_idle (focus);
670 gail_focus_tracker_init (void)
672 static gboolean emission_hooks_added = FALSE;
674 if (!emission_hooks_added)
677 * We cannot be sure that the classes exist so we make sure that they do.
679 g_type_class_ref (GTK_TYPE_WIDGET);
680 g_type_class_ref (GTK_TYPE_MENU_ITEM);
681 g_type_class_ref (GTK_TYPE_MENU_SHELL);
682 g_type_class_ref (GTK_TYPE_NOTEBOOK);
685 * We listen for event_after signal and then check that the
686 * event was a focus in event so we get called after the event.
688 g_signal_add_emission_hook (
689 g_signal_lookup ("event-after", GTK_TYPE_WIDGET), 0,
690 gail_focus_watcher, NULL, (GDestroyNotify) NULL);
692 * A "select" signal is emitted when arrow key is used to
693 * move to a list item in the popup window of a GtkCombo or
694 * a menu item in a menu.
696 g_signal_add_emission_hook (
697 g_signal_lookup ("select", GTK_TYPE_MENU_ITEM), 0,
698 gail_select_watcher, NULL, (GDestroyNotify) NULL);
701 * A "deselect" signal is emitted when arrow key is used to
702 * move from a menu item in a menu to the parent menu.
704 g_signal_add_emission_hook (
705 g_signal_lookup ("deselect", GTK_TYPE_MENU_ITEM), 0,
706 gail_deselect_watcher, NULL, (GDestroyNotify) NULL);
709 * We listen for deactivate signals on menushells to determine
710 * when the "focus" has left the menus.
712 g_signal_add_emission_hook (
713 g_signal_lookup ("deactivate", GTK_TYPE_MENU_SHELL), 0,
714 gail_deactivate_watcher, NULL, (GDestroyNotify) NULL);
717 * We listen for "switch-page" signal on a GtkNotebook to notify
718 * when page has changed because of clicking on a notebook tab.
720 g_signal_add_emission_hook (
721 g_signal_lookup ("switch-page", GTK_TYPE_NOTEBOOK), 0,
722 gail_switch_page_watcher, NULL, (GDestroyNotify) NULL);
723 emission_hooks_added = TRUE;
728 gail_focus_object_destroyed (gpointer data)
732 obj = G_OBJECT (data);
733 g_object_set_qdata (obj, quark_focus_object, NULL);
734 g_object_unref (obj);
738 gail_focus_tracker (AtkObject *focus_object)
741 * Do not report focus on redundant object
744 (atk_object_get_role(focus_object) != ATK_ROLE_REDUNDANT_OBJECT))
746 AtkObject *old_focus_object;
748 if (!GTK_IS_ACCESSIBLE (focus_object))
752 parent = focus_object;
755 parent = atk_object_get_parent (parent);
758 if (GTK_IS_ACCESSIBLE (parent))
764 gail_set_focus_object (focus_object, parent);
769 old_focus_object = g_object_get_qdata (G_OBJECT (focus_object), quark_focus_object);
770 if (old_focus_object)
772 g_object_weak_unref (G_OBJECT (old_focus_object),
773 (GWeakNotify) gail_focus_object_destroyed,
775 g_object_set_qdata (G_OBJECT (focus_object), quark_focus_object, NULL);
776 g_object_unref (G_OBJECT (focus_object));
783 gail_set_focus_widget (GtkWidget *focus_widget,
786 AtkObject *focus_obj;
789 focus_obj = gtk_widget_get_accessible (focus_widget);
790 obj = gtk_widget_get_accessible (widget);
791 gail_set_focus_object (focus_obj, obj);
795 gail_set_focus_object (AtkObject *focus_obj,
798 AtkObject *old_focus_obj;
800 old_focus_obj = g_object_get_qdata (G_OBJECT (obj), quark_focus_object);
801 if (old_focus_obj != obj)
804 g_object_weak_unref (G_OBJECT (old_focus_obj),
805 (GWeakNotify) gail_focus_object_destroyed,
809 * We call g_object_ref as if obj is destroyed
810 * while the weak reference exists then destroying the
811 * focus_obj would cause gail_focus_object_destroyed to be
812 * called when obj is not a valid GObject.
816 g_object_weak_ref (G_OBJECT (focus_obj),
817 (GWeakNotify) gail_focus_object_destroyed,
819 g_object_set_qdata (G_OBJECT (obj), quark_focus_object, focus_obj);
823 static int gail_initialized = FALSE;
826 gail_accessibility_module_init (void)
828 const char *env_a_t_support;
829 gboolean a_t_support = FALSE;
831 if (gail_initialized)
835 gail_initialized = TRUE;
836 quark_focus_object = g_quark_from_static_string ("gail-focus-object");
838 env_a_t_support = g_getenv (GNOME_ACCESSIBILITY_ENV);
841 a_t_support = atoi (env_a_t_support);
843 fprintf (stderr, "GTK Accessibility Module initialized\n");
845 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_WIDGET, gail_widget);
846 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CONTAINER, gail_container);
847 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_BUTTON, gail_button);
848 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_MENU_ITEM, gail_menu_item);
849 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_MENU_BAR, gail_menu_shell);
850 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_MENU, gail_menu);
851 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_WINDOW, gail_window);
852 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_STATUSBAR, gail_statusbar);
853 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CELL_RENDERER_TEXT, gail_text_cell);
854 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CELL_RENDERER_TOGGLE, gail_boolean_cell);
855 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CELL_RENDERER_PIXBUF, gail_image_cell);
856 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CELL_RENDERER, gail_renderer_cell);
857 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_CHECK_MENU_ITEM, gail_check_menu_item);
858 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_RADIO_MENU_ITEM, gail_radio_menu_item);
859 GAIL_WIDGET_SET_FACTORY (GTK_TYPE_EXPANDER, gail_expander);
861 atk_focus_tracker_init (gail_focus_tracker_init);
862 focus_tracker_id = atk_add_focus_tracker (gail_focus_tracker);
864 /* Initialize the GailUtility class */
865 g_type_class_unref (g_type_class_ref (GAIL_TYPE_UTIL));
866 g_type_class_unref (g_type_class_ref (GAIL_TYPE_MISC));