[gtk+] a11y: Implement ref_state_set using the new APIs



commit 08d86fabc4237092bf04a97795498f2c45575085
Author: Benjamin Otte <otte redhat com>
Date:   Thu Nov 24 01:59:18 2011 +0100

    a11y: Implement ref_state_set using the new APIs
    
    Various tiny semantic changes in here.
    
    The big fix is that we consider every cell as visible and as showing if
    the treeview is mapped.
    This was also fixed in the tree dump test.

 gtk/a11y/gtkcellaccessible.c         |   79 +++++++++++++++++++++++-----------
 gtk/a11y/gtkcellaccessible.h         |    1 -
 gtk/a11y/gtkrenderercellaccessible.c |    1 -
 gtk/a11y/gtktextcellaccessible.c     |   14 +++++-
 tests/a11y/tree.txt                  |    8 ++--
 5 files changed, 69 insertions(+), 34 deletions(-)
---
diff --git a/gtk/a11y/gtkcellaccessible.c b/gtk/a11y/gtkcellaccessible.c
index 47c5f97..802d054 100644
--- a/gtk/a11y/gtkcellaccessible.c
+++ b/gtk/a11y/gtkcellaccessible.c
@@ -61,9 +61,6 @@ gtk_cell_accessible_object_finalize (GObject *obj)
   gpointer target_object;
   gint i;
 
-  if (cell->state_set)
-    g_object_unref (cell->state_set);
-
   if (cell->action_list)
     g_list_free_full (cell->action_list, destroy_action_info);
 
@@ -107,15 +104,62 @@ gtk_cell_accessible_get_index_in_parent (AtkObject *obj)
 }
 
 static AtkStateSet *
-gtk_cell_accessible_ref_state_set (AtkObject *obj)
+gtk_cell_accessible_ref_state_set (AtkObject *accessible)
 {
-  GtkCellAccessible *cell = GTK_CELL_ACCESSIBLE (obj);
+  GtkCellAccessible *cell_accessible;
+  AtkStateSet *state_set;
+  GtkCellRendererState flags;
+  gboolean expandable, expanded;
+
+  cell_accessible = GTK_CELL_ACCESSIBLE (accessible);
+
+  state_set = atk_state_set_new ();
+
+  if (cell_accessible->widget == NULL)
+    {
+      atk_state_set_add_state (state_set, ATK_STATE_DEFUNCT);
+      return state_set;
+    }
+
+  flags = _gtk_cell_accessible_get_state (cell_accessible, &expandable, &expanded);
+
+  atk_state_set_add_state (state_set, ATK_STATE_TRANSIENT);
+
+  if (!(flags & GTK_CELL_RENDERER_INSENSITIVE))
+    {
+      atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
+      atk_state_set_add_state (state_set, ATK_STATE_ENABLED);
+    }
+
+  atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
+  if (flags & GTK_CELL_RENDERER_SELECTED)
+    atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
+
+  atk_state_set_add_state (state_set, ATK_STATE_VISIBLE);
+  if (gtk_widget_get_mapped (cell_accessible->widget))
+    atk_state_set_add_state (state_set, ATK_STATE_SHOWING);
 
-  g_object_ref (cell->state_set);
+  /* This is not completely right. We should be tracking the
+   * focussed cell renderer, but that involves diving into
+   * cell areas...
+   */
+  atk_state_set_add_state (state_set, ATK_STATE_FOCUSABLE);
+  if (flags & GTK_CELL_RENDERER_FOCUSED)
+    {
+      /* XXX: Why do we set ACTIVE here? */
+      atk_state_set_add_state (state_set, ATK_STATE_ACTIVE);
+      atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
+    }
 
-  return cell->state_set;
+  if (expandable)
+    atk_state_set_add_state (state_set, ATK_STATE_EXPANDABLE);
+  if (expanded)
+    atk_state_set_add_state (state_set, ATK_STATE_EXPANDED);
+  
+  return state_set;
 }
 
