[gtk/wip/ebassi/a11y-2: 5/5] Notify mapped state to the accessible object directly



commit 333c23a348e153330955b19aab3010b791725278
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Apr 22 20:25:48 2020 +0100

    Notify mapped state to the accessible object directly
    
    Do not use signal connections: if we have an accessible object, notify
    it directly when getting mapped and unmapped.

 gtk/a11y/gtkwidgetaccessible.c        | 23 ++++++++++++++---------
 gtk/a11y/gtkwidgetaccessibleprivate.h |  4 +++-
 gtk/gtkwidget.c                       | 10 ++++++++++
 3 files changed, 27 insertions(+), 10 deletions(-)
---
diff --git a/gtk/a11y/gtkwidgetaccessible.c b/gtk/a11y/gtkwidgetaccessible.c
index b8d4077f41..f1f1f8cba2 100644
--- a/gtk/a11y/gtkwidgetaccessible.c
+++ b/gtk/a11y/gtkwidgetaccessible.c
@@ -76,16 +76,23 @@ gtk_widget_accessible_update_bounds (GtkWidgetAccessible *self)
   g_signal_emit_by_name (self, "bounds-changed", &rect);
 }
 
-/* Translate GtkWidget mapped state into AtkObject showing */
-static gint
-map_cb (GtkWidget *widget)
+/*< private >
+ * gtk_widget_accessible_notify_showing:
+ * @self: a #GtkWidgetAccessible
+ *
+ * Translates the #GtkWidget mapped state into the #AtkObject
+ * showing state.
+ */
+void
+gtk_widget_accessible_notify_showing (GtkWidgetAccessible *self)
 {
-  AtkObject *accessible;
+  g_return_if_fail (GTK_IS_WIDGET_ACCESSIBLE (self));
+
+  GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (self));
 
-  accessible = gtk_widget_get_accessible (widget);
-  atk_object_notify_state_change (accessible, ATK_STATE_SHOWING,
+  atk_object_notify_state_change (ATK_OBJECT (self),
+                                  ATK_STATE_SHOWING,
                                   gtk_widget_get_mapped (widget));
-  return 1;
 }
 
 static void
@@ -97,8 +104,6 @@ gtk_widget_accessible_initialize (AtkObject *obj,
   widget = GTK_WIDGET (data);
 
   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);
 
   GTK_WIDGET_ACCESSIBLE (obj)->priv->layer = ATK_LAYER_WIDGET;
   obj->role = ATK_ROLE_UNKNOWN;
diff --git a/gtk/a11y/gtkwidgetaccessibleprivate.h b/gtk/a11y/gtkwidgetaccessibleprivate.h
index ac60f0e43d..e1f210bb35 100644
--- a/gtk/a11y/gtkwidgetaccessibleprivate.h
+++ b/gtk/a11y/gtkwidgetaccessibleprivate.h
@@ -25,7 +25,9 @@ G_BEGIN_DECLS
 void _gtk_widget_accessible_set_layer (GtkWidgetAccessible *accessible,
                                        AtkLayer             layer);
 
-void gtk_widget_accessible_update_bounds (GtkWidgetAccessible *self);
+void    gtk_widget_accessible_update_bounds     (GtkWidgetAccessible *self);
+
+void    gtk_widget_accessible_notify_showing    (GtkWidgetAccessible *self);
 
 G_END_DECLS
 
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index a300147fdb..b91ccb19f2 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -2795,11 +2795,16 @@ gtk_widget_map (GtkWidget *widget)
 
   if (!_gtk_widget_get_mapped (widget))
     {
+      GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
       gtk_widget_push_verify_invariants (widget);
 
       if (!_gtk_widget_get_realized (widget))
         gtk_widget_realize (widget);
 
+      if (priv->accessible != NULL)
+        gtk_widget_accessible_notify_showing (GTK_WIDGET_ACCESSIBLE (priv->accessible));
+
       g_signal_emit (widget, widget_signals[MAP], 0);
 
       update_cursor_on_state_change (widget);
@@ -2824,6 +2829,8 @@ gtk_widget_unmap (GtkWidget *widget)
 
   if (_gtk_widget_get_mapped (widget))
     {
+      GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
       g_object_ref (widget);
       gtk_widget_push_verify_invariants (widget);
 
@@ -2832,6 +2839,9 @@ gtk_widget_unmap (GtkWidget *widget)
 
       g_signal_emit (widget, widget_signals[UNMAP], 0);
 
+      if (priv->accessible != NULL)
+        gtk_widget_accessible_notify_showing (GTK_WIDGET_ACCESSIBLE (priv->accessible));
+
       update_cursor_on_state_change (widget);
 
       gtk_widget_pop_verify_invariants (widget);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]