Group :: System/Libraries
RPM: clutter
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: clutter-1.14.4-alt2.git.74f9d8.patch
Download
Download
clutter/cally/cally-stage.c | 20 ++++-
clutter/clutter-actor.c | 13 ++-
clutter/clutter-deform-effect.c | 2 +-
clutter/clutter-gesture-action.c | 2 +-
clutter/clutter-offscreen-effect.c | 41 ++++++---
clutter/clutter-text.c | 16 ++--
clutter/x11/clutter-device-manager-xi2.c | 30 +++++--
configure.ac | 10 ++-
tests/conform/Makefile.am | 2 +
tests/conform/actor-graph.c | 26 ++++--
tests/conform/actor-invariants.c | 18 ++--
tests/conform/actor-meta.c | 41 +++++++++
tests/conform/actor-offscreen-limit-max-size.c | 117 +++++++++++++++++++++++++
tests/conform/test-conform-main.c | 3 +
14 files changed, 292 insertions(+), 49 deletions(-)
diff --git a/clutter/cally/cally-stage.c b/clutter/cally/cally-stage.c
index 2b1cfd1..c95ccb0 100644
--- a/clutter/cally/cally-stage.c
+++ b/clutter/cally/cally-stage.c
@@ -139,7 +139,11 @@ cally_stage_notify_key_focus_cb (ClutterStage *stage,
AtkObject *old = NULL;
if (self->priv->key_focus != NULL)
- old = clutter_actor_get_accessible (self->priv->key_focus);
+ {
+ g_object_remove_weak_pointer (G_OBJECT (self->priv->key_focus),
+ (gpointer *) &self->priv->key_focus);
+ old = clutter_actor_get_accessible (self->priv->key_focus);
+ }
else
old = clutter_actor_get_accessible (CLUTTER_ACTOR (stage));
@@ -154,7 +158,19 @@ cally_stage_notify_key_focus_cb (ClutterStage *stage,
self->priv->key_focus = key_focus;
if (key_focus != NULL)
- new = clutter_actor_get_accessible (key_focus);
+ {
+ /* ensure that if the key focus goes away, the field inside
+ * CallyStage is reset. see bug:
+ *
+ * https://bugzilla.gnome.org/show_bug.cgi?id=692706
+ *
+ * we remove the weak pointer above.
+ */
+ g_object_add_weak_pointer (G_OBJECT (self->priv->key_focus),
+ (gpointer *) &self->priv->key_focus);
+
+ new = clutter_actor_get_accessible (key_focus);
+ }
else
new = clutter_actor_get_accessible (CLUTTER_ACTOR (stage));
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 0fc8df6..789e248 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -13292,6 +13292,7 @@ clutter_actor_set_child_above_sibling (ClutterActor *self,
ADD_CHILD_NOTIFY_FIRST_LAST,
insert_child_above,
sibling);
+ g_object_unref(child);
clutter_actor_queue_relayout (self);
}
@@ -13338,6 +13339,7 @@ clutter_actor_set_child_below_sibling (ClutterActor *self,
ADD_CHILD_NOTIFY_FIRST_LAST,
insert_child_below,
sibling);
+ g_object_unref(child);
clutter_actor_queue_relayout (self);
}
@@ -13376,6 +13378,7 @@ clutter_actor_set_child_at_index (ClutterActor *self,
ADD_CHILD_NOTIFY_FIRST_LAST,
insert_child_at_index,
GINT_TO_POINTER (index_));
+ g_object_unref (child);
clutter_actor_queue_relayout (self);
}
@@ -17273,7 +17276,10 @@ clutter_actor_has_constraints (ClutterActor *self)
{
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
- return self->priv->constraints != NULL;
+ if (self->priv->constraints == NULL)
+ return FALSE;
+
+ return _clutter_meta_group_has_metas_no_internal (self->priv->constraints);
}
/**
@@ -17292,7 +17298,10 @@ clutter_actor_has_actions (ClutterActor *self)
{
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
- return self->priv->actions != NULL;
+ if (self->priv->actions == NULL)
+ return FALSE;
+
+ return _clutter_meta_group_has_metas_no_internal (self->priv->actions);
}
/**
diff --git a/clutter/clutter-deform-effect.c b/clutter/clutter-deform-effect.c
index 5c302b9..2252672 100644
--- a/clutter/clutter-deform-effect.c
+++ b/clutter/clutter-deform-effect.c
@@ -299,7 +299,7 @@ clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect)
instead we make a temporary copy */
back_pipeline = cogl_pipeline_copy (priv->back_pipeline);
cogl_pipeline_set_depth_state (back_pipeline, &depth_state, NULL);
- cogl_pipeline_set_cull_face_mode (pipeline,
+ cogl_pipeline_set_cull_face_mode (back_pipeline,
COGL_PIPELINE_CULL_FACE_MODE_FRONT);
cogl_framebuffer_draw_primitive (fb, back_pipeline, priv->primitive);
diff --git a/clutter/clutter-gesture-action.c b/clutter/clutter-gesture-action.c
index 2846227..eb47b6d 100644
--- a/clutter/clutter-gesture-action.c
+++ b/clutter/clutter-gesture-action.c
@@ -486,7 +486,7 @@ actor_captured_event_cb (ClutterActor *actor,
/* Start the gesture immediately if the gesture has no
* _TRIGGER_EDGE_AFTER drag threshold. */
- if ((priv->points->len < priv->requested_nb_points) &&
+ if ((priv->points->len >= priv->requested_nb_points) &&
(priv->edge != CLUTTER_GESTURE_TRIGGER_EDGE_AFTER))
begin_gesture (action, actor);
diff --git a/clutter/clutter-offscreen-effect.c b/clutter/clutter-offscreen-effect.c
index d58227f..d3ffaea 100644
--- a/clutter/clutter-offscreen-effect.c
+++ b/clutter/clutter-offscreen-effect.c
@@ -139,9 +139,21 @@ clutter_offscreen_effect_real_create_texture (ClutterOffscreenEffect *effect,
gfloat width,
gfloat height)
{
- return cogl_texture_new_with_size (MAX (width, 1), MAX (height, 1),
- COGL_TEXTURE_NO_SLICING,
- COGL_PIXEL_FORMAT_RGBA_8888_PRE);
+ CoglError *error = NULL;
+ CoglHandle texture = cogl_texture_new_with_size (MAX (width, 1), MAX (height, 1),
+ COGL_TEXTURE_NO_SLICING,
+ COGL_PIXEL_FORMAT_RGBA_8888_PRE);
+
+ if (!cogl_texture_allocate (texture, &error))
+ {
+#if CLUTTER_ENABLE_DEBUG
+ g_warning ("Unable to allocate texture for offscreen effect: %s", error->message);
+#endif /* CLUTTER_ENABLE_DEBUG */
+ cogl_error_free (error);
+ return NULL;
+ }
+
+ return texture;
}
static gboolean
@@ -223,9 +235,11 @@ clutter_offscreen_effect_pre_paint (ClutterEffect *effect)
ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect);
ClutterOffscreenEffectPrivate *priv = self->priv;
ClutterActorBox box;
+ ClutterActor *stage;
CoglMatrix projection;
CoglColor transparent;
- gfloat fbo_width, fbo_height;
+ gfloat stage_width, stage_height;
+ gfloat fbo_width = -1, fbo_height = -1;
gfloat width, height;
gfloat xexpand, yexpand;
int texture_width, texture_height;
@@ -236,6 +250,9 @@ clutter_offscreen_effect_pre_paint (ClutterEffect *effect)
if (priv->actor == NULL)
return FALSE;
+ stage = _clutter_actor_get_stage_internal (priv->actor);
+ clutter_actor_get_size (stage, &stage_width, &stage_height);
+
/* The paint box is the bounding box of the actor's paint volume in
* stage coordinates. This will give us the size for the framebuffer
* we need to redirect its rendering offscreen and its position will
@@ -244,17 +261,21 @@ clutter_offscreen_effect_pre_paint (ClutterEffect *effect)
{
clutter_actor_box_get_size (&box, &fbo_width, &fbo_height);
clutter_actor_box_get_origin (&box, &priv->x_offset, &priv->y_offset);
+
+ fbo_width = MIN (fbo_width, stage_width);
+ fbo_height = MIN (fbo_height, stage_height);
}
else
{
- /* If we can't get a valid paint box then we fallback to
- * creating a full stage size fbo. */
- ClutterActor *stage = _clutter_actor_get_stage_internal (priv->actor);
- clutter_actor_get_size (stage, &fbo_width, &fbo_height);
- priv->x_offset = 0.0f;
- priv->y_offset = 0.0f;
+ fbo_width = stage_width;
+ fbo_height = stage_height;
}
+ if (fbo_width == stage_width)
+ priv->x_offset = 0.0f;
+ if (fbo_height == stage_height)
+ priv->y_offset = 0.0f;
+
/* First assert that the framebuffer is the right size... */
if (!update_fbo (effect, fbo_width, fbo_height))
return FALSE;
diff --git a/clutter/clutter-text.c b/clutter/clutter-text.c
index 8323cc0..5606125 100644
--- a/clutter/clutter-text.c
+++ b/clutter/clutter-text.c
@@ -564,10 +564,13 @@ clutter_text_dirty_cache (ClutterText *text)
*/
static inline void
clutter_text_set_font_description_internal (ClutterText *self,
- PangoFontDescription *desc)
+ PangoFontDescription *desc,
+ gboolean is_default_font)
{
ClutterTextPrivate *priv = self->priv;
+ priv->is_default_font = is_default_font;
+
if (priv->font_desc == desc ||
pango_font_description_equal (priv->font_desc, desc))
return;
@@ -615,7 +618,7 @@ clutter_text_settings_changed_cb (ClutterText *text)
font_name);
font_desc = pango_font_description_from_string (font_name);
- clutter_text_set_font_description_internal (text, font_desc);
+ clutter_text_set_font_description_internal (text, font_desc, TRUE);
pango_font_description_free (font_desc);
g_free (font_name);
@@ -4602,7 +4605,8 @@ clutter_text_set_cursor_visible (ClutterText *self,
{
priv->cursor_visible = cursor_visible;
- clutter_text_queue_redraw (CLUTTER_ACTOR (self));
+ clutter_text_dirty_cache (self);
+ clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CURSOR_VISIBLE]);
}
@@ -4919,7 +4923,8 @@ clutter_text_set_font_description (ClutterText *self,
{
g_return_if_fail (CLUTTER_IS_TEXT (self));
- clutter_text_set_font_description_internal (self, font_desc);
+ clutter_text_set_font_description_internal (self, font_desc,
+ font_desc == NULL);
}
/**
@@ -5026,8 +5031,7 @@ clutter_text_set_font_name (ClutterText *self,
}
/* this will set the font_name field as well */
- clutter_text_set_font_description_internal (self, desc);
- priv->is_default_font = is_default_font;
+ clutter_text_set_font_description_internal (self, desc, is_default_font);
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_FONT_NAME]);
diff --git a/clutter/x11/clutter-device-manager-xi2.c b/clutter/x11/clutter-device-manager-xi2.c
index 6a06cec..49ee212 100644
--- a/clutter/x11/clutter-device-manager-xi2.c
+++ b/clutter/x11/clutter-device-manager-xi2.c
@@ -408,10 +408,16 @@ translate_hierarchy_event (ClutterBackendX11 *backend_x11,
CLUTTER_NOTE (EVENT, "Hierarchy event: device enabled");
+ clutter_x11_trap_x_errors ();
info = XIQueryDevice (backend_x11->xdpy,
ev->info[i].deviceid,
&n_devices);
- add_device (manager_xi2, backend_x11, &info[0], FALSE);
+ clutter_x11_untrap_x_errors ();
+ if (info != NULL)
+ {
+ add_device (manager_xi2, backend_x11, &info[0], FALSE);
+ XIFreeDeviceInfo (info);
+ }
}
else if (ev->info[i].flags & XIDeviceDisabled)
{
@@ -448,16 +454,24 @@ translate_hierarchy_event (ClutterBackendX11 *backend_x11,
/* and attach the slave to the new master if needed */
if (ev->info[i].flags & XISlaveAttached)
{
+ clutter_x11_trap_x_errors ();
info = XIQueryDevice (backend_x11->xdpy,
ev->info[i].deviceid,
&n_devices);
- master = g_hash_table_lookup (manager_xi2->devices_by_id,
- GINT_TO_POINTER (info->attachment));
- _clutter_input_device_set_associated_device (slave, master);
- _clutter_input_device_add_slave (master, slave);
-
- send_changed = TRUE;
- XIFreeDeviceInfo (info);
+ clutter_x11_untrap_x_errors ();
+ if (info != NULL)
+ {
+ master = g_hash_table_lookup (manager_xi2->devices_by_id,
+ GINT_TO_POINTER (info->attachment));
+ if (master != NULL)
+ {
+ _clutter_input_device_set_associated_device (slave, master);
+ _clutter_input_device_add_slave (master, slave);
+
+ send_changed = TRUE;
+ }
+ XIFreeDeviceInfo (info);
+ }
}
if (send_changed)
diff --git a/configure.ac b/configure.ac
index ada525f..355c95b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,7 +10,7 @@
# - increase clutter_interface_version to the next odd number
m4_define([clutter_major_version], [1])
m4_define([clutter_minor_version], [14])
-m4_define([clutter_micro_version], [4])
+m4_define([clutter_micro_version], [5])
# • for stable releases: increase the interface age by 1 for each release;
# if the API changes, set to 0. interface_age and binary_age are used to
@@ -31,7 +31,7 @@ m4_define([clutter_micro_version], [4])
# ...
#
# • for development releases: keep clutter_interface_age to 0
-m4_define([clutter_interface_age], [0])
+m4_define([clutter_interface_age], [1])
m4_define([clutter_binary_age], [m4_eval(100 * clutter_minor_version + clutter_micro_version)])
@@ -310,6 +310,7 @@ AS_IF([test "x$enable_wayland" = "xyes"],
experimental_backend="yes"
SUPPORT_WAYLAND=1
+ SUPPORT_COGL=1
PKG_CHECK_EXISTS([wayland-client wayland-cursor xkbcommon gdk-pixbuf-2.0],
[
@@ -337,7 +338,10 @@ AS_IF([test "x$enable_wayland_compositor" = "xyes"],
[
PKG_CHECK_EXISTS([wayland-server],
[BACKEND_PC_FILES="$BACKEND_PC_FILES wayland-server"], [])
+
SUPPORT_WAYLAND_COMPOSITOR=1
+ SUPPORT_COGL=1
+
CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
#define CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT 1"
AC_DEFINE([HAVE_CLUTTER_WAYLAND_COMPOSITOR], [1], [Have Wayland compositor support])
@@ -359,8 +363,8 @@ AS_IF([test "x$enable_cex100" = "xyes"],
experimental_backend="yes"
- SUPPORT_COGL=1
SUPPORT_CEX100=1
+ SUPPORT_COGL=1
have_gdl=no
AC_CHECK_HEADERS([libgdl.h], [have_gdl=yes])
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index 210cbe0..021bb2e 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -54,7 +54,9 @@ units_sources += \
actor-invariants.c \
actor-iter.c \
actor-layout.c \
+ actor-meta.c \
actor-offscreen-redirect.c \
+ actor-offscreen-limit-max-size.c\
actor-paint-opacity.c \
actor-pick.c \
actor-shader-effect.c \
diff --git a/tests/conform/actor-graph.c b/tests/conform/actor-graph.c
index 7e4dcd2..81b31f4 100644
--- a/tests/conform/actor-graph.c
+++ b/tests/conform/actor-graph.c
@@ -9,6 +9,7 @@ actor_add_child (TestConformSimpleFixture *fixture,
ClutterActor *iter;
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
"name", "foo",
@@ -45,7 +46,7 @@ actor_add_child (TestConformSimpleFixture *fixture,
g_assert (clutter_actor_get_previous_sibling (iter) == NULL);
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
void
@@ -56,6 +57,7 @@ actor_insert_child (TestConformSimpleFixture *fixture,
ClutterActor *iter;
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_insert_child_at_index (actor,
g_object_new (CLUTTER_TYPE_ACTOR,
@@ -132,7 +134,7 @@ actor_insert_child (TestConformSimpleFixture *fixture,
g_assert (clutter_actor_get_last_child (actor) == iter);
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
void
@@ -143,6 +145,7 @@ actor_remove_child (TestConformSimpleFixture *fixture,
ClutterActor *iter;
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
"name", "foo",
@@ -176,7 +179,7 @@ actor_remove_child (TestConformSimpleFixture *fixture,
g_assert (clutter_actor_get_last_child (actor) == NULL);
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
void
@@ -188,6 +191,7 @@ actor_raise_child (TestConformSimpleFixture *fixture,
gboolean show_on_set_parent;
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
"name", "foo",
@@ -225,6 +229,7 @@ actor_raise_child (TestConformSimpleFixture *fixture,
iter = clutter_actor_get_child_at_index (actor, 0);
clutter_actor_set_child_above_sibling (actor, iter, NULL);
+ g_object_add_weak_pointer (G_OBJECT (iter), (gpointer *) &iter);
g_assert_cmpstr (clutter_actor_get_name (clutter_actor_get_child_at_index (actor, 0)),
==,
@@ -240,7 +245,8 @@ actor_raise_child (TestConformSimpleFixture *fixture,
g_assert (!show_on_set_parent);
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
+ g_assert (iter == NULL);
}
void
@@ -252,6 +258,7 @@ actor_lower_child (TestConformSimpleFixture *fixture,
gboolean show_on_set_parent;
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
"name", "foo",
@@ -304,7 +311,7 @@ actor_lower_child (TestConformSimpleFixture *fixture,
g_assert (!show_on_set_parent);
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
void
@@ -315,6 +322,7 @@ actor_replace_child (TestConformSimpleFixture *fixture,
ClutterActor *iter;
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
"name", "foo",
@@ -364,7 +372,7 @@ actor_replace_child (TestConformSimpleFixture *fixture,
g_assert_cmpstr (clutter_actor_get_name (iter), ==, "baz");
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
void
@@ -374,6 +382,7 @@ actor_remove_all (TestConformSimpleFixture *fixture,
ClutterActor *actor = clutter_actor_new ();
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
"name", "foo",
@@ -392,7 +401,7 @@ actor_remove_all (TestConformSimpleFixture *fixture,
g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 0);
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
static void
@@ -435,6 +444,7 @@ actor_container_signals (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
int add_count, remove_count;
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
add_count = remove_count = 0;
g_signal_connect (actor,
@@ -466,5 +476,5 @@ actor_container_signals (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
&remove_count);
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
diff --git a/tests/conform/actor-invariants.c b/tests/conform/actor-invariants.c
index a9e21ee..eb62239 100644
--- a/tests/conform/actor-invariants.c
+++ b/tests/conform/actor-invariants.c
@@ -11,8 +11,9 @@ actor_initial_state (TestConformSimpleFixture *fixture,
{
ClutterActor *actor;
- actor = clutter_rectangle_new ();
+ actor = clutter_actor_new ();
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
if (g_test_verbose ())
g_print ("initial state - visible: %s, realized: %s, mapped: %s\n",
@@ -25,7 +26,7 @@ actor_initial_state (TestConformSimpleFixture *fixture,
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (actor)));
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
void
@@ -36,6 +37,7 @@ actor_shown_not_parented (TestConformSimpleFixture *fixture,
actor = clutter_rectangle_new ();
g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
clutter_actor_show (actor);
@@ -50,7 +52,7 @@ actor_shown_not_parented (TestConformSimpleFixture *fixture,
g_assert (CLUTTER_ACTOR_IS_VISIBLE (actor));
clutter_actor_destroy (actor);
- g_object_unref (actor);
+ g_assert (actor == NULL);
}
void
@@ -335,20 +337,20 @@ clone_no_map (TestConformSimpleFixture *fixture,
stage = clutter_stage_new ();
clutter_actor_show (stage);
- group = clutter_group_new ();
- actor = clutter_rectangle_new ();
+ group = clutter_actor_new ();
+ actor = clutter_actor_new ();
clutter_actor_hide (group);
- clutter_container_add_actor (CLUTTER_CONTAINER (group), actor);
- clutter_container_add_actor (CLUTTER_CONTAINER (stage), group);
+ clutter_actor_add_child (group, actor);
+ clutter_actor_add_child (stage, group);
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (group)));
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (actor)));
clone = clutter_clone_new (group);
- clutter_container_add_actor (CLUTTER_CONTAINER (stage), clone);
+ clutter_actor_add_child (stage, clone);
g_assert (CLUTTER_ACTOR_IS_MAPPED (clone));
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (group)));
diff --git a/tests/conform/actor-meta.c b/tests/conform/actor-meta.c
new file mode 100644
index 0000000..5cae53a
--- /dev/null
+++ b/tests/conform/actor-meta.c
@@ -0,0 +1,41 @@
+#include <stdlib.h>
+#include <string.h>
+
+#include <clutter/clutter.h>
+
+#include "test-conform-common.h"
+
+void
+actor_meta_clear (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
+ gconstpointer data G_GNUC_UNUSED)
+{
+ ClutterActor *actor, *stage;
+
+ stage = clutter_stage_new ();
+
+ actor = clutter_actor_new ();
+ g_object_ref_sink (actor);
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
+
+ clutter_actor_add_action (actor, clutter_click_action_new ());
+ clutter_actor_add_constraint (actor, clutter_bind_constraint_new (stage, CLUTTER_BIND_ALL, 0));
+ clutter_actor_add_effect (actor, clutter_blur_effect_new ());
+
+ g_assert (clutter_actor_has_actions (actor));
+ g_assert (clutter_actor_has_constraints (actor));
+ g_assert (clutter_actor_has_effects (actor));
+
+ clutter_actor_clear_actions (actor);
+ g_assert (!clutter_actor_has_actions (actor));
+
+ clutter_actor_clear_constraints (actor);
+ g_assert (!clutter_actor_has_constraints (actor));
+
+ clutter_actor_clear_effects (actor);
+ g_assert (!clutter_actor_has_effects (actor));
+
+ clutter_actor_destroy (actor);
+ g_assert (actor == NULL);
+
+ clutter_actor_destroy (stage);
+}
diff --git a/tests/conform/actor-offscreen-limit-max-size.c b/tests/conform/actor-offscreen-limit-max-size.c
new file mode 100644
index 0000000..9729866
--- /dev/null
+++ b/tests/conform/actor-offscreen-limit-max-size.c
@@ -0,0 +1,117 @@
+#include <clutter/clutter.h>
+
+#include "test-conform-common.h"
+
+#define STAGE_WIDTH (300)
+#define STAGE_HEIGHT (300)
+
+typedef struct
+{
+ ClutterActor *stage;
+
+ ClutterActor *actor_group1;
+ ClutterEffect *blur_effect1;
+
+ ClutterActor *actor_group2;
+ ClutterEffect *blur_effect2;
+} Data;
+
+static void
+check_results (ClutterStage *stage, gpointer user_data)
+{
+ Data *data = user_data;
+ gfloat width, height;
+
+ clutter_offscreen_effect_get_target_size (CLUTTER_OFFSCREEN_EFFECT (data->blur_effect1),
+ &width, &height);
+
+ if (g_test_verbose ())
+ g_print ("Checking effect1 size: %.2f x %.2f\n", width, height);
+
+ g_assert_cmpint (width, <, STAGE_WIDTH);
+ g_assert_cmpint (height, <, STAGE_HEIGHT);
+
+ clutter_offscreen_effect_get_target_size (CLUTTER_OFFSCREEN_EFFECT (data->blur_effect2),
+ &width, &height);
+
+ if (g_test_verbose ())
+ g_print ("Checking effect2 size: %.2f x %.2f\n", width, height);
+
+ g_assert_cmpint (width, ==, STAGE_WIDTH);
+ g_assert_cmpint (height, ==, STAGE_HEIGHT);
+
+
+ clutter_main_quit ();
+}
+
+static ClutterActor *
+create_actor (gfloat x, gfloat y,
+ gfloat width, gfloat height,
+ const ClutterColor *color)
+{
+ return g_object_new (CLUTTER_TYPE_ACTOR,
+ "x", x,
+ "y", y,
+ "width", width,
+ "height", height,
+ "background-color", color,
+ NULL);
+}
+
+void
+actor_offscreen_limit_max_size (TestConformSimpleFixture *fixture,
+ gconstpointer test_data)
+{
+ if (cogl_features_available (COGL_FEATURE_OFFSCREEN))
+ {
+ Data data;
+
+ data.stage = clutter_stage_new ();
+ clutter_stage_set_paint_callback (CLUTTER_STAGE (data.stage),
+ check_results,
+ &data,
+ NULL);
+ clutter_actor_set_size (data.stage, STAGE_WIDTH, STAGE_HEIGHT);
+
+ data.actor_group1 = clutter_actor_new ();
+ clutter_actor_add_child (data.stage, data.actor_group1);
+ data.blur_effect1 = clutter_blur_effect_new ();
+ clutter_actor_add_effect (data.actor_group1, data.blur_effect1);
+ clutter_actor_add_child (data.actor_group1,
+ create_actor (10, 10,
+ 100, 100,
+ CLUTTER_COLOR_Blue));
+ clutter_actor_add_child (data.actor_group1,
+ create_actor (100, 100,
+ 100, 100,
+ CLUTTER_COLOR_Gray));
+
+ data.actor_group2 = clutter_actor_new ();
+ clutter_actor_add_child (data.stage, data.actor_group2);
+ data.blur_effect2 = clutter_blur_effect_new ();
+ clutter_actor_add_effect (data.actor_group2, data.blur_effect2);
+ clutter_actor_add_child (data.actor_group2,
+ create_actor (-10, -10,
+ 100, 100,
+ CLUTTER_COLOR_Yellow));
+ clutter_actor_add_child (data.actor_group2,
+ create_actor (250, 10,
+ 100, 100,
+ CLUTTER_COLOR_ScarletRed));
+ clutter_actor_add_child (data.actor_group2,
+ create_actor (10, 250,
+ 100, 100,
+ CLUTTER_COLOR_Yellow));
+
+ clutter_actor_show (data.stage);
+
+ clutter_main ();
+
+ clutter_actor_destroy (data.stage);
+
+ if (g_test_verbose ())
+ g_print ("OK\n");
+ }
+ else if (g_test_verbose ())
+ g_print ("Skipping\n");
+}
diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
index b623038..f5b2aad 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -145,6 +145,7 @@ main (int argc, char **argv)
TEST_CONFORM_SIMPLE ("/actor", actor_basic_layout);
TEST_CONFORM_SIMPLE ("/actor", actor_margin_layout);
TEST_CONFORM_SIMPLE ("/actor", actor_offscreen_redirect);
+ TEST_CONFORM_SIMPLE ("/actor", actor_offscreen_limit_max_size);
TEST_CONFORM_SIMPLE ("/actor", actor_shader_effect);
TEST_CONFORM_SIMPLE ("/actor/iter", actor_iter_traverse_children);
@@ -164,6 +165,8 @@ main (int argc, char **argv)
TEST_CONFORM_SIMPLE ("/actor/invariants", default_stage);
TEST_CONFORM_SIMPLE ("/actor/invariants", actor_pivot_transformation);
+ TEST_CONFORM_SIMPLE ("/actor/meta", actor_meta_clear);
+
TEST_CONFORM_SIMPLE ("/actor/opacity", opacity_label);
TEST_CONFORM_SIMPLE ("/actor/opacity", opacity_rectangle);
TEST_CONFORM_SIMPLE ("/actor/opacity", opacity_paint);