Blame modules/other/gail/tests/testobject.c

Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
#include "testlib.h"
Packit Service fb6fa5
Packit Service fb6fa5
static void _print_accessible (AtkObject *obj);
Packit Service fb6fa5
static void _print_type (AtkObject *obj);
Packit Service fb6fa5
static void _print_states (AtkObject *obj);
Packit Service fb6fa5
static void _check_children (AtkObject *obj);
Packit Service fb6fa5
static void _check_relation (AtkObject *obj);
Packit Service fb6fa5
static void _create_event_watcher (void);
Packit Service fb6fa5
static void _focus_handler (AtkObject *obj, gboolean focus_in);
Packit Service fb6fa5
static gboolean _children_changed (GSignalInvocationHint *ihint,
Packit Service fb6fa5
                                   guint                  n_param_values,
Packit Service fb6fa5
                                   const GValue          *param_values,
Packit Service fb6fa5
                                   gpointer               data);
Packit Service fb6fa5
Packit Service fb6fa5
static guint id;
Packit Service fb6fa5
Packit Service fb6fa5
static void _print_states (AtkObject *obj)
Packit Service fb6fa5
{
Packit Service fb6fa5
  AtkStateSet *state_set;
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
Packit Service fb6fa5
  state_set = atk_object_ref_state_set (obj);
Packit Service fb6fa5
Packit Service fb6fa5
  g_print ("*** Start states ***\n");
Packit Service fb6fa5
  for (i = 0; i < 64; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
       AtkStateType one_state;
Packit Service fb6fa5
       const gchar *name;
Packit Service fb6fa5
Packit Service fb6fa5
       if (atk_state_set_contains_state (state_set, i))
Packit Service fb6fa5
         {
Packit Service fb6fa5
           one_state = i;
Packit Service fb6fa5
Packit Service fb6fa5
           name = atk_state_type_get_name (one_state);
Packit Service fb6fa5
Packit Service fb6fa5
           if (name)
Packit Service fb6fa5
             g_print("%s\n", name);
Packit Service fb6fa5
         }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  g_object_unref (state_set);
Packit Service fb6fa5
  g_print ("*** End states ***\n");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void _print_type (AtkObject *obj)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const gchar * typename = NULL;
Packit Service fb6fa5
  const gchar * name = NULL;
Packit Service fb6fa5
  AtkRole role;
Packit Service fb6fa5
  static gboolean in_print_type = FALSE;
Packit Service fb6fa5
   
Packit Service fb6fa5
  if (GTK_IS_ACCESSIBLE (obj))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkWidget* widget = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
      widget = GTK_ACCESSIBLE (obj)->widget;
Packit Service fb6fa5
      typename = g_type_name (G_OBJECT_TYPE (widget));
Packit Service fb6fa5
      g_print ("Widget type name: %s\n", typename ? typename : "NULL");
Packit Service fb6fa5
    }
Packit Service fb6fa5
  typename = g_type_name (G_OBJECT_TYPE (obj));
Packit Service fb6fa5
  g_print ("Accessible type name: %s\n", typename ? typename : "NULL");
Packit Service fb6fa5
  name = atk_object_get_name (obj);
Packit Service fb6fa5
  g_print("Accessible Name: %s\n", (name) ? name : "NULL");
Packit Service fb6fa5
  role = atk_object_get_role (obj);
Packit Service fb6fa5
  g_print ("Accessible Role: %s\n", atk_role_get_name (role));
Packit Service fb6fa5
Packit Service fb6fa5
  if (ATK_IS_COMPONENT (obj))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gint x, y, width, height;
Packit Service fb6fa5
      AtkStateSet *states;
Packit Service fb6fa5
Packit Service fb6fa5
      _print_states (obj);
Packit Service fb6fa5
      states = atk_object_ref_state_set (obj);
Packit Service fb6fa5
      if (atk_state_set_contains_state (states, ATK_STATE_VISIBLE))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          AtkObject *parent;
Packit Service fb6fa5
Packit Service fb6fa5
          atk_component_get_extents (ATK_COMPONENT (obj), 
Packit Service fb6fa5
                                     &x, &y, &width, &height, 
Packit Service fb6fa5
                                     ATK_XY_SCREEN);
Packit Service fb6fa5
          g_print ("ATK_XY_SCREEN: x: %d y: %d width: %d height: %d\n",
Packit Service fb6fa5
                   x, y, width, height);
Packit Service fb6fa5
Packit Service fb6fa5
          atk_component_get_extents (ATK_COMPONENT (obj), 
Packit Service fb6fa5
                                     &x, &y, &width, &height, 
Packit Service fb6fa5
                                     ATK_XY_WINDOW);
Packit Service fb6fa5
          g_print ("ATK_XY_WINDOW: x: %d y: %d width: %d height: %d\n", 
Packit Service fb6fa5
                   x, y, width, height);
Packit Service fb6fa5
          if (atk_state_set_contains_state (states, ATK_STATE_SHOWING) &&
Packit Service fb6fa5
              ATK_IS_TEXT (obj))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              gint offset;
Packit Service fb6fa5
Packit Service fb6fa5
              atk_text_get_character_extents (ATK_TEXT (obj), 1, 
Packit Service fb6fa5
                                              &x, &y, &width, &height, 
Packit Service fb6fa5
                                              ATK_XY_WINDOW);
Packit Service fb6fa5
              g_print ("Character extents : %d %d %d %d\n", 
Packit Service fb6fa5
                       x, y, width, height);
Packit Service fb6fa5
              if (width != 0 && height != 0)
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  offset = atk_text_get_offset_at_point (ATK_TEXT (obj), 
Packit Service fb6fa5
                                                         x, y, 
Packit Service fb6fa5
                                                         ATK_XY_WINDOW);
Packit Service fb6fa5
                  if (offset != 1)
Packit Service fb6fa5
                    {
Packit Service fb6fa5
                      g_print ("Wrong offset returned (%d) %d\n", 1, offset);
Packit Service fb6fa5
                    }
Packit Service fb6fa5
                }
