mirror of
https://github.com/brl/mutter.git
synced 2024-11-22 16:10:41 -05:00
actor: Adjust the allocation prior to call allocate()
ClutterActor has various properties controlling the allocation: - x-align, y-align - margin-top, margin-bottom, margin-left, margin-right These properties should adjust the ClutterActorBox passed from the parent actor to its children when calling clutter_actor_allocate(), so that the child can just allocate its children at the right origin with the right available size.
This commit is contained in:
parent
a85c53ea0b
commit
409c3ed8ff
@ -108,6 +108,38 @@ typedef ClutterActorTraverseVisitFlags (*ClutterTraverseCallback) (ClutterActor
|
||||
typedef gboolean (*ClutterForeachCallback) (ClutterActor *actor,
|
||||
gpointer user_data);
|
||||
|
||||
typedef struct _ClutterLayoutInfo ClutterLayoutInfo;
|
||||
|
||||
/*< private >
|
||||
* ClutterLayoutInfo:
|
||||
* @fixed_x: the fixed position of the actor, set using clutter_actor_set_x()
|
||||
* @fixed_y: the fixed position of the actor, set using clutter_actor_set_y()
|
||||
* @margin: the composed margin of the actor
|
||||
* @x_expand: whether the actor should expand horizontally
|
||||
* @y_expand: whether the actor should expand vertically
|
||||
* @x_align: the horizontal alignment, if the actor expands horizontally
|
||||
* @y_align: the vertical alignment, if the actor expands vertically
|
||||
*
|
||||
* Ancillary layout information for an actor.
|
||||
*/
|
||||
struct _ClutterLayoutInfo
|
||||
{
|
||||
/* fixed position coordinates */
|
||||
float fixed_x;
|
||||
float fixed_y;
|
||||
|
||||
ClutterMargin margin;
|
||||
|
||||
guint x_expand : 1;
|
||||
guint y_expand : 1;
|
||||
|
||||
guint x_align : 4;
|
||||
guint y_align : 4;
|
||||
};
|
||||
|
||||
const ClutterLayoutInfo * _clutter_actor_get_layout_info_or_defaults (ClutterActor *self);
|
||||
ClutterLayoutInfo * _clutter_actor_get_layout_info (ClutterActor *self);
|
||||
|
||||
gint _clutter_actor_get_n_children (ClutterActor *self);
|
||||
gboolean _clutter_actor_foreach_child (ClutterActor *self,
|
||||
ClutterForeachCallback callback,
|
||||
|
@ -293,8 +293,11 @@
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
/* for ClutterShader */
|
||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "cogl/cogl.h"
|
||||
|
||||
#include "clutter-actor-private.h"
|
||||
@ -378,22 +381,6 @@ typedef enum {
|
||||
*/
|
||||
} MapStateChange;
|
||||
|
||||
typedef struct _LayoutInfo LayoutInfo;
|
||||
struct _LayoutInfo
|
||||
{
|
||||
/* fixed position coordinates */
|
||||
float fixed_x;
|
||||
float fixed_y;
|
||||
|
||||
ClutterMargin margin;
|
||||
|
||||
guint x_expand : 1;
|
||||
guint y_expand : 1;
|
||||
|
||||
guint x_align : 4;
|
||||
guint y_align : 4;
|
||||
};
|
||||
|
||||
struct _ClutterActorPrivate
|
||||
{
|
||||
/* request mode */
|
||||
@ -726,9 +713,6 @@ static void _clutter_actor_get_relative_transformation_matrix (ClutterActor *sel
|
||||
|
||||
static ClutterPaintVolume *_clutter_actor_get_paint_volume_mutable (ClutterActor *self);
|
||||
|
||||
static LayoutInfo * clutter_actor_get_layout_info (ClutterActor *self);
|
||||
static const LayoutInfo *clutter_actor_get_layout_info_or_defaults (ClutterActor *self);
|
||||
|
||||
/* Helper macro which translates by the anchor coord, applies the
|
||||
given transformation and then translates back */
|
||||
#define TRANSFORM_ABOUT_ANCHOR_COORD(a,m,c,_transform) G_STMT_START { \
|
||||
@ -1941,6 +1925,10 @@ clutter_actor_real_allocate (ClutterActor *self,
|
||||
|
||||
priv->allocation = *box;
|
||||
priv->allocation_flags = flags;
|
||||
|
||||
/* allocation is authoritative */
|
||||
priv->needs_width_request = FALSE;
|
||||
priv->needs_height_request = FALSE;
|
||||
priv->needs_allocation = FALSE;
|
||||
|
||||
/* we allocate our children before we notify changes in our geometry,
|
||||
@ -3626,16 +3614,18 @@ clutter_actor_get_property (GObject *object,
|
||||
|
||||
case PROP_FIXED_X:
|
||||
{
|
||||
LayoutInfo *info = clutter_actor_get_layout_info (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_float (value, info->fixed_x);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_FIXED_Y:
|
||||
{
|
||||
LayoutInfo *info = clutter_actor_get_layout_info (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_float (value, info->fixed_y);
|
||||
}
|
||||
break;
|
||||
@ -3870,80 +3860,72 @@ clutter_actor_get_property (GObject *object,
|
||||
|
||||
case PROP_X_EXPAND:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_boolean (value, info->x_expand);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_Y_EXPAND:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_boolean (value, info->y_expand);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_X_ALIGN:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_enum (value, info->x_align);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_Y_ALIGN:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_enum (value, info->y_align);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_MARGIN_TOP:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_float (value, info->margin.top);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_MARGIN_BOTTOM:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_float (value, info->margin.bottom);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_MARGIN_LEFT:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_float (value, info->margin.left);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_MARGIN_RIGHT:
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
|
||||
info = clutter_actor_get_layout_info_or_defaults (actor);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (actor);
|
||||
g_value_set_float (value, info->margin.right);
|
||||
}
|
||||
break;
|
||||
@ -6500,6 +6482,189 @@ clutter_actor_get_allocation_geometry (ClutterActor *self,
|
||||
geom->height = CLUTTER_NEARBYINT (clutter_actor_box_get_height (&box));
|
||||
}
|
||||
|
||||
static ClutterActorAlign
|
||||
effective_align (ClutterActorAlign align,
|
||||
ClutterTextDirection direction)
|
||||
{
|
||||
ClutterActorAlign res;
|
||||
|
||||
switch (align)
|
||||
{
|
||||
case CLUTTER_ACTOR_ALIGN_START:
|
||||
res = (direction == CLUTTER_TEXT_DIRECTION_RTL)
|
||||
? CLUTTER_ACTOR_ALIGN_END
|
||||
: CLUTTER_ACTOR_ALIGN_START;
|
||||
break;
|
||||
|
||||
case CLUTTER_ACTOR_ALIGN_END:
|
||||
res = (direction == CLUTTER_TEXT_DIRECTION_RTL)
|
||||
? CLUTTER_ACTOR_ALIGN_START
|
||||
: CLUTTER_ACTOR_ALIGN_END;
|
||||
break;
|
||||
|
||||
default:
|
||||
res = align;
|
||||
break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline void
|
||||
adjust_for_margin (float margin_start,
|
||||
float margin_end,
|
||||
float *minimum_size,
|
||||
float *natural_size,
|
||||
float *allocated_start,
|
||||
float *allocated_end)
|
||||
{
|
||||
*minimum_size -= (margin_start + margin_end);
|
||||
*natural_size -= (margin_start + margin_end);
|
||||
*allocated_start += margin_start;
|
||||
*allocated_end -= margin_end;
|
||||
}
|
||||
|
||||
static inline void
|
||||
adjust_for_alignment (ClutterActorAlign alignment,
|
||||
float natural_size,
|
||||
float *allocated_start,
|
||||
float *allocated_end)
|
||||
{
|
||||
float allocated_size = *allocated_end - *allocated_start;
|
||||
|
||||
switch (alignment)
|
||||
{
|
||||
case CLUTTER_ACTOR_ALIGN_FILL:
|
||||
/* do nothing */
|
||||
break;
|
||||
|
||||
case CLUTTER_ACTOR_ALIGN_START:
|
||||
/* keep start */
|
||||
*allocated_end = *allocated_start + MIN (natural_size, allocated_size);
|
||||
break;
|
||||
|
||||
case CLUTTER_ACTOR_ALIGN_END:
|
||||
if (allocated_size > natural_size)
|
||||
{
|
||||
*allocated_start += (allocated_size - natural_size);
|
||||
*allocated_end = *allocated_start + natural_size;
|
||||
}
|
||||
break;
|
||||
|
||||
case CLUTTER_ACTOR_ALIGN_CENTER:
|
||||
if (allocated_size > natural_size)
|
||||
{
|
||||
*allocated_start += ceilf ((allocated_size - natural_size) / 2);
|
||||
*allocated_end = *allocated_start + MIN (allocated_size, natural_size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* clutter_actor_adjust_allocation:
|
||||
* @self: a #ClutterActor
|
||||
* @allocation: (inout): the allocation to adjust
|
||||
*
|
||||
* Adjusts the passed allocation box taking into account the actor's
|
||||
* layout information, like alignment, expansion, and margin.
|
||||
*/
|
||||
static void
|
||||
clutter_actor_adjust_allocation (ClutterActor *self,
|
||||
ClutterActorBox *allocation)
|
||||
{
|
||||
ClutterActorPrivate *priv = self->priv;
|
||||
ClutterActorBox adj_allocation;
|
||||
float alloc_width, alloc_height;
|
||||
float min_width, min_height;
|
||||
float nat_width, nat_height;
|
||||
ClutterRequestMode req_mode;
|
||||
ClutterTextDirection text_dir;
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
adj_allocation = *allocation;
|
||||
|
||||
clutter_actor_box_get_size (allocation, &alloc_width, &alloc_height);
|
||||
|
||||
/* we want to hit the cache, so we use the public API */
|
||||
req_mode = clutter_actor_get_request_mode (self);
|
||||
|
||||
if (req_mode == CLUTTER_REQUEST_HEIGHT_FOR_WIDTH)
|
||||
{
|
||||
clutter_actor_get_preferred_width (self, -1,
|
||||
&min_width,
|
||||
&nat_width);
|
||||
clutter_actor_get_preferred_height (self, alloc_width,
|
||||
&min_height,
|
||||
&nat_height);
|
||||
}
|
||||
else if (req_mode == CLUTTER_REQUEST_WIDTH_FOR_HEIGHT)
|
||||
{
|
||||
clutter_actor_get_preferred_height (self, -1,
|
||||
&min_height,
|
||||
&nat_height);
|
||||
clutter_actor_get_preferred_height (self, alloc_height,
|
||||
&min_width,
|
||||
&nat_width);
|
||||
}
|
||||
|
||||
#ifdef CLUTTER_ENABLE_DEBUG
|
||||
/* warn about underallocations */
|
||||
if ((min_width > alloc_width) || (min_height > alloc_height))
|
||||
{
|
||||
g_warning (G_STRLOC ": The actor '%s' is getting an allocation "
|
||||
"of %.2f x %.2f from its parent actor '%s', but its "
|
||||
"requested minimum size is of %.2f x %.2f",
|
||||
_clutter_actor_get_debug_name (self),
|
||||
alloc_width, alloc_height,
|
||||
_clutter_actor_get_debug_name (priv->parent_actor),
|
||||
min_width, min_height);
|
||||
}
|
||||
#endif
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (self);
|
||||
text_dir = clutter_actor_get_text_direction (self);
|
||||
|
||||
CLUTTER_NOTE (LAYOUT, "Adjusting allocated X and width");
|
||||
adjust_for_margin (info->margin.left, info->margin.right,
|
||||
&min_width, &nat_width,
|
||||
&adj_allocation.x1, &adj_allocation.x2);
|
||||
adjust_for_alignment (effective_align (info->x_align, text_dir),
|
||||
nat_width,
|
||||
&adj_allocation.x1, &adj_allocation.x2);
|
||||
|
||||
CLUTTER_NOTE (LAYOUT, "Adjusting allocated Y and height");
|
||||
adjust_for_margin (info->margin.top, info->margin.bottom,
|
||||
&min_height, &nat_height,
|
||||
&adj_allocation.y1, &adj_allocation.y2);
|
||||
adjust_for_alignment (info->y_align,
|
||||
nat_height,
|
||||
&adj_allocation.y1, &adj_allocation.y2);
|
||||
|
||||
/* we maintain the invariant that an allocation cannot be adjusted
|
||||
* to be outside the parent-given box
|
||||
*/
|
||||
if (adj_allocation.x1 < allocation->x1 ||
|
||||
adj_allocation.y1 < allocation->y1 ||
|
||||
adj_allocation.x2 > allocation->x2 ||
|
||||
adj_allocation.y2 > allocation->y2)
|
||||
{
|
||||
g_warning (G_STRLOC ": The actor '%s' tried to adjust its allocation "
|
||||
"to { %.2f, %.2f, %.2f, %.2f }, which is outside of its "
|
||||
"original allocation of { %.2f, %.2f, %.2f, %.2f }",
|
||||
_clutter_actor_get_debug_name (self),
|
||||
adj_allocation.x1, adj_allocation.y1,
|
||||
adj_allocation.x2 - adj_allocation.x1,
|
||||
adj_allocation.y2 - adj_allocation.y1,
|
||||
allocation->x1, allocation->y1,
|
||||
allocation->x2 - allocation->x1,
|
||||
allocation->y2 - allocation->y1);
|
||||
return;
|
||||
}
|
||||
|
||||
*allocation = adj_allocation;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_allocate:
|
||||
* @self: A #ClutterActor
|
||||
@ -6525,7 +6690,7 @@ clutter_actor_allocate (ClutterActor *self,
|
||||
{
|
||||
ClutterActorPrivate *priv;
|
||||
ClutterActorClass *klass;
|
||||
ClutterActorBox alloc;
|
||||
ClutterActorBox old_allocation, real_allocation;
|
||||
gboolean origin_changed, child_moved, size_changed;
|
||||
gboolean stage_allocation_changed;
|
||||
|
||||
@ -6540,8 +6705,13 @@ clutter_actor_allocate (ClutterActor *self,
|
||||
|
||||
priv = self->priv;
|
||||
|
||||
alloc = *box;
|
||||
old_allocation = priv->allocation;
|
||||
real_allocation = *box;
|
||||
|
||||
/* constraints are allowed to modify the allocation prior to
|
||||
* the ::allocate() implementation, so that if the allocation
|
||||
* did not change, we can bail out early
|
||||
*/
|
||||
if (priv->constraints != NULL)
|
||||
{
|
||||
const GList *constraints, *l;
|
||||
@ -6553,17 +6723,37 @@ clutter_actor_allocate (ClutterActor *self,
|
||||
ClutterActorMeta *meta = l->data;
|
||||
|
||||
if (clutter_actor_meta_get_enabled (meta))
|
||||
_clutter_constraint_update_allocation (constraint, self, &alloc);
|
||||
{
|
||||
_clutter_constraint_update_allocation (constraint,
|
||||
self,
|
||||
&real_allocation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* adjust the allocation depending on the align/expand/margin properties */
|
||||
clutter_actor_adjust_allocation (self, &real_allocation);
|
||||
|
||||
if (real_allocation.x2 < real_allocation.x1 ||
|
||||
real_allocation.y2 < real_allocation.y1)
|
||||
{
|
||||
g_warning (G_STRLOC ": Actor '%s' tried to allocate a size of %.2f x %.2f",
|
||||
_clutter_actor_get_debug_name (self),
|
||||
real_allocation.x2 - real_allocation.x1,
|
||||
real_allocation.y2 - real_allocation.y1);
|
||||
}
|
||||
|
||||
/* we allow 0-sized actors, but not negative-sized ones */
|
||||
real_allocation.x2 = MAX (real_allocation.x2, real_allocation.x1);
|
||||
real_allocation.y2 = MAX (real_allocation.y2, real_allocation.y1);
|
||||
|
||||
origin_changed = (flags & CLUTTER_ABSOLUTE_ORIGIN_CHANGED);
|
||||
|
||||
child_moved = (alloc.x1 != priv->allocation.x1 ||
|
||||
alloc.y1 != priv->allocation.y1);
|
||||
child_moved = (real_allocation.x1 != old_allocation.x1 ||
|
||||
real_allocation.y1 != old_allocation.y1);
|
||||
|
||||
size_changed = (alloc.x2 != priv->allocation.x2 ||
|
||||
alloc.y2 != priv->allocation.y2);
|
||||
size_changed = (real_allocation.x2 != old_allocation.x2 ||
|
||||
real_allocation.y2 != old_allocation.y2);
|
||||
|
||||
if (origin_changed || child_moved || size_changed)
|
||||
stage_allocation_changed = TRUE;
|
||||
@ -6582,7 +6772,6 @@ clutter_actor_allocate (ClutterActor *self,
|
||||
* actors that did not queue relayout and were
|
||||
* not moved.
|
||||
*/
|
||||
|
||||
if (!priv->needs_allocation && !stage_allocation_changed)
|
||||
{
|
||||
CLUTTER_NOTE (LAYOUT, "No allocation needed");
|
||||
@ -6601,7 +6790,7 @@ clutter_actor_allocate (ClutterActor *self,
|
||||
CLUTTER_SET_PRIVATE_FLAGS (self, CLUTTER_IN_RELAYOUT);
|
||||
|
||||
klass = CLUTTER_ACTOR_GET_CLASS (self);
|
||||
klass->allocate (self, &alloc, flags);
|
||||
klass->allocate (self, &real_allocation, flags);
|
||||
|
||||
CLUTTER_UNSET_PRIVATE_FLAGS (self, CLUTTER_IN_RELAYOUT);
|
||||
|
||||
@ -6757,13 +6946,12 @@ clutter_actor_move_by (ClutterActor *self,
|
||||
gfloat dx,
|
||||
gfloat dy)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
const ClutterLayoutInfo *info;
|
||||
gfloat x, y;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (self);
|
||||
x = info->fixed_x;
|
||||
y = info->fixed_y;
|
||||
|
||||
@ -7500,13 +7688,13 @@ clutter_actor_set_x (ClutterActor *self,
|
||||
{
|
||||
ClutterActorBox old = { 0, };
|
||||
ClutterActorPrivate *priv;
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
priv = self->priv;
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (priv->position_set && info->fixed_x == x)
|
||||
return;
|
||||
@ -7539,13 +7727,13 @@ clutter_actor_set_y (ClutterActor *self,
|
||||
{
|
||||
ClutterActorBox old = { 0, };
|
||||
ClutterActorPrivate *priv;
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
priv = self->priv;
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (priv->position_set && info->fixed_y == y)
|
||||
return;
|
||||
@ -7595,7 +7783,9 @@ clutter_actor_get_x (ClutterActor *self)
|
||||
{
|
||||
if (priv->position_set)
|
||||
{
|
||||
LayoutInfo *info = clutter_actor_get_layout_info (self);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (self);
|
||||
|
||||
return info->fixed_x;
|
||||
}
|
||||
@ -7641,7 +7831,9 @@ clutter_actor_get_y (ClutterActor *self)
|
||||
{
|
||||
if (priv->position_set)
|
||||
{
|
||||
LayoutInfo *info = clutter_actor_get_layout_info (self);
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = _clutter_actor_get_layout_info_or_defaults (self);
|
||||
|
||||
return info->fixed_y;
|
||||
}
|
||||
@ -13256,7 +13448,7 @@ clutter_actor_get_layout_manager (ClutterActor *self)
|
||||
return self->priv->layout_manager;
|
||||
}
|
||||
|
||||
static const LayoutInfo default_layout_info = {
|
||||
static const ClutterLayoutInfo default_layout_info = {
|
||||
0.f, /* fixed-x */
|
||||
0.f, /* fixed-y */
|
||||
{ 0, 0, 0, 0 }, /* margin */
|
||||
@ -13270,34 +13462,34 @@ static void
|
||||
layout_info_free (gpointer data)
|
||||
{
|
||||
if (G_LIKELY (data != NULL))
|
||||
g_slice_free (LayoutInfo, data);
|
||||
g_slice_free (ClutterLayoutInfo, data);
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* clutter_actor_get_layout_info:
|
||||
* _clutter_actor_get_layout_info:
|
||||
* @self: a #ClutterActor
|
||||
*
|
||||
* Retrieves a pointer to the LayoutInfo structure.
|
||||
* Retrieves a pointer to the ClutterLayoutInfo structure.
|
||||
*
|
||||
* If the actor does not have a LayoutInfo associated to it, one
|
||||
* If the actor does not have a ClutterLayoutInfo associated to it, one
|
||||
* will be created and initialized to the default values.
|
||||
*
|
||||
* This function should be used for setters.
|
||||
*
|
||||
* For getters, you should use clutter_actor_get_layout_info_or_defaults()
|
||||
* For getters, you should use _clutter_actor_get_layout_info_or_defaults()
|
||||
* instead.
|
||||
*
|
||||
* Return value: (transfer none): a pointer to the LayoutInfo structure
|
||||
* Return value: (transfer none): a pointer to the ClutterLayoutInfo structure
|
||||
*/
|
||||
static LayoutInfo *
|
||||
clutter_actor_get_layout_info (ClutterActor *self)
|
||||
ClutterLayoutInfo *
|
||||
_clutter_actor_get_layout_info (ClutterActor *self)
|
||||
{
|
||||
LayoutInfo *retval;
|
||||
ClutterLayoutInfo *retval;
|
||||
|
||||
retval = g_object_get_qdata (G_OBJECT (self), quark_actor_layout_info);
|
||||
if (retval == NULL)
|
||||
{
|
||||
retval = g_slice_new (LayoutInfo);
|
||||
retval = g_slice_new (ClutterLayoutInfo);
|
||||
|
||||
*retval = default_layout_info;
|
||||
|
||||
@ -13310,22 +13502,22 @@ clutter_actor_get_layout_info (ClutterActor *self)
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* clutter_actor_get_layout_info_or_defaults:
|
||||
* _clutter_actor_get_layout_info_or_defaults:
|
||||
* @self: a #ClutterActor
|
||||
*
|
||||
* Retrieves the LayoutInfo structure associated to an actor.
|
||||
* Retrieves the ClutterLayoutInfo structure associated to an actor.
|
||||
*
|
||||
* If the actor does not have a LayoutInfo structure associated to it,
|
||||
* If the actor does not have a ClutterLayoutInfo structure associated to it,
|
||||
* then the default structure will be returned.
|
||||
*
|
||||
* This function should only be used for getters.
|
||||
*
|
||||
* Return value: a const pointer to the LayoutInfo structure
|
||||
* Return value: a const pointer to the ClutterLayoutInfo structure
|
||||
*/
|
||||
static const LayoutInfo *
|
||||
clutter_actor_get_layout_info_or_defaults (ClutterActor *self)
|
||||
const ClutterLayoutInfo *
|
||||
_clutter_actor_get_layout_info_or_defaults (ClutterActor *self)
|
||||
{
|
||||
const LayoutInfo *info;
|
||||
const ClutterLayoutInfo *info;
|
||||
|
||||
info = g_object_get_qdata (G_OBJECT (self), quark_actor_layout_info);
|
||||
if (info == NULL)
|
||||
@ -13338,13 +13530,13 @@ void
|
||||
clutter_actor_set_x_expand (ClutterActor *self,
|
||||
gboolean x_expand)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
x_expand = !!x_expand;
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->x_expand != x_expand)
|
||||
{
|
||||
@ -13361,20 +13553,20 @@ clutter_actor_get_x_expand (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->x_expand;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->x_expand;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_actor_set_y_expand (ClutterActor *self,
|
||||
gboolean y_expand)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
y_expand = !!y_expand;
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->y_expand != y_expand)
|
||||
{
|
||||
@ -13391,18 +13583,18 @@ clutter_actor_get_y_expand (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->y_expand;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->y_expand;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_actor_set_x_align (ClutterActor *self,
|
||||
ClutterActorAlign x_align)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->x_align != x_align)
|
||||
{
|
||||
@ -13419,18 +13611,18 @@ clutter_actor_get_x_align (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), CLUTTER_ACTOR_ALIGN_FILL);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->x_align;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->x_align;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_actor_set_y_align (ClutterActor *self,
|
||||
ClutterActorAlign y_align)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->y_align != y_align)
|
||||
{
|
||||
@ -13447,7 +13639,7 @@ clutter_actor_get_y_align (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), CLUTTER_ACTOR_ALIGN_FILL);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->y_align;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->y_align;
|
||||
}
|
||||
|
||||
ClutterMargin *
|
||||
@ -13480,12 +13672,12 @@ void
|
||||
clutter_actor_set_margin_top (ClutterActor *self,
|
||||
gfloat margin)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
g_return_if_fail (margin >= 0.f);
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->margin.top == margin)
|
||||
return;
|
||||
@ -13502,19 +13694,19 @@ clutter_actor_get_margin_top (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.f);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->margin.top;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->margin.top;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_actor_set_margin_bottom (ClutterActor *self,
|
||||
gfloat margin)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
g_return_if_fail (margin >= 0.f);
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->margin.bottom == margin)
|
||||
return;
|
||||
@ -13531,19 +13723,19 @@ clutter_actor_get_margin_bottom (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.f);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->margin.bottom;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->margin.bottom;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_actor_set_margin_left (ClutterActor *self,
|
||||
gfloat margin)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
g_return_if_fail (margin >= 0.f);
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->margin.left == margin)
|
||||
return;
|
||||
@ -13560,19 +13752,19 @@ clutter_actor_get_margin_left (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.f);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->margin.left;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->margin.left;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_actor_set_margin_right (ClutterActor *self,
|
||||
gfloat margin)
|
||||
{
|
||||
LayoutInfo *info;
|
||||
ClutterLayoutInfo *info;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
g_return_if_fail (margin >= 0.f);
|
||||
|
||||
info = clutter_actor_get_layout_info (self);
|
||||
info = _clutter_actor_get_layout_info (self);
|
||||
|
||||
if (info->margin.right == margin)
|
||||
return;
|
||||
@ -13589,5 +13781,5 @@ clutter_actor_get_margin_right (ClutterActor *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.f);
|
||||
|
||||
return clutter_actor_get_layout_info_or_defaults (self)->margin.right;
|
||||
return _clutter_actor_get_layout_info_or_defaults (self)->margin.right;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user