]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtkwidgetaccessible.c
filechooserbutton: Emit 'selection-changed' when changing the selection programmatically
[~andy/gtk] / gtk / a11y / gtkwidgetaccessible.c
index 918fbb95b76aea6e503573c5a89877ce51bd05c0..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
@@ -12,9 +12,7 @@
  * 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"
 #ifdef GDK_WINDOWING_X11
 #include <gdk/x11/gdkx.h>
 #endif
-#include "gtkwidgetaccessible.h"
+#include "gtkwidgetaccessibleprivate.h"
 #include "gtknotebookpageaccessible.h"
 
+struct _GtkWidgetAccessiblePrivate
+{
+  AtkLayer layer;
+};
+
+#define TOOLTIP_KEY "tooltip"
+
 extern GtkWidget *_focus_widget;
 
 
@@ -34,7 +39,7 @@ static gboolean gtk_widget_accessible_all_parents_visible (GtkWidget *widget);
 
 static void atk_component_interface_init (AtkComponentIface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (GtkWidgetAccessible, _gtk_widget_accessible, GTK_TYPE_ACCESSIBLE,
+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 AtkObject::focus-event */
@@ -108,6 +113,16 @@ gtk_widget_accessible_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)
@@ -123,8 +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);
 
-  GTK_WIDGET_ACCESSIBLE (obj)->layer = ATK_LAYER_WIDGET;
+  GTK_WIDGET_ACCESSIBLE (obj)->priv->layer = ATK_LAYER_WIDGET;
   obj->role = ATK_ROLE_UNKNOWN;
+
+  gtk_widget_accessible_update_tooltip (GTK_WIDGET_ACCESSIBLE (obj), widget);
 }
 
 static const gchar *
@@ -139,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 *
@@ -243,7 +260,7 @@ gtk_widget_accessible_ref_relation_set (AtkObject *obj)
   if (widget == NULL)
     return NULL;
 
-  relation_set = ATK_OBJECT_CLASS (_gtk_widget_accessible_parent_class)->ref_relation_set (obj);
+  relation_set = ATK_OBJECT_CLASS (gtk_widget_accessible_parent_class)->ref_relation_set (obj);
 
   if (GTK_IS_BOX (widget))
     return relation_set;
@@ -312,7 +329,7 @@ gtk_widget_accessible_ref_state_set (AtkObject *accessible)
   GtkWidget *widget;
   AtkStateSet *state_set;
 
-  state_set = ATK_OBJECT_CLASS (_gtk_widget_accessible_parent_class)->ref_state_set (accessible);
+  state_set = ATK_OBJECT_CLASS (gtk_widget_accessible_parent_class)->ref_state_set (accessible);
 
   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
   if (widget == NULL)
@@ -457,6 +474,12 @@ gtk_widget_accessible_notify_gtk (GObject    *obj,
      * focus changes so we ignore this.
      */
     return;
+  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;
@@ -467,7 +490,8 @@ gtk_widget_accessible_notify_gtk (GObject    *obj,
       state = ATK_STATE_SENSITIVE;
       value = gtk_widget_get_sensitive (widget);
     }
-  else if (g_strcmp0 (pspec->name, "orientation") == 0)
+  else if (g_strcmp0 (pspec->name, "orientation") == 0 &&
+           GTK_IS_ORIENTABLE (widget))
     {
       GtkOrientable *orientable;
 
@@ -503,7 +527,7 @@ gtk_widget_accessible_get_attributes (AtkObject *obj)
 }
 
 static void
-_gtk_widget_accessible_class_init (GtkWidgetAccessibleClass *klass)
+gtk_widget_accessible_class_init (GtkWidgetAccessibleClass *klass)
 {
   AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
 
@@ -517,11 +541,16 @@ _gtk_widget_accessible_class_init (GtkWidgetAccessibleClass *klass)
   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)
+gtk_widget_accessible_init (GtkWidgetAccessible *accessible)
 {
+  accessible->priv = G_TYPE_INSTANCE_GET_PRIVATE (accessible,
+                                                  GTK_TYPE_WIDGET_ACCESSIBLE,
+                                                  GtkWidgetAccessiblePrivate);
 }
 
 static void
@@ -598,7 +627,7 @@ gtk_widget_accessible_get_layer (AtkComponent *component)
 {
   GtkWidgetAccessible *accessible = GTK_WIDGET_ACCESSIBLE (component);
 
-  return accessible->layer;
+  return accessible->priv->layer;
 }
 
 static gboolean
@@ -816,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;
+}