Packit Service fb6fa5
            }
Packit Service fb6fa5
          if (in_print_type)
Packit Service fb6fa5
            return;
Packit Service fb6fa5
Packit Service fb6fa5
          parent = atk_object_get_parent (obj);
Packit Service fb6fa5
          if (!ATK_IS_COMPONENT (parent))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              /* Assume toplevel */
Packit Service fb6fa5
              g_object_unref (G_OBJECT (states));
Packit Service fb6fa5
              return;
Packit Service fb6fa5
            }
Packit Service fb6fa5
#if 0
Packit Service fb6fa5
          obj1 = atk_component_ref_accessible_at_point (ATK_COMPONENT (parent),
Packit Service fb6fa5
                                                        x, y, ATK_XY_WINDOW);
Packit Service fb6fa5
          if (obj != obj1)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              g_print ("Inconsistency between object and ref_accessible_at_point\n");
Packit Service fb6fa5
              in_print_type = TRUE;
Packit Service fb6fa5
              _print_type (obj1);
Packit Service fb6fa5
              in_print_type = FALSE;
Packit Service fb6fa5
            }
Packit Service fb6fa5
#endif
Packit Service fb6fa5
        }
Packit Service fb6fa5
      g_object_unref (G_OBJECT (states));
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void _print_accessible (AtkObject *obj)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget* widget = NULL;
Packit Service fb6fa5
  AtkObject* parent_atk;
Packit Service fb6fa5
  AtkObject* ref_obj;
Packit Service fb6fa5
  AtkRole    role;
Packit Service fb6fa5
  static gboolean first_time = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (first_time)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      first_time = FALSE;
Packit Service fb6fa5
      atk_add_global_event_listener (_children_changed, 
Packit Service fb6fa5
                                     "Atk:AtkObject:children_changed");
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /*
Packit Service fb6fa5
   * Check that the object returned by the atk_implementor_ref_accessible()
Packit Service fb6fa5
   * for a widget is the same as the accessible object
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (GTK_IS_ACCESSIBLE (obj))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      widget = GTK_ACCESSIBLE (obj)->widget;
Packit Service fb6fa5
      ref_obj = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (widget));
Packit Service fb6fa5
      g_assert (ref_obj == obj);
Packit Service fb6fa5
      g_object_unref (G_OBJECT (ref_obj));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  /*
Packit Service fb6fa5
   * Add a focus handler so we see focus out events as well
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (ATK_IS_COMPONENT (obj))
Packit Service fb6fa5
    atk_component_add_focus_handler (ATK_COMPONENT (obj), _focus_handler);
Packit Service fb6fa5
  g_print ("Object:\n");
Packit Service fb6fa5
  _print_type (obj);
Packit Service fb6fa5
  _print_states (obj);
Packit Service fb6fa5
Packit Service fb6fa5
  /*
Packit Service fb6fa5
   * Get the parent object
Packit Service fb6fa5
   */
Packit Service fb6fa5
  parent_atk = atk_object_get_parent (obj);
Packit Service fb6fa5
  if (parent_atk)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_print ("Parent Object:\n");
Packit Service fb6fa5
      _print_type (parent_atk);
Packit Service fb6fa5
      parent_atk = atk_object_get_parent (parent_atk);
Packit Service fb6fa5
      if (parent_atk)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_print ("Grandparent Object:\n");
Packit Service fb6fa5
          _print_type (parent_atk);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    } 
Packit Service fb6fa5
  else 
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_print ("No parent\n");
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  role = atk_object_get_role (obj);
Packit Service fb6fa5
Packit Service fb6fa5
  if ((role == ATK_ROLE_FRAME) || (role == ATK_ROLE_DIALOG))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _check_children (obj);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void _check_relation (AtkObject *obj)
