Blame atk/atkutil.c

Packit Service ef73c4
/* ATK -  Accessibility Toolkit
Packit Service ef73c4
 * Copyright 2001 Sun Microsystems Inc.
Packit Service ef73c4
 *
Packit Service ef73c4
 * This library is free software; you can redistribute it and/or
Packit Service ef73c4
 * modify it under the terms of the GNU Lesser General Public
Packit Service ef73c4
 * License as published by the Free Software Foundation; either
Packit Service ef73c4
 * version 2 of the License, or (at your option) any later version.
Packit Service ef73c4
 *
Packit Service ef73c4
 * This library is distributed in the hope that it will be useful,
Packit Service ef73c4
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service ef73c4
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service ef73c4
 * Lesser General Public License for more details.
Packit Service ef73c4
 *
Packit Service ef73c4
 * You should have received a copy of the GNU Lesser General Public
Packit Service ef73c4
 * License along with this library; if not, write to the
Packit Service ef73c4
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service ef73c4
 * Boston, MA 02111-1307, USA.
Packit Service ef73c4
 */
Packit Service ef73c4
Packit Service ef73c4
#include "config.h"
Packit Service ef73c4
Packit Service ef73c4
#include "atkutil.h"
Packit Service ef73c4
#include "atkmarshal.h"
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * SECTION:atkutil
Packit Service ef73c4
 * @Short_description: A set of ATK utility functions for event and toolkit support.
Packit Service ef73c4
 * @Title:AtkUtil
Packit Service ef73c4
 *
Packit Service ef73c4
 * A set of ATK utility functions which are used to support event
Packit Service ef73c4
 * registration of various types, and obtaining the 'root' accessible
Packit Service ef73c4
 * of a process and information about the current ATK implementation
Packit Service ef73c4
 * and toolkit version.
Packit Service ef73c4
 */
