]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtkwidgetaccessible.c
gtkenums: correct various documentation typos
[~andy/gtk] / gtk / a11y / gtkwidgetaccessible.c
index c4d0d95d277816dde6b30d0aa4339e4121baec21..6f4acaa366aeb6539518c416b08843bfb96615fb 100644 (file)
@@ -1,4 +1,4 @@
-/* GAIL - The GNOME Accessibility Implementation Library
+/* GTK+ - accessibility implementations
  * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
  *
  * This library is free software; you can redistribute it and/or
  * 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 <string.h>
-
 #include <gtk/gtk.h>
 #ifdef GDK_WINDOWING_X11
 #include <gdk/x11/gdkx.h>
 #endif
-#include "gtkwidgetaccessible.h"
+#include "gtkwidgetaccessibleprivate.h"
 #include "gtknotebookpageaccessible.h"
 
-extern GtkWidget *focus_widget;
+struct _GtkWidgetAccessiblePrivate
+{
+  AtkLayer layer;
+};
+
+#define TOOLTIP_KEY "tooltip"
+
+extern GtkWidget *_focus_widget;
 
 
 static gboolean gtk_widget_accessible_on_screen           (GtkWidget *widget);
@@ -39,20 +42,18 @@ static void atk_component_interface_init (AtkComponentIface *iface);
 G_DEFINE_TYPE_WITH_CODE (GtkWidgetAccessible, gtk_widget_accessible, GTK_TYPE_ACCESSIBLE,
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
 
-/* Translate GtkWidget::focus-in/out-event to the focus_gtk vfunc */
+/* Translate GtkWidget::focus-in/out-event to AtkObject::focus-event */
 static gboolean
 focus_cb (GtkWidget     *widget,
           GdkEventFocus *event)
 {
-  GtkWidgetAccessible *accessible;
-  GtkWidgetAccessibleClass *klass;
+  AtkObject *obj;
 
-  accessible = GTK_WIDGET_ACCESSIBLE (gtk_widget_get_accessible (widget));
-  klass = GTK_WIDGET_ACCESSIBLE_GET_CLASS (accessible);
-  if (klass->focus_gtk)
-    return klass->focus_gtk (widget, event);
-  else
-    return FALSE;
+  obj = gtk_widget_get_accessible (widget);
+
+  g_signal_emit_by_name (obj, "focus-event", event->in);
+
+  return FALSE;
 }
 
 /* Translate GtkWidget property change notification to the notify_gtk vfunc */
@@ -84,7 +85,7 @@ size_allocate_cb (GtkWidget     *widget,
       rect.y = allocation->y;
       rect.width = allocation->width;
       rect.height = allocation->height;
-      g_signal_emit_by_name (accessible, "bounds_changed", &rect);
+      g_signal_emit_by_name (accessible, "bounds-changed", &rect);
     }
 }
 
@@ -101,8 +102,8 @@ map_cb (GtkWidget *widget)
 }
 
 static void
