clutter/actor: Implement AtkComponent.get_alpha
And a little clean up along the way Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3917>
This commit is contained in:
parent
cbbf1b7b51
commit
defa3a302d
1 changed files with 117 additions and 130 deletions
|
@ -77,37 +77,8 @@
|
|||
#include "clutter/clutter-actor-accessible.h"
|
||||
#include "clutter/clutter-stage.h"
|
||||
|
||||
static void clutter_actor_accessible_initialize (AtkObject *obj,
|
||||
gpointer data);
|
||||
static void clutter_actor_accessible_finalize (GObject *obj);
|
||||
|
||||
/* AtkObject.h */
|
||||
static AtkObject* clutter_actor_accessible_get_parent (AtkObject *obj);
|
||||
static gint clutter_actor_accessible_get_index_in_parent (AtkObject *obj);
|
||||
static AtkStateSet* clutter_actor_accessible_ref_state_set (AtkObject *obj);
|
||||
static gint clutter_actor_accessible_get_n_children (AtkObject *obj);
|
||||
static AtkObject* clutter_actor_accessible_ref_child (AtkObject *obj,
|
||||
gint i);
|
||||
static AtkAttributeSet * clutter_actor_accessible_get_attributes (AtkObject *obj);
|
||||
|
||||
/* ClutterContainer */
|
||||
static gint clutter_actor_accessible_add_actor (ClutterActor *container,
|
||||
ClutterActor *actor,
|
||||
gpointer data);
|
||||
static gint clutter_actor_accessible_remove_actor (ClutterActor *container,
|
||||
ClutterActor *actor,
|
||||
gpointer data);
|
||||
|
||||
/* AtkComponent.h */
|
||||
static void clutter_actor_accessible_component_interface_init (AtkComponentIface *iface);
|
||||
static void clutter_actor_accessible_get_extents (AtkComponent *component,
|
||||
gint *x,
|
||||
gint *y,
|
||||
gint *width,
|
||||
gint *height,
|
||||
AtkCoordType coord_type);
|
||||
static gint clutter_actor_accessible_get_mdi_zorder (AtkComponent *component);
|
||||
static gboolean clutter_actor_accessible_grab_focus (AtkComponent *component);
|
||||
|
||||
struct _ClutterActorAccessiblePrivate
|
||||
{
|
||||
|
@ -121,6 +92,78 @@ G_DEFINE_TYPE_WITH_CODE (ClutterActorAccessible,
|
|||
G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT,
|
||||
clutter_actor_accessible_component_interface_init));
|
||||
|
||||
/* ClutterContainer */
|
||||
static gint
|
||||
clutter_actor_accessible_add_actor (ClutterActor *container,
|
||||
ClutterActor *actor,
|
||||
gpointer data)
|
||||
{
|
||||
AtkObject *atk_parent = clutter_actor_get_accessible (container);
|
||||
AtkObject *atk_child = clutter_actor_get_accessible (actor);
|
||||
ClutterActorAccessiblePrivate *priv = clutter_actor_accessible_get_instance_private (CLUTTER_ACTOR_ACCESSIBLE (atk_parent));
|
||||
gint index;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (container), 0);
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible_parent");
|
||||
|
||||
g_list_free (priv->children);
|
||||
|
||||
priv->children = clutter_actor_get_children (CLUTTER_ACTOR (container));
|
||||
|
||||
index = g_list_index (priv->children, actor);
|
||||
g_signal_emit_by_name (atk_parent, "children_changed::add",
|
||||
index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static gint
|
||||
clutter_actor_accessible_remove_actor (ClutterActor *container,
|
||||
ClutterActor *actor,
|
||||
gpointer data)
|
||||
{
|
||||
g_autoptr (AtkObject) atk_child = NULL;
|
||||
AtkPropertyValues values = { NULL };
|
||||
AtkObject *atk_parent = NULL;
|
||||
ClutterActorAccessiblePrivate *priv = NULL;
|
||||
gint index;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (container), 0);
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
|
||||
|
||||
atk_parent = clutter_actor_get_accessible (container);
|
||||
|
||||
if (clutter_actor_has_accessible (actor))
|
||||
{
|
||||
atk_child = clutter_actor_get_accessible (actor);
|
||||
|
||||
g_assert (ATK_IS_OBJECT (atk_child));
|
||||
g_object_ref (atk_child);
|
||||
|
||||
g_value_init (&values.old_value, G_TYPE_POINTER);
|
||||
g_value_set_pointer (&values.old_value, atk_parent);
|
||||
|
||||
values.property_name = "accessible-parent";
|
||||
|
||||
g_signal_emit_by_name (atk_child,
|
||||
"property_change::accessible-parent", &values, NULL);
|
||||
}
|
||||
|
||||
priv = clutter_actor_accessible_get_instance_private (CLUTTER_ACTOR_ACCESSIBLE (atk_parent));
|
||||
index = g_list_index (priv->children, actor);
|
||||
g_list_free (priv->children);
|
||||
|
||||
priv->children = clutter_actor_get_children (CLUTTER_ACTOR (container));
|
||||
|
||||
if (index >= 0 && index <= g_list_length (priv->children))
|
||||
g_signal_emit_by_name (atk_parent, "children_changed::remove",
|
||||
index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_accessible_initialize (AtkObject *obj,
|
||||
gpointer data)
|
||||
|
@ -201,27 +244,6 @@ clutter_actor_accessible_get_role (AtkObject *obj)
|
|||
return role;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_accessible_class_init (ClutterActorAccessibleClass *klass)
|
||||
{
|
||||
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
/* GObject */
|
||||
gobject_class->finalize = clutter_actor_accessible_finalize;
|
||||
|
||||
/* AtkObject */
|
||||
class->get_role = clutter_actor_accessible_get_role;
|
||||
class->get_name = clutter_actor_accessible_get_name;
|
||||
class->get_parent = clutter_actor_accessible_get_parent;
|
||||
class->get_index_in_parent = clutter_actor_accessible_get_index_in_parent;
|
||||
class->ref_state_set = clutter_actor_accessible_ref_state_set;
|
||||
class->initialize = clutter_actor_accessible_initialize;
|
||||
class->get_n_children = clutter_actor_accessible_get_n_children;
|
||||
class->ref_child = clutter_actor_accessible_ref_child;
|
||||
class->get_attributes = clutter_actor_accessible_get_attributes;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_accessible_init (ClutterActorAccessible *actor_accessible)
|
||||
{
|
||||
|
@ -442,91 +464,28 @@ clutter_actor_accessible_get_attributes (AtkObject *obj)
|
|||
return attributes;
|
||||
}
|
||||
|
||||
/* ClutterContainer */
|
||||
static gint
|
||||
clutter_actor_accessible_add_actor (ClutterActor *container,
|
||||
ClutterActor *actor,
|
||||
gpointer data)
|
||||
static void
|
||||
clutter_actor_accessible_class_init (ClutterActorAccessibleClass *klass)
|
||||
{
|
||||
AtkObject *atk_parent = clutter_actor_get_accessible (container);
|
||||
AtkObject *atk_child = clutter_actor_get_accessible (actor);
|
||||
ClutterActorAccessiblePrivate *priv = clutter_actor_accessible_get_instance_private (CLUTTER_ACTOR_ACCESSIBLE (atk_parent));
|
||||
gint index;
|
||||
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (container), 0);
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
|
||||
/* GObject */
|
||||
gobject_class->finalize = clutter_actor_accessible_finalize;
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible_parent");
|
||||
|
||||
g_list_free (priv->children);
|
||||
|
||||
priv->children = clutter_actor_get_children (CLUTTER_ACTOR (container));
|
||||
|
||||
index = g_list_index (priv->children, actor);
|
||||
g_signal_emit_by_name (atk_parent, "children_changed::add",
|
||||
index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static gint
|
||||
clutter_actor_accessible_remove_actor (ClutterActor *container,
|
||||
ClutterActor *actor,
|
||||
gpointer data)
|
||||
{
|
||||
g_autoptr (AtkObject) atk_child = NULL;
|
||||
AtkPropertyValues values = { NULL };
|
||||
AtkObject *atk_parent = NULL;
|
||||
ClutterActorAccessiblePrivate *priv = NULL;
|
||||
gint index;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (container), 0);
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
|
||||
|
||||
atk_parent = clutter_actor_get_accessible (container);
|
||||
|
||||
if (clutter_actor_has_accessible (actor))
|
||||
{
|
||||
atk_child = clutter_actor_get_accessible (actor);
|
||||
|
||||
g_assert (ATK_IS_OBJECT (atk_child));
|
||||
g_object_ref (atk_child);
|
||||
|
||||
g_value_init (&values.old_value, G_TYPE_POINTER);
|
||||
g_value_set_pointer (&values.old_value, atk_parent);
|
||||
|
||||
values.property_name = "accessible-parent";
|
||||
|
||||
g_signal_emit_by_name (atk_child,
|
||||
"property_change::accessible-parent", &values, NULL);
|
||||
}
|
||||
|
||||
priv = clutter_actor_accessible_get_instance_private (CLUTTER_ACTOR_ACCESSIBLE (atk_parent));
|
||||
index = g_list_index (priv->children, actor);
|
||||
g_list_free (priv->children);
|
||||
|
||||
priv->children = clutter_actor_get_children (CLUTTER_ACTOR (container));
|
||||
|
||||
if (index >= 0 && index <= g_list_length (priv->children))
|
||||
g_signal_emit_by_name (atk_parent, "children_changed::remove",
|
||||
index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
/* AtkObject */
|
||||
class->get_role = clutter_actor_accessible_get_role;
|
||||
class->get_name = clutter_actor_accessible_get_name;
|
||||
class->get_parent = clutter_actor_accessible_get_parent;
|
||||
class->get_index_in_parent = clutter_actor_accessible_get_index_in_parent;
|
||||
class->ref_state_set = clutter_actor_accessible_ref_state_set;
|
||||
class->initialize = clutter_actor_accessible_initialize;
|
||||
class->get_n_children = clutter_actor_accessible_get_n_children;
|
||||
class->ref_child = clutter_actor_accessible_ref_child;
|
||||
class->get_attributes = clutter_actor_accessible_get_attributes;
|
||||
}
|
||||
|
||||
/* AtkComponent implementation */
|
||||
static void
|
||||
clutter_actor_accessible_component_interface_init (AtkComponentIface *iface)
|
||||
{
|
||||
g_return_if_fail (iface != NULL);
|
||||
|
||||
iface->get_extents = clutter_actor_accessible_get_extents;
|
||||
iface->get_mdi_zorder = clutter_actor_accessible_get_mdi_zorder;
|
||||
|
||||
/* focus management */
|
||||
iface->grab_focus = clutter_actor_accessible_grab_focus;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_accessible_get_extents (AtkComponent *component,
|
||||
gint *x,
|
||||
|
@ -597,3 +556,31 @@ clutter_actor_accessible_grab_focus (AtkComponent *component)
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static double
|
||||
clutter_actor_accessible_get_alpha (AtkComponent *component)
|
||||
{
|
||||
ClutterActor *actor;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR_ACCESSIBLE (component), 1.0);
|
||||
|
||||
actor = CLUTTER_ACTOR_FROM_ACCESSIBLE (component);
|
||||
|
||||
if (!actor)
|
||||
return 1.0;
|
||||
|
||||
return clutter_actor_get_opacity (actor) / 255.0;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_accessible_component_interface_init (AtkComponentIface *iface)
|
||||
{
|
||||
g_return_if_fail (iface != NULL);
|
||||
|
||||
iface->get_extents = clutter_actor_accessible_get_extents;
|
||||
iface->get_mdi_zorder = clutter_actor_accessible_get_mdi_zorder;
|
||||
iface->get_alpha = clutter_actor_accessible_get_alpha;
|
||||
|
||||
/* focus management */
|
||||
iface->grab_focus = clutter_actor_accessible_grab_focus;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue