+2007-11-15 Emmanuele Bassi <ebassi@openedhand.com>
+
+ * clutter/clutter-actor.[ch]: Massive API clean-ups. Initial
+ fixes for bugs #614 and #628.
+
+ * clutter/clutter-main.c:
+ * clutter/clutter-stage.c: Update internal usage of the actor
+ API.
+
+ * tests/test-events.c: Update test suite.
+
2007-11-15 Øyvind Kolås <pippin@o-hand.com>
* clutter/clutter-main.c: (generate_enter_leave_events),
ClutterActorClass *klass;
gboolean x_change, y_change, width_change, height_change;
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+ g_return_if_fail (box != NULL);
+
klass = CLUTTER_ACTOR_GET_CLASS (self);
if (klass->request_coords)
{
ClutterActorClass *klass;
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+ g_return_if_fail (box != NULL);
+
klass = CLUTTER_ACTOR_GET_CLASS (self);
box->x1 = self->priv->coords.x1;
switch (prop_id)
{
case PROP_X:
- clutter_actor_set_position (actor,
- g_value_get_int (value),
- clutter_actor_get_y (actor));
+ clutter_actor_set_x (actor, g_value_get_int (value));
break;
case PROP_Y:
- clutter_actor_set_position (actor,
- clutter_actor_get_x (actor),
- g_value_get_int (value));
+ clutter_actor_set_y (actor, g_value_get_int (value));
break;
case PROP_WIDTH:
- clutter_actor_set_size (actor,
- g_value_get_int (value),
- clutter_actor_get_height (actor));
+ clutter_actor_set_width (actor, g_value_get_int (value));
break;
case PROP_HEIGHT:
- clutter_actor_set_size (actor,
- clutter_actor_get_width (actor),
- g_value_get_int (value));
+ clutter_actor_set_height (actor, g_value_get_int (value));
break;
case PROP_DEPTH:
clutter_actor_set_depth (actor, g_value_get_int (value));
}
break;
case PROP_REACTIVE:
- if (g_value_get_boolean (value) == TRUE)
- clutter_actor_set_reactive (actor);
- else
- clutter_actor_unset_reactive (actor);
+ clutter_actor_set_reactive (actor, g_value_get_boolean (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
clutter_actor_request_coords (self, &box);
}
+/* local inline version, without type checking to be used by
+ * set_width() and set_height(). if one of the dimensions is < 0
+ * it will not be changed
+ */
+static inline void
+clutter_actor_set_size_internal (ClutterActor *self,
+ gint width,
+ gint height)
+{
+ ClutterActorBox box;
+
+ clutter_actor_query_coords (self, &box);
+
+ if (width > 0)
+ box.x2 = box.x1 + CLUTTER_UNITS_FROM_INT (width);
+
+ if (height > 0)
+ box.y2 = box.y1 + CLUTTER_UNITS_FROM_INT (height);
+
+ clutter_actor_request_coords (self, &box);
+}
+
/**
* clutter_actor_set_size
* @self: A #ClutterActor
- * @width: New width of actor in pixels
- * @height: New height of actor in pixels
+ * @width: New width of actor in pixels, or -1
+ * @height: New height of actor in pixels, or -1
*
- * Sets the actors size in pixels.
+ * Sets the actors size in pixels. If @width and/or @height are -1 the
+ * actor will assume the same size of its bounding box.
*/
void
clutter_actor_set_size (ClutterActor *self,
gint width,
gint height)
{
- ClutterActorBox box;
-
g_return_if_fail (CLUTTER_IS_ACTOR (self));
- clutter_actor_query_coords (self, &box);
-
- box.x2 = box.x1 + CLUTTER_UNITS_FROM_INT (width);
- box.y2 = box.y1 + CLUTTER_UNITS_FROM_INT (height);
-
- clutter_actor_request_coords (self, &box);
+ clutter_actor_set_size_internal (self, width, height);
}
/**
*height = CLUTTER_UNITS_TO_INT (box.y2 - box.y1);
}
+/**
+ * clutter_actor_get_position:
+ * @self: a #ClutterActor
+ * @x: return location for the X coordinate, or %NULL
+ * @y: return location for the Y coordinate, or %NULL
+ *
+ * Retrieves the position of an actor.
+ *
+ * Since: 0.6
+ */
+void
+clutter_actor_get_position (ClutterActor *self,
+ gint *x,
+ gint *y)
+{
+ ClutterActorBox box = { 0, };
+
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+ clutter_actor_query_coords (self, &box);
+
+ if (x)
+ *x = CLUTTER_UNITS_TO_INT (box.x1);
+
+ if (y)
+ *y = CLUTTER_UNITS_TO_INT (box.y1);
+}
+
/*
* clutter_actor_get_abs_position_units
* @self: A #ClutterActor
* since: 2.0
**/
void
-clutter_actor_set_width (ClutterActor *self, guint width)
+clutter_actor_set_width (ClutterActor *self,
+ guint width)
{
- clutter_actor_set_size (self,
- width,
- clutter_actor_get_height (self));
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+ clutter_actor_set_size_internal (self, width, -1);
}
/**
* since: 2.0
**/
void
-clutter_actor_set_height (ClutterActor *self, guint height)
+clutter_actor_set_height (ClutterActor *self,
+ guint height)
{
- clutter_actor_set_size (self,
- clutter_actor_get_width (self),
- height);
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+ clutter_actor_set_size_internal (self, -1, height);
}
+/**
+ * clutter_actor_set_x:
+ * @self: a #ClutterActor
+ * @x: the actors position on the X axis
+ *
+ * Sets the actor's x position relative to its parent.
+ *
+ * Since: 0.6
+ */
+void
+clutter_actor_set_x (ClutterActor *self,
+ gint x)
+{
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+ clutter_actor_set_position (self,
+ x,
+ clutter_actor_get_y (self));
+}
+
+/**
+ * clutter_actor_set_y:
+ * @self: a #ClutterActor
+ * @y: the actors position on the Y axis
+ *
+ * Sets the actor's y position relative to its parent.
+ *
+ * Since: 0.6
+ */
+void
+clutter_actor_set_y (ClutterActor *self,
+ gint y)
+{
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+ clutter_actor_set_position (self,
+ clutter_actor_get_x (self),
+ y);
+}
/**
* clutter_actor_get_x
}
/**
+ * clutter_actor_get_clip:
+ * @self: a #ClutterActor
+ * @xoff: return location for the X offset of the clip rectangle, or %NULL
+ * @yoff: return location for the Y offset of the clip rectangle, or %NULL
+ * @width: return location for the width of the clip rectangle, or %NULL
+ * @height: return location for the height of the clip rectangle, or %NULL
+ *
+ * Gets the clip area for @self, in pixels.
+ *
+ * Since: 0.6
+ */
+void
+clutter_actor_get_clip (ClutterActor *self,
+ gint *xoff,
+ gint *yoff,
+ gint *width,
+ gint *height)
+{
+ ClutterActorPrivate *priv;
+ ClutterGeometry clip = { 0, };
+
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+ priv = self->priv;
+
+ if (!priv->has_clip)
+ return;
+
+ clip = priv->clip;
+
+ if (xoff)
+ *xoff = clip.x;
+ if (yoff)
+ *yoff = clip.y;
+ if (width)
+ *width = clip.width;
+ if (height)
+ *height = clip.height;
+}
+
+/**
* clutter_actor_set_parent:
* @self: A #ClutterActor
* @parent: A new #ClutterActor parent
/**
* clutter_actor_set_reactive:
* @actor: a #ClutterActor
+ * @reactive: whether the actor should be reactive to events
*
* Sets @actor as reactive. Reactive actors will receive events.
*
* Since: 0.6
*/
void
-clutter_actor_set_reactive (ClutterActor *actor)
+clutter_actor_set_reactive (ClutterActor *actor,
+ gboolean reactive)
{
g_return_if_fail (CLUTTER_IS_ACTOR (actor));
- CLUTTER_ACTOR_SET_FLAGS (actor, CLUTTER_ACTOR_REACTIVE);
-}
-
-/**
- * clutter_actor_unset_reactive:
- * @actor: a #ClutterActor
- *
- * Sets @actor as not reactive.
- *
- * Since: 0.6
- */
-void
-clutter_actor_unset_reactive (ClutterActor *actor)
-{
- g_return_if_fail (CLUTTER_IS_ACTOR (actor));
+ if (reactive == CLUTTER_ACTOR_IS_REACTIVE (actor))
+ return;
- CLUTTER_ACTOR_UNSET_FLAGS (actor, CLUTTER_ACTOR_REACTIVE);
+ if (reactive)
+ CLUTTER_ACTOR_SET_FLAGS (actor, CLUTTER_ACTOR_REACTIVE);
+ else
+ CLUTTER_ACTOR_UNSET_FLAGS (actor, CLUTTER_ACTOR_REACTIVE);
}
/**
- * clutter_actor_is_reactive:
+ * clutter_actor_get_reactive:
* @actor: a #ClutterActor
*
* Checks whether @actor is marked as reactive.
* Since: 0.6
*/
gboolean
-clutter_actor_is_reactive (ClutterActor *actor)
+clutter_actor_get_reactive (ClutterActor *actor)
{
g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), FALSE);
return CLUTTER_ACTOR_IS_REACTIVE (actor);
}
-/**
- * clutter_actor_push_transform_child:
- *
- * Makes all the children follow the parent's transformation matrix
- * until clutter_actor_pop_transform_child().
- *
- * This function should be used by every actor with children inside
- * its paint function, in order to make its children transform (that is:
- * rotate, scale, etc.) with its parent, like:
- *
- * <informalexample><programlisting>
- * clutter_actor_push_transform_child (<!-- -->);
- * for (l = my_actor->children; l != NULL; l = l->next)
- * {
- * ClutterActor *actor = l->data;
- * clutter_actor_paint (child);
- * }
- * clutter_actor_pop_transform_child (<!-- -->);
- * </programlisting></informalexample>
- *
- * Since: 0.6
- */
-void
-clutter_actor_push_transform_child (void)
-{
- cogl_push_matrix ();
-}
-
-/**
- * clutter_actor_pop_transform_child:
- *
- * Cancels the effects of a previous clutter_actor_push_transform_child()
- * call.
- *
- * Since: 0.6
- */
-void
-clutter_actor_pop_transform_child (void)
-{
- cogl_pop_matrix ();
-}
-
/*
* ClutterGeometry
*/
};
GType clutter_actor_get_type (void) G_GNUC_CONST;
+
void clutter_actor_show (ClutterActor *self);
void clutter_actor_show_all (ClutterActor *self);
void clutter_actor_hide (ClutterActor *self);
const ClutterColor *color);
void clutter_actor_queue_redraw (ClutterActor *self);
void clutter_actor_destroy (ClutterActor *self);
+
void clutter_actor_request_coords (ClutterActor *self,
ClutterActorBox *box);
void clutter_actor_query_coords (ClutterActor *self,
void clutter_actor_set_position (ClutterActor *self,
gint x,
gint y);
+void clutter_actor_get_position (ClutterActor *self,
+ gint *x,
+ gint *y);
void clutter_actor_get_abs_position (ClutterActor *self,
gint *x,
gint *y);
guint clutter_actor_get_width (ClutterActor *self);
guint clutter_actor_get_height (ClutterActor *self);
-
-void clutter_actor_set_width (ClutterActor *self,
- guint width);
-
-void clutter_actor_set_height (ClutterActor *self,
- guint height);
-
-
+void clutter_actor_set_width (ClutterActor *self,
+ guint width);
+void clutter_actor_set_height (ClutterActor *self,
+ guint height);
gint clutter_actor_get_x (ClutterActor *self);
gint clutter_actor_get_y (ClutterActor *self);
+void clutter_actor_set_x (ClutterActor *self,
+ gint x);
+void clutter_actor_set_y (ClutterActor *self,
+ gint y);
+
void clutter_actor_rotate_x (ClutterActor *self,
gfloat angle,
gint y,
ClutterFixed clutter_actor_get_rxangx (ClutterActor *self);
ClutterFixed clutter_actor_get_ryangx (ClutterActor *self);
ClutterFixed clutter_actor_get_rzangx (ClutterActor *self);
+
void clutter_actor_set_opacity (ClutterActor *self,
guint8 opacity);
guint8 clutter_actor_get_opacity (ClutterActor *self);
gint height);
void clutter_actor_remove_clip (ClutterActor *self);
gboolean clutter_actor_has_clip (ClutterActor *self);
+void clutter_actor_get_clip (ClutterActor *self,
+ gint *xoff,
+ gint *yoff,
+ gint *width,
+ gint *height);
void clutter_actor_set_parent (ClutterActor *self,
ClutterActor *parent);
ClutterActor * clutter_actor_get_parent (ClutterActor *self);
void clutter_actor_set_depth (ClutterActor *self,
gint depth);
gint clutter_actor_get_depth (ClutterActor *self);
+void clutter_actor_set_reactive (ClutterActor *actor,
+ gboolean reactive);
+gboolean clutter_actor_get_reactive (ClutterActor *actor);
void clutter_actor_set_scalex (ClutterActor *self,
ClutterFixed scale_x,
ClutterFixed scale_y);
ClutterVertex *point,
ClutterVertex *vertex);
-void clutter_actor_push_transform_child (void);
-void clutter_actor_pop_transform_child (void);
-
-/* Per actor event handling - may change */
-gboolean
-clutter_actor_event (ClutterActor *actor,
- ClutterEvent *event,
- gboolean capture);
-void
-clutter_actor_set_reactive (ClutterActor *actor);
-
-void
-clutter_actor_unset_reactive (ClutterActor *actor);
-
-gboolean
-clutter_actor_is_reactive (ClutterActor *actor);
-
-ClutterActor*
-clutter_get_actor_by_id (guint32 id);
+gboolean clutter_actor_event (ClutterActor *actor,
+ ClutterEvent *event,
+ gboolean capture);
+ClutterActor * clutter_get_actor_by_gid (guint32 id);
G_END_DECLS
/* Decode color back into an ID, taking into account fb depth */
id = pixel[2]>>(8-b) | pixel[1]<<b>>(8-g) | pixel[0]<<(g+b)>>(8-r);
- return clutter_get_actor_by_id (id);
+ return clutter_get_actor_by_gid (id);
}
/**
/* Build 'tree' of events */
while (actor && n_tree_events < MAX_EVENT_DEPTH)
{
- if (clutter_actor_is_reactive (actor) ||
+ if (clutter_actor_get_reactive (actor) ||
clutter_actor_get_parent (actor) == NULL)
event_tree[n_tree_events++] = g_object_ref (actor);
}
/**
- * clutter_get_actor_by_id
+ * clutter_get_actor_by_gid
* @id: a #ClutterActor ID.
*
- * FIXME.
+ * Retrieves the #ClutterActor with @id.
+ *
+ * Return value: the actor with the passed id or %NULL. The returned
+ * actor does not have its reference count increased.
*
* Since: 0.6
*/
ClutterActor*
-clutter_get_actor_by_id (guint32 id)
+clutter_get_actor_by_gid (guint32 id)
{
ClutterMainContext *context;
priv->perspective.z_far = CLUTTER_FLOAT_TO_FIXED (100.0);
clutter_actor_set_size (CLUTTER_ACTOR (self), 640, 480);
- clutter_actor_set_reactive (CLUTTER_ACTOR (self));
+ clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
clutter_stage_set_key_focus (self, NULL);
}
2007-11-15 Emmanuele Bassi <ebassi@openedhand.com>
+ * Makefile.am: Ignore the OSX backend subdirectory and
+ scan the clutter-x11.h header
+
+ * clutter-docs.sgml:
+ * clutter-sections.txt: Update.
+
+2007-11-15 Emmanuele Bassi <ebassi@openedhand.com>
+
* clutter-sections.txt: Add new ClutterTimeline API
2007-11-15 Emmanuele Bassi <ebassi@openedhand.com>
# Used for dependencies. The docs will be rebuilt if any of these change.
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
-HFILE_GLOB=$(top_srcdir)/clutter/*.h $(top_srcdir)/clutter/glx/clutter-glx.h
+HFILE_GLOB=$(top_srcdir)/clutter/*.h \
+ $(top_srcdir)/clutter/x11/clutter-x11.h
CFILE_GLOB=$(top_srcdir)/clutter/*.c
# Header files to ignore when scanning.
eglnative \
eglx \
glx \
+ osx \
+ x11 \
json \
pango \
sdl
</partintro>
<xi:include href="xml/clutter-backend.xml"/>
- <xi:include href="xml/clutter-glx.xml"/>
+ <xi:include href="xml/clutter-x11.xml"/>
</part>
<SECTION>
<FILE>clutter-label</FILE>
<TITLE>ClutterLabel</TITLE>
+ClutterLabel
+ClutterLabelClass
clutter_label_new
clutter_label_new_with_text
clutter_label_new_full
clutter_label_set_alignment
clutter_label_get_alignment
<SUBSECTION Standard>
-ClutterLabel
-ClutterLabelClass
CLUTTER_LABEL
CLUTTER_IS_LABEL
CLUTTER_TYPE_LABEL
clutter_actor_destroy
clutter_actor_request_coords
clutter_actor_query_coords
-clutter_actor_set_reactive
-clutter_actor_unset_reactive
-clutter_actor_is_reactive
clutter_actor_event
<SUBSECTION>
clutter_actor_set_size
clutter_actor_get_size
clutter_actor_set_position
+clutter_actor_get_position
clutter_actor_get_abs_position
clutter_actor_set_width
clutter_actor_get_width
clutter_actor_set_height
clutter_actor_get_height
+clutter_actor_set_x
clutter_actor_get_x
+clutter_actor_set_y
clutter_actor_get_y
clutter_actor_move_by
clutter_actor_rotate_x
clutter_actor_get_opacity
clutter_actor_set_name
clutter_actor_get_name
-clutter_actor_get_id
+clutter_actor_get_gid
+
+<SUBSECTION>
clutter_actor_set_clip
clutter_actor_remove_clip
clutter_actor_has_clip
+clutter_actor_get_clip
<SUBSECTION>
clutter_actor_set_parent
clutter_actor_set_scale_with_gravity
clutter_actor_set_scale_with_gravityx
+<SUBSECTION>
+clutter_actor_set_reactive
+clutter_actor_get_reactive
+
<SUBSECTION Standard>
CLUTTER_TYPE_GEOMETRY
CLUTTER_TYPE_ACTOR_BOX
<SECTION>
<FILE>clutter-texture</FILE>
<TITLE>ClutterTexture</TITLE>
+ClutterTexture
+ClutterTextureClass
ClutterTextureFlags
clutter_texture_new
clutter_texture_new_from_pixbuf
clutter_texture_get_y_tile_detail
clutter_texture_has_generated_tiles
clutter_texture_is_tiled
+
<SUBSECTION Standard>
-ClutterTexture
-ClutterTextureClass
CLUTTER_TEXTURE
CLUTTER_IS_TEXTURE
CLUTTER_TYPE_TEXTURE
CLUTTER_TEXTURE_CLASS
CLUTTER_IS_TEXTURE_CLASS
CLUTTER_TEXTURE_GET_CLASS
+
<SUBSECTION Private>
ClutterTexturePrivate
clutter_texture_error_quark
clutter_timeline_set_direction
clutter_timeline_get_direction
-<SUBSECTION
+<SUBSECTION>
clutter_timeline_start
clutter_timeline_pause
clutter_timeline_stop
clutter_get_debug_enabled
clutter_get_show_fps
clutter_get_timestamp
-clutter_get_actor_by_id
+clutter_get_actor_by_gid
+clutter_get_default_frame_rate
+clutter_set_default_frame_rate
clutter_get_motion_events_enabled
clutter_enable_motion_events
<SUBSECTION>
</SECTION>
<SECTION>
-<FILE>clutter-glx</FILE>
-<TITLE>GLX Specific Support</TITLE>
-clutter_glx_get_default_display
-clutter_glx_get_default_screen
-clutter_glx_get_root_window
-clutter_glx_get_stage_visual
-clutter_glx_get_stage_window
-clutter_glx_set_stage_foreign
-clutter_glx_trap_x_errors
-clutter_glx_untrap_x_errors
+<FILE>clutter-x11</FILE>
+<TITLE>X11 Specific Support</TITLE>
+clutter_x11_get_default_display
+clutter_x11_get_default_screen
+clutter_x11_get_root_window
+clutter_x11_get_stage_visual
+clutter_x11_get_stage_window
+clutter_x11_set_stage_foreign
+clutter_x11_trap_x_errors
+clutter_x11_untrap_x_errors
<SUBSECTION>
-ClutterGLXFilterFunc
-ClutterGLXFilterReturn
-clutter_glx_add_filter
-clutter_glx_remove_filter
+ClutterX11FilterFunc
+ClutterX11FilterReturn
+clutter_x11_add_filter
+clutter_x11_remove_filter
</SECTION>
<SECTION>
CLUTTER_MODEL_GET_CLASS
<SUBSECTION Private>
ClutterModelPrivate
+clutter_model_get_type
</SECTION>
<SECTION>
CLUTTER_MODEL_GET_CLASS
<SUBSECTION Private>
ClutterModelIterPrivate
+clutter_model_iter_get_type
</SECTION>
clutter_actor_set_size (actor, 100, 100);
clutter_actor_set_position (actor, 100, 100);
- clutter_actor_set_reactive (actor);
+ clutter_actor_set_reactive (actor, TRUE);
clutter_container_add (CLUTTER_CONTAINER (stage), actor, NULL);
clutter_actor_set_size (actor, 100, 100);
clutter_actor_set_position (actor, 250, 100);
- clutter_actor_set_reactive (actor);
+ clutter_actor_set_reactive (actor, TRUE);
clutter_container_add (CLUTTER_CONTAINER (stage), actor, NULL);
clutter_actor_set_size (actor, 100, 100);
clutter_actor_set_position (actor, 400, 100);
- clutter_actor_set_reactive (actor);
+ clutter_actor_set_reactive (actor, TRUE);
clutter_container_add (CLUTTER_CONTAINER(stage), actor, NULL);