Packit Service fb6fa5
{
Packit Service fb6fa5
  AtkRelationSet* relation_set = atk_object_ref_relation_set (obj);
Packit Service fb6fa5
  gint n_relations, i;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (relation_set);
Packit Service fb6fa5
Packit Service fb6fa5
  n_relations = atk_relation_set_get_n_relations (relation_set);
Packit Service fb6fa5
  for (i = 0; i < n_relations; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      AtkRelation* relation = atk_relation_set_get_relation (relation_set, i);
Packit Service fb6fa5
Packit Service fb6fa5
      g_print ("Index: %d Relation type: %d Number: %d\n", i,
Packit Service fb6fa5
                atk_relation_get_relation_type (relation),
Packit Service fb6fa5
                atk_relation_get_target (relation)->len);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  g_object_unref (relation_set);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void _check_children (AtkObject *obj)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint n_children, i;
Packit Service fb6fa5
  AtkLayer layer;
Packit Service fb6fa5
  AtkRole role;
Packit Service fb6fa5
Packit Service fb6fa5
  g_print ("Start Check Children\n");
Packit Service fb6fa5
  n_children = atk_object_get_n_accessible_children (obj);
Packit Service fb6fa5
  g_print ("Number of children: %d\n", n_children);
Packit Service fb6fa5
Packit Service fb6fa5
  role = atk_object_get_role (obj);
Packit Service fb6fa5
Packit Service fb6fa5
  if (ATK_IS_COMPONENT (obj))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      atk_component_add_focus_handler (ATK_COMPONENT (obj), _focus_handler);
Packit Service fb6fa5
      layer = atk_component_get_layer (ATK_COMPONENT (obj));
Packit Service fb6fa5
      if (role == ATK_ROLE_MENU)
Packit Service fb6fa5
	      g_assert (layer == ATK_LAYER_POPUP);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	      g_print ("Layer: %d\n", layer);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < n_children; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      AtkObject *child;
Packit Service fb6fa5
      AtkObject *parent;
Packit Service fb6fa5
      int j;
Packit Service fb6fa5
Packit Service fb6fa5
      child = atk_object_ref_accessible_child (obj, i);
Packit Service fb6fa5
      parent = atk_object_get_parent (child);
Packit Service fb6fa5
      j = atk_object_get_index_in_parent (child);
Packit Service fb6fa5
      _print_type (child);
Packit Service fb6fa5
      _check_relation (child);
Packit Service fb6fa5
      _check_children (child);
Packit Service fb6fa5
      if (obj != parent)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_print ("*** Inconsistency between atk_object_get_parent() and "
Packit Service fb6fa5
                   "atk_object_ref_accessible_child() ***\n");
Packit Service fb6fa5
          _print_type (child);
Packit Service fb6fa5
          _print_type (obj);
Packit Service fb6fa5
          if (parent)
Packit Service fb6fa5
            _print_type (parent);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      g_object_unref (G_OBJECT (child));
Packit Service fb6fa5
                 
Packit Service fb6fa5
      if (j != i)
Packit Service fb6fa5
        g_print ("*** Inconsistency between parent and children %d %d ***\n",
Packit Service fb6fa5
                 i, j);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  g_print ("End Check Children\n");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
_children_changed (GSignalInvocationHint *ihint,
Packit Service fb6fa5
                   guint                  n_param_values,
Packit Service fb6fa5
                   const GValue          *param_values,
Packit Service fb6fa5
                   gpointer               data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObject *object;
Packit Service fb6fa5
  guint index;
Packit Service fb6fa5
  gpointer target;
Packit Service fb6fa5
  const gchar *target_name = "NotAtkObject";
Packit Service fb6fa5
Packit Service fb6fa5
  object = g_value_get_object (param_values + 0);
Packit Service fb6fa5
  index = g_value_get_uint (param_values + 1);
Packit Service fb6fa5
  target = g_value_get_pointer (param_values + 2);
Packit Service fb6fa5
  if (G_IS_OBJECT (target))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (ATK_IS_OBJECT (target))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          target_name = atk_object_get_name (target);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      if (!target_name) 
Packit Service fb6fa5
        target_name = g_type_name (G_OBJECT_TYPE (G_OBJECT (target)));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!target)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          AtkObject *child;
Packit Service fb6fa5
Packit Service fb6fa5
          child = atk_object_ref_accessible_child (ATK_OBJECT (object), index);
Packit Service fb6fa5
          if (child)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              target_name = g_type_name (G_OBJECT_TYPE (G_OBJECT (child)));
Packit Service fb6fa5
              g_object_unref (child);
Packit Service fb6fa5
            }
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  g_print ("_children_watched: %s %s %s index: %d\n", 
Packit Service fb6fa5
           g_type_name (G_OBJECT_TYPE (object)),
Packit Service fb6fa5
           g_quark_to_string (ihint->detail),
Packit Service fb6fa5
           target_name, index);
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
_create_event_watcher (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /*
Packit Service fb6fa5
   * _print_accessible() will be called for an accessible object when its
Packit Service fb6fa5
   * widget receives focus.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  id = atk_add_focus_tracker (_print_accessible);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
_focus_handler (AtkObject *obj, gboolean focus_in)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_print ("In _focus_handler focus_in: %s\n", focus_in ? "true" : "false"); 
Packit Service fb6fa5
  _print_type (obj);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
int
Packit Service fb6fa5
gtk_module_init(gint argc, char* argv[])
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_print("testobject Module loaded\n");
Packit Service fb6fa5
Packit Service fb6fa5
  _create_event_watcher();
Packit Service fb6fa5
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}