Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37710110
en ru br
ALT Linux repos
S:1.26.4-alt2

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


 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);
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin