|
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 |
}
|