Blame atk/atkstateset.c

Packit d0bcc1
/* ATK -  Accessibility Toolkit
Packit d0bcc1
 * Copyright 2001 Sun Microsystems Inc.
Packit d0bcc1
 *
Packit d0bcc1
 * This library is free software; you can redistribute it and/or
Packit d0bcc1
 * modify it under the terms of the GNU Lesser General Public
Packit d0bcc1
 * License as published by the Free Software Foundation; either
Packit d0bcc1
 * version 2 of the License, or (at your option) any later version.
Packit d0bcc1
 *
Packit d0bcc1
 * This library is distributed in the hope that it will be useful,
Packit d0bcc1
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d0bcc1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit d0bcc1
 * Lesser General Public License for more details.
Packit d0bcc1
 *
Packit d0bcc1
 * You should have received a copy of the GNU Lesser General Public
Packit d0bcc1
 * License along with this library; if not, write to the
Packit d0bcc1
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit d0bcc1
 * Boston, MA 02111-1307, USA.
Packit d0bcc1
 */
Packit d0bcc1
Packit d0bcc1
#include "config.h"
Packit d0bcc1
Packit d0bcc1
#include <glib-object.h>
Packit d0bcc1
Packit d0bcc1
#include "atkobject.h"
Packit d0bcc1
#include "atkstateset.h"
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * SECTION:atkstateset
Packit d0bcc1
 * @Short_description: An AtkStateSet contains the states of an object.
Packit d0bcc1
 * @Title:AtkStateSet
Packit d0bcc1
 *
Packit d0bcc1
 * An AtkStateSet is a read-only representation of the full set of #AtkStates
Packit d0bcc1
 * that apply to an object at a given time. This set is not meant to be
Packit d0bcc1
 * modified, but rather created when #atk_object_ref_state_set() is called.
Packit d0bcc1
 */