+
 static void
 _gtk_cell_accessible_class_init (GtkCellAccessibleClass *klass)
 {
@@ -133,11 +177,6 @@ _gtk_cell_accessible_init (GtkCellAccessible *cell)
 {
   cell->widget = NULL;
   cell->action_list = NULL;
-  cell->state_set = atk_state_set_new ();
-  atk_state_set_add_state (cell->state_set, ATK_STATE_TRANSIENT);
-  atk_state_set_add_state (cell->state_set, ATK_STATE_ENABLED);
-  atk_state_set_add_state (cell->state_set, ATK_STATE_SENSITIVE);
-  atk_state_set_add_state (cell->state_set, ATK_STATE_SELECTABLE);
 }
 
 static void
@@ -164,14 +203,8 @@ _gtk_cell_accessible_add_state (GtkCellAccessible *cell,
                                 AtkStateType       state_type,
                                 gboolean           emit_signal)
 {
-  gboolean rc;
   AtkObject *parent;
 
-  if (atk_state_set_contains_state (cell->state_set, state_type))
-    return FALSE;
-
-  rc = atk_state_set_add_state (cell->state_set, state_type);
-
   /* The signal should only be generated if the value changed,
    * not when the cell is set up. So states that are set
    * initially should pass FALSE as the emit_signal argument.
@@ -191,7 +224,7 @@ _gtk_cell_accessible_add_state (GtkCellAccessible *cell,
   if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent))
     _gtk_cell_accessible_add_state (GTK_CELL_ACCESSIBLE (parent), state_type, emit_signal);
 
-  return rc;
+  return TRUE;
 }
 
 gboolean
@@ -199,16 +232,10 @@ _gtk_cell_accessible_remove_state (GtkCellAccessible *cell,
                                    AtkStateType       state_type,
                                    gboolean           emit_signal)
 {
-  gboolean rc;
   AtkObject *parent;
 
-  if (!atk_state_set_contains_state (cell->state_set, state_type))
-    return FALSE;
-
   parent = atk_object_get_parent (ATK_OBJECT (cell));
 
-  rc = atk_state_set_remove_state (cell->state_set, state_type);
-
   /* The signal should only be generated if the value changed,
    * not when the cell is set up.  So states that are set
    * initially should pass FALSE as the emit_signal argument.
@@ -227,7 +254,7 @@ _gtk_cell_accessible_remove_state (GtkCellAccessible *cell,
   if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent))
     _gtk_cell_accessible_remove_state (GTK_CELL_ACCESSIBLE (parent), state_type, emit_signal);
 
-  return rc;
+  return TRUE;
 }
 
 gboolean
diff --git a/gtk/a11y/gtkcellaccessible.h b/gtk/a11y/gtkcellaccessible.h
index 84cd4bf..597f262 100644
--- a/gtk/a11y/gtkcellaccessible.h
+++ b/gtk/a11y/gtkcellaccessible.h
@@ -39,7 +39,6 @@ struct _GtkCellAccessible
   AtkObject parent;
 
   GtkWidget    *widget;
-  AtkStateSet *state_set;
   GList       *action_list;
 };
 
diff --git a/gtk/a11y/gtkrenderercellaccessible.c b/gtk/a11y/gtkrenderercellaccessible.c
index c38856d..1fa4ea0 100644
--- a/gtk/a11y/gtkrenderercellaccessible.c
+++ b/gtk/a11y/gtkrenderercellaccessible.c
@@ -25,7 +25,6 @@
 
 G_DEFINE_TYPE (GtkRendererCellAccessible, _gtk_renderer_cell_accessible, GTK_TYPE_CELL_ACCESSIBLE)
 
-
 static void
 gtk_renderer_cell_accessible_finalize (GObject *object)
 {
diff --git a/gtk/a11y/gtktextcellaccessible.c b/gtk/a11y/gtktextcellaccessible.c
index c6214b9..f289f93 100644
--- a/gtk/a11y/gtktextcellaccessible.c
+++ b/gtk/a11y/gtktextcellaccessible.c
@@ -125,6 +125,17 @@ static void atk_text_interface_init (AtkTextIface *iface);
 G_DEFINE_TYPE_WITH_CODE (GtkTextCellAccessible, _gtk_text_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE,
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init))
 
+static AtkStateSet *
+gtk_text_cell_accessible_ref_state_set (AtkObject *accessible)
+{
+  AtkStateSet *state_set;
+
+  state_set = ATK_OBJECT_CLASS (_gtk_text_cell_accessible_parent_class)->ref_state_set (accessible);
+
+  atk_state_set_add_state (state_set, ATK_STATE_SINGLE_LINE);
+
+  return state_set;
+}
 
 static void
 gtk_text_cell_accessible_finalize (GObject *object)
@@ -221,6 +232,7 @@ _gtk_text_cell_accessible_class_init (GtkTextCellAccessibleClass *klass)
   renderer_cell_class->property_list = property_list;
 
   atk_object_class->get_name = gtk_text_cell_accessible_get_name;
+  atk_object_class->ref_state_set = gtk_text_cell_accessible_ref_state_set;
 
   gobject_class->finalize = gtk_text_cell_accessible_finalize;
 }
@@ -231,8 +243,6 @@ _gtk_text_cell_accessible_init (GtkTextCellAccessible *text_cell)
   text_cell->cell_text = NULL;
   text_cell->caret_pos = 0;
   text_cell->cell_length = 0;
-  atk_state_set_add_state (GTK_CELL_ACCESSIBLE (text_cell)->state_set,
-                           ATK_STATE_SINGLE_LINE);
 }
 
 AtkObject *
diff --git a/tests/a11y/tree.txt b/tests/a11y/tree.txt
index 8296929..cefba66 100644
--- a/tests/a11y/tree.txt
+++ b/tests/a11y/tree.txt
@@ -66,7 +66,7 @@ window1
       parent: tree1
       index: 2
       name: One
-      state: enabled focusable focused selectable selected sensitive single-line transient visible
+      state: enabled focusable selectable selected sensitive showing single-line transient visible
       <AtkComponent>
       layer: widget
       alpha: 1
@@ -146,7 +146,7 @@ window1
       parent: tree1
       index: 4
       name: Three
-      state: enabled focusable selectable sensitive single-line transient visible
+      state: enabled focusable selectable sensitive showing single-line transient visible
       <AtkComponent>
       layer: widget
       alpha: 1
@@ -226,7 +226,7 @@ window1
       parent: tree1
       index: 6
       name: Five
-      state: enabled focusable selectable sensitive single-line transient visible
+      state: enabled focusable selectable sensitive showing single-line transient visible
       <AtkComponent>
       layer: widget
       alpha: 1
@@ -306,7 +306,7 @@ window1
       parent: tree1
       index: 8
       name: Seven
-      state: enabled focusable selectable sensitive single-line transient visible
+      state: enabled focusable selectable sensitive showing single-line transient visible
       <AtkComponent>
       layer: widget
       alpha: 1



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