]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gail.c
GtkComboBoxAccessible: add a private struct
[~andy/gtk] / gtk / a11y / gail.c
index 3d0c864262145ceb54ee78a7135c5e4e0fbf41c7..8f50846da8452f1fcd56c7db1fd20410a1785aad 100644 (file)
  * 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.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
 
+#include "gail.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <gdk/gdk.h>
 #include <gtk/gtkx.h>
-#include "gailtoplevel.h"
+#include <gtk/gtkentry.h>
+#include <gtk/gtknotebook.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkmenu.h>
+#include <gtk/gtkmenubar.h>
+#include <gtk/gtktogglebutton.h>
+#include <gtk/gtkcombobox.h>
+#include <gtk/gtkaccessible.h>
 #include "gailutil.h"
+#include "gailmisc.h"
 
-#define GNOME_ACCESSIBILITY_ENV "GNOME_ACCESSIBILITY"
+#ifdef GDK_WINDOWING_X11
+#include <atk-bridge.h>
+#endif
 
 static gboolean gail_focus_watcher      (GSignalInvocationHint *ihint,
                                          guint                  n_param_values,
@@ -59,7 +70,7 @@ static void     gail_set_focus_widget (GtkWidget *focus_widget,
 static void     gail_set_focus_object (AtkObject *focus_obj,
                                        AtkObject *obj);
 
-GtkWidget* focus_widget = NULL;
+GtkWidget* _focus_widget = NULL;
 static GtkWidget* next_focus_widget = NULL;
 static gboolean was_deselect = FALSE;
 static GtkWidget* subsequent_focus_widget = NULL;
@@ -67,6 +78,7 @@ static GtkWidget* focus_before_menu = NULL;
 static guint focus_notify_handler = 0;    
 static guint focus_tracker_id = 0;
 static GQuark quark_focus_object = 0;
+static int initialized = FALSE;
 
 static AtkObject*
 gail_get_accessible_for_widget (GtkWidget *widget,
@@ -229,7 +241,7 @@ gail_focus_watcher (GSignalInvocationHint *ihint,
     {
       if (event->type == GDK_MOTION_NOTIFY && gtk_widget_has_focus (widget))
         {
-          if (widget == focus_widget)
+          if (widget == _focus_widget)
             {
               return TRUE;
             }
@@ -339,12 +351,12 @@ gail_finish_select (GtkWidget *widget)
    * If previously focused widget is not a GtkMenuItem or a GtkMenu,
    * keep track of it so we can return to it after menubar is deactivated
    */
-  if (focus_widget && 
-      !GTK_IS_MENU_ITEM (focus_widget) && 
-      !GTK_IS_MENU (focus_widget))
+  if (_focus_widget && 
+      !GTK_IS_MENU_ITEM (_focus_widget) && 
+      !GTK_IS_MENU (_focus_widget))
     {
       void *vp_focus_before_menu = &focus_before_menu;
-      focus_before_menu = focus_widget;
+      focus_before_menu = _focus_widget;
       g_object_add_weak_pointer (G_OBJECT (focus_before_menu), vp_focus_before_menu);
 
     } 
@@ -476,35 +488,35 @@ gail_focus_notify (GtkWidget *widget)
   AtkObject *atk_obj;
   gboolean transient;
 
-  if (widget != focus_widget)
+  if (widget != _focus_widget)
     {
-      if (focus_widget)
+      if (_focus_widget)
         {
-          void *vp_focus_widget = &focus_widget;
-          g_object_remove_weak_pointer (G_OBJECT (focus_widget), vp_focus_widget);
+          void *vp_focus_widget = &_focus_widget;
+          g_object_remove_weak_pointer (G_OBJECT (_focus_widget), vp_focus_widget);
         }
-      focus_widget = widget;
-      if (focus_widget)
+      _focus_widget = widget;
+      if (_focus_widget)
         {
-          void *vp_focus_widget = &focus_widget;
-          g_object_add_weak_pointer (G_OBJECT (focus_widget), vp_focus_widget);
+          void *vp_focus_widget = &_focus_widget;
+          g_object_add_weak_pointer (G_OBJECT (_focus_widget), vp_focus_widget);
           /*
            * The UI may not have been updated yet; e.g. in gtkhtml2
            * html_view_layout() is called in a idle handler
            */
-          if (focus_widget == focus_before_menu)
+          if (_focus_widget == focus_before_menu)
             {
               void *vp_focus_before_menu = &focus_before_menu;
               g_object_remove_weak_pointer (G_OBJECT (focus_before_menu), vp_focus_before_menu);
               focus_before_menu = NULL;
             }
         }
-      gail_focus_notify_when_idle (focus_widget);
+      gail_focus_notify_when_idle (_focus_widget);
     }
   else
     {
-      if (focus_widget)
-        atk_obj  = gail_get_accessible_for_widget (focus_widget, &transient);
+      if (_focus_widget)
+        atk_obj  = gail_get_accessible_for_widget (_focus_widget, &transient);
       else
         atk_obj = NULL;
       /*
@@ -785,32 +797,39 @@ gail_set_focus_object (AtkObject *focus_obj,
     }
 }
 
-static int gail_initialized = FALSE;
-
 void
-gail_accessibility_module_init (void)
+_gtk_accessibility_shutdown (void)
 {
-  const char *env_a_t_support;
-  gboolean a_t_support = FALSE;
+  if (!initialized)
+    return;
 
-  if (gail_initialized)
-    {
-      return;
-    }
-  gail_initialized = TRUE;
-  quark_focus_object = g_quark_from_static_string ("gail-focus-object");
+  initialized = FALSE;
 
-  env_a_t_support = g_getenv (GNOME_ACCESSIBILITY_ENV);
+  g_clear_object (&atk_misc_instance);
 
-  if (env_a_t_support)
-    a_t_support = atoi (env_a_t_support);
-  if (a_t_support)
-    fprintf (stderr, "GTK Accessibility Module initialized\n");
+#ifdef GDK_WINDOWING_X11
+  atk_bridge_adaptor_cleanup ();
+#endif
+  _gail_util_uninstall ();
+}
+
+void
+_gtk_accessibility_init (void)
+{
+
+  if (initialized)
+    return;
+
+  initialized = TRUE;
+  quark_focus_object = g_quark_from_static_string ("gail-focus-object");
 
   atk_focus_tracker_init (gail_focus_tracker_init);
   focus_tracker_id = atk_add_focus_tracker (gail_focus_tracker);
 
-  /* Initialize the GailUtility class */
-  g_type_class_unref (g_type_class_ref (GAIL_TYPE_UTIL));
-  g_type_class_unref (g_type_class_ref (GAIL_TYPE_MISC));
+  _gail_util_install ();
+#ifdef GDK_WINDOWING_X11
+  atk_bridge_adaptor_init (NULL, NULL);
+#endif
+
+  atk_misc_instance = g_object_new (GAIL_TYPE_MISC, NULL);
 }