-/* 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);
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 */
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);
}
}
}
static void
-focus_event (AtkObject *obj,
- gboolean focus_in)
+gtk_widget_accessible_focus_event (AtkObject *obj,
+ gboolean focus_in)
{
AtkObject *focus_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);
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 *
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 *
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))
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;
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;
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)
{
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);
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;
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
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
return result;
}
+
+void
+_gtk_widget_accessible_set_layer (GtkWidgetAccessible *accessible,
+ AtkLayer layer)
+{
+ accessible->priv->layer = layer;
+}