diff --git a/gtk/a11y/gtkcontaineraccessible.c b/gtk/a11y/gtkcontaineraccessible.c index 98e5554319..0ea0d765e4 100644 --- a/gtk/a11y/gtkcontaineraccessible.c +++ b/gtk/a11y/gtkcontaineraccessible.c @@ -17,10 +17,13 @@ #include "config.h" -#include #include "gtkcontaineraccessible.h" #include "gtkcontaineraccessibleprivate.h" +#include + +#include "gtkwidgetprivate.h" + struct _GtkContainerAccessiblePrivate { GList *children; @@ -76,36 +79,42 @@ gtk_container_accessible_ref_child (AtkObject *obj, return accessible; } -static gint -gtk_container_accessible_add_gtk (GtkContainer *container, - GtkWidget *widget, - gpointer data) +void +_gtk_container_accessible_add (GtkWidget *parent, + GtkWidget *child) { - GtkContainerAccessible *accessible = GTK_CONTAINER_ACCESSIBLE (data); + GtkContainerAccessible *accessible; GtkContainerAccessibleClass *klass; + AtkObject *obj; + obj = _gtk_widget_peek_accessible (GTK_WIDGET (parent)); + if (!GTK_IS_CONTAINER_ACCESSIBLE (obj)) + return; + + accessible = GTK_CONTAINER_ACCESSIBLE (obj); klass = GTK_CONTAINER_ACCESSIBLE_GET_CLASS (accessible); if (klass->add_gtk) - return klass->add_gtk (container, widget, data); - else - return 1; + klass->add_gtk (GTK_CONTAINER (parent), child, obj); } - -static gint -gtk_container_accessible_remove_gtk (GtkContainer *container, - GtkWidget *widget, - gpointer data) -{ - GtkContainerAccessible *accessible = GTK_CONTAINER_ACCESSIBLE (data); - GtkContainerAccessibleClass *klass; +void +_gtk_container_accessible_remove (GtkWidget *parent, + GtkWidget *child) +{ + GtkContainerAccessible *accessible; + GtkContainerAccessibleClass *klass; + AtkObject *obj; + + obj = _gtk_widget_peek_accessible (GTK_WIDGET (parent)); + if (!GTK_IS_CONTAINER_ACCESSIBLE (obj)) + return; + + accessible = GTK_CONTAINER_ACCESSIBLE (obj); klass = GTK_CONTAINER_ACCESSIBLE_GET_CLASS (accessible); if (klass->remove_gtk) - return klass->remove_gtk (container, widget, data); - else - return 1; + klass->remove_gtk (GTK_CONTAINER (parent), child, obj); } static gint @@ -165,9 +174,6 @@ gtk_container_accessible_real_initialize (AtkObject *obj, accessible->priv->children = gtk_container_get_children (GTK_CONTAINER (data)); - g_signal_connect (data, "add", G_CALLBACK (gtk_container_accessible_add_gtk), obj); - g_signal_connect (data, "remove", G_CALLBACK (gtk_container_accessible_remove_gtk), obj); - obj->role = ATK_ROLE_PANEL; } diff --git a/gtk/a11y/gtkcontaineraccessibleprivate.h b/gtk/a11y/gtkcontaineraccessibleprivate.h index fa692ce59e..4d02a732ac 100644 --- a/gtk/a11y/gtkcontaineraccessibleprivate.h +++ b/gtk/a11y/gtkcontaineraccessibleprivate.h @@ -1,5 +1,5 @@ /* GTK+ - accessibility implementations - * Copyright 2001 Sun Microsystems Inc. + * Copyright (C) 2014 Benjamin Otte * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -22,12 +22,17 @@ G_BEGIN_DECLS -void _gtk_container_accessible_add_child (GtkContainerAccessible *accessible, - AtkObject *child, - gint index); -void _gtk_container_accessible_remove_child (GtkContainerAccessible *accessible, - AtkObject *child, - gint index); +void _gtk_container_accessible_add_child (GtkContainerAccessible *accessible, + AtkObject *child, + gint index); +void _gtk_container_accessible_remove_child (GtkContainerAccessible *accessible, + AtkObject *child, + gint index); +void _gtk_container_accessible_add (GtkWidget *parent, + GtkWidget *child); +void _gtk_container_accessible_remove (GtkWidget *parent, + GtkWidget *child); + G_END_DECLS #endif /* __GTK_CONTAINER_ACCESSIBLE_PRIVATE_H__ */ diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c index 14031397ff..1a99de3830 100644 --- a/gtk/gtkcontainer.c +++ b/gtk/gtkcontainer.c @@ -50,6 +50,7 @@ #include "gtkstylecontextprivate.h" #include "gtkwidgetpath.h" #include "a11y/gtkcontaineraccessible.h" +#include "a11y/gtkcontaineraccessibleprivate.h" /** * SECTION:gtkcontainer @@ -1556,6 +1557,8 @@ gtk_container_add (GtkContainer *container, } g_signal_emit (container, container_signals[ADD], 0, widget); + + _gtk_container_accessible_add (GTK_WIDGET (container), widget); } /** @@ -1581,7 +1584,13 @@ gtk_container_remove (GtkContainer *container, g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (gtk_widget_get_parent (widget) == GTK_WIDGET (container) || GTK_IS_ASSISTANT (container) || GTK_IS_ACTION_BAR (container)); + g_object_ref (widget); + g_signal_emit (container, container_signals[REMOVE], 0, widget); + + _gtk_container_accessible_remove (GTK_WIDGET (container), widget); + + g_object_unref (widget); } void