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

Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
#include "testlib.h"
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * This module is used to test the accessible implementation for buttons
Packit 98cdb6
 *
Packit 98cdb6
 * 1) It verifies that ATK_STATE_ARMED is set when a button is pressed
Packit 98cdb6
 * To check this click on the button whose name is specified in the
Packit 98cdb6
 * environment variable TEST_ACCESSIBLE_NAME or "button box" if the
Packit 98cdb6
 * environment variable is not set.
Packit 98cdb6
 *
Packit 98cdb6
 * 2) If the environment variable TEST_ACCESSIBLE_AUTO is set the program
Packit 98cdb6
 * will execute the action defined for a GailButton once.
Packit 98cdb6
 *
Packit 98cdb6
 * 3) Change an inconsistent toggle button to be consistent and vice versa.
Packit 98cdb6
 *
Packit 98cdb6
 * Note that currently this code needs to be changed manually to test
Packit 98cdb6
 * different actions.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
static void _create_event_watcher (void);
Packit 98cdb6
static void _check_object (AtkObject *obj);
Packit 98cdb6
static void button_pressed_handler (GtkButton *button);
Packit 98cdb6
static void _print_states (AtkObject *obj);
Packit 98cdb6
static void _print_button_image_info(AtkObject *obj);
Packit 98cdb6
static gint _do_button_action (gpointer data);
Packit 98cdb6
static gint _toggle_inconsistent (gpointer data);
Packit 98cdb6
static gint _finish_button_action (gpointer data);
Packit 98cdb6
Packit 98cdb6
#define NUM_VALID_ROLES 4
Packit 98cdb6
Packit 98cdb6
static void 
Packit 98cdb6
_check_object (AtkObject *obj)
Packit 98cdb6
{
Packit 98cdb6
  AtkRole role;
Packit 98cdb6
  static gboolean first_time = TRUE;
Packit 98cdb6
Packit 98cdb6
  role = atk_object_get_role (obj);
Packit 98cdb6
  if (role == ATK_ROLE_FRAME)
Packit 98cdb6
  /*
Packit 98cdb6
   * Find the specified button in the window
Packit 98cdb6
   */
Packit 98cdb6
  {
Packit 98cdb6
    AtkRole valid_roles[NUM_VALID_ROLES];
Packit 98cdb6
    const char *name;
Packit 98cdb6
    AtkObject *atk_button;
Packit 98cdb6
    GtkWidget *widget;
Packit 98cdb6
Packit 98cdb6
    valid_roles[0] = ATK_ROLE_PUSH_BUTTON;
Packit 98cdb6
    valid_roles[1] = ATK_ROLE_TOGGLE_BUTTON;
Packit 98cdb6
    valid_roles[2] = ATK_ROLE_CHECK_BOX;
Packit 98cdb6
    valid_roles[3] = ATK_ROLE_RADIO_BUTTON;
Packit 98cdb6
Packit 98cdb6
    name = g_getenv ("TEST_ACCESSIBLE_NAME");
Packit 98cdb6
    if (name == NULL)
Packit 98cdb6
      name = "button box";
Packit 98cdb6
    atk_button = find_object_by_accessible_name_and_role (obj, name,
Packit 98cdb6
                     valid_roles, NUM_VALID_ROLES);
Packit 98cdb6
Packit 98cdb6
    if (atk_button == NULL)
Packit 98cdb6
    {
Packit 98cdb6
      g_print ("Object not found for %s\n", name);
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
    g_assert (GTK_IS_ACCESSIBLE (atk_button));
Packit 98cdb6
    widget = GTK_ACCESSIBLE (atk_button)->widget;
Packit 98cdb6
    g_assert (GTK_IS_BUTTON (widget));
Packit 98cdb6
    g_signal_connect (GTK_OBJECT (widget),
Packit 98cdb6
                      "pressed",
Packit 98cdb6
                      G_CALLBACK (button_pressed_handler),
Packit 98cdb6
                      NULL);
Packit 98cdb6
    if (GTK_IS_TOGGLE_BUTTON (widget))
Packit 98cdb6
    {
Packit 98cdb6
      _toggle_inconsistent (GTK_TOGGLE_BUTTON (widget));
Packit 98cdb6
    }
Packit 98cdb6
    if (first_time)
Packit 98cdb6
      first_time = FALSE;
Packit 98cdb6
    else
Packit 98cdb6
      return;
Packit 98cdb6
Packit 98cdb6
    if (g_getenv ("TEST_ACCESSIBLE_AUTO"))
Packit 98cdb6
      {
Packit 98cdb6
        g_idle_add (_do_button_action, atk_button);
Packit 98cdb6
      }
Packit 98cdb6
  }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint _toggle_inconsistent (gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GtkToggleButton *toggle_button = GTK_TOGGLE_BUTTON (data);
Packit 98cdb6
Packit 98cdb6
  if (gtk_toggle_button_get_inconsistent (toggle_button))
Packit 98cdb6
  {
Packit 98cdb6
    gtk_toggle_button_set_inconsistent (toggle_button, FALSE);
Packit 98cdb6
  }
Packit 98cdb6
  else
Packit 98cdb6
  {
Packit 98cdb6
    gtk_toggle_button_set_inconsistent (toggle_button, TRUE);
Packit 98cdb6
  }
Packit 98cdb6
  return FALSE;
Packit 98cdb6
} 
Packit 98cdb6
Packit 98cdb6
static gint _do_button_action (gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  AtkObject *obj = ATK_OBJECT (data);
Packit 98cdb6
Packit 98cdb6
  atk_action_do_action (ATK_ACTION (obj), 2);
Packit 98cdb6
Packit 98cdb6
  g_timeout_add (5000, _finish_button_action, obj);
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint _finish_button_action (gpointer data)
Packit 98cdb6
{
Packit 98cdb6
#if 0
Packit 98cdb6
  AtkObject *obj = ATK_OBJECT (data);
Packit 98cdb6
Packit 98cdb6
  atk_action_do_action (ATK_ACTION (obj), 0);
Packit 98cdb6
#endif
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
button_pressed_handler (GtkButton *button)
Packit 98cdb6
{
Packit 98cdb6
  AtkObject *obj;
Packit 98cdb6
Packit 98cdb6
  obj = gtk_widget_get_accessible (GTK_WIDGET (button));
Packit 98cdb6
  _print_states (obj);
Packit 98cdb6
  _print_button_image_info (obj);
Packit 98cdb6
Packit 98cdb6
  if (GTK_IS_TOGGLE_BUTTON (button))
Packit 98cdb6
    {
Packit 98cdb6
      g_idle_add (_toggle_inconsistent, GTK_TOGGLE_BUTTON (button));
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void 
Packit 98cdb6
_print_states (AtkObject *obj)
Packit 98cdb6
{
Packit 98cdb6
  AtkStateSet *state_set;
Packit 98cdb6
  gint i;
Packit 98cdb6
Packit 98cdb6
  state_set = atk_object_ref_state_set (obj);
Packit 98cdb6
Packit 98cdb6
  g_print ("*** Start states ***\n");
Packit 98cdb6
  for (i = 0; i < 64; i++)
Packit 98cdb6
  {
Packit 98cdb6
     AtkStateType one_state;
Packit 98cdb6
     const gchar *name;
Packit 98cdb6
Packit 98cdb6
     if (atk_state_set_contains_state (state_set, i))
Packit 98cdb6
     {
Packit 98cdb6
       one_state = i;
Packit 98cdb6
Packit 98cdb6
       name = atk_state_type_get_name (one_state);
Packit 98cdb6
Packit 98cdb6
       if (name)
Packit 98cdb6
         g_print("%s\n", name);
Packit 98cdb6
     }
Packit 98cdb6
  }
Packit 98cdb6
  g_object_unref (state_set);
Packit 98cdb6
  g_print ("*** End states ***\n");
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void 
Packit 98cdb6
_print_button_image_info(AtkObject *obj) {
Packit 98cdb6
Packit 98cdb6
  gint height, width;
Packit 98cdb6
  const gchar *desc;
Packit 98cdb6
Packit 98cdb6
  height = width = 0;
Packit 98cdb6
Packit 98cdb6
  if(!ATK_IS_IMAGE(obj)) 
Packit 98cdb6
	return;
Packit 98cdb6
Packit 98cdb6
  g_print("*** Start Button Image Info ***\n");
Packit 98cdb6
  desc = atk_image_get_image_description(ATK_IMAGE(obj));
Packit 98cdb6
  g_print ("atk_image_get_image_desc returns : %s\n", desc ? desc : "<NULL>");
Packit 98cdb6
  atk_image_get_image_size(ATK_IMAGE(obj), &height ,&width);
Packit 98cdb6
  g_print("atk_image_get_image_size returns: height %d width %d\n",height,width);
Packit 98cdb6
  if(atk_image_set_image_description(ATK_IMAGE(obj), "New image Description")){
Packit 98cdb6
	desc = atk_image_get_image_description(ATK_IMAGE(obj));
Packit 98cdb6
	g_print ("atk_image_get_image_desc now returns : %s\n",desc ?desc:"<NULL>");
Packit 98cdb6
  }
Packit 98cdb6
  g_print("*** End Button Image Info ***\n");
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
_create_event_watcher (void)
Packit 98cdb6
{
Packit 98cdb6
  atk_add_focus_tracker (_check_object);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
int
Packit 98cdb6
gtk_module_init(gint argc, char* argv[])
Packit 98cdb6
{
Packit 98cdb6
  g_print("testbutton Module loaded\n");
Packit 98cdb6
Packit 98cdb6
  _create_event_watcher();
Packit 98cdb6
Packit 98cdb6
  return 0;
Packit 98cdb6
}