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

Packit 98cdb6
#include <string.h>
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 menu items
Packit 98cdb6
 *
Packit 98cdb6
 * 1) When a menu item is clicked in testgtk, the action for the
Packit 98cdb6
 * item is performed.
Packit 98cdb6
 * 2) The name of the keybinding for the 'activate" action for a menu item
Packit 98cdb6
 * is output, if it exists.
Packit 98cdb6
 * 3) Execute the action for a menu item programatically
Packit 98cdb6
 */
Packit 98cdb6
#define NUM_VALID_ROLES 1
Packit 98cdb6
Packit 98cdb6
static void _create_event_watcher (void);
Packit 98cdb6
static void _check_object (AtkObject *obj);
Packit 98cdb6
static gint _do_menu_item_action (gpointer data);
Packit 98cdb6
Packit 98cdb6
static void 
Packit 98cdb6
_check_object (AtkObject *obj)
Packit 98cdb6
{
Packit 98cdb6
  AtkRole role;
Packit 98cdb6
  static const char *name = NULL;
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 menu item
Packit 98cdb6
   */
Packit 98cdb6
  {
Packit 98cdb6
    AtkRole valid_roles[NUM_VALID_ROLES];
Packit 98cdb6
    AtkObject *atk_menu_item;
Packit 98cdb6
    GtkWidget *widget;
Packit 98cdb6
Packit 98cdb6
    if (name == NULL)
Packit 98cdb6
    {
Packit 98cdb6
      valid_roles[0] = ATK_ROLE_MENU_ITEM;
Packit 98cdb6
Packit 98cdb6
      name = g_getenv ("TEST_ACCESSIBLE_NAME");
Packit 98cdb6
      if (name == NULL)
Packit 98cdb6
        name = "foo";
Packit 98cdb6
    }
Packit 98cdb6
    atk_menu_item = find_object_by_accessible_name_and_role (obj, name,
Packit 98cdb6
                     valid_roles, NUM_VALID_ROLES);
Packit 98cdb6
Packit 98cdb6
    if (atk_menu_item == NULL)
Packit 98cdb6
    {
Packit 98cdb6
      g_print ("Object not found for %s\n", name);
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
    g_assert (GTK_IS_ACCESSIBLE (atk_menu_item));
Packit 98cdb6
    widget = GTK_ACCESSIBLE (atk_menu_item)->widget;
Packit 98cdb6
    g_assert (GTK_IS_MENU_ITEM (widget));
Packit 98cdb6
Packit 98cdb6
    if (first_time)
Packit 98cdb6
      first_time = FALSE;
Packit 98cdb6
    else
Packit 98cdb6
      return;
Packit 98cdb6
Packit 98cdb6
    /*
Packit 98cdb6
     * This action opens the menu whose name is "foo" or whatever
Packit 98cdb6
     * was specified in the environment variable TEST_ACCESSIBLE_NAME
Packit 98cdb6
     */
Packit 98cdb6
    atk_action_do_action (ATK_ACTION (atk_menu_item), 0);
Packit 98cdb6
  }
Packit 98cdb6
  else if ((role == ATK_ROLE_MENU_ITEM) ||
Packit 98cdb6
           (role == ATK_ROLE_CHECK_MENU_ITEM) ||
Packit 98cdb6
           (role == ATK_ROLE_RADIO_MENU_ITEM) ||
Packit 98cdb6
           (role == ATK_ROLE_TEAR_OFF_MENU_ITEM))
Packit 98cdb6
  {
Packit 98cdb6
    const char *keybinding;
Packit 98cdb6
    const char *accessible_name;
Packit 98cdb6
Packit 98cdb6
    accessible_name = atk_object_get_name (obj);
Packit 98cdb6
    if (accessible_name)
Packit 98cdb6
      g_print ("Name: %s\n", accessible_name);
Packit 98cdb6
    g_print ("Action: %s\n", atk_action_get_name (ATK_ACTION (obj), 0));
Packit 98cdb6
    keybinding = atk_action_get_keybinding (ATK_ACTION (obj), 0);
Packit 98cdb6
    if (keybinding)
Packit 98cdb6
      g_print ("KeyBinding: %s\n", keybinding);
Packit 98cdb6
    /*
Packit 98cdb6
     * Do the action associated with the menu item once, otherwise
Packit 98cdb6
     * we get into a loop
Packit 98cdb6
     */
Packit 98cdb6
    if (strcmp (name, accessible_name) == 0)
Packit 98cdb6
    {
Packit 98cdb6
      if (first_time)
Packit 98cdb6
        first_time = FALSE;
Packit 98cdb6
      else
Packit 98cdb6
        return;
Packit 98cdb6
      if (g_getenv ("TEST_ACCESSIBLE_AUTO"))
Packit 98cdb6
        {
Packit 98cdb6
          g_idle_add (_do_menu_item_action, obj);
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
  }
Packit 98cdb6
  else
Packit 98cdb6
  {
Packit 98cdb6
    const char *accessible_name;
Packit 98cdb6
Packit 98cdb6
    accessible_name = atk_object_get_name (obj);
Packit 98cdb6
    if (accessible_name)
Packit 98cdb6
      g_print ("Name: %s\n", accessible_name);
Packit 98cdb6
    else if (GTK_IS_ACCESSIBLE (obj))
Packit 98cdb6
    {
Packit 98cdb6
      GtkWidget *widget = GTK_ACCESSIBLE (obj)->widget;
Packit 98cdb6
      g_print ("Type: %s\n", g_type_name (G_OBJECT_TYPE (widget)));
Packit 98cdb6
    } 
Packit 98cdb6
  }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint _do_menu_item_action (gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  AtkObject *obj = ATK_OBJECT (data);
Packit 98cdb6
Packit 98cdb6
  atk_action_do_action (ATK_ACTION (obj), 0);
Packit 98cdb6
Packit 98cdb6
  return FALSE;
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("testmenuitem Module loaded\n");
Packit 98cdb6
Packit 98cdb6
  _create_event_watcher();
Packit 98cdb6
Packit 98cdb6
  return 0;
Packit 98cdb6
}