Packit d0bcc1
Packit d0bcc1
#define ATK_STATE(state_enum)             ((AtkState)((guint64)1 << ((state_enum)%64)))
Packit d0bcc1
Packit d0bcc1
struct _AtkRealStateSet
Packit d0bcc1
{
Packit d0bcc1
  GObject parent;
Packit d0bcc1
Packit d0bcc1
  AtkState state;
Packit d0bcc1
};
Packit d0bcc1
Packit d0bcc1
typedef struct _AtkRealStateSet      AtkRealStateSet;
Packit d0bcc1
Packit d0bcc1
static void            atk_state_set_class_init       (AtkStateSetClass  *klass);
Packit d0bcc1
Packit d0bcc1
GType
Packit d0bcc1
atk_state_set_get_type (void)
Packit d0bcc1
{
Packit d0bcc1
  static GType type = 0;
Packit d0bcc1
Packit d0bcc1
  if (!type)
Packit d0bcc1
    {
Packit d0bcc1
      static const GTypeInfo typeInfo =
Packit d0bcc1
      {
Packit d0bcc1
        sizeof (AtkStateSetClass),
Packit d0bcc1
        (GBaseInitFunc) NULL,
Packit d0bcc1
        (GBaseFinalizeFunc) NULL,
Packit d0bcc1
        (GClassInitFunc) atk_state_set_class_init,
Packit d0bcc1
        (GClassFinalizeFunc) NULL,
Packit d0bcc1
        NULL,
Packit d0bcc1
        sizeof (AtkRealStateSet),
Packit d0bcc1
        0,
Packit d0bcc1
        (GInstanceInitFunc) NULL,
Packit d0bcc1
      } ;
Packit d0bcc1
      type = g_type_register_static (G_TYPE_OBJECT, "AtkStateSet", &typeInfo, 0) ;
Packit d0bcc1
    }
Packit d0bcc1
  return type;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
static void
Packit d0bcc1
atk_state_set_class_init (AtkStateSetClass *klass)
Packit d0bcc1
{
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_new:
Packit d0bcc1
 * 
Packit d0bcc1
 * Creates a new empty state set.
Packit d0bcc1
 * 
Packit d0bcc1
 * Returns: a new #AtkStateSet 
Packit d0bcc1
 **/
Packit d0bcc1
AtkStateSet*
Packit d0bcc1
atk_state_set_new (void)
Packit d0bcc1
{
Packit d0bcc1
  return (AtkStateSet*) g_object_new (ATK_TYPE_STATE_SET, NULL);
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_is_empty:
Packit d0bcc1
 * @set: an #AtkStateType
Packit d0bcc1
 *
Packit d0bcc1
 * Checks whether the state set is empty, i.e. has no states set.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: %TRUE if @set has no states set, otherwise %FALSE
Packit d0bcc1
 **/
Packit d0bcc1
gboolean
Packit d0bcc1
atk_state_set_is_empty (AtkStateSet   *set)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set;
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
Packit d0bcc1
  if (real_set->state)
Packit d0bcc1
    return FALSE;
Packit d0bcc1
  else
Packit d0bcc1
    return TRUE;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_add_state:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @type: an #AtkStateType
Packit d0bcc1
 *
Packit d0bcc1
 * Adds the state of the specified type to the state set if it is not already
Packit d0bcc1
 * present.
Packit d0bcc1
 *
Packit d0bcc1
 * Note that because an #AtkStateSet is a read-only object, this method should
Packit d0bcc1
 * be used to add a state to a newly-created set which will then be returned by
Packit d0bcc1
 * #atk_object_ref_state_set. It should not be used to modify the existing state
Packit d0bcc1
 * of an object. See also #atk_object_notify_state_change.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: %TRUE if  the state for @type is not already in @set.
Packit d0bcc1
 **/
Packit d0bcc1
gboolean
Packit d0bcc1
atk_state_set_add_state (AtkStateSet   *set,
Packit d0bcc1
                         AtkStateType  type)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set;
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
Packit d0bcc1
  if (real_set->state & ATK_STATE (type))
Packit d0bcc1
    return FALSE;
Packit d0bcc1
  else
Packit d0bcc1
  {
Packit d0bcc1
    real_set->state |= ATK_STATE (type);
Packit d0bcc1
    return TRUE;
Packit d0bcc1
  }
Packit d0bcc1
}
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_add_states:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @types: (array length=n_types): an array of #AtkStateType
Packit d0bcc1
 * @n_types: The number of elements in the array
Packit d0bcc1
 *
Packit d0bcc1
 * Adds the states of the specified types to the state set.
Packit d0bcc1
 *
Packit d0bcc1
 * Note that because an #AtkStateSet is a read-only object, this method should
Packit d0bcc1
 * be used to add states to a newly-created set which will then be returned by
Packit d0bcc1
 * #atk_object_ref_state_set. It should not be used to modify the existing state
Packit d0bcc1
 * of an object. See also #atk_object_notify_state_change.
Packit d0bcc1
 **/
Packit d0bcc1
void
Packit d0bcc1
atk_state_set_add_states (AtkStateSet   *set,
Packit d0bcc1
                          AtkStateType  *types,
Packit d0bcc1
                          gint          n_types)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set;
Packit d0bcc1
  gint     i;
Packit d0bcc1
  g_return_if_fail (ATK_IS_STATE_SET (set));
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
Packit d0bcc1
  for (i = 0; i < n_types; i++)
Packit d0bcc1
  {
Packit d0bcc1
    real_set->state |= ATK_STATE (types[i]);
Packit d0bcc1
  }
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_clear_states:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 *
Packit d0bcc1
 * Removes all states from the state set.
Packit d0bcc1
 **/
Packit d0bcc1
void
Packit d0bcc1
atk_state_set_clear_states (AtkStateSet   *set)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set;
Packit d0bcc1
  g_return_if_fail (ATK_IS_STATE_SET (set));
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
Packit d0bcc1
  real_set->state = 0;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_contains_state:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @type: an #AtkStateType
Packit d0bcc1
 *
Packit d0bcc1
 * Checks whether the state for the specified type is in the specified set.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: %TRUE if @type is the state type is in @set.
Packit d0bcc1
 **/
Packit d0bcc1
gboolean
Packit d0bcc1
atk_state_set_contains_state (AtkStateSet   *set,
Packit d0bcc1
                              AtkStateType  type)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set;
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
Packit d0bcc1
  if (real_set->state & ATK_STATE (type))
Packit d0bcc1
    return TRUE;
Packit d0bcc1
  else
Packit d0bcc1
    return FALSE;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_contains_states:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @types: (array length=n_types): an array of #AtkStateType
Packit d0bcc1
 * @n_types: The number of elements in the array
Packit d0bcc1
 *
Packit d0bcc1
 * Checks whether the states for all the specified types are in the 
Packit d0bcc1
 * specified set.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: %TRUE if all the states for @type are in @set.
Packit d0bcc1
 **/
Packit d0bcc1
gboolean
Packit d0bcc1
atk_state_set_contains_states (AtkStateSet   *set,
Packit d0bcc1
                               AtkStateType  *types,
Packit d0bcc1
                               gint          n_types)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set;
Packit d0bcc1
  gint i;
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
Packit d0bcc1
  for (i = 0; i < n_types; i++)
Packit d0bcc1
  {
Packit d0bcc1
    if (!(real_set->state & ATK_STATE (types[i])))
Packit d0bcc1
      return FALSE;
Packit d0bcc1
  }
Packit d0bcc1
  return TRUE;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_remove_state:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @type: an #AtkType
Packit d0bcc1
 *
Packit d0bcc1
 * Removes the state for the specified type from the state set.
Packit d0bcc1
 *
Packit d0bcc1
 * Note that because an #AtkStateSet is a read-only object, this method should
Packit d0bcc1
 * be used to remove a state to a newly-created set which will then be returned
Packit d0bcc1
 * by #atk_object_ref_state_set. It should not be used to modify the existing
Packit d0bcc1
 * state of an object. See also #atk_object_notify_state_change.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: %TRUE if @type was the state type is in @set.
Packit d0bcc1
 **/
Packit d0bcc1
gboolean
Packit d0bcc1
atk_state_set_remove_state (AtkStateSet  *set,
Packit d0bcc1
                            AtkStateType type)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set;
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
Packit d0bcc1
  if (real_set->state & ATK_STATE (type))
Packit d0bcc1
  {
Packit d0bcc1
    real_set->state ^= ATK_STATE (type);
Packit d0bcc1
    return TRUE;
Packit d0bcc1
  }
Packit d0bcc1
  else
Packit d0bcc1
    return FALSE;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_and_sets:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @compare_set: another #AtkStateSet
Packit d0bcc1
 *
Packit d0bcc1
 * Constructs the intersection of the two sets, returning %NULL if the
Packit d0bcc1
 * intersection is empty.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: (transfer full): a new #AtkStateSet which is the intersection of
Packit d0bcc1
 * the two sets.
Packit d0bcc1
 **/
Packit d0bcc1
AtkStateSet*
Packit d0bcc1
atk_state_set_and_sets (AtkStateSet  *set,
Packit d0bcc1
                        AtkStateSet  *compare_set)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set, *real_compare_set;
Packit d0bcc1
  AtkStateSet *return_set = NULL;
Packit d0bcc1
  AtkState state;
Packit d0bcc1
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
  real_compare_set = (AtkRealStateSet *)compare_set;
Packit d0bcc1
Packit d0bcc1
  state = real_set->state & real_compare_set->state;
Packit d0bcc1
  if (state)
Packit d0bcc1
  {
Packit d0bcc1
    return_set = atk_state_set_new();
Packit d0bcc1
    ((AtkRealStateSet *) return_set)->state = state;
Packit d0bcc1
  }
Packit d0bcc1
  return return_set;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_or_sets:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @compare_set: another #AtkStateSet
Packit d0bcc1
 *
Packit d0bcc1
 * Constructs the union of the two sets.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: (nullable) (transfer full): a new #AtkStateSet which is
Packit d0bcc1
 * the union of the two sets, returning %NULL is empty.
Packit d0bcc1
 **/
Packit d0bcc1
AtkStateSet*
Packit d0bcc1
atk_state_set_or_sets (AtkStateSet  *set,
Packit d0bcc1
                       AtkStateSet  *compare_set)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set, *real_compare_set;
Packit d0bcc1
  AtkStateSet *return_set = NULL;
Packit d0bcc1
  AtkState state;
Packit d0bcc1
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
  real_compare_set = (AtkRealStateSet *)compare_set;
Packit d0bcc1
Packit d0bcc1
  state = real_set->state | real_compare_set->state;
Packit d0bcc1
Packit d0bcc1
  if (state)
Packit d0bcc1
  {
Packit d0bcc1
    return_set = atk_state_set_new();
Packit d0bcc1
    ((AtkRealStateSet *) return_set)->state = state;
Packit d0bcc1
  }
Packit d0bcc1
Packit d0bcc1
  return return_set;
Packit d0bcc1
}
Packit d0bcc1
Packit d0bcc1
/**
Packit d0bcc1
 * atk_state_set_xor_sets:
Packit d0bcc1
 * @set: an #AtkStateSet
Packit d0bcc1
 * @compare_set: another #AtkStateSet
Packit d0bcc1
 *
Packit d0bcc1
 * Constructs the exclusive-or of the two sets, returning %NULL is empty.
Packit d0bcc1
 * The set returned by this operation contains the states in exactly
Packit d0bcc1
 * one of the two sets.
Packit d0bcc1
 *
Packit d0bcc1
 * Returns: (transfer full): a new #AtkStateSet which contains the states
Packit d0bcc1
 * which are in exactly one of the two sets.
Packit d0bcc1
 **/
Packit d0bcc1
AtkStateSet*
Packit d0bcc1
atk_state_set_xor_sets (AtkStateSet  *set,
Packit d0bcc1
                        AtkStateSet  *compare_set)
Packit d0bcc1
{
Packit d0bcc1
  AtkRealStateSet *real_set, *real_compare_set;
Packit d0bcc1
  AtkStateSet *return_set = NULL;
Packit d0bcc1
  AtkState state, state1, state2;
Packit d0bcc1
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
Packit d0bcc1
  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
Packit d0bcc1
Packit d0bcc1
  real_set = (AtkRealStateSet *)set;
Packit d0bcc1
  real_compare_set = (AtkRealStateSet *)compare_set;
Packit d0bcc1
Packit d0bcc1
  state1 = real_set->state & (~real_compare_set->state);
Packit d0bcc1
  state2 = (~real_set->state) & real_compare_set->state;
Packit d0bcc1
  state = state1 | state2;
Packit d0bcc1
Packit d0bcc1
  if (state)
Packit d0bcc1
  {
Packit d0bcc1
    return_set = atk_state_set_new();
Packit d0bcc1
    ((AtkRealStateSet *) return_set)->state = state;
Packit d0bcc1
  }
Packit d0bcc1
  return return_set;
Packit d0bcc1
}