Packit Service ef73c4
Packit Service ef73c4
static void atk_util_class_init (AtkUtilClass *klass);
Packit Service ef73c4
Packit Service ef73c4
static AtkObject *previous_focus_object = NULL;
Packit Service ef73c4
Packit Service ef73c4
typedef struct _AtkUtilListenerInfo AtkUtilListenerInfo;
Packit Service ef73c4
struct _AtkUtilListenerInfo
Packit Service ef73c4
{
Packit Service ef73c4
  gint key;
Packit Service ef73c4
  guint signal_id;
Packit Service ef73c4
  gulong hook_id;
Packit Service ef73c4
};
Packit Service ef73c4
static GHashTable *listener_list = NULL;
Packit Service ef73c4
Packit Service ef73c4
GType
Packit Service ef73c4
atk_util_get_type (void)
Packit Service ef73c4
{
Packit Service ef73c4
  static GType type = 0;
Packit Service ef73c4
Packit Service ef73c4
  if (!type)
Packit Service ef73c4
    {
Packit Service ef73c4
      static const GTypeInfo typeInfo =
Packit Service ef73c4
      {
Packit Service ef73c4
        sizeof (AtkUtilClass),
Packit Service ef73c4
        (GBaseInitFunc) NULL,
Packit Service ef73c4
        (GBaseFinalizeFunc) NULL,
Packit Service ef73c4
        (GClassInitFunc) atk_util_class_init,
Packit Service ef73c4
        (GClassFinalizeFunc) NULL,
Packit Service ef73c4
        NULL,
Packit Service ef73c4
        sizeof (AtkUtil),
Packit Service ef73c4
        0,
Packit Service ef73c4
        (GInstanceInitFunc) NULL,
Packit Service ef73c4
      } ;
Packit Service ef73c4
      type = g_type_register_static (G_TYPE_OBJECT, "AtkUtil", &typeInfo, 0) ;
Packit Service ef73c4
    }
Packit Service ef73c4
  return type;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/*
Packit Service ef73c4
 * This file supports the addition and removal of multiple focus handlers
Packit Service ef73c4
 * as long as they are all called in the same thread.
Packit Service ef73c4
 */
Packit Service ef73c4
static AtkEventListenerInit  focus_tracker_init = (AtkEventListenerInit) NULL;
Packit Service ef73c4
Packit Service ef73c4
static gboolean init_done = FALSE;
Packit Service ef73c4
Packit Service ef73c4
/*
Packit Service ef73c4
 * Array of FocusTracker structs
Packit Service ef73c4
 */
Packit Service ef73c4
static GArray *trackers = NULL;
Packit Service ef73c4
static guint  global_index = 0;
Packit Service ef73c4
Packit Service ef73c4
typedef struct _FocusTracker FocusTracker;
Packit Service ef73c4
Packit Service ef73c4
struct _FocusTracker {
Packit Service ef73c4
  guint index;
Packit Service ef73c4
  AtkEventListener func;
Packit Service ef73c4
};
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_focus_tracker_init: (skip)
Packit Service ef73c4
 * @init: Function to be called for focus tracker initialization
Packit Service ef73c4
 *
Packit Service ef73c4
 * Specifies the function to be called for focus tracker initialization.
Packit Service ef73c4
 * This function should be called by an implementation of the
Packit Service ef73c4
 * ATK interface if any specific work needs to be done to enable
Packit Service ef73c4
 * focus tracking.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
Packit Service ef73c4
 * to be implemented by ATK itself.
Packit Service ef73c4
 *
Packit Service ef73c4
 **/
Packit Service ef73c4
void
Packit Service ef73c4
atk_focus_tracker_init (AtkEventListenerInit    init)
Packit Service ef73c4
{
Packit Service ef73c4
  if (!focus_tracker_init)
Packit Service ef73c4
    focus_tracker_init = init;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_add_focus_tracker: (skip)
Packit Service ef73c4
 * @focus_tracker: Function to be added to the list of functions to be called
Packit Service ef73c4
 * when an object receives focus.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Adds the specified function to the list of functions to be called
Packit Service ef73c4
 * when an object receives focus.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
Packit Service ef73c4
 * to be implemented by ATK itself. If you need focus tracking on your
Packit Service ef73c4
 * implementation, subscribe to the #AtkObject::state-change "focused" signal.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: added focus tracker id, or 0 on failure.
Packit Service ef73c4
 **/
Packit Service ef73c4
guint
Packit Service ef73c4
atk_add_focus_tracker (AtkEventListener   focus_tracker)
Packit Service ef73c4
{
Packit Service ef73c4
  g_return_val_if_fail (focus_tracker, 0);
Packit Service ef73c4
Packit Service ef73c4
  if (!init_done)
Packit Service ef73c4
  {
Packit Service ef73c4
    if (focus_tracker_init)
Packit Service ef73c4
    {
Packit Service ef73c4
      focus_tracker_init ();
Packit Service ef73c4
    }
Packit Service ef73c4
    trackers = g_array_sized_new (FALSE, TRUE, sizeof (FocusTracker), 0);
Packit Service ef73c4
    init_done = TRUE;
Packit Service ef73c4
  }
Packit Service ef73c4
  if (init_done)
Packit Service ef73c4
  {
Packit Service ef73c4
    FocusTracker item;
Packit Service ef73c4
Packit Service ef73c4
    item.index = ++global_index;
Packit Service ef73c4
    item.func = focus_tracker;
Packit Service ef73c4
    trackers = g_array_append_val (trackers, item);
Packit Service ef73c4
    return global_index;
Packit Service ef73c4
  }
Packit Service ef73c4
  else
Packit Service ef73c4
  {
Packit Service ef73c4
    return 0;
Packit Service ef73c4
  }
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_remove_focus_tracker:
Packit Service ef73c4
 * @tracker_id: the id of the focus tracker to remove
Packit Service ef73c4
 *
Packit Service ef73c4
 * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
Packit Service ef73c4
 * to be implemented by ATK itself. If you need focus tracking on your
Packit Service ef73c4
 * implementation, subscribe to the #AtkObject::state-change "focused" signal.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Removes the specified focus tracker from the list of functions
Packit Service ef73c4
 * to be called when any object receives focus.
Packit Service ef73c4
 **/
Packit Service ef73c4
void
Packit Service ef73c4
atk_remove_focus_tracker (guint            tracker_id)
Packit Service ef73c4
{
Packit Service ef73c4
  FocusTracker *item;
Packit Service ef73c4
  guint i;
Packit Service ef73c4
Packit Service ef73c4
  if (trackers == NULL)
Packit Service ef73c4
    return;
Packit Service ef73c4
Packit Service ef73c4
  if (tracker_id == 0)
Packit Service ef73c4
    return;
Packit Service ef73c4
Packit Service ef73c4
  for (i = 0; i < trackers->len; i++)
Packit Service ef73c4
  {
Packit Service ef73c4
    item = &g_array_index (trackers, FocusTracker, i);
Packit Service ef73c4
    if (item->index == tracker_id)
Packit Service ef73c4
    {
Packit Service ef73c4
      trackers = g_array_remove_index (trackers, i);
Packit Service ef73c4
      break;
Packit Service ef73c4
    }
Packit Service ef73c4
  }
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_focus_tracker_notify:
Packit Service ef73c4
 * @object: an #AtkObject
Packit Service ef73c4
 *
Packit Service ef73c4
 * Cause the focus tracker functions which have been specified to be
Packit Service ef73c4
 * executed for the object.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
Packit Service ef73c4
 * to be implemented by ATK itself. As #AtkObject::focus-event was
Packit Service ef73c4
 * deprecated in favor of a #AtkObject::state-change signal, in order
Packit Service ef73c4
 * to notify a focus change on your implementation, you can use
Packit Service ef73c4
 * atk_object_notify_state_change() instead.
Packit Service ef73c4
 **/
Packit Service ef73c4
void
Packit Service ef73c4
atk_focus_tracker_notify (AtkObject       *object)
Packit Service ef73c4
{
Packit Service ef73c4
  FocusTracker *item;
Packit Service ef73c4
  guint i;
Packit Service ef73c4
Packit Service ef73c4
  if (trackers == NULL)
Packit Service ef73c4
    return;
Packit Service ef73c4
Packit Service ef73c4
  if (object == previous_focus_object)
Packit Service ef73c4
    return;
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      if (previous_focus_object)
Packit Service ef73c4
        g_object_unref (previous_focus_object);
Packit Service ef73c4
Packit Service ef73c4
      previous_focus_object = object;
Packit Service ef73c4
      if (object)
Packit Service ef73c4
        {
Packit Service ef73c4
          g_object_ref (object);
Packit Service ef73c4
Packit Service ef73c4
          for (i = 0; i < trackers->len; i++)
Packit Service ef73c4
            {
Packit Service ef73c4
              item = &g_array_index (trackers, FocusTracker, i);
Packit Service ef73c4
              g_return_if_fail (item != NULL);
Packit Service ef73c4
              item->func (object);
Packit Service ef73c4
            }
Packit Service ef73c4
        }
Packit Service ef73c4
    
Packit Service ef73c4
    }
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
static guint
Packit Service ef73c4
add_listener (GSignalEmissionHook listener,
Packit Service ef73c4
              const gchar         *object_type,
Packit Service ef73c4
              const gchar         *signal_name,
Packit Service ef73c4
              const gchar         *detail_string,
Packit Service ef73c4
              const gchar         *hook_data)
Packit Service ef73c4
{
Packit Service ef73c4
  GType type;
Packit Service ef73c4
  guint signal_id;
Packit Service ef73c4
  gint  rc = 0;
Packit Service ef73c4
  static gint listener_idx = 1;
Packit Service ef73c4
  GQuark detail_quark = 0;
Packit Service ef73c4
Packit Service ef73c4
  type = g_type_from_name (object_type);
Packit Service ef73c4
  if (type)
Packit Service ef73c4
    {
Packit Service ef73c4
      signal_id  = g_signal_lookup (signal_name, type);
Packit Service ef73c4
      detail_quark = g_quark_from_string (detail_string);
Packit Service ef73c4
Packit Service ef73c4
      if (signal_id > 0)
Packit Service ef73c4
        {
Packit Service ef73c4
          AtkUtilListenerInfo *listener_info;
Packit Service ef73c4
Packit Service ef73c4
          rc = listener_idx;
Packit Service ef73c4
Packit Service ef73c4
          listener_info = g_new (AtkUtilListenerInfo, 1);
Packit Service ef73c4
          listener_info->key = listener_idx;
Packit Service ef73c4
          listener_info->hook_id =
Packit Service ef73c4
            g_signal_add_emission_hook (signal_id, detail_quark, listener,
Packit Service ef73c4
                                        g_strdup (hook_data),
Packit Service ef73c4
                                        (GDestroyNotify) g_free);
Packit Service ef73c4
          listener_info->signal_id = signal_id;
Packit Service ef73c4
Packit Service ef73c4
	  g_hash_table_insert(listener_list, &(listener_info->key), listener_info);
Packit Service ef73c4
          listener_idx++;
Packit Service ef73c4
        }
Packit Service ef73c4
      else
Packit Service ef73c4
        {
Packit Service ef73c4
          g_debug ("Signal type %s not supported\n", signal_name);
Packit Service ef73c4
        }
Packit Service ef73c4
    }
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      g_warning("Invalid object type %s\n", object_type);
Packit Service ef73c4
    }
Packit Service ef73c4
  return rc;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
static guint
Packit Service ef73c4
atk_util_real_add_global_event_listener (GSignalEmissionHook listener,
Packit Service ef73c4
                                         const gchar *event_type)
Packit Service ef73c4
{
Packit Service ef73c4
  guint rc = 0;
Packit Service ef73c4
  gchar **split_string;
Packit Service ef73c4
  guint length;
Packit Service ef73c4
Packit Service ef73c4
  split_string = g_strsplit (event_type, ":", 0);
Packit Service ef73c4
  length = g_strv_length (split_string);
Packit Service ef73c4
Packit Service ef73c4
  if ((length == 3) || (length == 4))
Packit Service ef73c4
    rc = add_listener (listener, split_string[1], split_string[2],
Packit Service ef73c4
                       split_string[3], event_type);
Packit Service ef73c4
Packit Service ef73c4
  g_strfreev (split_string);
Packit Service ef73c4
Packit Service ef73c4
  return rc;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
static void
Packit Service ef73c4
atk_util_real_remove_global_event_listener (guint remove_listener)
Packit Service ef73c4
{
Packit Service ef73c4
  if (remove_listener > 0)
Packit Service ef73c4
    {
Packit Service ef73c4
      AtkUtilListenerInfo *listener_info;
Packit Service ef73c4
      gint tmp_idx = remove_listener;
Packit Service ef73c4
Packit Service ef73c4
      listener_info = (AtkUtilListenerInfo *)
Packit Service ef73c4
        g_hash_table_lookup(listener_list, &tmp_idx);
Packit Service ef73c4
Packit Service ef73c4
      if (listener_info != NULL)
Packit Service ef73c4
        {
Packit Service ef73c4
          /* Hook id of 0 and signal id of 0 are invalid */
Packit Service ef73c4
          if (listener_info->hook_id != 0 && listener_info->signal_id != 0)
Packit Service ef73c4
            {
Packit Service ef73c4
              /* Remove the emission hook */
Packit Service ef73c4
              g_signal_remove_emission_hook(listener_info->signal_id,
Packit Service ef73c4
                                            listener_info->hook_id);
Packit Service ef73c4
Packit Service ef73c4
              /* Remove the element from the hash */
Packit Service ef73c4
              g_hash_table_remove(listener_list, &tmp_idx);
Packit Service ef73c4
            }
Packit Service ef73c4
          else
Packit Service ef73c4
            {
Packit Service ef73c4
              g_warning("Invalid listener hook_id %ld or signal_id %d\n",
Packit Service ef73c4
                        listener_info->hook_id, listener_info->signal_id);
Packit Service ef73c4
            }
Packit Service ef73c4
        }
Packit Service ef73c4
      else
Packit Service ef73c4
        {
Packit Service ef73c4
          g_warning("No listener with the specified listener id %d",
Packit Service ef73c4
                    remove_listener);
Packit Service ef73c4
        }
Packit Service ef73c4
    }
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      g_warning("Invalid listener_id %d", remove_listener);
Packit Service ef73c4
    }
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_add_global_event_listener: (skip)
Packit Service ef73c4
 * @listener: the listener to notify
Packit Service ef73c4
 * @event_type: the type of event for which notification is requested
Packit Service ef73c4
 *
Packit Service ef73c4
 * Adds the specified function to the list of functions to be called
Packit Service ef73c4
 * when an ATK event of type event_type occurs.
Packit Service ef73c4
 *
Packit Service ef73c4
 * The format of event_type is the following:
Packit Service ef73c4
 *  "ATK:<atk_type>:<atk_event>:<atk_event_detail>
Packit Service ef73c4
 *
Packit Service ef73c4
 * Where "ATK" works as the namespace, <atk_interface> is the name of
Packit Service ef73c4
 * the ATK type (interface or object), <atk_event> is the name of the
Packit Service ef73c4
 * signal defined on that interface and <atk_event_detail> is the
Packit Service ef73c4
 * gsignal detail of that signal. You can find more info about gsignal
Packit Service ef73c4
 * details here:
Packit Service ef73c4
 * http://developer.gnome.org/gobject/stable/gobject-Signals.html
Packit Service ef73c4
 *
Packit Service ef73c4
 * The first three parameters are mandatory. The last one is optional.
Packit Service ef73c4
 *
Packit Service ef73c4
 * For example:
Packit Service ef73c4
 *   ATK:AtkObject:state-change
Packit Service ef73c4
 *   ATK:AtkText:text-selection-changed
Packit Service ef73c4
 *   ATK:AtkText:text-insert:system
Packit Service ef73c4
 *
Packit Service ef73c4
 * Toolkit implementor note: ATK provides a default implementation for
Packit Service ef73c4
 * this virtual method. ATK implementors are discouraged from
Packit Service ef73c4
 * reimplementing this method.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Toolkit implementor note: this method is not intended to be used by
Packit Service ef73c4
 * ATK implementors but by ATK consumers.
Packit Service ef73c4
 *
Packit Service ef73c4
 * ATK consumers note: as this method adds a listener for a given ATK
Packit Service ef73c4
 * type, that type should be already registered on the GType system
Packit Service ef73c4
 * before calling this method. A simple way to do that is creating an
Packit Service ef73c4
 * instance of #AtkNoOpObject. This class implements all ATK
Packit Service ef73c4
 * interfaces, so creating the instance will register all ATK types as
Packit Service ef73c4
 * a collateral effect.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: added event listener id, or 0 on failure.
Packit Service ef73c4
 **/
Packit Service ef73c4
guint
Packit Service ef73c4
atk_add_global_event_listener (GSignalEmissionHook listener,
Packit Service ef73c4
			       const gchar        *event_type)
Packit Service ef73c4
{
Packit Service ef73c4
  guint retval;
Packit Service ef73c4
  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
Packit Service ef73c4
Packit Service ef73c4
  if (klass->add_global_event_listener)
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = klass->add_global_event_listener (listener, event_type);
Packit Service ef73c4
    }
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = 0;
Packit Service ef73c4
    }
Packit Service ef73c4
  g_type_class_unref (klass);
Packit Service ef73c4
Packit Service ef73c4
  return retval;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_remove_global_event_listener:
Packit Service ef73c4
 * @listener_id: the id of the event listener to remove
Packit Service ef73c4
 *
Packit Service ef73c4
 * @listener_id is the value returned by #atk_add_global_event_listener
Packit Service ef73c4
 * when you registered that event listener.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Toolkit implementor note: ATK provides a default implementation for
Packit Service ef73c4
 * this virtual method. ATK implementors are discouraged from
Packit Service ef73c4
 * reimplementing this method.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Toolkit implementor note: this method is not intended to be used by
Packit Service ef73c4
 * ATK implementors but by ATK consumers.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Removes the specified event listener
Packit Service ef73c4
 **/
Packit Service ef73c4
void
Packit Service ef73c4
atk_remove_global_event_listener (guint listener_id)
Packit Service ef73c4
{
Packit Service ef73c4
  AtkUtilClass *klass = g_type_class_peek (ATK_TYPE_UTIL);
Packit Service ef73c4
Packit Service ef73c4
  if (klass && klass->remove_global_event_listener)
Packit Service ef73c4
    klass->remove_global_event_listener (listener_id);
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_add_key_event_listener: (skip)
Packit Service ef73c4
 * @listener: the listener to notify
Packit Service ef73c4
 * @data: a #gpointer that points to a block of data that should be sent to the registered listeners,
Packit Service ef73c4
 *        along with the event notification, when it occurs.  
Packit Service ef73c4
 *
Packit Service ef73c4
 * Adds the specified function to the list of functions to be called
Packit Service ef73c4
 *        when a key event occurs.  The @data element will be passed to the
Packit Service ef73c4
 *        #AtkKeySnoopFunc (@listener) as the @func_data param, on notification.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: added event listener id, or 0 on failure.
Packit Service ef73c4
 **/
Packit Service ef73c4
guint
Packit Service ef73c4
atk_add_key_event_listener (AtkKeySnoopFunc listener, gpointer data)
Packit Service ef73c4
{
Packit Service ef73c4
  guint retval;
Packit Service ef73c4
  AtkUtilClass *klass = g_type_class_peek (ATK_TYPE_UTIL);
Packit Service ef73c4
  if (klass && klass->add_key_event_listener)
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = klass->add_key_event_listener (listener, data);
Packit Service ef73c4
    }
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = 0;
Packit Service ef73c4
    }
Packit Service ef73c4
Packit Service ef73c4
  return retval;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_remove_key_event_listener:
Packit Service ef73c4
 * @listener_id: the id of the event listener to remove
Packit Service ef73c4
 *
Packit Service ef73c4
 * @listener_id is the value returned by #atk_add_key_event_listener
Packit Service ef73c4
 * when you registered that event listener.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Removes the specified event listener.
Packit Service ef73c4
 **/
Packit Service ef73c4
void
Packit Service ef73c4
atk_remove_key_event_listener (guint listener_id)
Packit Service ef73c4
{
Packit Service ef73c4
  AtkUtilClass *klass = g_type_class_peek (ATK_TYPE_UTIL);
Packit Service ef73c4
Packit Service ef73c4
  if (klass->remove_key_event_listener)
Packit Service ef73c4
    klass->remove_key_event_listener (listener_id);
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_get_root:
Packit Service ef73c4
 *
Packit Service ef73c4
 * Gets the root accessible container for the current application.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: (transfer none): the root accessible container for the current
Packit Service ef73c4
 * application
Packit Service ef73c4
 **/
Packit Service ef73c4
AtkObject*
Packit Service ef73c4
atk_get_root (void)
Packit Service ef73c4
{
Packit Service ef73c4
  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
Packit Service ef73c4
  AtkObject    *retval;
Packit Service ef73c4
  if (klass->get_root)
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = klass->get_root ();
Packit Service ef73c4
    }
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = NULL;
Packit Service ef73c4
    }
Packit Service ef73c4
  g_type_class_unref (klass);
Packit Service ef73c4
Packit Service ef73c4
  return retval;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_get_focus_object:
Packit Service ef73c4
 *
Packit Service ef73c4
 * Gets the currently focused object.
Packit Service ef73c4
 * 
Packit Service ef73c4
 * Since: 1.6
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: (transfer none): the currently focused object for the current
Packit Service ef73c4
 * application
Packit Service ef73c4
 **/
Packit Service ef73c4
AtkObject*
Packit Service ef73c4
atk_get_focus_object (void)
Packit Service ef73c4
{
Packit Service ef73c4
  return previous_focus_object;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_get_toolkit_name:
Packit Service ef73c4
 *
Packit Service ef73c4
 * Gets name string for the GUI toolkit implementing ATK for this application.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: name string for the GUI toolkit implementing ATK for this application
Packit Service ef73c4
 **/
Packit Service ef73c4
const gchar*
Packit Service ef73c4
atk_get_toolkit_name (void)
Packit Service ef73c4
{
Packit Service ef73c4
  const gchar *retval;
Packit Service ef73c4
  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
Packit Service ef73c4
  if (klass->get_toolkit_name)
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = klass->get_toolkit_name ();
Packit Service ef73c4
    }
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = NULL;
Packit Service ef73c4
    }
Packit Service ef73c4
  g_type_class_unref (klass);
Packit Service ef73c4
Packit Service ef73c4
  return retval;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_get_toolkit_version:
Packit Service ef73c4
 *
Packit Service ef73c4
 * Gets version string for the GUI toolkit implementing ATK for this application.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: version string for the GUI toolkit implementing ATK for this application
Packit Service ef73c4
 **/
Packit Service ef73c4
const gchar*
Packit Service ef73c4
atk_get_toolkit_version (void)
Packit Service ef73c4
{
Packit Service ef73c4
  const gchar *retval;
Packit Service ef73c4
  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
Packit Service ef73c4
  if (klass->get_toolkit_version)
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = klass->get_toolkit_version ();
Packit Service ef73c4
    }
Packit Service ef73c4
  else
Packit Service ef73c4
    {
Packit Service ef73c4
      retval = NULL;
Packit Service ef73c4
    }
Packit Service ef73c4
  g_type_class_unref (klass);
Packit Service ef73c4
Packit Service ef73c4
  return retval;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
/**
Packit Service ef73c4
 * atk_get_version:
Packit Service ef73c4
 *
Packit Service ef73c4
 * Gets the current version for ATK.
Packit Service ef73c4
 *
Packit Service ef73c4
 * Returns: version string for ATK
Packit Service ef73c4
 *
Packit Service ef73c4
 * Since: 1.20
Packit Service ef73c4
 */
Packit Service ef73c4
const gchar *
Packit Service ef73c4
atk_get_version (void)
Packit Service ef73c4
{
Packit Service ef73c4
  return VERSION;
Packit Service ef73c4
}
Packit Service ef73c4
Packit Service ef73c4
static void
Packit Service ef73c4
atk_util_class_init (AtkUtilClass *klass)
Packit Service ef73c4
{
Packit Service ef73c4
  klass->add_global_event_listener = atk_util_real_add_global_event_listener;
Packit Service ef73c4
  klass->remove_global_event_listener = atk_util_real_remove_global_event_listener;
Packit Service ef73c4
  klass->get_root = NULL;
Packit Service ef73c4
  klass->get_toolkit_name = NULL;
Packit Service ef73c4
  klass->get_toolkit_version = NULL;
Packit Service ef73c4
Packit Service ef73c4
  listener_list = g_hash_table_new_full (g_int_hash, g_int_equal, NULL,
Packit Service ef73c4
                                         g_free);
Packit Service ef73c4
}