-focus_event (AtkObject *obj,
-             gboolean   focus_in)
+gtk_widget_accessible_focus_event (AtkObject *obj,
+                                   gboolean   focus_in)
 {
   AtkObject *focus_obj;
 
@@ -112,18 +113,24 @@ focus_event (AtkObject *obj,
   atk_object_notify_state_change (focus_obj, ATK_STATE_FOCUSED, focus_in);
 }
 
+static void
+gtk_widget_accessible_update_tooltip (GtkWidgetAccessible *accessible,
+                                      GtkWidget *widget)
+{
+  g_object_set_data_full (G_OBJECT (accessible),
+                          TOOLTIP_KEY,
+                          gtk_widget_get_tooltip_text (widget),
+                          g_free);
+}
+
 static void
 gtk_widget_accessible_initialize (AtkObject *obj,
                                   gpointer   data)
 {
-  GtkAccessible *accessible;
   GtkWidget *widget;
 
   widget = GTK_WIDGET (data);
 
-  accessible = GTK_ACCESSIBLE (obj);
-  gtk_accessible_set_widget (accessible, widget);
-  gtk_accessible_connect_widget_destroyed (accessible);
   g_signal_connect_after (widget, "focus-in-event", G_CALLBACK (focus_cb), NULL);
   g_signal_connect_after (widget, "focus-out-event", G_CALLBACK (focus_cb), NULL);
   g_signal_connect (widget, "notify", G_CALLBACK (notify_cb), NULL);
@@ -131,30 +138,10 @@ gtk_widget_accessible_initialize (AtkObject *obj,
   g_signal_connect (widget, "map", G_CALLBACK (map_cb), NULL);
   g_signal_connect (widget, "unmap", G_CALLBACK (map_cb), NULL);
 
-  g_signal_connect (accessible, "focus-event", G_CALLBACK (focus_event), NULL);
-
-  g_object_set_data (G_OBJECT (obj), "atk-component-layer", GINT_TO_POINTER (ATK_LAYER_WIDGET));
-
+  GTK_WIDGET_ACCESSIBLE (obj)->priv->layer = ATK_LAYER_WIDGET;
   obj->role = ATK_ROLE_UNKNOWN;
-}
-
-static void
-gtk_widget_accessible_destroyed (GtkWidget     *widget,
-                                 GtkAccessible *accessible)
-{
-  gtk_accessible_set_widget (accessible, NULL);
-  atk_object_notify_state_change (ATK_OBJECT (accessible), ATK_STATE_DEFUNCT, TRUE);
-}
-
-static void
-gtk_widget_accessible_connect_widget_destroyed (GtkAccessible *accessible)
-{
-  GtkWidget *widget;
 
-  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
-  if (widget)
-    g_signal_connect_after (widget, "destroy",
-                            G_CALLBACK (gtk_widget_accessible_destroyed), accessible);
+  gtk_widget_accessible_update_tooltip (GTK_WIDGET_ACCESSIBLE (obj), widget);
 }
 
 static const gchar *
@@ -169,7 +156,7 @@ gtk_widget_accessible_get_description (AtkObject *accessible)
   if (accessible->description)
     return accessible->description;
 
-  return gtk_widget_get_tooltip_text (widget);
+  return g_object_get_data (G_OBJECT (accessible), TOOLTIP_KEY);
 }
 
 static AtkObject *
@@ -227,20 +214,21 @@ find_label (GtkWidget *widget)
   GList *labels;
   GtkWidget *label;
   GtkWidget *temp_widget;
+  GList *ptr;
 
   labels = gtk_widget_list_mnemonic_labels (widget);
   label = NULL;
-  if (labels)
+  ptr = labels;
+  while (ptr)
     {
-      if (labels->data)
+      if (ptr->data)
         {
-          if (labels->next)
-            g_warning ("Widget (%s) has more than one label", G_OBJECT_TYPE_NAME (widget));
-          else
-            label = labels->data;
+          label = ptr->data;
+          break;
         }
-      g_list_free (labels);
+      ptr = ptr->next;
     }
+  g_list_free (labels);
 
   /* Ignore a label within a button; bug #136602 */
   if (label && GTK_IS_BUTTON (widget))
@@ -386,7 +374,7 @@ gtk_widget_accessible_ref_state_set (AtkObject *accessible)
             atk_state_set_add_state (state_set, ATK_STATE_SHOWING);
         }
 
-      if (gtk_widget_has_focus (widget) && (widget == focus_widget))
+      if (gtk_widget_has_focus (widget) && (widget == _focus_widget))
         {
           AtkObject *focus_obj;
 
@@ -480,23 +468,30 @@ gtk_widget_accessible_notify_gtk (GObject    *obj,
   AtkState state;
   gboolean value;
 
-  if (strcmp (pspec->name, "has-focus") == 0)
+  if (g_strcmp0 (pspec->name, "has-focus") == 0)
     /*
      * We use focus-in-event and focus-out-event signals to catch
      * focus changes so we ignore this.
      */
     return;
-  else if (strcmp (pspec->name, "visible") == 0)
+  else if (g_strcmp0 (pspec->name, "tooltip-text") == 0)
+    {
+      gtk_widget_accessible_update_tooltip (GTK_WIDGET_ACCESSIBLE (atk_obj),
+                                            widget);
+      return;
+    }
+  else if (g_strcmp0 (pspec->name, "visible") == 0)
     {
       state = ATK_STATE_VISIBLE;
       value = gtk_widget_get_visible (widget);
     }
-  else if (strcmp (pspec->name, "sensitive") == 0)
+  else if (g_strcmp0 (pspec->name, "sensitive") == 0)
     {
       state = ATK_STATE_SENSITIVE;
       value = gtk_widget_get_sensitive (widget);
     }
-  else if (strcmp (pspec->name, "orientation") == 0)
+  else if (g_strcmp0 (pspec->name, "orientation") == 0 &&
+           GTK_IS_ORIENTABLE (widget))
     {
       GtkOrientable *orientable;
 
@@ -516,25 +511,6 @@ gtk_widget_accessible_notify_gtk (GObject    *obj,
     atk_object_notify_state_change (atk_obj, ATK_STATE_VERTICAL, !value);
 }
 
-/* This function is the default implementation for the focus_gtk
- * vfunc which gets called for focus_in/out_event.
- *
- * It emits a focus-event signal on the GtkWidgetAccessible.
- */
-static gboolean
-gtk_widget_accessible_focus_gtk (GtkWidget     *widget,
-                                 GdkEventFocus *event)
-{
-  AtkObject* accessible;
-  gboolean return_val;
-  return_val = FALSE;
-
-  accessible = gtk_widget_get_accessible (widget);
-
-  g_signal_emit_by_name (accessible, "focus_event", event->in, &return_val);
-  return FALSE;
-}
-
 static AtkAttributeSet *
 gtk_widget_accessible_get_attributes (AtkObject *obj)
 {
@@ -543,7 +519,7 @@ gtk_widget_accessible_get_attributes (AtkObject *obj)
 
   toolkit = g_new (AtkAttribute, 1);
   toolkit->name = g_strdup ("toolkit");
-  toolkit->value = g_strdup ("gail");
+  toolkit->value = g_strdup ("gtk");
 
   attributes = g_slist_append (NULL, toolkit);
 
@@ -554,12 +530,8 @@ static void
 gtk_widget_accessible_class_init (GtkWidgetAccessibleClass *klass)
 {
   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
-  GtkAccessibleClass *accessible_class = GTK_ACCESSIBLE_CLASS (klass);
 
   klass->notify_gtk = gtk_widget_accessible_notify_gtk;
-  klass->focus_gtk = gtk_widget_accessible_focus_gtk;
-
-  accessible_class->connect_widget_destroyed = gtk_widget_accessible_connect_widget_destroyed;
 
   class->get_description = gtk_widget_accessible_get_description;
   class->get_parent = gtk_widget_accessible_get_parent;
@@ -568,11 +540,17 @@ gtk_widget_accessible_class_init (GtkWidgetAccessibleClass *klass)
   class->get_index_in_parent = gtk_widget_accessible_get_index_in_parent;
   class->initialize = gtk_widget_accessible_initialize;
   class->get_attributes = gtk_widget_accessible_get_attributes;
+  class->focus_event = gtk_widget_accessible_focus_event;
+
+  g_type_class_add_private (klass, sizeof (GtkWidgetAccessiblePrivate));
 }
 
 static void
 gtk_widget_accessible_init (GtkWidgetAccessible *accessible)
 {
+  accessible->priv = G_TYPE_INSTANCE_GET_PRIVATE (accessible,
+                                                  GTK_TYPE_WIDGET_ACCESSIBLE,
+                                                  GtkWidgetAccessiblePrivate);
 }
 
 static void
@@ -647,11 +625,9 @@ gtk_widget_accessible_get_size (AtkComponent *component,
 static AtkLayer
 gtk_widget_accessible_get_layer (AtkComponent *component)
 {
-  gint layer;
-
-  layer = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (component), "atk-component-layer"));
+  GtkWidgetAccessible *accessible = GTK_WIDGET_ACCESSIBLE (component);
 
-  return (AtkLayer) layer;
+  return accessible->priv->layer;
 }
 
 static gboolean
@@ -869,3 +845,10 @@ gtk_widget_accessible_all_parents_visible (GtkWidget *widget)
 
   return result;
 }
+
+void
+_gtk_widget_accessible_set_layer (GtkWidgetAccessible *accessible,
+                                  AtkLayer             layer)
+{
+  accessible->priv->layer = layer;
+}