diff --git a/Cargo.toml b/Cargo.toml
index b526419..8a2490b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -23,44 +23,41 @@ features = ["dox"]
 
 [features]
 pure = []
-dox = ["ffi/dox", "glib/dox", "glib-sys/dox", "gobject-sys/dox", "ux-dx/dox"]
+dox = ["ux-dx/dox"]
+
+# "ffi/dox", "glib/dox", "glib-sys/dox", "gobject-sys/dox",
 
 [dependencies]
-ux-primitives = "0.1"
+ux-primitives = "0.2"
 log = "0.4"
 lazy_static = "1.4"
 serde = "1.0"
 serde_json = "1.0"
 bytes = "1.0"
-float-cmp = { version = "0.5", default-features = false }
+float-cmp = "0.9"
 ruex = "0.1"
-tiny-skia = "0.5"
+tiny-skia = "0.6"
 rand = "0.8"
-x11 = "2.18.2"
+# x11 = "2.18.2"
 once_cell = "1.7.2"
 fontdue = "0.5.0"
 
+#canvas
+
 [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
-ux-dx = { version = "0.1" }
+ux-dx = { version = "0.2" }
 libc = "0.2"
 bitflags = "1.0"
-glib-sys = "0.10"
-gio-sys = "0.10"
-gobject-sys = "0.10"
-cairo-sys-rs = "0.10"
-png = "0.16"
-cairo-rs = { version = "0.9", features = ["png"] }
-gio = { version = "0.9", features = ["v2_58"] }
-glib = { version="0.10", features = ["v2_58"] }
-pango = { version = "0.9", features = ["v1_42"] }
-ffi = { package = "clutter-sys-rs", version="0.1" }
+png = "0.17"
+# cairo-rs = { version = "0.9", features = ["png"] }
+# pango = { version = "0.9", features = ["v1_42"] }
 
 [target.'cfg(target_arch = "wasm32")'.dependencies]
 wasm-bindgen = "0.2"
 js-sys = "0.3"
 wasm-bindgen-futures = "0.4"
 wasm-logger = "0.2"
-gloo = "0.2"
+gloo = "0.3"
 wasm-bindgen-test = "0.3"
 
 [target.'cfg(target_arch = "wasm32")'.dependencies.web-sys]
diff --git a/README.md b/README.md
index 58b56ab..20fa4a4 100644
--- a/README.md
+++ b/README.md
@@ -36,8 +36,6 @@
 
 ![Angular Rust structure](https://dudochkin-victor.github.io/assets/angular-rust/structure.svg)
 
-![Angular Rust structure](https://dudochkin-victor.github.io/assets/angular-rust/structure.svg)
-
 ## Features
 
 - [x] Implementation of graphic backend for cairo and web canvas from [UX Primitives](https://github.com/angular-rust/ux-primitives)
diff --git a/src/canvas/cairoimpl.rs b/src/canvas/cairoimpl.rs
index 15c5f91..42d94cc 100644
--- a/src/canvas/cairoimpl.rs
+++ b/src/canvas/cairoimpl.rs
@@ -1,16 +1,15 @@
 #![allow(clippy::many_single_char_names)]
-#![allow(unused_imports)]
 #![allow(unused_variables)]
 #![allow(dead_code)]
 #![cfg(not(target_arch = "wasm32"))]
 
 use crate::{
-    BaseLine, CanvasContext, Color, Direction, Gradient, GradientType, LineCap, LineJoin,
-    LinearGradient, PatternExtend, Point, RadialGradient, Rect, RgbaColor, Size, TextAlign,
-    TextMetrics, TextStyle, TextWeight,
+    BaseLine, CanvasContext, Color, Direction, FontStyle, FontWeight, Gradient, GradientType,
+    LineCap, LineJoin, LinearGradient, PatternExtend, RadialGradient, RgbaColor, TextAlign,
+    TextMetrics,
 };
-use cairo::{self, FontFace, FontSlant, FontWeight, ImageSurface, Surface, SurfacePattern};
-use std::{any::Any, cell::RefCell};
+// Point, Rect, Size
+use std::cell::RefCell;
 
 #[derive(Debug, Clone)]
 pub struct Pattern {
@@ -23,7 +22,7 @@ impl Pattern {
     pub fn new(extend: PatternExtend, surface: &cairo::Surface) -> Self {
         Self {
             extend,
-            inner: SurfacePattern::create(surface),
+            inner: cairo::SurfacePattern::create(surface),
         }
     }
 }
@@ -197,16 +196,16 @@ impl<'a> CanvasContext for Canvas<'a> {
         unimplemented!()
     }
 
-    fn set_font(&self, family: &str, style: TextStyle, weight: TextWeight, size: f64) {
+    fn set_font(&self, family: &str, style: FontStyle, weight: FontWeight, size: f64) {
         let slant = match style {
-            TextStyle::Italic => FontSlant::Italic,
-            TextStyle::Normal => FontSlant::Normal,
-            TextStyle::Oblique => FontSlant::Oblique,
+            FontStyle::Italic => cairo::FontSlant::Italic,
+            FontStyle::Normal => cairo::FontSlant::Normal,
+            FontStyle::Oblique => cairo::FontSlant::Oblique,
         };
 
         let weight = match weight {
-            TextWeight::Bold => FontWeight::Bold,
-            _ => FontWeight::Normal,
+            FontWeight::Bold => cairo::FontWeight::Bold,
+            _ => cairo::FontWeight::Normal,
         };
 
         self.ctx.select_font_face(family, slant, weight);
diff --git a/src/canvas/mod.rs b/src/canvas/mod.rs
index 57ae433..2bf50c1 100644
--- a/src/canvas/mod.rs
+++ b/src/canvas/mod.rs
@@ -1,5 +1,5 @@
 #![allow(clippy::too_many_arguments)]
-use primitives::CanvasContext;
+use primitives::prelude::CanvasContext;
 use std::f64::consts::PI;
 
 #[cfg(target_arch = "wasm32")]
@@ -7,16 +7,16 @@ mod webimpl;
 #[cfg(target_arch = "wasm32")]
 pub use webimpl::*;
 
-#[cfg(not(target_arch = "wasm32"))]
-mod cairoimpl;
-#[cfg(not(target_arch = "wasm32"))]
-pub use cairoimpl::*;
+// #[cfg(not(target_arch = "wasm32"))]
+// mod cairoimpl;
+// #[cfg(not(target_arch = "wasm32"))]
+// pub use cairoimpl::*;
 
-mod rough;
-pub use rough::*;
+// mod rough;
+// pub use rough::*;
 
 pub trait AdvancedShapesExt {
-    // /**
+    //*
     //  * Create a rectangle
     //  * Optional with rounded corners if radius is set
     //  * @param x position on the x axis in pixel
@@ -27,7 +27,7 @@ pub trait AdvancedShapesExt {
     //  * @return rectangle item instance
     //  */
     fn round_rect(&self, x: f64, y: f64, width: f64, height: f64, radius: f64);
-    // /**
+    //*
     //  * Create a symmetric polygon
     //  * @param x Position on x-axis in pixel
     //  * @param y Position on y-axis in pixel
@@ -36,7 +36,7 @@ pub trait AdvancedShapesExt {
     //  * @return polygon item instance
     //  */
     fn polygon(&self, x: f64, y: f64, radius: f64, n: usize);
-    // /**
+    //*
     //  * Create a path
     //  * @param x start of the path at position x in pixel
     //  * @param y start of the path at position y in pixel
diff --git a/src/canvas/rough/canvas.rs b/src/canvas/rough/canvas.rs
index e7cc1fc..526efbf 100644
--- a/src/canvas/rough/canvas.rs
+++ b/src/canvas/rough/canvas.rs
@@ -4,7 +4,7 @@ use std::cell::RefCell;
 use super::{Drawable, OpSet, OpSetType, OpType, RoughConfig, RoughGenerator, RoughOptions};
 use crate::{
     BaseLine, CanvasContext, Color, Direction, Gradient, LineCap, LineJoin, Pattern, Point,
-    TextAlign, TextMetrics, TextStyle, TextWeight,
+    TextAlign, TextMetrics, FontStyle, FontWeight,
 };
 
 // GradientType, LinearGradient, PatternExtend, RadialGradient, RgbaColor,
@@ -202,7 +202,7 @@ where
         self.ctx.get_font()
     }
 
-    fn set_font(&self, family: &str, style: TextStyle, weight: TextWeight, size: f64) {
+    fn set_font(&self, family: &str, style: FontStyle, weight: FontWeight, size: f64) {
         self.ctx.set_font(family, style, weight, size);
     }
 
diff --git a/src/legacy/action.rs b/src/legacy/action.rs
deleted file mode 100644
index dec1004..0000000
--- a/src/legacy/action.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-use crate::ActorMeta;
-use glib::{object as gobject, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct Action(Object<ffi::ClutterAction, ffi::ClutterActionClass, ActionClass>) @extends ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_action_get_type(),
-    }
-}
-
-impl Action {}
-
-impl fmt::Display for Action {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Action")
-    }
-}
diff --git a/src/legacy/actor.rs b/src/legacy/actor.rs
deleted file mode 100644
index 4edfc7a..0000000
--- a/src/legacy/actor.rs
+++ /dev/null
@@ -1,7974 +0,0 @@
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    value::SetValueOptional,
-    GString, StaticType, Value,
-};
-
-// crate Scriptable
-use crate::{
-    Action, ActorAlign, ActorBox, ActorFlags, AllocationFlags, Animatable, AnimationMode,
-    ButtonEvent, Color, Constraint, Container, Content, ContentGravity, ContentRepeat,
-    CrossingEvent, Effect, Event, InternalColor, InternalRect, KeyEvent, LayoutManager, Margin,
-    Matrix, MotionEvent, OffscreenRedirect, Orientation, PaintVolume, RequestMode, RgbaColor,
-    RotateAxis, ScalingFilter, ScrollEvent, Stage, TextDirection, Transition, Vertex,
-};
-use std::boxed::Box as Box_;
-use std::mem::transmute;
-use std::{fmt, mem};
-
-glib_wrapper! {
-    pub struct Actor(Object<ffi::ClutterActor, ffi::ClutterActorClass, ActorClass>) @extends gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_actor_get_type(),
-    }
-}
-
-impl Actor {
-    /// Creates a new `Actor`.
-    ///
-    /// A newly created actor has a floating reference, which will be sunk
-    /// when it is added to another actor.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Actor`
-    pub fn new() -> Actor {
-        unsafe { from_glib_none(ffi::clutter_actor_new()) }
-    }
-}
-
-impl Default for Actor {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `Actor` methods.
-///
-/// # Implementors
-///
-/// [`Actor`](struct.Actor.html), [`Box`](struct.Box.html), [`Clone`](struct.Clone.html), [`Group`](struct.Group.html), [`Rectangle`](struct.Rectangle.html), [`ScrollActor`](struct.ScrollActor.html), [`Text`](struct.Text.html), [`Texture`](struct.Texture.html)
-pub trait ActorExt: 'static {
-    /// Adds `action` to the list of actions applied to `self`
-    ///
-    /// A `Action` can only belong to one actor at a time
-    ///
-    /// The `Actor` will hold a reference on `action` until either
-    /// `ActorExt::remove_action` or `ActorExt::clear_actions`
-    /// is called
-    /// ## `action`
-    /// a `Action`
-    fn add_action<P: IsA<Action>>(&self, action: &P);
-
-    /// A convenience function for setting the name of a `Action`
-    /// while adding it to the list of actions applied to `self`
-    ///
-    /// This function is the logical equivalent of:
-    ///
-    ///
-    /// ```C
-    ///   actor_meta_set_name (ACTOR_META (action), name);
-    ///   actor_add_action (self, action);
-    /// ```
-    /// ## `name`
-    /// the name to set on the action
-    /// ## `action`
-    /// a `Action`
-    fn add_action_with_name<P: IsA<Action>>(&self, name: &str, action: &P);
-
-    /// Adds `child` to the children of `self`.
-    ///
-    /// This function will acquire a reference on `child` that will only
-    /// be released when calling `ActorExt::remove_child`.
-    ///
-    /// This function will take into consideration the `Actor:depth`
-    /// of `child`, and will keep the list of children sorted.
-    ///
-    /// This function will emit the `Container::actor-added` signal
-    /// on `self`.
-    /// ## `child`
-    /// a `Actor`
-    fn add_child<P: IsA<Actor>>(&self, child: &P);
-
-    /// Adds `constraint` to the list of `Constraint`<!-- -->s applied
-    /// to `self`
-    ///
-    /// The `Actor` will hold a reference on the `constraint` until
-    /// either `ActorExt::remove_constraint` or
-    /// `ActorExt::clear_constraints` is called.
-    /// ## `constraint`
-    /// a `Constraint`
-    fn add_constraint<P: IsA<Constraint>>(&self, constraint: &P);
-
-    /// A convenience function for setting the name of a `Constraint`
-    /// while adding it to the list of constraints applied to `self`
-    ///
-    /// This function is the logical equivalent of:
-    ///
-    ///
-    /// ```C
-    ///   actor_meta_set_name (ACTOR_META (constraint), name);
-    ///   actor_add_constraint (self, constraint);
-    /// ```
-    /// ## `name`
-    /// the name to set on the constraint
-    /// ## `constraint`
-    /// a `Constraint`
-    fn add_constraint_with_name<P: IsA<Constraint>>(&self, name: &str, constraint: &P);
-
-    /// Adds `effect` to the list of `Effect`<!-- -->s applied to `self`
-    ///
-    /// The `Actor` will hold a reference on the `effect` until either
-    /// `ActorExt::remove_effect` or `ActorExt::clear_effects` is
-    /// called.
-    ///
-    /// Note that as `Effect` is initially unowned,
-    /// `ActorExt::add_effect` will sink any floating reference on `effect`.
-    /// ## `effect`
-    /// a `Effect`
-    fn add_effect<P: IsA<Effect>>(&self, effect: &P);
-
-    /// A convenience function for setting the name of a `Effect`
-    /// while adding it to the list of effects applied to `self`.
-    ///
-    /// Note that as `Effect` is initially unowned,
-    /// `ActorExt::add_effect_with_name` will sink any floating
-    /// reference on `effect`.
-    ///
-    /// This function is the logical equivalent of:
-    ///
-    ///
-    /// ```C
-    ///   actor_meta_set_name (ACTOR_META (effect), name);
-    ///   actor_add_effect (self, effect);
-    /// ```
-    /// ## `name`
-    /// the name to set on the effect
-    /// ## `effect`
-    /// a `Effect`
-    fn add_effect_with_name<P: IsA<Effect>>(&self, name: &str, effect: &P);
-
-    /// Adds a `transition` to the `Actor`'s list of animations.
-    ///
-    /// The `name` string is a per-actor unique identifier of the `transition`: only
-    /// one `Transition` can be associated to the specified `name`.
-    ///
-    /// The `transition` will be started once added.
-    ///
-    /// This function will take a reference on the `transition`.
-    ///
-    /// This function is usually called implicitly when modifying an animatable
-    /// property.
-    /// ## `name`
-    /// the name of the transition to add
-    /// ## `transition`
-    /// the `Transition` to add
-    fn add_transition<P: IsA<Transition>>(&self, name: &str, transition: &P);
-
-    /// Assigns the size of a `Actor` from the given `box_`.
-    ///
-    /// This function should only be called on the children of an actor when
-    /// overriding the `ActorClass.allocate`() virtual function.
-    ///
-    /// This function will adjust the stored allocation to take into account
-    /// the alignment flags set in the `Actor:x-align` and
-    /// `Actor:y-align` properties, as well as the margin values set in
-    /// the `Actor:margin-top`, `Actor:margin-right`,
-    /// `Actor:margin-bottom`, and `Actor:margin-left` properties.
-    ///
-    /// This function will respect the easing state of the `Actor` and
-    /// interpolate between the current allocation and the new one if the
-    /// easing state duration is a positive value.
-    ///
-    /// Actors can know from their allocation box whether they have moved
-    /// with respect to their parent actor. The `flags` parameter describes
-    /// additional information about the allocation, for instance whether
-    /// the parent has moved with respect to the stage, for example because
-    /// a grandparent's origin has moved.
-    /// ## `box_`
-    /// new allocation of the actor, in parent-relative coordinates
-    /// ## `flags`
-    /// flags that control the allocation
-    fn allocate(&self, box_: &ActorBox, flags: AllocationFlags);
-
-    /// Allocates `self` by taking into consideration the available allocation
-    /// area; an alignment factor on either axis; and whether the actor should
-    /// fill the allocation on either axis.
-    ///
-    /// The `box_` should contain the available allocation width and height;
-    /// if the x1 and y1 members of `ActorBox` are not set to 0, the
-    /// allocation will be offset by their value.
-    ///
-    /// This function takes into consideration the geometry request specified by
-    /// the `Actor:request-mode` property, and the text direction.
-    ///
-    /// This function is useful for fluid layout managers using legacy alignment
-    /// flags. Newly written layout managers should use the `Actor:x-align`
-    /// and `Actor:y-align` properties, instead, and just call
-    /// `ActorExt::allocate` inside their `ActorClass.allocate`()
-    /// implementation.
-    /// ## `box_`
-    /// a `ActorBox`, containing the available width and height
-    /// ## `x_align`
-    /// the horizontal alignment, between 0 and 1
-    /// ## `y_align`
-    /// the vertical alignment, between 0 and 1
-    /// ## `x_fill`
-    /// whether the actor should fill horizontally
-    /// ## `y_fill`
-    /// whether the actor should fill vertically
-    /// ## `flags`
-    /// allocation flags to be passed to `ActorExt::allocate`
-    fn allocate_align_fill(
-        &self,
-        box_: &ActorBox,
-        x_align: f64,
-        y_align: f64,
-        x_fill: bool,
-        y_fill: bool,
-        flags: AllocationFlags,
-    );
-
-    /// Allocates `self` taking into account the `Actor`'s
-    /// preferred size, but limiting it to the maximum available width
-    /// and height provided.
-    ///
-    /// This function will do the right thing when dealing with the
-    /// actor's request mode.
-    ///
-    /// The implementation of this function is equivalent to:
-    ///
-    ///
-    /// ```C
-    ///   if (request_mode == REQUEST_HEIGHT_FOR_WIDTH)
-    ///     {
-    ///       actor_get_preferred_width (self, available_height,
-    ///                                          &min_width,
-    ///                                          &natural_width);
-    ///       width = CLAMP (natural_width, min_width, available_width);
-    ///
-    ///       actor_get_preferred_height (self, width,
-    ///                                           &min_height,
-    ///                                           &natural_height);
-    ///       height = CLAMP (natural_height, min_height, available_height);
-    ///     }
-    ///   else if (request_mode == REQUEST_WIDTH_FOR_HEIGHT)
-    ///     {
-    ///       actor_get_preferred_height (self, available_width,
-    ///                                           &min_height,
-    ///                                           &natural_height);
-    ///       height = CLAMP (natural_height, min_height, available_height);
-    ///
-    ///       actor_get_preferred_width (self, height,
-    ///                                          &min_width,
-    ///                                          &natural_width);
-    ///       width = CLAMP (natural_width, min_width, available_width);
-    ///     }
-    ///   else if (request_mode == REQUEST_CONTENT_SIZE)
-    ///     {
-    ///       content_get_preferred_size (content, &natural_width, &natural_height);
-    ///
-    ///       width = CLAMP (natural_width, 0, available_width);
-    ///       height = CLAMP (natural_height, 0, available_height);
-    ///     }
-    ///
-    ///   box.x1 = x; box.y1 = y;
-    ///   box.x2 = box.x1 + available_width;
-    ///   box.y2 = box.y1 + available_height;
-    ///   actor_allocate (self, &box, flags);
-    /// ```
-    ///
-    /// This function can be used by fluid layout managers to allocate
-    /// an actor's preferred size without making it bigger than the area
-    /// available for the container.
-    /// ## `x`
-    /// the actor's X coordinate
-    /// ## `y`
-    /// the actor's Y coordinate
-    /// ## `available_width`
-    /// the maximum available width, or -1 to use the
-    ///  actor's natural width
-    /// ## `available_height`
-    /// the maximum available height, or -1 to use the
-    ///  actor's natural height
-    /// ## `flags`
-    /// flags controlling the allocation
-    fn allocate_available_size(
-        &self,
-        x: f32,
-        y: f32,
-        available_width: f32,
-        available_height: f32,
-        flags: AllocationFlags,
-    );
-
-    /// Allocates the natural size of `self`.
-    ///
-    /// This function is a utility call for `Actor` implementations
-    /// that allocates the actor's preferred natural size. It can be used
-    /// by fixed layout managers (like `Group` or so called
-    /// 'composite actors') inside the Actor::allocate
-    /// implementation to give each child exactly how much space it
-    /// requires, regardless of the size of the parent.
-    ///
-    /// This function is not meant to be used by applications. It is also
-    /// not meant to be used outside the implementation of the
-    /// `ActorClass.allocate` virtual function.
-    /// ## `flags`
-    /// flags controlling the allocation
-    fn allocate_preferred_size(&self, flags: AllocationFlags);
-
-    /// Transforms `point` in coordinates relative to the actor into
-    /// ancestor-relative coordinates using the relevant transform
-    /// stack (i.e. scale, rotation, etc).
-    ///
-    /// If `ancestor` is `None` the ancestor will be the `Stage`. In
-    /// this case, the coordinates returned will be the coordinates on
-    /// the stage before the projection is applied. This is different from
-    /// the behaviour of `ActorExt::apply_transform_to_point`.
-    /// ## `ancestor`
-    /// A `Actor` ancestor, or `None` to use the
-    ///  default `Stage`
-    /// ## `point`
-    /// A point as `Vertex`
-    /// ## `vertex`
-    /// The translated `Vertex`
-    fn apply_relative_transform_to_point<P: IsA<Actor>>(
-        &self,
-        ancestor: Option<&P>,
-        point: &Vertex,
-    ) -> Vertex;
-
-    /// Transforms `point` in coordinates relative to the actor
-    /// into screen-relative coordinates with the current actor
-    /// transformation (i.e. scale, rotation, etc)
-    /// ## `point`
-    /// A point as `Vertex`
-    /// ## `vertex`
-    /// The translated `Vertex`
-    fn apply_transform_to_point(&self, point: &Vertex) -> Vertex;
-
-    /// Binds a `gio::ListModel` to a `Actor`.
-    ///
-    /// If the `Actor` was already bound to a `gio::ListModel`, the previous
-    /// binding is destroyed.
-    ///
-    /// The existing children of `Actor` are destroyed when setting a
-    /// model, and new children are created and added, representing the contents
-    /// of the `model`. The `Actor` is updated whenever the `model` changes.
-    /// If `model` is `None`, the `Actor` is left empty.
-    ///
-    /// When a `Actor` is bound to a model, adding and removing children
-    /// directly is undefined behaviour.
-    /// ## `model`
-    /// a `gio::ListModel`
-    /// ## `create_child_func`
-    /// a function that creates `Actor` instances
-    ///  from the contents of the `model`
-    /// ## `user_data`
-    /// user data passed to `create_child_func`
-    /// ## `notify`
-    /// function called when unsetting the `model`
-    fn bind_model<P: IsA<gio::ListModel>, Q: Fn(&glib::Object) -> Actor + 'static>(
-        &self,
-        model: Option<&P>,
-        create_child_func: Q,
-    );
-
-    //fn bind_model_with_properties<P: IsA<gio::ListModel>>(&self, model: &P, child_type: glib::types::Type, first_model_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Clears the list of actions applied to `self`
-    fn clear_actions(&self);
-
-    /// Clears the list of constraints applied to `self`
-    fn clear_constraints(&self);
-
-    /// Clears the list of effects applied to `self`
-    fn clear_effects(&self);
-
-    /// Determines if `descendant` is contained inside `self` (either as an
-    /// immediate child, or as a deeper descendant). If `self` and
-    /// `descendant` point to the same actor then it will also return `true`.
-    /// ## `descendant`
-    /// A `Actor`, possibly contained in `self`
-    ///
-    /// # Returns
-    ///
-    /// whether `descendent` is contained within `self`
-    fn contains<P: IsA<Actor>>(&self, descendant: &P) -> bool;
-
-    /// Run the next stage of the paint sequence. This function should only
-    /// be called within the implementation of the ‘run’ virtual of a
-    /// `Effect`. It will cause the run method of the next effect to
-    /// be applied, or it will paint the actual actor if the current effect
-    /// is the last effect in the chain.
-    fn continue_paint(&self);
-
-    /// Creates a `pango::Context` for the given actor. The `pango::Context`
-    /// is already configured using the appropriate font map, resolution
-    /// and font options.
-    ///
-    /// See also `ActorExt::get_pango_context`.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `pango::Context`.
-    ///  Use `gobject::ObjectExt::unref` on the returned value to deallocate its
-    ///  resources
-    fn create_pango_context(&self) -> Option<pango::Context>;
-
-    /// Creates a new `pango::Layout` from the same `pango::Context` used
-    /// by the `Actor`. The `pango::Layout` is already configured
-    /// with the font map, resolution and font options, and the
-    /// given `text`.
-    ///
-    /// If you want to keep around a `pango::Layout` created by this
-    /// function you will have to connect to the `Backend::font-changed`
-    /// and `Backend::resolution-changed` signals, and call
-    /// `pango::Layout::context_changed` in response to them.
-    /// ## `text`
-    /// the text to set on the `pango::Layout`, or `None`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `pango::Layout`.
-    ///  Use `gobject::ObjectExt::unref` when done
-    fn create_pango_layout(&self, text: Option<&str>) -> Option<pango::Layout>;
-
-    /// Destroys an actor. When an actor is destroyed, it will break any
-    /// references it holds to other objects. If the actor is inside a
-    /// container, the actor will be removed.
-    ///
-    /// When you destroy a container, its children will be destroyed as well.
-    ///
-    /// Note: you cannot destroy the `Stage` returned by
-    /// `Stage::get_default`.
-    fn destroy(&self);
-
-    /// Destroys all children of `self`.
-    ///
-    /// This function releases the reference added by inserting a child
-    /// actor in the list of children of `self`, and ensures that the
-    /// `Actor::destroy` signal is emitted on each child of the
-    /// actor.
-    ///
-    /// By default, `Actor` will emit the `Actor::destroy` signal
-    /// when its reference count drops to 0; the default handler of the
-    /// `Actor::destroy` signal will destroy all the children of an
-    /// actor. This function ensures that all children are destroyed, instead
-    /// of just removed from `self`, unlike `ActorExt::remove_all_children`
-    /// which will merely release the reference and remove each child.
-    ///
-    /// Unless you acquired an additional reference on each child of `self`
-    /// prior to calling `ActorExt::remove_all_children` and want to reuse
-    /// the actors, you should use `ActorExt::destroy_all_children` in
-    /// order to make sure that children are destroyed and signal handlers
-    /// are disconnected even in cases where circular references prevent this
-    /// from automatically happening through reference counting alone.
-    fn destroy_all_children(&self);
-
-    /// This function is used to emit an event on the main stage.
-    /// You should rarely need to use this function, except for
-    /// synthetising events.
-    /// ## `event`
-    /// a `Event`
-    /// ## `capture`
-    /// `true` if event in in capture phase, `false` otherwise.
-    ///
-    /// # Returns
-    ///
-    /// the return value from the signal emission: `true`
-    ///  if the actor handled the event, or `false` if the event was
-    ///  not handled
-    fn event(&self, event: &Event, capture: bool) -> bool;
-
-    //fn get_abs_allocation_vertices(&self, verts: /*Unimplemented*/FixedArray TypeId { ns_id: 1, id: 16 }; 4);
-
-    /// Retrieves the `Action` with the given name in the list
-    /// of actions applied to `self`
-    /// ## `name`
-    /// the name of the action to retrieve
-    ///
-    /// # Returns
-    ///
-    /// a `Action` for the given
-    ///  name, or `None`. The returned `Action` is owned by the
-    ///  actor and it should not be unreferenced directly
-    fn get_action(&self, name: &str) -> Option<Action>;
-
-    /// Retrieves the list of actions applied to `self`
-    ///
-    /// # Returns
-    ///
-    /// a copy
-    ///  of the list of `Action`<!-- -->s. The contents of the list are
-    ///  owned by the `Actor`. Use `glib::List::free` to free the resources
-    ///  allocated by the returned `glib::List`
-    fn get_actions(&self) -> Vec<Action>;
-
-    /// Gets the layout box an actor has been assigned. The allocation can
-    /// only be assumed valid inside a `paint` method; anywhere else, it
-    /// may be out-of-date.
-    ///
-    /// An allocation does not incorporate the actor's scale or anchor point;
-    /// those transformations do not affect layout, only rendering.
-    ///
-    /// Do not call any of the actor_get_allocation_*() family
-    /// of functions inside the implementation of the `get_preferred_width`
-    /// or `get_preferred_height` virtual functions.
-    /// ## `box_`
-    /// the function fills this in with the actor's allocation
-    fn get_allocation_box(&self) -> ActorBox;
-
-    //fn get_allocation_vertices<P: IsA<Actor>>(&self, ancestor: Option<&P>, verts: /*Unimplemented*/FixedArray TypeId { ns_id: 1, id: 16 }; 4);
-
-    /// Retrieves the color set using `ActorExt::set_background_color`.
-    /// ## `color`
-    /// return location for a `Color`
-    fn get_background_color(&self) -> InternalColor;
-
-    /// Retrieves the actor at the given `index_` inside the list of
-    /// children of `self`.
-    /// ## `index_`
-    /// the position in the list of children
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `Actor`, or `None`
-    fn get_child_at_index(&self, index_: i32) -> Option<Actor>;
-
-    /// Retrieves the child transformation matrix set using
-    /// `ActorExt::set_child_transform`; if none is currently set,
-    /// the `transform` matrix will be initialized to the identity matrix.
-    /// ## `transform`
-    /// a `Matrix`
-    fn get_child_transform(&self) -> Matrix;
-
-    /// Retrieves the list of children of `self`.
-    ///
-    /// # Returns
-    ///
-    /// A newly
-    ///  allocated `glib::List` of `Actor`<!-- -->s. Use `glib::List::free` when
-    ///  done.
-    fn get_children(&self) -> Vec<Actor>;
-
-    /// Gets the clip area for `self`, if any is set.
-    /// ## `xoff`
-    /// return location for the X offset of
-    ///  the clip rectangle, or `None`
-    /// ## `yoff`
-    /// return location for the Y offset of
-    ///  the clip rectangle, or `None`
-    /// ## `width`
-    /// return location for the width of
-    ///  the clip rectangle, or `None`
-    /// ## `height`
-    /// return location for the height of
-    ///  the clip rectangle, or `None`
-    fn get_clip(&self) -> (f32, f32, f32, f32);
-
-    /// Retrieves the value set using `ActorExt::set_clip_to_allocation`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `Actor` is clipped to its allocation
-    fn get_clip_to_allocation(&self) -> bool;
-
-    /// Retrieves the `Constraint` with the given name in the list
-    /// of constraints applied to `self`
-    /// ## `name`
-    /// the name of the constraint to retrieve
-    ///
-    /// # Returns
-    ///
-    /// a `Constraint` for the given
-    ///  name, or `None`. The returned `Constraint` is owned by the
-    ///  actor and it should not be unreferenced directly
-    fn get_constraint(&self, name: &str) -> Option<Constraint>;
-
-    /// Retrieves the list of constraints applied to `self`
-    ///
-    /// # Returns
-    ///
-    /// a copy
-    ///  of the list of `Constraint`<!-- -->s. The contents of the list are
-    ///  owned by the `Actor`. Use `glib::List::free` to free the resources
-    ///  allocated by the returned `glib::List`
-    fn get_constraints(&self) -> Vec<Constraint>;
-
-    /// Retrieves the contents of `self`.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the `Content` instance,
-    ///  or `None` if none was set
-    fn get_content(&self) -> Option<Content>;
-
-    /// Retrieves the bounding box for the `Content` of `self`.
-    ///
-    /// The bounding box is relative to the actor's allocation.
-    ///
-    /// If no `Content` is set for `self`, or if `self` has not been
-    /// allocated yet, then the result is undefined.
-    ///
-    /// The content box is guaranteed to be, at most, as big as the allocation
-    /// of the `Actor`.
-    ///
-    /// If the `Content` used by the actor has a preferred size, then
-    /// it is possible to modify the content box by using the
-    /// `Actor:content-gravity` property.
-    /// ## `box_`
-    /// the return location for the bounding
-    ///  box for the `Content`
-    fn get_content_box(&self) -> ActorBox;
-
-    /// Retrieves the content gravity as set using
-    /// `ActorExt::set_content_gravity`.
-    ///
-    /// # Returns
-    ///
-    /// the content gravity
-    fn get_content_gravity(&self) -> ContentGravity;
-
-    /// Retrieves the repeat policy for a `Actor` set by
-    /// `ActorExt::set_content_repeat`.
-    ///
-    /// # Returns
-    ///
-    /// the content repeat policy
-    fn get_content_repeat(&self) -> ContentRepeat;
-
-    /// Retrieves the values set using `ActorExt::set_content_scaling_filters`.
-    /// ## `min_filter`
-    /// return location for the minification
-    ///  filter, or `None`
-    /// ## `mag_filter`
-    /// return location for the magnification
-    ///  filter, or `None`
-    fn get_content_scaling_filters(&self) -> (ScalingFilter, ScalingFilter);
-
-    /// Retrieves the default paint volume for `self`.
-    ///
-    /// This function provides the same `PaintVolume` that would be
-    /// computed by the default implementation inside `Actor` of the
-    /// `ActorClass.get_paint_volume`() virtual function.
-    ///
-    /// This function should only be used by `Actor` subclasses that
-    /// cannot chain up to the parent implementation when computing their
-    /// paint volume.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the default
-    ///  `PaintVolume`, relative to the `Actor`, or `None` if
-    ///  the actor could not compute a valid paint volume. The returned value
-    ///  is not guaranteed to be stable across multiple frames, so if you
-    ///  want to retain it, you will need to copy it using
-    ///  `PaintVolume::copy`.
-    fn get_default_paint_volume(&self) -> Option<PaintVolume>;
-
-    /// Retrieves the delay that should be applied when tweening animatable
-    /// properties.
-    ///
-    /// # Returns
-    ///
-    /// a delay, in milliseconds
-    fn get_easing_delay(&self) -> u32;
-
-    /// Retrieves the duration of the tweening for animatable
-    /// properties of `self` for the current easing state.
-    ///
-    /// # Returns
-    ///
-    /// the duration of the tweening, in milliseconds
-    fn get_easing_duration(&self) -> u32;
-
-    /// Retrieves the easing mode for the tweening of animatable properties
-    /// of `self` for the current easing state.
-    ///
-    /// # Returns
-    ///
-    /// an easing mode
-    fn get_easing_mode(&self) -> AnimationMode;
-
-    /// Retrieves the `Effect` with the given name in the list
-    /// of effects applied to `self`
-    /// ## `name`
-    /// the name of the effect to retrieve
-    ///
-    /// # Returns
-    ///
-    /// a `Effect` for the given
-    ///  name, or `None`. The returned `Effect` is owned by the
-    ///  actor and it should not be unreferenced directly
-    fn get_effect(&self, name: &str) -> Option<Effect>;
-
-    /// Retrieves the `Effect`<!-- -->s applied on `self`, if any
-    ///
-    /// # Returns
-    ///
-    /// a list
-    ///  of `Effect`<!-- -->s, or `None`. The elements of the returned
-    ///  list are owned by internals and they should not be freed. You should
-    ///  free the returned list using `glib::List::free` when done
-    fn get_effects(&self) -> Vec<Effect>;
-
-    /// Retrieves the first child of `self`.
-    ///
-    /// The returned pointer is only valid until the scene graph changes; it
-    /// is not safe to modify the list of children of `self` while iterating
-    /// it.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `Actor`, or `None`
-    fn get_first_child(&self) -> Option<Actor>;
-
-    /// Checks whether an actor has a fixed position set (and will thus be
-    /// unaffected by any layout manager).
-    ///
-    /// # Returns
-    ///
-    /// `true` if the fixed position is set on the actor
-    fn get_fixed_position_set(&self) -> bool;
-
-    /// Retrieves the flags set on `self`
-    ///
-    /// # Returns
-    ///
-    /// a bitwise or of `ActorFlags` or 0
-    fn get_flags(&self) -> ActorFlags;
-
-    /// Retrieves the height of a `Actor`.
-    ///
-    /// If the actor has a valid allocation, this function will return the
-    /// height of the allocated area given to the actor.
-    ///
-    /// If the actor does not have a valid allocation, this function will
-    /// return the actor's natural height, that is the preferred height of
-    /// the actor.
-    ///
-    /// If you care whether you get the preferred height or the height that
-    /// has been assigned to the actor, you should probably call a different
-    /// function like `ActorExt::get_allocation_box` to retrieve the
-    /// allocated size or `ActorExt::get_preferred_height` to retrieve the
-    /// preferred height.
-    ///
-    /// If an actor has a fixed height, for instance a height that has been
-    /// assigned using `ActorExt::set_height`, the height returned will
-    /// be the same value.
-    ///
-    /// # Returns
-    ///
-    /// the height of the actor, in pixels
-    fn get_height(&self) -> f32;
-
-    /// Retrieves the last child of `self`.
-    ///
-    /// The returned pointer is only valid until the scene graph changes; it
-    /// is not safe to modify the list of children of `self` while iterating
-    /// it.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `Actor`, or `None`
-    fn get_last_child(&self) -> Option<Actor>;
-
-    /// Retrieves the `LayoutManager` used by `self`.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the `LayoutManager`,
-    ///  or `None`
-    fn get_layout_manager(&self) -> Option<LayoutManager>;
-
-    /// Retrieves all the components of the margin of a `Actor`.
-    /// ## `margin`
-    /// return location for a `Margin`
-    fn get_margin(&self) -> Margin;
-
-    /// Retrieves the bottom margin of a `Actor`.
-    ///
-    /// # Returns
-    ///
-    /// the bottom margin
-    fn get_margin_bottom(&self) -> f32;
-
-    /// Retrieves the left margin of a `Actor`.
-    ///
-    /// # Returns
-    ///
-    /// the left margin
-    fn get_margin_left(&self) -> f32;
-
-    /// Retrieves the right margin of a `Actor`.
-    ///
-    /// # Returns
-    ///
-    /// the right margin
-    fn get_margin_right(&self) -> f32;
-
-    /// Retrieves the top margin of a `Actor`.
-    ///
-    /// # Returns
-    ///
-    /// the top margin
-    fn get_margin_top(&self) -> f32;
-
-    /// Retrieves the number of children of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the number of children of an actor
-    fn get_n_children(&self) -> i32;
-
-    /// Retrieves the name of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the name of the actor, or `None`. The returned string is
-    ///  owned by the actor and should not be modified or freed.
-    fn get_name(&self) -> Option<GString>;
-
-    /// Retrieves the sibling of `self` that comes after it in the list
-    /// of children of `self`'s parent.
-    ///
-    /// The returned pointer is only valid until the scene graph changes; it
-    /// is not safe to modify the list of children of `self` while iterating
-    /// it.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `Actor`, or `None`
-    fn get_next_sibling(&self) -> Option<Actor>;
-
-    /// Retrieves whether to redirect the actor to an offscreen buffer, as
-    /// set by `ActorExt::set_offscreen_redirect`.
-    ///
-    /// # Returns
-    ///
-    /// the value of the offscreen-redirect property of the actor
-    fn get_offscreen_redirect(&self) -> OffscreenRedirect;
-
-    /// Retrieves the opacity value of an actor, as set by
-    /// `ActorExt::set_opacity`.
-    ///
-    /// For retrieving the absolute opacity of the actor inside a paint
-    /// virtual function, see `ActorExt::get_paint_opacity`.
-    ///
-    /// # Returns
-    ///
-    /// the opacity of the actor
-    fn get_opacity(&self) -> u8;
-
-    /// Retrieves the paint volume of the passed `Actor`, and
-    /// transforms it into a 2D bounding box in stage coordinates.
-    ///
-    /// This function is useful to determine the on screen area occupied by
-    /// the actor. The box is only an approximation and may often be
-    /// considerably larger due to the optimizations used to calculate the
-    /// box. The box is never smaller though, so it can reliably be used
-    /// for culling.
-    ///
-    /// There are times when a 2D paint box can't be determined, e.g.
-    /// because the actor isn't yet parented under a stage or because
-    /// the actor is unable to determine a paint volume.
-    /// ## `box_`
-    /// return location for a `ActorBox`
-    ///
-    /// # Returns
-    ///
-    /// `true` if a 2D paint box could be determined, else
-    /// `false`.
-    fn get_paint_box(&self) -> Option<ActorBox>;
-
-    /// Retrieves the absolute opacity of the actor, as it appears on the stage.
-    ///
-    /// This function traverses the hierarchy chain and composites the opacity of
-    /// the actor with that of its parents.
-    ///
-    /// This function is intended for subclasses to use in the paint virtual
-    /// function, to paint themselves with the correct opacity.
-    ///
-    /// # Returns
-    ///
-    /// The actor opacity value.
-    fn get_paint_opacity(&self) -> u8;
-
-    /// Retrieves the 'paint' visibility of an actor recursively checking for non
-    /// visible parents.
-    ///
-    /// This is by definition the same as `ACTOR_IS_MAPPED`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is visibile and will be painted.
-    fn get_paint_visibility(&self) -> bool;
-
-    /// Retrieves the paint volume of the passed `Actor`, or `None`
-    /// when a paint volume can't be determined.
-    ///
-    /// The paint volume is defined as the 3D space occupied by an actor
-    /// when being painted.
-    ///
-    /// This function will call the `ActorClass.get_paint_volume`()
-    /// virtual function of the `Actor` class. Sub-classes of `Actor`
-    /// should not usually care about overriding the default implementation,
-    /// unless they are, for instance: painting outside their allocation, or
-    /// actors with a depth factor (not in terms of `Actor:depth` but real
-    /// 3D depth).
-    ///
-    /// Note: 2D actors overriding `ActorClass.get_paint_volume`()
-    /// should ensure that their volume has a depth of 0. (This will be true
-    /// as long as you don't call `PaintVolume::set_depth`.)
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `PaintVolume`,
-    ///  or `None` if no volume could be determined. The returned pointer
-    ///  is not guaranteed to be valid across multiple frames; if you want
-    ///  to keep it, you will need to copy it using `PaintVolume::copy`.
-    fn get_paint_volume(&self) -> Option<PaintVolume>;
-
-    /// Retrieves the `pango::Context` for `self`. The actor's `pango::Context`
-    /// is already configured using the appropriate font map, resolution
-    /// and font options.
-    ///
-    /// Unlike `ActorExt::create_pango_context`, this context is owend
-    /// by the `Actor` and it will be updated each time the options
-    /// stored by the `Backend` change.
-    ///
-    /// You can use the returned `pango::Context` to create a `pango::Layout`
-    /// and render text using `pango_render_layout` to reuse the
-    /// glyphs cache also used by internal.
-    ///
-    /// # Returns
-    ///
-    /// the `pango::Context` for a `Actor`.
-    ///  The returned `pango::Context` is owned by the actor and should not be
-    ///  unreferenced by the application code
-    fn get_pango_context(&self) -> Option<pango::Context>;
-
-    /// Retrieves the parent of `self`.
-    ///
-    /// # Returns
-    ///
-    /// The `Actor` parent, or `None`
-    ///  if no parent is set
-    fn get_parent(&self) -> Option<Actor>;
-
-    /// Retrieves the coordinates of the `Actor:pivot-point`.
-    /// ## `pivot_x`
-    /// return location for the normalized X
-    ///  coordinate of the pivot point, or `None`
-    /// ## `pivot_y`
-    /// return location for the normalized Y
-    ///  coordinate of the pivot point, or `None`
-    fn get_pivot_point(&self) -> (f32, f32);
-
-    /// Retrieves the Z component of the `Actor:pivot-point`.
-    fn get_pivot_point_z(&self) -> f32;
-
-    /// This function tries to "do what you mean" and tell you where the
-    /// actor is, prior to any transformations. Retrieves the fixed
-    /// position of an actor in pixels, if one has been set; otherwise, if
-    /// the allocation is valid, returns the actor's allocated position;
-    /// otherwise, returns 0,0.
-    ///
-    /// The returned position is in pixels.
-    /// ## `x`
-    /// return location for the X coordinate, or `None`
-    /// ## `y`
-    /// return location for the Y coordinate, or `None`
-    fn get_position(&self) -> (f32, f32);
-
-    /// Computes the requested minimum and natural heights for an actor,
-    /// or if they are already computed, returns the cached values.
-    ///
-    /// An actor may not get its request - depending on the layout
-    /// manager that's in effect.
-    ///
-    /// A request should not incorporate the actor's scale or anchor point;
-    /// those transformations do not affect layout, only rendering.
-    /// ## `for_width`
-    /// available width to assume in computing desired height,
-    ///  or a negative value to indicate that no width is defined
-    /// ## `min_height_p`
-    /// return location for minimum height,
-    ///  or `None`
-    /// ## `natural_height_p`
-    /// return location for natural
-    ///  height, or `None`
-    fn get_preferred_height(&self, for_width: f32) -> (f32, f32);
-
-    /// Computes the preferred minimum and natural size of an actor, taking into
-    /// account the actor's geometry management (either height-for-width
-    /// or width-for-height).
-    ///
-    /// The width and height used to compute the preferred height and preferred
-    /// width are the actor's natural ones.
-    ///
-    /// If you need to control the height for the preferred width, or the width for
-    /// the preferred height, you should use `ActorExt::get_preferred_width`
-    /// and `ActorExt::get_preferred_height`, and check the actor's preferred
-    /// geometry management using the `Actor:request-mode` property.
-    /// ## `min_width_p`
-    /// return location for the minimum
-    ///  width, or `None`
-    /// ## `min_height_p`
-    /// return location for the minimum
-    ///  height, or `None`
-    /// ## `natural_width_p`
-    /// return location for the natural
-    ///  width, or `None`
-    /// ## `natural_height_p`
-    /// return location for the natural
-    ///  height, or `None`
-    fn get_preferred_size(&self) -> (f32, f32, f32, f32);
-
-    /// Computes the requested minimum and natural widths for an actor,
-    /// optionally depending on the specified height, or if they are
-    /// already computed, returns the cached values.
-    ///
-    /// An actor may not get its request - depending on the layout
-    /// manager that's in effect.
-    ///
-    /// A request should not incorporate the actor's scale or anchor point;
-    /// those transformations do not affect layout, only rendering.
-    /// ## `for_height`
-    /// available height when computing the preferred width,
-    ///  or a negative value to indicate that no height is defined
-    /// ## `min_width_p`
-    /// return location for minimum width,
-    ///  or `None`
-    /// ## `natural_width_p`
-    /// return location for the natural
-    ///  width, or `None`
-    fn get_preferred_width(&self, for_height: f32) -> (f32, f32);
-
-    /// Retrieves the sibling of `self` that comes before it in the list
-    /// of children of `self`'s parent.
-    ///
-    /// The returned pointer is only valid until the scene graph changes; it
-    /// is not safe to modify the list of children of `self` while iterating
-    /// it.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `Actor`, or `None`
-    fn get_previous_sibling(&self) -> Option<Actor>;
-
-    /// Checks whether `self` is marked as reactive.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is reactive
-    fn get_reactive(&self) -> bool;
-
-    /// Retrieves the geometry request mode of `self`
-    ///
-    /// # Returns
-    ///
-    /// the request mode for the actor
-    fn get_request_mode(&self) -> RequestMode;
-
-    /// Retrieves the angle of rotation set by `ActorExt::set_rotation_angle`.
-    /// ## `axis`
-    /// the axis of the rotation
-    ///
-    /// # Returns
-    ///
-    /// the angle of rotation, in degrees
-    fn get_rotation_angle(&self, axis: RotateAxis) -> f64;
-
-    /// Retrieves an actors scale factors.
-    /// ## `scale_x`
-    /// Location to store horizonal
-    ///  scale factor, or `None`.
-    /// ## `scale_y`
-    /// Location to store vertical
-    ///  scale factor, or `None`.
-    fn get_scale(&self) -> (f64, f64);
-
-    /// Retrieves the scaling factor along the Z axis, as set using
-    /// `ActorExt::set_scale_z`.
-    ///
-    /// # Returns
-    ///
-    /// the scaling factor along the Z axis
-    fn get_scale_z(&self) -> f64;
-
-    /// This function tries to "do what you mean" and return
-    /// the size an actor will have. If the actor has a valid
-    /// allocation, the allocation will be returned; otherwise,
-    /// the actors natural size request will be returned.
-    ///
-    /// If you care whether you get the request vs. the allocation, you
-    /// should probably call a different function like
-    /// `ActorExt::get_allocation_box` or
-    /// `ActorExt::get_preferred_width`.
-    /// ## `width`
-    /// return location for the width, or `None`.
-    /// ## `height`
-    /// return location for the height, or `None`.
-    fn get_size(&self) -> (f32, f32);
-
-    /// Retrieves the `Stage` where `self` is contained.
-    ///
-    /// # Returns
-    ///
-    /// the stage
-    ///  containing the actor, or `None`
-    fn get_stage(&self) -> Option<Stage>;
-
-    /// Retrieves the value set using `ActorExt::set_text_direction`
-    ///
-    /// If no text direction has been previously set, the default text
-    /// direction, as returned by `get_default_text_direction`, will
-    /// be returned instead
-    ///
-    /// # Returns
-    ///
-    /// the `TextDirection` for the actor
-    fn get_text_direction(&self) -> TextDirection;
-
-    /// Retrieves the current transformation matrix of a `Actor`.
-    /// ## `transform`
-    /// a `Matrix`
-    fn get_transform(&self) -> Matrix;
-
-    /// Retrieves the 3D paint volume of an actor like
-    /// `ActorExt::get_paint_volume` does (Please refer to the
-    /// documentation of `ActorExt::get_paint_volume` for more
-    /// details.) and it additionally transforms the paint volume into the
-    /// coordinate space of `relative_to_ancestor`. (Or the stage if `None`
-    /// is passed for `relative_to_ancestor`)
-    ///
-    /// This can be used by containers that base their paint volume on
-    /// the volume of their children. Such containers can query the
-    /// transformed paint volume of all of its children and union them
-    /// together using `PaintVolume::union`.
-    /// ## `relative_to_ancestor`
-    /// A `Actor` that is an ancestor of `self`
-    ///  (or `None` for the stage)
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `PaintVolume`,
-    ///  or `None` if no volume could be determined. The returned pointer is
-    ///  not guaranteed to be valid across multiple frames; if you wish to
-    ///  keep it, you will have to copy it using `PaintVolume::copy`.
-    fn get_transformed_paint_volume<P: IsA<Actor>>(
-        &self,
-        relative_to_ancestor: &P,
-    ) -> Option<PaintVolume>;
-
-    /// Gets the absolute position of an actor, in pixels relative to the stage.
-    /// ## `x`
-    /// return location for the X coordinate, or `None`
-    /// ## `y`
-    /// return location for the Y coordinate, or `None`
-    fn get_transformed_position(&self) -> (f32, f32);
-
-    /// Gets the absolute size of an actor in pixels, taking into account the
-    /// scaling factors.
-    ///
-    /// If the actor has a valid allocation, the allocated size will be used.
-    /// If the actor has not a valid allocation then the preferred size will
-    /// be transformed and returned.
-    ///
-    /// If you want the transformed allocation, see
-    /// `ActorExt::get_abs_allocation_vertices` instead.
-    ///
-    /// When the actor (or one of its ancestors) is rotated around the
-    /// X or Y axis, it no longer appears as on the stage as a rectangle, but
-    /// as a generic quadrangle; in that case this function returns the size
-    /// of the smallest rectangle that encapsulates the entire quad. Please
-    /// note that in this case no assumptions can be made about the relative
-    /// position of this envelope to the absolute position of the actor, as
-    /// returned by `ActorExt::get_transformed_position`; if you need this
-    /// information, you need to use `ActorExt::get_abs_allocation_vertices`
-    /// to get the coords of the actual quadrangle.
-    /// ## `width`
-    /// return location for the width, or `None`
-    /// ## `height`
-    /// return location for the height, or `None`
-    fn get_transformed_size(&self) -> (f32, f32);
-
-    /// Retrieves the `Transition` of a `Actor` by using the
-    /// transition `name`.
-    ///
-    /// Transitions created for animatable properties use the name of the
-    /// property itself, for instance the code below:
-    ///
-    ///
-    /// ```C
-    ///   actor_set_easing_duration (actor, 1000);
-    ///   actor_set_rotation (actor, Y_AXIS, 360.0, x, y, z);
-    ///
-    ///   transition = actor_get_transition (actor, "rotation-angle-y");
-    ///   g_signal_connect (transition, "stopped",
-    ///                     G_CALLBACK (on_transition_stopped),
-    ///                     actor);
-    /// ```
-    ///
-    /// will call the `on_transition_stopped` callback when the transition
-    /// is finished.
-    ///
-    /// If you just want to get notifications of the completion of a transition,
-    /// you should use the `Actor::transition-stopped` signal, using the
-    /// transition name as the signal detail.
-    /// ## `name`
-    /// the name of the transition
-    ///
-    /// # Returns
-    ///
-    /// a `Transition`, or `None` is none
-    ///  was found to match the passed name; the returned instance is owned
-    ///  by internal and it should not be freed
-    fn get_transition(&self, name: &str) -> Option<Transition>;
-
-    /// Retrieves the translation set using `ActorExt::set_translation`.
-    /// ## `translate_x`
-    /// return location for the X component
-    ///  of the translation, or `None`
-    /// ## `translate_y`
-    /// return location for the Y component
-    ///  of the translation, or `None`
-    /// ## `translate_z`
-    /// return location for the Z component
-    ///  of the translation, or `None`
-    fn get_translation(&self) -> (f32, f32, f32);
-
-    /// Retrieves the width of a `Actor`.
-    ///
-    /// If the actor has a valid allocation, this function will return the
-    /// width of the allocated area given to the actor.
-    ///
-    /// If the actor does not have a valid allocation, this function will
-    /// return the actor's natural width, that is the preferred width of
-    /// the actor.
-    ///
-    /// If you care whether you get the preferred width or the width that
-    /// has been assigned to the actor, you should probably call a different
-    /// function like `ActorExt::get_allocation_box` to retrieve the
-    /// allocated size or `ActorExt::get_preferred_width` to retrieve the
-    /// preferred width.
-    ///
-    /// If an actor has a fixed width, for instance a width that has been
-    /// assigned using `ActorExt::set_width`, the width returned will
-    /// be the same value.
-    ///
-    /// # Returns
-    ///
-    /// the width of the actor, in pixels
-    fn get_width(&self) -> f32;
-
-    /// Retrieves the X coordinate of a `Actor`.
-    ///
-    /// This function tries to "do what you mean", by returning the
-    /// correct value depending on the actor's state.
-    ///
-    /// If the actor has a valid allocation, this function will return
-    /// the X coordinate of the origin of the allocation box.
-    ///
-    /// If the actor has any fixed coordinate set using `ActorExt::set_x`,
-    /// `ActorExt::set_position` or `Actor::set_geometry`, this
-    /// function will return that coordinate.
-    ///
-    /// If both the allocation and a fixed position are missing, this function
-    /// will return 0.
-    ///
-    /// # Returns
-    ///
-    /// the X coordinate, in pixels, ignoring any
-    ///  transformation (i.e. scaling, rotation)
-    fn get_x(&self) -> f32;
-
-    /// Retrieves the horizontal alignment policy set using
-    /// `ActorExt::set_x_align`.
-    ///
-    /// # Returns
-    ///
-    /// the horizontal alignment policy.
-    fn get_x_align(&self) -> ActorAlign;
-
-    /// Retrieves the value set with `ActorExt::set_x_expand`.
-    ///
-    /// See also: `ActorExt::needs_expand`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has been set to expand
-    fn get_x_expand(&self) -> bool;
-
-    /// Retrieves the Y coordinate of a `Actor`.
-    ///
-    /// This function tries to "do what you mean", by returning the
-    /// correct value depending on the actor's state.
-    ///
-    /// If the actor has a valid allocation, this function will return
-    /// the Y coordinate of the origin of the allocation box.
-    ///
-    /// If the actor has any fixed coordinate set using `ActorExt::set_y`,
-    /// `ActorExt::set_position` or `Actor::set_geometry`, this
-    /// function will return that coordinate.
-    ///
-    /// If both the allocation and a fixed position are missing, this function
-    /// will return 0.
-    ///
-    /// # Returns
-    ///
-    /// the Y coordinate, in pixels, ignoring any
-    ///  transformation (i.e. scaling, rotation)
-    fn get_y(&self) -> f32;
-
-    /// Retrieves the vertical alignment policy set using
-    /// `ActorExt::set_y_align`.
-    ///
-    /// # Returns
-    ///
-    /// the vertical alignment policy.
-    fn get_y_align(&self) -> ActorAlign;
-
-    /// Retrieves the value set with `ActorExt::set_y_expand`.
-    ///
-    /// See also: `ActorExt::needs_expand`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has been set to expand
-    fn get_y_expand(&self) -> bool;
-
-    /// Retrieves the actor's position on the Z axis.
-    ///
-    /// # Returns
-    ///
-    /// the position on the Z axis.
-    fn get_z_position(&self) -> f32;
-
-    /// Sets the key focus of the `Stage` including `self`
-    /// to this `Actor`.
-    fn grab_key_focus(&self);
-
-    /// Returns whether the actor has any actions applied.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has any actions,
-    ///  `false` otherwise
-    fn has_actions(&self) -> bool;
-
-    /// Checks if the actor has an up-to-date allocation assigned to
-    /// it. This means that the actor should have an allocation: it's
-    /// visible and has a parent. It also means that there is no
-    /// outstanding relayout request in progress for the actor or its
-    /// children (There might be other outstanding layout requests in
-    /// progress that will cause the actor to get a new allocation
-    /// when the stage is laid out, however).
-    ///
-    /// If this function returns `false`, then the actor will normally
-    /// be allocated before it is next drawn on the screen.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has an up-to-date allocation
-    fn has_allocation(&self) -> bool;
-
-    /// Determines whether the actor has a clip area set or not.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has a clip area set.
-    fn has_clip(&self) -> bool;
-
-    /// Returns whether the actor has any constraints applied.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has any constraints,
-    ///  `false` otherwise
-    fn has_constraints(&self) -> bool;
-
-    /// Returns whether the actor has any effects applied.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has any effects,
-    ///  `false` otherwise
-    fn has_effects(&self) -> bool;
-
-    /// Checks whether `self` is the `Actor` that has key focus
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor has key focus, and `false` otherwise
-    fn has_key_focus(&self) -> bool;
-
-    /// Asks the actor's implementation whether it may contain overlapping
-    /// primitives.
-    ///
-    /// For example; it may use this to determine whether the painting
-    /// should be redirected to an offscreen buffer to correctly implement
-    /// the opacity property.
-    ///
-    /// Custom actors can override the default response by implementing the
-    /// `ActorClass.has_overlaps`() virtual function. See
-    /// `ActorExt::set_offscreen_redirect` for more information.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor may have overlapping primitives, and
-    ///  `false` otherwise
-    fn has_overlaps(&self) -> bool;
-
-    /// Checks whether an actor contains the pointer of a
-    /// `InputDevice`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor contains the pointer, and
-    ///  `false` otherwise
-    fn has_pointer(&self) -> bool;
-
-    /// Flags an actor to be hidden. A hidden actor will not be
-    /// rendered on the stage.
-    ///
-    /// Actors are visible by default.
-    ///
-    /// If this function is called on an actor without a parent, the
-    /// `Actor:show-on-set-parent` property will be set to `false`
-    /// as a side-effect.
-    fn hide(&self);
-
-    /// Inserts `child` into the list of children of `self`, above another
-    /// child of `self` or, if `sibling` is `None`, above all the children
-    /// of `self`.
-    ///
-    /// This function will acquire a reference on `child` that will only
-    /// be released when calling `ActorExt::remove_child`.
-    ///
-    /// This function will not take into consideration the `Actor:depth`
-    /// of `child`.
-    ///
-    /// This function will emit the `Container::actor-added` signal
-    /// on `self`.
-    /// ## `child`
-    /// a `Actor`
-    /// ## `sibling`
-    /// a child of `self`, or `None`
-    fn insert_child_above<P: IsA<Actor>, Q: IsA<Actor>>(&self, child: &P, sibling: Option<&Q>);
-
-    /// Inserts `child` into the list of children of `self`, using the
-    /// given `index_`. If `index_` is greater than the number of children
-    /// in `self`, or is less than 0, then the new child is added at the end.
-    ///
-    /// This function will acquire a reference on `child` that will only
-    /// be released when calling `ActorExt::remove_child`.
-    ///
-    /// This function will not take into consideration the `Actor:depth`
-    /// of `child`.
-    ///
-    /// This function will emit the `Container::actor-added` signal
-    /// on `self`.
-    /// ## `child`
-    /// a `Actor`
-    /// ## `index_`
-    /// the index
-    fn insert_child_at_index<P: IsA<Actor>>(&self, child: &P, index_: i32);
-
-    /// Inserts `child` into the list of children of `self`, below another
-    /// child of `self` or, if `sibling` is `None`, below all the children
-    /// of `self`.
-    ///
-    /// This function will acquire a reference on `child` that will only
-    /// be released when calling `ActorExt::remove_child`.
-    ///
-    /// This function will not take into consideration the `Actor:depth`
-    /// of `child`.
-    ///
-    /// This function will emit the `Container::actor-added` signal
-    /// on `self`.
-    /// ## `child`
-    /// a `Actor`
-    /// ## `sibling`
-    /// a child of `self`, or `None`
-    fn insert_child_below<P: IsA<Actor>, Q: IsA<Actor>>(&self, child: &P, sibling: Option<&Q>);
-
-    /// Checks whether `self` is being currently painted by a `Clone`
-    ///
-    /// This function is useful only inside the ::paint virtual function
-    /// implementations or within handlers for the `Actor::paint`
-    /// signal
-    ///
-    /// This function should not be used by applications
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `Actor` is currently being painted
-    ///  by a `Clone`, and `false` otherwise
-    fn is_in_clone_paint(&self) -> bool;
-
-    /// Checks whether a `Actor` has been set as mapped.
-    ///
-    /// See also `ACTOR_IS_MAPPED` and `Actor:mapped`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is mapped
-    fn is_mapped(&self) -> bool;
-
-    /// Checks whether a `Actor` is realized.
-    ///
-    /// See also `ACTOR_IS_REALIZED` and `Actor:realized`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is realized
-    fn is_realized(&self) -> bool;
-
-    /// Checks whether any rotation is applied to the actor.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is rotated.
-    fn is_rotated(&self) -> bool;
-
-    /// Checks whether the actor is scaled in either dimension.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is scaled.
-    fn is_scaled(&self) -> bool;
-
-    /// Checks whether an actor is marked as visible.
-    ///
-    /// See also `ACTOR_IS_VISIBLE` and `Actor:visible`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor visible
-    fn is_visible(&self) -> bool;
-
-    /// Sets the `ActorFlags::Mapped` flag on the actor and possibly maps
-    /// and realizes its children if they are visible. Does nothing if the
-    /// actor is not visible.
-    ///
-    /// Calling this function is strongly disencouraged: the default
-    /// implementation of `ActorClass.map`() will map all the children
-    /// of an actor when mapping its parent.
-    ///
-    /// When overriding map, it is mandatory to chain up to the parent
-    /// implementation.
-    fn map(&self);
-
-    /// Moves an actor by the specified distance relative to its current
-    /// position in pixels.
-    ///
-    /// This function modifies the fixed position of an actor and thus removes
-    /// it from any layout management. Another way to move an actor is with an
-    /// anchor point, see `Actor::set_anchor_point`, or with an additional
-    /// translation, using `ActorExt::set_translation`.
-    /// ## `dx`
-    /// Distance to move Actor on X axis.
-    /// ## `dy`
-    /// Distance to move Actor on Y axis.
-    fn move_by(&self, dx: f32, dy: f32);
-
-    /// Checks whether an actor, or any of its children, is set to expand
-    /// horizontally or vertically.
-    ///
-    /// This function should only be called by layout managers that can
-    /// assign extra space to their children.
-    ///
-    /// If you want to know whether the actor was explicitly set to expand,
-    /// use `ActorExt::get_x_expand` or `ActorExt::get_y_expand`.
-    /// ## `orientation`
-    /// the direction of expansion
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor should expand
-    fn needs_expand(&self, orientation: Orientation) -> bool;
-
-    /// Renders the actor to display.
-    ///
-    /// This function should not be called directly by applications.
-    /// Call `ActorExt::queue_redraw` to queue paints, instead.
-    ///
-    /// This function is context-aware, and will either cause a
-    /// regular paint or a pick paint.
-    ///
-    /// This function will emit the `Actor::paint` signal or
-    /// the `Actor::pick` signal, depending on the context.
-    ///
-    /// This function does not paint the actor if the actor is set to 0,
-    /// unless it is performing a pick paint.
-    fn paint(&self);
-
-    /// Queues up a redraw of an actor and any children. The redraw occurs
-    /// once the main loop becomes idle (after the current batch of events
-    /// has been processed, roughly).
-    ///
-    /// Applications rarely need to call this, as redraws are handled
-    /// automatically by modification functions.
-    ///
-    /// This function will not do anything if `self` is not visible, or
-    /// if the actor is inside an invisible part of the scenegraph.
-    ///
-    /// Also be aware that painting is a NOP for actors with an opacity of
-    /// 0
-    ///
-    /// When you are implementing a custom actor you must queue a redraw
-    /// whenever some private state changes that will affect painting or
-    /// picking of your actor.
-    fn queue_redraw(&self);
-
-    /// Queues a redraw on `self` limited to a specific, actor-relative
-    /// rectangular area.
-    ///
-    /// If `clip` is `None` this function is equivalent to
-    /// `ActorExt::queue_redraw`.
-    /// ## `clip`
-    /// a rectangular clip region, or `None`
-    fn queue_redraw_with_clip(&self, clip: Option<&cairo::RectangleInt>);
-
-    /// Indicates that the actor's size request or other layout-affecting
-    /// properties may have changed. This function is used inside `Actor`
-    /// subclass implementations, not by applications directly.
-    ///
-    /// Queueing a new layout automatically queues a redraw as well.
-    fn queue_relayout(&self);
-
-    /// Removes `action` from the list of actions applied to `self`
-    ///
-    /// The reference held by `self` on the `Action` will be released
-    /// ## `action`
-    /// a `Action`
-    fn remove_action<P: IsA<Action>>(&self, action: &P);
-
-    /// Removes the `Action` with the given name from the list
-    /// of actions applied to `self`
-    /// ## `name`
-    /// the name of the action to remove
-    fn remove_action_by_name(&self, name: &str);
-
-    /// Removes all children of `self`.
-    ///
-    /// This function releases the reference added by inserting a child actor
-    /// in the list of children of `self`.
-    ///
-    /// If the reference count of a child drops to zero, the child will be
-    /// destroyed. If you want to ensure the destruction of all the children
-    /// of `self`, use `ActorExt::destroy_all_children`.
-    fn remove_all_children(&self);
-
-    /// Removes all transitions associated to `self`.
-    fn remove_all_transitions(&self);
-
-    /// Removes `child` from the children of `self`.
-    ///
-    /// This function will release the reference added by
-    /// `ActorExt::add_child`, so if you want to keep using `child`
-    /// you will have to acquire a referenced on it before calling this
-    /// function.
-    ///
-    /// This function will emit the `Container::actor-removed`
-    /// signal on `self`.
-    /// ## `child`
-    /// a `Actor`
-    fn remove_child<P: IsA<Actor>>(&self, child: &P);
-
-    /// Removes clip area from `self`.
-    fn remove_clip(&self);
-
-    /// Removes `constraint` from the list of constraints applied to `self`
-    ///
-    /// The reference held by `self` on the `Constraint` will be released
-    /// ## `constraint`
-    /// a `Constraint`
-    fn remove_constraint<P: IsA<Constraint>>(&self, constraint: &P);
-
-    /// Removes the `Constraint` with the given name from the list
-    /// of constraints applied to `self`
-    /// ## `name`
-    /// the name of the constraint to remove
-    fn remove_constraint_by_name(&self, name: &str);
-
-    /// Removes `effect` from the list of effects applied to `self`
-    ///
-    /// The reference held by `self` on the `Effect` will be released
-    /// ## `effect`
-    /// a `Effect`
-    fn remove_effect<P: IsA<Effect>>(&self, effect: &P);
-
-    /// Removes the `Effect` with the given name from the list
-    /// of effects applied to `self`
-    /// ## `name`
-    /// the name of the effect to remove
-    fn remove_effect_by_name(&self, name: &str);
-
-    /// Removes the transition stored inside a `Actor` using `name`
-    /// identifier.
-    ///
-    /// If the transition is currently in progress, it will be stopped.
-    ///
-    /// This function releases the reference acquired when the transition
-    /// was added to the `Actor`.
-    /// ## `name`
-    /// the name of the transition to remove
-    fn remove_transition(&self, name: &str);
-
-    /// Replaces `old_child` with `new_child` in the list of children of `self`.
-    /// ## `old_child`
-    /// the child of `self` to replace
-    /// ## `new_child`
-    /// the `Actor` to replace `old_child`
-    fn replace_child<P: IsA<Actor>, Q: IsA<Actor>>(&self, old_child: &P, new_child: &Q);
-
-    /// Restores the easing state as it was prior to a call to
-    /// `ActorExt::save_easing_state`.
-    fn restore_easing_state(&self);
-
-    /// Saves the current easing state for animatable properties, and creates
-    /// a new state with the default values for easing mode and duration.
-    ///
-    /// New transitions created after calling this function will inherit the
-    /// duration, easing mode, and delay of the new easing state; this also
-    /// applies to transitions modified in flight.
-    fn save_easing_state(&self);
-
-    /// Stores the allocation of `self` as defined by `box_`.
-    ///
-    /// This function can only be called from within the implementation of
-    /// the `ActorClass.allocate`() virtual function.
-    ///
-    /// The allocation should have been adjusted to take into account constraints,
-    /// alignment, and margin properties. If you are implementing a `Actor`
-    /// subclass that provides its own layout management policy for its children
-    /// instead of using a `LayoutManager` delegate, you should not call
-    /// this function on the children of `self`; instead, you should call
-    /// `ActorExt::allocate`, which will adjust the allocation box for
-    /// you.
-    ///
-    /// This function should only be used by subclasses of `Actor`
-    /// that wish to store their allocation but cannot chain up to the
-    /// parent's implementation; the default implementation of the
-    /// `ActorClass.allocate`() virtual function will call this
-    /// function.
-    ///
-    /// It is important to note that, while chaining up was the recommended
-    /// behaviour for `Actor` subclasses prior to the introduction of
-    /// this function, it is recommended to call `ActorExt::set_allocation`
-    /// instead.
-    ///
-    /// If the `Actor` is using a `LayoutManager` delegate object
-    /// to handle the allocation of its children, this function will call
-    /// the `LayoutManagerExt::allocate` function only if the
-    /// `AllocationFlags::DelegateLayout` flag is set on `flags`, otherwise it is
-    /// expected that the subclass will call `LayoutManagerExt::allocate`
-    /// by itself. For instance, the following code:
-    ///
-    ///
-    /// ```C
-    /// static void
-    /// my_actor_allocate (Actor *actor,
-    ///                    const ActorBox *allocation,
-    ///                    AllocationFlags flags)
-    /// {
-    ///   ActorBox new_alloc;
-    ///   AllocationFlags new_flags;
-    ///
-    ///   adjust_allocation (allocation, &new_alloc);
-    ///
-    ///   new_flags = flags | DELEGATE_LAYOUT;
-    ///
-    ///   // this will use the layout manager set on the actor
-    ///   actor_set_allocation (actor, &new_alloc, new_flags);
-    /// }
-    /// ```
-    ///
-    /// is equivalent to this:
-    ///
-    ///
-    /// ```C
-    /// static void
-    /// my_actor_allocate (Actor *actor,
-    ///                    const ActorBox *allocation,
-    ///                    AllocationFlags flags)
-    /// {
-    ///   LayoutManager *layout;
-    ///   ActorBox new_alloc;
-    ///
-    ///   adjust_allocation (allocation, &new_alloc);
-    ///
-    ///   actor_set_allocation (actor, &new_alloc, flags);
-    ///
-    ///   layout = actor_get_layout_manager (actor);
-    ///   layout_manager_allocate (layout,
-    ///                                    CONTAINER (actor),
-    ///                                    &new_alloc,
-    ///                                    flags);
-    /// }
-    /// ```
-    /// ## `box_`
-    /// a `ActorBox`
-    /// ## `flags`
-    /// allocation flags
-    fn set_allocation(&self, box_: &ActorBox, flags: AllocationFlags);
-
-    /// Sets the background color of a `Actor`.
-    ///
-    /// The background color will be used to cover the whole allocation of the
-    /// actor. The default background color of an actor is transparent.
-    ///
-    /// To check whether an actor has a background color, you can use the
-    /// `Actor:background-color-set` actor property.
-    ///
-    /// The `Actor:background-color` property is animatable.
-    /// ## `color`
-    /// a `Color`, or `None` to unset a previously
-    ///  set color
-    fn set_background_color(&self, color: Option<Color>);
-
-    /// Sets `child` to be above `sibling` in the list of children of `self`.
-    ///
-    /// If `sibling` is `None`, `child` will be the new last child of `self`.
-    ///
-    /// This function is logically equivalent to removing `child` and using
-    /// `ActorExt::insert_child_above`, but it will not emit signals
-    /// or change state on `child`.
-    /// ## `child`
-    /// a `Actor` child of `self`
-    /// ## `sibling`
-    /// a `Actor` child of `self`, or `None`
-    fn set_child_above_sibling<P: IsA<Actor>, Q: IsA<Actor>>(&self, child: &P, sibling: Option<&Q>);
-
-    /// Changes the index of `child` in the list of children of `self`.
-    ///
-    /// This function is logically equivalent to removing `child` and
-    /// calling `ActorExt::insert_child_at_index`, but it will not
-    /// emit signals or change state on `child`.
-    /// ## `child`
-    /// a `Actor` child of `self`
-    /// ## `index_`
-    /// the new index for `child`
-    fn set_child_at_index<P: IsA<Actor>>(&self, child: &P, index_: i32);
-
-    /// Sets `child` to be below `sibling` in the list of children of `self`.
-    ///
-    /// If `sibling` is `None`, `child` will be the new first child of `self`.
-    ///
-    /// This function is logically equivalent to removing `self` and using
-    /// `ActorExt::insert_child_below`, but it will not emit signals
-    /// or change state on `child`.
-    /// ## `child`
-    /// a `Actor` child of `self`
-    /// ## `sibling`
-    /// a `Actor` child of `self`, or `None`
-    fn set_child_below_sibling<P: IsA<Actor>, Q: IsA<Actor>>(&self, child: &P, sibling: Option<&Q>);
-
-    /// Sets the transformation matrix to be applied to all the children
-    /// of `self` prior to their own transformations. The default child
-    /// transformation is the identity matrix.
-    ///
-    /// If `transform` is `None`, the child transform will be unset.
-    ///
-    /// The `Actor:child-transform` property is animatable.
-    /// ## `transform`
-    /// a `Matrix`, or `None`
-    fn set_child_transform(&self, transform: Option<&Matrix>);
-
-    /// Sets clip area for `self`. The clip area is always computed from the
-    /// upper left corner of the actor, even if the anchor point is set
-    /// otherwise.
-    /// ## `xoff`
-    /// X offset of the clip rectangle
-    /// ## `yoff`
-    /// Y offset of the clip rectangle
-    /// ## `width`
-    /// Width of the clip rectangle
-    /// ## `height`
-    /// Height of the clip rectangle
-    fn set_clip(&self, xoff: f32, yoff: f32, width: f32, height: f32);
-
-    /// Sets whether `self` should be clipped to the same size as its
-    /// allocation
-    /// ## `clip_set`
-    /// `true` to apply a clip tracking the allocation
-    fn set_clip_to_allocation(&self, clip_set: bool);
-
-    /// Sets the contents of a `Actor`.
-    /// ## `content`
-    /// a `Content`, or `None`
-    fn set_content<P: IsA<Content>>(&self, content: Option<&P>);
-
-    /// Sets the gravity of the `Content` used by `self`.
-    ///
-    /// See the description of the `Actor:content-gravity` property for
-    /// more information.
-    ///
-    /// The `Actor:content-gravity` property is animatable.
-    /// ## `gravity`
-    /// the `ContentGravity`
-    fn set_content_gravity(&self, gravity: ContentGravity);
-
-    /// Sets the policy for repeating the `Actor:content` of a
-    /// `Actor`. The behaviour is deferred to the `Content`
-    /// implementation.
-    /// ## `repeat`
-    /// the repeat policy
-    fn set_content_repeat(&self, repeat: ContentRepeat);
-
-    /// Sets the minification and magnification filter to be applied when
-    /// scaling the `Actor:content` of a `Actor`.
-    ///
-    /// The `Actor:minification-filter` will be used when reducing
-    /// the size of the content; the `Actor:magnification-filter`
-    /// will be used when increasing the size of the content.
-    /// ## `min_filter`
-    /// the minification filter for the content
-    /// ## `mag_filter`
-    /// the magnification filter for the content
-    fn set_content_scaling_filters(&self, min_filter: ScalingFilter, mag_filter: ScalingFilter);
-
-    /// Sets the delay that should be applied before tweening animatable
-    /// properties.
-    /// ## `msecs`
-    /// the delay before the start of the tweening, in milliseconds
-    fn set_easing_delay(&self, msecs: u32);
-
-    /// Sets the duration of the tweening for animatable properties
-    /// of `self` for the current easing state.
-    /// ## `msecs`
-    /// the duration of the easing, or `None`
-    fn set_easing_duration(&self, msecs: u32);
-
-    /// Sets the easing mode for the tweening of animatable properties
-    /// of `self`.
-    /// ## `mode`
-    /// an easing mode, excluding `AnimationMode::CustomMode`
-    fn set_easing_mode(&self, mode: AnimationMode);
-
-    /// Sets whether an actor has a fixed position set (and will thus be
-    /// unaffected by any layout manager).
-    /// ## `is_set`
-    /// whether to use fixed position
-    fn set_fixed_position_set(&self, is_set: bool);
-
-    /// Sets `flags` on `self`
-    ///
-    /// This function will emit notifications for the changed properties
-    /// ## `flags`
-    /// the flags to set
-    fn set_flags(&self, flags: ActorFlags);
-
-    /// Forces a height on an actor, causing the actor's preferred width
-    /// and height (if any) to be ignored.
-    ///
-    /// If `height` is -1 the actor will use its preferred height instead of
-    /// overriding it, i.e. you can "unset" the height with -1.
-    ///
-    /// This function sets both the minimum and natural size of the actor.
-    /// ## `height`
-    /// Requested new height for the actor, in pixels, or -1
-    fn set_height(&self, height: f32);
-
-    /// Sets the `LayoutManager` delegate object that will be used to
-    /// lay out the children of `self`.
-    ///
-    /// The `Actor` will take a reference on the passed `manager` which
-    /// will be released either when the layout manager is removed, or when
-    /// the actor is destroyed.
-    /// ## `manager`
-    /// a `LayoutManager`, or `None` to unset it
-    fn set_layout_manager<P: IsA<LayoutManager>>(&self, manager: Option<&P>);
-
-    /// Sets all the components of the margin of a `Actor`.
-    /// ## `margin`
-    /// a `Margin`
-    fn set_margin(&self, margin: &Margin);
-
-    /// Sets the margin from the bottom of a `Actor`.
-    ///
-    /// The `Actor:margin-bottom` property is animatable.
-    /// ## `margin`
-    /// the bottom margin
-    fn set_margin_bottom(&self, margin: f32);
-
-    /// Sets the margin from the left of a `Actor`.
-    ///
-    /// The `Actor:margin-left` property is animatable.
-    /// ## `margin`
-    /// the left margin
-    fn set_margin_left(&self, margin: f32);
-
-    /// Sets the margin from the right of a `Actor`.
-    ///
-    /// The `Actor:margin-right` property is animatable.
-    /// ## `margin`
-    /// the right margin
-    fn set_margin_right(&self, margin: f32);
-
-    /// Sets the margin from the top of a `Actor`.
-    ///
-    /// The `Actor:margin-top` property is animatable.
-    /// ## `margin`
-    /// the top margin
-    fn set_margin_top(&self, margin: f32);
-
-    /// Sets the given name to `self`. The name can be used to identify
-    /// a `Actor`.
-    /// ## `name`
-    /// Textual tag to apply to actor
-    fn set_name(&self, name: &str);
-
-    /// Defines the circumstances where the actor should be redirected into
-    /// an offscreen image. The offscreen image is used to flatten the
-    /// actor into a single image while painting for two main reasons.
-    /// Firstly, when the actor is painted a second time without any of its
-    /// contents changing it can simply repaint the cached image without
-    /// descending further down the actor hierarchy. Secondly, it will make
-    /// the opacity look correct even if there are overlapping primitives
-    /// in the actor.
-    ///
-    /// Caching the actor could in some cases be a performance win and in
-    /// some cases be a performance lose so it is important to determine
-    /// which value is right for an actor before modifying this value. For
-    /// example, there is never any reason to flatten an actor that is just
-    /// a single texture (such as a `Texture`) because it is
-    /// effectively already cached in an image so the offscreen would be
-    /// redundant. Also if the actor contains primitives that are far apart
-    /// with a large transparent area in the middle (such as a large
-    /// CluterGroup with a small actor in the top left and a small actor in
-    /// the bottom right) then the cached image will contain the entire
-    /// image of the large area and the paint will waste time blending all
-    /// of the transparent pixels in the middle.
-    ///
-    /// The default method of implementing opacity on a container simply
-    /// forwards on the opacity to all of the children. If the children are
-    /// overlapping then it will appear as if they are two separate glassy
-    /// objects and there will be a break in the color where they
-    /// overlap. By redirecting to an offscreen buffer it will be as if the
-    /// two opaque objects are combined into one and then made transparent
-    /// which is usually what is expected.
-    ///
-    /// The image below demonstrates the difference between redirecting and
-    /// not. The image shows two groups, each containing a red and
-    /// a green rectangle which overlap. The opacity on the group is set to
-    /// 128 (which is 50%). When the offscreen redirect is not used, the
-    /// red rectangle can be seen through the blue rectangle as if the two
-    /// rectangles were separately transparent. When the redirect is used
-    /// the group as a whole is transparent instead so the red rectangle is
-    /// not visible where they overlap.
-    ///
-    /// <figure id="offscreen-redirect">
-    ///  `<title>`Sample of using an offscreen redirect for transparency`</title>`
-    ///  <graphic fileref="offscreen-redirect.png" format="PNG"/>
-    /// `</figure>`
-    ///
-    /// The default value for this property is 0, so we effectively will
-    /// never redirect an actor offscreen by default. This means that there
-    /// are times that transparent actors may look glassy as described
-    /// above. The reason this is the default is because there is a
-    /// performance trade off between quality and performance here. In many
-    /// cases the default form of glassy opacity looks good enough, but if
-    /// it's not you will need to set the
-    /// `OffscreenRedirect::AutomaticForOpacity` flag to enable
-    /// redirection for opacity.
-    ///
-    /// Custom actors that don't contain any overlapping primitives are
-    /// recommended to override the `has_overlaps` virtual to return `false`
-    /// for maximum efficiency.
-    /// ## `redirect`
-    /// New offscreen redirect flags for the actor.
-    fn set_offscreen_redirect(&self, redirect: OffscreenRedirect);
-
-    /// Sets the actor's opacity, with zero being completely transparent and
-    /// 255 (0xff) being fully opaque.
-    ///
-    /// The `Actor:opacity` property is animatable.
-    /// ## `opacity`
-    /// New opacity value for the actor.
-    fn set_opacity(&self, opacity: u8);
-
-    /// Sets the position of the `Actor:pivot-point` around which the
-    /// scaling and rotation transformations occur.
-    ///
-    /// The pivot point's coordinates are in normalized space, with the (0, 0)
-    /// point being the top left corner of the actor, and the (1, 1) point being
-    /// the bottom right corner.
-    /// ## `pivot_x`
-    /// the normalized X coordinate of the pivot point
-    /// ## `pivot_y`
-    /// the normalized Y coordinate of the pivot point
-    fn set_pivot_point(&self, pivot_x: f32, pivot_y: f32);
-
-    /// Sets the component on the Z axis of the `Actor:pivot-point` around
-    /// which the scaling and rotation transformations occur.
-    ///
-    /// The `pivot_z` value is expressed as a distance along the Z axis.
-    /// ## `pivot_z`
-    /// the Z coordinate of the actor's pivot point
-    fn set_pivot_point_z(&self, pivot_z: f32);
-
-    /// Sets the actor's fixed position in pixels relative to any parent
-    /// actor.
-    ///
-    /// If a layout manager is in use, this position will override the
-    /// layout manager and force a fixed position.
-    /// ## `x`
-    /// New left position of actor in pixels.
-    /// ## `y`
-    /// New top position of actor in pixels.
-    fn set_position(&self, x: f32, y: f32);
-
-    /// Sets `self` as reactive. Reactive actors will receive events.
-    /// ## `reactive`
-    /// whether the actor should be reactive to events
-    fn set_reactive(&self, reactive: bool);
-
-    /// Sets the geometry request mode of `self`.
-    ///
-    /// The `mode` determines the order for invoking
-    /// `ActorExt::get_preferred_width` and
-    /// `ActorExt::get_preferred_height`
-    /// ## `mode`
-    /// the request mode
-    fn set_request_mode(&self, mode: RequestMode);
-
-    /// Sets the `angle` of rotation of a `Actor` on the given `axis`.
-    ///
-    /// This function is a convenience for setting the rotation properties
-    /// `Actor:rotation-angle-x`, `Actor:rotation-angle-y`,
-    /// and `Actor:rotation-angle-z`.
-    ///
-    /// The center of rotation is established by the `Actor:pivot-point`
-    /// property.
-    /// ## `axis`
-    /// the axis to set the angle one
-    /// ## `angle`
-    /// the angle of rotation, in degrees
-    fn set_rotation_angle(&self, axis: RotateAxis, angle: f64);
-
-    /// Scales an actor with the given factors.
-    ///
-    /// The scale transformation is relative the the `Actor:pivot-point`.
-    ///
-    /// The `Actor:scale-x` and `Actor:scale-y` properties are
-    /// animatable.
-    /// ## `scale_x`
-    /// double factor to scale actor by horizontally.
-    /// ## `scale_y`
-    /// double factor to scale actor by vertically.
-    fn set_scale(&self, scale_x: f64, scale_y: f64);
-
-    /// Scales an actor on the Z axis by the given `scale_z` factor.
-    ///
-    /// The scale transformation is relative the the `Actor:pivot-point`.
-    ///
-    /// The `Actor:scale-z` property is animatable.
-    /// ## `scale_z`
-    /// the scaling factor along the Z axis
-    fn set_scale_z(&self, scale_z: f64);
-
-    /// Sets the actor's size request in pixels. This overrides any
-    /// "normal" size request the actor would have. For example
-    /// a text actor might normally request the size of the text;
-    /// this function would force a specific size instead.
-    ///
-    /// If `width` and/or `height` are -1 the actor will use its
-    /// "normal" size request instead of overriding it, i.e.
-    /// you can "unset" the size with -1.
-    ///
-    /// This function sets or unsets both the minimum and natural size.
-    /// ## `width`
-    /// New width of actor in pixels, or -1
-    /// ## `height`
-    /// New height of actor in pixels, or -1
-    fn set_size(&self, width: f32, height: f32);
-
-    /// Sets the `TextDirection` for an actor
-    ///
-    /// The passed text direction must not be `TextDirection::Default`
-    ///
-    /// If `self` implements `Container` then this function will recurse
-    /// inside all the children of `self` (including the internal ones).
-    ///
-    /// Composite actors not implementing `Container`, or actors requiring
-    /// special handling when the text direction changes, should connect to
-    /// the `gobject::Object::notify` signal for the `Actor:text-direction` property
-    /// ## `text_dir`
-    /// the text direction for `self`
-    fn set_text_direction(&self, text_dir: TextDirection);
-
-    /// Overrides the transformations of a `Actor` with a custom
-    /// matrix, which will be applied relative to the origin of the
-    /// actor's allocation and to the actor's pivot point.
-    ///
-    /// The `Actor:transform` property is animatable.
-    /// ## `transform`
-    /// a `Matrix`, or `None` to
-    ///  unset a custom transformation
-    fn set_transform(&self, transform: Option<&Matrix>);
-
-    /// Sets an additional translation transformation on a `Actor`,
-    /// relative to the `Actor:pivot-point`.
-    /// ## `translate_x`
-    /// the translation along the X axis
-    /// ## `translate_y`
-    /// the translation along the Y axis
-    /// ## `translate_z`
-    /// the translation along the Z axis
-    fn set_translation(&self, translate_x: f32, translate_y: f32, translate_z: f32);
-
-    /// Forces a width on an actor, causing the actor's preferred width
-    /// and height (if any) to be ignored.
-    ///
-    /// If `width` is -1 the actor will use its preferred width request
-    /// instead of overriding it, i.e. you can "unset" the width with -1.
-    ///
-    /// This function sets both the minimum and natural size of the actor.
-    /// ## `width`
-    /// Requested new width for the actor, in pixels, or -1
-    fn set_width(&self, width: f32);
-
-    /// Sets the actor's X coordinate, relative to its parent, in pixels.
-    ///
-    /// Overrides any layout manager and forces a fixed position for
-    /// the actor.
-    ///
-    /// The `Actor:x` property is animatable.
-    /// ## `x`
-    /// the actor's position on the X axis
-    fn set_x(&self, x: f32);
-
-    /// Sets the horizontal alignment policy of a `Actor`, in case the
-    /// actor received extra horizontal space.
-    ///
-    /// See also the `Actor:x-align` property.
-    /// ## `x_align`
-    /// the horizontal alignment policy
-    fn set_x_align(&self, x_align: ActorAlign);
-
-    /// Sets whether a `Actor` should expand horizontally; this means
-    /// that layout manager should allocate extra space for the actor, if
-    /// possible.
-    ///
-    /// Setting an actor to expand will also make all its parent expand, so
-    /// that it's possible to build an actor tree and only set this flag on
-    /// its leaves and not on every single actor.
-    /// ## `expand`
-    /// whether the actor should expand horizontally
-    fn set_x_expand(&self, expand: bool);
-
-    /// Sets the actor's Y coordinate, relative to its parent, in pixels.#
-    ///
-    /// Overrides any layout manager and forces a fixed position for
-    /// the actor.
-    ///
-    /// The `Actor:y` property is animatable.
-    /// ## `y`
-    /// the actor's position on the Y axis
-    fn set_y(&self, y: f32);
-
-    /// Sets the vertical alignment policy of a `Actor`, in case the
-    /// actor received extra vertical space.
-    ///
-    /// See also the `Actor:y-align` property.
-    /// ## `y_align`
-    /// the vertical alignment policy
-    fn set_y_align(&self, y_align: ActorAlign);
-
-    /// Sets whether a `Actor` should expand horizontally; this means
-    /// that layout manager should allocate extra space for the actor, if
-    /// possible.
-    ///
-    /// Setting an actor to expand will also make all its parent expand, so
-    /// that it's possible to build an actor tree and only set this flag on
-    /// its leaves and not on every single actor.
-    /// ## `expand`
-    /// whether the actor should expand vertically
-    fn set_y_expand(&self, expand: bool);
-
-    /// Sets the actor's position on the Z axis.
-    ///
-    /// See `Actor:z-position`.
-    /// ## `z_position`
-    /// the position on the Z axis
-    fn set_z_position(&self, z_position: f32);
-
-    /// Should be called inside the implementation of the
-    /// `Actor::pick` virtual function in order to check whether
-    /// the actor should paint itself in pick mode or not.
-    ///
-    /// This function should never be called directly by applications.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor should paint its silhouette,
-    ///  `false` otherwise
-    fn should_pick_paint(&self) -> bool;
-
-    /// Flags an actor to be displayed. An actor that isn't shown will not
-    /// be rendered on the stage.
-    ///
-    /// Actors are visible by default.
-    ///
-    /// If this function is called on an actor without a parent, the
-    /// `Actor:show-on-set-parent` will be set to `true` as a side
-    /// effect.
-    fn show(&self);
-
-    /// This function translates screen coordinates (`x`, `y`) to
-    /// coordinates relative to the actor. For example, it can be used to translate
-    /// screen events from global screen coordinates into actor-local coordinates.
-    ///
-    /// The conversion can fail, notably if the transform stack results in the
-    /// actor being projected on the screen as a mere line.
-    ///
-    /// The conversion should not be expected to be pixel-perfect due to the
-    /// nature of the operation. In general the error grows when the skewing
-    /// of the actor rectangle on screen increases.
-    ///
-    /// This function can be computationally intensive.
-    ///
-    /// This function only works when the allocation is up-to-date, i.e. inside of
-    /// the `ActorClass.paint`() implementation
-    /// ## `x`
-    /// x screen coordinate of the point to unproject
-    /// ## `y`
-    /// y screen coordinate of the point to unproject
-    /// ## `x_out`
-    /// return location for the unprojected x coordinance
-    /// ## `y_out`
-    /// return location for the unprojected y coordinance
-    ///
-    /// # Returns
-    ///
-    /// `true` if conversion was successful.
-    fn transform_stage_point(&self, x: f32, y: f32) -> Option<(f32, f32)>;
-
-    /// Unsets the `ActorFlags::Mapped` flag on the actor and possibly
-    /// unmaps its children if they were mapped.
-    ///
-    /// Calling this function is not encouraged: the default `Actor`
-    /// implementation of `ActorClass.unmap`() will also unmap any
-    /// eventual children by default when their parent is unmapped.
-    ///
-    /// When overriding `ActorClass.unmap`(), it is mandatory to
-    /// chain up to the parent implementation.
-    ///
-    /// It is important to note that the implementation of the
-    /// `ActorClass.unmap`() virtual function may be called after
-    /// the `ActorClass.destroy`() or the `gobject::ObjectClass.dispose`()
-    /// implementation, but it is guaranteed to be called before the
-    /// `gobject::ObjectClass.finalize`() implementation.
-    fn unmap(&self);
-
-    /// Unsets `flags` on `self`
-    ///
-    /// This function will emit notifications for the changed properties
-    /// ## `flags`
-    /// the flags to unset
-    fn unset_flags(&self, flags: ActorFlags);
-
-    /// Adds a `Action` to the actor
-    fn set_property_actions<P: IsA<Action> + SetValueOptional>(&self, actions: Option<&P>);
-
-    /// The allocation for the actor, in pixels
-    ///
-    /// This is property is read-only, but you might monitor it to know when an
-    /// actor moves or resizes
-    fn get_property_allocation(&self) -> Option<ActorBox>;
-
-    /// Whether the `Actor:background-color` property has been set.
-    fn get_property_background_color_set(&self) -> bool;
-
-    /// Whether the `Actor:child-transform` property is set.
-    fn get_property_child_transform_set(&self) -> bool;
-
-    /// The visible region of the actor, in actor-relative coordinates,
-    /// expressed as a `Rect`.
-    ///
-    /// Setting this property to `None` will unset the existing clip.
-    ///
-    /// Setting this property will change the `Actor:has-clip`
-    /// property as a side effect.
-    fn get_property_clip_rect(&self) -> Option<InternalRect>;
-
-    /// The visible region of the actor, in actor-relative coordinates,
-    /// expressed as a `Rect`.
-    ///
-    /// Setting this property to `None` will unset the existing clip.
-    ///
-    /// Setting this property will change the `Actor:has-clip`
-    /// property as a side effect.
-    fn set_property_clip_rect(&self, clip_rect: Option<&InternalRect>);
-
-    /// Adds a `Constraint` to the actor
-    fn set_property_constraints<P: IsA<Constraint> + SetValueOptional>(
-        &self,
-        constraints: Option<&P>,
-    );
-
-    /// Adds `Effect` to the list of effects be applied on a `Actor`
-    fn set_property_effect<P: IsA<Effect> + SetValueOptional>(&self, effect: Option<&P>);
-
-    /// The fixed X position of the actor in pixels.
-    ///
-    /// Writing this property sets `Actor:fixed-position-set`
-    /// property as well, as a side effect
-    fn get_property_fixed_x(&self) -> f32;
-
-    /// The fixed X position of the actor in pixels.
-    ///
-    /// Writing this property sets `Actor:fixed-position-set`
-    /// property as well, as a side effect
-    fn set_property_fixed_x(&self, fixed_x: f32);
-
-    /// The fixed Y position of the actor in pixels.
-    ///
-    /// Writing this property sets the `Actor:fixed-position-set`
-    /// property as well, as a side effect
-    fn get_property_fixed_y(&self) -> f32;
-
-    /// The fixed Y position of the actor in pixels.
-    ///
-    /// Writing this property sets the `Actor:fixed-position-set`
-    /// property as well, as a side effect
-    fn set_property_fixed_y(&self, fixed_y: f32);
-
-    /// Whether the actor has the `Actor:clip` property set or not
-    fn get_property_has_clip(&self) -> bool;
-
-    /// Whether the actor contains the pointer of a `InputDevice`
-    /// or not.
-    fn get_property_has_pointer(&self) -> bool;
-
-    fn get_property_magnification_filter(&self) -> ScalingFilter;
-
-    fn set_property_magnification_filter(&self, magnification_filter: ScalingFilter);
-
-    /// Whether the actor is mapped (will be painted when the stage
-    /// to which it belongs is mapped)
-    fn get_property_mapped(&self) -> bool;
-
-    /// A forced minimum height request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:min-height-set` property
-    /// as well, as a side effect. This property overrides the usual height
-    /// request of the actor.
-    fn get_property_min_height(&self) -> f32;
-
-    /// A forced minimum height request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:min-height-set` property
-    /// as well, as a side effect. This property overrides the usual height
-    /// request of the actor.
-    fn set_property_min_height(&self, min_height: f32);
-
-    /// This flag controls whether the `Actor:min-height` property
-    /// is used
-    fn get_property_min_height_set(&self) -> bool;
-
-    /// This flag controls whether the `Actor:min-height` property
-    /// is used
-    fn set_property_min_height_set(&self, min_height_set: bool);
-
-    /// A forced minimum width request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:min-width-set` property
-    /// as well, as a side effect.
-    ///
-    /// This property overrides the usual width request of the actor.
-    fn get_property_min_width(&self) -> f32;
-
-    /// A forced minimum width request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:min-width-set` property
-    /// as well, as a side effect.
-    ///
-    /// This property overrides the usual width request of the actor.
-    fn set_property_min_width(&self, min_width: f32);
-
-    /// This flag controls whether the `Actor:min-width` property
-    /// is used
-    fn get_property_min_width_set(&self) -> bool;
-
-    /// This flag controls whether the `Actor:min-width` property
-    /// is used
-    fn set_property_min_width_set(&self, min_width_set: bool);
-
-    fn get_property_minification_filter(&self) -> ScalingFilter;
-
-    fn set_property_minification_filter(&self, minification_filter: ScalingFilter);
-
-    /// A forced natural height request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:natural-height-set`
-    /// property as well, as a side effect. This property overrides the
-    /// usual height request of the actor
-    fn get_property_natural_height(&self) -> f32;
-
-    /// A forced natural height request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:natural-height-set`
-    /// property as well, as a side effect. This property overrides the
-    /// usual height request of the actor
-    fn set_property_natural_height(&self, natural_height: f32);
-
-    /// This flag controls whether the `Actor:natural-height` property
-    /// is used
-    fn get_property_natural_height_set(&self) -> bool;
-
-    /// This flag controls whether the `Actor:natural-height` property
-    /// is used
-    fn set_property_natural_height_set(&self, natural_height_set: bool);
-
-    /// A forced natural width request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:natural-width-set`
-    /// property as well, as a side effect. This property overrides the
-    /// usual width request of the actor
-    fn get_property_natural_width(&self) -> f32;
-
-    /// A forced natural width request for the actor, in pixels
-    ///
-    /// Writing this property sets the `Actor:natural-width-set`
-    /// property as well, as a side effect. This property overrides the
-    /// usual width request of the actor
-    fn set_property_natural_width(&self, natural_width: f32);
-
-    /// This flag controls whether the `Actor:natural-width` property
-    /// is used
-    fn get_property_natural_width_set(&self) -> bool;
-
-    /// This flag controls whether the `Actor:natural-width` property
-    /// is used
-    fn set_property_natural_width_set(&self, natural_width_set: bool);
-
-    /// Whether the actor has been realized
-    fn get_property_realized(&self) -> bool;
-
-    /// The rotation angle on the X axis.
-    ///
-    /// The `Actor:rotation-angle-x` property is animatable.
-    fn get_property_rotation_angle_x(&self) -> f64;
-
-    /// The rotation angle on the X axis.
-    ///
-    /// The `Actor:rotation-angle-x` property is animatable.
-    fn set_property_rotation_angle_x(&self, rotation_angle_x: f64);
-
-    /// The rotation angle on the Y axis
-    ///
-    /// The `Actor:rotation-angle-y` property is animatable.
-    fn get_property_rotation_angle_y(&self) -> f64;
-
-    /// The rotation angle on the Y axis
-    ///
-    /// The `Actor:rotation-angle-y` property is animatable.
-    fn set_property_rotation_angle_y(&self, rotation_angle_y: f64);
-
-    /// The rotation angle on the Z axis
-    ///
-    /// The `Actor:rotation-angle-z` property is animatable.
-    fn get_property_rotation_angle_z(&self) -> f64;
-
-    /// The rotation angle on the Z axis
-    ///
-    /// The `Actor:rotation-angle-z` property is animatable.
-    fn set_property_rotation_angle_z(&self, rotation_angle_z: f64);
-
-    /// The horizontal scale of the actor.
-    ///
-    /// The `Actor:scale-x` property is animatable.
-    fn get_property_scale_x(&self) -> f64;
-
-    /// The horizontal scale of the actor.
-    ///
-    /// The `Actor:scale-x` property is animatable.
-    fn set_property_scale_x(&self, scale_x: f64);
-
-    /// The vertical scale of the actor.
-    ///
-    /// The `Actor:scale-y` property is animatable.
-    fn get_property_scale_y(&self) -> f64;
-
-    /// The vertical scale of the actor.
-    ///
-    /// The `Actor:scale-y` property is animatable.
-    fn set_property_scale_y(&self, scale_y: f64);
-
-    /// If `true`, the actor is automatically shown when parented.
-    ///
-    /// Calling `ActorExt::hide` on an actor which has not been
-    /// parented will set this property to `false` as a side effect.
-    fn get_property_show_on_set_parent(&self) -> bool;
-
-    /// If `true`, the actor is automatically shown when parented.
-    ///
-    /// Calling `ActorExt::hide` on an actor which has not been
-    /// parented will set this property to `false` as a side effect.
-    fn set_property_show_on_set_parent(&self, show_on_set_parent: bool);
-
-    /// Whether the `Actor:transform` property is set.
-    fn get_property_transform_set(&self) -> bool;
-
-    /// An additional translation applied along the X axis, relative
-    /// to the actor's `Actor:pivot-point`.
-    ///
-    /// The `Actor:translation-x` property is animatable.
-    fn get_property_translation_x(&self) -> f32;
-
-    /// An additional translation applied along the X axis, relative
-    /// to the actor's `Actor:pivot-point`.
-    ///
-    /// The `Actor:translation-x` property is animatable.
-    fn set_property_translation_x(&self, translation_x: f32);
-
-    /// An additional translation applied along the Y axis, relative
-    /// to the actor's `Actor:pivot-point`.
-    ///
-    /// The `Actor:translation-y` property is animatable.
-    fn get_property_translation_y(&self) -> f32;
-
-    /// An additional translation applied along the Y axis, relative
-    /// to the actor's `Actor:pivot-point`.
-    ///
-    /// The `Actor:translation-y` property is animatable.
-    fn set_property_translation_y(&self, translation_y: f32);
-
-    /// An additional translation applied along the Z axis, relative
-    /// to the actor's `Actor:pivot-point`.
-    ///
-    /// The `Actor:translation-z` property is animatable.
-    fn get_property_translation_z(&self) -> f32;
-
-    /// An additional translation applied along the Z axis, relative
-    /// to the actor's `Actor:pivot-point`.
-    ///
-    /// The `Actor:translation-z` property is animatable.
-    fn set_property_translation_z(&self, translation_z: f32);
-
-    /// Whether the actor is set to be visible or not
-    ///
-    /// See also `Actor:mapped`
-    fn get_property_visible(&self) -> bool;
-
-    /// Whether the actor is set to be visible or not
-    ///
-    /// See also `Actor:mapped`
-    fn set_property_visible(&self, visible: bool);
-
-    /// The ::allocation-changed signal is emitted when the
-    /// `Actor:allocation` property changes. Usually, application
-    /// code should just use the notifications for the :allocation property
-    /// but if you want to track the allocation flags as well, for instance
-    /// to know whether the absolute origin of `actor` changed, then you might
-    /// want use this signal instead.
-    /// ## `box_`
-    /// a `ActorBox` with the new allocation
-    /// ## `flags`
-    /// `AllocationFlags` for the allocation
-    fn connect_allocation_changed<F: Fn(&Self, &ActorBox, AllocationFlags) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::button-press-event signal is emitted each time a mouse button
-    /// is pressed on `actor`.
-    /// ## `event`
-    /// a `ButtonEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_button_press_event<F: Fn(&Self, &ButtonEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::button-release-event signal is emitted each time a mouse button
-    /// is released on `actor`.
-    /// ## `event`
-    /// a `ButtonEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_button_release_event<F: Fn(&Self, &ButtonEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::captured-event signal is emitted when an event is captured.
-    /// This signal will be emitted starting from the top-level
-    /// container (the `Stage`) to the actor which received the event
-    /// going down the hierarchy. This signal can be used to intercept every
-    /// event before the specialized events (like
-    /// Actor::button-press-event or ::key-released-event) are
-    /// emitted.
-    /// ## `event`
-    /// a `Event`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_captured_event<F: Fn(&Self, &Event) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::destroy signal notifies that all references held on the
-    /// actor which emitted it should be released.
-    ///
-    /// The ::destroy signal should be used by all holders of a reference
-    /// on `actor`.
-    ///
-    /// This signal might result in the finalization of the `Actor`
-    /// if all references are released.
-    ///
-    /// Composite actors and actors implementing the `Container`
-    /// interface should override the default implementation of the
-    /// class handler of this signal and call `ActorExt::destroy` on
-    /// their children. When overriding the default class handler, it is
-    /// required to chain up to the parent's implementation.
-    fn connect_destroy<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::enter-event signal is emitted when the pointer enters the `actor`
-    /// ## `event`
-    /// a `CrossingEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_enter_event<F: Fn(&Self, &CrossingEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::event signal is emitted each time an event is received
-    /// by the `actor`. This signal will be emitted on every actor,
-    /// following the hierarchy chain, until it reaches the top-level
-    /// container (the `Stage`).
-    /// ## `event`
-    /// a `Event`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::hide signal is emitted when an actor is no longer rendered
-    /// on the stage.
-    fn connect_hide<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::key-focus-in signal is emitted when `actor` receives key focus.
-    fn connect_key_focus_in<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::key-focus-out signal is emitted when `actor` loses key focus.
-    fn connect_key_focus_out<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::key-press-event signal is emitted each time a keyboard button
-    /// is pressed while `actor` has key focus (see `StageExt::set_key_focus`).
-    /// ## `event`
-    /// a `KeyEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_key_press_event<F: Fn(&Self, &KeyEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::key-release-event signal is emitted each time a keyboard button
-    /// is released while `actor` has key focus (see
-    /// `StageExt::set_key_focus`).
-    /// ## `event`
-    /// a `KeyEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_key_release_event<F: Fn(&Self, &KeyEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::leave-event signal is emitted when the pointer leaves the `actor`.
-    /// ## `event`
-    /// a `CrossingEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_leave_event<F: Fn(&Self, &CrossingEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::motion-event signal is emitted each time the mouse pointer is
-    /// moved over `actor`.
-    /// ## `event`
-    /// a `MotionEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_motion_event<F: Fn(&Self, &MotionEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// This signal is emitted when the parent of the actor changes.
-    /// ## `old_parent`
-    /// the previous parent of the actor, or `None`
-    fn connect_parent_set<F: Fn(&Self, Option<&Actor>) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::queue_redraw signal is emitted when `ActorExt::queue_redraw`
-    /// is called on `origin`.
-    ///
-    /// The default implementation for `Actor` chains up to the
-    /// parent actor and queues a redraw on the parent, thus "bubbling"
-    /// the redraw queue up through the actor graph. The default
-    /// implementation for `Stage` queues a `StageExt::ensure_redraw`
-    /// in a main loop idle handler.
-    ///
-    /// Note that the `origin` actor may be the stage, or a container; it
-    /// does not have to be a leaf node in the actor graph.
-    ///
-    /// Toolkits embedding a `Stage` which require a redraw and
-    /// relayout cycle can stop the emission of this signal using the
-    /// GSignal API, redraw the UI and then call `StageExt::ensure_redraw`
-    /// themselves, like:
-    ///
-    ///
-    /// ```C
-    ///   static void
-    ///   on_redraw_complete (gpointer data)
-    ///   {
-    ///     Stage *stage = data;
-    ///
-    ///     // execute the drawing pipeline
-    ///     stage_ensure_redraw (stage);
-    ///   }
-    ///
-    ///   static void
-    ///   on_stage_queue_redraw (Stage *stage)
-    ///   {
-    ///     // this prevents the default handler to run
-    ///     g_signal_stop_emission_by_name (stage, "queue-redraw");
-    ///
-    ///     // queue a redraw with the host toolkit and call
-    ///     // a function when the redraw has been completed
-    ///     queue_a_redraw (G_CALLBACK (on_redraw_complete), stage);
-    ///   }
-    /// ```
-    ///
-    /// Note: This signal is emitted before the paint
-    /// pipeline is executed. If you want to know when the pipeline has
-    /// been completed you should use `threads_add_repaint_func`
-    /// or `threads_add_repaint_func_full`.
-    /// ## `origin`
-    /// the actor which initiated the redraw request
-    fn connect_queue_redraw<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::queue_layout signal is emitted when `ActorExt::queue_relayout`
-    /// is called on an actor.
-    ///
-    /// The default implementation for `Actor` chains up to the
-    /// parent actor and queues a relayout on the parent, thus "bubbling"
-    /// the relayout queue up through the actor graph.
-    ///
-    /// The main purpose of this signal is to allow relayout to be propagated
-    /// properly in the presence of `Clone` actors. Applications will
-    /// not normally need to connect to this signal.
-    fn connect_queue_relayout<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::scroll-event signal is emitted each time the mouse is
-    /// scrolled on `actor`
-    /// ## `event`
-    /// a `ScrollEvent`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the event has been handled by the actor,
-    ///  or `false` to continue the emission.
-    fn connect_scroll_event<F: Fn(&Self, &ScrollEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::show signal is emitted when an actor is visible and
-    /// rendered on the stage.
-    fn connect_show<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::touch-event signal is emitted each time a touch
-    /// begin/end/update/cancel event.
-    /// ## `event`
-    /// a `Event`
-    ///
-    /// # Returns
-    ///
-    /// `EVENT_STOP` if the event has been handled by
-    ///  the actor, or `EVENT_PROPAGATE` to continue the emission.
-    fn connect_touch_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::transition-stopped signal is emitted once a transition
-    /// is stopped; a transition is stopped once it reached its total
-    /// duration (including eventual repeats), it has been stopped
-    /// using `TimelineExt::stop`, or it has been removed from the
-    /// transitions applied on `actor`, using `ActorExt::remove_transition`.
-    /// ## `name`
-    /// the name of the transition
-    /// ## `is_finished`
-    /// whether the transition was finished, or stopped
-    fn connect_transition_stopped<F: Fn(&Self, &str, bool) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::transitions-completed signal is emitted once all transitions
-    /// involving `actor` are complete.
-    fn connect_transitions_completed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_actions_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_allocation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_background_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_background_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_child_transform_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_child_transform_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_clip_rect_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_clip_to_allocation_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_constraints_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_content_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_content_box_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_content_gravity_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_content_repeat_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_effect_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_first_child_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_fixed_position_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_fixed_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_fixed_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_has_clip_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_has_pointer_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_last_child_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_layout_manager_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_magnification_filter_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_mapped_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_margin_bottom_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_margin_left_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_margin_right_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_margin_top_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_min_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_min_height_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_min_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_min_width_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_minification_filter_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_name_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_natural_height_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_natural_height_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_natural_width_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_natural_width_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_offscreen_redirect_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_opacity_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_pivot_point_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_pivot_point_z_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_position_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_reactive_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_realized_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_request_mode_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_rotation_angle_x_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_rotation_angle_y_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_rotation_angle_z_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_scale_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_scale_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_scale_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_show_on_set_parent_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_text_direction_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_transform_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_transform_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_translation_x_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_translation_y_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_translation_z_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_visible_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_x_align_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_x_expand_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_y_align_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_y_expand_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_z_position_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Actor>> ActorExt for O {
-    fn add_action<P: IsA<Action>>(&self, action: &P) {
-        unsafe {
-            ffi::clutter_actor_add_action(
-                self.as_ref().to_glib_none().0,
-                action.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_action_with_name<P: IsA<Action>>(&self, name: &str, action: &P) {
-        unsafe {
-            ffi::clutter_actor_add_action_with_name(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-                action.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_child<P: IsA<Actor>>(&self, child: &P) {
-        unsafe {
-            ffi::clutter_actor_add_child(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_constraint<P: IsA<Constraint>>(&self, constraint: &P) {
-        unsafe {
-            ffi::clutter_actor_add_constraint(
-                self.as_ref().to_glib_none().0,
-                constraint.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_constraint_with_name<P: IsA<Constraint>>(&self, name: &str, constraint: &P) {
-        unsafe {
-            ffi::clutter_actor_add_constraint_with_name(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-                constraint.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_effect<P: IsA<Effect>>(&self, effect: &P) {
-        unsafe {
-            ffi::clutter_actor_add_effect(
-                self.as_ref().to_glib_none().0,
-                effect.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_effect_with_name<P: IsA<Effect>>(&self, name: &str, effect: &P) {
-        unsafe {
-            ffi::clutter_actor_add_effect_with_name(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-                effect.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_transition<P: IsA<Transition>>(&self, name: &str, transition: &P) {
-        unsafe {
-            ffi::clutter_actor_add_transition(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-                transition.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn allocate(&self, box_: &ActorBox, flags: AllocationFlags) {
-        unsafe {
-            ffi::clutter_actor_allocate(
-                self.as_ref().to_glib_none().0,
-                box_.to_glib_none().0,
-                flags.to_glib(),
-            );
-        }
-    }
-
-    fn allocate_align_fill(
-        &self,
-        box_: &ActorBox,
-        x_align: f64,
-        y_align: f64,
-        x_fill: bool,
-        y_fill: bool,
-        flags: AllocationFlags,
-    ) {
-        unsafe {
-            ffi::clutter_actor_allocate_align_fill(
-                self.as_ref().to_glib_none().0,
-                box_.to_glib_none().0,
-                x_align,
-                y_align,
-                x_fill.to_glib(),
-                y_fill.to_glib(),
-                flags.to_glib(),
-            );
-        }
-    }
-
-    fn allocate_available_size(
-        &self,
-        x: f32,
-        y: f32,
-        available_width: f32,
-        available_height: f32,
-        flags: AllocationFlags,
-    ) {
-        unsafe {
-            ffi::clutter_actor_allocate_available_size(
-                self.as_ref().to_glib_none().0,
-                x,
-                y,
-                available_width,
-                available_height,
-                flags.to_glib(),
-            );
-        }
-    }
-
-    fn allocate_preferred_size(&self, flags: AllocationFlags) {
-        unsafe {
-            ffi::clutter_actor_allocate_preferred_size(
-                self.as_ref().to_glib_none().0,
-                flags.to_glib(),
-            );
-        }
-    }
-
-    fn apply_relative_transform_to_point<P: IsA<Actor>>(
-        &self,
-        ancestor: Option<&P>,
-        point: &Vertex,
-    ) -> Vertex {
-        unsafe {
-            let mut vertex = Vertex::uninitialized();
-            ffi::clutter_actor_apply_relative_transform_to_point(
-                self.as_ref().to_glib_none().0,
-                ancestor.map(|p| p.as_ref()).to_glib_none().0,
-                point.to_glib_none().0,
-                vertex.to_glib_none_mut().0,
-            );
-            vertex
-        }
-    }
-
-    fn apply_transform_to_point(&self, point: &Vertex) -> Vertex {
-        unsafe {
-            let mut vertex = Vertex::uninitialized();
-            ffi::clutter_actor_apply_transform_to_point(
-                self.as_ref().to_glib_none().0,
-                point.to_glib_none().0,
-                vertex.to_glib_none_mut().0,
-            );
-            vertex
-        }
-    }
-
-    fn bind_model<P: IsA<gio::ListModel>, Q: Fn(&glib::Object) -> Actor + 'static>(
-        &self,
-        model: Option<&P>,
-        create_child_func: Q,
-    ) {
-        let create_child_func_data: Box_<Q> = Box_::new(create_child_func);
-        unsafe extern "C" fn create_child_func_func<
-            P: IsA<gio::ListModel>,
-            Q: Fn(&glib::Object) -> Actor + 'static,
-        >(
-            item: *mut gobject_sys::GObject,
-            user_data: glib_sys::gpointer,
-        ) -> *mut ffi::ClutterActor {
-            let item = from_glib_borrow(item);
-            let callback: &Q = &*(user_data as *mut _);
-            let res = (*callback)(&item);
-            res.to_glib_full()
-        }
-        let create_child_func = Some(create_child_func_func::<P, Q> as _);
-        unsafe extern "C" fn notify_func<
-            P: IsA<gio::ListModel>,
-            Q: Fn(&glib::Object) -> Actor + 'static,
-        >(
-            data: glib_sys::gpointer,
-        ) {
-            let _callback: Box_<Q> = Box_::from_raw(data as *mut _);
-        }
-        let destroy_call4 = Some(notify_func::<P, Q> as _);
-        let super_callback0: Box_<Q> = create_child_func_data;
-        unsafe {
-            ffi::clutter_actor_bind_model(
-                self.as_ref().to_glib_none().0,
-                model.map(|p| p.as_ref()).to_glib_none().0,
-                create_child_func,
-                Box_::into_raw(super_callback0) as *mut _,
-                destroy_call4,
-            );
-        }
-    }
-
-    //fn bind_model_with_properties<P: IsA<gio::ListModel>>(&self, model: &P, child_type: glib::types::Type, first_model_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_actor_bind_model_with_properties() }
-    //}
-
-    fn clear_actions(&self) {
-        unsafe {
-            ffi::clutter_actor_clear_actions(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn clear_constraints(&self) {
-        unsafe {
-            ffi::clutter_actor_clear_constraints(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn clear_effects(&self) {
-        unsafe {
-            ffi::clutter_actor_clear_effects(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn contains<P: IsA<Actor>>(&self, descendant: &P) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_contains(
-                self.as_ref().to_glib_none().0,
-                descendant.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn continue_paint(&self) {
-        unsafe {
-            ffi::clutter_actor_continue_paint(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn create_pango_context(&self) -> Option<pango::Context> {
-        unsafe {
-            from_glib_full(ffi::clutter_actor_create_pango_context(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn create_pango_layout(&self, text: Option<&str>) -> Option<pango::Layout> {
-        unsafe {
-            from_glib_full(ffi::clutter_actor_create_pango_layout(
-                self.as_ref().to_glib_none().0,
-                text.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn destroy(&self) {
-        unsafe {
-            ffi::clutter_actor_destroy(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn destroy_all_children(&self) {
-        unsafe {
-            ffi::clutter_actor_destroy_all_children(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn event(&self, event: &Event, capture: bool) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_event(
-                self.as_ref().to_glib_none().0,
-                event.to_glib_none().0,
-                capture.to_glib(),
-            ))
-        }
-    }
-
-    //fn get_abs_allocation_vertices(&self, verts: /*Unimplemented*/FixedArray TypeId { ns_id: 1, id: 16 }; 4) {
-    //    unsafe { TODO: call clutter_sys:clutter_actor_get_abs_allocation_vertices() }
-    //}
-
-    fn get_action(&self, name: &str) -> Option<Action> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_action(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_actions(&self) -> Vec<Action> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_actions(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_allocation_box(&self) -> ActorBox {
-        unsafe {
-            let mut box_ = ActorBox::uninitialized();
-            ffi::clutter_actor_get_allocation_box(
-                self.as_ref().to_glib_none().0,
-                box_.to_glib_none_mut().0,
-            );
-            box_
-        }
-    }
-
-    //fn get_allocation_vertices<P: IsA<Actor>>(&self, ancestor: Option<&P>, verts: /*Unimplemented*/FixedArray TypeId { ns_id: 1, id: 16 }; 4) {
-    //    unsafe { TODO: call clutter_sys:clutter_actor_get_allocation_vertices() }
-    //}
-
-    fn get_background_color(&self) -> InternalColor {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            ffi::clutter_actor_get_background_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none_mut().0,
-            );
-            color
-        }
-    }
-
-    fn get_child_at_index(&self, index_: i32) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_child_at_index(
-                self.as_ref().to_glib_none().0,
-                index_,
-            ))
-        }
-    }
-
-    fn get_child_transform(&self) -> Matrix {
-        unsafe {
-            let mut transform = Matrix::uninitialized();
-            ffi::clutter_actor_get_child_transform(
-                self.as_ref().to_glib_none().0,
-                transform.to_glib_none_mut().0,
-            );
-            transform
-        }
-    }
-
-    fn get_children(&self) -> Vec<Actor> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_children(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_clip(&self) -> (f32, f32, f32, f32) {
-        unsafe {
-            let mut xoff = mem::MaybeUninit::uninit();
-            let mut yoff = mem::MaybeUninit::uninit();
-            let mut width = mem::MaybeUninit::uninit();
-            let mut height = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_clip(
-                self.as_ref().to_glib_none().0,
-                xoff.as_mut_ptr(),
-                yoff.as_mut_ptr(),
-                width.as_mut_ptr(),
-                height.as_mut_ptr(),
-            );
-            let xoff = xoff.assume_init();
-            let yoff = yoff.assume_init();
-            let width = width.assume_init();
-            let height = height.assume_init();
-            (xoff, yoff, width, height)
-        }
-    }
-
-    fn get_clip_to_allocation(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_clip_to_allocation(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_constraint(&self, name: &str) -> Option<Constraint> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_constraint(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_constraints(&self) -> Vec<Constraint> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_constraints(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_content(&self) -> Option<Content> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_content(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_content_box(&self) -> ActorBox {
-        unsafe {
-            let mut box_ = ActorBox::uninitialized();
-            ffi::clutter_actor_get_content_box(
-                self.as_ref().to_glib_none().0,
-                box_.to_glib_none_mut().0,
-            );
-            box_
-        }
-    }
-
-    fn get_content_gravity(&self) -> ContentGravity {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_content_gravity(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_content_repeat(&self) -> ContentRepeat {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_content_repeat(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_content_scaling_filters(&self) -> (ScalingFilter, ScalingFilter) {
-        unsafe {
-            let mut min_filter = mem::MaybeUninit::uninit();
-            let mut mag_filter = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_content_scaling_filters(
-                self.as_ref().to_glib_none().0,
-                min_filter.as_mut_ptr(),
-                mag_filter.as_mut_ptr(),
-            );
-            let min_filter = min_filter.assume_init();
-            let mag_filter = mag_filter.assume_init();
-            (from_glib(min_filter), from_glib(mag_filter))
-        }
-    }
-
-    fn get_default_paint_volume(&self) -> Option<PaintVolume> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_default_paint_volume(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_easing_delay(&self) -> u32 {
-        unsafe { ffi::clutter_actor_get_easing_delay(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_easing_duration(&self) -> u32 {
-        unsafe { ffi::clutter_actor_get_easing_duration(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_easing_mode(&self) -> AnimationMode {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_easing_mode(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_effect(&self, name: &str) -> Option<Effect> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_effect(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_effects(&self) -> Vec<Effect> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_effects(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_first_child(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_first_child(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_fixed_position_set(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_fixed_position_set(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_flags(&self) -> ActorFlags {
-        unsafe { from_glib(ffi::clutter_actor_get_flags(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn get_height(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_height(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_last_child(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_last_child(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_layout_manager(&self) -> Option<LayoutManager> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_layout_manager(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_margin(&self) -> Margin {
-        unsafe {
-            let mut margin = Margin::uninitialized();
-            ffi::clutter_actor_get_margin(
-                self.as_ref().to_glib_none().0,
-                margin.to_glib_none_mut().0,
-            );
-            margin
-        }
-    }
-
-    fn get_margin_bottom(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_margin_bottom(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_margin_left(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_margin_left(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_margin_right(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_margin_right(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_margin_top(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_margin_top(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_n_children(&self) -> i32 {
-        unsafe { ffi::clutter_actor_get_n_children(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_name(&self) -> Option<GString> {
-        unsafe { from_glib_none(ffi::clutter_actor_get_name(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn get_next_sibling(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_next_sibling(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_offscreen_redirect(&self) -> OffscreenRedirect {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_offscreen_redirect(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_opacity(&self) -> u8 {
-        unsafe { ffi::clutter_actor_get_opacity(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_paint_box(&self) -> Option<ActorBox> {
-        unsafe {
-            let mut box_ = ActorBox::uninitialized();
-            let ret = from_glib(ffi::clutter_actor_get_paint_box(
-                self.as_ref().to_glib_none().0,
-                box_.to_glib_none_mut().0,
-            ));
-            if ret {
-                Some(box_)
-            } else {
-                None
-            }
-        }
-    }
-
-    fn get_paint_opacity(&self) -> u8 {
-        unsafe { ffi::clutter_actor_get_paint_opacity(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_paint_visibility(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_paint_visibility(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_paint_volume(&self) -> Option<PaintVolume> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_paint_volume(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_pango_context(&self) -> Option<pango::Context> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_pango_context(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_parent(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_parent(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_pivot_point(&self) -> (f32, f32) {
-        unsafe {
-            let mut pivot_x = mem::MaybeUninit::uninit();
-            let mut pivot_y = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_pivot_point(
-                self.as_ref().to_glib_none().0,
-                pivot_x.as_mut_ptr(),
-                pivot_y.as_mut_ptr(),
-            );
-            let pivot_x = pivot_x.assume_init();
-            let pivot_y = pivot_y.assume_init();
-            (pivot_x, pivot_y)
-        }
-    }
-
-    fn get_pivot_point_z(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_pivot_point_z(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_position(&self) -> (f32, f32) {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_position(
-                self.as_ref().to_glib_none().0,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-            );
-            let x = x.assume_init();
-            let y = y.assume_init();
-            (x, y)
-        }
-    }
-
-    fn get_preferred_height(&self, for_width: f32) -> (f32, f32) {
-        unsafe {
-            let mut min_height_p = mem::MaybeUninit::uninit();
-            let mut natural_height_p = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_preferred_height(
-                self.as_ref().to_glib_none().0,
-                for_width,
-                min_height_p.as_mut_ptr(),
-                natural_height_p.as_mut_ptr(),
-            );
-            let min_height_p = min_height_p.assume_init();
-            let natural_height_p = natural_height_p.assume_init();
-            (min_height_p, natural_height_p)
-        }
-    }
-
-    fn get_preferred_size(&self) -> (f32, f32, f32, f32) {
-        unsafe {
-            let mut min_width_p = mem::MaybeUninit::uninit();
-            let mut min_height_p = mem::MaybeUninit::uninit();
-            let mut natural_width_p = mem::MaybeUninit::uninit();
-            let mut natural_height_p = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_preferred_size(
-                self.as_ref().to_glib_none().0,
-                min_width_p.as_mut_ptr(),
-                min_height_p.as_mut_ptr(),
-                natural_width_p.as_mut_ptr(),
-                natural_height_p.as_mut_ptr(),
-            );
-            let min_width_p = min_width_p.assume_init();
-            let min_height_p = min_height_p.assume_init();
-            let natural_width_p = natural_width_p.assume_init();
-            let natural_height_p = natural_height_p.assume_init();
-            (min_width_p, min_height_p, natural_width_p, natural_height_p)
-        }
-    }
-
-    fn get_preferred_width(&self, for_height: f32) -> (f32, f32) {
-        unsafe {
-            let mut min_width_p = mem::MaybeUninit::uninit();
-            let mut natural_width_p = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_preferred_width(
-                self.as_ref().to_glib_none().0,
-                for_height,
-                min_width_p.as_mut_ptr(),
-                natural_width_p.as_mut_ptr(),
-            );
-            let min_width_p = min_width_p.assume_init();
-            let natural_width_p = natural_width_p.assume_init();
-            (min_width_p, natural_width_p)
-        }
-    }
-
-    fn get_previous_sibling(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_previous_sibling(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_reactive(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_reactive(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_request_mode(&self) -> RequestMode {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_request_mode(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_rotation_angle(&self, axis: RotateAxis) -> f64 {
-        unsafe {
-            ffi::clutter_actor_get_rotation_angle(self.as_ref().to_glib_none().0, axis.to_glib())
-        }
-    }
-
-    fn get_scale(&self) -> (f64, f64) {
-        unsafe {
-            let mut scale_x = mem::MaybeUninit::uninit();
-            let mut scale_y = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_scale(
-                self.as_ref().to_glib_none().0,
-                scale_x.as_mut_ptr(),
-                scale_y.as_mut_ptr(),
-            );
-            let scale_x = scale_x.assume_init();
-            let scale_y = scale_y.assume_init();
-            (scale_x, scale_y)
-        }
-    }
-
-    fn get_scale_z(&self) -> f64 {
-        unsafe { ffi::clutter_actor_get_scale_z(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_size(&self) -> (f32, f32) {
-        unsafe {
-            let mut width = mem::MaybeUninit::uninit();
-            let mut height = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_size(
-                self.as_ref().to_glib_none().0,
-                width.as_mut_ptr(),
-                height.as_mut_ptr(),
-            );
-            let width = width.assume_init();
-            let height = height.assume_init();
-            (width, height)
-        }
-    }
-
-    fn get_stage(&self) -> Option<Stage> {
-        unsafe { from_glib_none(ffi::clutter_actor_get_stage(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn get_text_direction(&self) -> TextDirection {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_text_direction(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_transform(&self) -> Matrix {
-        unsafe {
-            let mut transform = Matrix::uninitialized();
-            ffi::clutter_actor_get_transform(
-                self.as_ref().to_glib_none().0,
-                transform.to_glib_none_mut().0,
-            );
-            transform
-        }
-    }
-
-    fn get_transformed_paint_volume<P: IsA<Actor>>(
-        &self,
-        relative_to_ancestor: &P,
-    ) -> Option<PaintVolume> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_transformed_paint_volume(
-                self.as_ref().to_glib_none().0,
-                relative_to_ancestor.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_transformed_position(&self) -> (f32, f32) {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_transformed_position(
-                self.as_ref().to_glib_none().0,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-            );
-            let x = x.assume_init();
-            let y = y.assume_init();
-            (x, y)
-        }
-    }
-
-    fn get_transformed_size(&self) -> (f32, f32) {
-        unsafe {
-            let mut width = mem::MaybeUninit::uninit();
-            let mut height = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_transformed_size(
-                self.as_ref().to_glib_none().0,
-                width.as_mut_ptr(),
-                height.as_mut_ptr(),
-            );
-            let width = width.assume_init();
-            let height = height.assume_init();
-            (width, height)
-        }
-    }
-
-    fn get_transition(&self, name: &str) -> Option<Transition> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_get_transition(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_translation(&self) -> (f32, f32, f32) {
-        unsafe {
-            let mut translate_x = mem::MaybeUninit::uninit();
-            let mut translate_y = mem::MaybeUninit::uninit();
-            let mut translate_z = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_get_translation(
-                self.as_ref().to_glib_none().0,
-                translate_x.as_mut_ptr(),
-                translate_y.as_mut_ptr(),
-                translate_z.as_mut_ptr(),
-            );
-            let translate_x = translate_x.assume_init();
-            let translate_y = translate_y.assume_init();
-            let translate_z = translate_z.assume_init();
-            (translate_x, translate_y, translate_z)
-        }
-    }
-
-    fn get_width(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_width(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_x(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_x(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_x_align(&self) -> ActorAlign {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_x_align(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_x_expand(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_x_expand(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_y(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_y(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_y_align(&self) -> ActorAlign {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_y_align(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_y_expand(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_get_y_expand(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_z_position(&self) -> f32 {
-        unsafe { ffi::clutter_actor_get_z_position(self.as_ref().to_glib_none().0) }
-    }
-
-    fn grab_key_focus(&self) {
-        unsafe {
-            ffi::clutter_actor_grab_key_focus(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn has_actions(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_has_actions(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn has_allocation(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_has_allocation(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn has_clip(&self) -> bool {
-        unsafe { from_glib(ffi::clutter_actor_has_clip(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn has_constraints(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_has_constraints(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn has_effects(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_has_effects(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn has_key_focus(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_has_key_focus(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn has_overlaps(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_has_overlaps(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn has_pointer(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_has_pointer(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn hide(&self) {
-        unsafe {
-            ffi::clutter_actor_hide(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn insert_child_above<P: IsA<Actor>, Q: IsA<Actor>>(&self, child: &P, sibling: Option<&Q>) {
-        unsafe {
-            ffi::clutter_actor_insert_child_above(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                sibling.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn insert_child_at_index<P: IsA<Actor>>(&self, child: &P, index_: i32) {
-        unsafe {
-            ffi::clutter_actor_insert_child_at_index(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                index_,
-            );
-        }
-    }
-
-    fn insert_child_below<P: IsA<Actor>, Q: IsA<Actor>>(&self, child: &P, sibling: Option<&Q>) {
-        unsafe {
-            ffi::clutter_actor_insert_child_below(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                sibling.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn is_in_clone_paint(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_is_in_clone_paint(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn is_mapped(&self) -> bool {
-        unsafe { from_glib(ffi::clutter_actor_is_mapped(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn is_realized(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_is_realized(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn is_rotated(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_is_rotated(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn is_scaled(&self) -> bool {
-        unsafe { from_glib(ffi::clutter_actor_is_scaled(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn is_visible(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_is_visible(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn map(&self) {
-        unsafe {
-            ffi::clutter_actor_map(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn move_by(&self, dx: f32, dy: f32) {
-        unsafe {
-            ffi::clutter_actor_move_by(self.as_ref().to_glib_none().0, dx, dy);
-        }
-    }
-
-    fn needs_expand(&self, orientation: Orientation) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_needs_expand(
-                self.as_ref().to_glib_none().0,
-                orientation.to_glib(),
-            ))
-        }
-    }
-
-    fn paint(&self) {
-        unsafe {
-            ffi::clutter_actor_paint(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn queue_redraw(&self) {
-        unsafe {
-            ffi::clutter_actor_queue_redraw(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn queue_redraw_with_clip(&self, clip: Option<&cairo::RectangleInt>) {
-        unsafe {
-            ffi::clutter_actor_queue_redraw_with_clip(
-                self.as_ref().to_glib_none().0,
-                clip.to_glib_none().0,
-            );
-        }
-    }
-
-    fn queue_relayout(&self) {
-        unsafe {
-            ffi::clutter_actor_queue_relayout(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn remove_action<P: IsA<Action>>(&self, action: &P) {
-        unsafe {
-            ffi::clutter_actor_remove_action(
-                self.as_ref().to_glib_none().0,
-                action.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_action_by_name(&self, name: &str) {
-        unsafe {
-            ffi::clutter_actor_remove_action_by_name(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_all_children(&self) {
-        unsafe {
-            ffi::clutter_actor_remove_all_children(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn remove_all_transitions(&self) {
-        unsafe {
-            ffi::clutter_actor_remove_all_transitions(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn remove_child<P: IsA<Actor>>(&self, child: &P) {
-        unsafe {
-            ffi::clutter_actor_remove_child(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_clip(&self) {
-        unsafe {
-            ffi::clutter_actor_remove_clip(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn remove_constraint<P: IsA<Constraint>>(&self, constraint: &P) {
-        unsafe {
-            ffi::clutter_actor_remove_constraint(
-                self.as_ref().to_glib_none().0,
-                constraint.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_constraint_by_name(&self, name: &str) {
-        unsafe {
-            ffi::clutter_actor_remove_constraint_by_name(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_effect<P: IsA<Effect>>(&self, effect: &P) {
-        unsafe {
-            ffi::clutter_actor_remove_effect(
-                self.as_ref().to_glib_none().0,
-                effect.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_effect_by_name(&self, name: &str) {
-        unsafe {
-            ffi::clutter_actor_remove_effect_by_name(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_transition(&self, name: &str) {
-        unsafe {
-            ffi::clutter_actor_remove_transition(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn replace_child<P: IsA<Actor>, Q: IsA<Actor>>(&self, old_child: &P, new_child: &Q) {
-        unsafe {
-            ffi::clutter_actor_replace_child(
-                self.as_ref().to_glib_none().0,
-                old_child.as_ref().to_glib_none().0,
-                new_child.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn restore_easing_state(&self) {
-        unsafe {
-            ffi::clutter_actor_restore_easing_state(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn save_easing_state(&self) {
-        unsafe {
-            ffi::clutter_actor_save_easing_state(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn set_allocation(&self, box_: &ActorBox, flags: AllocationFlags) {
-        unsafe {
-            ffi::clutter_actor_set_allocation(
-                self.as_ref().to_glib_none().0,
-                box_.to_glib_none().0,
-                flags.to_glib(),
-            );
-        }
-    }
-
-    fn set_background_color(&self, color: Option<Color>) {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-
-        unsafe {
-            ffi::clutter_actor_set_background_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_child_above_sibling<P: IsA<Actor>, Q: IsA<Actor>>(
-        &self,
-        child: &P,
-        sibling: Option<&Q>,
-    ) {
-        unsafe {
-            ffi::clutter_actor_set_child_above_sibling(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                sibling.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_child_at_index<P: IsA<Actor>>(&self, child: &P, index_: i32) {
-        unsafe {
-            ffi::clutter_actor_set_child_at_index(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                index_,
-            );
-        }
-    }
-
-    fn set_child_below_sibling<P: IsA<Actor>, Q: IsA<Actor>>(
-        &self,
-        child: &P,
-        sibling: Option<&Q>,
-    ) {
-        unsafe {
-            ffi::clutter_actor_set_child_below_sibling(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                sibling.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_child_transform(&self, transform: Option<&Matrix>) {
-        unsafe {
-            ffi::clutter_actor_set_child_transform(
-                self.as_ref().to_glib_none().0,
-                transform.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_clip(&self, xoff: f32, yoff: f32, width: f32, height: f32) {
-        unsafe {
-            ffi::clutter_actor_set_clip(self.as_ref().to_glib_none().0, xoff, yoff, width, height);
-        }
-    }
-
-    fn set_clip_to_allocation(&self, clip_set: bool) {
-        unsafe {
-            ffi::clutter_actor_set_clip_to_allocation(
-                self.as_ref().to_glib_none().0,
-                clip_set.to_glib(),
-            );
-        }
-    }
-
-    fn set_content<P: IsA<Content>>(&self, content: Option<&P>) {
-        unsafe {
-            ffi::clutter_actor_set_content(
-                self.as_ref().to_glib_none().0,
-                content.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_content_gravity(&self, gravity: ContentGravity) {
-        unsafe {
-            ffi::clutter_actor_set_content_gravity(
-                self.as_ref().to_glib_none().0,
-                gravity.to_glib(),
-            );
-        }
-    }
-
-    fn set_content_repeat(&self, repeat: ContentRepeat) {
-        unsafe {
-            ffi::clutter_actor_set_content_repeat(self.as_ref().to_glib_none().0, repeat.to_glib());
-        }
-    }
-
-    fn set_content_scaling_filters(&self, min_filter: ScalingFilter, mag_filter: ScalingFilter) {
-        unsafe {
-            ffi::clutter_actor_set_content_scaling_filters(
-                self.as_ref().to_glib_none().0,
-                min_filter.to_glib(),
-                mag_filter.to_glib(),
-            );
-        }
-    }
-
-    fn set_easing_delay(&self, msecs: u32) {
-        unsafe {
-            ffi::clutter_actor_set_easing_delay(self.as_ref().to_glib_none().0, msecs);
-        }
-    }
-
-    fn set_easing_duration(&self, msecs: u32) {
-        unsafe {
-            ffi::clutter_actor_set_easing_duration(self.as_ref().to_glib_none().0, msecs);
-        }
-    }
-
-    fn set_easing_mode(&self, mode: AnimationMode) {
-        unsafe {
-            ffi::clutter_actor_set_easing_mode(self.as_ref().to_glib_none().0, mode.to_glib());
-        }
-    }
-
-    fn set_fixed_position_set(&self, is_set: bool) {
-        unsafe {
-            ffi::clutter_actor_set_fixed_position_set(
-                self.as_ref().to_glib_none().0,
-                is_set.to_glib(),
-            );
-        }
-    }
-
-    fn set_flags(&self, flags: ActorFlags) {
-        unsafe {
-            ffi::clutter_actor_set_flags(self.as_ref().to_glib_none().0, flags.to_glib());
-        }
-    }
-
-    fn set_height(&self, height: f32) {
-        unsafe {
-            ffi::clutter_actor_set_height(self.as_ref().to_glib_none().0, height);
-        }
-    }
-
-    fn set_layout_manager<P: IsA<LayoutManager>>(&self, manager: Option<&P>) {
-        unsafe {
-            ffi::clutter_actor_set_layout_manager(
-                self.as_ref().to_glib_none().0,
-                manager.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_margin(&self, margin: &Margin) {
-        unsafe {
-            ffi::clutter_actor_set_margin(self.as_ref().to_glib_none().0, margin.to_glib_none().0);
-        }
-    }
-
-    fn set_margin_bottom(&self, margin: f32) {
-        unsafe {
-            ffi::clutter_actor_set_margin_bottom(self.as_ref().to_glib_none().0, margin);
-        }
-    }
-
-    fn set_margin_left(&self, margin: f32) {
-        unsafe {
-            ffi::clutter_actor_set_margin_left(self.as_ref().to_glib_none().0, margin);
-        }
-    }
-
-    fn set_margin_right(&self, margin: f32) {
-        unsafe {
-            ffi::clutter_actor_set_margin_right(self.as_ref().to_glib_none().0, margin);
-        }
-    }
-
-    fn set_margin_top(&self, margin: f32) {
-        unsafe {
-            ffi::clutter_actor_set_margin_top(self.as_ref().to_glib_none().0, margin);
-        }
-    }
-
-    fn set_name(&self, name: &str) {
-        unsafe {
-            ffi::clutter_actor_set_name(self.as_ref().to_glib_none().0, name.to_glib_none().0);
-        }
-    }
-
-    fn set_offscreen_redirect(&self, redirect: OffscreenRedirect) {
-        unsafe {
-            ffi::clutter_actor_set_offscreen_redirect(
-                self.as_ref().to_glib_none().0,
-                redirect.to_glib(),
-            );
-        }
-    }
-
-    fn set_opacity(&self, opacity: u8) {
-        unsafe {
-            ffi::clutter_actor_set_opacity(self.as_ref().to_glib_none().0, opacity);
-        }
-    }
-
-    fn set_pivot_point(&self, pivot_x: f32, pivot_y: f32) {
-        unsafe {
-            ffi::clutter_actor_set_pivot_point(self.as_ref().to_glib_none().0, pivot_x, pivot_y);
-        }
-    }
-
-    fn set_pivot_point_z(&self, pivot_z: f32) {
-        unsafe {
-            ffi::clutter_actor_set_pivot_point_z(self.as_ref().to_glib_none().0, pivot_z);
-        }
-    }
-
-    fn set_position(&self, x: f32, y: f32) {
-        unsafe {
-            ffi::clutter_actor_set_position(self.as_ref().to_glib_none().0, x, y);
-        }
-    }
-
-    fn set_reactive(&self, reactive: bool) {
-        unsafe {
-            ffi::clutter_actor_set_reactive(self.as_ref().to_glib_none().0, reactive.to_glib());
-        }
-    }
-
-    fn set_request_mode(&self, mode: RequestMode) {
-        unsafe {
-            ffi::clutter_actor_set_request_mode(self.as_ref().to_glib_none().0, mode.to_glib());
-        }
-    }
-
-    fn set_rotation_angle(&self, axis: RotateAxis, angle: f64) {
-        unsafe {
-            ffi::clutter_actor_set_rotation_angle(
-                self.as_ref().to_glib_none().0,
-                axis.to_glib(),
-                angle,
-            );
-        }
-    }
-
-    fn set_scale(&self, scale_x: f64, scale_y: f64) {
-        unsafe {
-            ffi::clutter_actor_set_scale(self.as_ref().to_glib_none().0, scale_x, scale_y);
-        }
-    }
-
-    fn set_scale_z(&self, scale_z: f64) {
-        unsafe {
-            ffi::clutter_actor_set_scale_z(self.as_ref().to_glib_none().0, scale_z);
-        }
-    }
-
-    fn set_size(&self, width: f32, height: f32) {
-        unsafe {
-            ffi::clutter_actor_set_size(self.as_ref().to_glib_none().0, width, height);
-        }
-    }
-
-    fn set_text_direction(&self, text_dir: TextDirection) {
-        unsafe {
-            ffi::clutter_actor_set_text_direction(
-                self.as_ref().to_glib_none().0,
-                text_dir.to_glib(),
-            );
-        }
-    }
-
-    fn set_transform(&self, transform: Option<&Matrix>) {
-        unsafe {
-            ffi::clutter_actor_set_transform(
-                self.as_ref().to_glib_none().0,
-                transform.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_translation(&self, translate_x: f32, translate_y: f32, translate_z: f32) {
-        unsafe {
-            ffi::clutter_actor_set_translation(
-                self.as_ref().to_glib_none().0,
-                translate_x,
-                translate_y,
-                translate_z,
-            );
-        }
-    }
-
-    fn set_width(&self, width: f32) {
-        unsafe {
-            ffi::clutter_actor_set_width(self.as_ref().to_glib_none().0, width);
-        }
-    }
-
-    fn set_x(&self, x: f32) {
-        unsafe {
-            ffi::clutter_actor_set_x(self.as_ref().to_glib_none().0, x);
-        }
-    }
-
-    fn set_x_align(&self, x_align: ActorAlign) {
-        unsafe {
-            ffi::clutter_actor_set_x_align(self.as_ref().to_glib_none().0, x_align.to_glib());
-        }
-    }
-
-    fn set_x_expand(&self, expand: bool) {
-        unsafe {
-            ffi::clutter_actor_set_x_expand(self.as_ref().to_glib_none().0, expand.to_glib());
-        }
-    }
-
-    fn set_y(&self, y: f32) {
-        unsafe {
-            ffi::clutter_actor_set_y(self.as_ref().to_glib_none().0, y);
-        }
-    }
-
-    fn set_y_align(&self, y_align: ActorAlign) {
-        unsafe {
-            ffi::clutter_actor_set_y_align(self.as_ref().to_glib_none().0, y_align.to_glib());
-        }
-    }
-
-    fn set_y_expand(&self, expand: bool) {
-        unsafe {
-            ffi::clutter_actor_set_y_expand(self.as_ref().to_glib_none().0, expand.to_glib());
-        }
-    }
-
-    fn set_z_position(&self, z_position: f32) {
-        unsafe {
-            ffi::clutter_actor_set_z_position(self.as_ref().to_glib_none().0, z_position);
-        }
-    }
-
-    fn should_pick_paint(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_should_pick_paint(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn show(&self) {
-        unsafe {
-            ffi::clutter_actor_show(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn transform_stage_point(&self, x: f32, y: f32) -> Option<(f32, f32)> {
-        unsafe {
-            let mut x_out = mem::MaybeUninit::uninit();
-            let mut y_out = mem::MaybeUninit::uninit();
-            let ret = from_glib(ffi::clutter_actor_transform_stage_point(
-                self.as_ref().to_glib_none().0,
-                x,
-                y,
-                x_out.as_mut_ptr(),
-                y_out.as_mut_ptr(),
-            ));
-            let x_out = x_out.assume_init();
-            let y_out = y_out.assume_init();
-            if ret {
-                Some((x_out, y_out))
-            } else {
-                None
-            }
-        }
-    }
-
-    fn unmap(&self) {
-        unsafe {
-            ffi::clutter_actor_unmap(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn unset_flags(&self, flags: ActorFlags) {
-        unsafe {
-            ffi::clutter_actor_unset_flags(self.as_ref().to_glib_none().0, flags.to_glib());
-        }
-    }
-
-    fn set_property_actions<P: IsA<Action> + SetValueOptional>(&self, actions: Option<&P>) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"actions\0".as_ptr() as *const _,
-                Value::from(actions).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_allocation(&self) -> Option<ActorBox> {
-        unsafe {
-            let mut value = Value::from_type(<ActorBox as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"allocation\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `allocation` getter")
-        }
-    }
-
-    fn get_property_background_color_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"background-color-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `background-color-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_child_transform_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"child-transform-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `child-transform-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_clip_rect(&self) -> Option<InternalRect> {
-        unsafe {
-            let mut value = Value::from_type(<InternalRect as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"clip-rect\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `clip-rect` getter")
-        }
-    }
-
-    fn set_property_clip_rect(&self, clip_rect: Option<&InternalRect>) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"clip-rect\0".as_ptr() as *const _,
-                Value::from(clip_rect).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_property_constraints<P: IsA<Constraint> + SetValueOptional>(
-        &self,
-        constraints: Option<&P>,
-    ) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"constraints\0".as_ptr() as *const _,
-                Value::from(constraints).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_property_effect<P: IsA<Effect> + SetValueOptional>(&self, effect: Option<&P>) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"effect\0".as_ptr() as *const _,
-                Value::from(effect).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_fixed_x(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"fixed-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `fixed-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_fixed_x(&self, fixed_x: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"fixed-x\0".as_ptr() as *const _,
-                Value::from(&fixed_x).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_fixed_y(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"fixed-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `fixed-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_fixed_y(&self, fixed_y: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"fixed-y\0".as_ptr() as *const _,
-                Value::from(&fixed_y).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_has_clip(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"has-clip\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `has-clip` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_has_pointer(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"has-pointer\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `has-pointer` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_magnification_filter(&self) -> ScalingFilter {
-        unsafe {
-            let mut value = Value::from_type(<ScalingFilter as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"magnification-filter\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `magnification-filter` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_magnification_filter(&self, magnification_filter: ScalingFilter) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"magnification-filter\0".as_ptr() as *const _,
-                Value::from(&magnification_filter).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_mapped(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"mapped\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `mapped` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_min_height(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-height\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `min-height` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_min_height(&self, min_height: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-height\0".as_ptr() as *const _,
-                Value::from(&min_height).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_min_height_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-height-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `min-height-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_min_height_set(&self, min_height_set: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-height-set\0".as_ptr() as *const _,
-                Value::from(&min_height_set).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_min_width(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-width\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `min-width` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_min_width(&self, min_width: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-width\0".as_ptr() as *const _,
-                Value::from(&min_width).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_min_width_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-width-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `min-width-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_min_width_set(&self, min_width_set: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-width-set\0".as_ptr() as *const _,
-                Value::from(&min_width_set).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_minification_filter(&self) -> ScalingFilter {
-        unsafe {
-            let mut value = Value::from_type(<ScalingFilter as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"minification-filter\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `minification-filter` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_minification_filter(&self, minification_filter: ScalingFilter) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"minification-filter\0".as_ptr() as *const _,
-                Value::from(&minification_filter).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_natural_height(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-height\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `natural-height` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_natural_height(&self, natural_height: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-height\0".as_ptr() as *const _,
-                Value::from(&natural_height).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_natural_height_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-height-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `natural-height-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_natural_height_set(&self, natural_height_set: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-height-set\0".as_ptr() as *const _,
-                Value::from(&natural_height_set).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_natural_width(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-width\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `natural-width` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_natural_width(&self, natural_width: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-width\0".as_ptr() as *const _,
-                Value::from(&natural_width).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_natural_width_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-width-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `natural-width-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_natural_width_set(&self, natural_width_set: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"natural-width-set\0".as_ptr() as *const _,
-                Value::from(&natural_width_set).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_realized(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"realized\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `realized` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_rotation_angle_x(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"rotation-angle-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `rotation-angle-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_rotation_angle_x(&self, rotation_angle_x: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"rotation-angle-x\0".as_ptr() as *const _,
-                Value::from(&rotation_angle_x).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_rotation_angle_y(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"rotation-angle-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `rotation-angle-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_rotation_angle_y(&self, rotation_angle_y: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"rotation-angle-y\0".as_ptr() as *const _,
-                Value::from(&rotation_angle_y).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_rotation_angle_z(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"rotation-angle-z\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `rotation-angle-z` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_rotation_angle_z(&self, rotation_angle_z: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"rotation-angle-z\0".as_ptr() as *const _,
-                Value::from(&rotation_angle_z).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_scale_x(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"scale-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `scale-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_scale_x(&self, scale_x: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"scale-x\0".as_ptr() as *const _,
-                Value::from(&scale_x).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_scale_y(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"scale-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `scale-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_scale_y(&self, scale_y: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"scale-y\0".as_ptr() as *const _,
-                Value::from(&scale_y).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_show_on_set_parent(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"show-on-set-parent\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `show-on-set-parent` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_show_on_set_parent(&self, show_on_set_parent: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"show-on-set-parent\0".as_ptr() as *const _,
-                Value::from(&show_on_set_parent).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_transform_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"transform-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `transform-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_translation_x(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"translation-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `translation-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_translation_x(&self, translation_x: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"translation-x\0".as_ptr() as *const _,
-                Value::from(&translation_x).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_translation_y(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"translation-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `translation-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_translation_y(&self, translation_y: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"translation-y\0".as_ptr() as *const _,
-                Value::from(&translation_y).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_translation_z(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"translation-z\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `translation-z` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_translation_z(&self, translation_z: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"translation-z\0".as_ptr() as *const _,
-                Value::from(&translation_z).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_visible(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"visible\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `visible` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_visible(&self, visible: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"visible\0".as_ptr() as *const _,
-                Value::from(&visible).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_allocation_changed<F: Fn(&Self, &ActorBox, AllocationFlags) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn allocation_changed_trampoline<
-            P,
-            F: Fn(&P, &ActorBox, AllocationFlags) + 'static,
-        >(
-            this: *mut ffi::ClutterActor,
-            box_: *mut ffi::ClutterActorBox,
-            flags: ffi::ClutterAllocationFlags,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(box_),
-                from_glib(flags),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"allocation-changed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    allocation_changed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_button_press_event<F: Fn(&Self, &ButtonEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn button_press_event_trampoline<
-            P,
-            F: Fn(&P, &ButtonEvent) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterButtonEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"button-press-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    button_press_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_button_release_event<F: Fn(&Self, &ButtonEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn button_release_event_trampoline<
-            P,
-            F: Fn(&P, &ButtonEvent) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterButtonEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"button-release-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    button_release_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_captured_event<F: Fn(&Self, &Event) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn captured_event_trampoline<P, F: Fn(&P, &Event) -> bool + 'static>(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_none(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"captured-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    captured_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_destroy<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn destroy_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"destroy\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    destroy_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_enter_event<F: Fn(&Self, &CrossingEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn enter_event_trampoline<
-            P,
-            F: Fn(&P, &CrossingEvent) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterCrossingEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"enter-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    enter_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn event_trampoline<P, F: Fn(&P, &Event) -> bool + 'static>(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_none(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_hide<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn hide_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"hide\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    hide_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_key_focus_in<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn key_focus_in_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"key-focus-in\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    key_focus_in_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_key_focus_out<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn key_focus_out_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"key-focus-out\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    key_focus_out_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_key_press_event<F: Fn(&Self, &KeyEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn key_press_event_trampoline<P, F: Fn(&P, &KeyEvent) -> bool + 'static>(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterKeyEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"key-press-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    key_press_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_key_release_event<F: Fn(&Self, &KeyEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn key_release_event_trampoline<
-            P,
-            F: Fn(&P, &KeyEvent) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterKeyEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"key-release-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    key_release_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_leave_event<F: Fn(&Self, &CrossingEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn leave_event_trampoline<
-            P,
-            F: Fn(&P, &CrossingEvent) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterCrossingEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"leave-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    leave_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_motion_event<F: Fn(&Self, &MotionEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn motion_event_trampoline<P, F: Fn(&P, &MotionEvent) -> bool + 'static>(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterMotionEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"motion-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    motion_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_parent_set<F: Fn(&Self, Option<&Actor>) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn parent_set_trampoline<P, F: Fn(&P, Option<&Actor>) + 'static>(
-            this: *mut ffi::ClutterActor,
-            old_parent: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                Option::<Actor>::from_glib_borrow(old_parent)
-                    .as_ref()
-                    .as_ref(),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"parent-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    parent_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_queue_redraw<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn queue_redraw_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterActor,
-            origin: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(origin),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"queue-redraw\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    queue_redraw_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_queue_relayout<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn queue_relayout_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"queue-relayout\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    queue_relayout_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_scroll_event<F: Fn(&Self, &ScrollEvent) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn scroll_event_trampoline<P, F: Fn(&P, &ScrollEvent) -> bool + 'static>(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterScrollEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"scroll-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    scroll_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_show<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn show_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"show\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    show_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_touch_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn touch_event_trampoline<P, F: Fn(&P, &Event) -> bool + 'static>(
-            this: *mut ffi::ClutterActor,
-            event: *mut ffi::ClutterEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_none(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"touch-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    touch_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_transition_stopped<F: Fn(&Self, &str, bool) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn transition_stopped_trampoline<P, F: Fn(&P, &str, bool) + 'static>(
-            this: *mut ffi::ClutterActor,
-            name: *mut libc::c_char,
-            is_finished: glib_sys::gboolean,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Actor::from_glib_borrow(this).unsafe_cast_ref(),
-                &GString::from_glib_borrow(name),
-                from_glib(is_finished),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"transition-stopped\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    transition_stopped_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_transitions_completed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn transitions_completed_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"transitions-completed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    transitions_completed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_actions_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_actions_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::actions\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_actions_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_allocation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_allocation_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::allocation\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_allocation_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_background_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_background_color_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::background-color\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_background_color_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_background_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_background_color_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::background-color-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_background_color_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_child_transform_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_child_transform_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::child-transform\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_child_transform_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_child_transform_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_child_transform_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::child-transform-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_child_transform_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_clip_rect_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_clip_rect_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::clip-rect\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_clip_rect_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_clip_to_allocation_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_clip_to_allocation_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::clip-to-allocation\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_clip_to_allocation_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_constraints_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_constraints_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::constraints\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_constraints_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_content_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_content_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::content\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_content_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_content_box_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_content_box_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::content-box\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_content_box_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_content_gravity_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_content_gravity_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::content-gravity\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_content_gravity_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_content_repeat_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_content_repeat_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::content-repeat\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_content_repeat_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_effect_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_effect_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::effect\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_effect_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_first_child_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_first_child_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::first-child\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_first_child_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_fixed_position_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_fixed_position_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::fixed-position-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_fixed_position_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_fixed_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_fixed_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::fixed-x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_fixed_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_fixed_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_fixed_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::fixed-y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_fixed_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_has_clip_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_has_clip_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::has-clip\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_has_clip_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_has_pointer_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_has_pointer_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::has-pointer\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_has_pointer_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_height_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::height\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_height_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_last_child_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_last_child_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::last-child\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_last_child_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_layout_manager_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_layout_manager_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::layout-manager\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_layout_manager_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_magnification_filter_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_magnification_filter_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::magnification-filter\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_magnification_filter_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_mapped_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_mapped_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::mapped\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_mapped_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_margin_bottom_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_margin_bottom_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::margin-bottom\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_margin_bottom_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_margin_left_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_margin_left_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::margin-left\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_margin_left_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_margin_right_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_margin_right_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::margin-right\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_margin_right_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_margin_top_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_margin_top_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::margin-top\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_margin_top_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_min_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_min_height_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::min-height\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_min_height_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_min_height_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_min_height_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::min-height-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_min_height_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_min_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_min_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::min-width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_min_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_min_width_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_min_width_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::min-width-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_min_width_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_minification_filter_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_minification_filter_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::minification-filter\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_minification_filter_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_name_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_name_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::name\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_name_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_natural_height_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_natural_height_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::natural-height\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_natural_height_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_natural_height_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_natural_height_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::natural-height-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_natural_height_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_natural_width_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_natural_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::natural-width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_natural_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_natural_width_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_natural_width_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::natural-width-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_natural_width_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_offscreen_redirect_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_offscreen_redirect_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::offscreen-redirect\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_offscreen_redirect_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_opacity_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_opacity_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::opacity\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_opacity_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_pivot_point_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_pivot_point_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::pivot-point\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_pivot_point_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_pivot_point_z_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_pivot_point_z_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::pivot-point-z\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_pivot_point_z_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_position_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_position_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::position\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_position_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_reactive_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_reactive_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::reactive\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_reactive_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_realized_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_realized_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::realized\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_realized_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_request_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_request_mode_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::request-mode\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_request_mode_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_rotation_angle_x_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_rotation_angle_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::rotation-angle-x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_rotation_angle_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_rotation_angle_y_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_rotation_angle_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::rotation-angle-y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_rotation_angle_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_rotation_angle_z_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_rotation_angle_z_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::rotation-angle-z\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_rotation_angle_z_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_scale_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_scale_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::scale-x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_scale_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_scale_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_scale_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::scale-y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_scale_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_scale_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_scale_z_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::scale-z\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_scale_z_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_show_on_set_parent_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_show_on_set_parent_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::show-on-set-parent\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_show_on_set_parent_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_size_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::size\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_size_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_text_direction_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_text_direction_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::text-direction\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_text_direction_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_transform_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_transform_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::transform\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_transform_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_transform_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_transform_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::transform-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_transform_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_translation_x_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_translation_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::translation-x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_translation_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_translation_y_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_translation_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::translation-y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_translation_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_translation_z_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_translation_z_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::translation-z\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_translation_z_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_visible_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_visible_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::visible\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_visible_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_x_align_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_x_align_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::x-align\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_x_align_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_x_expand_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_x_expand_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::x-expand\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_x_expand_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_y_align_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_y_align_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::y-align\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_y_align_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_y_expand_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_y_expand_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::y-expand\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_y_expand_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_z_position_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_z_position_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Actor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Actor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::z-position\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_z_position_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Actor {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Actor")
-    }
-}
diff --git a/src/legacy/actor_box.rs b/src/legacy/actor_box.rs
deleted file mode 100644
index c72e7ca..0000000
--- a/src/legacy/actor_box.rs
+++ /dev/null
@@ -1,294 +0,0 @@
-use glib::translate::*;
-use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialOrd, Ord)] // Hash
-    pub struct ActorBox(Boxed<ffi::ClutterActorBox>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_actor_box_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_actor_box_free(ptr),
-        get_type => || ffi::clutter_actor_box_get_type(),
-    }
-}
-
-impl ActorBox {
-    /// Allocates a new `ActorBox` using the passed coordinates
-    /// for the top left and bottom right points.
-    ///
-    /// This function is the logical equivalent of:
-    ///
-    ///
-    /// ```text
-    ///   actor_box_init (actor_box_alloc (),
-    ///                           x_1, y_1,
-    ///                           x_2, y_2);
-    /// ```
-    /// ## `x_1`
-    /// X coordinate of the top left point
-    /// ## `y_1`
-    /// Y coordinate of the top left point
-    /// ## `x_2`
-    /// X coordinate of the bottom right point
-    /// ## `y_2`
-    /// Y coordinate of the bottom right point
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `ActorBox`.
-    ///  Use `ActorBox::free` to free the resources
-    pub fn new(x_1: f32, y_1: f32, x_2: f32, y_2: f32) -> ActorBox {
-        unsafe { from_glib_full(ffi::clutter_actor_box_new(x_1, y_1, x_2, y_2)) }
-    }
-
-    //pub fn clamp_to_pixel(&self) {
-    //    unsafe { TODO: call clutter_sys:clutter_actor_box_clamp_to_pixel() }
-    //}
-
-    /// Checks whether a point with `x`, `y` coordinates is contained
-    /// withing `self`
-    /// ## `x`
-    /// X coordinate of the point
-    /// ## `y`
-    /// Y coordinate of the point
-    ///
-    /// # Returns
-    ///
-    /// `true` if the point is contained by the `ActorBox`
-    pub fn contains(&self, x: f32, y: f32) -> bool {
-        unsafe { from_glib(ffi::clutter_actor_box_contains(self.to_glib_none().0, x, y)) }
-    }
-
-    /// Checks `self` and `box_b` for equality
-    /// ## `box_b`
-    /// a `ActorBox`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the passed `ActorBox` are equal
-    fn equal(&self, box_b: &ActorBox) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_box_equal(
-                self.to_glib_none().0,
-                box_b.to_glib_none().0,
-            ))
-        }
-    }
-
-    //pub fn from_vertices(&mut self, verts: /*Unimplemented*/FixedArray TypeId { ns_id: 1, id: 16 }; 4) {
-    //    unsafe { TODO: call clutter_sys:clutter_actor_box_from_vertices() }
-    //}
-
-    /// Retrieves the area of `self`
-    ///
-    /// # Returns
-    ///
-    /// the area of a `ActorBox`, in pixels
-    pub fn get_area(&self) -> f32 {
-        unsafe { ffi::clutter_actor_box_get_area(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the height of the `self`
-    ///
-    /// # Returns
-    ///
-    /// the height of the box
-    pub fn get_height(&self) -> f32 {
-        unsafe { ffi::clutter_actor_box_get_height(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the origin of `self`
-    /// ## `x`
-    /// return location for the X coordinate, or `None`
-    /// ## `y`
-    /// return location for the Y coordinate, or `None`
-    pub fn get_origin(&self) -> (f32, f32) {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_box_get_origin(
-                self.to_glib_none().0,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-            );
-            let x = x.assume_init();
-            let y = y.assume_init();
-            (x, y)
-        }
-    }
-
-    /// Retrieves the size of `self`
-    /// ## `width`
-    /// return location for the width, or `None`
-    /// ## `height`
-    /// return location for the height, or `None`
-    pub fn get_size(&self) -> (f32, f32) {
-        unsafe {
-            let mut width = mem::MaybeUninit::uninit();
-            let mut height = mem::MaybeUninit::uninit();
-            ffi::clutter_actor_box_get_size(
-                self.to_glib_none().0,
-                width.as_mut_ptr(),
-                height.as_mut_ptr(),
-            );
-            let width = width.assume_init();
-            let height = height.assume_init();
-            (width, height)
-        }
-    }
-
-    /// Retrieves the width of the `self`
-    ///
-    /// # Returns
-    ///
-    /// the width of the box
-    pub fn get_width(&self) -> f32 {
-        unsafe { ffi::clutter_actor_box_get_width(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the X coordinate of the origin of `self`
-    ///
-    /// # Returns
-    ///
-    /// the X coordinate of the origin
-    pub fn get_x(&self) -> f32 {
-        unsafe { ffi::clutter_actor_box_get_x(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the Y coordinate of the origin of `self`
-    ///
-    /// # Returns
-    ///
-    /// the Y coordinate of the origin
-    pub fn get_y(&self) -> f32 {
-        unsafe { ffi::clutter_actor_box_get_y(self.to_glib_none().0) }
-    }
-
-    /// Initializes `self` with the given coordinates.
-    /// ## `x_1`
-    /// X coordinate of the top left point
-    /// ## `y_1`
-    /// Y coordinate of the top left point
-    /// ## `x_2`
-    /// X coordinate of the bottom right point
-    /// ## `y_2`
-    /// Y coordinate of the bottom right point
-    ///
-    /// # Returns
-    ///
-    /// the initialized `ActorBox`
-    pub fn init(&mut self, x_1: f32, y_1: f32, x_2: f32, y_2: f32) -> Option<ActorBox> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_box_init(
-                self.to_glib_none_mut().0,
-                x_1,
-                y_1,
-                x_2,
-                y_2,
-            ))
-        }
-    }
-
-    /// Initializes `self` with the given origin and size.
-    /// ## `x`
-    /// X coordinate of the origin
-    /// ## `y`
-    /// Y coordinate of the origin
-    /// ## `width`
-    /// width of the box
-    /// ## `height`
-    /// height of the box
-    pub fn init_rect(&mut self, x: f32, y: f32, width: f32, height: f32) {
-        unsafe {
-            ffi::clutter_actor_box_init_rect(self.to_glib_none_mut().0, x, y, width, height);
-        }
-    }
-
-    /// Interpolates between `self` and `final_` `ActorBox`<!-- -->es
-    /// using `progress`
-    /// ## `final_`
-    /// the final `ActorBox`
-    /// ## `progress`
-    /// the interpolation progress
-    /// ## `result`
-    /// return location for the interpolation
-    pub fn interpolate(&self, final_: &ActorBox, progress: f64) -> ActorBox {
-        unsafe {
-            let mut result = ActorBox::uninitialized();
-            ffi::clutter_actor_box_interpolate(
-                self.to_glib_none().0,
-                final_.to_glib_none().0,
-                progress,
-                result.to_glib_none_mut().0,
-            );
-            result
-        }
-    }
-
-    /// Changes the origin of `self`, maintaining the size of the `ActorBox`.
-    /// ## `x`
-    /// the X coordinate of the new origin
-    /// ## `y`
-    /// the Y coordinate of the new origin
-    pub fn set_origin(&mut self, x: f32, y: f32) {
-        unsafe {
-            ffi::clutter_actor_box_set_origin(self.to_glib_none_mut().0, x, y);
-        }
-    }
-
-    /// Sets the size of `self`, maintaining the origin of the `ActorBox`.
-    /// ## `width`
-    /// the new width
-    /// ## `height`
-    /// the new height
-    pub fn set_size(&mut self, width: f32, height: f32) {
-        unsafe {
-            ffi::clutter_actor_box_set_size(self.to_glib_none_mut().0, width, height);
-        }
-    }
-
-    /// Unions the two boxes `self` and `b` and stores the result in `result`.
-    /// ## `b`
-    /// the second `ActorBox`
-    /// ## `result`
-    /// the `ActorBox` representing a union
-    ///  of `self` and `b`
-    pub fn union(&self, b: &ActorBox) -> ActorBox {
-        unsafe {
-            let mut result = ActorBox::uninitialized();
-            ffi::clutter_actor_box_union(
-                self.to_glib_none().0,
-                b.to_glib_none().0,
-                result.to_glib_none_mut().0,
-            );
-            result
-        }
-    }
-
-    /// Allocates a new `ActorBox`.
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `ActorBox`.
-    ///  Use `ActorBox::free` to free its resources
-    pub fn alloc() -> Option<ActorBox> {
-        unsafe { from_glib_full(ffi::clutter_actor_box_alloc()) }
-    }
-}
-
-impl PartialEq for ActorBox {
-    #[inline]
-    fn eq(&self, other: &Self) -> bool {
-        self.equal(other)
-    }
-}
-
-impl Eq for ActorBox {}
-
-#[doc(hidden)]
-impl Uninitialized for ActorBox {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        Self::alloc().unwrap()
-    }
-}
diff --git a/src/legacy/actor_canvas.rs b/src/legacy/actor_canvas.rs
deleted file mode 100644
index 7ec9944..0000000
--- a/src/legacy/actor_canvas.rs
+++ /dev/null
@@ -1,382 +0,0 @@
-use crate::Content;
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct ActorCanvas(Object<ffi::ClutterCanvas, ffi::ClutterCanvasClass, CanvasClass>) @implements Content;
-
-    match fn {
-        get_type => || ffi::clutter_canvas_get_type(),
-    }
-}
-
-impl ActorCanvas {
-    /// Creates a new instance of `Canvas`.
-    ///
-    /// You should call `CanvasExt::set_size` to set the size of the canvas.
-    ///
-    /// You should call `Content::invalidate` every time you wish to
-    /// draw the contents of the canvas.
-    ///
-    /// # Returns
-    ///
-    /// The newly allocated instance of
-    ///  `Canvas`. Use `gobject::ObjectExt::unref` when done.
-    pub fn new() -> Option<Content> {
-        unsafe { from_glib_full(ffi::clutter_canvas_new()) }
-    }
-}
-
-// impl Default for Canvas {
-//     fn default() -> Self {
-//         Self::new()
-//     }
-// }
-
-/// Trait containing all `Canvas` methods.
-///
-/// # Implementors
-///
-/// [`Canvas`](struct.Canvas.html)
-pub trait ActorCanvasExt: 'static {
-    /// Retrieves the scaling factor of `self`, as set using
-    /// `CanvasExt::set_scale_factor`.
-    ///
-    /// # Returns
-    ///
-    /// the scaling factor, or -1 if the `self`
-    ///  uses the default from `Settings`
-    fn get_scale_factor(&self) -> i32;
-
-    /// Sets the scaling factor for the Cairo surface used by `self`.
-    ///
-    /// This function should rarely be used.
-    ///
-    /// The default scaling factor of a `Canvas` content uses the
-    /// `Settings:window-scaling-factor` property, which is set by
-    /// the windowing system. By using this function it is possible to
-    /// override that setting.
-    ///
-    /// Changing the scale factor will invalidate the `self`.
-    /// ## `scale`
-    /// the scale factor, or -1 for the default
-    fn set_scale_factor(&self, scale: i32);
-
-    /// Sets the size of the `self`, and invalidates the content.
-    ///
-    /// This function will cause the `self` to be invalidated only
-    /// if the size of the canvas surface has changed.
-    ///
-    /// If you want to invalidate the contents of the `self` when setting
-    /// the size, you can use the return value of the function to conditionally
-    /// call `Content::invalidate`:
-    ///
-    ///
-    /// ```text
-    ///   if (!canvas_set_size (canvas, width, height))
-    ///     content_invalidate (CONTENT (canvas));
-    /// ```
-    /// ## `width`
-    /// the width of the canvas, in pixels
-    /// ## `height`
-    /// the height of the canvas, in pixels
-    ///
-    /// # Returns
-    ///
-    /// this function returns `true` if the size change
-    ///  caused a content invalidation, and `false` otherwise
-    fn set_size(&self, width: i32, height: i32) -> bool;
-
-    /// The height of the canvas.
-    fn get_property_height(&self) -> i32;
-
-    /// The height of the canvas.
-    fn set_property_height(&self, height: i32);
-
-    /// Whether the `Canvas:scale-factor` property is set.
-    ///
-    /// If the `Canvas:scale-factor-set` property is `false`
-    /// then `Canvas` will use the `Settings:window-scaling-factor`
-    /// property.
-    fn get_property_scale_factor_set(&self) -> bool;
-
-    /// The width of the canvas.
-    fn get_property_width(&self) -> i32;
-
-    /// The width of the canvas.
-    fn set_property_width(&self, width: i32);
-
-    /// The `Canvas::draw` signal is emitted each time a canvas is
-    /// invalidated.
-    ///
-    /// It is safe to connect multiple handlers to this signal: each
-    /// handler invocation will be automatically protected by `cairo_save`
-    /// and `cairo_restore` pairs.
-    /// ## `cr`
-    /// the Cairo context used to draw
-    /// ## `width`
-    /// the width of the `canvas`
-    /// ## `height`
-    /// the height of the `canvas`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the signal emission should stop, and
-    ///  `false` otherwise
-    fn connect_draw<F: Fn(&Self, &cairo::Context, i32, i32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_scale_factor_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_scale_factor_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<ActorCanvas>> ActorCanvasExt for O {
-    fn get_scale_factor(&self) -> i32 {
-        unsafe { ffi::clutter_canvas_get_scale_factor(self.as_ref().to_glib_none().0) }
-    }
-
-    fn set_scale_factor(&self, scale: i32) {
-        unsafe {
-            ffi::clutter_canvas_set_scale_factor(self.as_ref().to_glib_none().0, scale);
-        }
-    }
-
-    fn set_size(&self, width: i32, height: i32) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_canvas_set_size(
-                self.as_ref().to_glib_none().0,
-                width,
-                height,
-            ))
-        }
-    }
-
-    fn get_property_height(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"height\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `height` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_height(&self, height: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"height\0".as_ptr() as *const _,
-                Value::from(&height).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_scale_factor_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"scale-factor-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `scale-factor-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_width(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"width\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `width` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_width(&self, width: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"width\0".as_ptr() as *const _,
-                Value::from(&width).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_draw<F: Fn(&Self, &cairo::Context, i32, i32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn draw_trampoline<
-            P,
-            F: Fn(&P, &cairo::Context, i32, i32) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterCanvas,
-            cr: *mut cairo_sys::cairo_t,
-            width: libc::c_int,
-            height: libc::c_int,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<ActorCanvas>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &ActorCanvas::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(cr),
-                width,
-                height,
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"draw\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    draw_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_height_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterCanvas,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ActorCanvas>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ActorCanvas::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::height\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_height_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_scale_factor_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_scale_factor_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterCanvas,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ActorCanvas>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ActorCanvas::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::scale-factor\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_scale_factor_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_scale_factor_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_scale_factor_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterCanvas,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ActorCanvas>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ActorCanvas::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::scale-factor-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_scale_factor_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterCanvas,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ActorCanvas>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ActorCanvas::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for ActorCanvas {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Canvas")
-    }
-}
diff --git a/src/legacy/actor_meta.rs b/src/legacy/actor_meta.rs
deleted file mode 100644
index 9dd3ad3..0000000
--- a/src/legacy/actor_meta.rs
+++ /dev/null
@@ -1,186 +0,0 @@
-use crate::Actor;
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct ActorMeta(Object<ffi::ClutterActorMeta, ffi::ClutterActorMetaClass, ActorMetaClass>) @extends gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_actor_meta_get_type(),
-    }
-}
-
-/// Trait containing all `ActorMeta` methods.
-///
-/// # Implementors
-///
-/// [`Action`](struct.Action.html), [`ActorMeta`](struct.ActorMeta.html), [`Constraint`](struct.Constraint.html), [`Effect`](struct.Effect.html)
-pub trait ActorMetaExt: 'static {
-    /// Retrieves a pointer to the `Actor` that owns `self`
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a `Actor` or `None`
-    fn get_actor(&self) -> Option<Actor>;
-
-    /// Retrieves whether `self` is enabled
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `ActorMeta` instance is enabled
-    fn get_enabled(&self) -> bool;
-
-    /// Retrieves the name set using `ActorMetaExt::set_name`
-    ///
-    /// # Returns
-    ///
-    /// the name of the `ActorMeta`
-    ///  instance, or `None` if none was set. The returned string is owned
-    ///  by the `ActorMeta` instance and it should not be modified
-    ///  or freed
-    fn get_name(&self) -> Option<GString>;
-
-    /// Sets whether `self` should be enabled or not
-    /// ## `is_enabled`
-    /// whether `self` is enabled
-    fn set_enabled(&self, is_enabled: bool);
-
-    /// Sets the name of `self`
-    ///
-    /// The name can be used to identify the `ActorMeta` instance
-    /// ## `name`
-    /// the name of `self`
-    fn set_name(&self, name: &str);
-
-    fn connect_property_actor_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_enabled_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_name_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<ActorMeta>> ActorMetaExt for O {
-    fn get_actor(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_meta_get_actor(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_enabled(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_actor_meta_get_enabled(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_name(&self) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_actor_meta_get_name(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_enabled(&self, is_enabled: bool) {
-        unsafe {
-            ffi::clutter_actor_meta_set_enabled(
-                self.as_ref().to_glib_none().0,
-                is_enabled.to_glib(),
-            );
-        }
-    }
-
-    fn set_name(&self, name: &str) {
-        unsafe {
-            ffi::clutter_actor_meta_set_name(self.as_ref().to_glib_none().0, name.to_glib_none().0);
-        }
-    }
-
-    fn connect_property_actor_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_actor_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActorMeta,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ActorMeta>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ActorMeta::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::actor\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_actor_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_enabled_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_enabled_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActorMeta,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ActorMeta>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ActorMeta::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::enabled\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_enabled_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_name_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_name_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterActorMeta,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ActorMeta>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ActorMeta::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::name\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_name_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for ActorMeta {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ActorMeta")
-    }
-}
diff --git a/src/legacy/align_constraint.rs b/src/legacy/align_constraint.rs
deleted file mode 100644
index fbed51a..0000000
--- a/src/legacy/align_constraint.rs
+++ /dev/null
@@ -1,201 +0,0 @@
-use crate::{Actor, ActorMeta, AlignAxis, Constraint};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct AlignConstraint(Object<ffi::ClutterAlignConstraint, ffi::ClutterAlignConstraintClass, AlignConstraintClass>) @extends Constraint, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_align_constraint_get_type(),
-    }
-}
-
-impl AlignConstraint {
-    /// Creates a new constraint, aligning a `Actor`'s position with
-    /// regards of the size of the actor to `source`, with the given
-    /// alignment `factor`
-    /// ## `source`
-    /// the `Actor` to use as the source of the
-    ///  alignment, or `None`
-    /// ## `axis`
-    /// the axis to be used to compute the alignment
-    /// ## `factor`
-    /// the alignment factor, between 0.0 and 1.0
-    ///
-    /// # Returns
-    ///
-    /// the newly created `AlignConstraint`
-    pub fn new<P: IsA<Actor>>(source: Option<&P>, axis: AlignAxis, factor: f32) -> AlignConstraint {
-        unsafe {
-            Constraint::from_glib_none(ffi::clutter_align_constraint_new(
-                source.map(|p| p.as_ref()).to_glib_none().0,
-                axis.to_glib(),
-                factor,
-            ))
-            .unsafe_cast()
-        }
-    }
-
-    /// Retrieves the value set using `AlignConstraint::set_align_axis`
-    ///
-    /// # Returns
-    ///
-    /// the alignment axis
-    pub fn get_align_axis(&self) -> AlignAxis {
-        unsafe {
-            from_glib(ffi::clutter_align_constraint_get_align_axis(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the factor set using `AlignConstraint::set_factor`
-    ///
-    /// # Returns
-    ///
-    /// the alignment factor
-    pub fn get_factor(&self) -> f32 {
-        unsafe { ffi::clutter_align_constraint_get_factor(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the source of the alignment
-    ///
-    /// # Returns
-    ///
-    /// the `Actor` used as the source
-    ///  of the alignment
-    pub fn get_source(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_align_constraint_get_source(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Sets the axis to which the alignment refers to
-    /// ## `axis`
-    /// the axis to which the alignment refers to
-    pub fn set_align_axis(&self, axis: AlignAxis) {
-        unsafe {
-            ffi::clutter_align_constraint_set_align_axis(self.to_glib_none().0, axis.to_glib());
-        }
-    }
-
-    /// Sets the alignment factor of the constraint
-    ///
-    /// The factor depends on the `AlignConstraint:align-axis` property
-    /// and it is a value between 0.0 (meaning left, when
-    /// `AlignConstraint:align-axis` is set to `AlignAxis::XAxis`; or
-    /// meaning top, when `AlignConstraint:align-axis` is set to
-    /// `AlignAxis::YAxis`) and 1.0 (meaning right, when
-    /// `AlignConstraint:align-axis` is set to `AlignAxis::XAxis`; or
-    /// meaning bottom, when `AlignConstraint:align-axis` is set to
-    /// `AlignAxis::YAxis`). A value of 0.5 aligns in the middle in either
-    /// cases
-    /// ## `factor`
-    /// the alignment factor, between 0.0 and 1.0
-    pub fn set_factor(&self, factor: f32) {
-        unsafe {
-            ffi::clutter_align_constraint_set_factor(self.to_glib_none().0, factor);
-        }
-    }
-
-    /// Sets the source of the alignment constraint
-    /// ## `source`
-    /// a `Actor`, or `None` to unset the source
-    pub fn set_source<P: IsA<Actor>>(&self, source: Option<&P>) {
-        unsafe {
-            ffi::clutter_align_constraint_set_source(
-                self.to_glib_none().0,
-                source.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    pub fn connect_property_align_axis_notify<F: Fn(&AlignConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_align_axis_trampoline<F: Fn(&AlignConstraint) + 'static>(
-            this: *mut ffi::ClutterAlignConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::align-axis\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_align_axis_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_factor_notify<F: Fn(&AlignConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_factor_trampoline<F: Fn(&AlignConstraint) + 'static>(
-            this: *mut ffi::ClutterAlignConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::factor\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_factor_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_source_notify<F: Fn(&AlignConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_source_trampoline<F: Fn(&AlignConstraint) + 'static>(
-            this: *mut ffi::ClutterAlignConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::source\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_source_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for AlignConstraint {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "AlignConstraint")
-    }
-}
diff --git a/src/legacy/alpha.rs b/src/legacy/alpha.rs
deleted file mode 100644
index 03e28c1..0000000
--- a/src/legacy/alpha.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-use glib::{object as gobject, translate::*};
-use std::fmt;
-// use crate::Scriptable;
-
-// TODO: , @implements Scriptable
-glib_wrapper! {
-    pub struct Alpha(Object<ffi::ClutterAlpha, ffi::ClutterAlphaClass, AlphaClass>) @extends gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_alpha_get_type(),
-    }
-}
-
-impl Alpha {}
-
-impl fmt::Display for Alpha {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Alpha")
-    }
-}
diff --git a/src/legacy/animatable.rs b/src/legacy/animatable.rs
deleted file mode 100644
index d65154a..0000000
--- a/src/legacy/animatable.rs
+++ /dev/null
@@ -1,133 +0,0 @@
-use crate::Interval;
-use glib::{object::IsA, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct Animatable(Interface<ffi::ClutterAnimatable>);
-
-    match fn {
-        get_type => || ffi::clutter_animatable_get_type(),
-    }
-}
-
-/// Trait containing all `Animatable` methods.
-///
-/// # Implementors
-///
-/// [`Actor`](struct.Actor.html), [`Animatable`](struct.Animatable.html), [`Box`](struct.Box.html), [`Clone`](struct.Clone.html), [`Group`](struct.Group.html), [`Rectangle`](struct.Rectangle.html), [`ScrollActor`](struct.ScrollActor.html), [`Stage`](struct.Stage.html), [`Text`](struct.Text.html), [`Texture`](struct.Texture.html)
-pub trait AnimatableExt: 'static {
-    /// Finds the `gobject::ParamSpec` for `property_name`
-    /// ## `property_name`
-    /// the name of the animatable property to find
-    ///
-    /// # Returns
-    ///
-    /// The `gobject::ParamSpec` for the given property
-    ///  or `None`
-    fn find_property(&self, property_name: &str) -> Option<glib::ParamSpec>;
-
-    /// Retrieves the current state of `property_name` and sets `value` with it
-    /// ## `property_name`
-    /// the name of the animatable property to retrieve
-    /// ## `value`
-    /// a `gobject::Value` initialized to the type of the property to retrieve
-    fn get_initial_state(&self, property_name: &str, value: &mut glib::Value);
-
-    /// Asks a `Animatable` implementation to interpolate a
-    /// a named property between the initial and final values of
-    /// a `Interval`, using `progress` as the interpolation
-    /// value, and store the result inside `value`.
-    ///
-    /// This function should be used for every property animation
-    /// involving `Animatable`<!-- -->s.
-    ///
-    /// This function replaces `Animatable::animate_property`.
-    /// ## `property_name`
-    /// the name of the property to interpolate
-    /// ## `interval`
-    /// a `Interval` with the animation range
-    /// ## `progress`
-    /// the progress to use to interpolate between the
-    ///  initial and final values of the `interval`
-    /// ## `value`
-    /// return location for an initialized `gobject::Value`
-    ///  using the same type of the `interval`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the interpolation was successful,
-    ///  and `false` otherwise
-    fn interpolate_value<P: IsA<Interval>>(
-        &self,
-        property_name: &str,
-        interval: &P,
-        progress: f64,
-    ) -> Option<glib::Value>;
-
-    /// Sets the current state of `property_name` to `value`
-    /// ## `property_name`
-    /// the name of the animatable property to set
-    /// ## `value`
-    /// the value of the animatable property to set
-    fn set_final_state(&self, property_name: &str, value: &glib::Value);
-}
-
-impl<O: IsA<Animatable>> AnimatableExt for O {
-    fn find_property(&self, property_name: &str) -> Option<glib::ParamSpec> {
-        unsafe {
-            from_glib_none(ffi::clutter_animatable_find_property(
-                self.as_ref().to_glib_none().0,
-                property_name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_initial_state(&self, property_name: &str, value: &mut glib::Value) {
-        unsafe {
-            ffi::clutter_animatable_get_initial_state(
-                self.as_ref().to_glib_none().0,
-                property_name.to_glib_none().0,
-                value.to_glib_none_mut().0,
-            );
-        }
-    }
-
-    fn interpolate_value<P: IsA<Interval>>(
-        &self,
-        property_name: &str,
-        interval: &P,
-        progress: f64,
-    ) -> Option<glib::Value> {
-        unsafe {
-            let mut value = glib::Value::uninitialized();
-            let ret = from_glib(ffi::clutter_animatable_interpolate_value(
-                self.as_ref().to_glib_none().0,
-                property_name.to_glib_none().0,
-                interval.as_ref().to_glib_none().0,
-                progress,
-                value.to_glib_none_mut().0,
-            ));
-            if ret {
-                Some(value)
-            } else {
-                None
-            }
-        }
-    }
-
-    fn set_final_state(&self, property_name: &str, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_animatable_set_final_state(
-                self.as_ref().to_glib_none().0,
-                property_name.to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-}
-
-impl fmt::Display for Animatable {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Animatable")
-    }
-}
diff --git a/src/legacy/backend.rs b/src/legacy/backend.rs
deleted file mode 100644
index f42272e..0000000
--- a/src/legacy/backend.rs
+++ /dev/null
@@ -1,153 +0,0 @@
-use glib::{
-    object::ObjectType as ObjectType_,
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct Backend(Object<ffi::ClutterBackend, ffi::ClutterBackendClass, BackendClass>);
-
-    match fn {
-        get_type => || ffi::clutter_backend_get_type(),
-    }
-}
-
-impl Backend {
-    pub fn get_context(&self) -> Option<dx::Context> {
-        unsafe {
-            from_glib_none(ffi::clutter_backend_get_cogl_context(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the font options for `self`.
-    ///
-    /// # Returns
-    ///
-    /// the font options of the `Backend`.
-    ///  The returned `cairo::FontOptions` is owned by the backend and should
-    ///  not be modified or freed
-    pub fn get_font_options(&self) -> Option<cairo::FontOptions> {
-        unsafe { from_glib_none(ffi::clutter_backend_get_font_options(self.to_glib_none().0)) }
-    }
-
-    /// Gets the resolution for font handling on the screen.
-    ///
-    /// The resolution is a scale factor between points specified in a
-    /// `pango::FontDescription` and cairo units. The default value is 96.0,
-    /// meaning that a 10 point font will be 13 units
-    /// high (10 * 96. / 72. = 13.3).
-    ///
-    /// will set the resolution using the current backend when
-    /// initializing; the resolution is also stored in the
-    /// `Settings:font-dpi` property.
-    ///
-    /// # Returns
-    ///
-    /// the current resolution, or -1 if no resolution
-    ///  has been set.
-    pub fn get_resolution(&self) -> f64 {
-        unsafe { ffi::clutter_backend_get_resolution(self.to_glib_none().0) }
-    }
-
-    /// Sets the new font options for `self`. The `Backend` will
-    /// copy the `cairo::FontOptions`.
-    ///
-    /// If `options` is `None`, the first following call to
-    /// `Backend::get_font_options` will return the default font
-    /// options for `self`.
-    ///
-    /// This function is intended for actors creating a Pango layout
-    /// using the PangoCairo API.
-    /// ## `options`
-    /// Cairo font options for the backend, or `None`
-    pub fn set_font_options(&self, options: &cairo::FontOptions) {
-        unsafe {
-            ffi::clutter_backend_set_font_options(self.to_glib_none().0, options.to_glib_none().0);
-        }
-    }
-
-    /// The ::font-changed signal is emitted each time the font options
-    /// have been changed through `Settings`.
-    pub fn connect_font_changed<F: Fn(&Backend) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn font_changed_trampoline<F: Fn(&Backend) + 'static>(
-            this: *mut ffi::ClutterBackend,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"font-changed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    font_changed_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    /// The ::resolution-changed signal is emitted each time the font
-    /// resolutions has been changed through `Settings`.
-    pub fn connect_resolution_changed<F: Fn(&Backend) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn resolution_changed_trampoline<F: Fn(&Backend) + 'static>(
-            this: *mut ffi::ClutterBackend,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"resolution-changed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    resolution_changed_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    /// The ::settings-changed signal is emitted each time the `Settings`
-    /// properties have been changed.
-    pub fn connect_settings_changed<F: Fn(&Backend) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn settings_changed_trampoline<F: Fn(&Backend) + 'static>(
-            this: *mut ffi::ClutterBackend,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"settings-changed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    settings_changed_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl Default for Backend {
-    fn default() -> Self {
-        unsafe { from_glib_none(ffi::clutter_get_default_backend()) }
-    }
-}
-
-impl fmt::Display for Backend {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Backend")
-    }
-}
diff --git a/src/legacy/behaviour.rs b/src/legacy/behaviour.rs
deleted file mode 100644
index 513e10c..0000000
--- a/src/legacy/behaviour.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-use glib::translate::*;
-use std::fmt;
-// use crate::Scriptable;
-
-// TODO:  @implements Scriptable
-glib_wrapper! {
-    pub struct Behaviour(Object<ffi::ClutterBehaviour, ffi::ClutterBehaviourClass, BehaviourClass>);
-
-    match fn {
-        get_type => || ffi::clutter_behaviour_get_type(),
-    }
-}
-
-impl Behaviour {}
-
-impl fmt::Display for Behaviour {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Behaviour")
-    }
-}
diff --git a/src/legacy/behaviour_ellipse.rs b/src/legacy/behaviour_ellipse.rs
deleted file mode 100644
index 5a775c8..0000000
--- a/src/legacy/behaviour_ellipse.rs
+++ /dev/null
@@ -1,551 +0,0 @@
-// Scriptable
-use crate::{Alpha, Behaviour, RotateAxis, RotateDirection};
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::mem::transmute;
-use std::{fmt, mem};
-
-// TODO: @implements Scriptable
-glib_wrapper! {
-    pub struct BehaviourEllipse(Object<ffi::ClutterBehaviourEllipse, ffi::ClutterBehaviourEllipseClass, BehaviourEllipseClass>) @extends Behaviour;
-
-    match fn {
-        get_type => || ffi::clutter_behaviour_ellipse_get_type(),
-    }
-}
-
-impl BehaviourEllipse {
-    pub fn new<P: IsA<Alpha>>(
-        alpha: Option<&P>,
-        x: i32,
-        y: i32,
-        width: i32,
-        height: i32,
-        direction: RotateDirection,
-        start: f64,
-        end: f64,
-    ) -> BehaviourEllipse {
-        unsafe {
-            Behaviour::from_glib_full(ffi::clutter_behaviour_ellipse_new(
-                alpha.map(|p| p.as_ref()).to_glib_none().0,
-                x,
-                y,
-                width,
-                height,
-                direction.to_glib(),
-                start,
-                end,
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-pub trait BehaviourEllipseExt: 'static {
-    fn get_angle_end(&self) -> f64;
-
-    fn get_angle_start(&self) -> f64;
-
-    fn get_angle_tilt(&self, axis: RotateAxis) -> f64;
-
-    fn get_center(&self) -> (i32, i32);
-
-    fn get_direction(&self) -> RotateDirection;
-
-    fn get_height(&self) -> i32;
-
-    fn get_tilt(&self) -> (f64, f64, f64);
-
-    fn get_width(&self) -> i32;
-
-    fn set_angle_end(&self, angle_end: f64);
-
-    fn set_angle_start(&self, angle_start: f64);
-
-    fn set_angle_tilt(&self, axis: RotateAxis, angle_tilt: f64);
-
-    fn set_center(&self, x: i32, y: i32);
-
-    fn set_direction(&self, direction: RotateDirection);
-
-    fn set_height(&self, height: i32);
-
-    fn set_tilt(&self, angle_tilt_x: f64, angle_tilt_y: f64, angle_tilt_z: f64);
-
-    fn set_width(&self, width: i32);
-
-    fn get_property_angle_tilt_x(&self) -> f64;
-
-    fn set_property_angle_tilt_x(&self, angle_tilt_x: f64);
-
-    fn get_property_angle_tilt_y(&self) -> f64;
-
-    fn set_property_angle_tilt_y(&self, angle_tilt_y: f64);
-
-    fn get_property_angle_tilt_z(&self) -> f64;
-
-    fn set_property_angle_tilt_z(&self, angle_tilt_z: f64);
-
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_angle_tilt_x_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_angle_tilt_y_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_angle_tilt_z_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_center_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<BehaviourEllipse>> BehaviourEllipseExt for O {
-    fn get_angle_end(&self) -> f64 {
-        unsafe { ffi::clutter_behaviour_ellipse_get_angle_end(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_angle_start(&self) -> f64 {
-        unsafe { ffi::clutter_behaviour_ellipse_get_angle_start(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_angle_tilt(&self, axis: RotateAxis) -> f64 {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_get_angle_tilt(
-                self.as_ref().to_glib_none().0,
-                axis.to_glib(),
-            )
-        }
-    }
-
-    fn get_center(&self) -> (i32, i32) {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            ffi::clutter_behaviour_ellipse_get_center(
-                self.as_ref().to_glib_none().0,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-            );
-            let x = x.assume_init();
-            let y = y.assume_init();
-            (x, y)
-        }
-    }
-
-    fn get_direction(&self) -> RotateDirection {
-        unsafe {
-            from_glib(ffi::clutter_behaviour_ellipse_get_direction(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_height(&self) -> i32 {
-        unsafe { ffi::clutter_behaviour_ellipse_get_height(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_tilt(&self) -> (f64, f64, f64) {
-        unsafe {
-            let mut angle_tilt_x = mem::MaybeUninit::uninit();
-            let mut angle_tilt_y = mem::MaybeUninit::uninit();
-            let mut angle_tilt_z = mem::MaybeUninit::uninit();
-            ffi::clutter_behaviour_ellipse_get_tilt(
-                self.as_ref().to_glib_none().0,
-                angle_tilt_x.as_mut_ptr(),
-                angle_tilt_y.as_mut_ptr(),
-                angle_tilt_z.as_mut_ptr(),
-            );
-            let angle_tilt_x = angle_tilt_x.assume_init();
-            let angle_tilt_y = angle_tilt_y.assume_init();
-            let angle_tilt_z = angle_tilt_z.assume_init();
-            (angle_tilt_x, angle_tilt_y, angle_tilt_z)
-        }
-    }
-
-    fn get_width(&self) -> i32 {
-        unsafe { ffi::clutter_behaviour_ellipse_get_width(self.as_ref().to_glib_none().0) }
-    }
-
-    fn set_angle_end(&self, angle_end: f64) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_angle_end(self.as_ref().to_glib_none().0, angle_end);
-        }
-    }
-
-    fn set_angle_start(&self, angle_start: f64) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_angle_start(
-                self.as_ref().to_glib_none().0,
-                angle_start,
-            );
-        }
-    }
-
-    fn set_angle_tilt(&self, axis: RotateAxis, angle_tilt: f64) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_angle_tilt(
-                self.as_ref().to_glib_none().0,
-                axis.to_glib(),
-                angle_tilt,
-            );
-        }
-    }
-
-    fn set_center(&self, x: i32, y: i32) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_center(self.as_ref().to_glib_none().0, x, y);
-        }
-    }
-
-    fn set_direction(&self, direction: RotateDirection) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_direction(
-                self.as_ref().to_glib_none().0,
-                direction.to_glib(),
-            );
-        }
-    }
-
-    fn set_height(&self, height: i32) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_height(self.as_ref().to_glib_none().0, height);
-        }
-    }
-
-    fn set_tilt(&self, angle_tilt_x: f64, angle_tilt_y: f64, angle_tilt_z: f64) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_tilt(
-                self.as_ref().to_glib_none().0,
-                angle_tilt_x,
-                angle_tilt_y,
-                angle_tilt_z,
-            );
-        }
-    }
-
-    fn set_width(&self, width: i32) {
-        unsafe {
-            ffi::clutter_behaviour_ellipse_set_width(self.as_ref().to_glib_none().0, width);
-        }
-    }
-
-    fn get_property_angle_tilt_x(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-tilt-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `angle-tilt-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_angle_tilt_x(&self, angle_tilt_x: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-tilt-x\0".as_ptr() as *const _,
-                Value::from(&angle_tilt_x).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_angle_tilt_y(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-tilt-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `angle-tilt-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_angle_tilt_y(&self, angle_tilt_y: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-tilt-y\0".as_ptr() as *const _,
-                Value::from(&angle_tilt_y).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_angle_tilt_z(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-tilt-z\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `angle-tilt-z` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_angle_tilt_z(&self, angle_tilt_z: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-tilt-z\0".as_ptr() as *const _,
-                Value::from(&angle_tilt_z).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_end_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle-end\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_end_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_start_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle-start\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_start_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_angle_tilt_x_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_tilt_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle-tilt-x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_tilt_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_angle_tilt_y_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_tilt_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle-tilt-y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_tilt_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_angle_tilt_z_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_tilt_z_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle-tilt-z\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_tilt_z_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_center_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_center_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::center\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_center_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_direction_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::direction\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_direction_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_height_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::height\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_height_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourEllipse,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourEllipse>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourEllipse::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for BehaviourEllipse {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BehaviourEllipse")
-    }
-}
diff --git a/src/legacy/behaviour_rotate.rs b/src/legacy/behaviour_rotate.rs
deleted file mode 100644
index 22f743c..0000000
--- a/src/legacy/behaviour_rotate.rs
+++ /dev/null
@@ -1,473 +0,0 @@
-// Scriptable
-use crate::{Alpha, Behaviour, RotateAxis, RotateDirection};
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-// TODO: , @implements Scriptable
-glib_wrapper! {
-    pub struct BehaviourRotate(Object<ffi::ClutterBehaviourRotate, ffi::ClutterBehaviourRotateClass, BehaviourRotateClass>) @extends Behaviour;
-
-    match fn {
-        get_type => || ffi::clutter_behaviour_rotate_get_type(),
-    }
-}
-
-impl BehaviourRotate {
-    pub fn new<P: IsA<Alpha>>(
-        alpha: Option<&P>,
-        axis: RotateAxis,
-        direction: RotateDirection,
-        angle_start: f64,
-        angle_end: f64,
-    ) -> BehaviourRotate {
-        unsafe {
-            Behaviour::from_glib_full(ffi::clutter_behaviour_rotate_new(
-                alpha.map(|p| p.as_ref()).to_glib_none().0,
-                axis.to_glib(),
-                direction.to_glib(),
-                angle_start,
-                angle_end,
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-pub trait BehaviourRotateExt: 'static {
-    fn get_axis(&self) -> RotateAxis;
-
-    fn get_bounds(&self) -> (f64, f64);
-
-    fn get_center(&self) -> (i32, i32, i32);
-
-    fn get_direction(&self) -> RotateDirection;
-
-    fn set_axis(&self, axis: RotateAxis);
-
-    fn set_bounds(&self, angle_start: f64, angle_end: f64);
-
-    fn set_center(&self, x: i32, y: i32, z: i32);
-
-    fn set_direction(&self, direction: RotateDirection);
-
-    fn get_property_angle_end(&self) -> f64;
-
-    fn set_property_angle_end(&self, angle_end: f64);
-
-    fn get_property_angle_start(&self) -> f64;
-
-    fn set_property_angle_start(&self, angle_start: f64);
-
-    fn get_property_center_x(&self) -> i32;
-
-    fn set_property_center_x(&self, center_x: i32);
-
-    fn get_property_center_y(&self) -> i32;
-
-    fn set_property_center_y(&self, center_y: i32);
-
-    fn get_property_center_z(&self) -> i32;
-
-    fn set_property_center_z(&self, center_z: i32);
-
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_center_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_center_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_center_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<BehaviourRotate>> BehaviourRotateExt for O {
-    fn get_axis(&self) -> RotateAxis {
-        unsafe {
-            from_glib(ffi::clutter_behaviour_rotate_get_axis(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_bounds(&self) -> (f64, f64) {
-        unsafe {
-            let mut angle_start = mem::MaybeUninit::uninit();
-            let mut angle_end = mem::MaybeUninit::uninit();
-            ffi::clutter_behaviour_rotate_get_bounds(
-                self.as_ref().to_glib_none().0,
-                angle_start.as_mut_ptr(),
-                angle_end.as_mut_ptr(),
-            );
-            let angle_start = angle_start.assume_init();
-            let angle_end = angle_end.assume_init();
-            (angle_start, angle_end)
-        }
-    }
-
-    fn get_center(&self) -> (i32, i32, i32) {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            let mut z = mem::MaybeUninit::uninit();
-            ffi::clutter_behaviour_rotate_get_center(
-                self.as_ref().to_glib_none().0,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-                z.as_mut_ptr(),
-            );
-            let x = x.assume_init();
-            let y = y.assume_init();
-            let z = z.assume_init();
-            (x, y, z)
-        }
-    }
-
-    fn get_direction(&self) -> RotateDirection {
-        unsafe {
-            from_glib(ffi::clutter_behaviour_rotate_get_direction(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_axis(&self, axis: RotateAxis) {
-        unsafe {
-            ffi::clutter_behaviour_rotate_set_axis(self.as_ref().to_glib_none().0, axis.to_glib());
-        }
-    }
-
-    fn set_bounds(&self, angle_start: f64, angle_end: f64) {
-        unsafe {
-            ffi::clutter_behaviour_rotate_set_bounds(
-                self.as_ref().to_glib_none().0,
-                angle_start,
-                angle_end,
-            );
-        }
-    }
-
-    fn set_center(&self, x: i32, y: i32, z: i32) {
-        unsafe {
-            ffi::clutter_behaviour_rotate_set_center(self.as_ref().to_glib_none().0, x, y, z);
-        }
-    }
-
-    fn set_direction(&self, direction: RotateDirection) {
-        unsafe {
-            ffi::clutter_behaviour_rotate_set_direction(
-                self.as_ref().to_glib_none().0,
-                direction.to_glib(),
-            );
-        }
-    }
-
-    fn get_property_angle_end(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-end\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `angle-end` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_angle_end(&self, angle_end: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-end\0".as_ptr() as *const _,
-                Value::from(&angle_end).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_angle_start(&self) -> f64 {
-        unsafe {
-            let mut value = Value::from_type(<f64 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-start\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `angle-start` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_angle_start(&self, angle_start: f64) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"angle-start\0".as_ptr() as *const _,
-                Value::from(&angle_start).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_center_x(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"center-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `center-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_center_x(&self, center_x: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"center-x\0".as_ptr() as *const _,
-                Value::from(&center_x).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_center_y(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"center-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `center-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_center_y(&self, center_y: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"center-y\0".as_ptr() as *const _,
-                Value::from(&center_y).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_center_z(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"center-z\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `center-z` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_center_z(&self, center_z: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"center-z\0".as_ptr() as *const _,
-                Value::from(&center_z).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_end_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourRotate,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourRotate>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourRotate::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle-end\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_end_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_start_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourRotate,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourRotate>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourRotate::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle-start\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_start_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_axis_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourRotate,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourRotate>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourRotate::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::axis\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_axis_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_center_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_center_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourRotate,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourRotate>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourRotate::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::center-x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_center_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_center_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_center_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourRotate,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourRotate>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourRotate::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::center-y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_center_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_center_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_center_z_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourRotate,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourRotate>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourRotate::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::center-z\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_center_z_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_direction_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBehaviourRotate,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BehaviourRotate>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BehaviourRotate::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::direction\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_direction_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for BehaviourRotate {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BehaviourRotate")
-    }
-}
diff --git a/src/legacy/bin_layout.rs b/src/legacy/bin_layout.rs
deleted file mode 100644
index 1eb2a7a..0000000
--- a/src/legacy/bin_layout.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-use crate::{BinAlignment, LayoutManager};
-use glib::{object as gobject, object::Cast, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct BinLayout(Object<ffi::ClutterBinLayout, ffi::ClutterBinLayoutClass, BinLayoutClass>) @extends LayoutManager, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_bin_layout_get_type(),
-    }
-}
-
-impl BinLayout {
-    /// Creates a new `BinLayout` layout manager
-    /// ## `x_align`
-    /// the default alignment policy to be used on the
-    ///  horizontal axis
-    /// ## `y_align`
-    /// the default alignment policy to be used on the
-    ///  vertical axis
-    ///
-    /// # Returns
-    ///
-    /// the newly created layout manager
-    pub fn new(x_align: BinAlignment, y_align: BinAlignment) -> BinLayout {
-        unsafe {
-            LayoutManager::from_glib_none(ffi::clutter_bin_layout_new(
-                x_align.to_glib(),
-                y_align.to_glib(),
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-impl fmt::Display for BinLayout {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BinLayout")
-    }
-}
diff --git a/src/legacy/bind_constraint.rs b/src/legacy/bind_constraint.rs
deleted file mode 100644
index 2c8f58f..0000000
--- a/src/legacy/bind_constraint.rs
+++ /dev/null
@@ -1,196 +0,0 @@
-use crate::{Actor, ActorMeta, BindCoordinate, Constraint};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct BindConstraint(Object<ffi::ClutterBindConstraint, ffi::ClutterBindConstraintClass, BindConstraintClass>) @extends Constraint, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_bind_constraint_get_type(),
-    }
-}
-
-impl BindConstraint {
-    /// Creates a new constraint, binding a `Actor`'s position to
-    /// the given `coordinate` of the position of `source`
-    /// ## `source`
-    /// the `Actor` to use as the source of
-    ///  the binding, or `None`
-    /// ## `coordinate`
-    /// the coordinate to bind
-    /// ## `offset`
-    /// the offset to apply to the binding, in pixels
-    ///
-    /// # Returns
-    ///
-    /// the newly created `BindConstraint`
-    pub fn new<P: IsA<Actor>>(
-        source: Option<&P>,
-        coordinate: BindCoordinate,
-        offset: f32,
-    ) -> BindConstraint {
-        unsafe {
-            Constraint::from_glib_none(ffi::clutter_bind_constraint_new(
-                source.map(|p| p.as_ref()).to_glib_none().0,
-                coordinate.to_glib(),
-                offset,
-            ))
-            .unsafe_cast()
-        }
-    }
-
-    /// Retrieves the bound coordinate of the constraint
-    ///
-    /// # Returns
-    ///
-    /// the bound coordinate
-    pub fn get_coordinate(&self) -> BindCoordinate {
-        unsafe {
-            from_glib(ffi::clutter_bind_constraint_get_coordinate(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the offset set using `BindConstraint::set_offset`
-    ///
-    /// # Returns
-    ///
-    /// the offset, in pixels
-    pub fn get_offset(&self) -> f32 {
-        unsafe { ffi::clutter_bind_constraint_get_offset(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the `Actor` set using `BindConstraint::set_source`
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the source actor
-    pub fn get_source(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_bind_constraint_get_source(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Sets the coordinate to bind in the constraint
-    /// ## `coordinate`
-    /// the coordinate to bind
-    pub fn set_coordinate(&self, coordinate: BindCoordinate) {
-        unsafe {
-            ffi::clutter_bind_constraint_set_coordinate(
-                self.to_glib_none().0,
-                coordinate.to_glib(),
-            );
-        }
-    }
-
-    /// Sets the offset to be applied to the constraint
-    /// ## `offset`
-    /// the offset to apply, in pixels
-    pub fn set_offset(&self, offset: f32) {
-        unsafe {
-            ffi::clutter_bind_constraint_set_offset(self.to_glib_none().0, offset);
-        }
-    }
-
-    /// Sets the source `Actor` for the constraint
-    /// ## `source`
-    /// a `Actor`, or `None` to unset the source
-    pub fn set_source<P: IsA<Actor>>(&self, source: Option<&P>) {
-        unsafe {
-            ffi::clutter_bind_constraint_set_source(
-                self.to_glib_none().0,
-                source.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    pub fn connect_property_coordinate_notify<F: Fn(&BindConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_coordinate_trampoline<F: Fn(&BindConstraint) + 'static>(
-            this: *mut ffi::ClutterBindConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::coordinate\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_coordinate_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_offset_notify<F: Fn(&BindConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_offset_trampoline<F: Fn(&BindConstraint) + 'static>(
-            this: *mut ffi::ClutterBindConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::offset\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_offset_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_source_notify<F: Fn(&BindConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_source_trampoline<F: Fn(&BindConstraint) + 'static>(
-            this: *mut ffi::ClutterBindConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::source\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_source_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for BindConstraint {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BindConstraint")
-    }
-}
diff --git a/src/legacy/binding_pool.rs b/src/legacy/binding_pool.rs
deleted file mode 100644
index 5bf8f2f..0000000
--- a/src/legacy/binding_pool.rs
+++ /dev/null
@@ -1,383 +0,0 @@
-use crate::ModifierType;
-use glib::{
-    object::{IsA, ObjectType as ObjectType_},
-    translate::*,
-    GString, StaticType, Value,
-};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct BindingPool(Object<ffi::ClutterBindingPool, ffi::ClutterBindingPoolClass, BindingPoolClass>);
-
-    match fn {
-        get_type => || ffi::clutter_binding_pool_get_type(),
-    }
-}
-
-impl BindingPool {
-    /// Creates a new `BindingPool` that can be used to store
-    /// key bindings for an actor. The `name` must be a unique identifier
-    /// for the binding pool, so that `BindingPool::find` will
-    /// be able to return the correct binding pool.
-    /// ## `name`
-    /// the name of the binding pool
-    ///
-    /// # Returns
-    ///
-    /// the newly created binding pool with the given
-    ///  name. Use `gobject::ObjectExt::unref` when done.
-    pub fn new(name: &str) -> BindingPool {
-        unsafe { from_glib_full(ffi::clutter_binding_pool_new(name.to_glib_none().0)) }
-    }
-
-    /// Activates the callback associated to the action that is
-    /// bound to the `key_val` and `modifiers` pair.
-    ///
-    /// The callback has the following signature:
-    ///
-    ///
-    /// ```text
-    ///   void (* callback) (GObject             *gobject,
-    ///                      const gchar         *action_name,
-    ///                      guint                key_val,
-    ///                      ModifierType  modifiers,
-    ///                      gpointer             user_data);
-    /// ```
-    ///
-    /// Where the `gobject::Object` instance is `gobject` and the user data
-    /// is the one passed when installing the action with
-    /// `BindingPool::install_action`.
-    ///
-    /// If the action bound to the `key_val`, `modifiers` pair has been
-    /// blocked using `BindingPool::block_action`, the callback
-    /// will not be invoked, and this function will return `false`.
-    /// ## `key_val`
-    /// the key symbol
-    /// ## `modifiers`
-    /// bitmask for the modifiers
-    /// ## `gobject`
-    /// a `gobject::Object`
-    ///
-    /// # Returns
-    ///
-    /// `true` if an action was found and was activated
-    pub fn activate<P: IsA<glib::Object>>(
-        &self,
-        key_val: u32,
-        modifiers: ModifierType,
-        gobject: &P,
-    ) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_binding_pool_activate(
-                self.to_glib_none().0,
-                key_val,
-                modifiers.to_glib(),
-                gobject.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Blocks all the actions with name `action_name` inside `self`.
-    /// ## `action_name`
-    /// an action name
-    pub fn block_action(&self, action_name: &str) {
-        unsafe {
-            ffi::clutter_binding_pool_block_action(
-                self.to_glib_none().0,
-                action_name.to_glib_none().0,
-            );
-        }
-    }
-
-    /// Retrieves the name of the action matching the given key symbol
-    /// and modifiers bitmask.
-    /// ## `key_val`
-    /// a key symbol
-    /// ## `modifiers`
-    /// a bitmask for the modifiers
-    ///
-    /// # Returns
-    ///
-    /// the name of the action, if found, or `None`. The
-    ///  returned string is owned by the binding pool and should never
-    ///  be modified or freed
-    pub fn find_action(&self, key_val: u32, modifiers: ModifierType) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_binding_pool_find_action(
-                self.to_glib_none().0,
-                key_val,
-                modifiers.to_glib(),
-            ))
-        }
-    }
-
-    // /// Installs a new action inside a `BindingPool`. The action
-    // /// is bound to `key_val` and `modifiers`.
-    // ///
-    // /// The same action name can be used for multiple `key_val`, `modifiers`
-    // /// pairs.
-    // ///
-    // /// When an action has been activated using `BindingPool::activate`
-    // /// the passed `callback` will be invoked (with `data`).
-    // ///
-    // /// Actions can be blocked with `BindingPool::block_action`
-    // /// and then unblocked using `BindingPool::unblock_action`.
-    // /// ## `action_name`
-    // /// the name of the action
-    // /// ## `key_val`
-    // /// key symbol
-    // /// ## `modifiers`
-    // /// bitmask of modifiers
-    // /// ## `callback`
-    // /// function to be called
-    // ///  when the action is activated
-    // /// ## `data`
-    // /// data to be passed to `callback`
-    // /// ## `notify`
-    // /// function to be called when the action is removed
-    // ///  from the pool
-    // pub fn install_action<P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static>(
-    //     &self,
-    //     action_name: &str,
-    //     key_val: u32,
-    //     modifiers: ModifierType,
-    //     callback: P,
-    // ) {
-    //     let callback_data: Box_<P> = Box_::new(callback);
-    //     unsafe extern "C" fn callback_func<
-    //         P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static,
-    //     >(
-    //         gobject: *mut gobject_sys::GObject,
-    //         action_name: *const libc::c_char,
-    //         key_val: libc::c_uint,
-    //         modifiers: ffi::ClutterModifierType,
-    //         user_data: glib_sys::gpointer,
-    //     ) -> glib_sys::gboolean {
-    //         let gobject = from_glib_borrow(gobject);
-    //         let action_name: Borrowed<GString> = from_glib_borrow(action_name);
-    //         let modifiers = from_glib_borrow(modifiers);
-    //         let callback: &P = &*(user_data as *mut _);
-    //         let res = (*callback)(&gobject, action_name.as_str(), key_val, &modifiers);
-    //         res.to_glib()
-    //     }
-    //     let callback = Some(callback_func::<P> as _);
-    //     unsafe extern "C" fn notify_func<
-    //         P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static,
-    //     >(
-    //         data: glib_sys::gpointer,
-    //     ) {
-    //         let _callback: Box_<P> = Box_::from_raw(data as *mut _);
-    //     }
-    //     let destroy_call6 = Some(notify_func::<P> as _);
-    //     let super_callback0: Box_<P> = callback_data;
-    //     unsafe {
-    //         ffi::clutter_binding_pool_install_action(
-    //             self.to_glib_none().0,
-    //             action_name.to_glib_none().0,
-    //             key_val,
-    //             modifiers.to_glib(),
-    //             callback,
-    //             Box_::into_raw(super_callback0) as *mut _,
-    //             destroy_call6,
-    //         );
-    //     }
-    // }
-
-    /// A `gobject::Closure` variant of `BindingPool::install_action`.
-    ///
-    /// Installs a new action inside a `BindingPool`. The action
-    /// is bound to `key_val` and `modifiers`.
-    ///
-    /// The same action name can be used for multiple `key_val`, `modifiers`
-    /// pairs.
-    ///
-    /// When an action has been activated using `BindingPool::activate`
-    /// the passed `closure` will be invoked.
-    ///
-    /// Actions can be blocked with `BindingPool::block_action`
-    /// and then unblocked using `BindingPool::unblock_action`.
-    /// ## `action_name`
-    /// the name of the action
-    /// ## `key_val`
-    /// key symbol
-    /// ## `modifiers`
-    /// bitmask of modifiers
-    /// ## `closure`
-    /// a `gobject::Closure`
-    pub fn install_closure(
-        &self,
-        action_name: &str,
-        key_val: u32,
-        modifiers: ModifierType,
-        closure: &glib::Closure,
-    ) {
-        unsafe {
-            ffi::clutter_binding_pool_install_closure(
-                self.to_glib_none().0,
-                action_name.to_glib_none().0,
-                key_val,
-                modifiers.to_glib(),
-                closure.to_glib_none().0,
-            );
-        }
-    }
-
-    // /// Allows overriding the action for `key_val` and `modifiers` inside a
-    // /// `BindingPool`. See `BindingPool::install_action`.
-    // ///
-    // /// When an action has been activated using `BindingPool::activate`
-    // /// the passed `callback` will be invoked (with `data`).
-    // ///
-    // /// Actions can be blocked with `BindingPool::block_action`
-    // /// and then unblocked using `BindingPool::unblock_action`.
-    // /// ## `key_val`
-    // /// key symbol
-    // /// ## `modifiers`
-    // /// bitmask of modifiers
-    // /// ## `callback`
-    // /// function to be called when the action is activated
-    // /// ## `data`
-    // /// data to be passed to `callback`
-    // /// ## `notify`
-    // /// function to be called when the action is removed
-    // ///  from the pool
-    // pub fn override_action<P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static>(
-    //     &self,
-    //     key_val: u32,
-    //     modifiers: ModifierType,
-    //     callback: P,
-    // ) {
-    //     let callback_data: Box_<P> = Box_::new(callback);
-    //     unsafe extern "C" fn callback_func<
-    //         P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static,
-    //     >(
-    //         gobject: *mut gobject_sys::GObject,
-    //         action_name: *const libc::c_char,
-    //         key_val: libc::c_uint,
-    //         modifiers: ffi::ClutterModifierType,
-    //         user_data: glib_sys::gpointer,
-    //     ) -> glib_sys::gboolean {
-    //         let gobject = from_glib_borrow(gobject);
-    //         let action_name: Borrowed<GString> = from_glib_borrow(action_name);
-    //         let modifiers = from_glib_borrow(modifiers);
-    //         let callback: &P = &*(user_data as *mut _);
-    //         let res = (*callback)(&gobject, action_name.as_str(), key_val, &modifiers);
-    //         res.to_glib()
-    //     }
-    //     let callback = Some(callback_func::<P> as _);
-    //     unsafe extern "C" fn notify_func<
-    //         P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static,
-    //     >(
-    //         data: glib_sys::gpointer,
-    //     ) {
-    //         let _callback: Box_<P> = Box_::from_raw(data as *mut _);
-    //     }
-    //     let destroy_call5 = Some(notify_func::<P> as _);
-    //     let super_callback0: Box_<P> = callback_data;
-    //     unsafe {
-    //         ffi::clutter_binding_pool_override_action(
-    //             self.to_glib_none().0,
-    //             key_val,
-    //             modifiers.to_glib(),
-    //             callback,
-    //             Box_::into_raw(super_callback0) as *mut _,
-    //             destroy_call5,
-    //         );
-    //     }
-    // }
-
-    /// A `gobject::Closure` variant of `BindingPool::override_action`.
-    ///
-    /// Allows overriding the action for `key_val` and `modifiers` inside a
-    /// `BindingPool`. See `BindingPool::install_closure`.
-    ///
-    /// When an action has been activated using `BindingPool::activate`
-    /// the passed `callback` will be invoked (with `data`).
-    ///
-    /// Actions can be blocked with `BindingPool::block_action`
-    /// and then unblocked using `BindingPool::unblock_action`.
-    /// ## `key_val`
-    /// key symbol
-    /// ## `modifiers`
-    /// bitmask of modifiers
-    /// ## `closure`
-    /// a `gobject::Closure`
-    pub fn override_closure(&self, key_val: u32, modifiers: ModifierType, closure: &glib::Closure) {
-        unsafe {
-            ffi::clutter_binding_pool_override_closure(
-                self.to_glib_none().0,
-                key_val,
-                modifiers.to_glib(),
-                closure.to_glib_none().0,
-            );
-        }
-    }
-
-    /// Removes the action matching the given `key_val`, `modifiers` pair,
-    /// if any exists.
-    /// ## `key_val`
-    /// a key symbol
-    /// ## `modifiers`
-    /// a bitmask for the modifiers
-    pub fn remove_action(&self, key_val: u32, modifiers: ModifierType) {
-        unsafe {
-            ffi::clutter_binding_pool_remove_action(
-                self.to_glib_none().0,
-                key_val,
-                modifiers.to_glib(),
-            );
-        }
-    }
-
-    /// Unblockes all the actions with name `action_name` inside `self`.
-    ///
-    /// Unblocking an action does not cause the callback bound to it to
-    /// be invoked in case `BindingPool::activate` was called on
-    /// an action previously blocked with `BindingPool::block_action`.
-    /// ## `action_name`
-    /// an action name
-    pub fn unblock_action(&self, action_name: &str) {
-        unsafe {
-            ffi::clutter_binding_pool_unblock_action(
-                self.to_glib_none().0,
-                action_name.to_glib_none().0,
-            );
-        }
-    }
-
-    /// The unique name of the `BindingPool`.
-    pub fn get_property_name(&self) -> Option<GString> {
-        unsafe {
-            let mut value = Value::from_type(<GString as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"name\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `name` getter")
-        }
-    }
-
-    /// Finds the `BindingPool` with `name`.
-    /// ## `name`
-    /// the name of the binding pool to find
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the `BindingPool`, or `None`
-    pub fn find(name: &str) -> Option<BindingPool> {
-        unsafe { from_glib_none(ffi::clutter_binding_pool_find(name.to_glib_none().0)) }
-    }
-
-    //pub fn get_for_class(klass: /*Unimplemented*/Option<Fundamental: Pointer>) -> Option<BindingPool> {
-    //    unsafe { TODO: call clutter_sys:clutter_binding_pool_get_for_class() }
-    //}
-}
-
-impl fmt::Display for BindingPool {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BindingPool")
-    }
-}
diff --git a/src/legacy/blur_effect.rs b/src/legacy/blur_effect.rs
deleted file mode 100644
index 0435498..0000000
--- a/src/legacy/blur_effect.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use crate::{ActorMeta, Effect, OffscreenEffect};
-use glib::{object as gobject, object::Cast, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct BlurEffect(Object<ffi::ClutterBlurEffect, ffi::ClutterBlurEffectClass, BlurEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_blur_effect_get_type(),
-    }
-}
-
-impl BlurEffect {
-    /// Creates a new `BlurEffect` to be used with
-    /// `ActorExt::add_effect`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `BlurEffect` or `None`
-    pub fn new() -> BlurEffect {
-        unsafe { Effect::from_glib_none(ffi::clutter_blur_effect_new()).unsafe_cast() }
-    }
-}
-
-impl Default for BlurEffect {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-impl fmt::Display for BlurEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BlurEffect")
-    }
-}
diff --git a/src/legacy/box_.rs b/src/legacy/box_.rs
deleted file mode 100644
index b584c31..0000000
--- a/src/legacy/box_.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-use crate::{Actor, Animatable, Container};
-use glib::{object as gobject, translate::*};
-use std::fmt;
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct Box(Object<ffi::ClutterBox, ffi::ClutterBoxClass, BoxClass>) @extends Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_box_get_type(),
-    }
-}
-
-impl Box {}
-
-impl fmt::Display for Box {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Box")
-    }
-}
diff --git a/src/legacy/box_layout.rs b/src/legacy/box_layout.rs
deleted file mode 100644
index e3936bb..0000000
--- a/src/legacy/box_layout.rs
+++ /dev/null
@@ -1,267 +0,0 @@
-use crate::{LayoutManager, Orientation};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct BoxLayout(Object<ffi::ClutterBoxLayout, ffi::ClutterBoxLayoutClass, BoxLayoutClass>) @extends LayoutManager, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_box_layout_get_type(),
-    }
-}
-
-impl BoxLayout {
-    /// Creates a new `BoxLayout` layout manager
-    ///
-    /// # Returns
-    ///
-    /// the newly created `BoxLayout`
-    pub fn new() -> BoxLayout {
-        unsafe { LayoutManager::from_glib_none(ffi::clutter_box_layout_new()).unsafe_cast() }
-    }
-}
-
-impl Default for BoxLayout {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `BoxLayout` methods.
-///
-/// # Implementors
-///
-/// [`BoxLayout`](struct.BoxLayout.html)
-pub trait BoxLayoutExt: 'static {
-    /// Retrieves if the children sizes are allocated homogeneously.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `BoxLayout` is arranging its children
-    ///  homogeneously, and `false` otherwise
-    fn get_homogeneous(&self) -> bool;
-
-    /// Retrieves the orientation of the `self`.
-    ///
-    /// # Returns
-    ///
-    /// the orientation of the layout
-    fn get_orientation(&self) -> Orientation;
-
-    /// Retrieves the value set using `BoxLayoutExt::set_pack_start`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `BoxLayout` should pack children
-    ///  at the beginning of the layout, and `false` otherwise
-    fn get_pack_start(&self) -> bool;
-
-    /// Retrieves the spacing set using `BoxLayoutExt::set_spacing`
-    ///
-    /// # Returns
-    ///
-    /// the spacing between children of the `BoxLayout`
-    fn get_spacing(&self) -> u32;
-
-    /// Sets whether the size of `self` children should be
-    /// homogeneous
-    /// ## `homogeneous`
-    /// `true` if the layout should be homogeneous
-    fn set_homogeneous(&self, homogeneous: bool);
-
-    /// Sets the orientation of the `BoxLayout` layout manager.
-    /// ## `orientation`
-    /// the orientation of the `BoxLayout`
-    fn set_orientation(&self, orientation: Orientation);
-
-    /// Sets whether children of `self` should be layed out by appending
-    /// them or by prepending them
-    /// ## `pack_start`
-    /// `true` if the `self` should pack children at the
-    ///  beginning of the layout
-    fn set_pack_start(&self, pack_start: bool);
-
-    /// Sets the spacing between children of `self`
-    /// ## `spacing`
-    /// the spacing between children of the layout, in pixels
-    fn set_spacing(&self, spacing: u32);
-
-    fn connect_property_homogeneous_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_orientation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_pack_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_spacing_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<BoxLayout>> BoxLayoutExt for O {
-    fn get_homogeneous(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_box_layout_get_homogeneous(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_orientation(&self) -> Orientation {
-        unsafe {
-            from_glib(ffi::clutter_box_layout_get_orientation(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_pack_start(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_box_layout_get_pack_start(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_spacing(&self) -> u32 {
-        unsafe { ffi::clutter_box_layout_get_spacing(self.as_ref().to_glib_none().0) }
-    }
-
-    fn set_homogeneous(&self, homogeneous: bool) {
-        unsafe {
-            ffi::clutter_box_layout_set_homogeneous(
-                self.as_ref().to_glib_none().0,
-                homogeneous.to_glib(),
-            );
-        }
-    }
-
-    fn set_orientation(&self, orientation: Orientation) {
-        unsafe {
-            ffi::clutter_box_layout_set_orientation(
-                self.as_ref().to_glib_none().0,
-                orientation.to_glib(),
-            );
-        }
-    }
-
-    fn set_pack_start(&self, pack_start: bool) {
-        unsafe {
-            ffi::clutter_box_layout_set_pack_start(
-                self.as_ref().to_glib_none().0,
-                pack_start.to_glib(),
-            );
-        }
-    }
-
-    fn set_spacing(&self, spacing: u32) {
-        unsafe {
-            ffi::clutter_box_layout_set_spacing(self.as_ref().to_glib_none().0, spacing);
-        }
-    }
-
-    fn connect_property_homogeneous_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_homogeneous_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBoxLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BoxLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BoxLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::homogeneous\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_homogeneous_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_orientation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_orientation_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBoxLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BoxLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BoxLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::orientation\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_orientation_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_pack_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_pack_start_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBoxLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BoxLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BoxLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::pack-start\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_pack_start_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_spacing_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_spacing_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterBoxLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<BoxLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&BoxLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::spacing\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_spacing_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for BoxLayout {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BoxLayout")
-    }
-}
diff --git a/src/legacy/brightness_contrast_effect.rs b/src/legacy/brightness_contrast_effect.rs
deleted file mode 100644
index 125b7db..0000000
--- a/src/legacy/brightness_contrast_effect.rs
+++ /dev/null
@@ -1,221 +0,0 @@
-use crate::{ActorMeta, Effect, OffscreenEffect};
-use glib::{
-    object as gobject,
-    object::{Cast, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::mem::transmute;
-use std::{fmt, mem};
-
-glib_wrapper! {
-    pub struct BrightnessContrastEffect(Object<ffi::ClutterBrightnessContrastEffect, ffi::ClutterBrightnessContrastEffectClass, BrightnessContrastEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_brightness_contrast_effect_get_type(),
-    }
-}
-
-impl BrightnessContrastEffect {
-    /// Creates a new `BrightnessContrastEffect` to be used with
-    /// `ActorExt::add_effect`
-    ///
-    /// # Returns
-    ///
-    /// the newly created
-    ///  `BrightnessContrastEffect` or `None`. Use `gobject::ObjectExt::unref` when
-    ///  done.
-    pub fn new() -> BrightnessContrastEffect {
-        unsafe {
-            Effect::from_glib_full(ffi::clutter_brightness_contrast_effect_new()).unsafe_cast()
-        }
-    }
-
-    /// Retrieves the change in brightness used by `self`.
-    /// ## `red`
-    /// return location for red component of the
-    ///  change in brightness
-    /// ## `green`
-    /// return location for green component of the
-    ///  change in brightness
-    /// ## `blue`
-    /// return location for blue component of the
-    ///  change in brightness
-    pub fn get_brightness(&self) -> (f32, f32, f32) {
-        unsafe {
-            let mut red = mem::MaybeUninit::uninit();
-            let mut green = mem::MaybeUninit::uninit();
-            let mut blue = mem::MaybeUninit::uninit();
-            ffi::clutter_brightness_contrast_effect_get_brightness(
-                self.to_glib_none().0,
-                red.as_mut_ptr(),
-                green.as_mut_ptr(),
-                blue.as_mut_ptr(),
-            );
-            let red = red.assume_init();
-            let green = green.assume_init();
-            let blue = blue.assume_init();
-            (red, green, blue)
-        }
-    }
-
-    /// Retrieves the contrast value used by `self`.
-    /// ## `red`
-    /// return location for red component of the
-    ///  change in contrast
-    /// ## `green`
-    /// return location for green component of the
-    ///  change in contrast
-    /// ## `blue`
-    /// return location for blue component of the
-    ///  change in contrast
-    pub fn get_contrast(&self) -> (f32, f32, f32) {
-        unsafe {
-            let mut red = mem::MaybeUninit::uninit();
-            let mut green = mem::MaybeUninit::uninit();
-            let mut blue = mem::MaybeUninit::uninit();
-            ffi::clutter_brightness_contrast_effect_get_contrast(
-                self.to_glib_none().0,
-                red.as_mut_ptr(),
-                green.as_mut_ptr(),
-                blue.as_mut_ptr(),
-            );
-            let red = red.assume_init();
-            let green = green.assume_init();
-            let blue = blue.assume_init();
-            (red, green, blue)
-        }
-    }
-
-    /// The range of `brightness` is [-1.0, 1.0], where 0.0 designates no change;
-    /// a value below 0.0 indicates a decrease in brightness; and a value
-    /// above 0.0 indicates an increase of brightness.
-    /// ## `brightness`
-    /// the brightness change for all three components (r, g, b)
-    pub fn set_brightness(&self, brightness: f32) {
-        unsafe {
-            ffi::clutter_brightness_contrast_effect_set_brightness(
-                self.to_glib_none().0,
-                brightness,
-            );
-        }
-    }
-
-    /// The range for each component is [-1.0, 1.0] where 0.0 designates no change,
-    /// values below 0.0 mean a decrease in brightness, and values above indicate
-    /// an increase.
-    /// ## `red`
-    /// red component of the change in brightness
-    /// ## `green`
-    /// green component of the change in brightness
-    /// ## `blue`
-    /// blue component of the change in brightness
-    pub fn set_brightness_full(&self, red: f32, green: f32, blue: f32) {
-        unsafe {
-            ffi::clutter_brightness_contrast_effect_set_brightness_full(
-                self.to_glib_none().0,
-                red,
-                green,
-                blue,
-            );
-        }
-    }
-
-    /// The range for `contrast` is [-1.0, 1.0], where 0.0 designates no change;
-    /// a value below 0.0 indicates a decrease in contrast; and a value above
-    /// 0.0 indicates an increase.
-    /// ## `contrast`
-    /// contrast change for all three channels
-    pub fn set_contrast(&self, contrast: f32) {
-        unsafe {
-            ffi::clutter_brightness_contrast_effect_set_contrast(self.to_glib_none().0, contrast);
-        }
-    }
-
-    /// The range for each component is [-1.0, 1.0] where 0.0 designates no change,
-    /// values below 0.0 mean a decrease in contrast, and values above indicate
-    /// an increase.
-    /// ## `red`
-    /// red component of the change in contrast
-    /// ## `green`
-    /// green component of the change in contrast
-    /// ## `blue`
-    /// blue component of the change in contrast
-    pub fn set_contrast_full(&self, red: f32, green: f32, blue: f32) {
-        unsafe {
-            ffi::clutter_brightness_contrast_effect_set_contrast_full(
-                self.to_glib_none().0,
-                red,
-                green,
-                blue,
-            );
-        }
-    }
-
-    pub fn connect_property_brightness_notify<F: Fn(&BrightnessContrastEffect) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_brightness_trampoline<
-            F: Fn(&BrightnessContrastEffect) + 'static,
-        >(
-            this: *mut ffi::ClutterBrightnessContrastEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::brightness\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_brightness_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_contrast_notify<F: Fn(&BrightnessContrastEffect) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_contrast_trampoline<
-            F: Fn(&BrightnessContrastEffect) + 'static,
-        >(
-            this: *mut ffi::ClutterBrightnessContrastEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::contrast\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_contrast_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl Default for BrightnessContrastEffect {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-impl fmt::Display for BrightnessContrastEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BrightnessContrastEffect")
-    }
-}
diff --git a/src/legacy/child_meta.rs b/src/legacy/child_meta.rs
deleted file mode 100644
index b7b0bbe..0000000
--- a/src/legacy/child_meta.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-use crate::{Actor, Container};
-use glib::{object::IsA, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ChildMeta(Object<ffi::ClutterChildMeta, ffi::ClutterChildMetaClass, ChildMetaClass>);
-
-    match fn {
-        get_type => || ffi::clutter_child_meta_get_type(),
-    }
-}
-
-/// Trait containing all `ChildMeta` methods.
-///
-/// # Implementors
-///
-/// [`ChildMeta`](struct.ChildMeta.html), [`LayoutMeta`](struct.LayoutMeta.html)
-pub trait ChildMetaExt: 'static {
-    /// Retrieves the actor wrapped by `self`
-    ///
-    /// # Returns
-    ///
-    /// a `Actor`
-    fn get_actor(&self) -> Option<Actor>;
-
-    /// Retrieves the container using `self`
-    ///
-    /// # Returns
-    ///
-    /// a `Container`
-    fn get_container(&self) -> Option<Container>;
-}
-
-impl<O: IsA<ChildMeta>> ChildMetaExt for O {
-    fn get_actor(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_child_meta_get_actor(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_container(&self) -> Option<Container> {
-        unsafe {
-            from_glib_none(ffi::clutter_child_meta_get_container(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-}
-
-impl fmt::Display for ChildMeta {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ChildMeta")
-    }
-}
diff --git a/src/legacy/click_action.rs b/src/legacy/click_action.rs
deleted file mode 100644
index 69d0059..0000000
--- a/src/legacy/click_action.rs
+++ /dev/null
@@ -1,448 +0,0 @@
-use crate::{Action, Actor, ActorMeta, LongPressState, ModifierType};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct ClickAction(Object<ffi::ClutterClickAction, ffi::ClutterClickActionClass, ClickActionClass>) @extends Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_click_action_get_type(),
-    }
-}
-
-impl ClickAction {
-    /// Creates a new `ClickAction` instance
-    ///
-    /// # Returns
-    ///
-    /// the newly created `ClickAction`
-    pub fn new() -> ClickAction {
-        unsafe { Action::from_glib_none(ffi::clutter_click_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for ClickAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `ClickAction` methods.
-///
-/// # Implementors
-///
-/// [`ClickAction`](struct.ClickAction.html)
-pub trait ClickActionExt: 'static {
-    /// Retrieves the button that was pressed.
-    ///
-    /// - 1 - left mouse button in a right-handed configuration, or the right mouse button in a left-handed configuration
-    /// - 2 - scroll wheel button
-    /// - 3 - right mouse button in a right-handed configuration, or the left mouse button in a left-handed configuration
-    ///
-    /// # Returns
-    ///
-    /// the button value
-    fn get_button(&self) -> u32;
-
-    /// Retrieves the screen coordinates of the button press.
-    /// ## `press_x`
-    /// return location for the X coordinate, or `None`
-    /// ## `press_y`
-    /// return location for the Y coordinate, or `None`
-    fn get_coords(&self) -> (f32, f32);
-
-    /// Retrieves the modifier state of the click action.
-    ///
-    /// # Returns
-    ///
-    /// the modifier state parameter, or 0
-    fn get_state(&self) -> ModifierType;
-
-    /// Emulates a release of the pointer button, which ungrabs the pointer
-    /// and unsets the `ClickAction:pressed` state.
-    ///
-    /// This function will also cancel the long press gesture if one was
-    /// initiated.
-    ///
-    /// This function is useful to break a grab, for instance after a certain
-    /// amount of time has passed.
-    fn release(&self);
-
-    /// Whether the clickable actor has the pointer grabbed
-    fn get_property_held(&self) -> bool;
-
-    /// The minimum duration of a press for it to be recognized as a long
-    /// press gesture, in milliseconds.
-    ///
-    /// A value of -1 will make the `ClickAction` use the value of
-    /// the `Settings:long-press-duration` property.
-    fn get_property_long_press_duration(&self) -> i32;
-
-    /// The minimum duration of a press for it to be recognized as a long
-    /// press gesture, in milliseconds.
-    ///
-    /// A value of -1 will make the `ClickAction` use the value of
-    /// the `Settings:long-press-duration` property.
-    fn set_property_long_press_duration(&self, long_press_duration: i32);
-
-    /// The maximum allowed distance that can be covered (on both axes) before
-    /// a long press gesture is cancelled, in pixels.
-    ///
-    /// A value of -1 will make the `ClickAction` use the value of
-    /// the `Settings:dnd-drag-threshold` property.
-    fn get_property_long_press_threshold(&self) -> i32;
-
-    /// The maximum allowed distance that can be covered (on both axes) before
-    /// a long press gesture is cancelled, in pixels.
-    ///
-    /// A value of -1 will make the `ClickAction` use the value of
-    /// the `Settings:dnd-drag-threshold` property.
-    fn set_property_long_press_threshold(&self, long_press_threshold: i32);
-
-    /// Whether the clickable actor should be in "pressed" state
-    fn get_property_pressed(&self) -> bool;
-
-    /// The ::clicked signal is emitted when the `Actor` to which
-    /// a `ClickAction` has been applied should respond to a
-    /// pointer button press and release events
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    fn connect_clicked<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::long-press signal is emitted during the long press gesture
-    /// handling.
-    ///
-    /// This signal can be emitted multiple times with different states.
-    ///
-    /// The `LongPressState::Query` state will be emitted on button presses,
-    /// and its return value will determine whether the long press handling
-    /// should be initiated. If the signal handlers will return `true`, the
-    /// `LongPressState::Query` state will be followed either by a signal
-    /// emission with the `LongPressState::Activate` state if the long press
-    /// constraints were respected, or by a signal emission with the
-    /// `LongPressState::Cancel` state if the long press was cancelled.
-    ///
-    /// It is possible to forcibly cancel a long press detection using
-    /// `ClickActionExt::release`.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    /// ## `state`
-    /// the long press state
-    ///
-    /// # Returns
-    ///
-    /// Only the `LongPressState::Query` state uses the
-    ///  returned value of the handler; other states will ignore it
-    fn connect_long_press<F: Fn(&Self, &Actor, LongPressState) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_held_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_long_press_duration_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_long_press_threshold_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_pressed_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<ClickAction>> ClickActionExt for O {
-    fn get_button(&self) -> u32 {
-        unsafe { ffi::clutter_click_action_get_button(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_coords(&self) -> (f32, f32) {
-        unsafe {
-            let mut press_x = mem::MaybeUninit::uninit();
-            let mut press_y = mem::MaybeUninit::uninit();
-            ffi::clutter_click_action_get_coords(
-                self.as_ref().to_glib_none().0,
-                press_x.as_mut_ptr(),
-                press_y.as_mut_ptr(),
-            );
-            let press_x = press_x.assume_init();
-            let press_y = press_y.assume_init();
-            (press_x, press_y)
-        }
-    }
-
-    fn get_state(&self) -> ModifierType {
-        unsafe {
-            from_glib(ffi::clutter_click_action_get_state(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn release(&self) {
-        unsafe {
-            ffi::clutter_click_action_release(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn get_property_held(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"held\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `held` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_long_press_duration(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"long-press-duration\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `long-press-duration` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_long_press_duration(&self, long_press_duration: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"long-press-duration\0".as_ptr() as *const _,
-                Value::from(&long_press_duration).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_long_press_threshold(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"long-press-threshold\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `long-press-threshold` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_long_press_threshold(&self, long_press_threshold: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"long-press-threshold\0".as_ptr() as *const _,
-                Value::from(&long_press_threshold).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_pressed(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"pressed\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `pressed` getter")
-                .unwrap()
-        }
-    }
-
-    fn connect_clicked<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn clicked_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterClickAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ClickAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &ClickAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"clicked\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    clicked_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_long_press<F: Fn(&Self, &Actor, LongPressState) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn long_press_trampoline<
-            P,
-            F: Fn(&P, &Actor, LongPressState) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterClickAction,
-            actor: *mut ffi::ClutterActor,
-            state: ffi::ClutterLongPressState,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<ClickAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &ClickAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                from_glib(state),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"long-press\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    long_press_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_held_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_held_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterClickAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ClickAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ClickAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::held\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_held_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_long_press_duration_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_long_press_duration_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterClickAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ClickAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ClickAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::long-press-duration\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_long_press_duration_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_long_press_threshold_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_long_press_threshold_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterClickAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ClickAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ClickAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::long-press-threshold\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_long_press_threshold_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_pressed_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_pressed_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterClickAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ClickAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ClickAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::pressed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_pressed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for ClickAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ClickAction")
-    }
-}
diff --git a/src/legacy/clip_node.rs b/src/legacy/clip_node.rs
deleted file mode 100644
index 5579c6c..0000000
--- a/src/legacy/clip_node.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-use crate::PaintNode;
-use glib::{object::Cast, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ClipNode(Object<ffi::ClutterClipNode, ffi::ClutterClipNodeClass, ClipNodeClass>) @extends PaintNode;
-
-    match fn {
-        get_type => || ffi::clutter_clip_node_get_type(),
-    }
-}
-
-impl ClipNode {
-    /// Creates a new `PaintNode` that will clip its child
-    /// nodes to the 2D regions added to it.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PaintNode`.
-    ///  Use `PaintNodeExt::unref` when done.
-    pub fn new() -> ClipNode {
-        unsafe { PaintNode::from_glib_full(ffi::clutter_clip_node_new()).unsafe_cast() }
-    }
-}
-
-impl Default for ClipNode {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-impl fmt::Display for ClipNode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ClipNode")
-    }
-}
diff --git a/src/legacy/clone.rs b/src/legacy/clone.rs
deleted file mode 100644
index 9f59e5d..0000000
--- a/src/legacy/clone.rs
+++ /dev/null
@@ -1,105 +0,0 @@
-// Scriptable
-use crate::{Actor, Animatable, Container};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct Clone(Object<ffi::ClutterClone, ffi::ClutterCloneClass, CloneClass>) @extends Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_clone_get_type(),
-    }
-}
-
-impl Clone {
-    /// Creates a new `Actor` which clones `source`/
-    /// ## `source`
-    /// a `Actor`, or `None`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Clone`
-    pub fn new<P: IsA<Actor>>(source: &P) -> Clone {
-        unsafe {
-            Actor::from_glib_none(ffi::clutter_clone_new(source.as_ref().to_glib_none().0))
-                .unsafe_cast()
-        }
-    }
-}
-
-/// Trait containing all `Clone` methods.
-///
-/// # Implementors
-///
-/// [`Clone`](struct.Clone.html)
-pub trait CloneExt: 'static {
-    /// Retrieves the source `Actor` being cloned by `self`.
-    ///
-    /// # Returns
-    ///
-    /// the actor source for the clone
-    fn get_source(&self) -> Option<Actor>;
-
-    /// Sets `source` as the source actor to be cloned by `self`.
-    /// ## `source`
-    /// a `Actor`, or `None`
-    fn set_source<P: IsA<Actor>>(&self, source: Option<&P>);
-
-    fn connect_property_source_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Clone>> CloneExt for O {
-    fn get_source(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_clone_get_source(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_source<P: IsA<Actor>>(&self, source: Option<&P>) {
-        unsafe {
-            ffi::clutter_clone_set_source(
-                self.as_ref().to_glib_none().0,
-                source.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_source_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_source_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterClone,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Clone>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Clone::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::source\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_source_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Clone {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Clone")
-    }
-}
diff --git a/src/legacy/color.rs b/src/legacy/color.rs
deleted file mode 100644
index 24482da..0000000
--- a/src/legacy/color.rs
+++ /dev/null
@@ -1,403 +0,0 @@
-use crate::StaticColor;
-use glib::{translate::*, GString};
-use std::{fmt, mem};
-// hash,
-glib_wrapper! {
-    #[derive(Debug)] // PartialOrd, Ord
-    pub struct InternalColor(Boxed<ffi::ClutterColor>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_color_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_color_free(ptr),
-        get_type => || ffi::clutter_color_get_type(),
-    }
-}
-
-impl InternalColor {
-    /// Allocates a new, transparent black `Color`.
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `Color`; use
-    ///  `Color::free` to free its resources
-    pub fn alloc() -> InternalColor {
-        unsafe { from_glib_full(ffi::clutter_color_alloc()) }
-    }
-
-    /// Creates a new `Color` with the given values.
-    ///
-    /// This function is the equivalent of:
-    ///
-    ///
-    /// ```text
-    ///   color_init (color_alloc (), red, green, blue, alpha);
-    /// ```
-    /// ## `red`
-    /// red component of the color, between 0 and 255
-    /// ## `green`
-    /// green component of the color, between 0 and 255
-    /// ## `blue`
-    /// blue component of the color, between 0 and 255
-    /// ## `alpha`
-    /// alpha component of the color, between 0 and 255
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated color.
-    ///  Use `Color::free` when done
-    pub fn new(red: u8, green: u8, blue: u8, alpha: u8) -> InternalColor {
-        unsafe { from_glib_full(ffi::clutter_color_new(red, green, blue, alpha)) }
-    }
-
-    /// Adds `self` to `b` and saves the resulting color inside `result`.
-    ///
-    /// The alpha channel of `result` is set as as the maximum value
-    /// between the alpha channels of `self` and `b`.
-    /// ## `b`
-    /// a `Color`
-    /// ## `result`
-    /// return location for the result
-    pub fn add(&self, b: &InternalColor) -> InternalColor {
-        unsafe {
-            let mut result = InternalColor::uninitialized();
-            ffi::clutter_color_add(
-                self.to_glib_none().0,
-                b.to_glib_none().0,
-                result.to_glib_none_mut().0,
-            );
-            result
-        }
-    }
-
-    /// Darkens `self` by a fixed amount, and saves the changed color
-    /// in `result`.
-    /// ## `result`
-    /// return location for the darker color
-    pub fn darken(&self) -> InternalColor {
-        unsafe {
-            let mut result = InternalColor::uninitialized();
-            ffi::clutter_color_darken(self.to_glib_none().0, result.to_glib_none_mut().0);
-            result
-        }
-    }
-
-    // /// Compares two `Color`<!-- -->s and checks if they are the same.
-    // ///
-    // /// This function can be passed to `glib::HashTable::new` as the `key_equal_func`
-    // /// parameter, when using `Color`<!-- -->s as keys in a `glib::HashTable`.
-    // /// ## `v2`
-    // /// a `Color`
-    // ///
-    // /// # Returns
-    // ///
-    // /// `true` if the two colors are the same.
-    // fn equal(&self, v2: &Color) -> bool {
-    //     unsafe {
-    //         from_glib(ffi::clutter_color_equal(
-    //             ToGlibPtr::<*mut ffi::ClutterColor>::to_glib_none(self).0
-    //                 as glib_sys::gconstpointer,
-    //             ToGlibPtr::<*mut ffi::ClutterColor>::to_glib_none(v2).0 as glib_sys::gconstpointer,
-    //         ))
-    //     }
-    // }
-
-    // /// Converts a `Color` to a hash value.
-    // ///
-    // /// This function can be passed to `glib::HashTable::new` as the `hash_func`
-    // /// parameter, when using `Color`<!-- -->s as keys in a `glib::HashTable`.
-    // ///
-    // /// # Returns
-    // ///
-    // /// a hash value corresponding to the color
-    // fn hash(&self) -> u32 {
-    //     unsafe {
-    //         ffi::clutter_color_hash(
-    //             ToGlibPtr::<*mut ffi::ClutterColor>::to_glib_none(self).0
-    //                 as glib_sys::gconstpointer,
-    //         )
-    //     }
-    // }
-
-    /// Initializes `self` with the given values.
-    /// ## `red`
-    /// red component of the color, between 0 and 255
-    /// ## `green`
-    /// green component of the color, between 0 and 255
-    /// ## `blue`
-    /// blue component of the color, between 0 and 255
-    /// ## `alpha`
-    /// alpha component of the color, between 0 and 255
-    ///
-    /// # Returns
-    ///
-    /// the initialized `Color`
-    pub fn init(&mut self, red: u8, green: u8, blue: u8, alpha: u8) -> Option<InternalColor> {
-        unsafe {
-            from_glib_none(ffi::clutter_color_init(
-                self.to_glib_none_mut().0,
-                red,
-                green,
-                blue,
-                alpha,
-            ))
-        }
-    }
-
-    /// Interpolates between `self` and `final_` `Color`<!-- -->s
-    /// using `progress`
-    /// ## `final_`
-    /// the final `Color`
-    /// ## `progress`
-    /// the interpolation progress
-    /// ## `result`
-    /// return location for the interpolation
-    pub fn interpolate(&self, final_: &InternalColor, progress: f64) -> InternalColor {
-        unsafe {
-            let mut result = InternalColor::uninitialized();
-            ffi::clutter_color_interpolate(
-                self.to_glib_none().0,
-                final_.to_glib_none().0,
-                progress,
-                result.to_glib_none_mut().0,
-            );
-            result
-        }
-    }
-
-    /// Lightens `self` by a fixed amount, and saves the changed color
-    /// in `result`.
-    /// ## `result`
-    /// return location for the lighter color
-    pub fn lighten(&self) -> InternalColor {
-        unsafe {
-            let mut result = InternalColor::uninitialized();
-            ffi::clutter_color_lighten(self.to_glib_none().0, result.to_glib_none_mut().0);
-            result
-        }
-    }
-
-    /// Shades `self` by `factor` and saves the modified color into `result`.
-    /// ## `factor`
-    /// the shade factor to apply
-    /// ## `result`
-    /// return location for the shaded color
-    pub fn shade(&self, factor: f64) -> InternalColor {
-        unsafe {
-            let mut result = InternalColor::uninitialized();
-            ffi::clutter_color_shade(self.to_glib_none().0, factor, result.to_glib_none_mut().0);
-            result
-        }
-    }
-
-    /// Subtracts `b` from `self` and saves the resulting color inside `result`.
-    ///
-    /// This function assumes that the components of `self` are greater than the
-    /// components of `b`; the result is, otherwise, undefined.
-    ///
-    /// The alpha channel of `result` is set as the minimum value
-    /// between the alpha channels of `self` and `b`.
-    /// ## `b`
-    /// a `Color`
-    /// ## `result`
-    /// return location for the result
-    pub fn subtract(&self, b: &InternalColor) -> InternalColor {
-        unsafe {
-            let mut result = InternalColor::uninitialized();
-            ffi::clutter_color_subtract(
-                self.to_glib_none().0,
-                b.to_glib_none().0,
-                result.to_glib_none_mut().0,
-            );
-            result
-        }
-    }
-
-    /// Converts `self` to the HLS format.
-    ///
-    /// The `hue` value is in the 0 .. 360 range. The `luminance` and
-    /// `saturation` values are in the 0 .. 1 range.
-    /// ## `hue`
-    /// return location for the hue value or `None`
-    /// ## `luminance`
-    /// return location for the luminance value or `None`
-    /// ## `saturation`
-    /// return location for the saturation value or `None`
-    pub fn to_hls(&self) -> (f32, f32, f32) {
-        unsafe {
-            let mut hue = mem::MaybeUninit::uninit();
-            let mut luminance = mem::MaybeUninit::uninit();
-            let mut saturation = mem::MaybeUninit::uninit();
-            ffi::clutter_color_to_hls(
-                self.to_glib_none().0,
-                hue.as_mut_ptr(),
-                luminance.as_mut_ptr(),
-                saturation.as_mut_ptr(),
-            );
-            let hue = hue.assume_init();
-            let luminance = luminance.assume_init();
-            let saturation = saturation.assume_init();
-            (hue, luminance, saturation)
-        }
-    }
-
-    /// Converts `self` into a packed 32 bit integer, containing
-    /// all the four 8 bit channels used by `Color`.
-    ///
-    /// # Returns
-    ///
-    /// a packed color
-    pub fn to_pixel(&self) -> u32 {
-        unsafe { ffi::clutter_color_to_pixel(self.to_glib_none().0) }
-    }
-
-    /// Returns a textual specification of `self` in the hexadecimal form
-    /// `<literal>`&num;rrggbbaa`</literal>`, where `<literal>`r`</literal>`,
-    /// `<literal>`g`</literal>`, `<literal>`b`</literal>` and `<literal>`a`</literal>` are
-    /// hexadecimal digits representing the red, green, blue and alpha components
-    /// respectively.
-    ///
-    /// # Returns
-    ///
-    /// a newly-allocated text string
-    fn to_string(&self) -> GString {
-        unsafe { from_glib_full(ffi::clutter_color_to_string(self.to_glib_none().0)) }
-    }
-
-    /// Converts a color expressed in HLS (hue, luminance and saturation)
-    /// values into a `Color`.
-    /// ## `color`
-    /// return location for a `Color`
-    /// ## `hue`
-    /// hue value, in the 0 .. 360 range
-    /// ## `luminance`
-    /// luminance value, in the 0 .. 1 range
-    /// ## `saturation`
-    /// saturation value, in the 0 .. 1 range
-    pub fn from_hls(hue: f32, luminance: f32, saturation: f32) -> InternalColor {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            ffi::clutter_color_from_hls(color.to_glib_none_mut().0, hue, luminance, saturation);
-            color
-        }
-    }
-
-    /// Converts `pixel` from the packed representation of a four 8 bit channel
-    /// color to a `Color`.
-    /// ## `color`
-    /// return location for a `Color`
-    /// ## `pixel`
-    /// a 32 bit packed integer containing a color
-    pub fn from_pixel(pixel: u32) -> InternalColor {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            ffi::clutter_color_from_pixel(color.to_glib_none_mut().0, pixel);
-            color
-        }
-    }
-
-    /// Parses a string definition of a color, filling the `Color.red`,
-    /// `Color.green`, `Color.blue` and `Color.alpha` fields
-    /// of `color`.
-    ///
-    /// The `color` is not allocated.
-    ///
-    /// The format of `str` can be either one of:
-    ///
-    ///  - a standard name (as taken from the X11 rgb.txt file)
-    ///  - an hexadecimal value in the form: `#rgb`, `#rrggbb`, `#rgba`, or `#rrggbbaa`
-    ///  - a RGB color in the form: `rgb(r, g, b)`
-    ///  - a RGB color in the form: `rgba(r, g, b, a)`
-    ///  - a HSL color in the form: `hsl(h, s, l)`
-    ///  -a HSL color in the form: `hsla(h, s, l, a)`
-    ///
-    /// where 'r', 'g', 'b' and 'a' are (respectively) the red, green, blue color
-    /// intensities and the opacity. The 'h', 's' and 'l' are (respectively) the
-    /// hue, saturation and luminance values.
-    ///
-    /// In the `rgb` and `rgba` formats, the 'r', 'g', and 'b' values are either
-    /// integers between 0 and 255, or percentage values in the range between 0%
-    /// and 100%; the percentages require the '%' character. The 'a' value, if
-    /// specified, can only be a floating point value between 0.0 and 1.0.
-    ///
-    /// In the `hls` and `hlsa` formats, the 'h' value (hue) is an angle between
-    /// 0 and 360.0 degrees; the 'l' and 's' values (luminance and saturation) are
-    /// percentage values in the range between 0% and 100%. The 'a' value, if specified,
-    /// can only be a floating point value between 0.0 and 1.0.
-    ///
-    /// Whitespace inside the definitions is ignored; no leading whitespace
-    /// is allowed.
-    ///
-    /// If the alpha component is not specified then it is assumed to be set to
-    /// be fully opaque.
-    /// ## `color`
-    /// return location for a `Color`
-    /// ## `str`
-    /// a string specifiying a color
-    ///
-    /// # Returns
-    ///
-    /// `true` if parsing succeeded, and `false` otherwise
-    pub fn from_string(str: &str) -> Option<InternalColor> {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            let ret = from_glib(ffi::clutter_color_from_string(
-                color.to_glib_none_mut().0,
-                str.to_glib_none().0,
-            ));
-            if ret {
-                Some(color)
-            } else {
-                None
-            }
-        }
-    }
-
-    /// Retrieves a static color for the given `color` name
-    ///
-    /// Static colors are created by Clutter and are guaranteed to always be
-    /// available and valid
-    /// ## `color`
-    /// the named global color
-    ///
-    /// # Returns
-    ///
-    /// a pointer to a static color; the returned pointer
-    ///  is owned by internal and it should never be modified or freed
-    pub fn get_static(color: StaticColor) -> Option<InternalColor> {
-        unsafe { from_glib_none(ffi::clutter_color_get_static(color.to_glib())) }
-    }
-}
-
-// impl PartialEq for Color {
-//     #[inline]
-//     fn eq(&self, other: &Self) -> bool {
-//         self.equal(other)
-//     }
-// }
-
-// impl Eq for Color {}
-
-impl fmt::Display for InternalColor {
-    #[inline]
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.to_string())
-    }
-}
-
-// impl hash::Hash for Color {
-//     #[inline]
-//     fn hash<H>(&self, state: &mut H)
-//     where
-//         H: hash::Hasher,
-//     {
-//         hash::Hash::hash(&self.hash(), state)
-//     }
-// }
-
-#[doc(hidden)]
-impl Uninitialized for InternalColor {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        Self::alloc()
-    }
-}
diff --git a/src/legacy/color_node.rs b/src/legacy/color_node.rs
deleted file mode 100644
index 972beb3..0000000
--- a/src/legacy/color_node.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-use crate::{Color, InternalColor, PaintNode, PipelineNode, RgbaColor};
-use glib::{object::Cast, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ColorNode(Object<ffi::ClutterColorNode, ffi::ClutterColorNodeClass, ColorNodeClass>) @extends PipelineNode, PaintNode;
-
-    match fn {
-        get_type => || ffi::clutter_color_node_get_type(),
-    }
-}
-
-impl ColorNode {
-    /// Creates a new `PaintNode` that will paint a solid color
-    /// fill using `color`.
-    /// ## `color`
-    /// the color to paint, or `None`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PaintNode`. Use
-    ///  `PaintNodeExt::unref` when done
-    pub fn new(color: Option<Color>) -> ColorNode {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            PaintNode::from_glib_full(ffi::clutter_color_node_new(color.to_glib_none().0))
-                .unsafe_cast()
-        }
-    }
-}
-
-impl fmt::Display for ColorNode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ColorNode")
-    }
-}
diff --git a/src/legacy/colorize_effect.rs b/src/legacy/colorize_effect.rs
deleted file mode 100644
index 96d672e..0000000
--- a/src/legacy/colorize_effect.rs
+++ /dev/null
@@ -1,102 +0,0 @@
-use crate::{ActorMeta, Color, Effect, InternalColor, OffscreenEffect, RgbaColor};
-use glib::{
-    object as gobject,
-    object::{Cast, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct ColorizeEffect(Object<ffi::ClutterColorizeEffect, ffi::ClutterColorizeEffectClass, ColorizeEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_colorize_effect_get_type(),
-    }
-}
-
-impl ColorizeEffect {
-    /// Creates a new `ColorizeEffect` to be used with
-    /// `ActorExt::add_effect`
-    /// ## `tint`
-    /// the color to be used
-    ///
-    /// # Returns
-    ///
-    /// the newly created `ColorizeEffect` or `None`
-    pub fn new(tint: Color) -> ColorizeEffect {
-        let RgbaColor {
-            red,
-            green,
-            blue,
-            alpha,
-        } = tint.into();
-        let tint = InternalColor::new(red, green, blue, alpha);
-
-        unsafe {
-            Effect::from_glib_none(ffi::clutter_colorize_effect_new(tint.to_glib_none().0))
-                .unsafe_cast()
-        }
-    }
-
-    /// Retrieves the tint used by `self`
-    /// ## `tint`
-    /// return location for the color used
-    pub fn get_tint(&self) -> InternalColor {
-        unsafe {
-            let mut tint = InternalColor::uninitialized();
-            ffi::clutter_colorize_effect_get_tint(self.to_glib_none().0, tint.to_glib_none_mut().0);
-            tint
-        }
-    }
-
-    /// Sets the tint to be used when colorizing
-    /// ## `tint`
-    /// the color to be used
-    pub fn set_tint(&self, tint: Color) {
-        let tint = {
-            let RgbaColor {
-                red,
-                green,
-                blue,
-                alpha,
-            } = tint.into();
-            InternalColor::new(red, green, blue, alpha)
-        };
-        unsafe {
-            ffi::clutter_colorize_effect_set_tint(self.to_glib_none().0, tint.to_glib_none().0);
-        }
-    }
-
-    pub fn connect_property_tint_notify<F: Fn(&ColorizeEffect) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_tint_trampoline<F: Fn(&ColorizeEffect) + 'static>(
-            this: *mut ffi::ClutterColorizeEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::tint\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_tint_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for ColorizeEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ColorizeEffect")
-    }
-}
diff --git a/src/legacy/constraint.rs b/src/legacy/constraint.rs
deleted file mode 100644
index c9464c1..0000000
--- a/src/legacy/constraint.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-use crate::ActorMeta;
-use glib::{object as gobject, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct Constraint(Object<ffi::ClutterConstraint, ffi::ClutterConstraintClass, ConstraintClass>) @extends ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_constraint_get_type(),
-    }
-}
-
-impl Constraint {}
-
-impl fmt::Display for Constraint {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Constraint")
-    }
-}
diff --git a/src/legacy/container.rs b/src/legacy/container.rs
deleted file mode 100644
index 0977e72..0000000
--- a/src/legacy/container.rs
+++ /dev/null
@@ -1,358 +0,0 @@
-use crate::{Actor, ChildMeta};
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-// mem
-glib_wrapper! {
-    pub struct Container(Interface<ffi::ClutterContainer>);
-
-    match fn {
-        get_type => || ffi::clutter_container_get_type(),
-    }
-}
-
-impl Container {
-    // /// Looks up the `gobject::ParamSpec` for a child property of `klass`.
-    // /// ## `klass`
-    // /// a `gobject::ObjectClass` implementing the `Container` interface.
-    // /// ## `property_name`
-    // /// a property name.
-    // ///
-    // /// # Returns
-    // ///
-    // /// The `gobject::ParamSpec` for the property or `None`
-    // ///  if no such property exist.
-    // pub fn class_find_child_property(
-    //     klass: &mut glib::ObjectClass,
-    //     property_name: &str,
-    // ) -> Option<glib::ParamSpec> {
-    //     unsafe {
-    //         from_glib_none(ffi::clutter_container_class_find_child_property(
-    //             klass.to_glib_none_mut().0,
-    //             property_name.to_glib_none().0,
-    //         ))
-    //     }
-    // }
-
-    // /// Returns an array of `gobject::ParamSpec` for all child properties.
-    // /// ## `klass`
-    // /// a `gobject::ObjectClass` implementing the `Container` interface.
-    // /// ## `n_properties`
-    // /// return location for length of returned array.
-    // ///
-    // /// # Returns
-    // ///
-    // /// an array
-    // ///  of `gobject::ParamSpec`<!-- -->s which should be freed after use.
-    // pub fn class_list_child_properties(klass: &mut glib::ObjectClass) -> Vec<glib::ParamSpec> {
-    //     unsafe {
-    //         let mut n_properties = mem::MaybeUninit::uninit();
-    //         let ret = FromGlibContainer::from_glib_full_num(
-    //             ffi::clutter_container_class_list_child_properties(
-    //                 klass.to_glib_none_mut().0,
-    //                 n_properties.as_mut_ptr(),
-    //             ),
-    //             n_properties.assume_init() as usize,
-    //         );
-    //         ret
-    //     }
-    // }
-}
-
-/// Trait containing all `Container` methods.
-///
-/// # Implementors
-///
-/// [`Actor`](struct.Actor.html), [`Box`](struct.Box.html), [`Clone`](struct.Clone.html), [`Container`](struct.Container.html), [`Group`](struct.Group.html), [`Rectangle`](struct.Rectangle.html), [`ScrollActor`](struct.ScrollActor.html), [`Stage`](struct.Stage.html), [`Text`](struct.Text.html), [`Texture`](struct.Texture.html)
-pub trait ContainerExt: 'static {
-    //fn child_get<P: IsA<Actor>>(&self, actor: &P, first_prop: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Gets a container specific property of a child of `self`, In general,
-    /// a copy is made of the property contents and the caller is responsible for
-    /// freeing the memory by calling `gobject::Value::unset`.
-    ///
-    /// Note that `Container::child_set_property` is really intended for
-    /// language bindings, `Container::child_set` is much more convenient
-    /// for C programming.
-    /// ## `child`
-    /// a `Actor` that is a child of `self`.
-    /// ## `property`
-    /// the name of the property to set.
-    /// ## `value`
-    /// the value.
-    fn child_get_property<P: IsA<Actor>>(&self, child: &P, property: &str, value: &mut glib::Value);
-
-    /// Calls the `ContainerIface.child_notify`() virtual function
-    /// of `Container`. The default implementation will emit the
-    /// `Container::child-notify` signal.
-    /// ## `child`
-    /// a `Actor`
-    /// ## `pspec`
-    /// a `gobject::ParamSpec`
-    // fn child_notify<P: IsA<Actor>, Q: IsA<glib::ParamSpec>>(&self, child: &P, pspec: &Q);
-
-    //fn child_set<P: IsA<Actor>>(&self, actor: &P, first_prop: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets a container-specific property on a child of `self`.
-    /// ## `child`
-    /// a `Actor` that is a child of `self`.
-    /// ## `property`
-    /// the name of the property to set.
-    /// ## `value`
-    /// the value.
-    fn child_set_property<P: IsA<Actor>>(&self, child: &P, property: &str, value: &glib::Value);
-
-    /// Creates the `ChildMeta` wrapping `actor` inside the
-    /// `self`, if the `ContainerIface::child_meta_type`
-    /// class member is not set to `G_TYPE_INVALID`.
-    ///
-    /// This function is only useful when adding a `Actor` to
-    /// a `Container` implementation outside of the
-    /// `Container::add`() virtual function implementation.
-    ///
-    /// Applications should not call this function.
-    /// ## `actor`
-    /// a `Actor`
-    fn create_child_meta<P: IsA<Actor>>(&self, actor: &P);
-
-    /// Destroys the `ChildMeta` wrapping `actor` inside the
-    /// `self`, if any.
-    ///
-    /// This function is only useful when removing a `Actor` to
-    /// a `Container` implementation outside of the
-    /// `Container::add`() virtual function implementation.
-    ///
-    /// Applications should not call this function.
-    /// ## `actor`
-    /// a `Actor`
-    fn destroy_child_meta<P: IsA<Actor>>(&self, actor: &P);
-
-    /// Finds a child actor of a container by its name. Search recurses
-    /// into any child container.
-    /// ## `child_name`
-    /// the name of the requested child.
-    ///
-    /// # Returns
-    ///
-    /// The child actor with the requested name,
-    ///  or `None` if no actor with that name was found.
-    fn find_child_by_name(&self, child_name: &str) -> Option<Actor>;
-
-    /// Retrieves the `ChildMeta` which contains the data about the
-    /// `self` specific state for `actor`.
-    /// ## `actor`
-    /// a `Actor` that is a child of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the `ChildMeta` for the `actor` child
-    ///  of `self` or `None` if the specifiec actor does not exist or the
-    ///  container is not configured to provide `ChildMeta`<!-- -->s
-    fn get_child_meta<P: IsA<Actor>>(&self, actor: &P) -> Option<ChildMeta>;
-
-    /// The ::actor-added signal is emitted each time an actor
-    /// has been added to `container`.
-    /// ## `actor`
-    /// the new child that has been added to `container`
-    fn connect_actor_added<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::actor-removed signal is emitted each time an actor
-    /// is removed from `container`.
-    /// ## `actor`
-    /// the child that has been removed from `container`
-    fn connect_actor_removed<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::child-notify signal is emitted each time a property is
-    /// being set through the `Container::child_set` and
-    /// `Container::child_set_property` calls.
-    /// ## `actor`
-    /// the child that has had a property set
-    /// ## `pspec`
-    /// the `gobject::ParamSpec` of the property set
-    fn connect_child_notify<F: Fn(&Self, &Actor, &glib::ParamSpec) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<Container>> ContainerExt for O {
-    //fn child_get<P: IsA<Actor>>(&self, actor: &P, first_prop: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_container_child_get() }
-    //}
-
-    fn child_get_property<P: IsA<Actor>>(
-        &self,
-        child: &P,
-        property: &str,
-        value: &mut glib::Value,
-    ) {
-        unsafe {
-            ffi::clutter_container_child_get_property(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                property.to_glib_none().0,
-                value.to_glib_none_mut().0,
-            );
-        }
-    }
-
-    // fn child_notify<P: IsA<Actor>, Q: IsA<glib::ParamSpec>>(&self, child: &P, pspec: &Q) {
-    //     unsafe {
-    //         ffi::clutter_container_child_notify(
-    //             self.as_ref().to_glib_none().0,
-    //             child.as_ref().to_glib_none().0,
-    //             pspec.as_ref().to_glib_none().0,
-    //         );
-    //     }
-    // }
-
-    //fn child_set<P: IsA<Actor>>(&self, actor: &P, first_prop: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_container_child_set() }
-    //}
-
-    fn child_set_property<P: IsA<Actor>>(&self, child: &P, property: &str, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_container_child_set_property(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                property.to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-
-    fn create_child_meta<P: IsA<Actor>>(&self, actor: &P) {
-        unsafe {
-            ffi::clutter_container_create_child_meta(
-                self.as_ref().to_glib_none().0,
-                actor.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn destroy_child_meta<P: IsA<Actor>>(&self, actor: &P) {
-        unsafe {
-            ffi::clutter_container_destroy_child_meta(
-                self.as_ref().to_glib_none().0,
-                actor.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn find_child_by_name(&self, child_name: &str) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_container_find_child_by_name(
-                self.as_ref().to_glib_none().0,
-                child_name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_child_meta<P: IsA<Actor>>(&self, actor: &P) -> Option<ChildMeta> {
-        unsafe {
-            from_glib_none(ffi::clutter_container_get_child_meta(
-                self.as_ref().to_glib_none().0,
-                actor.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn connect_actor_added<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn actor_added_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterContainer,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Container>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Container::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"actor-added\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    actor_added_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_actor_removed<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn actor_removed_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterContainer,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Container>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Container::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"actor-removed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    actor_removed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_child_notify<F: Fn(&Self, &Actor, &glib::ParamSpec) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn child_notify_trampoline<
-            P,
-            F: Fn(&P, &Actor, &glib::ParamSpec) + 'static,
-        >(
-            this: *mut ffi::ClutterContainer,
-            actor: *mut ffi::ClutterActor,
-            pspec: *mut gobject_sys::GParamSpec,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Container>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Container::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                &from_glib_borrow(pspec),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"child-notify\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    child_notify_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Container {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Container")
-    }
-}
diff --git a/src/legacy/content.rs b/src/legacy/content.rs
deleted file mode 100644
index f3d1b03..0000000
--- a/src/legacy/content.rs
+++ /dev/null
@@ -1,145 +0,0 @@
-use crate::Actor;
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct Content(Interface<ffi::ClutterContent>);
-
-    match fn {
-        get_type => || ffi::clutter_content_get_type(),
-    }
-}
-
-/// Trait containing all `Content` methods.
-///
-/// # Implementors
-///
-/// [`Canvas`](struct.Canvas.html), [`Content`](struct.Content.html), [`Image`](struct.Image.html)
-pub trait ContentExt: 'static {
-    /// Retrieves the natural size of the `self`, if any.
-    ///
-    /// The natural size of a `Content` is defined as the size the content
-    /// would have regardless of the allocation of the actor that is painting it,
-    /// for instance the size of an image data.
-    /// ## `width`
-    /// return location for the natural width of the content
-    /// ## `height`
-    /// return location for the natural height of the content
-    ///
-    /// # Returns
-    ///
-    /// `true` if the content has a preferred size, and `false`
-    ///  otherwise
-    fn get_preferred_size(&self) -> Option<(f32, f32)>;
-
-    /// Invalidates a `Content`.
-    ///
-    /// This function should be called by `Content` implementations when
-    /// they change the way a the content should be painted regardless of the
-    /// actor state.
-    fn invalidate(&self);
-
-    /// This signal is emitted each time a `Content` implementation is
-    /// assigned to a `Actor`.
-    /// ## `actor`
-    /// a `Actor`
-    fn connect_attached<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// This signal is emitted each time a `Content` implementation is
-    /// removed from a `Actor`.
-    /// ## `actor`
-    /// a `Actor`
-    fn connect_detached<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Content>> ContentExt for O {
-    fn get_preferred_size(&self) -> Option<(f32, f32)> {
-        unsafe {
-            let mut width = mem::MaybeUninit::uninit();
-            let mut height = mem::MaybeUninit::uninit();
-            let ret = from_glib(ffi::clutter_content_get_preferred_size(
-                self.as_ref().to_glib_none().0,
-                width.as_mut_ptr(),
-                height.as_mut_ptr(),
-            ));
-            let width = width.assume_init();
-            let height = height.assume_init();
-            if ret {
-                Some((width, height))
-            } else {
-                None
-            }
-        }
-    }
-
-    fn invalidate(&self) {
-        unsafe {
-            ffi::clutter_content_invalidate(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn connect_attached<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn attached_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterContent,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Content>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Content::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"attached\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    attached_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_detached<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn detached_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterContent,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Content>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Content::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"detached\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    detached_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Content {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Content")
-    }
-}
diff --git a/src/legacy/deform_effect.rs b/src/legacy/deform_effect.rs
deleted file mode 100644
index 29d1e0c..0000000
--- a/src/legacy/deform_effect.rs
+++ /dev/null
@@ -1,219 +0,0 @@
-use crate::{ActorMeta, Effect, OffscreenEffect};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct DeformEffect(Object<ffi::ClutterDeformEffect, ffi::ClutterDeformEffectClass, DeformEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_deform_effect_get_type(),
-    }
-}
-
-/// Trait containing all `DeformEffect` methods.
-///
-/// # Implementors
-///
-/// [`DeformEffect`](struct.DeformEffect.html), [`PageTurnEffect`](struct.PageTurnEffect.html)
-pub trait DeformEffectExt: 'static {
-    //fn get_back_material(&self) -> /*Unimplemented*/Option<dx::Handle>;
-
-    /// Retrieves the number of horizontal and vertical tiles used to sub-divide
-    /// the actor's geometry during the effect
-    /// ## `x_tiles`
-    /// return location for the number of horizontal tiles,
-    ///  or `None`
-    /// ## `y_tiles`
-    /// return location for the number of vertical tiles,
-    ///  or `None`
-    fn get_n_tiles(&self) -> (u32, u32);
-
-    /// Invalidates the `self`<!-- -->'s vertices and, if it is associated
-    /// to an actor, it will queue a redraw
-    fn invalidate(&self);
-
-    //fn set_back_material(&self, material: /*Unimplemented*/Option<dx::Handle>);
-
-    /// Sets the number of horizontal and vertical tiles to be used
-    /// when applying the effect
-    ///
-    /// More tiles allow a finer grained deformation at the expenses
-    /// of computation
-    /// ## `x_tiles`
-    /// number of horizontal tiles
-    /// ## `y_tiles`
-    /// number of vertical tiles
-    fn set_n_tiles(&self, x_tiles: u32, y_tiles: u32);
-
-    /// The number of horizontal tiles. The bigger the number, the
-    /// smaller the tiles
-    fn get_property_x_tiles(&self) -> u32;
-
-    /// The number of horizontal tiles. The bigger the number, the
-    /// smaller the tiles
-    fn set_property_x_tiles(&self, x_tiles: u32);
-
-    /// The number of vertical tiles. The bigger the number, the
-    /// smaller the tiles
-    fn get_property_y_tiles(&self) -> u32;
-
-    /// The number of vertical tiles. The bigger the number, the
-    /// smaller the tiles
-    fn set_property_y_tiles(&self, y_tiles: u32);
-
-    fn connect_property_x_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_y_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<DeformEffect>> DeformEffectExt for O {
-    //fn get_back_material(&self) -> /*Unimplemented*/Option<dx::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_deform_effect_get_back_material() }
-    //}
-
-    fn get_n_tiles(&self) -> (u32, u32) {
-        unsafe {
-            let mut x_tiles = mem::MaybeUninit::uninit();
-            let mut y_tiles = mem::MaybeUninit::uninit();
-            ffi::clutter_deform_effect_get_n_tiles(
-                self.as_ref().to_glib_none().0,
-                x_tiles.as_mut_ptr(),
-                y_tiles.as_mut_ptr(),
-            );
-            let x_tiles = x_tiles.assume_init();
-            let y_tiles = y_tiles.assume_init();
-            (x_tiles, y_tiles)
-        }
-    }
-
-    fn invalidate(&self) {
-        unsafe {
-            ffi::clutter_deform_effect_invalidate(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    //fn set_back_material(&self, material: /*Unimplemented*/Option<dx::Handle>) {
-    //    unsafe { TODO: call clutter_sys:clutter_deform_effect_set_back_material() }
-    //}
-
-    fn set_n_tiles(&self, x_tiles: u32, y_tiles: u32) {
-        unsafe {
-            ffi::clutter_deform_effect_set_n_tiles(
-                self.as_ref().to_glib_none().0,
-                x_tiles,
-                y_tiles,
-            );
-        }
-    }
-
-    fn get_property_x_tiles(&self) -> u32 {
-        unsafe {
-            let mut value = Value::from_type(<u32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"x-tiles\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `x-tiles` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_x_tiles(&self, x_tiles: u32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"x-tiles\0".as_ptr() as *const _,
-                Value::from(&x_tiles).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_y_tiles(&self) -> u32 {
-        unsafe {
-            let mut value = Value::from_type(<u32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"y-tiles\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `y-tiles` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_y_tiles(&self, y_tiles: u32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"y-tiles\0".as_ptr() as *const _,
-                Value::from(&y_tiles).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_x_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_x_tiles_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDeformEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DeformEffect>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DeformEffect::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::x-tiles\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_x_tiles_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_y_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_y_tiles_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDeformEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DeformEffect>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DeformEffect::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::y-tiles\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_y_tiles_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for DeformEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "DeformEffect")
-    }
-}
diff --git a/src/legacy/desaturate_effect.rs b/src/legacy/desaturate_effect.rs
deleted file mode 100644
index efa4125..0000000
--- a/src/legacy/desaturate_effect.rs
+++ /dev/null
@@ -1,81 +0,0 @@
-use crate::{ActorMeta, Effect, OffscreenEffect};
-use glib::{
-    object as gobject,
-    object::{Cast, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct DesaturateEffect(Object<ffi::ClutterDesaturateEffect, ffi::ClutterDesaturateEffectClass, DesaturateEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_desaturate_effect_get_type(),
-    }
-}
-
-impl DesaturateEffect {
-    /// Creates a new `DesaturateEffect` to be used with
-    /// `ActorExt::add_effect`
-    /// ## `factor`
-    /// the desaturation factor, between 0.0 and 1.0
-    ///
-    /// # Returns
-    ///
-    /// the newly created `DesaturateEffect` or `None`
-    pub fn new(factor: f64) -> DesaturateEffect {
-        unsafe { Effect::from_glib_none(ffi::clutter_desaturate_effect_new(factor)).unsafe_cast() }
-    }
-
-    /// Retrieves the desaturation factor of `self`
-    ///
-    /// # Returns
-    ///
-    /// the desaturation factor
-    pub fn get_factor(&self) -> f64 {
-        unsafe { ffi::clutter_desaturate_effect_get_factor(self.to_glib_none().0) }
-    }
-
-    /// Sets the desaturation factor for `self`, with 0.0 being "do not desaturate"
-    /// and 1.0 being "fully desaturate"
-    /// ## `factor`
-    /// the desaturation factor, between 0.0 and 1.0
-    pub fn set_factor(&self, factor: f64) {
-        unsafe {
-            ffi::clutter_desaturate_effect_set_factor(self.to_glib_none().0, factor);
-        }
-    }
-
-    pub fn connect_property_factor_notify<F: Fn(&DesaturateEffect) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_factor_trampoline<F: Fn(&DesaturateEffect) + 'static>(
-            this: *mut ffi::ClutterDesaturateEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::factor\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_factor_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for DesaturateEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "DesaturateEffect")
-    }
-}
diff --git a/src/legacy/device_manager.rs b/src/legacy/device_manager.rs
deleted file mode 100644
index 6fdd9e4..0000000
--- a/src/legacy/device_manager.rs
+++ /dev/null
@@ -1,209 +0,0 @@
-use crate::{Backend, InputDevice, InputDeviceType};
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct DeviceManager(Object<ffi::ClutterDeviceManager, ffi::ClutterDeviceManagerClass, DeviceManagerClass>);
-
-    match fn {
-        get_type => || ffi::clutter_device_manager_get_type(),
-    }
-}
-
-impl DeviceManager {
-    /// Retrieves the device manager singleton
-    ///
-    /// # Returns
-    ///
-    /// the `DeviceManager` singleton.
-    ///  The returned instance is owned by Clutter and it should not be
-    ///  modified or freed
-    pub fn get_default() -> Option<DeviceManager> {
-        unsafe { from_glib_none(ffi::clutter_device_manager_get_default()) }
-    }
-}
-
-/// Trait containing all `DeviceManager` methods.
-///
-/// # Implementors
-///
-/// [`DeviceManager`](struct.DeviceManager.html)
-pub trait DeviceManagerExt: 'static {
-    /// Retrieves the core `InputDevice` of type `device_type`
-    ///
-    /// Core devices are devices created automatically by the default
-    /// backend
-    /// ## `device_type`
-    /// the type of the core device
-    ///
-    /// # Returns
-    ///
-    /// a `InputDevice` or `None`. The
-    ///  returned device is owned by the `DeviceManager` and should
-    ///  not be modified or freed
-    fn get_core_device(&self, device_type: InputDeviceType) -> Option<InputDevice>;
-
-    /// Retrieves the `InputDevice` with the given `device_id`
-    /// ## `device_id`
-    /// the integer id of a device
-    ///
-    /// # Returns
-    ///
-    /// a `InputDevice` or `None`. The
-    ///  returned device is owned by the `DeviceManager` and should
-    ///  never be modified or freed
-    fn get_device(&self, device_id: i32) -> Option<InputDevice>;
-
-    /// Lists all currently registered input devices
-    ///
-    /// # Returns
-    ///
-    ///
-    ///  a newly allocated list of `InputDevice` objects. Use
-    ///  `glib::SList::free` to deallocate it when done
-    fn list_devices(&self) -> Vec<InputDevice>;
-
-    /// Lists all currently registered input devices
-    ///
-    /// # Returns
-    ///
-    ///
-    ///  a pointer to the internal list of `InputDevice` objects. The
-    ///  returned list is owned by the `DeviceManager` and should never
-    ///  be modified or freed
-    fn peek_devices(&self) -> Vec<InputDevice>;
-
-    fn get_property_backend(&self) -> Option<Backend>;
-
-    /// The ::device-added signal is emitted each time a device has been
-    /// added to the `DeviceManager`
-    /// ## `device`
-    /// the newly added `InputDevice`
-    fn connect_device_added<F: Fn(&Self, &InputDevice) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::device-removed signal is emitted each time a device has been
-    /// removed from the `DeviceManager`
-    /// ## `device`
-    /// the removed `InputDevice`
-    fn connect_device_removed<F: Fn(&Self, &InputDevice) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-}
-
-impl<O: IsA<DeviceManager>> DeviceManagerExt for O {
-    fn get_core_device(&self, device_type: InputDeviceType) -> Option<InputDevice> {
-        unsafe {
-            from_glib_none(ffi::clutter_device_manager_get_core_device(
-                self.as_ref().to_glib_none().0,
-                device_type.to_glib(),
-            ))
-        }
-    }
-
-    fn get_device(&self, device_id: i32) -> Option<InputDevice> {
-        unsafe {
-            from_glib_none(ffi::clutter_device_manager_get_device(
-                self.as_ref().to_glib_none().0,
-                device_id,
-            ))
-        }
-    }
-
-    fn list_devices(&self) -> Vec<InputDevice> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_device_manager_list_devices(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn peek_devices(&self) -> Vec<InputDevice> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_none(ffi::clutter_device_manager_peek_devices(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_property_backend(&self) -> Option<Backend> {
-        unsafe {
-            let mut value = Value::from_type(<Backend as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"backend\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `backend` getter")
-        }
-    }
-
-    fn connect_device_added<F: Fn(&Self, &InputDevice) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn device_added_trampoline<P, F: Fn(&P, &InputDevice) + 'static>(
-            this: *mut ffi::ClutterDeviceManager,
-            device: *mut ffi::ClutterInputDevice,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DeviceManager>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DeviceManager::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(device),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"device-added\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    device_added_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_device_removed<F: Fn(&Self, &InputDevice) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn device_removed_trampoline<P, F: Fn(&P, &InputDevice) + 'static>(
-            this: *mut ffi::ClutterDeviceManager,
-            device: *mut ffi::ClutterInputDevice,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DeviceManager>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DeviceManager::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(device),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"device-removed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    device_removed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for DeviceManager {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "DeviceManager")
-    }
-}
diff --git a/src/legacy/drag_action.rs b/src/legacy/drag_action.rs
deleted file mode 100644
index 3a9be96..0000000
--- a/src/legacy/drag_action.rs
+++ /dev/null
@@ -1,806 +0,0 @@
-use crate::{Action, Actor, ActorMeta, DragAxis, InternalRect, ModifierType};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct DragAction(Object<ffi::ClutterDragAction, ffi::ClutterDragActionClass, DragActionClass>) @extends Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_drag_action_get_type(),
-    }
-}
-
-impl DragAction {
-    /// Creates a new `DragAction` instance
-    ///
-    /// # Returns
-    ///
-    /// the newly created `DragAction`
-    pub fn new() -> DragAction {
-        unsafe { Action::from_glib_none(ffi::clutter_drag_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for DragAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `DragAction` methods.
-///
-/// # Implementors
-///
-/// [`DragAction`](struct.DragAction.html)
-pub trait DragActionExt: 'static {
-    /// Retrieves the "drag area" associated with `self`, that
-    /// is a `Rect` that constrains the actor movements,
-    /// in parents coordinates.
-    /// ## `drag_area`
-    /// a `Rect` to be filled
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is actually constrained (and thus
-    ///  `drag_area` is valid), `false` otherwise
-    fn get_drag_area(&self) -> Option<InternalRect>;
-
-    /// Retrieves the axis constraint set by `DragActionExt::set_drag_axis`
-    ///
-    /// # Returns
-    ///
-    /// the axis constraint
-    fn get_drag_axis(&self) -> DragAxis;
-
-    /// Retrieves the drag handle set by `DragActionExt::set_drag_handle`
-    ///
-    /// # Returns
-    ///
-    /// a `Actor`, used as the drag
-    ///  handle, or `None` if none was set
-    fn get_drag_handle(&self) -> Option<Actor>;
-
-    /// Retrieves the values set by `DragActionExt::set_drag_threshold`.
-    ///
-    /// If the `DragAction:x-drag-threshold` property or the
-    /// `DragAction:y-drag-threshold` property have been set to -1 then
-    /// this function will return the default drag threshold value as stored
-    /// by the `Settings:dnd-drag-threshold` property of `Settings`.
-    /// ## `x_threshold`
-    /// return location for the horizontal drag
-    ///  threshold value, in pixels
-    /// ## `y_threshold`
-    /// return location for the vertical drag
-    ///  threshold value, in pixels
-    fn get_drag_threshold(&self) -> (u32, u32);
-
-    /// Retrieves the coordinates, in stage space, of the latest motion
-    /// event during the dragging
-    /// ## `motion_x`
-    /// return location for the latest motion
-    ///  event's X coordinate
-    /// ## `motion_y`
-    /// return location for the latest motion
-    ///  event's Y coordinate
-    fn get_motion_coords(&self) -> (f32, f32);
-
-    /// Retrieves the coordinates, in stage space, of the press event
-    /// that started the dragging
-    /// ## `press_x`
-    /// return location for the press event's X coordinate
-    /// ## `press_y`
-    /// return location for the press event's Y coordinate
-    fn get_press_coords(&self) -> (f32, f32);
-
-    /// Sets `drag_area` to constrain the dragging of the actor associated
-    /// with `self`, so that it position is always within `drag_area`, expressed
-    /// in parent's coordinates.
-    /// If `drag_area` is `None`, the actor is not constrained.
-    /// ## `drag_area`
-    /// a `Rect`
-    fn set_drag_area(&self, drag_area: Option<&InternalRect>);
-
-    /// Restricts the dragging action to a specific axis
-    /// ## `axis`
-    /// the axis to constraint the dragging to
-    fn set_drag_axis(&self, axis: DragAxis);
-
-    /// Sets the actor to be used as the drag handle.
-    /// ## `handle`
-    /// a `Actor`, or `None` to unset
-    fn set_drag_handle<P: IsA<Actor>>(&self, handle: Option<&P>);
-
-    /// Sets the horizontal and vertical drag thresholds that must be
-    /// cleared by the pointer before `self` can begin the dragging.
-    ///
-    /// If `x_threshold` or `y_threshold` are set to -1 then the default
-    /// drag threshold stored in the `Settings:dnd-drag-threshold`
-    /// property of `Settings` will be used.
-    /// ## `x_threshold`
-    /// a distance on the horizontal axis, in pixels, or
-    ///  -1 to use the default drag threshold from `Settings`
-    /// ## `y_threshold`
-    /// a distance on the vertical axis, in pixels, or
-    ///  -1 to use the default drag threshold from `Settings`
-    fn set_drag_threshold(&self, x_threshold: i32, y_threshold: i32);
-
-    /// Whether the `DragAction:drag-area` property has been set.
-    fn get_property_drag_area_set(&self) -> bool;
-
-    /// The horizontal threshold, in pixels, that the cursor must travel
-    /// in order to begin a drag action.
-    ///
-    /// When set to a positive value, `DragAction` will only emit
-    /// `DragAction::drag-begin` if the pointer has moved
-    /// horizontally at least of the given amount of pixels since
-    /// the button press event.
-    ///
-    /// When set to -1, `DragAction` will use the default threshold
-    /// stored in the `Settings:dnd-drag-threshold` property of
-    /// `Settings`.
-    ///
-    /// When read, this property will always return a valid drag
-    /// threshold, either as set or the default one.
-    fn get_property_x_drag_threshold(&self) -> i32;
-
-    /// The horizontal threshold, in pixels, that the cursor must travel
-    /// in order to begin a drag action.
-    ///
-    /// When set to a positive value, `DragAction` will only emit
-    /// `DragAction::drag-begin` if the pointer has moved
-    /// horizontally at least of the given amount of pixels since
-    /// the button press event.
-    ///
-    /// When set to -1, `DragAction` will use the default threshold
-    /// stored in the `Settings:dnd-drag-threshold` property of
-    /// `Settings`.
-    ///
-    /// When read, this property will always return a valid drag
-    /// threshold, either as set or the default one.
-    fn set_property_x_drag_threshold(&self, x_drag_threshold: i32);
-
-    /// The vertical threshold, in pixels, that the cursor must travel
-    /// in order to begin a drag action.
-    ///
-    /// When set to a positive value, `DragAction` will only emit
-    /// `DragAction::drag-begin` if the pointer has moved
-    /// vertically at least of the given amount of pixels since
-    /// the button press event.
-    ///
-    /// When set to -1, `DragAction` will use the value stored
-    /// in the `Settings:dnd-drag-threshold` property of
-    /// `Settings`.
-    ///
-    /// When read, this property will always return a valid drag
-    /// threshold, either as set or the default one.
-    fn get_property_y_drag_threshold(&self) -> i32;
-
-    /// The vertical threshold, in pixels, that the cursor must travel
-    /// in order to begin a drag action.
-    ///
-    /// When set to a positive value, `DragAction` will only emit
-    /// `DragAction::drag-begin` if the pointer has moved
-    /// vertically at least of the given amount of pixels since
-    /// the button press event.
-    ///
-    /// When set to -1, `DragAction` will use the value stored
-    /// in the `Settings:dnd-drag-threshold` property of
-    /// `Settings`.
-    ///
-    /// When read, this property will always return a valid drag
-    /// threshold, either as set or the default one.
-    fn set_property_y_drag_threshold(&self, y_drag_threshold: i32);
-
-    /// The ::drag-begin signal is emitted when the `DragAction`
-    /// starts the dragging
-    ///
-    /// The emission of this signal can be delayed by using the
-    /// `DragAction:x-drag-threshold` and
-    /// `DragAction:y-drag-threshold` properties
-    /// ## `actor`
-    /// the `Actor` attached to the action
-    /// ## `event_x`
-    /// the X coordinate (in stage space) of the press event
-    /// ## `event_y`
-    /// the Y coordinate (in stage space) of the press event
-    /// ## `modifiers`
-    /// the modifiers of the press event
-    fn connect_drag_begin<F: Fn(&Self, &Actor, f32, f32, ModifierType) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::drag-end signal is emitted at the end of the dragging,
-    /// when the pointer button's is released
-    ///
-    /// This signal is emitted if and only if the `DragAction::drag-begin`
-    /// signal has been emitted first
-    /// ## `actor`
-    /// the `Actor` attached to the action
-    /// ## `event_x`
-    /// the X coordinate (in stage space) of the release event
-    /// ## `event_y`
-    /// the Y coordinate (in stage space) of the release event
-    /// ## `modifiers`
-    /// the modifiers of the release event
-    fn connect_drag_end<F: Fn(&Self, &Actor, f32, f32, ModifierType) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::drag-motion signal is emitted for each motion event after
-    /// the `DragAction::drag-begin` signal has been emitted.
-    ///
-    /// The components of the distance between the press event and the
-    /// latest motion event are computed in the actor's coordinate space,
-    /// to take into account eventual transformations. If you want the
-    /// stage coordinates of the latest motion event you can use
-    /// `DragActionExt::get_motion_coords`.
-    ///
-    /// The default handler of the signal will call `ActorExt::move_by`
-    /// either on `actor` or, if set, of `DragAction:drag-handle` using
-    /// the `delta_x` and `delta_y` components of the dragging motion. If you
-    /// want to override the default behaviour, you can connect to the
-    /// `DragAction::drag-progress` signal and return `false` from the
-    /// handler.
-    /// ## `actor`
-    /// the `Actor` attached to the action
-    /// ## `delta_x`
-    /// the X component of the distance between the press event
-    ///  that began the dragging and the current position of the pointer,
-    ///  as of the latest motion event
-    /// ## `delta_y`
-    /// the Y component of the distance between the press event
-    ///  that began the dragging and the current position of the pointer,
-    ///  as of the latest motion event
-    fn connect_drag_motion<F: Fn(&Self, &Actor, f32, f32) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::drag-progress signal is emitted for each motion event after
-    /// the `DragAction::drag-begin` signal has been emitted.
-    ///
-    /// The components of the distance between the press event and the
-    /// latest motion event are computed in the actor's coordinate space,
-    /// to take into account eventual transformations. If you want the
-    /// stage coordinates of the latest motion event you can use
-    /// `DragActionExt::get_motion_coords`.
-    ///
-    /// The default handler will emit `DragAction::drag-motion`,
-    /// if `DragAction::drag-progress` emission returns `true`.
-    /// ## `actor`
-    /// the `Actor` attached to the action
-    /// ## `delta_x`
-    /// the X component of the distance between the press event
-    ///  that began the dragging and the current position of the pointer,
-    ///  as of the latest motion event
-    /// ## `delta_y`
-    /// the Y component of the distance between the press event
-    ///  that began the dragging and the current position of the pointer,
-    ///  as of the latest motion event
-    ///
-    /// # Returns
-    ///
-    /// `true` if the drag should continue, and `false`
-    ///  if it should be stopped.
-    fn connect_drag_progress<F: Fn(&Self, &Actor, f32, f32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_drag_area_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_drag_area_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_drag_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_drag_handle_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_x_drag_threshold_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_y_drag_threshold_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<DragAction>> DragActionExt for O {
-    fn get_drag_area(&self) -> Option<InternalRect> {
-        unsafe {
-            let mut drag_area = InternalRect::uninitialized();
-            let ret = from_glib(ffi::clutter_drag_action_get_drag_area(
-                self.as_ref().to_glib_none().0,
-                drag_area.to_glib_none_mut().0,
-            ));
-            if ret {
-                Some(drag_area)
-            } else {
-                None
-            }
-        }
-    }
-
-    fn get_drag_axis(&self) -> DragAxis {
-        unsafe {
-            from_glib(ffi::clutter_drag_action_get_drag_axis(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_drag_handle(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_drag_action_get_drag_handle(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_drag_threshold(&self) -> (u32, u32) {
-        unsafe {
-            let mut x_threshold = mem::MaybeUninit::uninit();
-            let mut y_threshold = mem::MaybeUninit::uninit();
-            ffi::clutter_drag_action_get_drag_threshold(
-                self.as_ref().to_glib_none().0,
-                x_threshold.as_mut_ptr(),
-                y_threshold.as_mut_ptr(),
-            );
-            let x_threshold = x_threshold.assume_init();
-            let y_threshold = y_threshold.assume_init();
-            (x_threshold, y_threshold)
-        }
-    }
-
-    fn get_motion_coords(&self) -> (f32, f32) {
-        unsafe {
-            let mut motion_x = mem::MaybeUninit::uninit();
-            let mut motion_y = mem::MaybeUninit::uninit();
-            ffi::clutter_drag_action_get_motion_coords(
-                self.as_ref().to_glib_none().0,
-                motion_x.as_mut_ptr(),
-                motion_y.as_mut_ptr(),
-            );
-            let motion_x = motion_x.assume_init();
-            let motion_y = motion_y.assume_init();
-            (motion_x, motion_y)
-        }
-    }
-
-    fn get_press_coords(&self) -> (f32, f32) {
-        unsafe {
-            let mut press_x = mem::MaybeUninit::uninit();
-            let mut press_y = mem::MaybeUninit::uninit();
-            ffi::clutter_drag_action_get_press_coords(
-                self.as_ref().to_glib_none().0,
-                press_x.as_mut_ptr(),
-                press_y.as_mut_ptr(),
-            );
-            let press_x = press_x.assume_init();
-            let press_y = press_y.assume_init();
-            (press_x, press_y)
-        }
-    }
-
-    fn set_drag_area(&self, drag_area: Option<&InternalRect>) {
-        unsafe {
-            ffi::clutter_drag_action_set_drag_area(
-                self.as_ref().to_glib_none().0,
-                drag_area.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_drag_axis(&self, axis: DragAxis) {
-        unsafe {
-            ffi::clutter_drag_action_set_drag_axis(self.as_ref().to_glib_none().0, axis.to_glib());
-        }
-    }
-
-    fn set_drag_handle<P: IsA<Actor>>(&self, handle: Option<&P>) {
-        unsafe {
-            ffi::clutter_drag_action_set_drag_handle(
-                self.as_ref().to_glib_none().0,
-                handle.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_drag_threshold(&self, x_threshold: i32, y_threshold: i32) {
-        unsafe {
-            ffi::clutter_drag_action_set_drag_threshold(
-                self.as_ref().to_glib_none().0,
-                x_threshold,
-                y_threshold,
-            );
-        }
-    }
-
-    fn get_property_drag_area_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"drag-area-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `drag-area-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_x_drag_threshold(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"x-drag-threshold\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `x-drag-threshold` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_x_drag_threshold(&self, x_drag_threshold: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"x-drag-threshold\0".as_ptr() as *const _,
-                Value::from(&x_drag_threshold).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_y_drag_threshold(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"y-drag-threshold\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `y-drag-threshold` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_y_drag_threshold(&self, y_drag_threshold: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"y-drag-threshold\0".as_ptr() as *const _,
-                Value::from(&y_drag_threshold).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_drag_begin<F: Fn(&Self, &Actor, f32, f32, ModifierType) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn drag_begin_trampoline<
-            P,
-            F: Fn(&P, &Actor, f32, f32, ModifierType) + 'static,
-        >(
-            this: *mut ffi::ClutterDragAction,
-            actor: *mut ffi::ClutterActor,
-            event_x: libc::c_float,
-            event_y: libc::c_float,
-            modifiers: ffi::ClutterModifierType,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DragAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                event_x,
-                event_y,
-                from_glib(modifiers),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"drag-begin\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    drag_begin_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_drag_end<F: Fn(&Self, &Actor, f32, f32, ModifierType) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn drag_end_trampoline<
-            P,
-            F: Fn(&P, &Actor, f32, f32, ModifierType) + 'static,
-        >(
-            this: *mut ffi::ClutterDragAction,
-            actor: *mut ffi::ClutterActor,
-            event_x: libc::c_float,
-            event_y: libc::c_float,
-            modifiers: ffi::ClutterModifierType,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DragAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                event_x,
-                event_y,
-                from_glib(modifiers),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"drag-end\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    drag_end_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_drag_motion<F: Fn(&Self, &Actor, f32, f32) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn drag_motion_trampoline<P, F: Fn(&P, &Actor, f32, f32) + 'static>(
-            this: *mut ffi::ClutterDragAction,
-            actor: *mut ffi::ClutterActor,
-            delta_x: libc::c_float,
-            delta_y: libc::c_float,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DragAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                delta_x,
-                delta_y,
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"drag-motion\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    drag_motion_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_drag_progress<F: Fn(&Self, &Actor, f32, f32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn drag_progress_trampoline<
-            P,
-            F: Fn(&P, &Actor, f32, f32) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterDragAction,
-            actor: *mut ffi::ClutterActor,
-            delta_x: libc::c_float,
-            delta_y: libc::c_float,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DragAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                delta_x,
-                delta_y,
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"drag-progress\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    drag_progress_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_drag_area_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_drag_area_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDragAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DragAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::drag-area\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_drag_area_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_drag_area_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_drag_area_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDragAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DragAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::drag-area-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_drag_area_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_drag_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_drag_axis_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDragAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DragAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::drag-axis\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_drag_axis_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_drag_handle_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_drag_handle_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDragAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DragAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::drag-handle\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_drag_handle_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_x_drag_threshold_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_x_drag_threshold_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDragAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DragAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::x-drag-threshold\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_x_drag_threshold_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_y_drag_threshold_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_y_drag_threshold_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterDragAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DragAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&DragAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::y-drag-threshold\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_y_drag_threshold_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for DragAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "DragAction")
-    }
-}
diff --git a/src/legacy/drop_action.rs b/src/legacy/drop_action.rs
deleted file mode 100644
index a70007e..0000000
--- a/src/legacy/drop_action.rs
+++ /dev/null
@@ -1,267 +0,0 @@
-use crate::{Action, Actor, ActorMeta};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct DropAction(Object<ffi::ClutterDropAction, ffi::ClutterDropActionClass, DropActionClass>) @extends Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_drop_action_get_type(),
-    }
-}
-
-impl DropAction {
-    /// Creates a new `DropAction`.
-    ///
-    /// Use `ActorExt::add_action` to add the action to a `Actor`.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `DropAction`
-    pub fn new() -> DropAction {
-        unsafe { Action::from_glib_none(ffi::clutter_drop_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for DropAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `DropAction` methods.
-///
-/// # Implementors
-///
-/// [`DropAction`](struct.DropAction.html)
-pub trait DropActionExt: 'static {
-    /// The ::can-drop signal is emitted when the dragged actor is dropped
-    /// on `actor`. The return value of the ::can-drop signal will determine
-    /// whether or not the `DropAction::drop` signal is going to be
-    /// emitted on `action`.
-    ///
-    /// The default implementation of `DropAction` returns `true` for
-    /// this signal.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    /// ## `event_x`
-    /// the X coordinate (in stage space) of the drop event
-    /// ## `event_y`
-    /// the Y coordinate (in stage space) of the drop event
-    ///
-    /// # Returns
-    ///
-    /// `true` if the drop is accepted, and `false` otherwise
-    fn connect_can_drop<F: Fn(&Self, &Actor, f32, f32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::drop signal is emitted when the dragged actor is dropped
-    /// on `actor`. This signal is only emitted if at least an handler of
-    /// `DropAction::can-drop` returns `true`.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    /// ## `event_x`
-    /// the X coordinate (in stage space) of the drop event
-    /// ## `event_y`
-    /// the Y coordinate (in stage space) of the drop event
-    fn connect_drop<F: Fn(&Self, &Actor, f32, f32) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::drop-cancel signal is emitted when the drop is refused
-    /// by an emission of the `DropAction::can-drop` signal.
-    ///
-    /// After the ::drop-cancel signal is fired the active drag is
-    /// terminated.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    /// ## `event_x`
-    /// the X coordinate (in stage space) of the drop event
-    /// ## `event_y`
-    /// the Y coordinate (in stage space) of the drop event
-    fn connect_drop_cancel<F: Fn(&Self, &Actor, f32, f32) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::over-in signal is emitted when the dragged actor crosses
-    /// into `actor`.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    fn connect_over_in<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::over-out signal is emitted when the dragged actor crosses
-    /// outside `actor`.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    fn connect_over_out<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<DropAction>> DropActionExt for O {
-    fn connect_can_drop<F: Fn(&Self, &Actor, f32, f32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn can_drop_trampoline<P, F: Fn(&P, &Actor, f32, f32) -> bool + 'static>(
-            this: *mut ffi::ClutterDropAction,
-            actor: *mut ffi::ClutterActor,
-            event_x: libc::c_float,
-            event_y: libc::c_float,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<DropAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DropAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                event_x,
-                event_y,
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"can-drop\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    can_drop_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_drop<F: Fn(&Self, &Actor, f32, f32) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn drop_trampoline<P, F: Fn(&P, &Actor, f32, f32) + 'static>(
-            this: *mut ffi::ClutterDropAction,
-            actor: *mut ffi::ClutterActor,
-            event_x: libc::c_float,
-            event_y: libc::c_float,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DropAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DropAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                event_x,
-                event_y,
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"drop\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    drop_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_drop_cancel<F: Fn(&Self, &Actor, f32, f32) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn drop_cancel_trampoline<P, F: Fn(&P, &Actor, f32, f32) + 'static>(
-            this: *mut ffi::ClutterDropAction,
-            actor: *mut ffi::ClutterActor,
-            event_x: libc::c_float,
-            event_y: libc::c_float,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DropAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DropAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                event_x,
-                event_y,
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"drop-cancel\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    drop_cancel_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_over_in<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn over_in_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterDropAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DropAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DropAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"over-in\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    over_in_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_over_out<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn over_out_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterDropAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<DropAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &DropAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"over-out\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    over_out_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for DropAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "DropAction")
-    }
-}
diff --git a/src/legacy/effect.rs b/src/legacy/effect.rs
deleted file mode 100644
index ce9823d..0000000
--- a/src/legacy/effect.rs
+++ /dev/null
@@ -1,69 +0,0 @@
-use crate::ActorMeta;
-use glib::{object as gobject, object::IsA, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct Effect(Object<ffi::ClutterEffect, ffi::ClutterEffectClass, EffectClass>) @extends ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_effect_get_type(),
-    }
-}
-
-/// Trait containing all `Effect` methods.
-///
-/// # Implementors
-///
-/// [`Effect`](struct.Effect.html), [`OffscreenEffect`](struct.OffscreenEffect.html)
-pub trait EffectExt: 'static {
-    /// Queues a repaint of the effect. The effect can detect when the ‘paint’
-    /// method is called as a result of this function because it will not
-    /// have the `EffectPaintFlags::ActorDirty` flag set. In that case the
-    /// effect is free to assume that the actor has not changed its
-    /// appearance since the last time it was painted so it doesn't need to
-    /// call `ActorExt::continue_paint` if it can draw a cached
-    /// image. This is mostly intended for effects that are using a
-    /// `dx::Offscreen` to redirect the actor (such as
-    /// `OffscreenEffect`). In that case the effect can save a bit of
-    /// rendering time by painting the cached texture without causing the
-    /// entire actor to be painted.
-    ///
-    /// This function can be used by effects that have their own animatable
-    /// parameters. For example, an effect which adds a varying degree of a
-    /// red tint to an actor by redirecting it through a CoglOffscreen
-    /// might have a property to specify the level of tint. When this value
-    /// changes, the underlying actor doesn't need to be redrawn so the
-    /// effect can call `EffectExt::queue_repaint` to make sure the
-    /// effect is repainted.
-    ///
-    /// Note however that modifying the position of the parent of an actor
-    /// may change the appearance of the actor because its transformation
-    /// matrix would change. In this case a redraw wouldn't be queued on
-    /// the actor itself so the `EffectPaintFlags::ActorDirty` would still
-    /// not be set. The effect can detect this case by keeping track of the
-    /// last modelview matrix that was used to render the actor and
-    /// veryifying that it remains the same in the next paint.
-    ///
-    /// Any other effects that are layered on top of the passed in effect
-    /// will still be passed the `EffectPaintFlags::ActorDirty` flag. If
-    /// anything queues a redraw on the actor without specifying an effect
-    /// or with an effect that is lower in the chain of effects than this
-    /// one then that will override this call. In that case this effect
-    /// will instead be called with the `EffectPaintFlags::ActorDirty`
-    /// flag set.
-    fn queue_repaint(&self);
-}
-
-impl<O: IsA<Effect>> EffectExt for O {
-    fn queue_repaint(&self) {
-        unsafe {
-            ffi::clutter_effect_queue_repaint(self.as_ref().to_glib_none().0);
-        }
-    }
-}
-
-impl fmt::Display for Effect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Effect")
-    }
-}
diff --git a/src/legacy/enums.rs b/src/legacy/enums.rs
deleted file mode 100644
index f2e7d1b..0000000
--- a/src/legacy/enums.rs
+++ /dev/null
@@ -1,3953 +0,0 @@
-use glib::{
-    error::ErrorDomain,
-    translate::*,
-    value::{FromValue, FromValueOptional, SetValue, Value},
-    Quark, StaticType, Type,
-};
-use std::fmt;
-
-/// Controls how a `Actor` should align itself inside the extra space
-/// assigned to it during the allocation.
-///
-/// Alignment only matters if the allocated space given to an actor is
-/// bigger than its natural size; for example, when the `Actor:x-expand`
-/// or the `Actor:y-expand` properties of `Actor` are set to `true`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ActorAlign {
-    /// Stretch to cover the whole allocated space
-    Fill,
-    /// Snap to left or top side, leaving space
-    ///  to the right or bottom. For horizontal layouts, in right-to-left
-    ///  locales this should be reversed.
-    Start,
-    /// Center the actor inside the allocation
-    Center,
-    /// Snap to right or bottom side, leaving space
-    ///  to the left or top. For horizontal layouts, in right-to-left locales
-    ///  this should be reversed.
-    End,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ActorAlign {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ActorAlign::{}",
-            match *self {
-                ActorAlign::Fill => "Fill",
-                ActorAlign::Start => "Start",
-                ActorAlign::Center => "Center",
-                ActorAlign::End => "End",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ActorAlign {
-    type GlibType = ffi::ClutterActorAlign;
-
-    fn to_glib(&self) -> ffi::ClutterActorAlign {
-        match *self {
-            ActorAlign::Fill => ffi::CLUTTER_ACTOR_ALIGN_FILL,
-            ActorAlign::Start => ffi::CLUTTER_ACTOR_ALIGN_START,
-            ActorAlign::Center => ffi::CLUTTER_ACTOR_ALIGN_CENTER,
-            ActorAlign::End => ffi::CLUTTER_ACTOR_ALIGN_END,
-            ActorAlign::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterActorAlign> for ActorAlign {
-    fn from_glib(value: ffi::ClutterActorAlign) -> Self {
-        match value {
-            0 => ActorAlign::Fill,
-            1 => ActorAlign::Start,
-            2 => ActorAlign::Center,
-            3 => ActorAlign::End,
-            value => ActorAlign::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for ActorAlign {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_actor_align_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ActorAlign {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ActorAlign {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ActorAlign {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Specifies the axis on which `AlignConstraint` should maintain
-/// the alignment.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum AlignAxis {
-    /// Maintain the alignment on the X axis
-    XAxis,
-    /// Maintain the alignment on the Y axis
-    YAxis,
-    /// Maintain the alignment on both the X and Y axis
-    Both,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for AlignAxis {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "AlignAxis::{}",
-            match *self {
-                AlignAxis::XAxis => "XAxis",
-                AlignAxis::YAxis => "YAxis",
-                AlignAxis::Both => "Both",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for AlignAxis {
-    type GlibType = ffi::ClutterAlignAxis;
-
-    fn to_glib(&self) -> ffi::ClutterAlignAxis {
-        match *self {
-            AlignAxis::XAxis => ffi::CLUTTER_ALIGN_X_AXIS,
-            AlignAxis::YAxis => ffi::CLUTTER_ALIGN_Y_AXIS,
-            AlignAxis::Both => ffi::CLUTTER_ALIGN_BOTH,
-            AlignAxis::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterAlignAxis> for AlignAxis {
-    fn from_glib(value: ffi::ClutterAlignAxis) -> Self {
-        match value {
-            0 => AlignAxis::XAxis,
-            1 => AlignAxis::YAxis,
-            2 => AlignAxis::Both,
-            value => AlignAxis::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for AlignAxis {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_align_axis_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for AlignAxis {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for AlignAxis {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for AlignAxis {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The animation modes used by `Alpha` and `Animation`. This
-/// enumeration can be expanded in later versions of Clutter.
-///
-/// <figure id="easing-modes">
-///  `<title>`Easing modes provided by Clutter`</title>`
-///  <graphic fileref="easing-modes.png" format="PNG"/>
-/// `</figure>`
-///
-/// Every global alpha function registered using `Alpha::register_func`
-/// or `Alpha::register_closure` will have a logical id greater than
-/// `AnimationMode::AnimationLast`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum AnimationMode {
-    /// custom progress function
-    CustomMode,
-    /// linear tweening
-    Linear,
-    /// quadratic tweening
-    EaseInQuad,
-    /// quadratic tweening, inverse of
-    ///  `AnimationMode::EaseInQuad`
-    EaseOutQuad,
-    /// quadratic tweening, combininig
-    ///  `AnimationMode::EaseInQuad` and `AnimationMode::EaseOutQuad`
-    EaseInOutQuad,
-    /// cubic tweening
-    EaseInCubic,
-    /// cubic tweening, invers of
-    ///  `AnimationMode::EaseInCubic`
-    EaseOutCubic,
-    /// cubic tweening, combining
-    ///  `AnimationMode::EaseInCubic` and `AnimationMode::EaseOutCubic`
-    EaseInOutCubic,
-    /// quartic tweening
-    EaseInQuart,
-    /// quartic tweening, inverse of
-    ///  `AnimationMode::EaseInQuart`
-    EaseOutQuart,
-    /// quartic tweening, combining
-    ///  `AnimationMode::EaseInQuart` and `AnimationMode::EaseOutQuart`
-    EaseInOutQuart,
-    /// quintic tweening
-    EaseInQuint,
-    /// quintic tweening, inverse of
-    ///  `AnimationMode::EaseInQuint`
-    EaseOutQuint,
-    /// fifth power tweening, combining
-    ///  `AnimationMode::EaseInQuint` and `AnimationMode::EaseOutQuint`
-    EaseInOutQuint,
-    /// sinusoidal tweening
-    EaseInSine,
-    /// sinusoidal tweening, inverse of
-    ///  `AnimationMode::EaseInSine`
-    EaseOutSine,
-    /// sine wave tweening, combining
-    ///  `AnimationMode::EaseInSine` and `AnimationMode::EaseOutSine`
-    EaseInOutSine,
-    /// exponential tweening
-    EaseInExpo,
-    /// exponential tweening, inverse of
-    ///  `AnimationMode::EaseInExpo`
-    EaseOutExpo,
-    /// exponential tweening, combining
-    ///  `AnimationMode::EaseInExpo` and `AnimationMode::EaseOutExpo`
-    EaseInOutExpo,
-    /// circular tweening
-    EaseInCirc,
-    /// circular tweening, inverse of
-    ///  `AnimationMode::EaseInCirc`
-    EaseOutCirc,
-    /// circular tweening, combining
-    ///  `AnimationMode::EaseInCirc` and `AnimationMode::EaseOutCirc`
-    EaseInOutCirc,
-    /// elastic tweening, with offshoot on start
-    EaseInElastic,
-    /// elastic tweening, with offshoot on end
-    EaseOutElastic,
-    /// elastic tweening with offshoot on both ends
-    EaseInOutElastic,
-    /// overshooting cubic tweening, with
-    ///  backtracking on start
-    EaseInBack,
-    /// overshooting cubic tweening, with
-    ///  backtracking on end
-    EaseOutBack,
-    /// overshooting cubic tweening, with
-    ///  backtracking on both ends
-    EaseInOutBack,
-    /// exponentially decaying parabolic (bounce)
-    ///  tweening, with bounce on start
-    EaseInBounce,
-    /// exponentially decaying parabolic (bounce)
-    ///  tweening, with bounce on end
-    EaseOutBounce,
-    /// exponentially decaying parabolic (bounce)
-    ///  tweening, with bounce on both ends
-    EaseInOutBounce,
-    /// parametrized step function; see `TimelineExt::set_step_progress`
-    ///  for further details. (Since 1.12)
-    Steps,
-    /// equivalent to `AnimationMode::Steps` with a number of steps
-    ///  equal to 1, and a step mode of `StepMode::Start`. (Since 1.12)
-    StepStart,
-    /// equivalent to `AnimationMode::Steps` with a number of steps
-    ///  equal to 1, and a step mode of `StepMode::End`. (Since 1.12)
-    StepEnd,
-    /// cubic bezier between (0, 0) and (1, 1) with two
-    ///  control points; see `TimelineExt::set_cubic_bezier_progress`. (Since 1.12)
-    CubicBezier,
-    /// equivalent to `AnimationMode::CubicBezier` with control points
-    ///  in (0.25, 0.1) and (0.25, 1.0). (Since 1.12)
-    Ease,
-    /// equivalent to `AnimationMode::CubicBezier` with control points
-    ///  in (0.42, 0) and (1.0, 1.0). (Since 1.12)
-    EaseIn,
-    /// equivalent to `AnimationMode::CubicBezier` with control points
-    ///  in (0, 0) and (0.58, 1.0). (Since 1.12)
-    EaseOut,
-    /// equivalent to `AnimationMode::CubicBezier` with control points
-    ///  in (0.42, 0) and (0.58, 1.0). (Since 1.12)
-    EaseInOut,
-    /// last animation mode, used as a guard for
-    ///  registered global alpha functions
-    AnimationLast,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for AnimationMode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "AnimationMode::{}",
-            match *self {
-                AnimationMode::CustomMode => "CustomMode",
-                AnimationMode::Linear => "Linear",
-                AnimationMode::EaseInQuad => "EaseInQuad",
-                AnimationMode::EaseOutQuad => "EaseOutQuad",
-                AnimationMode::EaseInOutQuad => "EaseInOutQuad",
-                AnimationMode::EaseInCubic => "EaseInCubic",
-                AnimationMode::EaseOutCubic => "EaseOutCubic",
-                AnimationMode::EaseInOutCubic => "EaseInOutCubic",
-                AnimationMode::EaseInQuart => "EaseInQuart",
-                AnimationMode::EaseOutQuart => "EaseOutQuart",
-                AnimationMode::EaseInOutQuart => "EaseInOutQuart",
-                AnimationMode::EaseInQuint => "EaseInQuint",
-                AnimationMode::EaseOutQuint => "EaseOutQuint",
-                AnimationMode::EaseInOutQuint => "EaseInOutQuint",
-                AnimationMode::EaseInSine => "EaseInSine",
-                AnimationMode::EaseOutSine => "EaseOutSine",
-                AnimationMode::EaseInOutSine => "EaseInOutSine",
-                AnimationMode::EaseInExpo => "EaseInExpo",
-                AnimationMode::EaseOutExpo => "EaseOutExpo",
-                AnimationMode::EaseInOutExpo => "EaseInOutExpo",
-                AnimationMode::EaseInCirc => "EaseInCirc",
-                AnimationMode::EaseOutCirc => "EaseOutCirc",
-                AnimationMode::EaseInOutCirc => "EaseInOutCirc",
-                AnimationMode::EaseInElastic => "EaseInElastic",
-                AnimationMode::EaseOutElastic => "EaseOutElastic",
-                AnimationMode::EaseInOutElastic => "EaseInOutElastic",
-                AnimationMode::EaseInBack => "EaseInBack",
-                AnimationMode::EaseOutBack => "EaseOutBack",
-                AnimationMode::EaseInOutBack => "EaseInOutBack",
-                AnimationMode::EaseInBounce => "EaseInBounce",
-                AnimationMode::EaseOutBounce => "EaseOutBounce",
-                AnimationMode::EaseInOutBounce => "EaseInOutBounce",
-                AnimationMode::Steps => "Steps",
-                AnimationMode::StepStart => "StepStart",
-                AnimationMode::StepEnd => "StepEnd",
-                AnimationMode::CubicBezier => "CubicBezier",
-                AnimationMode::Ease => "Ease",
-                AnimationMode::EaseIn => "EaseIn",
-                AnimationMode::EaseOut => "EaseOut",
-                AnimationMode::EaseInOut => "EaseInOut",
-                AnimationMode::AnimationLast => "AnimationLast",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for AnimationMode {
-    type GlibType = ffi::ClutterAnimationMode;
-
-    fn to_glib(&self) -> ffi::ClutterAnimationMode {
-        match *self {
-            AnimationMode::CustomMode => ffi::CLUTTER_CUSTOM_MODE,
-            AnimationMode::Linear => ffi::CLUTTER_LINEAR,
-            AnimationMode::EaseInQuad => ffi::CLUTTER_EASE_IN_QUAD,
-            AnimationMode::EaseOutQuad => ffi::CLUTTER_EASE_OUT_QUAD,
-            AnimationMode::EaseInOutQuad => ffi::CLUTTER_EASE_IN_OUT_QUAD,
-            AnimationMode::EaseInCubic => ffi::CLUTTER_EASE_IN_CUBIC,
-            AnimationMode::EaseOutCubic => ffi::CLUTTER_EASE_OUT_CUBIC,
-            AnimationMode::EaseInOutCubic => ffi::CLUTTER_EASE_IN_OUT_CUBIC,
-            AnimationMode::EaseInQuart => ffi::CLUTTER_EASE_IN_QUART,
-            AnimationMode::EaseOutQuart => ffi::CLUTTER_EASE_OUT_QUART,
-            AnimationMode::EaseInOutQuart => ffi::CLUTTER_EASE_IN_OUT_QUART,
-            AnimationMode::EaseInQuint => ffi::CLUTTER_EASE_IN_QUINT,
-            AnimationMode::EaseOutQuint => ffi::CLUTTER_EASE_OUT_QUINT,
-            AnimationMode::EaseInOutQuint => ffi::CLUTTER_EASE_IN_OUT_QUINT,
-            AnimationMode::EaseInSine => ffi::CLUTTER_EASE_IN_SINE,
-            AnimationMode::EaseOutSine => ffi::CLUTTER_EASE_OUT_SINE,
-            AnimationMode::EaseInOutSine => ffi::CLUTTER_EASE_IN_OUT_SINE,
-            AnimationMode::EaseInExpo => ffi::CLUTTER_EASE_IN_EXPO,
-            AnimationMode::EaseOutExpo => ffi::CLUTTER_EASE_OUT_EXPO,
-            AnimationMode::EaseInOutExpo => ffi::CLUTTER_EASE_IN_OUT_EXPO,
-            AnimationMode::EaseInCirc => ffi::CLUTTER_EASE_IN_CIRC,
-            AnimationMode::EaseOutCirc => ffi::CLUTTER_EASE_OUT_CIRC,
-            AnimationMode::EaseInOutCirc => ffi::CLUTTER_EASE_IN_OUT_CIRC,
-            AnimationMode::EaseInElastic => ffi::CLUTTER_EASE_IN_ELASTIC,
-            AnimationMode::EaseOutElastic => ffi::CLUTTER_EASE_OUT_ELASTIC,
-            AnimationMode::EaseInOutElastic => ffi::CLUTTER_EASE_IN_OUT_ELASTIC,
-            AnimationMode::EaseInBack => ffi::CLUTTER_EASE_IN_BACK,
-            AnimationMode::EaseOutBack => ffi::CLUTTER_EASE_OUT_BACK,
-            AnimationMode::EaseInOutBack => ffi::CLUTTER_EASE_IN_OUT_BACK,
-            AnimationMode::EaseInBounce => ffi::CLUTTER_EASE_IN_BOUNCE,
-            AnimationMode::EaseOutBounce => ffi::CLUTTER_EASE_OUT_BOUNCE,
-            AnimationMode::EaseInOutBounce => ffi::CLUTTER_EASE_IN_OUT_BOUNCE,
-            AnimationMode::Steps => ffi::CLUTTER_STEPS,
-            AnimationMode::StepStart => ffi::CLUTTER_STEP_START,
-            AnimationMode::StepEnd => ffi::CLUTTER_STEP_END,
-            AnimationMode::CubicBezier => ffi::CLUTTER_CUBIC_BEZIER,
-            AnimationMode::Ease => ffi::CLUTTER_EASE,
-            AnimationMode::EaseIn => ffi::CLUTTER_EASE_IN,
-            AnimationMode::EaseOut => ffi::CLUTTER_EASE_OUT,
-            AnimationMode::EaseInOut => ffi::CLUTTER_EASE_IN_OUT,
-            AnimationMode::AnimationLast => ffi::CLUTTER_ANIMATION_LAST,
-            AnimationMode::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterAnimationMode> for AnimationMode {
-    fn from_glib(value: ffi::ClutterAnimationMode) -> Self {
-        match value {
-            0 => AnimationMode::CustomMode,
-            1 => AnimationMode::Linear,
-            2 => AnimationMode::EaseInQuad,
-            3 => AnimationMode::EaseOutQuad,
-            4 => AnimationMode::EaseInOutQuad,
-            5 => AnimationMode::EaseInCubic,
-            6 => AnimationMode::EaseOutCubic,
-            7 => AnimationMode::EaseInOutCubic,
-            8 => AnimationMode::EaseInQuart,
-            9 => AnimationMode::EaseOutQuart,
-            10 => AnimationMode::EaseInOutQuart,
-            11 => AnimationMode::EaseInQuint,
-            12 => AnimationMode::EaseOutQuint,
-            13 => AnimationMode::EaseInOutQuint,
-            14 => AnimationMode::EaseInSine,
-            15 => AnimationMode::EaseOutSine,
-            16 => AnimationMode::EaseInOutSine,
-            17 => AnimationMode::EaseInExpo,
-            18 => AnimationMode::EaseOutExpo,
-            19 => AnimationMode::EaseInOutExpo,
-            20 => AnimationMode::EaseInCirc,
-            21 => AnimationMode::EaseOutCirc,
-            22 => AnimationMode::EaseInOutCirc,
-            23 => AnimationMode::EaseInElastic,
-            24 => AnimationMode::EaseOutElastic,
-            25 => AnimationMode::EaseInOutElastic,
-            26 => AnimationMode::EaseInBack,
-            27 => AnimationMode::EaseOutBack,
-            28 => AnimationMode::EaseInOutBack,
-            29 => AnimationMode::EaseInBounce,
-            30 => AnimationMode::EaseOutBounce,
-            31 => AnimationMode::EaseInOutBounce,
-            32 => AnimationMode::Steps,
-            33 => AnimationMode::StepStart,
-            34 => AnimationMode::StepEnd,
-            35 => AnimationMode::CubicBezier,
-            36 => AnimationMode::Ease,
-            37 => AnimationMode::EaseIn,
-            38 => AnimationMode::EaseOut,
-            39 => AnimationMode::EaseInOut,
-            40 => AnimationMode::AnimationLast,
-            value => AnimationMode::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for AnimationMode {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_animation_mode_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for AnimationMode {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for AnimationMode {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for AnimationMode {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum BinAlignment {
-    Fixed,
-    Fill,
-    Start,
-    End,
-    Center,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for BinAlignment {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "BinAlignment::{}",
-            match *self {
-                BinAlignment::Fixed => "Fixed",
-                BinAlignment::Fill => "Fill",
-                BinAlignment::Start => "Start",
-                BinAlignment::End => "End",
-                BinAlignment::Center => "Center",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for BinAlignment {
-    type GlibType = ffi::ClutterBinAlignment;
-
-    fn to_glib(&self) -> ffi::ClutterBinAlignment {
-        match *self {
-            BinAlignment::Fixed => ffi::CLUTTER_BIN_ALIGNMENT_FIXED,
-            BinAlignment::Fill => ffi::CLUTTER_BIN_ALIGNMENT_FILL,
-            BinAlignment::Start => ffi::CLUTTER_BIN_ALIGNMENT_START,
-            BinAlignment::End => ffi::CLUTTER_BIN_ALIGNMENT_END,
-            BinAlignment::Center => ffi::CLUTTER_BIN_ALIGNMENT_CENTER,
-            BinAlignment::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterBinAlignment> for BinAlignment {
-    fn from_glib(value: ffi::ClutterBinAlignment) -> Self {
-        match value {
-            0 => BinAlignment::Fixed,
-            1 => BinAlignment::Fill,
-            2 => BinAlignment::Start,
-            3 => BinAlignment::End,
-            4 => BinAlignment::Center,
-            value => BinAlignment::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for BinAlignment {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_bin_alignment_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for BinAlignment {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for BinAlignment {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for BinAlignment {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Specifies which property should be used in a binding
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum BindCoordinate {
-    /// Bind the X coordinate
-    X,
-    /// Bind the Y coordinate
-    Y,
-    /// Bind the width
-    Width,
-    /// Bind the height
-    Height,
-    /// Equivalent to to `BindCoordinate::X` and
-    ///  `BindCoordinate::Y` (added in Clutter 1.6)
-    Position,
-    /// Equivalent to `BindCoordinate::Width` and
-    ///  `BindCoordinate::Height` (added in Clutter 1.6)
-    Size,
-    /// Equivalent to `BindCoordinate::Position` and
-    ///  `BindCoordinate::Size` (added in Clutter 1.10)
-    All,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for BindCoordinate {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "BindCoordinate::{}",
-            match *self {
-                BindCoordinate::X => "X",
-                BindCoordinate::Y => "Y",
-                BindCoordinate::Width => "Width",
-                BindCoordinate::Height => "Height",
-                BindCoordinate::Position => "Position",
-                BindCoordinate::Size => "Size",
-                BindCoordinate::All => "All",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for BindCoordinate {
-    type GlibType = ffi::ClutterBindCoordinate;
-
-    fn to_glib(&self) -> ffi::ClutterBindCoordinate {
-        match *self {
-            BindCoordinate::X => ffi::CLUTTER_BIND_X,
-            BindCoordinate::Y => ffi::CLUTTER_BIND_Y,
-            BindCoordinate::Width => ffi::CLUTTER_BIND_WIDTH,
-            BindCoordinate::Height => ffi::CLUTTER_BIND_HEIGHT,
-            BindCoordinate::Position => ffi::CLUTTER_BIND_POSITION,
-            BindCoordinate::Size => ffi::CLUTTER_BIND_SIZE,
-            BindCoordinate::All => ffi::CLUTTER_BIND_ALL,
-            BindCoordinate::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterBindCoordinate> for BindCoordinate {
-    fn from_glib(value: ffi::ClutterBindCoordinate) -> Self {
-        match value {
-            0 => BindCoordinate::X,
-            1 => BindCoordinate::Y,
-            2 => BindCoordinate::Width,
-            3 => BindCoordinate::Height,
-            4 => BindCoordinate::Position,
-            5 => BindCoordinate::Size,
-            6 => BindCoordinate::All,
-            value => BindCoordinate::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for BindCoordinate {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_bind_coordinate_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for BindCoordinate {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for BindCoordinate {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for BindCoordinate {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The alignment policies available on each axis of the `BoxLayout`
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum BoxAlignment {
-    /// Align the child to the top or to
-    ///  to the left, depending on the used axis
-    Start,
-    /// Align the child to the bottom or to
-    ///  the right, depending on the used axis
-    End,
-    /// Align the child to the center
-    Center,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for BoxAlignment {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "BoxAlignment::{}",
-            match *self {
-                BoxAlignment::Start => "Start",
-                BoxAlignment::End => "End",
-                BoxAlignment::Center => "Center",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for BoxAlignment {
-    type GlibType = ffi::ClutterBoxAlignment;
-
-    fn to_glib(&self) -> ffi::ClutterBoxAlignment {
-        match *self {
-            BoxAlignment::Start => ffi::CLUTTER_BOX_ALIGNMENT_START,
-            BoxAlignment::End => ffi::CLUTTER_BOX_ALIGNMENT_END,
-            BoxAlignment::Center => ffi::CLUTTER_BOX_ALIGNMENT_CENTER,
-            BoxAlignment::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterBoxAlignment> for BoxAlignment {
-    fn from_glib(value: ffi::ClutterBoxAlignment) -> Self {
-        match value {
-            0 => BoxAlignment::Start,
-            1 => BoxAlignment::End,
-            2 => BoxAlignment::Center,
-            value => BoxAlignment::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for BoxAlignment {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_box_alignment_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for BoxAlignment {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for BoxAlignment {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for BoxAlignment {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Controls the alignment of the `Content` inside a `Actor`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ContentGravity {
-    /// Align the content to the top left corner
-    TopLeft,
-    /// Align the content to the top edge
-    Top,
-    /// Align the content to the top right corner
-    TopRight,
-    /// Align the content to the left edge
-    Left,
-    /// Align the content to the center
-    Center,
-    /// Align the content to the right edge
-    Right,
-    /// Align the content to the bottom left corner
-    BottomLeft,
-    /// Align the content to the bottom edge
-    Bottom,
-    /// Align the content to the bottom right corner
-    BottomRight,
-    /// Resize the content to fill the allocation
-    ResizeFill,
-    /// Resize the content to remain within the
-    ///  allocation, while maintaining the aspect ratio
-    ResizeAspect,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ContentGravity {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ContentGravity::{}",
-            match *self {
-                ContentGravity::TopLeft => "TopLeft",
-                ContentGravity::Top => "Top",
-                ContentGravity::TopRight => "TopRight",
-                ContentGravity::Left => "Left",
-                ContentGravity::Center => "Center",
-                ContentGravity::Right => "Right",
-                ContentGravity::BottomLeft => "BottomLeft",
-                ContentGravity::Bottom => "Bottom",
-                ContentGravity::BottomRight => "BottomRight",
-                ContentGravity::ResizeFill => "ResizeFill",
-                ContentGravity::ResizeAspect => "ResizeAspect",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ContentGravity {
-    type GlibType = ffi::ClutterContentGravity;
-
-    fn to_glib(&self) -> ffi::ClutterContentGravity {
-        match *self {
-            ContentGravity::TopLeft => ffi::CLUTTER_CONTENT_GRAVITY_TOP_LEFT,
-            ContentGravity::Top => ffi::CLUTTER_CONTENT_GRAVITY_TOP,
-            ContentGravity::TopRight => ffi::CLUTTER_CONTENT_GRAVITY_TOP_RIGHT,
-            ContentGravity::Left => ffi::CLUTTER_CONTENT_GRAVITY_LEFT,
-            ContentGravity::Center => ffi::CLUTTER_CONTENT_GRAVITY_CENTER,
-            ContentGravity::Right => ffi::CLUTTER_CONTENT_GRAVITY_RIGHT,
-            ContentGravity::BottomLeft => ffi::CLUTTER_CONTENT_GRAVITY_BOTTOM_LEFT,
-            ContentGravity::Bottom => ffi::CLUTTER_CONTENT_GRAVITY_BOTTOM,
-            ContentGravity::BottomRight => ffi::CLUTTER_CONTENT_GRAVITY_BOTTOM_RIGHT,
-            ContentGravity::ResizeFill => ffi::CLUTTER_CONTENT_GRAVITY_RESIZE_FILL,
-            ContentGravity::ResizeAspect => ffi::CLUTTER_CONTENT_GRAVITY_RESIZE_ASPECT,
-            ContentGravity::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterContentGravity> for ContentGravity {
-    fn from_glib(value: ffi::ClutterContentGravity) -> Self {
-        match value {
-            0 => ContentGravity::TopLeft,
-            1 => ContentGravity::Top,
-            2 => ContentGravity::TopRight,
-            3 => ContentGravity::Left,
-            4 => ContentGravity::Center,
-            5 => ContentGravity::Right,
-            6 => ContentGravity::BottomLeft,
-            7 => ContentGravity::Bottom,
-            8 => ContentGravity::BottomRight,
-            9 => ContentGravity::ResizeFill,
-            10 => ContentGravity::ResizeAspect,
-            value => ContentGravity::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for ContentGravity {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_content_gravity_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ContentGravity {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ContentGravity {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ContentGravity {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The axis of the constraint that should be applied on the
-/// dragging action
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum DragAxis {
-    /// No constraint
-    AxisNone,
-    /// Set a constraint on the X axis
-    XAxis,
-    /// Set a constraint on the Y axis
-    YAxis,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for DragAxis {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "DragAxis::{}",
-            match *self {
-                DragAxis::AxisNone => "AxisNone",
-                DragAxis::XAxis => "XAxis",
-                DragAxis::YAxis => "YAxis",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for DragAxis {
-    type GlibType = ffi::ClutterDragAxis;
-
-    fn to_glib(&self) -> ffi::ClutterDragAxis {
-        match *self {
-            DragAxis::AxisNone => ffi::CLUTTER_DRAG_AXIS_NONE,
-            DragAxis::XAxis => ffi::CLUTTER_DRAG_X_AXIS,
-            DragAxis::YAxis => ffi::CLUTTER_DRAG_Y_AXIS,
-            DragAxis::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterDragAxis> for DragAxis {
-    fn from_glib(value: ffi::ClutterDragAxis) -> Self {
-        match value {
-            0 => DragAxis::AxisNone,
-            1 => DragAxis::XAxis,
-            2 => DragAxis::YAxis,
-            value => DragAxis::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for DragAxis {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_drag_axis_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for DragAxis {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for DragAxis {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for DragAxis {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Types of events.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum EventType {
-    /// Empty event
-    Nothing,
-    /// Key press event
-    KeyPress,
-    /// Key release event
-    KeyRelease,
-    /// Pointer motion event
-    Motion,
-    /// Actor enter event
-    Enter,
-    /// Actor leave event
-    Leave,
-    /// Pointer button press event
-    ButtonPress,
-    /// Pointer button release event
-    ButtonRelease,
-    /// Pointer scroll event
-    Scroll,
-    /// Stage state change event
-    StageState,
-    /// Destroy notification event
-    DestroyNotify,
-    /// Client message event
-    ClientMessage,
-    /// Stage delete event
-    Delete,
-    /// A new touch event sequence has started;
-    ///  event added in 1.10
-    TouchBegin,
-    /// A touch event sequence has been updated;
-    ///  event added in 1.10
-    TouchUpdate,
-    /// A touch event sequence has finished;
-    ///  event added in 1.10
-    TouchEnd,
-    /// A touch event sequence has been canceled;
-    ///  event added in 1.10
-    TouchCancel,
-    /// A pinch gesture event, the current state is
-    ///  determined by its phase field; event added in 1.24
-    TouchpadPinch,
-    /// A swipe gesture event, the current state is
-    ///  determined by its phase field; event added in 1.24
-    TouchpadSwipe,
-    /// Marks the end of the `EventType` enumeration;
-    ///  added in 1.10
-    EventLast,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for EventType {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "EventType::{}",
-            match *self {
-                EventType::Nothing => "Nothing",
-                EventType::KeyPress => "KeyPress",
-                EventType::KeyRelease => "KeyRelease",
-                EventType::Motion => "Motion",
-                EventType::Enter => "Enter",
-                EventType::Leave => "Leave",
-                EventType::ButtonPress => "ButtonPress",
-                EventType::ButtonRelease => "ButtonRelease",
-                EventType::Scroll => "Scroll",
-                EventType::StageState => "StageState",
-                EventType::DestroyNotify => "DestroyNotify",
-                EventType::ClientMessage => "ClientMessage",
-                EventType::Delete => "Delete",
-                EventType::TouchBegin => "TouchBegin",
-                EventType::TouchUpdate => "TouchUpdate",
-                EventType::TouchEnd => "TouchEnd",
-                EventType::TouchCancel => "TouchCancel",
-                EventType::TouchpadPinch => "TouchpadPinch",
-                EventType::TouchpadSwipe => "TouchpadSwipe",
-                EventType::EventLast => "EventLast",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for EventType {
-    type GlibType = ffi::ClutterEventType;
-
-    fn to_glib(&self) -> ffi::ClutterEventType {
-        match *self {
-            EventType::Nothing => ffi::CLUTTER_NOTHING,
-            EventType::KeyPress => ffi::CLUTTER_KEY_PRESS,
-            EventType::KeyRelease => ffi::CLUTTER_KEY_RELEASE,
-            EventType::Motion => ffi::CLUTTER_MOTION,
-            EventType::Enter => ffi::CLUTTER_ENTER,
-            EventType::Leave => ffi::CLUTTER_LEAVE,
-            EventType::ButtonPress => ffi::CLUTTER_BUTTON_PRESS,
-            EventType::ButtonRelease => ffi::CLUTTER_BUTTON_RELEASE,
-            EventType::Scroll => ffi::CLUTTER_SCROLL,
-            EventType::StageState => ffi::CLUTTER_STAGE_STATE,
-            EventType::DestroyNotify => ffi::CLUTTER_DESTROY_NOTIFY,
-            EventType::ClientMessage => ffi::CLUTTER_CLIENT_MESSAGE,
-            EventType::Delete => ffi::CLUTTER_DELETE,
-            EventType::TouchBegin => ffi::CLUTTER_TOUCH_BEGIN,
-            EventType::TouchUpdate => ffi::CLUTTER_TOUCH_UPDATE,
-            EventType::TouchEnd => ffi::CLUTTER_TOUCH_END,
-            EventType::TouchCancel => ffi::CLUTTER_TOUCH_CANCEL,
-            EventType::TouchpadPinch => ffi::CLUTTER_TOUCHPAD_PINCH,
-            EventType::TouchpadSwipe => ffi::CLUTTER_TOUCHPAD_SWIPE,
-            EventType::EventLast => ffi::CLUTTER_EVENT_LAST,
-            EventType::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterEventType> for EventType {
-    fn from_glib(value: ffi::ClutterEventType) -> Self {
-        match value {
-            0 => EventType::Nothing,
-            1 => EventType::KeyPress,
-            2 => EventType::KeyRelease,
-            3 => EventType::Motion,
-            4 => EventType::Enter,
-            5 => EventType::Leave,
-            6 => EventType::ButtonPress,
-            7 => EventType::ButtonRelease,
-            8 => EventType::Scroll,
-            9 => EventType::StageState,
-            10 => EventType::DestroyNotify,
-            11 => EventType::ClientMessage,
-            12 => EventType::Delete,
-            13 => EventType::TouchBegin,
-            14 => EventType::TouchUpdate,
-            15 => EventType::TouchEnd,
-            16 => EventType::TouchCancel,
-            17 => EventType::TouchpadPinch,
-            18 => EventType::TouchpadSwipe,
-            19 => EventType::EventLast,
-            value => EventType::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for EventType {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_event_type_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for EventType {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for EventType {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for EventType {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The direction of the arrangement of the children inside
-/// a `FlowLayout`
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum FlowOrientation {
-    /// Arrange the children of the flow layout
-    ///  horizontally first
-    Horizontal,
-    /// Arrange the children of the flow layout
-    ///  vertically first
-    Vertical,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for FlowOrientation {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "FlowOrientation::{}",
-            match *self {
-                FlowOrientation::Horizontal => "Horizontal",
-                FlowOrientation::Vertical => "Vertical",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for FlowOrientation {
-    type GlibType = ffi::ClutterFlowOrientation;
-
-    fn to_glib(&self) -> ffi::ClutterFlowOrientation {
-        match *self {
-            FlowOrientation::Horizontal => ffi::CLUTTER_FLOW_HORIZONTAL,
-            FlowOrientation::Vertical => ffi::CLUTTER_FLOW_VERTICAL,
-            FlowOrientation::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterFlowOrientation> for FlowOrientation {
-    fn from_glib(value: ffi::ClutterFlowOrientation) -> Self {
-        match value {
-            0 => FlowOrientation::Horizontal,
-            1 => FlowOrientation::Vertical,
-            value => FlowOrientation::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for FlowOrientation {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_flow_orientation_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for FlowOrientation {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for FlowOrientation {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for FlowOrientation {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Enum passed to the `GestureActionExt::set_threshold_trigger_edge`
-/// function.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum GestureTriggerEdge {
-    /// Tell `GestureAction` that
-    /// the gesture must begin immediately and there's no drag limit that
-    /// will cause its cancellation;
-    None,
-    /// Tell `GestureAction` that
-    /// it needs to wait until the drag threshold has been exceeded before
-    /// considering that the gesture has begun;
-    After,
-    /// Tell `GestureAction` that
-    /// the gesture must begin immediately and that it must be cancelled
-    /// once the drag exceed the configured threshold.
-    Before,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for GestureTriggerEdge {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "GestureTriggerEdge::{}",
-            match *self {
-                GestureTriggerEdge::None => "None",
-                GestureTriggerEdge::After => "After",
-                GestureTriggerEdge::Before => "Before",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for GestureTriggerEdge {
-    type GlibType = ffi::ClutterGestureTriggerEdge;
-
-    fn to_glib(&self) -> ffi::ClutterGestureTriggerEdge {
-        match *self {
-            GestureTriggerEdge::None => ffi::CLUTTER_GESTURE_TRIGGER_EDGE_NONE,
-            GestureTriggerEdge::After => ffi::CLUTTER_GESTURE_TRIGGER_EDGE_AFTER,
-            GestureTriggerEdge::Before => ffi::CLUTTER_GESTURE_TRIGGER_EDGE_BEFORE,
-            GestureTriggerEdge::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterGestureTriggerEdge> for GestureTriggerEdge {
-    fn from_glib(value: ffi::ClutterGestureTriggerEdge) -> Self {
-        match value {
-            0 => GestureTriggerEdge::None,
-            1 => GestureTriggerEdge::After,
-            2 => GestureTriggerEdge::Before,
-            value => GestureTriggerEdge::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for GestureTriggerEdge {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_gesture_trigger_edge_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for GestureTriggerEdge {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for GestureTriggerEdge {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for GestureTriggerEdge {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Grid position modes.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum GridPosition {
-    /// left position
-    Left,
-    /// right position
-    Right,
-    /// top position
-    Top,
-    /// bottom position
-    Bottom,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for GridPosition {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "GridPosition::{}",
-            match *self {
-                GridPosition::Left => "Left",
-                GridPosition::Right => "Right",
-                GridPosition::Top => "Top",
-                GridPosition::Bottom => "Bottom",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for GridPosition {
-    type GlibType = ffi::ClutterGridPosition;
-
-    fn to_glib(&self) -> ffi::ClutterGridPosition {
-        match *self {
-            GridPosition::Left => ffi::CLUTTER_GRID_POSITION_LEFT,
-            GridPosition::Right => ffi::CLUTTER_GRID_POSITION_RIGHT,
-            GridPosition::Top => ffi::CLUTTER_GRID_POSITION_TOP,
-            GridPosition::Bottom => ffi::CLUTTER_GRID_POSITION_BOTTOM,
-            GridPosition::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterGridPosition> for GridPosition {
-    fn from_glib(value: ffi::ClutterGridPosition) -> Self {
-        match value {
-            0 => GridPosition::Left,
-            1 => GridPosition::Right,
-            2 => GridPosition::Top,
-            3 => GridPosition::Bottom,
-            value => GridPosition::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for GridPosition {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_grid_position_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for GridPosition {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for GridPosition {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for GridPosition {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Error enumeration for `Image`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ImageError {
-    /// Invalid data passed to the
-    ///  `ImageExt::set_data` function.
-    Data,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ImageError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ImageError::{}",
-            match *self {
-                ImageError::Data => "Data",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ImageError {
-    type GlibType = ffi::ClutterImageError;
-
-    fn to_glib(&self) -> ffi::ClutterImageError {
-        match *self {
-            ImageError::Data => ffi::CLUTTER_IMAGE_ERROR_INVALID_DATA,
-            ImageError::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterImageError> for ImageError {
-    fn from_glib(value: ffi::ClutterImageError) -> Self {
-        match value {
-            0 => ImageError::Data,
-            value => ImageError::__Unknown(value),
-        }
-    }
-}
-
-impl ErrorDomain for ImageError {
-    fn domain() -> Quark {
-        unsafe { from_glib(ffi::clutter_image_error_quark()) }
-    }
-
-    fn code(self) -> i32 {
-        self.to_glib()
-    }
-
-    fn from(code: i32) -> Option<Self> {
-        match code {
-            0 => Some(ImageError::Data),
-            value => Some(ImageError::__Unknown(value)),
-        }
-    }
-}
-
-impl StaticType for ImageError {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_image_error_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ImageError {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ImageError {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ImageError {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Error conditions returned by `clutter_init` and `clutter_init_with_args`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum InitError {
-    /// Initialisation successful
-    Success,
-    /// Unknown error
-    ErrorUnknown,
-    /// Thread initialisation failed
-    ErrorThreads,
-    /// Backend initialisation failed
-    ErrorBackend,
-    /// Internal error
-    ErrorInternal,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for InitError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "InitError::{}",
-            match *self {
-                InitError::Success => "Success",
-                InitError::ErrorUnknown => "ErrorUnknown",
-                InitError::ErrorThreads => "ErrorThreads",
-                InitError::ErrorBackend => "ErrorBackend",
-                InitError::ErrorInternal => "ErrorInternal",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for InitError {
-    type GlibType = ffi::ClutterInitError;
-
-    fn to_glib(&self) -> ffi::ClutterInitError {
-        match *self {
-            InitError::Success => ffi::CLUTTER_INIT_SUCCESS,
-            InitError::ErrorUnknown => ffi::CLUTTER_INIT_ERROR_UNKNOWN,
-            InitError::ErrorThreads => ffi::CLUTTER_INIT_ERROR_THREADS,
-            InitError::ErrorBackend => ffi::CLUTTER_INIT_ERROR_BACKEND,
-            InitError::ErrorInternal => ffi::CLUTTER_INIT_ERROR_INTERNAL,
-            InitError::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterInitError> for InitError {
-    fn from_glib(value: ffi::ClutterInitError) -> Self {
-        match value {
-            1 => InitError::Success,
-            0 => InitError::ErrorUnknown,
-            -1 => InitError::ErrorThreads,
-            -2 => InitError::ErrorBackend,
-            -3 => InitError::ErrorInternal,
-            value => InitError::__Unknown(value),
-        }
-    }
-}
-
-impl ErrorDomain for InitError {
-    fn domain() -> Quark {
-        unsafe { from_glib(ffi::clutter_init_error_quark()) }
-    }
-
-    fn code(self) -> i32 {
-        self.to_glib()
-    }
-
-    fn from(code: i32) -> Option<Self> {
-        match code {
-            1 => Some(InitError::Success),
-            0 => Some(InitError::ErrorUnknown),
-            -1 => Some(InitError::ErrorThreads),
-            -2 => Some(InitError::ErrorBackend),
-            -3 => Some(InitError::ErrorInternal),
-            value => Some(InitError::__Unknown(value)),
-        }
-    }
-}
-
-impl StaticType for InitError {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_init_error_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for InitError {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for InitError {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for InitError {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The type of axes Clutter recognizes on a `InputDevice`
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum InputAxis {
-    /// Unused axis
-    Ignore,
-    /// The position on the X axis
-    X,
-    /// The position of the Y axis
-    Y,
-    /// The pressure information
-    Pressure,
-    /// The tilt on the X axis
-    Xtilt,
-    /// The tile on the Y axis
-    Ytilt,
-    /// A wheel
-    Wheel,
-    /// Distance (Since 1.12)
-    Distance,
-    /// Last value of the enumeration; this value is
-    ///  useful when iterating over the enumeration values (Since 1.12)
-    Last,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for InputAxis {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "InputAxis::{}",
-            match *self {
-                InputAxis::Ignore => "Ignore",
-                InputAxis::X => "X",
-                InputAxis::Y => "Y",
-                InputAxis::Pressure => "Pressure",
-                InputAxis::Xtilt => "Xtilt",
-                InputAxis::Ytilt => "Ytilt",
-                InputAxis::Wheel => "Wheel",
-                InputAxis::Distance => "Distance",
-                InputAxis::Last => "Last",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for InputAxis {
-    type GlibType = ffi::ClutterInputAxis;
-
-    fn to_glib(&self) -> ffi::ClutterInputAxis {
-        match *self {
-            InputAxis::Ignore => ffi::CLUTTER_INPUT_AXIS_IGNORE,
-            InputAxis::X => ffi::CLUTTER_INPUT_AXIS_X,
-            InputAxis::Y => ffi::CLUTTER_INPUT_AXIS_Y,
-            InputAxis::Pressure => ffi::CLUTTER_INPUT_AXIS_PRESSURE,
-            InputAxis::Xtilt => ffi::CLUTTER_INPUT_AXIS_XTILT,
-            InputAxis::Ytilt => ffi::CLUTTER_INPUT_AXIS_YTILT,
-            InputAxis::Wheel => ffi::CLUTTER_INPUT_AXIS_WHEEL,
-            InputAxis::Distance => ffi::CLUTTER_INPUT_AXIS_DISTANCE,
-            InputAxis::Last => ffi::CLUTTER_INPUT_AXIS_LAST,
-            InputAxis::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterInputAxis> for InputAxis {
-    fn from_glib(value: ffi::ClutterInputAxis) -> Self {
-        match value {
-            0 => InputAxis::Ignore,
-            1 => InputAxis::X,
-            2 => InputAxis::Y,
-            3 => InputAxis::Pressure,
-            4 => InputAxis::Xtilt,
-            5 => InputAxis::Ytilt,
-            6 => InputAxis::Wheel,
-            7 => InputAxis::Distance,
-            8 => InputAxis::Last,
-            value => InputAxis::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for InputAxis {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_input_axis_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for InputAxis {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for InputAxis {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for InputAxis {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The types of input devices available.
-///
-/// The `InputDeviceType` enumeration can be extended at later
-/// date; not every platform supports every input device type.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum InputDeviceType {
-    /// A pointer device
-    PointerDevice,
-    /// A keyboard device
-    KeyboardDevice,
-    /// A generic extension device
-    ExtensionDevice,
-    /// A joystick device
-    JoystickDevice,
-    /// A tablet device
-    TabletDevice,
-    /// A touchpad device
-    TouchpadDevice,
-    /// A touch screen device
-    TouchscreenDevice,
-    /// A pen device
-    PenDevice,
-    /// An eraser device
-    EraserDevice,
-    /// A cursor device
-    CursorDevice,
-    /// The number of device types
-    NDeviceTypes,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for InputDeviceType {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "InputDeviceType::{}",
-            match *self {
-                InputDeviceType::PointerDevice => "PointerDevice",
-                InputDeviceType::KeyboardDevice => "KeyboardDevice",
-                InputDeviceType::ExtensionDevice => "ExtensionDevice",
-                InputDeviceType::JoystickDevice => "JoystickDevice",
-                InputDeviceType::TabletDevice => "TabletDevice",
-                InputDeviceType::TouchpadDevice => "TouchpadDevice",
-                InputDeviceType::TouchscreenDevice => "TouchscreenDevice",
-                InputDeviceType::PenDevice => "PenDevice",
-                InputDeviceType::EraserDevice => "EraserDevice",
-                InputDeviceType::CursorDevice => "CursorDevice",
-                InputDeviceType::NDeviceTypes => "NDeviceTypes",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for InputDeviceType {
-    type GlibType = ffi::ClutterInputDeviceType;
-
-    fn to_glib(&self) -> ffi::ClutterInputDeviceType {
-        match *self {
-            InputDeviceType::PointerDevice => ffi::CLUTTER_POINTER_DEVICE,
-            InputDeviceType::KeyboardDevice => ffi::CLUTTER_KEYBOARD_DEVICE,
-            InputDeviceType::ExtensionDevice => ffi::CLUTTER_EXTENSION_DEVICE,
-            InputDeviceType::JoystickDevice => ffi::CLUTTER_JOYSTICK_DEVICE,
-            InputDeviceType::TabletDevice => ffi::CLUTTER_TABLET_DEVICE,
-            InputDeviceType::TouchpadDevice => ffi::CLUTTER_TOUCHPAD_DEVICE,
-            InputDeviceType::TouchscreenDevice => ffi::CLUTTER_TOUCHSCREEN_DEVICE,
-            InputDeviceType::PenDevice => ffi::CLUTTER_PEN_DEVICE,
-            InputDeviceType::EraserDevice => ffi::CLUTTER_ERASER_DEVICE,
-            InputDeviceType::CursorDevice => ffi::CLUTTER_CURSOR_DEVICE,
-            InputDeviceType::NDeviceTypes => ffi::CLUTTER_N_DEVICE_TYPES,
-            InputDeviceType::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterInputDeviceType> for InputDeviceType {
-    fn from_glib(value: ffi::ClutterInputDeviceType) -> Self {
-        match value {
-            0 => InputDeviceType::PointerDevice,
-            1 => InputDeviceType::KeyboardDevice,
-            2 => InputDeviceType::ExtensionDevice,
-            3 => InputDeviceType::JoystickDevice,
-            4 => InputDeviceType::TabletDevice,
-            5 => InputDeviceType::TouchpadDevice,
-            6 => InputDeviceType::TouchscreenDevice,
-            7 => InputDeviceType::PenDevice,
-            8 => InputDeviceType::EraserDevice,
-            9 => InputDeviceType::CursorDevice,
-            10 => InputDeviceType::NDeviceTypes,
-            value => InputDeviceType::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for InputDeviceType {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_input_device_type_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for InputDeviceType {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for InputDeviceType {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for InputDeviceType {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The mode for input devices available.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum InputMode {
-    /// A master, virtual device
-    Master,
-    /// A slave, physical device, attached to
-    ///  a master device
-    Slave,
-    /// A slave, physical device, not attached
-    ///  to a master device
-    Floating,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for InputMode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "InputMode::{}",
-            match *self {
-                InputMode::Master => "Master",
-                InputMode::Slave => "Slave",
-                InputMode::Floating => "Floating",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for InputMode {
-    type GlibType = ffi::ClutterInputMode;
-
-    fn to_glib(&self) -> ffi::ClutterInputMode {
-        match *self {
-            InputMode::Master => ffi::CLUTTER_INPUT_MODE_MASTER,
-            InputMode::Slave => ffi::CLUTTER_INPUT_MODE_SLAVE,
-            InputMode::Floating => ffi::CLUTTER_INPUT_MODE_FLOATING,
-            InputMode::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterInputMode> for InputMode {
-    fn from_glib(value: ffi::ClutterInputMode) -> Self {
-        match value {
-            0 => InputMode::Master,
-            1 => InputMode::Slave,
-            2 => InputMode::Floating,
-            value => InputMode::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for InputMode {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_input_mode_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for InputMode {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for InputMode {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for InputMode {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The states for the `ClickAction::long-press` signal.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum LongPressState {
-    /// Queries the action whether it supports
-    ///  long presses
-    Query,
-    /// Activates the action on a long press
-    Activate,
-    /// The long press was cancelled
-    Cancel,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for LongPressState {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "LongPressState::{}",
-            match *self {
-                LongPressState::Query => "Query",
-                LongPressState::Activate => "Activate",
-                LongPressState::Cancel => "Cancel",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for LongPressState {
-    type GlibType = ffi::ClutterLongPressState;
-
-    fn to_glib(&self) -> ffi::ClutterLongPressState {
-        match *self {
-            LongPressState::Query => ffi::CLUTTER_LONG_PRESS_QUERY,
-            LongPressState::Activate => ffi::CLUTTER_LONG_PRESS_ACTIVATE,
-            LongPressState::Cancel => ffi::CLUTTER_LONG_PRESS_CANCEL,
-            LongPressState::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterLongPressState> for LongPressState {
-    fn from_glib(value: ffi::ClutterLongPressState) -> Self {
-        match value {
-            0 => LongPressState::Query,
-            1 => LongPressState::Activate,
-            2 => LongPressState::Cancel,
-            value => LongPressState::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for LongPressState {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_long_press_state_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for LongPressState {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for LongPressState {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for LongPressState {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Represents the orientation of actors or layout managers.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum Orientation {
-    /// An horizontal orientation
-    Horizontal,
-    /// A vertical orientation
-    Vertical,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for Orientation {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "Orientation::{}",
-            match *self {
-                Orientation::Horizontal => "Horizontal",
-                Orientation::Vertical => "Vertical",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for Orientation {
-    type GlibType = ffi::ClutterOrientation;
-
-    fn to_glib(&self) -> ffi::ClutterOrientation {
-        match *self {
-            Orientation::Horizontal => ffi::CLUTTER_ORIENTATION_HORIZONTAL,
-            Orientation::Vertical => ffi::CLUTTER_ORIENTATION_VERTICAL,
-            Orientation::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterOrientation> for Orientation {
-    fn from_glib(value: ffi::ClutterOrientation) -> Self {
-        match value {
-            0 => Orientation::Horizontal,
-            1 => Orientation::Vertical,
-            value => Orientation::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for Orientation {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_orientation_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for Orientation {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for Orientation {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for Orientation {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The axis of the constraint that should be applied on the
-/// panning action
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum PanAxis {
-    /// No constraint
-    AxisNone,
-    /// Set a constraint on the X axis
-    XAxis,
-    /// Set a constraint on the Y axis
-    YAxis,
-    /// Constrain panning automatically based on initial
-    ///  movement (available since 1.24)
-    AxisAuto,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for PanAxis {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "PanAxis::{}",
-            match *self {
-                PanAxis::AxisNone => "AxisNone",
-                PanAxis::XAxis => "XAxis",
-                PanAxis::YAxis => "YAxis",
-                PanAxis::AxisAuto => "AxisAuto",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for PanAxis {
-    type GlibType = ffi::ClutterPanAxis;
-
-    fn to_glib(&self) -> ffi::ClutterPanAxis {
-        match *self {
-            PanAxis::AxisNone => ffi::CLUTTER_PAN_AXIS_NONE,
-            PanAxis::XAxis => ffi::CLUTTER_PAN_X_AXIS,
-            PanAxis::YAxis => ffi::CLUTTER_PAN_Y_AXIS,
-            PanAxis::AxisAuto => ffi::CLUTTER_PAN_AXIS_AUTO,
-            PanAxis::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterPanAxis> for PanAxis {
-    fn from_glib(value: ffi::ClutterPanAxis) -> Self {
-        match value {
-            0 => PanAxis::AxisNone,
-            1 => PanAxis::XAxis,
-            2 => PanAxis::YAxis,
-            3 => PanAxis::AxisAuto,
-            value => PanAxis::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for PanAxis {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_pan_axis_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for PanAxis {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for PanAxis {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for PanAxis {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Types of nodes in a `Path`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum PathNodeType {
-    /// jump to the given position
-    MoveTo,
-    /// create a line from the last node to the
-    ///  given position
-    LineTo,
-    /// bezier curve using the last position and
-    ///  three control points.
-    CurveTo,
-    /// create a line from the last node to the last
-    ///  `PathNodeType::MoveTo` node.
-    Close,
-    /// same as `PathNodeType::MoveTo` but with
-    ///  coordinates relative to the last node.
-    RelMoveTo,
-    /// same as `PathNodeType::LineTo` but with
-    ///  coordinates relative to the last node.
-    RelLineTo,
-    /// same as `PathNodeType::CurveTo` but with
-    ///  coordinates relative to the last node.
-    RelCurveTo,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for PathNodeType {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "PathNodeType::{}",
-            match *self {
-                PathNodeType::MoveTo => "MoveTo",
-                PathNodeType::LineTo => "LineTo",
-                PathNodeType::CurveTo => "CurveTo",
-                PathNodeType::Close => "Close",
-                PathNodeType::RelMoveTo => "RelMoveTo",
-                PathNodeType::RelLineTo => "RelLineTo",
-                PathNodeType::RelCurveTo => "RelCurveTo",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for PathNodeType {
-    type GlibType = ffi::ClutterPathNodeType;
-
-    fn to_glib(&self) -> ffi::ClutterPathNodeType {
-        match *self {
-            PathNodeType::MoveTo => ffi::CLUTTER_PATH_MOVE_TO,
-            PathNodeType::LineTo => ffi::CLUTTER_PATH_LINE_TO,
-            PathNodeType::CurveTo => ffi::CLUTTER_PATH_CURVE_TO,
-            PathNodeType::Close => ffi::CLUTTER_PATH_CLOSE,
-            PathNodeType::RelMoveTo => ffi::CLUTTER_PATH_REL_MOVE_TO,
-            PathNodeType::RelLineTo => ffi::CLUTTER_PATH_REL_LINE_TO,
-            PathNodeType::RelCurveTo => ffi::CLUTTER_PATH_REL_CURVE_TO,
-            PathNodeType::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterPathNodeType> for PathNodeType {
-    fn from_glib(value: ffi::ClutterPathNodeType) -> Self {
-        match value {
-            0 => PathNodeType::MoveTo,
-            1 => PathNodeType::LineTo,
-            2 => PathNodeType::CurveTo,
-            3 => PathNodeType::Close,
-            32 => PathNodeType::RelMoveTo,
-            33 => PathNodeType::RelLineTo,
-            34 => PathNodeType::RelCurveTo,
-            value => PathNodeType::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for PathNodeType {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_path_node_type_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for PathNodeType {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for PathNodeType {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for PathNodeType {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Controls the paint cycle of the scene graph when in pick mode
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum PickMode {
-    /// Do not paint any actor
-    None,
-    /// Paint only the reactive actors
-    Reactive,
-    /// Paint all actors
-    All,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for PickMode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "PickMode::{}",
-            match *self {
-                PickMode::None => "None",
-                PickMode::Reactive => "Reactive",
-                PickMode::All => "All",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for PickMode {
-    type GlibType = ffi::ClutterPickMode;
-
-    fn to_glib(&self) -> ffi::ClutterPickMode {
-        match *self {
-            PickMode::None => ffi::CLUTTER_PICK_NONE,
-            PickMode::Reactive => ffi::CLUTTER_PICK_REACTIVE,
-            PickMode::All => ffi::CLUTTER_PICK_ALL,
-            PickMode::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterPickMode> for PickMode {
-    fn from_glib(value: ffi::ClutterPickMode) -> Self {
-        match value {
-            0 => PickMode::None,
-            1 => PickMode::Reactive,
-            2 => PickMode::All,
-            value => PickMode::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for PickMode {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_pick_mode_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for PickMode {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for PickMode {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for PickMode {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Specifies the type of requests for a `Actor`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum RequestMode {
-    /// Height for width requests
-    HeightForWidth,
-    /// Width for height requests
-    WidthForHeight,
-    /// Use the preferred size of the
-    ///  `Content`, if it has any (available since 1.22)
-    ContentSize,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for RequestMode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "RequestMode::{}",
-            match *self {
-                RequestMode::HeightForWidth => "HeightForWidth",
-                RequestMode::WidthForHeight => "WidthForHeight",
-                RequestMode::ContentSize => "ContentSize",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for RequestMode {
-    type GlibType = ffi::ClutterRequestMode;
-
-    fn to_glib(&self) -> ffi::ClutterRequestMode {
-        match *self {
-            RequestMode::HeightForWidth => ffi::CLUTTER_REQUEST_HEIGHT_FOR_WIDTH,
-            RequestMode::WidthForHeight => ffi::CLUTTER_REQUEST_WIDTH_FOR_HEIGHT,
-            RequestMode::ContentSize => ffi::CLUTTER_REQUEST_CONTENT_SIZE,
-            RequestMode::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterRequestMode> for RequestMode {
-    fn from_glib(value: ffi::ClutterRequestMode) -> Self {
-        match value {
-            0 => RequestMode::HeightForWidth,
-            1 => RequestMode::WidthForHeight,
-            2 => RequestMode::ContentSize,
-            value => RequestMode::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for RequestMode {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_request_mode_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for RequestMode {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for RequestMode {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for RequestMode {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Axis of a rotation.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum RotateAxis {
-    /// Rotate around the X axis
-    XAxis,
-    /// Rotate around the Y axis
-    YAxis,
-    /// Rotate around the Z axis
-    ZAxis,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for RotateAxis {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "RotateAxis::{}",
-            match *self {
-                RotateAxis::XAxis => "XAxis",
-                RotateAxis::YAxis => "YAxis",
-                RotateAxis::ZAxis => "ZAxis",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for RotateAxis {
-    type GlibType = ffi::ClutterRotateAxis;
-
-    fn to_glib(&self) -> ffi::ClutterRotateAxis {
-        match *self {
-            RotateAxis::XAxis => ffi::CLUTTER_X_AXIS,
-            RotateAxis::YAxis => ffi::CLUTTER_Y_AXIS,
-            RotateAxis::ZAxis => ffi::CLUTTER_Z_AXIS,
-            RotateAxis::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterRotateAxis> for RotateAxis {
-    fn from_glib(value: ffi::ClutterRotateAxis) -> Self {
-        match value {
-            0 => RotateAxis::XAxis,
-            1 => RotateAxis::YAxis,
-            2 => RotateAxis::ZAxis,
-            value => RotateAxis::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for RotateAxis {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_rotate_axis_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for RotateAxis {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for RotateAxis {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for RotateAxis {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum RotateDirection {
-    Cw,
-    Ccw,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for RotateDirection {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "RotateDirection::{}",
-            match *self {
-                RotateDirection::Cw => "Cw",
-                RotateDirection::Ccw => "Ccw",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for RotateDirection {
-    type GlibType = ffi::ClutterRotateDirection;
-
-    fn to_glib(&self) -> ffi::ClutterRotateDirection {
-        match *self {
-            RotateDirection::Cw => ffi::CLUTTER_ROTATE_CW,
-            RotateDirection::Ccw => ffi::CLUTTER_ROTATE_CCW,
-            RotateDirection::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterRotateDirection> for RotateDirection {
-    fn from_glib(value: ffi::ClutterRotateDirection) -> Self {
-        match value {
-            0 => RotateDirection::Cw,
-            1 => RotateDirection::Ccw,
-            value => RotateDirection::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for RotateDirection {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_rotate_direction_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for RotateDirection {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for RotateDirection {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for RotateDirection {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The scaling filters to be used with the `Actor:minification-filter`
-/// and `Actor:magnification-filter` properties.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ScalingFilter {
-    /// Linear interpolation filter
-    Linear,
-    /// Nearest neighbor interpolation filter
-    Nearest,
-    /// Trilinear minification filter, with
-    ///  mipmap generation; this filter linearly interpolates on every axis,
-    ///  as well as between mipmap levels.
-    Trilinear,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ScalingFilter {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ScalingFilter::{}",
-            match *self {
-                ScalingFilter::Linear => "Linear",
-                ScalingFilter::Nearest => "Nearest",
-                ScalingFilter::Trilinear => "Trilinear",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ScalingFilter {
-    type GlibType = ffi::ClutterScalingFilter;
-
-    fn to_glib(&self) -> ffi::ClutterScalingFilter {
-        match *self {
-            ScalingFilter::Linear => ffi::CLUTTER_SCALING_FILTER_LINEAR,
-            ScalingFilter::Nearest => ffi::CLUTTER_SCALING_FILTER_NEAREST,
-            ScalingFilter::Trilinear => ffi::CLUTTER_SCALING_FILTER_TRILINEAR,
-            ScalingFilter::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterScalingFilter> for ScalingFilter {
-    fn from_glib(value: ffi::ClutterScalingFilter) -> Self {
-        match value {
-            0 => ScalingFilter::Linear,
-            1 => ScalingFilter::Nearest,
-            2 => ScalingFilter::Trilinear,
-            value => ScalingFilter::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for ScalingFilter {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_scaling_filter_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ScalingFilter {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ScalingFilter {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ScalingFilter {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// `Script` error enumeration.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ScriptError {
-    /// Type function not found
-    ///  or invalid
-    TypeFunction,
-    /// Property not found or invalid
-    Property,
-    /// Invalid value
-    Value,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ScriptError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ScriptError::{}",
-            match *self {
-                ScriptError::TypeFunction => "TypeFunction",
-                ScriptError::Property => "Property",
-                ScriptError::Value => "Value",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ScriptError {
-    type GlibType = ffi::ClutterScriptError;
-
-    fn to_glib(&self) -> ffi::ClutterScriptError {
-        match *self {
-            ScriptError::TypeFunction => ffi::CLUTTER_SCRIPT_ERROR_INVALID_TYPE_FUNCTION,
-            ScriptError::Property => ffi::CLUTTER_SCRIPT_ERROR_INVALID_PROPERTY,
-            ScriptError::Value => ffi::CLUTTER_SCRIPT_ERROR_INVALID_VALUE,
-            ScriptError::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterScriptError> for ScriptError {
-    fn from_glib(value: ffi::ClutterScriptError) -> Self {
-        match value {
-            0 => ScriptError::TypeFunction,
-            1 => ScriptError::Property,
-            2 => ScriptError::Value,
-            value => ScriptError::__Unknown(value),
-        }
-    }
-}
-
-impl ErrorDomain for ScriptError {
-    fn domain() -> Quark {
-        unsafe { from_glib(ffi::clutter_script_error_quark()) }
-    }
-
-    fn code(self) -> i32 {
-        self.to_glib()
-    }
-
-    fn from(code: i32) -> Option<Self> {
-        match code {
-            0 => Some(ScriptError::TypeFunction),
-            1 => Some(ScriptError::Property),
-            2 => Some(ScriptError::Value),
-            value => Some(ScriptError::__Unknown(value)),
-        }
-    }
-}
-
-impl StaticType for ScriptError {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_script_error_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ScriptError {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ScriptError {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ScriptError {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Direction of a pointer scroll event.
-///
-/// The `ScrollDirection::Smooth` value implies that the `ScrollEvent`
-/// has precise scrolling delta information.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ScrollDirection {
-    /// Scroll up
-    Up,
-    /// Scroll down
-    Down,
-    /// Scroll left
-    Left,
-    /// Scroll right
-    Right,
-    /// Precise scrolling delta (available in 1.10)
-    Smooth,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ScrollDirection {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ScrollDirection::{}",
-            match *self {
-                ScrollDirection::Up => "Up",
-                ScrollDirection::Down => "Down",
-                ScrollDirection::Left => "Left",
-                ScrollDirection::Right => "Right",
-                ScrollDirection::Smooth => "Smooth",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ScrollDirection {
-    type GlibType = ffi::ClutterScrollDirection;
-
-    fn to_glib(&self) -> ffi::ClutterScrollDirection {
-        match *self {
-            ScrollDirection::Up => ffi::CLUTTER_SCROLL_UP,
-            ScrollDirection::Down => ffi::CLUTTER_SCROLL_DOWN,
-            ScrollDirection::Left => ffi::CLUTTER_SCROLL_LEFT,
-            ScrollDirection::Right => ffi::CLUTTER_SCROLL_RIGHT,
-            ScrollDirection::Smooth => ffi::CLUTTER_SCROLL_SMOOTH,
-            ScrollDirection::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterScrollDirection> for ScrollDirection {
-    fn from_glib(value: ffi::ClutterScrollDirection) -> Self {
-        match value {
-            0 => ScrollDirection::Up,
-            1 => ScrollDirection::Down,
-            2 => ScrollDirection::Left,
-            3 => ScrollDirection::Right,
-            4 => ScrollDirection::Smooth,
-            value => ScrollDirection::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for ScrollDirection {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_scroll_direction_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ScrollDirection {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ScrollDirection {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ScrollDirection {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The scroll source determines the source of the scroll event. Keep in mind
-/// that the source device `InputDeviceType` is not enough to infer
-/// the scroll source.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ScrollSource {
-    /// Source of scroll events is unknown.
-    Unknown,
-    /// The scroll event is originated by a mouse wheel.
-    Wheel,
-    /// The scroll event is originated by one or more
-    ///  fingers on the device (eg. touchpads).
-    Finger,
-    /// The scroll event is originated by the
-    ///  motion of some device (eg. a scroll button is set).
-    Continuous,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ScrollSource {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ScrollSource::{}",
-            match *self {
-                ScrollSource::Unknown => "Unknown",
-                ScrollSource::Wheel => "Wheel",
-                ScrollSource::Finger => "Finger",
-                ScrollSource::Continuous => "Continuous",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ScrollSource {
-    type GlibType = ffi::ClutterScrollSource;
-
-    fn to_glib(&self) -> ffi::ClutterScrollSource {
-        match *self {
-            ScrollSource::Unknown => ffi::CLUTTER_SCROLL_SOURCE_UNKNOWN,
-            ScrollSource::Wheel => ffi::CLUTTER_SCROLL_SOURCE_WHEEL,
-            ScrollSource::Finger => ffi::CLUTTER_SCROLL_SOURCE_FINGER,
-            ScrollSource::Continuous => ffi::CLUTTER_SCROLL_SOURCE_CONTINUOUS,
-            ScrollSource::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterScrollSource> for ScrollSource {
-    fn from_glib(value: ffi::ClutterScrollSource) -> Self {
-        match value {
-            0 => ScrollSource::Unknown,
-            1 => ScrollSource::Wheel,
-            2 => ScrollSource::Finger,
-            3 => ScrollSource::Continuous,
-            value => ScrollSource::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for ScrollSource {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_scroll_source_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ScrollSource {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ScrollSource {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ScrollSource {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The type of GLSL shader program
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ShaderType {
-    /// a vertex shader
-    VertexShader,
-    /// a fragment shader
-    FragmentShader,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ShaderType {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ShaderType::{}",
-            match *self {
-                ShaderType::VertexShader => "VertexShader",
-                ShaderType::FragmentShader => "FragmentShader",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ShaderType {
-    type GlibType = ffi::ClutterShaderType;
-
-    fn to_glib(&self) -> ffi::ClutterShaderType {
-        match *self {
-            ShaderType::VertexShader => ffi::CLUTTER_VERTEX_SHADER,
-            ShaderType::FragmentShader => ffi::CLUTTER_FRAGMENT_SHADER,
-            ShaderType::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterShaderType> for ShaderType {
-    fn from_glib(value: ffi::ClutterShaderType) -> Self {
-        match value {
-            0 => ShaderType::VertexShader,
-            1 => ShaderType::FragmentShader,
-            value => ShaderType::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for ShaderType {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_shader_type_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ShaderType {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ShaderType {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ShaderType {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The edge to snap
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum SnapEdge {
-    /// the top edge
-    Top,
-    /// the right edge
-    Right,
-    /// the bottom edge
-    Bottom,
-    /// the left edge
-    Left,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for SnapEdge {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "SnapEdge::{}",
-            match *self {
-                SnapEdge::Top => "Top",
-                SnapEdge::Right => "Right",
-                SnapEdge::Bottom => "Bottom",
-                SnapEdge::Left => "Left",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for SnapEdge {
-    type GlibType = ffi::ClutterSnapEdge;
-
-    fn to_glib(&self) -> ffi::ClutterSnapEdge {
-        match *self {
-            SnapEdge::Top => ffi::CLUTTER_SNAP_EDGE_TOP,
-            SnapEdge::Right => ffi::CLUTTER_SNAP_EDGE_RIGHT,
-            SnapEdge::Bottom => ffi::CLUTTER_SNAP_EDGE_BOTTOM,
-            SnapEdge::Left => ffi::CLUTTER_SNAP_EDGE_LEFT,
-            SnapEdge::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterSnapEdge> for SnapEdge {
-    fn from_glib(value: ffi::ClutterSnapEdge) -> Self {
-        match value {
-            0 => SnapEdge::Top,
-            1 => SnapEdge::Right,
-            2 => SnapEdge::Bottom,
-            3 => SnapEdge::Left,
-            value => SnapEdge::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for SnapEdge {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_snap_edge_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for SnapEdge {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for SnapEdge {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for SnapEdge {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Named colors, for accessing global colors defined by Clutter
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum StaticColor {
-    /// White color (ffffffff)
-    White,
-    /// Black color (000000ff)
-    Black,
-    /// Red color (ff0000ff)
-    Red,
-    /// Dark red color (800000ff)
-    DarkRed,
-    /// Green color (00ff00ff)
-    Green,
-    /// Dark green color (008000ff)
-    DarkGreen,
-    /// Blue color (0000ffff)
-    Blue,
-    /// Dark blue color (000080ff)
-    DarkBlue,
-    /// Cyan color (00ffffff)
-    Cyan,
-    /// Dark cyan color (008080ff)
-    DarkCyan,
-    /// Magenta color (ff00ffff)
-    Magenta,
-    /// Dark magenta color (800080ff)
-    DarkMagenta,
-    /// Yellow color (ffff00ff)
-    Yellow,
-    /// Dark yellow color (808000ff)
-    DarkYellow,
-    /// Gray color (a0a0a4ff)
-    Gray,
-    /// Dark Gray color (808080ff)
-    DarkGray,
-    /// Light gray color (c0c0c0ff)
-    LightGray,
-    /// Butter color (edd400ff)
-    Butter,
-    /// Light butter color (fce94fff)
-    ButterLight,
-    /// Dark butter color (c4a000ff)
-    ButterDark,
-    /// Orange color (f57900ff)
-    Orange,
-    /// Light orange color (fcaf3fff)
-    OrangeLight,
-    /// Dark orange color (ce5c00ff)
-    OrangeDark,
-    /// Chocolate color (c17d11ff)
-    Chocolate,
-    /// Light chocolate color (e9b96eff)
-    ChocolateLight,
-    /// Dark chocolate color (8f5902ff)
-    ChocolateDark,
-    /// Chameleon color (73d216ff)
-    Chameleon,
-    /// Light chameleon color (8ae234ff)
-    ChameleonLight,
-    /// Dark chameleon color (4e9a06ff)
-    ChameleonDark,
-    /// Sky color (3465a4ff)
-    SkyBlue,
-    /// Light sky color (729fcfff)
-    SkyBlueLight,
-    /// Dark sky color (204a87ff)
-    SkyBlueDark,
-    /// Plum color (75507bff)
-    Plum,
-    /// Light plum color (ad7fa8ff)
-    PlumLight,
-    /// Dark plum color (5c3566ff)
-    PlumDark,
-    /// Scarlet red color (cc0000ff)
-    ScarletRed,
-    /// Light scarlet red color (ef2929ff)
-    ScarletRedLight,
-    /// Dark scarlet red color (a40000ff)
-    ScarletRedDark,
-    /// Aluminium, first variant (eeeeecff)
-    Aluminium1,
-    /// Aluminium, second variant (d3d7cfff)
-    Aluminium2,
-    /// Aluminium, third variant (babdb6ff)
-    Aluminium3,
-    /// Aluminium, fourth variant (888a85ff)
-    Aluminium4,
-    /// Aluminium, fifth variant (555753ff)
-    Aluminium5,
-    /// Aluminium, sixth variant (2e3436ff)
-    Aluminium6,
-    /// Transparent color (00000000)
-    Transparent,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for StaticColor {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "StaticColor::{}",
-            match *self {
-                StaticColor::White => "White",
-                StaticColor::Black => "Black",
-                StaticColor::Red => "Red",
-                StaticColor::DarkRed => "DarkRed",
-                StaticColor::Green => "Green",
-                StaticColor::DarkGreen => "DarkGreen",
-                StaticColor::Blue => "Blue",
-                StaticColor::DarkBlue => "DarkBlue",
-                StaticColor::Cyan => "Cyan",
-                StaticColor::DarkCyan => "DarkCyan",
-                StaticColor::Magenta => "Magenta",
-                StaticColor::DarkMagenta => "DarkMagenta",
-                StaticColor::Yellow => "Yellow",
-                StaticColor::DarkYellow => "DarkYellow",
-                StaticColor::Gray => "Gray",
-                StaticColor::DarkGray => "DarkGray",
-                StaticColor::LightGray => "LightGray",
-                StaticColor::Butter => "Butter",
-                StaticColor::ButterLight => "ButterLight",
-                StaticColor::ButterDark => "ButterDark",
-                StaticColor::Orange => "Orange",
-                StaticColor::OrangeLight => "OrangeLight",
-                StaticColor::OrangeDark => "OrangeDark",
-                StaticColor::Chocolate => "Chocolate",
-                StaticColor::ChocolateLight => "ChocolateLight",
-                StaticColor::ChocolateDark => "ChocolateDark",
-                StaticColor::Chameleon => "Chameleon",
-                StaticColor::ChameleonLight => "ChameleonLight",
-                StaticColor::ChameleonDark => "ChameleonDark",
-                StaticColor::SkyBlue => "SkyBlue",
-                StaticColor::SkyBlueLight => "SkyBlueLight",
-                StaticColor::SkyBlueDark => "SkyBlueDark",
-                StaticColor::Plum => "Plum",
-                StaticColor::PlumLight => "PlumLight",
-                StaticColor::PlumDark => "PlumDark",
-                StaticColor::ScarletRed => "ScarletRed",
-                StaticColor::ScarletRedLight => "ScarletRedLight",
-                StaticColor::ScarletRedDark => "ScarletRedDark",
-                StaticColor::Aluminium1 => "Aluminium1",
-                StaticColor::Aluminium2 => "Aluminium2",
-                StaticColor::Aluminium3 => "Aluminium3",
-                StaticColor::Aluminium4 => "Aluminium4",
-                StaticColor::Aluminium5 => "Aluminium5",
-                StaticColor::Aluminium6 => "Aluminium6",
-                StaticColor::Transparent => "Transparent",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for StaticColor {
-    type GlibType = ffi::ClutterStaticColor;
-
-    fn to_glib(&self) -> ffi::ClutterStaticColor {
-        match *self {
-            StaticColor::White => ffi::CLUTTER_COLOR_WHITE,
-            StaticColor::Black => ffi::CLUTTER_COLOR_BLACK,
-            StaticColor::Red => ffi::CLUTTER_COLOR_RED,
-            StaticColor::DarkRed => ffi::CLUTTER_COLOR_DARK_RED,
-            StaticColor::Green => ffi::CLUTTER_COLOR_GREEN,
-            StaticColor::DarkGreen => ffi::CLUTTER_COLOR_DARK_GREEN,
-            StaticColor::Blue => ffi::CLUTTER_COLOR_BLUE,
-            StaticColor::DarkBlue => ffi::CLUTTER_COLOR_DARK_BLUE,
-            StaticColor::Cyan => ffi::CLUTTER_COLOR_CYAN,
-            StaticColor::DarkCyan => ffi::CLUTTER_COLOR_DARK_CYAN,
-            StaticColor::Magenta => ffi::CLUTTER_COLOR_MAGENTA,
-            StaticColor::DarkMagenta => ffi::CLUTTER_COLOR_DARK_MAGENTA,
-            StaticColor::Yellow => ffi::CLUTTER_COLOR_YELLOW,
-            StaticColor::DarkYellow => ffi::CLUTTER_COLOR_DARK_YELLOW,
-            StaticColor::Gray => ffi::CLUTTER_COLOR_GRAY,
-            StaticColor::DarkGray => ffi::CLUTTER_COLOR_DARK_GRAY,
-            StaticColor::LightGray => ffi::CLUTTER_COLOR_LIGHT_GRAY,
-            StaticColor::Butter => ffi::CLUTTER_COLOR_BUTTER,
-            StaticColor::ButterLight => ffi::CLUTTER_COLOR_BUTTER_LIGHT,
-            StaticColor::ButterDark => ffi::CLUTTER_COLOR_BUTTER_DARK,
-            StaticColor::Orange => ffi::CLUTTER_COLOR_ORANGE,
-            StaticColor::OrangeLight => ffi::CLUTTER_COLOR_ORANGE_LIGHT,
-            StaticColor::OrangeDark => ffi::CLUTTER_COLOR_ORANGE_DARK,
-            StaticColor::Chocolate => ffi::CLUTTER_COLOR_CHOCOLATE,
-            StaticColor::ChocolateLight => ffi::CLUTTER_COLOR_CHOCOLATE_LIGHT,
-            StaticColor::ChocolateDark => ffi::CLUTTER_COLOR_CHOCOLATE_DARK,
-            StaticColor::Chameleon => ffi::CLUTTER_COLOR_CHAMELEON,
-            StaticColor::ChameleonLight => ffi::CLUTTER_COLOR_CHAMELEON_LIGHT,
-            StaticColor::ChameleonDark => ffi::CLUTTER_COLOR_CHAMELEON_DARK,
-            StaticColor::SkyBlue => ffi::CLUTTER_COLOR_SKY_BLUE,
-            StaticColor::SkyBlueLight => ffi::CLUTTER_COLOR_SKY_BLUE_LIGHT,
-            StaticColor::SkyBlueDark => ffi::CLUTTER_COLOR_SKY_BLUE_DARK,
-            StaticColor::Plum => ffi::CLUTTER_COLOR_PLUM,
-            StaticColor::PlumLight => ffi::CLUTTER_COLOR_PLUM_LIGHT,
-            StaticColor::PlumDark => ffi::CLUTTER_COLOR_PLUM_DARK,
-            StaticColor::ScarletRed => ffi::CLUTTER_COLOR_SCARLET_RED,
-            StaticColor::ScarletRedLight => ffi::CLUTTER_COLOR_SCARLET_RED_LIGHT,
-            StaticColor::ScarletRedDark => ffi::CLUTTER_COLOR_SCARLET_RED_DARK,
-            StaticColor::Aluminium1 => ffi::CLUTTER_COLOR_ALUMINIUM_1,
-            StaticColor::Aluminium2 => ffi::CLUTTER_COLOR_ALUMINIUM_2,
-            StaticColor::Aluminium3 => ffi::CLUTTER_COLOR_ALUMINIUM_3,
-            StaticColor::Aluminium4 => ffi::CLUTTER_COLOR_ALUMINIUM_4,
-            StaticColor::Aluminium5 => ffi::CLUTTER_COLOR_ALUMINIUM_5,
-            StaticColor::Aluminium6 => ffi::CLUTTER_COLOR_ALUMINIUM_6,
-            StaticColor::Transparent => ffi::CLUTTER_COLOR_TRANSPARENT,
-            StaticColor::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterStaticColor> for StaticColor {
-    fn from_glib(value: ffi::ClutterStaticColor) -> Self {
-        match value {
-            0 => StaticColor::White,
-            1 => StaticColor::Black,
-            2 => StaticColor::Red,
-            3 => StaticColor::DarkRed,
-            4 => StaticColor::Green,
-            5 => StaticColor::DarkGreen,
-            6 => StaticColor::Blue,
-            7 => StaticColor::DarkBlue,
-            8 => StaticColor::Cyan,
-            9 => StaticColor::DarkCyan,
-            10 => StaticColor::Magenta,
-            11 => StaticColor::DarkMagenta,
-            12 => StaticColor::Yellow,
-            13 => StaticColor::DarkYellow,
-            14 => StaticColor::Gray,
-            15 => StaticColor::DarkGray,
-            16 => StaticColor::LightGray,
-            17 => StaticColor::Butter,
-            18 => StaticColor::ButterLight,
-            19 => StaticColor::ButterDark,
-            20 => StaticColor::Orange,
-            21 => StaticColor::OrangeLight,
-            22 => StaticColor::OrangeDark,
-            23 => StaticColor::Chocolate,
-            24 => StaticColor::ChocolateLight,
-            25 => StaticColor::ChocolateDark,
-            26 => StaticColor::Chameleon,
-            27 => StaticColor::ChameleonLight,
-            28 => StaticColor::ChameleonDark,
-            29 => StaticColor::SkyBlue,
-            30 => StaticColor::SkyBlueLight,
-            31 => StaticColor::SkyBlueDark,
-            32 => StaticColor::Plum,
-            33 => StaticColor::PlumLight,
-            34 => StaticColor::PlumDark,
-            35 => StaticColor::ScarletRed,
-            36 => StaticColor::ScarletRedLight,
-            37 => StaticColor::ScarletRedDark,
-            38 => StaticColor::Aluminium1,
-            39 => StaticColor::Aluminium2,
-            40 => StaticColor::Aluminium3,
-            41 => StaticColor::Aluminium4,
-            42 => StaticColor::Aluminium5,
-            43 => StaticColor::Aluminium6,
-            44 => StaticColor::Transparent,
-            value => StaticColor::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for StaticColor {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_static_color_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for StaticColor {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for StaticColor {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for StaticColor {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Change the value transition of a step function.
-///
-/// See `TimelineExt::set_step_progress`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum StepMode {
-    /// The change in the value of a
-    ///  `CLUTTER_STEP` progress mode should occur at the start of
-    ///  the transition
-    Start,
-    /// The change in the value of a
-    ///  `CLUTTER_STEP` progress mode should occur at the end of
-    ///  the transition
-    End,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for StepMode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "StepMode::{}",
-            match *self {
-                StepMode::Start => "Start",
-                StepMode::End => "End",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for StepMode {
-    type GlibType = ffi::ClutterStepMode;
-
-    fn to_glib(&self) -> ffi::ClutterStepMode {
-        match *self {
-            StepMode::Start => ffi::CLUTTER_STEP_MODE_START,
-            StepMode::End => ffi::CLUTTER_STEP_MODE_END,
-            StepMode::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterStepMode> for StepMode {
-    fn from_glib(value: ffi::ClutterStepMode) -> Self {
-        match value {
-            0 => StepMode::Start,
-            1 => StepMode::End,
-            value => StepMode::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for StepMode {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_step_mode_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for StepMode {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for StepMode {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for StepMode {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The text direction to be used by `Actor`<!-- -->s
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum TextDirection {
-    /// Use the default setting, as returned
-    ///  by `clutter_get_default_text_direction`
-    Default,
-    /// Use left-to-right text direction
-    Ltr,
-    /// Use right-to-left text direction
-    Rtl,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for TextDirection {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "TextDirection::{}",
-            match *self {
-                TextDirection::Default => "Default",
-                TextDirection::Ltr => "Ltr",
-                TextDirection::Rtl => "Rtl",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for TextDirection {
-    type GlibType = ffi::ClutterTextDirection;
-
-    fn to_glib(&self) -> ffi::ClutterTextDirection {
-        match *self {
-            TextDirection::Default => ffi::CLUTTER_TEXT_DIRECTION_DEFAULT,
-            TextDirection::Ltr => ffi::CLUTTER_TEXT_DIRECTION_LTR,
-            TextDirection::Rtl => ffi::CLUTTER_TEXT_DIRECTION_RTL,
-            TextDirection::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterTextDirection> for TextDirection {
-    fn from_glib(value: ffi::ClutterTextDirection) -> Self {
-        match value {
-            0 => TextDirection::Default,
-            1 => TextDirection::Ltr,
-            2 => TextDirection::Rtl,
-            value => TextDirection::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for TextDirection {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_text_direction_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for TextDirection {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for TextDirection {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for TextDirection {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// Error enumeration for `Texture`
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum TextureError {
-    /// OOM condition
-    OutOfMemory,
-    /// YUV operation attempted but no YUV support
-    ///  found
-    NoYuv,
-    /// The requested format for
-    /// clutter_texture_set_from_rgb_data or
-    /// clutter_texture_set_from_yuv_data is unsupported.
-    BadFormat,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for TextureError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "TextureError::{}",
-            match *self {
-                TextureError::OutOfMemory => "OutOfMemory",
-                TextureError::NoYuv => "NoYuv",
-                TextureError::BadFormat => "BadFormat",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for TextureError {
-    type GlibType = ffi::ClutterTextureError;
-
-    fn to_glib(&self) -> ffi::ClutterTextureError {
-        match *self {
-            TextureError::OutOfMemory => ffi::CLUTTER_TEXTURE_ERROR_OUT_OF_MEMORY,
-            TextureError::NoYuv => ffi::CLUTTER_TEXTURE_ERROR_NO_YUV,
-            TextureError::BadFormat => ffi::CLUTTER_TEXTURE_ERROR_BAD_FORMAT,
-            TextureError::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterTextureError> for TextureError {
-    fn from_glib(value: ffi::ClutterTextureError) -> Self {
-        match value {
-            0 => TextureError::OutOfMemory,
-            1 => TextureError::NoYuv,
-            2 => TextureError::BadFormat,
-            value => TextureError::__Unknown(value),
-        }
-    }
-}
-
-impl ErrorDomain for TextureError {
-    fn domain() -> Quark {
-        unsafe { from_glib(ffi::clutter_texture_error_quark()) }
-    }
-
-    fn code(self) -> i32 {
-        self.to_glib()
-    }
-
-    fn from(code: i32) -> Option<Self> {
-        match code {
-            0 => Some(TextureError::OutOfMemory),
-            1 => Some(TextureError::NoYuv),
-            2 => Some(TextureError::BadFormat),
-            value => Some(TextureError::__Unknown(value)),
-        }
-    }
-}
-
-impl StaticType for TextureError {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_texture_error_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for TextureError {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for TextureError {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for TextureError {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The direction of a `Timeline`
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum TimelineDirection {
-    /// forward direction for a timeline
-    Forward,
-    /// backward direction for a timeline
-    Backward,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for TimelineDirection {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "TimelineDirection::{}",
-            match *self {
-                TimelineDirection::Forward => "Forward",
-                TimelineDirection::Backward => "Backward",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for TimelineDirection {
-    type GlibType = ffi::ClutterTimelineDirection;
-
-    fn to_glib(&self) -> ffi::ClutterTimelineDirection {
-        match *self {
-            TimelineDirection::Forward => ffi::CLUTTER_TIMELINE_FORWARD,
-            TimelineDirection::Backward => ffi::CLUTTER_TIMELINE_BACKWARD,
-            TimelineDirection::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterTimelineDirection> for TimelineDirection {
-    fn from_glib(value: ffi::ClutterTimelineDirection) -> Self {
-        match value {
-            0 => TimelineDirection::Forward,
-            1 => TimelineDirection::Backward,
-            value => TimelineDirection::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for TimelineDirection {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_timeline_direction_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for TimelineDirection {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for TimelineDirection {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for TimelineDirection {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The phase of a touchpad gesture event. All gestures are guaranteed to
-/// begin with an event of type `TouchpadGesturePhase::Begin`,
-/// followed by a number of `TouchpadGesturePhase::Update` (possibly 0).
-///
-/// A finished gesture may have 2 possible outcomes, an event with phase
-/// `TouchpadGesturePhase::End` will be emitted when the gesture is
-/// considered successful, this should be used as the hint to perform any
-/// permanent changes.
-///
-/// Cancelled gestures may be so for a variety of reasons, due to hardware,
-/// or due to the gesture recognition layers hinting the gesture did not
-/// finish resolutely (eg. a 3rd finger being added during a pinch gesture).
-/// In these cases, the last event with report the phase
-/// `TouchpadGesturePhase::Cancel`, this should be used as a hint
-/// to undo any visible/permanent changes that were done throughout the
-/// progress of the gesture.
-///
-/// See also `TouchpadPinchEvent` and `TouchpadPinchEvent`.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum TouchpadGesturePhase {
-    /// The gesture has begun.
-    Begin,
-    /// The gesture has been updated.
-    Update,
-    /// The gesture was finished, changes
-    ///  should be permanently applied.
-    End,
-    /// The gesture was cancelled, all
-    ///  changes should be undone.
-    Cancel,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for TouchpadGesturePhase {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "TouchpadGesturePhase::{}",
-            match *self {
-                TouchpadGesturePhase::Begin => "Begin",
-                TouchpadGesturePhase::Update => "Update",
-                TouchpadGesturePhase::End => "End",
-                TouchpadGesturePhase::Cancel => "Cancel",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for TouchpadGesturePhase {
-    type GlibType = ffi::ClutterTouchpadGesturePhase;
-
-    fn to_glib(&self) -> ffi::ClutterTouchpadGesturePhase {
-        match *self {
-            TouchpadGesturePhase::Begin => ffi::CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN,
-            TouchpadGesturePhase::Update => ffi::CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
-            TouchpadGesturePhase::End => ffi::CLUTTER_TOUCHPAD_GESTURE_PHASE_END,
-            TouchpadGesturePhase::Cancel => ffi::CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL,
-            TouchpadGesturePhase::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterTouchpadGesturePhase> for TouchpadGesturePhase {
-    fn from_glib(value: ffi::ClutterTouchpadGesturePhase) -> Self {
-        match value {
-            0 => TouchpadGesturePhase::Begin,
-            1 => TouchpadGesturePhase::Update,
-            2 => TouchpadGesturePhase::End,
-            3 => TouchpadGesturePhase::Cancel,
-            value => TouchpadGesturePhase::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for TouchpadGesturePhase {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_touchpad_gesture_phase_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for TouchpadGesturePhase {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for TouchpadGesturePhase {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for TouchpadGesturePhase {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The type of unit in which a value is expressed
-///
-/// This enumeration might be expanded at later date
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum UnitType {
-    /// Unit expressed in pixels (with subpixel precision)
-    Pixel,
-    /// Unit expressed in em
-    Em,
-    /// Unit expressed in millimeters
-    Mm,
-    /// Unit expressed in points
-    Point,
-    /// Unit expressed in centimeters
-    Cm,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for UnitType {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "UnitType::{}",
-            match *self {
-                UnitType::Pixel => "Pixel",
-                UnitType::Em => "Em",
-                UnitType::Mm => "Mm",
-                UnitType::Point => "Point",
-                UnitType::Cm => "Cm",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for UnitType {
-    type GlibType = ffi::ClutterUnitType;
-
-    fn to_glib(&self) -> ffi::ClutterUnitType {
-        match *self {
-            UnitType::Pixel => ffi::CLUTTER_UNIT_PIXEL,
-            UnitType::Em => ffi::CLUTTER_UNIT_EM,
-            UnitType::Mm => ffi::CLUTTER_UNIT_MM,
-            UnitType::Point => ffi::CLUTTER_UNIT_POINT,
-            UnitType::Cm => ffi::CLUTTER_UNIT_CM,
-            UnitType::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterUnitType> for UnitType {
-    fn from_glib(value: ffi::ClutterUnitType) -> Self {
-        match value {
-            0 => UnitType::Pixel,
-            1 => UnitType::Em,
-            2 => UnitType::Mm,
-            3 => UnitType::Point,
-            4 => UnitType::Cm,
-            value => UnitType::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for UnitType {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_unit_type_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for UnitType {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for UnitType {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for UnitType {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-/// The axis of the constraint that should be applied by the
-/// zooming action.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
-#[non_exhaustive]
-pub enum ZoomAxis {
-    /// Scale only on the X axis
-    XAxis,
-    /// Scale only on the Y axis
-    YAxis,
-    /// Scale on both axis
-    Both,
-    #[doc(hidden)]
-    __Unknown(i32),
-}
-
-impl fmt::Display for ZoomAxis {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "ZoomAxis::{}",
-            match *self {
-                ZoomAxis::XAxis => "XAxis",
-                ZoomAxis::YAxis => "YAxis",
-                ZoomAxis::Both => "Both",
-                _ => "Unknown",
-            }
-        )
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ZoomAxis {
-    type GlibType = ffi::ClutterZoomAxis;
-
-    fn to_glib(&self) -> ffi::ClutterZoomAxis {
-        match *self {
-            ZoomAxis::XAxis => ffi::CLUTTER_ZOOM_X_AXIS,
-            ZoomAxis::YAxis => ffi::CLUTTER_ZOOM_Y_AXIS,
-            ZoomAxis::Both => ffi::CLUTTER_ZOOM_BOTH,
-            ZoomAxis::__Unknown(value) => value,
-        }
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterZoomAxis> for ZoomAxis {
-    fn from_glib(value: ffi::ClutterZoomAxis) -> Self {
-        match value {
-            0 => ZoomAxis::XAxis,
-            1 => ZoomAxis::YAxis,
-            2 => ZoomAxis::Both,
-            value => ZoomAxis::__Unknown(value),
-        }
-    }
-}
-
-impl StaticType for ZoomAxis {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_zoom_axis_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ZoomAxis {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ZoomAxis {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_enum(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ZoomAxis {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_enum(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
diff --git a/src/legacy/event.rs b/src/legacy/event.rs
deleted file mode 100644
index 55eb755..0000000
--- a/src/legacy/event.rs
+++ /dev/null
@@ -1,384 +0,0 @@
-#![allow(unused_macros)]
-
-use glib::translate::*;
-// use libc::c_void;
-use std::fmt;
-// , mem, ptr
-
-// use AxisUse;
-use crate::{EventSequence, EventType, InputDevice};
-// ModifierType
-
-glib_wrapper! {
-    /// A generic UX Animate event.
-    #[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct Event(Boxed<ffi::ClutterEvent>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_event_copy(ptr),
-        free => |ptr| ffi::clutter_event_free(ptr),
-        get_type => || ffi::clutter_event_get_type(),
-    }
-}
-
-event_wrapper!(Event, ClutterAnyEvent);
-
-impl Event {
-    /// Creates a new event.
-    pub fn new(type_: EventType) -> Event {
-        assert_initialized_main_thread!();
-        unsafe { from_glib_none(ffi::clutter_event_new(type_.to_glib())) }
-    }
-
-    pub fn get() -> Option<Event> {
-        assert_initialized_main_thread!();
-        unsafe { from_glib_none(ffi::clutter_event_get()) }
-    }
-
-    pub fn put(&self) {
-        unsafe { ffi::clutter_event_put(self.to_glib_none().0) }
-    }
-
-    // /// Set the event handler.
-    // ///
-    // /// The callback `handler` is called for each event. If `None`, event
-    // /// handling is disabled.
-    // pub fn set_handler<F: Fn(&mut Event) + 'static>(handler: Option<F>) {
-    //     assert_initialized_main_thread!();
-    //     unsafe extern "C" fn event_handler_trampoline<F: Fn(&mut Event) + 'static>(
-    //         event: *mut ffi::ClutterEvent,
-    //         ptr: glib_sys::gpointer,
-    //     ) {
-    //         if ptr != ptr::null_mut() {
-    //             let f: &F = &*(ptr as *mut _);
-    //             let mut event = from_glib_none(event);
-    //             f(&mut event)
-    //         }
-    //     }
-    //     unsafe extern "C" fn event_handler_destroy<F: Fn(&mut Event) + 'static>(
-    //         ptr: glib_sys::gpointer,
-    //     ) {
-    //         if ptr != ptr::null_mut() {
-    //             // convert back to Box and free
-    //             let _boxed: Box<F> = Box::from_raw(ptr as *mut _);
-    //         }
-    //     }
-    //     if let Some(handler) = handler {
-    //         // allocate and convert to target type
-    //         // double box to reduce a fat pointer to a simple pointer
-    //         let boxed: Box<F> = Box::new(handler);
-    //         let ptr: *mut c_void = Box::into_raw(boxed) as *mut _;
-    //         unsafe {
-    //             ffi::clutter_event_handler_set(
-    //                 Some(event_handler_trampoline::<F>),
-    //                 ptr,
-    //                 Some(event_handler_destroy::<F>),
-    //             )
-    //         }
-    //     } else {
-    //         unsafe { ffi::gdk_event_handler_set(None, ptr::null_mut(), None) }
-    //     }
-    // }
-
-    // pub fn get_axis(&self, axis_use: AxisUse) -> Option<f64> {
-    //     let mut value = 0f64;
-    //     if unsafe {
-    //         from_glib(ffi::gdk_event_get_axis(
-    //             self.to_glib_none().0,
-    //             axis_use.to_glib(),
-    //             &mut value,
-    //         ))
-    //     } {
-    //         Some(value)
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn get_button(&self) -> Option<u32> {
-    //     let mut button = 0u32;
-    //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_button(
-    //             self.to_glib_none().0,
-    //             &mut button,
-    //         ))
-    //     } {
-    //         Some(button)
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn get_click_count(&self) -> Option<u32> {
-    //     let mut click_count = 0u32;
-    //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_click_count(
-    //             self.to_glib_none().0,
-    //             &mut click_count,
-    //         ))
-    //     } {
-    //         Some(click_count)
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn get_coords(&self) -> Option<(f32, f32)> {
-    //     let mut x_win = 0_f32;
-    //     let mut y_win = 0_f32;
-    //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_coords(
-    //             self.to_glib_none().0,
-    //             &mut x_win,
-    //             &mut y_win,
-    //         ))
-    //     } {
-    //         Some((x_win, y_win))
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn get_keycode(&self) -> Option<u16> {
-    //     let mut keycode = 0u16;
-    //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_keycode(
-    //             self.to_glib_none().0,
-    //             &mut keycode,
-    //         ))
-    //     } {
-    //         Some(keycode)
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn get_keyval(&self) -> Option<u32> {
-    //     let mut keyval = 0u32;
-    //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_keyval(
-    //             self.to_glib_none().0,
-    //             &mut keyval,
-    //         ))
-    //     } {
-    //         Some(keyval)
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn get_root_coords(&self) -> Option<(f32, f32)> {
-    //     let mut x_root = 0_f32;
-    //     let mut y_root = 0_f32;
-    //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_coords(
-    //             self.to_glib_none().0,
-    //             &mut x_root,
-    //             &mut y_root,
-    //         ))
-    //     } {
-    //         Some((x_root, y_root))
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn get_scroll_direction(&self) -> Option<ScrollDirection> {
-    //     unsafe {
-    //         let mut direction = mem::MaybeUninit::uninit();
-    //         if from_glib(ffi::clutter_event_get_scroll_direction(
-    //             self.to_glib_none().0,
-    //             direction.as_mut_ptr(),
-    //         )) {
-    //             Some(from_glib(direction.assume_init()))
-    //         } else {
-    //             None
-    //         }
-    //     }
-    // }
-
-    // pub fn get_scroll_deltas(&self) -> Option<(f64, f64)> {
-    //     let mut delta_x = 0_f64;
-    //     let mut delta_y = 0_f64;
-    //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_scroll_delta(
-    //             self.to_glib_none().0,
-    //             &mut delta_x,
-    //             &mut delta_y,
-    //         ))
-    //     } {
-    //         Some((delta_x, delta_y))
-    //     } else {
-    //         None
-    //     }
-    // }
-
-    // pub fn is_scroll_stop_event(&self) -> bool {
-    //     unsafe {
-    //         from_glib(ffi::gdk_event_is_scroll_stop_event(
-    //             self.to_glib_none().0,
-    //         ))
-    //     }
-    // }
-
-    // pub fn get_state(&self) -> Option<ModifierType> {
-    //     unsafe {
-    //         let mut state = mem::MaybeUninit::uninit();
-    //         if from_glib(ffi::clutter_event_get_scroll_direction(
-    //             self.to_glib_none().0,
-    //             state.as_mut_ptr(),
-    //         )) {
-    //             Some(from_glib(state.assume_init() as u32))
-    //         } else {
-    //             None
-    //         }
-    //     }
-    // }
-
-    pub fn get_time(&self) -> u32 {
-        unsafe { ffi::clutter_event_get_time(self.to_glib_none().0) }
-    }
-
-    /// Returns the associated `Window` if applicable.
-    // pub fn get_window(&self) -> Option<Window> {
-    //     unsafe { from_glib_none(ffi::clutter_event_get_window(self.to_glib_none().0)) }
-    // }
-
-    pub fn get_event_sequence(&self) -> Option<EventSequence> {
-        unsafe { from_glib_none(ffi::clutter_event_get_event_sequence(self.to_glib_none().0)) }
-    }
-
-    // pub fn triggers_context_menu(&self) -> bool {
-    //     unsafe {
-    //         from_glib(ffi::clutter_event_triggers_context_menu(
-    //             self.to_glib_none().0,
-    //         ))
-    //     }
-    // }
-
-    // pub fn get_seat(&self) -> Option<Seat> {
-    //     unsafe { from_glib_none(ffi::clutter_event_get_seat(self.to_glib_none().0)) }
-    // }
-
-    // pub fn get_scancode(&mut self) -> i32 {
-    //     unsafe { ffi::clutter_event_get_scancode(self.to_glib_none_mut().0) }
-    // }
-
-    // pub fn get_pointer_emulated(&mut self) -> bool {
-    //     unsafe {
-    //         from_glib(ffi::clutter_event_is_pointer_emulated(
-    //             self.to_glib_none_mut().0,
-    //         ))
-    //     }
-    // }
-
-    // pub fn set_screen(&mut self, screen: Option<&Screen>) {
-    //     unsafe {
-    //         ffi::gdk_event_set_screen(self.to_glib_none_mut().0, screen.to_glib_none().0)
-    //     }
-    // }
-
-    // pub fn get_screen(&self) -> Option<Screen> {
-    //     unsafe { from_glib_none(ffi::clutter_event_get_screen(self.to_glib_none().0)) }
-    // }
-
-    pub fn set_device(&mut self, device: Option<&InputDevice>) {
-        unsafe { ffi::clutter_event_set_device(self.to_glib_none_mut().0, device.to_glib_none().0) }
-    }
-
-    pub fn get_device(&self) -> Option<InputDevice> {
-        unsafe { from_glib_none(ffi::clutter_event_get_device(self.to_glib_none().0)) }
-    }
-
-    pub fn set_source_device(&mut self, device: Option<&InputDevice>) {
-        unsafe {
-            ffi::clutter_event_set_source_device(self.to_glib_none_mut().0, device.to_glib_none().0)
-        }
-    }
-
-    pub fn get_source_device(&self) -> Option<InputDevice> {
-        unsafe { from_glib_none(ffi::clutter_event_get_source_device(self.to_glib_none().0)) }
-    }
-
-    // pub fn set_device_tool(&mut self, device: Option<&DeviceTool>) {
-    //     unsafe {
-    //         ffi::clutter_event_set_device_tool(self.to_glib_none_mut().0, device.to_glib_none().0)
-    //     }
-    // }
-
-    // pub fn get_device_tool(&self) -> Option<DeviceTool> {
-    //     unsafe {
-    //         from_glib_none(ffi::clutter_event_get_device_tool(
-    //             self.to_glib_none().0,
-    //         ))
-    //     }
-    // }
-
-    // /// Returns the event type.
-    // pub fn get_event_type(&self) -> EventType {
-    //     from_glib(self.as_ref().type_)
-    // }
-
-    // /// Returns whether the event was sent explicitly.
-    // #[cfg_attr(feature = "cargo-clippy", allow(cast_lossless))]
-    // pub fn get_send_event(&self) -> bool {
-    //     from_glib(self.as_ref().send_event as i32)
-    // }
-
-    /// Returns `true` if the event type matches `T`.
-    pub fn is<T: FromEvent>(&self) -> bool {
-        T::is(self)
-    }
-
-    /// Tries to downcast to a specific event type.
-    pub fn downcast<T: FromEvent>(self) -> Result<T, Self> {
-        T::from(self)
-    }
-
-    /// Tries to downcast to a specific event type.
-    pub fn downcast_ref<T: FromEvent>(&self) -> Option<&T> {
-        if T::is(self) {
-            unsafe { Some(&*(self as *const _ as *const _)) }
-        } else {
-            None
-        }
-    }
-
-    /// Tries to downcast to a specific event type.
-    pub fn downcast_mut<T: FromEvent>(&mut self) -> Option<&mut T> {
-        if T::is(self) {
-            unsafe { Some(&mut *(self as *mut _ as *mut _)) }
-        } else {
-            None
-        }
-    }
-}
-
-impl fmt::Debug for Event {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> {
-        fmt.debug_struct("Event")
-            .field("inner", &self.0)
-            // .field("type", &self.get_event_type())
-            .finish()
-    }
-}
-
-/// A helper trait implemented by all event subtypes.
-pub trait FromEvent: Sized {
-    fn is(ev: &Event) -> bool;
-    fn from(ev: Event) -> Result<Self, Event>;
-}
-
-impl FromEvent for Event {
-    #[inline]
-    fn is(_ev: &Event) -> bool {
-        skip_assert_initialized!();
-        true
-    }
-
-    #[inline]
-    fn from(ev: Event) -> Result<Self, Event> {
-        skip_assert_initialized!();
-        Ok(ev)
-    }
-}
diff --git a/src/legacy/event_button.rs b/src/legacy/event_button.rs
deleted file mode 100644
index ef145a8..0000000
--- a/src/legacy/event_button.rs
+++ /dev/null
@@ -1,53 +0,0 @@
-use glib::translate::*;
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub struct ButtonEvent(crate::Event);
-
-event_wrapper!(ButtonEvent, ClutterButtonEvent);
-event_subtype!(
-    ButtonEvent,
-    ffi::CLUTTER_BUTTON_PRESS
-        // | ffi::GDK_DOUBLE_BUTTON_PRESS
-        // | ffi::GDK_TRIPLE_BUTTON_PRESS
-        | ffi::CLUTTER_BUTTON_RELEASE
-);
-
-impl ButtonEvent {
-    //     pub fn get_position(&self) -> (f64, f64) {
-    //         let x = self.as_ref().x;
-    //         let y = self.as_ref().y;
-    //         (x, y)
-    //     }
-
-    //     pub fn get_state(&self) -> ::ModifierType {
-    //         from_glib(self.as_ref().state)
-    //     }
-
-    //     pub fn get_time(&self) -> u32 {
-    //         self.as_ref().time
-    //     }
-
-    //     pub fn get_button(&self) -> u32 {
-    //         self.as_ref().button
-    //     }
-
-    //     pub fn get_device(&self) -> Option<::Device> {
-    //         unsafe { from_glib_none(self.as_ref().device) }
-    //     }
-
-    //     pub fn get_axes(&self) -> Option<(f64, f64)> {
-    //         let axes = self.as_ref().axes;
-
-    //         if axes.is_null() {
-    //             None
-    //         } else {
-    //             unsafe { Some((*axes, *axes.offset(1))) }
-    //         }
-    //     }
-
-    //     pub fn get_root(&self) -> (f64, f64) {
-    //         let x_root = self.as_ref().x_root;
-    //         let y_root = self.as_ref().y_root;
-    //         (x_root, y_root)
-    //     }
-}
diff --git a/src/legacy/event_crossing.rs b/src/legacy/event_crossing.rs
deleted file mode 100644
index 863be17..0000000
--- a/src/legacy/event_crossing.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-use glib::translate::*;
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub struct CrossingEvent(crate::Event);
-
-event_wrapper!(CrossingEvent, ClutterCrossingEvent);
-event_subtype!(CrossingEvent, ffi::CLUTTER_ENTER | ffi::CLUTTER_LEAVE);
-
-impl CrossingEvent {
-    // pub fn get_position(&self) -> (f64, f64) {
-    //     let x = self.as_ref().x;
-    //     let y = self.as_ref().y;
-    //     (x, y)
-    // }
-
-    // pub fn get_subwindow(&self) -> Option<::Window> {
-    //     unsafe { from_glib_none(self.as_ref().subwindow) }
-    // }
-
-    // pub fn get_mode(&self) -> ::CrossingMode {
-    //     from_glib(self.as_ref().mode)
-    // }
-
-    // pub fn get_detail(&self) -> ::NotifyType {
-    //     from_glib(self.as_ref().detail)
-    // }
-
-    // pub fn get_state(&self) -> ::ModifierType {
-    //     from_glib(self.as_ref().state)
-    // }
-
-    // pub fn get_time(&self) -> u32 {
-    //     self.as_ref().time
-    // }
-
-    // pub fn get_root(&self) -> (f64, f64) {
-    //     let x_root = self.as_ref().x_root;
-    //     let y_root = self.as_ref().y_root;
-    //     (x_root, y_root)
-    // }
-
-    // pub fn get_focus(&self) -> bool {
-    //     from_glib(self.as_ref().focus)
-    // }
-}
diff --git a/src/legacy/event_key.rs b/src/legacy/event_key.rs
deleted file mode 100644
index 3940d57..0000000
--- a/src/legacy/event_key.rs
+++ /dev/null
@@ -1,39 +0,0 @@
-use glib::translate::*;
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub struct KeyEvent(crate::Event);
-
-event_wrapper!(KeyEvent, ClutterKeyEvent);
-event_subtype!(KeyEvent, ffi::CLUTTER_KEY_PRESS | ffi::CLUTTER_KEY_RELEASE);
-
-impl KeyEvent {
-    // pub fn get_time(&self) -> u32 {
-    //     self.as_ref().time
-    // }
-
-    // pub fn get_state(&self) -> ::ModifierType {
-    //     from_glib(self.as_ref().state)
-    // }
-
-    // pub fn get_keyval(&self) -> ::keys::Key {
-    //     from_glib(self.as_ref().keyval)
-    // }
-
-    // pub fn get_length(&self) -> u32 {
-    //     let length = self.as_ref().length;
-    //     assert!(length >= 0, "Unexpected negative value");
-    //     length as u32
-    // }
-
-    // pub fn get_hardware_keycode(&self) -> u16 {
-    //     self.as_ref().hardware_keycode
-    // }
-
-    // pub fn get_group(&self) -> u8 {
-    //     self.as_ref().group
-    // }
-
-    // pub fn get_is_modifier(&self) -> bool {
-    //     self.as_ref().is_modifier & 1 != 0
-    // }
-}
diff --git a/src/legacy/event_motion.rs b/src/legacy/event_motion.rs
deleted file mode 100644
index 9be585c..0000000
--- a/src/legacy/event_motion.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-use glib::translate::*;
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub struct MotionEvent(crate::Event);
-
-event_wrapper!(MotionEvent, ClutterMotionEvent);
-event_subtype!(MotionEvent, ffi::CLUTTER_MOTION);
-
-impl MotionEvent {
-    // pub fn get_position(&self) -> (f64, f64) {
-    //     let x = self.as_ref().x;
-    //     let y = self.as_ref().y;
-    //     (x, y)
-    // }
-
-    // pub fn get_state(&self) -> ::ModifierType {
-    //     from_glib(self.as_ref().state)
-    // }
-
-    // pub fn get_time(&self) -> u32 {
-    //     self.as_ref().time
-    // }
-
-    // pub fn request_motions(&self) {
-    //     unsafe { ffi::gdk_event_request_motions(self.as_ref()) }
-    // }
-
-    // pub fn get_device(&self) -> Option<::Device> {
-    //     unsafe { from_glib_none(self.as_ref().device) }
-    // }
-
-    // pub fn get_axes(&self) -> Option<(f64, f64)> {
-    //     let axes = self.as_ref().axes;
-
-    //     if axes.is_null() {
-    //         None
-    //     } else {
-    //         unsafe { Some((*axes, *axes.offset(1))) }
-    //     }
-    // }
-
-    // pub fn get_root(&self) -> (f64, f64) {
-    //     let x_root = self.as_ref().x_root;
-    //     let y_root = self.as_ref().y_root;
-    //     (x_root, y_root)
-    // }
-
-    // pub fn get_is_hint(&self) -> bool {
-    //     from_glib(self.as_ref().is_hint as _)
-    // }
-}
diff --git a/src/legacy/event_scroll.rs b/src/legacy/event_scroll.rs
deleted file mode 100644
index 146a112..0000000
--- a/src/legacy/event_scroll.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-use glib::translate::*;
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub struct ScrollEvent(crate::Event);
-
-event_wrapper!(ScrollEvent, ClutterScrollEvent);
-event_subtype!(ScrollEvent, ffi::CLUTTER_SCROLL);
-
-impl ScrollEvent {
-    // pub fn get_time(&self) -> u32 {
-    //     self.as_ref().time
-    // }
-
-    // pub fn get_position(&self) -> (f64, f64) {
-    //     let x = self.as_ref().x;
-    //     let y = self.as_ref().y;
-    //     (x, y)
-    // }
-
-    // pub fn get_state(&self) -> ::ModifierType {
-    //     from_glib(self.as_ref().state)
-    // }
-
-    // pub fn get_device(&self) -> Option<::Device> {
-    //     unsafe { from_glib_none(self.as_ref().device) }
-    // }
-
-    // pub fn get_direction(&self) -> ::ScrollDirection {
-    //     from_glib(self.as_ref().direction)
-    // }
-
-    // pub fn get_root(&self) -> (f64, f64) {
-    //     let x_root = self.as_ref().x_root;
-    //     let y_root = self.as_ref().y_root;
-    //     (x_root, y_root)
-    // }
-
-    // pub fn get_delta(&self) -> (f64, f64) {
-    //     let dx = self.as_ref().delta_x;
-    //     let dy = self.as_ref().delta_y;
-    //     (dx, dy)
-    // }
-
-    // pub fn get_is_stop(&self) -> bool {
-    //     self.as_ref().is_stop & 1 != 0
-    // }
-}
diff --git a/src/legacy/event_sequence.rs b/src/legacy/event_sequence.rs
deleted file mode 100644
index 1b397cd..0000000
--- a/src/legacy/event_sequence.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct EventSequence(Boxed<ffi::ClutterEventSequence>);
-
-    match fn {
-        copy => |ptr| gobject_sys::g_boxed_copy(ffi::clutter_event_sequence_get_type(), ptr as *mut _) as *mut ffi::ClutterEventSequence,
-        free => |ptr| gobject_sys::g_boxed_free(ffi::clutter_event_sequence_get_type(), ptr as *mut _),
-        get_type => || ffi::clutter_event_sequence_get_type(),
-    }
-}
diff --git a/src/legacy/event_touch.rs b/src/legacy/event_touch.rs
deleted file mode 100644
index 1c4a5ff..0000000
--- a/src/legacy/event_touch.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use glib::translate::*;
-
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub struct TouchEvent(crate::Event);
-
-event_wrapper!(TouchEvent, ClutterTouchEvent);
-event_subtype!(
-    TouchEvent,
-    ffi::CLUTTER_TOUCH_BEGIN
-        | ffi::CLUTTER_TOUCH_UPDATE
-        | ffi::CLUTTER_TOUCH_END
-        | ffi::CLUTTER_TOUCH_CANCEL
-);
-
-impl TouchEvent {
-    //     pub fn get_time(&self) -> u32 {
-    //         self.as_ref().time
-    //     }
-
-    //     pub fn get_position(&self) -> (f64, f64) {
-    //         let x = self.as_ref().x;
-    //         let y = self.as_ref().y;
-    //         (x, y)
-    //     }
-
-    //     pub fn get_state(&self) -> ::ModifierType {
-    //         from_glib(self.as_ref().state)
-    //     }
-
-    //     pub fn is_emulating_pointer(&self) -> bool {
-    //         from_glib(self.as_ref().emulating_pointer)
-    //     }
-
-    //     pub fn get_device(&self) -> Option<::Device> {
-    //         unsafe { from_glib_none(self.as_ref().device) }
-    //     }
-
-    //     pub fn get_axes(&self) -> Option<(f64, f64)> {
-    //         let axes = self.as_ref().axes;
-
-    //         if axes.is_null() {
-    //             None
-    //         } else {
-    //             unsafe { Some((*axes, *axes.offset(1))) }
-    //         }
-    //     }
-
-    //     pub fn get_root(&self) -> (f64, f64) {
-    //         let x_root = self.as_ref().x_root;
-    //         let y_root = self.as_ref().y_root;
-    //         (x_root, y_root)
-    //     }
-
-    //     pub fn get_event_sequence(&self) -> Option<::EventSequence> {
-    //         unsafe { from_glib_none(self.as_ref().sequence) }
-    //     }
-}
diff --git a/src/legacy/fixed_layout.rs b/src/legacy/fixed_layout.rs
deleted file mode 100644
index cbd8a04..0000000
--- a/src/legacy/fixed_layout.rs
+++ /dev/null
@@ -1,34 +0,0 @@
-use crate::LayoutManager;
-use glib::{object as gobject, object::Cast, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct FixedLayout(Object<ffi::ClutterFixedLayout, ffi::ClutterFixedLayoutClass, FixedLayoutClass>) @extends LayoutManager, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_fixed_layout_get_type(),
-    }
-}
-
-impl FixedLayout {
-    /// Creates a new `FixedLayout`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `FixedLayout`
-    pub fn new() -> FixedLayout {
-        unsafe { LayoutManager::from_glib_none(ffi::clutter_fixed_layout_new()).unsafe_cast() }
-    }
-}
-
-impl Default for FixedLayout {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-impl fmt::Display for FixedLayout {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "FixedLayout")
-    }
-}
diff --git a/src/legacy/flags.rs b/src/legacy/flags.rs
deleted file mode 100644
index cb99ec0..0000000
--- a/src/legacy/flags.rs
+++ /dev/null
@@ -1,667 +0,0 @@
-use glib::{
-    translate::*,
-    value::{FromValue, FromValueOptional, SetValue, Value},
-    StaticType, Type,
-};
-
-bitflags! {
-    pub struct ActorFlags: u32 {
-        const MAPPED = 2;
-        const REALIZED = 4;
-        const REACTIVE = 8;
-        const VISIBLE = 16;
-        const NO_LAYOUT = 32;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ActorFlags {
-    type GlibType = ffi::ClutterActorFlags;
-
-    fn to_glib(&self) -> ffi::ClutterActorFlags {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterActorFlags> for ActorFlags {
-    fn from_glib(value: ffi::ClutterActorFlags) -> ActorFlags {
-        ActorFlags::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for ActorFlags {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_actor_flags_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ActorFlags {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ActorFlags {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ActorFlags {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct AllocationFlags: u32 {
-        const ALLOCATION_NONE = 0;
-        const ABSOLUTE_ORIGIN_CHANGED = 2;
-        const DELEGATE_LAYOUT = 4;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for AllocationFlags {
-    type GlibType = ffi::ClutterAllocationFlags;
-
-    fn to_glib(&self) -> ffi::ClutterAllocationFlags {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterAllocationFlags> for AllocationFlags {
-    fn from_glib(value: ffi::ClutterAllocationFlags) -> AllocationFlags {
-        AllocationFlags::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for AllocationFlags {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_allocation_flags_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for AllocationFlags {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for AllocationFlags {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for AllocationFlags {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct ContentRepeat: u32 {
-        const NONE = 0;
-        const X_AXIS = 1;
-        const Y_AXIS = 2;
-        const BOTH = 3;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ContentRepeat {
-    type GlibType = ffi::ClutterContentRepeat;
-
-    fn to_glib(&self) -> ffi::ClutterContentRepeat {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterContentRepeat> for ContentRepeat {
-    fn from_glib(value: ffi::ClutterContentRepeat) -> ContentRepeat {
-        ContentRepeat::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for ContentRepeat {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_content_repeat_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ContentRepeat {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ContentRepeat {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ContentRepeat {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct EffectPaintFlags: u32 {
-        const ACTOR_DIRTY = 1;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for EffectPaintFlags {
-    type GlibType = ffi::ClutterEffectPaintFlags;
-
-    fn to_glib(&self) -> ffi::ClutterEffectPaintFlags {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterEffectPaintFlags> for EffectPaintFlags {
-    fn from_glib(value: ffi::ClutterEffectPaintFlags) -> EffectPaintFlags {
-        EffectPaintFlags::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for EffectPaintFlags {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_effect_paint_flags_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for EffectPaintFlags {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for EffectPaintFlags {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for EffectPaintFlags {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct EventFlags: u32 {
-        const NONE = 0;
-        const FLAG_SYNTHETIC = 1;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for EventFlags {
-    type GlibType = ffi::ClutterEventFlags;
-
-    fn to_glib(&self) -> ffi::ClutterEventFlags {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterEventFlags> for EventFlags {
-    fn from_glib(value: ffi::ClutterEventFlags) -> EventFlags {
-        EventFlags::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for EventFlags {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_event_flags_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for EventFlags {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for EventFlags {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for EventFlags {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct FeatureFlags: u32 {
-        const TEXTURE_NPOT = 4;
-        const SYNC_TO_VBLANK = 8;
-        const TEXTURE_YUV = 16;
-        const TEXTURE_READ_PIXELS = 32;
-        const STAGE_STATIC = 64;
-        const STAGE_USER_RESIZE = 128;
-        const STAGE_CURSOR = 256;
-        const SHADERS_GLSL = 512;
-        const OFFSCREEN = 1024;
-        const STAGE_MULTIPLE = 2048;
-        const SWAP_EVENTS = 4096;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for FeatureFlags {
-    type GlibType = ffi::ClutterFeatureFlags;
-
-    fn to_glib(&self) -> ffi::ClutterFeatureFlags {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterFeatureFlags> for FeatureFlags {
-    fn from_glib(value: ffi::ClutterFeatureFlags) -> FeatureFlags {
-        FeatureFlags::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for FeatureFlags {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_feature_flags_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for FeatureFlags {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for FeatureFlags {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for FeatureFlags {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct ModifierType: u32 {
-        const SHIFT_MASK = 1;
-        const LOCK_MASK = 2;
-        const CONTROL_MASK = 4;
-        const MOD1_MASK = 8;
-        const MOD2_MASK = 16;
-        const MOD3_MASK = 32;
-        const MOD4_MASK = 64;
-        const MOD5_MASK = 128;
-        const BUTTON1_MASK = 256;
-        const BUTTON2_MASK = 512;
-        const BUTTON3_MASK = 1024;
-        const BUTTON4_MASK = 2048;
-        const BUTTON5_MASK = 4096;
-        const MODIFIER_RESERVED_13_MASK = 8192;
-        const MODIFIER_RESERVED_14_MASK = 16384;
-        const MODIFIER_RESERVED_15_MASK = 32768;
-        const MODIFIER_RESERVED_16_MASK = 65536;
-        const MODIFIER_RESERVED_17_MASK = 131072;
-        const MODIFIER_RESERVED_18_MASK = 262144;
-        const MODIFIER_RESERVED_19_MASK = 524288;
-        const MODIFIER_RESERVED_20_MASK = 1048576;
-        const MODIFIER_RESERVED_21_MASK = 2097152;
-        const MODIFIER_RESERVED_22_MASK = 4194304;
-        const MODIFIER_RESERVED_23_MASK = 8388608;
-        const MODIFIER_RESERVED_24_MASK = 16777216;
-        const MODIFIER_RESERVED_25_MASK = 33554432;
-        const SUPER_MASK = 67108864;
-        const HYPER_MASK = 134217728;
-        const META_MASK = 268435456;
-        const MODIFIER_RESERVED_29_MASK = 536870912;
-        const RELEASE_MASK = 1073741824;
-        const MODIFIER_MASK = 1543512063;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ModifierType {
-    type GlibType = ffi::ClutterModifierType;
-
-    fn to_glib(&self) -> ffi::ClutterModifierType {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterModifierType> for ModifierType {
-    fn from_glib(value: ffi::ClutterModifierType) -> ModifierType {
-        ModifierType::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for ModifierType {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_modifier_type_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ModifierType {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ModifierType {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ModifierType {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct OffscreenRedirect: u32 {
-        const AUTOMATIC_FOR_OPACITY = 1;
-        const ALWAYS = 2;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for OffscreenRedirect {
-    type GlibType = ffi::ClutterOffscreenRedirect;
-
-    fn to_glib(&self) -> ffi::ClutterOffscreenRedirect {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterOffscreenRedirect> for OffscreenRedirect {
-    fn from_glib(value: ffi::ClutterOffscreenRedirect) -> OffscreenRedirect {
-        OffscreenRedirect::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for OffscreenRedirect {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_offscreen_redirect_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for OffscreenRedirect {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for OffscreenRedirect {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for OffscreenRedirect {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct RepaintFlags: u32 {
-        const PRE_PAINT = 1;
-        const POST_PAINT = 2;
-        const QUEUE_REDRAW_ON_ADD = 4;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for RepaintFlags {
-    type GlibType = ffi::ClutterRepaintFlags;
-
-    fn to_glib(&self) -> ffi::ClutterRepaintFlags {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterRepaintFlags> for RepaintFlags {
-    fn from_glib(value: ffi::ClutterRepaintFlags) -> RepaintFlags {
-        RepaintFlags::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for RepaintFlags {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_repaint_flags_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for RepaintFlags {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for RepaintFlags {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for RepaintFlags {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct ScrollFinishFlags: u32 {
-        const NONE = 0;
-        const HORIZONTAL = 1;
-        const VERTICAL = 2;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ScrollFinishFlags {
-    type GlibType = ffi::ClutterScrollFinishFlags;
-
-    fn to_glib(&self) -> ffi::ClutterScrollFinishFlags {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterScrollFinishFlags> for ScrollFinishFlags {
-    fn from_glib(value: ffi::ClutterScrollFinishFlags) -> ScrollFinishFlags {
-        ScrollFinishFlags::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for ScrollFinishFlags {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_scroll_finish_flags_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ScrollFinishFlags {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ScrollFinishFlags {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ScrollFinishFlags {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct ScrollMode: u32 {
-        const NONE = 0;
-        const HORIZONTALLY = 1;
-        const VERTICALLY = 2;
-        const BOTH = 3;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for ScrollMode {
-    type GlibType = ffi::ClutterScrollMode;
-
-    fn to_glib(&self) -> ffi::ClutterScrollMode {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterScrollMode> for ScrollMode {
-    fn from_glib(value: ffi::ClutterScrollMode) -> ScrollMode {
-        ScrollMode::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for ScrollMode {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_scroll_mode_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for ScrollMode {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for ScrollMode {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for ScrollMode {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct StageState: u32 {
-        const FULLSCREEN = 2;
-        const OFFSCREEN = 4;
-        const ACTIVATED = 8;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for StageState {
-    type GlibType = ffi::ClutterStageState;
-
-    fn to_glib(&self) -> ffi::ClutterStageState {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterStageState> for StageState {
-    fn from_glib(value: ffi::ClutterStageState) -> StageState {
-        StageState::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for StageState {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_stage_state_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for StageState {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for StageState {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for StageState {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
-
-bitflags! {
-    pub struct SwipeDirection: u32 {
-        const UP = 1;
-        const DOWN = 2;
-        const LEFT = 4;
-        const RIGHT = 8;
-    }
-}
-
-#[doc(hidden)]
-impl ToGlib for SwipeDirection {
-    type GlibType = ffi::ClutterSwipeDirection;
-
-    fn to_glib(&self) -> ffi::ClutterSwipeDirection {
-        self.bits()
-    }
-}
-
-#[doc(hidden)]
-impl FromGlib<ffi::ClutterSwipeDirection> for SwipeDirection {
-    fn from_glib(value: ffi::ClutterSwipeDirection) -> SwipeDirection {
-        SwipeDirection::from_bits_truncate(value)
-    }
-}
-
-impl StaticType for SwipeDirection {
-    fn static_type() -> Type {
-        unsafe { from_glib(ffi::clutter_swipe_direction_get_type()) }
-    }
-}
-
-impl<'a> FromValueOptional<'a> for SwipeDirection {
-    unsafe fn from_value_optional(value: &Value) -> Option<Self> {
-        Some(FromValue::from_value(value))
-    }
-}
-
-impl<'a> FromValue<'a> for SwipeDirection {
-    unsafe fn from_value(value: &Value) -> Self {
-        from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
-    }
-}
-
-impl SetValue for SwipeDirection {
-    unsafe fn set_value(value: &mut Value, this: &Self) {
-        gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
-    }
-}
diff --git a/src/legacy/flow_layout.rs b/src/legacy/flow_layout.rs
deleted file mode 100644
index cef5e2b..0000000
--- a/src/legacy/flow_layout.rs
+++ /dev/null
@@ -1,661 +0,0 @@
-use crate::{FlowOrientation, LayoutManager};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct FlowLayout(Object<ffi::ClutterFlowLayout, ffi::ClutterFlowLayoutClass, FlowLayoutClass>) @extends LayoutManager, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_flow_layout_get_type(),
-    }
-}
-
-impl FlowLayout {
-    /// Creates a new `FlowLayout` with the given `orientation`
-    /// ## `orientation`
-    /// the orientation of the flow layout
-    ///
-    /// # Returns
-    ///
-    /// the newly created `FlowLayout`
-    pub fn new(orientation: FlowOrientation) -> FlowLayout {
-        unsafe {
-            LayoutManager::from_glib_none(ffi::clutter_flow_layout_new(orientation.to_glib()))
-                .unsafe_cast()
-        }
-    }
-}
-
-/// Trait containing all `FlowLayout` methods.
-///
-/// # Implementors
-///
-/// [`FlowLayout`](struct.FlowLayout.html)
-pub trait FlowLayoutExt: 'static {
-    /// Retrieves the spacing between columns
-    ///
-    /// # Returns
-    ///
-    /// the spacing between columns of the `FlowLayout`,
-    ///  in pixels
-    fn get_column_spacing(&self) -> f32;
-
-    /// Retrieves the minimum and maximum column widths
-    /// ## `min_width`
-    /// return location for the minimum column width, or `None`
-    /// ## `max_width`
-    /// return location for the maximum column width, or `None`
-    fn get_column_width(&self) -> (f32, f32);
-
-    /// Retrieves whether the `self` is homogeneous
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `FlowLayout` is homogeneous
-    fn get_homogeneous(&self) -> bool;
-
-    /// Retrieves the orientation of the `self`
-    ///
-    /// # Returns
-    ///
-    /// the orientation of the `FlowLayout`
-    fn get_orientation(&self) -> FlowOrientation;
-
-    /// Retrieves the minimum and maximum row heights
-    /// ## `min_height`
-    /// return location for the minimum row height, or `None`
-    /// ## `max_height`
-    /// return location for the maximum row height, or `None`
-    fn get_row_height(&self) -> (f32, f32);
-
-    /// Retrieves the spacing between rows
-    ///
-    /// # Returns
-    ///
-    /// the spacing between rows of the `FlowLayout`,
-    ///  in pixels
-    fn get_row_spacing(&self) -> f32;
-
-    /// Retrieves the value of `FlowLayout:snap-to-grid` property
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `self` is placing its children on a grid
-    fn get_snap_to_grid(&self) -> bool;
-
-    /// Sets the space between columns, in pixels
-    /// ## `spacing`
-    /// the space between columns
-    fn set_column_spacing(&self, spacing: f32);
-
-    /// Sets the minimum and maximum widths that a column can have
-    /// ## `min_width`
-    /// minimum width of a column
-    /// ## `max_width`
-    /// maximum width of a column
-    fn set_column_width(&self, min_width: f32, max_width: f32);
-
-    /// Sets whether the `self` should allocate the same space for
-    /// each child
-    /// ## `homogeneous`
-    /// whether the layout should be homogeneous or not
-    fn set_homogeneous(&self, homogeneous: bool);
-
-    /// Sets the orientation of the flow layout
-    ///
-    /// The orientation controls the direction used to allocate
-    /// the children: either horizontally or vertically. The
-    /// orientation also controls the direction of the overflowing
-    /// ## `orientation`
-    /// the orientation of the layout
-    fn set_orientation(&self, orientation: FlowOrientation);
-
-    /// Sets the minimum and maximum heights that a row can have
-    /// ## `min_height`
-    /// the minimum height of a row
-    /// ## `max_height`
-    /// the maximum height of a row
-    fn set_row_height(&self, min_height: f32, max_height: f32);
-
-    /// Sets the spacing between rows, in pixels
-    /// ## `spacing`
-    /// the space between rows
-    fn set_row_spacing(&self, spacing: f32);
-
-    /// Whether the `self` should place its children on a grid.
-    /// ## `snap_to_grid`
-    /// `true` if `self` should place its children on a grid
-    fn set_snap_to_grid(&self, snap_to_grid: bool);
-
-    /// Maximum width for each column in the layout, in pixels. If
-    /// set to -1 the width will be the maximum child width
-    fn get_property_max_column_width(&self) -> f32;
-
-    /// Maximum width for each column in the layout, in pixels. If
-    /// set to -1 the width will be the maximum child width
-    fn set_property_max_column_width(&self, max_column_width: f32);
-
-    /// Maximum height for each row in the layout, in pixels. If
-    /// set to -1 the width will be the maximum child height
-    fn get_property_max_row_height(&self) -> f32;
-
-    /// Maximum height for each row in the layout, in pixels. If
-    /// set to -1 the width will be the maximum child height
-    fn set_property_max_row_height(&self, max_row_height: f32);
-
-    /// Minimum width for each column in the layout, in pixels
-    fn get_property_min_column_width(&self) -> f32;
-
-    /// Minimum width for each column in the layout, in pixels
-    fn set_property_min_column_width(&self, min_column_width: f32);
-
-    /// Minimum height for each row in the layout, in pixels
-    fn get_property_min_row_height(&self) -> f32;
-
-    /// Minimum height for each row in the layout, in pixels
-    fn set_property_min_row_height(&self, min_row_height: f32);
-
-    fn connect_property_column_spacing_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_homogeneous_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_max_column_width_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_max_row_height_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_min_column_width_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_min_row_height_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_orientation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_row_spacing_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_snap_to_grid_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-}
-
-impl<O: IsA<FlowLayout>> FlowLayoutExt for O {
-    fn get_column_spacing(&self) -> f32 {
-        unsafe { ffi::clutter_flow_layout_get_column_spacing(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_column_width(&self) -> (f32, f32) {
-        unsafe {
-            let mut min_width = mem::MaybeUninit::uninit();
-            let mut max_width = mem::MaybeUninit::uninit();
-            ffi::clutter_flow_layout_get_column_width(
-                self.as_ref().to_glib_none().0,
-                min_width.as_mut_ptr(),
-                max_width.as_mut_ptr(),
-            );
-            let min_width = min_width.assume_init();
-            let max_width = max_width.assume_init();
-            (min_width, max_width)
-        }
-    }
-
-    fn get_homogeneous(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_flow_layout_get_homogeneous(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_orientation(&self) -> FlowOrientation {
-        unsafe {
-            from_glib(ffi::clutter_flow_layout_get_orientation(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_row_height(&self) -> (f32, f32) {
-        unsafe {
-            let mut min_height = mem::MaybeUninit::uninit();
-            let mut max_height = mem::MaybeUninit::uninit();
-            ffi::clutter_flow_layout_get_row_height(
-                self.as_ref().to_glib_none().0,
-                min_height.as_mut_ptr(),
-                max_height.as_mut_ptr(),
-            );
-            let min_height = min_height.assume_init();
-            let max_height = max_height.assume_init();
-            (min_height, max_height)
-        }
-    }
-
-    fn get_row_spacing(&self) -> f32 {
-        unsafe { ffi::clutter_flow_layout_get_row_spacing(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_snap_to_grid(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_flow_layout_get_snap_to_grid(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_column_spacing(&self, spacing: f32) {
-        unsafe {
-            ffi::clutter_flow_layout_set_column_spacing(self.as_ref().to_glib_none().0, spacing);
-        }
-    }
-
-    fn set_column_width(&self, min_width: f32, max_width: f32) {
-        unsafe {
-            ffi::clutter_flow_layout_set_column_width(
-                self.as_ref().to_glib_none().0,
-                min_width,
-                max_width,
-            );
-        }
-    }
-
-    fn set_homogeneous(&self, homogeneous: bool) {
-        unsafe {
-            ffi::clutter_flow_layout_set_homogeneous(
-                self.as_ref().to_glib_none().0,
-                homogeneous.to_glib(),
-            );
-        }
-    }
-
-    fn set_orientation(&self, orientation: FlowOrientation) {
-        unsafe {
-            ffi::clutter_flow_layout_set_orientation(
-                self.as_ref().to_glib_none().0,
-                orientation.to_glib(),
-            );
-        }
-    }
-
-    fn set_row_height(&self, min_height: f32, max_height: f32) {
-        unsafe {
-            ffi::clutter_flow_layout_set_row_height(
-                self.as_ref().to_glib_none().0,
-                min_height,
-                max_height,
-            );
-        }
-    }
-
-    fn set_row_spacing(&self, spacing: f32) {
-        unsafe {
-            ffi::clutter_flow_layout_set_row_spacing(self.as_ref().to_glib_none().0, spacing);
-        }
-    }
-
-    fn set_snap_to_grid(&self, snap_to_grid: bool) {
-        unsafe {
-            ffi::clutter_flow_layout_set_snap_to_grid(
-                self.as_ref().to_glib_none().0,
-                snap_to_grid.to_glib(),
-            );
-        }
-    }
-
-    fn get_property_max_column_width(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"max-column-width\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `max-column-width` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_max_column_width(&self, max_column_width: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"max-column-width\0".as_ptr() as *const _,
-                Value::from(&max_column_width).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_max_row_height(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"max-row-height\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `max-row-height` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_max_row_height(&self, max_row_height: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"max-row-height\0".as_ptr() as *const _,
-                Value::from(&max_row_height).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_min_column_width(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-column-width\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `min-column-width` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_min_column_width(&self, min_column_width: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-column-width\0".as_ptr() as *const _,
-                Value::from(&min_column_width).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_min_row_height(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-row-height\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `min-row-height` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_min_row_height(&self, min_row_height: f32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"min-row-height\0".as_ptr() as *const _,
-                Value::from(&min_row_height).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_column_spacing_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_column_spacing_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::column-spacing\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_column_spacing_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_homogeneous_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_homogeneous_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::homogeneous\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_homogeneous_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_max_column_width_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_max_column_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::max-column-width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_max_column_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_max_row_height_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_max_row_height_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::max-row-height\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_max_row_height_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_min_column_width_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_min_column_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::min-column-width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_min_column_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_min_row_height_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_min_row_height_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::min-row-height\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_min_row_height_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_orientation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_orientation_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::orientation\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_orientation_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_row_spacing_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_row_spacing_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::row-spacing\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_row_spacing_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_snap_to_grid_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_snap_to_grid_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterFlowLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<FlowLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&FlowLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::snap-to-grid\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_snap_to_grid_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for FlowLayout {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "FlowLayout")
-    }
-}
diff --git a/src/legacy/geometry.rs b/src/legacy/geometry.rs
deleted file mode 100644
index 601fca0..0000000
--- a/src/legacy/geometry.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct Geometry(Boxed<ffi::ClutterGeometry>);
-
-    match fn {
-        copy => |ptr| gobject_sys::g_boxed_copy(ffi::clutter_geometry_get_type(), ptr as *mut _) as *mut ffi::ClutterGeometry,
-        free => |ptr| gobject_sys::g_boxed_free(ffi::clutter_geometry_get_type(), ptr as *mut _),
-        get_type => || ffi::clutter_geometry_get_type(),
-    }
-}
diff --git a/src/legacy/gesture_action.rs b/src/legacy/gesture_action.rs
deleted file mode 100644
index 1336731..0000000
--- a/src/legacy/gesture_action.rs
+++ /dev/null
@@ -1,616 +0,0 @@
-use crate::{Action, Actor, ActorMeta, Event, EventSequence, GestureTriggerEdge, InputDevice};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct GestureAction(Object<ffi::ClutterGestureAction, ffi::ClutterGestureActionClass, GestureActionClass>) @extends Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_gesture_action_get_type(),
-    }
-}
-
-impl GestureAction {
-    /// Creates a new `GestureAction` instance.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `GestureAction`
-    pub fn new() -> GestureAction {
-        unsafe { Action::from_glib_none(ffi::clutter_gesture_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for GestureAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `GestureAction` methods.
-///
-/// # Implementors
-///
-/// [`GestureAction`](struct.GestureAction.html), [`PanAction`](struct.PanAction.html), [`RotateAction`](struct.RotateAction.html), [`SwipeAction`](struct.SwipeAction.html), [`TapAction`](struct.TapAction.html), [`ZoomAction`](struct.ZoomAction.html)
-pub trait GestureActionExt: 'static {
-    /// Cancel a `GestureAction` before it begins
-    fn cancel(&self);
-
-    /// Retrieves the `InputDevice` of a touch point.
-    /// ## `point`
-    /// the touch point index, with 0 being the first touch
-    ///  point received by the action
-    ///
-    /// # Returns
-    ///
-    /// the `InputDevice` of a touch point.
-    fn get_device(&self, point: u32) -> Option<InputDevice>;
-
-    /// Retrieves a reference to the last `Event` for a touch point. Call
-    /// `event_copy` if you need to store the reference somewhere.
-    /// ## `point`
-    /// index of a point currently active
-    ///
-    /// # Returns
-    ///
-    /// the last `Event` for a touch point.
-    fn get_last_event(&self, point: u32) -> Option<Event>;
-
-    /// Retrieves the coordinates, in stage space, of the latest motion
-    /// event during the dragging.
-    /// ## `point`
-    /// the touch point index, with 0 being the first touch
-    ///  point received by the action
-    /// ## `motion_x`
-    /// return location for the latest motion
-    ///  event's X coordinate
-    /// ## `motion_y`
-    /// return location for the latest motion
-    ///  event's Y coordinate
-    fn get_motion_coords(&self, point: u32) -> (f32, f32);
-
-    /// Retrieves the incremental delta since the last motion event
-    /// during the dragging.
-    /// ## `point`
-    /// the touch point index, with 0 being the first touch
-    ///  point received by the action
-    /// ## `delta_x`
-    /// return location for the X axis
-    ///  component of the incremental motion delta
-    /// ## `delta_y`
-    /// return location for the Y axis
-    ///  component of the incremental motion delta
-    ///
-    /// # Returns
-    ///
-    /// the distance since last motion event
-    fn get_motion_delta(&self, point: u32) -> (f32, f32, f32);
-
-    /// Retrieves the number of points currently active.
-    ///
-    /// # Returns
-    ///
-    /// the number of points currently active.
-    fn get_n_current_points(&self) -> u32;
-
-    /// Retrieves the number of requested points to trigger the gesture.
-    ///
-    /// # Returns
-    ///
-    /// the number of points to trigger the gesture.
-    fn get_n_touch_points(&self) -> i32;
-
-    /// Retrieves the coordinates, in stage space, of the press event
-    /// that started the dragging for a specific touch point.
-    /// ## `point`
-    /// the touch point index, with 0 being the first touch
-    ///  point received by the action
-    /// ## `press_x`
-    /// return location for the press
-    ///  event's X coordinate
-    /// ## `press_y`
-    /// return location for the press
-    ///  event's Y coordinate
-    fn get_press_coords(&self, point: u32) -> (f32, f32);
-
-    /// Retrieves the coordinates, in stage space, where the touch point was
-    /// last released.
-    /// ## `point`
-    /// the touch point index, with 0 being the first touch
-    ///  point received by the action
-    /// ## `release_x`
-    /// return location for the X coordinate of
-    ///  the last release
-    /// ## `release_y`
-    /// return location for the Y coordinate of
-    ///  the last release
-    fn get_release_coords(&self, point: u32) -> (f32, f32);
-
-    /// Retrieves the `EventSequence` of a touch point.
-    /// ## `point`
-    /// index of a point currently active
-    ///
-    /// # Returns
-    ///
-    /// the `EventSequence` of a touch point.
-    fn get_sequence(&self, point: u32) -> Option<EventSequence>;
-
-    /// Retrieves the threshold trigger distance of the gesture `self`,
-    /// as set using `GestureActionExt::set_threshold_trigger_distance`.
-    /// ## `x`
-    /// The return location for the horizontal distance, or `None`
-    /// ## `y`
-    /// The return location for the vertical distance, or `None`
-    fn get_threshold_trigger_distance(&self) -> (f32, f32);
-
-    /// Retrieves the edge trigger of the gesture `self`, as set using
-    /// `GestureActionExt::set_threshold_trigger_edge`.
-    ///
-    /// # Returns
-    ///
-    /// the edge trigger
-    fn get_threshold_trigger_edge(&self) -> GestureTriggerEdge;
-
-    /// Retrieves the velocity, in stage pixels per millisecond, of the
-    /// latest motion event during the dragging.
-    /// ## `point`
-    /// the touch point index, with 0 being the first touch
-    ///  point received by the action
-    /// ## `velocity_x`
-    /// return location for the latest motion
-    ///  event's X velocity
-    /// ## `velocity_y`
-    /// return location for the latest motion
-    ///  event's Y velocity
-    fn get_velocity(&self, point: u32) -> (f32, f32, f32);
-
-    /// Sets the number of points needed to trigger the gesture.
-    /// ## `nb_points`
-    /// a number of points
-    fn set_n_touch_points(&self, nb_points: i32);
-
-    /// Sets the threshold trigger distance for the gesture drag threshold, if any.
-    ///
-    /// This function should only be called by sub-classes of
-    /// `GestureAction` during their construction phase.
-    /// ## `x`
-    /// the distance on the horizontal axis
-    /// ## `y`
-    /// the distance on the vertical axis
-    fn set_threshold_trigger_distance(&self, x: f32, y: f32);
-
-    /// Sets the edge trigger for the gesture drag threshold, if any.
-    ///
-    /// This function should only be called by sub-classes of
-    /// `GestureAction` during their construction phase.
-    /// ## `edge`
-    /// the `GestureTriggerEdge`
-    fn set_threshold_trigger_edge(&self, edge: GestureTriggerEdge);
-
-    /// The horizontal trigger distance to be used by the action to either
-    /// emit the `GestureAction::gesture-begin` signal or to emit
-    /// the `GestureAction::gesture-cancel` signal.
-    ///
-    /// A negative value will be interpreted as the default drag threshold.
-    fn get_property_threshold_trigger_distance_x(&self) -> f32;
-
-    /// The vertical trigger distance to be used by the action to either
-    /// emit the `GestureAction::gesture-begin` signal or to emit
-    /// the `GestureAction::gesture-cancel` signal.
-    ///
-    /// A negative value will be interpreted as the default drag threshold.
-    fn get_property_threshold_trigger_distance_y(&self) -> f32;
-
-    /// The ::gesture_begin signal is emitted when the `Actor` to which
-    /// a `GestureAction` has been applied starts receiving a gesture.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the gesture should start, and `false` if
-    ///  the gesture should be ignored.
-    fn connect_gesture_begin<F: Fn(&Self, &Actor) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    /// The ::gesture-cancel signal is emitted when the ongoing gesture gets
-    /// cancelled from the `GestureAction::gesture-progress` signal handler.
-    ///
-    /// This signal is emitted if and only if the `GestureAction::gesture-begin`
-    /// signal has been emitted first.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    fn connect_gesture_cancel<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::gesture-end signal is emitted at the end of the gesture gesture,
-    /// when the pointer's button is released
-    ///
-    /// This signal is emitted if and only if the `GestureAction::gesture-begin`
-    /// signal has been emitted first.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    fn connect_gesture_end<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::gesture-progress signal is emitted for each motion event after
-    /// the `GestureAction::gesture-begin` signal has been emitted.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the gesture should continue, and `false` if
-    ///  the gesture should be cancelled.
-    fn connect_gesture_progress<F: Fn(&Self, &Actor) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_n_touch_points_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<GestureAction>> GestureActionExt for O {
-    fn cancel(&self) {
-        unsafe {
-            ffi::clutter_gesture_action_cancel(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn get_device(&self, point: u32) -> Option<InputDevice> {
-        unsafe {
-            from_glib_none(ffi::clutter_gesture_action_get_device(
-                self.as_ref().to_glib_none().0,
-                point,
-            ))
-        }
-    }
-
-    fn get_last_event(&self, point: u32) -> Option<Event> {
-        unsafe {
-            from_glib_none(ffi::clutter_gesture_action_get_last_event(
-                self.as_ref().to_glib_none().0,
-                point,
-            ))
-        }
-    }
-
-    fn get_motion_coords(&self, point: u32) -> (f32, f32) {
-        unsafe {
-            let mut motion_x = mem::MaybeUninit::uninit();
-            let mut motion_y = mem::MaybeUninit::uninit();
-            ffi::clutter_gesture_action_get_motion_coords(
-                self.as_ref().to_glib_none().0,
-                point,
-                motion_x.as_mut_ptr(),
-                motion_y.as_mut_ptr(),
-            );
-            let motion_x = motion_x.assume_init();
-            let motion_y = motion_y.assume_init();
-            (motion_x, motion_y)
-        }
-    }
-
-    fn get_motion_delta(&self, point: u32) -> (f32, f32, f32) {
-        unsafe {
-            let mut delta_x = mem::MaybeUninit::uninit();
-            let mut delta_y = mem::MaybeUninit::uninit();
-            let ret = ffi::clutter_gesture_action_get_motion_delta(
-                self.as_ref().to_glib_none().0,
-                point,
-                delta_x.as_mut_ptr(),
-                delta_y.as_mut_ptr(),
-            );
-            let delta_x = delta_x.assume_init();
-            let delta_y = delta_y.assume_init();
-            (ret, delta_x, delta_y)
-        }
-    }
-
-    fn get_n_current_points(&self) -> u32 {
-        unsafe { ffi::clutter_gesture_action_get_n_current_points(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_n_touch_points(&self) -> i32 {
-        unsafe { ffi::clutter_gesture_action_get_n_touch_points(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_press_coords(&self, point: u32) -> (f32, f32) {
-        unsafe {
-            let mut press_x = mem::MaybeUninit::uninit();
-            let mut press_y = mem::MaybeUninit::uninit();
-            ffi::clutter_gesture_action_get_press_coords(
-                self.as_ref().to_glib_none().0,
-                point,
-                press_x.as_mut_ptr(),
-                press_y.as_mut_ptr(),
-            );
-            let press_x = press_x.assume_init();
-            let press_y = press_y.assume_init();
-            (press_x, press_y)
-        }
-    }
-
-    fn get_release_coords(&self, point: u32) -> (f32, f32) {
-        unsafe {
-            let mut release_x = mem::MaybeUninit::uninit();
-            let mut release_y = mem::MaybeUninit::uninit();
-            ffi::clutter_gesture_action_get_release_coords(
-                self.as_ref().to_glib_none().0,
-                point,
-                release_x.as_mut_ptr(),
-                release_y.as_mut_ptr(),
-            );
-            let release_x = release_x.assume_init();
-            let release_y = release_y.assume_init();
-            (release_x, release_y)
-        }
-    }
-
-    fn get_sequence(&self, point: u32) -> Option<EventSequence> {
-        unsafe {
-            from_glib_none(ffi::clutter_gesture_action_get_sequence(
-                self.as_ref().to_glib_none().0,
-                point,
-            ))
-        }
-    }
-
-    fn get_threshold_trigger_distance(&self) -> (f32, f32) {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            ffi::clutter_gesture_action_get_threshold_trigger_distance(
-                self.as_ref().to_glib_none().0,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-            );
-            let x = x.assume_init();
-            let y = y.assume_init();
-            (x, y)
-        }
-    }
-
-    fn get_threshold_trigger_edge(&self) -> GestureTriggerEdge {
-        unsafe {
-            from_glib(ffi::clutter_gesture_action_get_threshold_trigger_edge(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_velocity(&self, point: u32) -> (f32, f32, f32) {
-        unsafe {
-            let mut velocity_x = mem::MaybeUninit::uninit();
-            let mut velocity_y = mem::MaybeUninit::uninit();
-            let ret = ffi::clutter_gesture_action_get_velocity(
-                self.as_ref().to_glib_none().0,
-                point,
-                velocity_x.as_mut_ptr(),
-                velocity_y.as_mut_ptr(),
-            );
-            let velocity_x = velocity_x.assume_init();
-            let velocity_y = velocity_y.assume_init();
-            (ret, velocity_x, velocity_y)
-        }
-    }
-
-    fn set_n_touch_points(&self, nb_points: i32) {
-        unsafe {
-            ffi::clutter_gesture_action_set_n_touch_points(
-                self.as_ref().to_glib_none().0,
-                nb_points,
-            );
-        }
-    }
-
-    fn set_threshold_trigger_distance(&self, x: f32, y: f32) {
-        unsafe {
-            ffi::clutter_gesture_action_set_threshold_trigger_distance(
-                self.as_ref().to_glib_none().0,
-                x,
-                y,
-            );
-        }
-    }
-
-    fn set_threshold_trigger_edge(&self, edge: GestureTriggerEdge) {
-        unsafe {
-            ffi::clutter_gesture_action_set_threshold_trigger_edge(
-                self.as_ref().to_glib_none().0,
-                edge.to_glib(),
-            );
-        }
-    }
-
-    fn get_property_threshold_trigger_distance_x(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"threshold-trigger-distance-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `threshold-trigger-distance-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_threshold_trigger_distance_y(&self) -> f32 {
-        unsafe {
-            let mut value = Value::from_type(<f32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"threshold-trigger-distance-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `threshold-trigger-distance-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn connect_gesture_begin<F: Fn(&Self, &Actor) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn gesture_begin_trampoline<P, F: Fn(&P, &Actor) -> bool + 'static>(
-            this: *mut ffi::ClutterGestureAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<GestureAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &GestureAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"gesture-begin\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    gesture_begin_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_gesture_cancel<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn gesture_cancel_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterGestureAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GestureAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &GestureAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"gesture-cancel\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    gesture_cancel_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_gesture_end<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn gesture_end_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterGestureAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GestureAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &GestureAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"gesture-end\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    gesture_end_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_gesture_progress<F: Fn(&Self, &Actor) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn gesture_progress_trampoline<P, F: Fn(&P, &Actor) -> bool + 'static>(
-            this: *mut ffi::ClutterGestureAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<GestureAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &GestureAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"gesture-progress\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    gesture_progress_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_n_touch_points_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_n_touch_points_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterGestureAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GestureAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&GestureAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::n-touch-points\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_n_touch_points_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for GestureAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "GestureAction")
-    }
-}
diff --git a/src/legacy/grid_layout.rs b/src/legacy/grid_layout.rs
deleted file mode 100644
index 10af081..0000000
--- a/src/legacy/grid_layout.rs
+++ /dev/null
@@ -1,488 +0,0 @@
-use crate::{Actor, GridPosition, LayoutManager, Orientation};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct GridLayout(Object<ffi::ClutterGridLayout, ffi::ClutterGridLayoutClass, GridLayoutClass>) @extends LayoutManager, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_grid_layout_get_type(),
-    }
-}
-
-impl GridLayout {
-    /// Creates a new `GridLayout`
-    ///
-    /// # Returns
-    ///
-    /// the new `GridLayout`
-    pub fn new() -> GridLayout {
-        unsafe { LayoutManager::from_glib_none(ffi::clutter_grid_layout_new()).unsafe_cast() }
-    }
-}
-
-impl Default for GridLayout {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `GridLayout` methods.
-///
-/// # Implementors
-///
-/// [`GridLayout`](struct.GridLayout.html)
-pub trait GridLayoutExt: 'static {
-    /// Adds a widget to the grid.
-    ///
-    /// The position of `child` is determined by `left` and `top`. The
-    /// number of 'cells' that `child` will occupy is determined by
-    /// `width` and `height`.
-    /// ## `child`
-    /// the `Actor` to add
-    /// ## `left`
-    /// the column number to attach the left side of `child` to
-    /// ## `top`
-    /// the row number to attach the top side of `child` to
-    /// ## `width`
-    /// the number of columns that `child` will span
-    /// ## `height`
-    /// the number of rows that `child` will span
-    fn attach<P: IsA<Actor>>(&self, child: &P, left: i32, top: i32, width: i32, height: i32);
-
-    /// Adds a actor to the grid.
-    ///
-    /// The actor is placed next to `sibling`, on the side determined by
-    /// `side`. When `sibling` is `None`, the actor is placed in row (for
-    /// left or right placement) or column 0 (for top or bottom placement),
-    /// at the end indicated by `side`.
-    ///
-    /// Attaching widgets labeled [1], [2], [3] with `sibling` == `None` and
-    /// `side` == `GridPosition::Left` yields a layout of [3][2][1].
-    /// ## `child`
-    /// the actor to add
-    /// ## `sibling`
-    /// the child of `self` that `child` will be placed
-    ///  next to, or `None` to place `child` at the beginning or end
-    /// ## `side`
-    /// the side of `sibling` that `child` is positioned next to
-    /// ## `width`
-    /// the number of columns that `child` will span
-    /// ## `height`
-    /// the number of rows that `child` will span
-    fn attach_next_to<P: IsA<Actor>, Q: IsA<Actor>>(
-        &self,
-        child: &P,
-        sibling: Option<&Q>,
-        side: GridPosition,
-        width: i32,
-        height: i32,
-    );
-
-    /// Gets the child of `self` whose area covers the grid
-    /// cell whose upper left corner is at `left`, `top`.
-    /// ## `left`
-    /// the left edge of the cell
-    /// ## `top`
-    /// the top edge of the cell
-    ///
-    /// # Returns
-    ///
-    /// the child at the given position, or `None`
-    fn get_child_at(&self, left: i32, top: i32) -> Option<Actor>;
-
-    /// Returns whether all columns of `self` have the same width.
-    ///
-    /// # Returns
-    ///
-    /// whether all columns of `self` have the same width.
-    fn get_column_homogeneous(&self) -> bool;
-
-    /// Retrieves the spacing set using `GridLayoutExt::set_column_spacing`
-    ///
-    /// # Returns
-    ///
-    /// the spacing between coluns of `self`
-    fn get_column_spacing(&self) -> u32;
-
-    /// Retrieves the orientation of the `self`.
-    ///
-    /// # Returns
-    ///
-    /// the orientation of the layout
-    fn get_orientation(&self) -> Orientation;
-
-    /// Returns whether all rows of `self` have the same height.
-    ///
-    /// # Returns
-    ///
-    /// whether all rows of `self` have the same height.
-    fn get_row_homogeneous(&self) -> bool;
-
-    /// Retrieves the spacing set using `GridLayoutExt::set_row_spacing`
-    ///
-    /// # Returns
-    ///
-    /// the spacing between rows of `self`
-    fn get_row_spacing(&self) -> u32;
-
-    /// Inserts a column at the specified position.
-    ///
-    /// Children which are attached at or to the right of this position
-    /// are moved one column to the right. Children which span across this
-    /// position are grown to span the new column.
-    /// ## `position`
-    /// the position to insert the column at
-    fn insert_column(&self, position: i32);
-
-    /// Inserts a row or column at the specified position.
-    ///
-    /// The new row or column is placed next to `sibling`, on the side
-    /// determined by `side`. If `side` is `GridPosition::Left` or
-    /// `GridPosition::Bottom`, a row is inserted. If `side` is
-    /// `GridPosition::Left` of `GridPosition::Right`,
-    /// a column is inserted.
-    /// ## `sibling`
-    /// the child of `self` that the new row or column will be
-    ///  placed next to
-    /// ## `side`
-    /// the side of `sibling` that `child` is positioned next to
-    fn insert_next_to<P: IsA<Actor>>(&self, sibling: &P, side: GridPosition);
-
-    /// Inserts a row at the specified position.
-    ///
-    /// Children which are attached at or below this position
-    /// are moved one row down. Children which span across this
-    /// position are grown to span the new row.
-    /// ## `position`
-    /// the position to insert the row at
-    fn insert_row(&self, position: i32);
-
-    /// Sets whether all columns of `self` will have the same width.
-    /// ## `homogeneous`
-    /// `true` to make columns homogeneous
-    fn set_column_homogeneous(&self, homogeneous: bool);
-
-    /// Sets the spacing between columns of `self`
-    /// ## `spacing`
-    /// the spacing between columns of the layout, in pixels
-    fn set_column_spacing(&self, spacing: u32);
-
-    /// Sets the orientation of the `self`.
-    ///
-    /// `GridLayout` uses the orientation as a hint when adding
-    /// children to the `Actor` using it as a layout manager via
-    /// `ActorExt::add_child`; changing this value will not have
-    /// any effect on children that are already part of the layout.
-    /// ## `orientation`
-    /// the orientation of the `GridLayout`
-    fn set_orientation(&self, orientation: Orientation);
-
-    /// Sets whether all rows of `self` will have the same height.
-    /// ## `homogeneous`
-    /// `true` to make rows homogeneous
-    fn set_row_homogeneous(&self, homogeneous: bool);
-
-    /// Sets the spacing between rows of `self`
-    /// ## `spacing`
-    /// the spacing between rows of the layout, in pixels
-    fn set_row_spacing(&self, spacing: u32);
-
-    fn connect_property_column_homogeneous_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_column_spacing_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_orientation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_row_homogeneous_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_row_spacing_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<GridLayout>> GridLayoutExt for O {
-    fn attach<P: IsA<Actor>>(&self, child: &P, left: i32, top: i32, width: i32, height: i32) {
-        unsafe {
-            ffi::clutter_grid_layout_attach(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                left,
-                top,
-                width,
-                height,
-            );
-        }
-    }
-
-    fn attach_next_to<P: IsA<Actor>, Q: IsA<Actor>>(
-        &self,
-        child: &P,
-        sibling: Option<&Q>,
-        side: GridPosition,
-        width: i32,
-        height: i32,
-    ) {
-        unsafe {
-            ffi::clutter_grid_layout_attach_next_to(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-                sibling.map(|p| p.as_ref()).to_glib_none().0,
-                side.to_glib(),
-                width,
-                height,
-            );
-        }
-    }
-
-    fn get_child_at(&self, left: i32, top: i32) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_grid_layout_get_child_at(
-                self.as_ref().to_glib_none().0,
-                left,
-                top,
-            ))
-        }
-    }
-
-    fn get_column_homogeneous(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_grid_layout_get_column_homogeneous(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_column_spacing(&self) -> u32 {
-        unsafe { ffi::clutter_grid_layout_get_column_spacing(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_orientation(&self) -> Orientation {
-        unsafe {
-            from_glib(ffi::clutter_grid_layout_get_orientation(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_row_homogeneous(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_grid_layout_get_row_homogeneous(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_row_spacing(&self) -> u32 {
-        unsafe { ffi::clutter_grid_layout_get_row_spacing(self.as_ref().to_glib_none().0) }
-    }
-
-    fn insert_column(&self, position: i32) {
-        unsafe {
-            ffi::clutter_grid_layout_insert_column(self.as_ref().to_glib_none().0, position);
-        }
-    }
-
-    fn insert_next_to<P: IsA<Actor>>(&self, sibling: &P, side: GridPosition) {
-        unsafe {
-            ffi::clutter_grid_layout_insert_next_to(
-                self.as_ref().to_glib_none().0,
-                sibling.as_ref().to_glib_none().0,
-                side.to_glib(),
-            );
-        }
-    }
-
-    fn insert_row(&self, position: i32) {
-        unsafe {
-            ffi::clutter_grid_layout_insert_row(self.as_ref().to_glib_none().0, position);
-        }
-    }
-
-    fn set_column_homogeneous(&self, homogeneous: bool) {
-        unsafe {
-            ffi::clutter_grid_layout_set_column_homogeneous(
-                self.as_ref().to_glib_none().0,
-                homogeneous.to_glib(),
-            );
-        }
-    }
-
-    fn set_column_spacing(&self, spacing: u32) {
-        unsafe {
-            ffi::clutter_grid_layout_set_column_spacing(self.as_ref().to_glib_none().0, spacing);
-        }
-    }
-
-    fn set_orientation(&self, orientation: Orientation) {
-        unsafe {
-            ffi::clutter_grid_layout_set_orientation(
-                self.as_ref().to_glib_none().0,
-                orientation.to_glib(),
-            );
-        }
-    }
-
-    fn set_row_homogeneous(&self, homogeneous: bool) {
-        unsafe {
-            ffi::clutter_grid_layout_set_row_homogeneous(
-                self.as_ref().to_glib_none().0,
-                homogeneous.to_glib(),
-            );
-        }
-    }
-
-    fn set_row_spacing(&self, spacing: u32) {
-        unsafe {
-            ffi::clutter_grid_layout_set_row_spacing(self.as_ref().to_glib_none().0, spacing);
-        }
-    }
-
-    fn connect_property_column_homogeneous_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_column_homogeneous_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterGridLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GridLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&GridLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::column-homogeneous\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_column_homogeneous_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_column_spacing_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_column_spacing_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterGridLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GridLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&GridLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::column-spacing\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_column_spacing_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_orientation_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_orientation_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterGridLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GridLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&GridLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::orientation\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_orientation_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_row_homogeneous_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_row_homogeneous_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterGridLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GridLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&GridLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::row-homogeneous\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_row_homogeneous_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_row_spacing_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_row_spacing_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterGridLayout,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<GridLayout>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&GridLayout::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::row-spacing\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_row_spacing_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for GridLayout {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "GridLayout")
-    }
-}
diff --git a/src/legacy/group.rs b/src/legacy/group.rs
deleted file mode 100644
index 1dc2b39..0000000
--- a/src/legacy/group.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-// Scriptable
-use crate::{Actor, Animatable, Container};
-use glib::{object as gobject, translate::*};
-use std::fmt;
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct Group(Object<ffi::ClutterGroup, ffi::ClutterGroupClass, GroupClass>) @extends Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_group_get_type(),
-    }
-}
-
-impl Group {}
-
-impl fmt::Display for Group {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Group")
-    }
-}
diff --git a/src/legacy/image.rs b/src/legacy/image.rs
deleted file mode 100644
index 5f2e876..0000000
--- a/src/legacy/image.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-use crate::Content;
-use glib::{object::IsA, translate::*};
-use std::{fmt, ptr};
-
-glib_wrapper! {
-    pub struct Image(Object<ffi::ClutterImage, ffi::ClutterImageClass, ImageClass>) @implements Content;
-
-    match fn {
-        get_type => || ffi::clutter_image_get_type(),
-    }
-}
-
-impl Image {
-    /// Creates a new `Image` instance.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Image` instance.
-    ///  Use `gobject::ObjectExt::unref` when done.
-    pub fn new() -> Option<Content> {
-        unsafe { from_glib_full(ffi::clutter_image_new()) }
-    }
-}
-
-// impl Default for Image {
-//     fn default() -> Self {
-//         Self::new()
-//     }
-// }
-
-/// Trait containing all `Image` methods.
-///
-/// # Implementors
-///
-/// [`Image`](struct.Image.html)
-pub trait ImageExt: 'static {
-    //fn set_area(&self, data: &[u8], pixel_format: dx::PixelFormat, rect: &cairo::RectangleInt, row_stride: u32) -> Result<(), glib::Error>;
-
-    /// Sets the image data stored inside a `glib::Bytes` to be displayed by `self`.
-    ///
-    /// If the image data was successfully loaded, the `self` will be invalidated.
-    ///
-    /// In case of error, the `error` value will be set, and this function will
-    /// return `false`.
-    ///
-    /// The image data contained inside the `glib::Bytes` is copied in texture memory,
-    /// and no additional reference is acquired on the `data`.
-    /// ## `data`
-    /// the image data, as a `glib::Bytes`
-    /// ## `pixel_format`
-    /// the Cogl pixel format of the image data
-    /// ## `width`
-    /// the width of the image data
-    /// ## `height`
-    /// the height of the image data
-    /// ## `row_stride`
-    /// the length of each row inside `data`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the image data was successfully loaded,
-    ///  and `false` otherwise.
-    fn set_bytes(
-        &self,
-        data: &glib::Bytes,
-        pixel_format: dx::PixelFormat,
-        width: u32,
-        height: u32,
-        row_stride: u32,
-    ) -> Result<(), glib::Error>;
-
-    //fn set_data(&self, data: &[u8], pixel_format: dx::PixelFormat, width: u32, height: u32, row_stride: u32) -> Result<(), glib::Error>;
-}
-
-impl<O: IsA<Image>> ImageExt for O {
-    //fn set_area(&self, data: &[u8], pixel_format: dx::PixelFormat, rect: &cairo::RectangleInt, row_stride: u32) -> Result<(), glib::Error> {
-    //    unsafe { TODO: call clutter_sys:clutter_image_set_area() }
-    //}
-
-    fn set_bytes(
-        &self,
-        data: &glib::Bytes,
-        pixel_format: dx::PixelFormat,
-        width: u32,
-        height: u32,
-        row_stride: u32,
-    ) -> Result<(), glib::Error> {
-        unsafe {
-            let mut error = ptr::null_mut();
-            let _ = ffi::clutter_image_set_bytes(
-                self.as_ref().to_glib_none().0,
-                data.to_glib_none().0,
-                pixel_format.to_glib(),
-                width,
-                height,
-                row_stride,
-                &mut error,
-            );
-            if error.is_null() {
-                Ok(())
-            } else {
-                Err(from_glib_full(error))
-            }
-        }
-    }
-
-    //fn set_data(&self, data: &[u8], pixel_format: dx::PixelFormat, width: u32, height: u32, row_stride: u32) -> Result<(), glib::Error> {
-    //    unsafe { TODO: call clutter_sys:clutter_image_set_data() }
-    //}
-}
-
-impl fmt::Display for Image {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Image")
-    }
-}
diff --git a/src/legacy/input_device.rs b/src/legacy/input_device.rs
deleted file mode 100644
index 5391414..0000000
--- a/src/legacy/input_device.rs
+++ /dev/null
@@ -1,629 +0,0 @@
-use crate::{
-    Actor, Backend, DeviceManager, Event, EventSequence, InputAxis, InputDeviceType, InputMode,
-    ModifierType, Stage,
-};
-use glib::{
-    object::{IsA, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString, StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-// InternalPoint
-
-glib_wrapper! {
-    pub struct InputDevice(Object<ffi::ClutterInputDevice, ffi::ClutterInputDeviceClass, InputDeviceClass>);
-
-    match fn {
-        get_type => || ffi::clutter_input_device_get_type(),
-    }
-}
-
-impl InputDevice {
-    /// Retrieves a pointer to the `InputDevice` that has been
-    /// associated to `self`.
-    ///
-    /// If the `InputDevice:device-mode` property of `self` is
-    /// set to `InputMode::Master`, this function will return
-    /// `None`.
-    ///
-    /// # Returns
-    ///
-    /// a `InputDevice`, or `None`
-    pub fn get_associated_device(&self) -> Option<InputDevice> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_get_associated_device(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the type of axis on `self` at the given index.
-    /// ## `index_`
-    /// the index of the axis
-    ///
-    /// # Returns
-    ///
-    /// the axis type
-    pub fn get_axis(&self, index_: u32) -> InputAxis {
-        unsafe {
-            from_glib(ffi::clutter_input_device_get_axis(
-                self.to_glib_none().0,
-                index_,
-            ))
-        }
-    }
-
-    //pub fn get_axis_value(&self, axes: &[f64], axis: InputAxis) -> Option<f64> {
-    //    unsafe { TODO: call clutter_sys:clutter_input_device_get_axis_value() }
-    //}
-
-    // /// Retrieves the latest coordinates of a pointer or touch point of
-    // /// `self`.
-    // /// ## `sequence`
-    // /// a `EventSequence`, or `None` if
-    // ///  the device is not touch-based
-    // /// ## `point`
-    // /// return location for the pointer
-    // ///  or touch point
-    // ///
-    // /// # Returns
-    // ///
-    // /// `false` if the device's sequence hasn't been found,
-    // ///  and `true` otherwise.
-    // pub fn get_coords(&self, sequence: Option<&mut EventSequence>) -> Option<Point> {
-    //     unsafe {
-    //         let mut point = Point::uninitialized();
-    //         let ret = from_glib(ffi::clutter_input_device_get_coords(
-    //             self.to_glib_none().0,
-    //             sequence.to_glib_none_mut().0,
-    //             point.to_glib_none_mut().0,
-    //         ));
-    //         if ret {
-    //             Some(point)
-    //         } else {
-    //             None
-    //         }
-    //     }
-    // }
-
-    /// Retrieves the unique identifier of `self`
-    ///
-    /// # Returns
-    ///
-    /// the identifier of the device
-    pub fn get_device_id(&self) -> i32 {
-        unsafe { ffi::clutter_input_device_get_device_id(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the `InputMode` of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the device mode
-    pub fn get_device_mode(&self) -> InputMode {
-        unsafe {
-            from_glib(ffi::clutter_input_device_get_device_mode(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the name of the `self`
-    ///
-    /// # Returns
-    ///
-    /// the name of the device, or `None`. The returned string
-    ///  is owned by the `InputDevice` and should never be modified
-    ///  or freed
-    pub fn get_device_name(&self) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_get_device_name(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the type of `self`
-    ///
-    /// # Returns
-    ///
-    /// the type of the device
-    pub fn get_device_type(&self) -> InputDeviceType {
-        unsafe {
-            from_glib(ffi::clutter_input_device_get_device_type(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves whether `self` is enabled.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the device is enabled
-    pub fn get_enabled(&self) -> bool {
-        unsafe { from_glib(ffi::clutter_input_device_get_enabled(self.to_glib_none().0)) }
-    }
-
-    /// Retrieves a pointer to the `Actor` currently grabbing all
-    /// the events coming from `self`.
-    ///
-    /// # Returns
-    ///
-    /// a `Actor`, or `None`
-    pub fn get_grabbed_actor(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_get_grabbed_actor(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves whether `self` has a pointer that follows the
-    /// device motion.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the device has a cursor
-    pub fn get_has_cursor(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_input_device_get_has_cursor(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the key set using `InputDevice::set_key`
-    /// ## `index_`
-    /// the index of the key
-    /// ## `keyval`
-    /// return location for the keyval at `index_`
-    /// ## `modifiers`
-    /// return location for the modifiers at `index_`
-    ///
-    /// # Returns
-    ///
-    /// `true` if a key was set at the given index
-    pub fn get_key(&self, index_: u32) -> Option<(u32, ModifierType)> {
-        unsafe {
-            let mut keyval = mem::MaybeUninit::uninit();
-            let mut modifiers = mem::MaybeUninit::uninit();
-            let ret = from_glib(ffi::clutter_input_device_get_key(
-                self.to_glib_none().0,
-                index_,
-                keyval.as_mut_ptr(),
-                modifiers.as_mut_ptr(),
-            ));
-            let keyval = keyval.assume_init();
-            let modifiers = modifiers.assume_init();
-            if ret {
-                Some((keyval, from_glib(modifiers)))
-            } else {
-                None
-            }
-        }
-    }
-
-    /// Retrieves the current modifiers state of the device, as seen
-    /// by the last event processed.
-    ///
-    /// # Returns
-    ///
-    /// the last known modifier state
-    pub fn get_modifier_state(&self) -> ModifierType {
-        unsafe {
-            from_glib(ffi::clutter_input_device_get_modifier_state(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the number of axes available on `self`.
-    ///
-    /// # Returns
-    ///
-    /// the number of axes on the device
-    pub fn get_n_axes(&self) -> u32 {
-        unsafe { ffi::clutter_input_device_get_n_axes(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the number of keys registered for `self`.
-    ///
-    /// # Returns
-    ///
-    /// the number of registered keys
-    pub fn get_n_keys(&self) -> u32 {
-        unsafe { ffi::clutter_input_device_get_n_keys(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the `Actor` underneath the pointer of `self`
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the `Actor` or `None`
-    pub fn get_pointer_actor(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_get_pointer_actor(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the `Stage` underneath the pointer of `self`
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the `Stage` or `None`
-    pub fn get_pointer_stage(&self) -> Option<Stage> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_get_pointer_stage(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Gets the product ID of this device.
-    ///
-    /// # Returns
-    ///
-    /// the product ID
-    pub fn get_product_id(&self) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_get_product_id(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Retrieves the slave devices attached to `self`.
-    ///
-    /// # Returns
-    ///
-    /// a
-    ///  list of `InputDevice`, or `None`. The contents of the list are
-    ///  owned by the device. Use `glib::List::free` when done
-    pub fn get_slave_devices(&self) -> Vec<InputDevice> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_input_device_get_slave_devices(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Gets the vendor ID of this device.
-    ///
-    /// # Returns
-    ///
-    /// the vendor ID
-    pub fn get_vendor_id(&self) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_get_vendor_id(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Acquires a grab on `actor` for the given `self`.
-    ///
-    /// Any event coming from `self` will be delivered to `actor`, bypassing
-    /// the usual event delivery mechanism, until the grab is released by
-    /// calling `InputDevice::ungrab`.
-    ///
-    /// The grab is client-side: even if the windowing system used by the
-    /// backend has the concept of "device grabs", it will not use them.
-    ///
-    /// Only `InputDevice` of types `InputDeviceType::PointerDevice` and
-    /// `InputDeviceType::KeyboardDevice` can hold a grab.
-    /// ## `actor`
-    /// a `Actor`
-    pub fn grab<P: IsA<Actor>>(&self, actor: &P) {
-        unsafe {
-            ffi::clutter_input_device_grab(self.to_glib_none().0, actor.as_ref().to_glib_none().0);
-        }
-    }
-
-    // /// Translates a hardware keycode from a `KeyEvent` to the
-    // /// equivalent evdev keycode. Note that depending on the input backend
-    // /// used by this function can fail if there is no obvious
-    // /// mapping between the key codes. The hardware keycode can be taken
-    // /// from the `KeyEvent.hardware_keycode` member of `KeyEvent`.
-    // /// ## `hardware_keycode`
-    // /// The hardware keycode from a `KeyEvent`
-    // /// ## `evdev_keycode`
-    // /// The return location for the evdev keycode
-    // ///
-    // /// # Returns
-    // ///
-    // /// `true` if the conversion succeeded, `false` otherwise.
-    // pub fn keycode_to_evdev(&self, hardware_keycode: u32, evdev_keycode: u32) -> bool {
-    //     unsafe {
-    //         from_glib(ffi::clutter_input_device_keycode_to_evdev(
-    //             self.to_glib_none().0,
-    //             hardware_keycode,
-    //             evdev_keycode,
-    //         ))
-    //     }
-    // }
-
-    /// Retrieves a pointer to the `Actor` currently grabbing the
-    /// touch events coming from `self` given the `sequence`.
-    /// ## `sequence`
-    /// a `EventSequence`
-    ///
-    /// # Returns
-    ///
-    /// a `Actor`, or `None`
-    pub fn sequence_get_grabbed_actor(&self, sequence: &mut EventSequence) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_input_device_sequence_get_grabbed_actor(
-                self.to_glib_none().0,
-                sequence.to_glib_none_mut().0,
-            ))
-        }
-    }
-
-    /// Acquires a grab on `actor` for the given `self` and the given touch
-    /// `sequence`.
-    ///
-    /// Any touch event coming from `self` and from `sequence` will be
-    /// delivered to `actor`, bypassing the usual event delivery mechanism,
-    /// until the grab is released by calling
-    /// `InputDevice::sequence_ungrab`.
-    ///
-    /// The grab is client-side: even if the windowing system used by the
-    /// backend has the concept of "device grabs", it will not use them.
-    /// ## `sequence`
-    /// a `EventSequence`
-    /// ## `actor`
-    /// a `Actor`
-    pub fn sequence_grab<P: IsA<Actor>>(&self, sequence: &mut EventSequence, actor: &P) {
-        unsafe {
-            ffi::clutter_input_device_sequence_grab(
-                self.to_glib_none().0,
-                sequence.to_glib_none_mut().0,
-                actor.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    /// Releases the grab on the `self` for the given `sequence`, if one is
-    /// in place.
-    /// ## `sequence`
-    /// a `EventSequence`
-    pub fn sequence_ungrab(&self, sequence: &mut EventSequence) {
-        unsafe {
-            ffi::clutter_input_device_sequence_ungrab(
-                self.to_glib_none().0,
-                sequence.to_glib_none_mut().0,
-            );
-        }
-    }
-
-    /// Enables or disables a `InputDevice`.
-    ///
-    /// Only devices with a `InputDevice:device-mode` property set
-    /// to `InputMode::Slave` or `InputMode::Floating` can
-    /// be disabled.
-    /// ## `enabled`
-    /// `true` to enable the `self`
-    pub fn set_enabled(&self, enabled: bool) {
-        unsafe {
-            ffi::clutter_input_device_set_enabled(self.to_glib_none().0, enabled.to_glib());
-        }
-    }
-
-    /// Sets the keyval and modifiers at the given `index_` for `self`.
-    ///
-    /// will use the keyval and modifiers set when filling out
-    /// an event coming from the same input device.
-    /// ## `index_`
-    /// the index of the key
-    /// ## `keyval`
-    /// the keyval
-    /// ## `modifiers`
-    /// a bitmask of modifiers
-    pub fn set_key(&self, index_: u32, keyval: u32, modifiers: ModifierType) {
-        unsafe {
-            ffi::clutter_input_device_set_key(
-                self.to_glib_none().0,
-                index_,
-                keyval,
-                modifiers.to_glib(),
-            );
-        }
-    }
-
-    /// Releases the grab on the `self`, if one is in place.
-    pub fn ungrab(&self) {
-        unsafe {
-            ffi::clutter_input_device_ungrab(self.to_glib_none().0);
-        }
-    }
-
-    /// Forcibly updates the state of the `self` using a `Event`
-    ///
-    /// This function should never be used by applications: it is meant
-    /// for integration with embedding toolkits, like clutter-gtk
-    ///
-    /// Embedding toolkits that disable the event collection inside
-    /// need to use this function to update the state of input devices depending
-    /// on a `Event` that they are going to submit to the event handling code
-    /// in it though `do_event`. Since the input devices hold the state
-    /// that is going to be used to fill in fields like the `ButtonEvent`
-    /// click count, or to emit synthesized events like `EventType::Enter` and
-    /// `EventType::Leave`, it is necessary for embedding toolkits to also be
-    /// responsible of updating the input device state.
-    ///
-    /// For instance, this might be the code to translate an embedding toolkit
-    /// native motion notification into a `MotionEvent` and ask
-    /// to process it:
-    ///
-    ///
-    /// ```text
-    ///   Event c_event;
-    ///
-    ///   translate_native_event_to_clutter (native_event, &c_event);
-    ///
-    ///   do_event (&c_event);
-    /// ```
-    ///
-    /// Before letting `do_event` process the event, it is necessary to call
-    /// `InputDevice::update_from_event`:
-    ///
-    ///
-    /// ```text
-    ///   Event c_event;
-    ///   DeviceManager *manager;
-    ///   InputDevice *device;
-    ///
-    ///   translate_native_event_to_clutter (native_event, &c_event);
-    ///
-    ///   // get the device manager
-    ///   manager = device_manager_get_default ();
-    ///
-    ///   // use the default Core Pointer that backends register by default
-    ///   device = device_manager_get_core_device (manager, %POINTER_DEVICE);
-    ///
-    ///   // update the state of the input device
-    ///   input_device_update_from_event (device, &c_event, FALSE);
-    ///
-    ///   do_event (&c_event);
-    /// ```
-    ///
-    /// The `update_stage` boolean argument should be used when the input device
-    /// enters and leaves a `Stage`; it will use the `Stage` field
-    /// of the passed `event` to update the stage associated to the input device.
-    /// ## `event`
-    /// a `Event`
-    /// ## `update_stage`
-    /// whether to update the `Stage` of the `self`
-    ///  using the stage of the event
-    pub fn update_from_event(&self, event: &mut Event, update_stage: bool) {
-        unsafe {
-            ffi::clutter_input_device_update_from_event(
-                self.to_glib_none().0,
-                event.to_glib_none_mut().0,
-                update_stage.to_glib(),
-            );
-        }
-    }
-
-    /// The `Backend` that created the device.
-    pub fn get_property_backend(&self) -> Option<Backend> {
-        unsafe {
-            let mut value = Value::from_type(<Backend as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"backend\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `backend` getter")
-        }
-    }
-
-    /// The `DeviceManager` instance which owns the device
-    pub fn get_property_device_manager(&self) -> Option<DeviceManager> {
-        unsafe {
-            let mut value = Value::from_type(<DeviceManager as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"device-manager\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `device-manager` getter")
-        }
-    }
-
-    /// The unique identifier of the device
-    pub fn get_property_id(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"id\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `id` getter")
-                .unwrap()
-        }
-    }
-
-    /// The name of the device
-    pub fn get_property_name(&self) -> Option<GString> {
-        unsafe {
-            let mut value = Value::from_type(<GString as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"name\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `name` getter")
-        }
-    }
-
-    pub fn connect_property_enabled_notify<F: Fn(&InputDevice) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_enabled_trampoline<F: Fn(&InputDevice) + 'static>(
-            this: *mut ffi::ClutterInputDevice,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::enabled\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_enabled_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_n_axes_notify<F: Fn(&InputDevice) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_n_axes_trampoline<F: Fn(&InputDevice) + 'static>(
-            this: *mut ffi::ClutterInputDevice,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::n-axes\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_n_axes_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for InputDevice {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "InputDevice")
-    }
-}
diff --git a/src/legacy/interval.rs b/src/legacy/interval.rs
deleted file mode 100644
index a6968c2..0000000
--- a/src/legacy/interval.rs
+++ /dev/null
@@ -1,388 +0,0 @@
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-// StaticType, Value,
-// use Scriptable;
-
-// TODO: , @implements Scriptable
-glib_wrapper! {
-    pub struct Interval(Object<ffi::ClutterInterval, ffi::ClutterIntervalClass, IntervalClass>) @extends gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_interval_get_type(),
-    }
-}
-
-impl Interval {
-    //pub fn new(gtype: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) -> Interval {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_new() }
-    //}
-
-    pub fn with_values(
-        gtype: glib::types::Type,
-        initial: Option<&glib::Value>,
-        final_: Option<&glib::Value>,
-    ) -> Interval {
-        unsafe {
-            from_glib_none(ffi::clutter_interval_new_with_values(
-                gtype.to_glib(),
-                initial.to_glib_none().0,
-                final_.to_glib_none().0,
-            ))
-        }
-    }
-
-    //pub fn register_progress_func<P: Fn(&glib::Value, &glib::Value, f64, &glib::Value) -> bool + 'static>(value_type: glib::types::Type, func: P) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_register_progress_func() }
-    //}
-}
-
-/// Trait containing all `Interval` methods.
-///
-/// # Implementors
-///
-/// [`Interval`](struct.Interval.html)
-pub trait IntervalExt: 'static {
-    /// Creates a copy of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Interval`
-    fn clone(&self) -> Option<Interval>;
-
-    /// Computes the value between the `self` boundaries given the
-    /// progress `factor`
-    ///
-    /// Unlike `IntervalExt::compute_value`, this function will
-    /// return a const pointer to the computed value
-    ///
-    /// You should use this function if you immediately pass the computed
-    /// value to another function that makes a copy of it, like
-    /// `gobject::ObjectExt::set_property`
-    /// ## `factor`
-    /// the progress factor, between 0 and 1
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the computed value,
-    ///  or `None` if the computation was not successfull
-    fn compute(&self, factor: f64) -> Option<glib::Value>;
-
-    /// Computes the value between the `self` boundaries given the
-    /// progress `factor` and copies it into `value`.
-    /// ## `factor`
-    /// the progress factor, between 0 and 1
-    /// ## `value`
-    /// return location for an initialized `gobject::Value`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the operation was successful
-    fn compute_value(&self, factor: f64) -> Option<glib::Value>;
-
-    /// Retrieves the final value of `self` and copies
-    /// it into `value`.
-    ///
-    /// The passed `gobject::Value` must be initialized to the value held by
-    /// the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn get_final_value(&self) -> glib::Value;
-
-    /// Retrieves the initial value of `self` and copies
-    /// it into `value`.
-    ///
-    /// The passed `gobject::Value` must be initialized to the value held by
-    /// the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn get_initial_value(&self) -> glib::Value;
-
-    //fn get_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Retrieves the `glib::Type` of the values inside `self`.
-    ///
-    /// # Returns
-    ///
-    /// the type of the value, or G_TYPE_INVALID
-    fn get_value_type(&self) -> glib::types::Type;
-
-    /// Checks if the `self` has a valid initial and final values.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `Interval` has an initial and
-    ///  final values, and `false` otherwise
-    fn is_valid(&self) -> bool;
-
-    /// Gets the pointer to the final value of `self`
-    ///
-    /// # Returns
-    ///
-    /// the final value of the interval.
-    ///  The value is owned by the `Interval` and it should not be
-    ///  modified or freed
-    fn peek_final_value(&self) -> Option<glib::Value>;
-
-    /// Gets the pointer to the initial value of `self`
-    ///
-    /// # Returns
-    ///
-    /// the initial value of the interval.
-    ///  The value is owned by the `Interval` and it should not be
-    ///  modified or freed
-    fn peek_initial_value(&self) -> Option<glib::Value>;
-
-    //fn set_final(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets the final value of `self` to `value`. The value is
-    /// copied inside the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn set_final_value(&self, value: &glib::Value);
-
-    //fn set_initial(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets the initial value of `self` to `value`. The value is copied
-    /// inside the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn set_initial_value(&self, value: &glib::Value);
-
-    //fn set_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    // /// Validates the initial and final values of `self` against
-    // /// a `gobject::ParamSpec`.
-    // /// ## `pspec`
-    // /// a `gobject::ParamSpec`
-    // ///
-    // /// # Returns
-    // ///
-    // /// `true` if the `Interval` is valid, `false` otherwise
-    // fn validate<P: IsA<glib::ParamSpec>>(&self, pspec: &P) -> bool;
-
-    // /// The final value of the interval.
-    // fn get_property_final(&self) -> Option<glib::Value>;
-
-    // /// The initial value of the interval.
-    // fn get_property_initial(&self) -> Option<glib::Value>;
-
-    fn connect_property_final_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_initial_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Interval>> IntervalExt for O {
-    fn clone(&self) -> Option<Interval> {
-        unsafe { from_glib_full(ffi::clutter_interval_clone(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn compute(&self, factor: f64) -> Option<glib::Value> {
-        unsafe {
-            from_glib_none(ffi::clutter_interval_compute(
-                self.as_ref().to_glib_none().0,
-                factor,
-            ))
-        }
-    }
-
-    fn compute_value(&self, factor: f64) -> Option<glib::Value> {
-        unsafe {
-            let mut value = glib::Value::uninitialized();
-            let ret = from_glib(ffi::clutter_interval_compute_value(
-                self.as_ref().to_glib_none().0,
-                factor,
-                value.to_glib_none_mut().0,
-            ));
-            if ret {
-                Some(value)
-            } else {
-                None
-            }
-        }
-    }
-
-    fn get_final_value(&self) -> glib::Value {
-        unsafe {
-            let mut value = glib::Value::uninitialized();
-            ffi::clutter_interval_get_final_value(
-                self.as_ref().to_glib_none().0,
-                value.to_glib_none_mut().0,
-            );
-            value
-        }
-    }
-
-    fn get_initial_value(&self) -> glib::Value {
-        unsafe {
-            let mut value = glib::Value::uninitialized();
-            ffi::clutter_interval_get_initial_value(
-                self.as_ref().to_glib_none().0,
-                value.to_glib_none_mut().0,
-            );
-            value
-        }
-    }
-
-    //fn get_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_get_interval() }
-    //}
-
-    fn get_value_type(&self) -> glib::types::Type {
-        unsafe {
-            from_glib(ffi::clutter_interval_get_value_type(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn is_valid(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_interval_is_valid(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn peek_final_value(&self) -> Option<glib::Value> {
-        unsafe {
-            from_glib_none(ffi::clutter_interval_peek_final_value(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn peek_initial_value(&self) -> Option<glib::Value> {
-        unsafe {
-            from_glib_none(ffi::clutter_interval_peek_initial_value(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    //fn set_final(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_set_final() }
-    //}
-
-    fn set_final_value(&self, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_interval_set_final_value(
-                self.as_ref().to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-
-    //fn set_initial(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_set_initial() }
-    //}
-
-    fn set_initial_value(&self, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_interval_set_initial_value(
-                self.as_ref().to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-
-    //fn set_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_set_interval() }
-    //}
-
-    // fn validate<P: IsA<glib::ParamSpec>>(&self, pspec: &P) -> bool {
-    //     unsafe {
-    //         from_glib(ffi::clutter_interval_validate(
-    //             self.as_ref().to_glib_none().0,
-    //             pspec.as_ref().to_glib_none().0,
-    //         ))
-    //     }
-    // }
-
-    // fn get_property_final(&self) -> Option<glib::Value> {
-    //     unsafe {
-    //         let mut value = Value::from_type(<glib::Value as StaticType>::static_type());
-    //         gobject_sys::g_object_get_property(
-    //             self.to_glib_none().0 as *mut gobject_sys::GObject,
-    //             b"final\0".as_ptr() as *const _,
-    //             value.to_glib_none_mut().0,
-    //         );
-    //         value
-    //             .get()
-    //             .expect("Return Value for property `final` getter")
-    //     }
-    // }
-
-    // fn get_property_initial(&self) -> Option<glib::Value> {
-    //     unsafe {
-    //         let mut value = Value::from_type(<glib::Value as StaticType>::static_type());
-    //         gobject_sys::g_object_get_property(
-    //             self.to_glib_none().0 as *mut gobject_sys::GObject,
-    //             b"initial\0".as_ptr() as *const _,
-    //             value.to_glib_none_mut().0,
-    //         );
-    //         value
-    //             .get()
-    //             .expect("Return Value for property `initial` getter")
-    //     }
-    // }
-
-    fn connect_property_final_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_final_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterInterval,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Interval>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Interval::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::final\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_final_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_initial_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_initial_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterInterval,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Interval>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Interval::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::initial\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_initial_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Interval {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Interval")
-    }
-}
diff --git a/src/legacy/keyframe_transition.rs b/src/legacy/keyframe_transition.rs
deleted file mode 100644
index 8cce589..0000000
--- a/src/legacy/keyframe_transition.rs
+++ /dev/null
@@ -1,188 +0,0 @@
-use glib::{
-    object::{Cast, IsA},
-    translate::*,
-};
-use std::{fmt, mem};
-// Scriptable
-use crate::{AnimationMode, PropertyTransition, Timeline, Transition};
-
-// TODO: , @implements Scriptable
-glib_wrapper! {
-    pub struct KeyframeTransition(Object<ffi::ClutterKeyframeTransition, ffi::ClutterKeyframeTransitionClass, KeyframeTransitionClass>) @extends PropertyTransition, Transition, Timeline;
-
-    match fn {
-        get_type => || ffi::clutter_keyframe_transition_get_type(),
-    }
-}
-
-impl KeyframeTransition {
-    /// Creates a new `KeyframeTransition` for `property_name`.
-    /// ## `property_name`
-    /// the property to animate
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated
-    ///  `KeyframeTransition` instance. Use `gobject::ObjectExt::unref` when
-    ///  done to free its resources.
-    pub fn new(property_name: &str) -> KeyframeTransition {
-        unsafe {
-            Transition::from_glib_full(ffi::clutter_keyframe_transition_new(
-                property_name.to_glib_none().0,
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-/// Trait containing all `KeyframeTransition` methods.
-///
-/// # Implementors
-///
-/// [`KeyframeTransition`](struct.KeyframeTransition.html)
-pub trait KeyframeTransitionExt: 'static {
-    /// Removes all key frames from `self`.
-    fn clear(&self);
-
-    /// Retrieves the details of the key frame at `index_` inside `self`.
-    ///
-    /// The `self` must already have key frames set, and `index_` must be
-    /// smaller than the number of key frames.
-    /// ## `index_`
-    /// the index of the key frame
-    /// ## `key`
-    /// return location for the key, or `None`
-    /// ## `mode`
-    /// return location for the easing mode, or `None`
-    /// ## `value`
-    /// a `gobject::Value` initialized with the type of
-    ///  the values
-    fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value);
-
-    /// Retrieves the number of key frames inside `self`.
-    ///
-    /// # Returns
-    ///
-    /// the number of key frames
-    fn get_n_key_frames(&self) -> u32;
-
-    //fn set(&self, gtype: glib::types::Type, n_key_frames: u32, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets the details of the key frame at `index_` inside `self`.
-    ///
-    /// The `self` must already have a key frame at `index_`, and `index_`
-    /// must be smaller than the number of key frames inside `self`.
-    /// ## `index_`
-    /// the index of the key frame
-    /// ## `key`
-    /// the key of the key frame
-    /// ## `mode`
-    /// the easing mode of the key frame
-    /// ## `value`
-    /// a `gobject::Value` containing the value of the key frame
-    fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value);
-
-    /// Sets the keys for each key frame inside `self`.
-    ///
-    /// If `self` does not hold any key frame, `n_key_frames` key frames
-    /// will be created; if `self` already has key frames, `key_frames` must
-    /// have at least as many elements as the number of key frames.
-    /// ## `n_key_frames`
-    /// the number of values
-    /// ## `key_frames`
-    /// an array of keys between 0.0
-    ///  and 1.0, one for each key frame
-    fn set_key_frames(&self, key_frames: &[f64]);
-
-    //fn set_modes(&self, modes: /*Unimplemented*/&CArray TypeId { ns_id: 1, id: 28 });
-
-    /// Sets the values for each key frame inside `self`.
-    ///
-    /// If `self` does not hold any key frame, `n_values` key frames will
-    /// be created; if `self` already has key frames, `values` must have
-    /// at least as many elements as the number of key frames.
-    /// ## `n_values`
-    /// the number of values
-    /// ## `values`
-    /// an array of values, one for each
-    ///  key frame
-    fn set_values(&self, values: &[&glib::Value]);
-}
-
-impl<O: IsA<KeyframeTransition>> KeyframeTransitionExt for O {
-    fn clear(&self) {
-        unsafe {
-            ffi::clutter_keyframe_transition_clear(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value) {
-        unsafe {
-            let mut key = mem::MaybeUninit::uninit();
-            let mut mode = mem::MaybeUninit::uninit();
-            let mut value = glib::Value::uninitialized();
-            ffi::clutter_keyframe_transition_get_key_frame(
-                self.as_ref().to_glib_none().0,
-                index_,
-                key.as_mut_ptr(),
-                mode.as_mut_ptr(),
-                value.to_glib_none_mut().0,
-            );
-            let key = key.assume_init();
-            let mode = mode.assume_init();
-            (key, from_glib(mode), value)
-        }
-    }
-
-    fn get_n_key_frames(&self) -> u32 {
-        unsafe { ffi::clutter_keyframe_transition_get_n_key_frames(self.as_ref().to_glib_none().0) }
-    }
-
-    //fn set(&self, gtype: glib::types::Type, n_key_frames: u32, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_keyframe_transition_set() }
-    //}
-
-    fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_keyframe_transition_set_key_frame(
-                self.as_ref().to_glib_none().0,
-                index_,
-                key,
-                mode.to_glib(),
-                value.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_key_frames(&self, key_frames: &[f64]) {
-        let n_key_frames = key_frames.len() as u32;
-        unsafe {
-            ffi::clutter_keyframe_transition_set_key_frames(
-                self.as_ref().to_glib_none().0,
-                n_key_frames,
-                key_frames.to_glib_none().0,
-            );
-        }
-    }
-
-    //fn set_modes(&self, modes: /*Unimplemented*/&CArray TypeId { ns_id: 1, id: 28 }) {
-    //    unsafe { TODO: call clutter_sys:clutter_keyframe_transition_set_modes() }
-    //}
-
-    fn set_values(&self, values: &[&glib::Value]) {
-        let n_values = values.len() as u32;
-        unsafe {
-            ffi::clutter_keyframe_transition_set_values(
-                self.as_ref().to_glib_none().0,
-                n_values,
-                values.to_glib_none().0,
-            );
-        }
-    }
-}
-
-impl fmt::Display for KeyframeTransition {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "KeyframeTransition")
-    }
-}
diff --git a/src/legacy/knot.rs b/src/legacy/knot.rs
deleted file mode 100644
index e5a19bd..0000000
--- a/src/legacy/knot.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use glib::translate::*;
-use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialOrd, Ord)] // Hash
-    pub struct Knot(Boxed<ffi::ClutterKnot>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_knot_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_knot_free(ptr),
-        get_type => || ffi::clutter_knot_get_type(),
-    }
-}
-
-impl Knot {
-    /// Compares to knot and checks if the point to the same location.
-    /// ## `knot_b`
-    /// Second knot
-    ///
-    /// # Returns
-    ///
-    /// `true` if the knots point to the same location.
-    fn equal(&self, knot_b: &Knot) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_knot_equal(
-                self.to_glib_none().0,
-                knot_b.to_glib_none().0,
-            ))
-        }
-    }
-}
-
-impl PartialEq for Knot {
-    #[inline]
-    fn eq(&self, other: &Self) -> bool {
-        self.equal(other)
-    }
-}
-
-impl Eq for Knot {}
-
-#[doc(hidden)]
-impl Uninitialized for Knot {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        mem::zeroed()
-    }
-}
diff --git a/src/legacy/layout_manager.rs b/src/legacy/layout_manager.rs
deleted file mode 100644
index 96abff2..0000000
--- a/src/legacy/layout_manager.rs
+++ /dev/null
@@ -1,381 +0,0 @@
-use crate::{Actor, ActorBox, AllocationFlags, Container, LayoutMeta};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct LayoutManager(Object<ffi::ClutterLayoutManager, ffi::ClutterLayoutManagerClass, LayoutManagerClass>) @extends gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_layout_manager_get_type(),
-    }
-}
-
-/// Trait containing all `LayoutManager` methods.
-///
-/// # Implementors
-///
-/// [`BinLayout`](struct.BinLayout.html), [`BoxLayout`](struct.BoxLayout.html), [`FixedLayout`](struct.FixedLayout.html), [`FlowLayout`](struct.FlowLayout.html), [`GridLayout`](struct.GridLayout.html), [`LayoutManager`](struct.LayoutManager.html)
-pub trait LayoutManagerExt: 'static {
-    /// Allocates the children of `container` given an area
-    ///
-    /// See also `ActorExt::allocate`
-    /// ## `container`
-    /// the `Container` using `self`
-    /// ## `allocation`
-    /// the `ActorBox` containing the allocated area
-    ///  of `container`
-    /// ## `flags`
-    /// the allocation flags
-    fn allocate<P: IsA<Container>>(
-        &self,
-        container: &P,
-        allocation: &ActorBox,
-        flags: AllocationFlags,
-    );
-
-    //fn child_get<P: IsA<Container>, Q: IsA<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Gets a property on the `LayoutMeta` created by `self` and
-    /// attached to a child of `container`
-    ///
-    /// The `gobject::Value` must already be initialized to the type of the property
-    /// and has to be unset with `gobject::Value::unset` after extracting the real
-    /// value out of it
-    /// ## `container`
-    /// a `Container` using `self`
-    /// ## `actor`
-    /// a `Actor` child of `container`
-    /// ## `property_name`
-    /// the name of the property to get
-    /// ## `value`
-    /// a `gobject::Value` with the value of the property to get
-    fn child_get_property<P: IsA<Container>, Q: IsA<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &mut glib::Value,
-    );
-
-    //fn child_set<P: IsA<Container>, Q: IsA<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets a property on the `LayoutMeta` created by `self` and
-    /// attached to a child of `container`
-    /// ## `container`
-    /// a `Container` using `self`
-    /// ## `actor`
-    /// a `Actor` child of `container`
-    /// ## `property_name`
-    /// the name of the property to set
-    /// ## `value`
-    /// a `gobject::Value` with the value of the property to set
-    fn child_set_property<P: IsA<Container>, Q: IsA<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &glib::Value,
-    );
-
-    /// Retrieves the `gobject::ParamSpec` for the layout property `name` inside
-    /// the `LayoutMeta` sub-class used by `self`
-    /// ## `name`
-    /// the name of the property
-    ///
-    /// # Returns
-    ///
-    /// a `gobject::ParamSpec` describing the property,
-    ///  or `None` if no property with that name exists. The returned
-    ///  `gobject::ParamSpec` is owned by the layout manager and should not be
-    ///  modified or freed
-    fn find_child_property(&self, name: &str) -> Option<glib::ParamSpec>;
-
-    /// Retrieves the `LayoutMeta` that the layout `self` associated
-    /// to the `actor` child of `container`, eventually by creating one if the
-    /// `LayoutManager` supports layout properties
-    /// ## `container`
-    /// a `Container` using `self`
-    /// ## `actor`
-    /// a `Actor` child of `container`
-    ///
-    /// # Returns
-    ///
-    /// a `LayoutMeta`, or `None` if the
-    ///  `LayoutManager` does not have layout properties. The returned
-    ///  layout meta instance is owned by the `LayoutManager` and it
-    ///  should not be unreferenced
-    fn get_child_meta<P: IsA<Container>, Q: IsA<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-    ) -> Option<LayoutMeta>;
-
-    /// Computes the minimum and natural heights of the `container` according
-    /// to `self`.
-    ///
-    /// See also `ActorExt::get_preferred_height`
-    /// ## `container`
-    /// the `Container` using `self`
-    /// ## `for_width`
-    /// the width for which the height should be computed, or -1
-    /// ## `min_height_p`
-    /// return location for the minimum height
-    ///  of the layout, or `None`
-    /// ## `nat_height_p`
-    /// return location for the natural height
-    ///  of the layout, or `None`
-    fn get_preferred_height<P: IsA<Container>>(&self, container: &P, for_width: f32) -> (f32, f32);
-
-    /// Computes the minimum and natural widths of the `container` according
-    /// to `self`.
-    ///
-    /// See also `ActorExt::get_preferred_width`
-    /// ## `container`
-    /// the `Container` using `self`
-    /// ## `for_height`
-    /// the height for which the width should be computed, or -1
-    /// ## `min_width_p`
-    /// return location for the minimum width
-    ///  of the layout, or `None`
-    /// ## `nat_width_p`
-    /// return location for the natural width
-    ///  of the layout, or `None`
-    fn get_preferred_width<P: IsA<Container>>(&self, container: &P, for_height: f32) -> (f32, f32);
-
-    /// Emits the `LayoutManager::layout-changed` signal on `self`
-    ///
-    /// This function should only be called by implementations of the
-    /// `LayoutManager` class
-    fn layout_changed(&self);
-
-    /// Retrieves all the `gobject::ParamSpec`<!-- -->s for the layout properties
-    /// stored inside the `LayoutMeta` sub-class used by `self`
-    /// ## `n_pspecs`
-    /// return location for the number of returned
-    ///  `gobject::ParamSpec`<!-- -->s
-    ///
-    /// # Returns
-    ///
-    /// the newly-allocated,
-    ///  `None`-terminated array of `gobject::ParamSpec`<!-- -->s. Use `g_free` to free the
-    ///  resources allocated for the array
-    fn list_child_properties(&self) -> Vec<glib::ParamSpec>;
-
-    /// If the `LayoutManager` sub-class allows it, allow
-    /// adding a weak reference of the `container` using `self`
-    /// from within the layout manager
-    ///
-    /// The layout manager should not increase the reference
-    /// count of the `container`
-    /// ## `container`
-    /// a `Container` using `self`
-    fn set_container<P: IsA<Container>>(&self, container: Option<&P>);
-
-    /// The ::layout-changed signal is emitted each time a layout manager
-    /// has been changed. Every `Actor` using the `manager` instance
-    /// as a layout manager should connect a handler to the ::layout-changed
-    /// signal and queue a relayout on themselves:
-    ///
-    ///
-    /// ```text
-    ///   static void layout_changed (LayoutManager *manager,
-    ///                               Actor         *self)
-    ///   {
-    ///     actor_queue_relayout (self);
-    ///   }
-    ///   ...
-    ///     self->manager = g_object_ref_sink (manager);
-    ///     g_signal_connect (self->manager, "layout-changed",
-    ///                       G_CALLBACK (layout_changed),
-    ///                       self);
-    /// ```
-    ///
-    /// Sub-classes of `LayoutManager` that implement a layout that
-    /// can be controlled or changed using parameters should emit the
-    /// ::layout-changed signal whenever one of the parameters changes,
-    /// by using `LayoutManagerExt::layout_changed`.
-    fn connect_layout_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<LayoutManager>> LayoutManagerExt for O {
-    fn allocate<P: IsA<Container>>(
-        &self,
-        container: &P,
-        allocation: &ActorBox,
-        flags: AllocationFlags,
-    ) {
-        unsafe {
-            ffi::clutter_layout_manager_allocate(
-                self.as_ref().to_glib_none().0,
-                container.as_ref().to_glib_none().0,
-                allocation.to_glib_none().0,
-                flags.to_glib(),
-            );
-        }
-    }
-
-    //fn child_get<P: IsA<Container>, Q: IsA<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_layout_manager_child_get() }
-    //}
-
-    fn child_get_property<P: IsA<Container>, Q: IsA<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &mut glib::Value,
-    ) {
-        unsafe {
-            ffi::clutter_layout_manager_child_get_property(
-                self.as_ref().to_glib_none().0,
-                container.as_ref().to_glib_none().0,
-                actor.as_ref().to_glib_none().0,
-                property_name.to_glib_none().0,
-                value.to_glib_none_mut().0,
-            );
-        }
-    }
-
-    //fn child_set<P: IsA<Container>, Q: IsA<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_layout_manager_child_set() }
-    //}
-
-    fn child_set_property<P: IsA<Container>, Q: IsA<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &glib::Value,
-    ) {
-        unsafe {
-            ffi::clutter_layout_manager_child_set_property(
-                self.as_ref().to_glib_none().0,
-                container.as_ref().to_glib_none().0,
-                actor.as_ref().to_glib_none().0,
-                property_name.to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-
-    fn find_child_property(&self, name: &str) -> Option<glib::ParamSpec> {
-        unsafe {
-            from_glib_none(ffi::clutter_layout_manager_find_child_property(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_child_meta<P: IsA<Container>, Q: IsA<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-    ) -> Option<LayoutMeta> {
-        unsafe {
-            from_glib_none(ffi::clutter_layout_manager_get_child_meta(
-                self.as_ref().to_glib_none().0,
-                container.as_ref().to_glib_none().0,
-                actor.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_preferred_height<P: IsA<Container>>(&self, container: &P, for_width: f32) -> (f32, f32) {
-        unsafe {
-            let mut min_height_p = mem::MaybeUninit::uninit();
-            let mut nat_height_p = mem::MaybeUninit::uninit();
-            ffi::clutter_layout_manager_get_preferred_height(
-                self.as_ref().to_glib_none().0,
-                container.as_ref().to_glib_none().0,
-                for_width,
-                min_height_p.as_mut_ptr(),
-                nat_height_p.as_mut_ptr(),
-            );
-            let min_height_p = min_height_p.assume_init();
-            let nat_height_p = nat_height_p.assume_init();
-            (min_height_p, nat_height_p)
-        }
-    }
-
-    fn get_preferred_width<P: IsA<Container>>(&self, container: &P, for_height: f32) -> (f32, f32) {
-        unsafe {
-            let mut min_width_p = mem::MaybeUninit::uninit();
-            let mut nat_width_p = mem::MaybeUninit::uninit();
-            ffi::clutter_layout_manager_get_preferred_width(
-                self.as_ref().to_glib_none().0,
-                container.as_ref().to_glib_none().0,
-                for_height,
-                min_width_p.as_mut_ptr(),
-                nat_width_p.as_mut_ptr(),
-            );
-            let min_width_p = min_width_p.assume_init();
-            let nat_width_p = nat_width_p.assume_init();
-            (min_width_p, nat_width_p)
-        }
-    }
-
-    fn layout_changed(&self) {
-        unsafe {
-            ffi::clutter_layout_manager_layout_changed(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn list_child_properties(&self) -> Vec<glib::ParamSpec> {
-        unsafe {
-            let mut n_pspecs = mem::MaybeUninit::uninit();
-            let ret = FromGlibContainer::from_glib_full_num(
-                ffi::clutter_layout_manager_list_child_properties(
-                    self.as_ref().to_glib_none().0,
-                    n_pspecs.as_mut_ptr(),
-                ),
-                n_pspecs.assume_init() as usize,
-            );
-            ret
-        }
-    }
-
-    fn set_container<P: IsA<Container>>(&self, container: Option<&P>) {
-        unsafe {
-            ffi::clutter_layout_manager_set_container(
-                self.as_ref().to_glib_none().0,
-                container.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_layout_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn layout_changed_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterLayoutManager,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<LayoutManager>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&LayoutManager::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"layout-changed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    layout_changed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for LayoutManager {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "LayoutManager")
-    }
-}
diff --git a/src/legacy/layout_meta.rs b/src/legacy/layout_meta.rs
deleted file mode 100644
index 1b2ae52..0000000
--- a/src/legacy/layout_meta.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-use crate::{ChildMeta, LayoutManager};
-use glib::{object::IsA, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct LayoutMeta(Object<ffi::ClutterLayoutMeta, ffi::ClutterLayoutMetaClass, LayoutMetaClass>) @extends ChildMeta;
-
-    match fn {
-        get_type => || ffi::clutter_layout_meta_get_type(),
-    }
-}
-
-/// Trait containing all `LayoutMeta` methods.
-///
-/// # Implementors
-///
-/// [`LayoutMeta`](struct.LayoutMeta.html)
-pub trait LayoutMetaExt: 'static {
-    /// Retrieves the actor wrapped by `self`
-    ///
-    /// # Returns
-    ///
-    /// a `LayoutManager`
-    fn get_manager(&self) -> Option<LayoutManager>;
-}
-
-impl<O: IsA<LayoutMeta>> LayoutMetaExt for O {
-    fn get_manager(&self) -> Option<LayoutManager> {
-        unsafe {
-            from_glib_none(ffi::clutter_layout_meta_get_manager(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-}
-
-impl fmt::Display for LayoutMeta {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "LayoutMeta")
-    }
-}
diff --git a/src/legacy/list_model.rs b/src/legacy/list_model.rs
deleted file mode 100644
index b1cfc0b..0000000
--- a/src/legacy/list_model.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-use super::Model;
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ListModel(Object<ffi::ClutterListModel, ffi::ClutterListModelClass, ListModelClass>) @extends Model;
-
-    match fn {
-        get_type => || ffi::clutter_list_model_get_type(),
-    }
-}
-
-impl ListModel {}
-
-impl fmt::Display for ListModel {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ListModel")
-    }
-}
diff --git a/src/legacy/margin.rs b/src/legacy/margin.rs
deleted file mode 100644
index 62218f6..0000000
--- a/src/legacy/margin.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-use glib::translate::*;
-// use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct Margin(Boxed<ffi::ClutterMargin>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_margin_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_margin_free(ptr),
-        get_type => || ffi::clutter_margin_get_type(),
-    }
-}
-
-impl Margin {
-    /// Creates a new `Margin`.
-    ///
-    /// # Returns
-    ///
-    /// a newly allocated `Margin`. Use
-    ///  `Margin::free` to free the resources associated with it when
-    ///  done.
-    pub fn new() -> Margin {
-        unsafe { from_glib_full(ffi::clutter_margin_new()) }
-    }
-}
-
-impl Default for Margin {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-#[doc(hidden)]
-impl Uninitialized for Margin {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        Self::new()
-    }
-}
diff --git a/src/legacy/matrix.rs b/src/legacy/matrix.rs
deleted file mode 100644
index 582eb87..0000000
--- a/src/legacy/matrix.rs
+++ /dev/null
@@ -1,70 +0,0 @@
-use glib::translate::*;
-// use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct Matrix(Boxed<ffi::ClutterMatrix>);
-
-    match fn {
-        copy => |ptr| gobject_sys::g_boxed_copy(ffi::clutter_matrix_get_type(), ptr as *mut _) as *mut ffi::ClutterMatrix,
-        free => |ptr| gobject_sys::g_boxed_free(ffi::clutter_matrix_get_type(), ptr as *mut _),
-        get_type => || ffi::clutter_matrix_get_type(),
-    }
-}
-
-impl Matrix {
-    //pub fn init_from_array(&mut self, values: /*Unimplemented*/FixedArray TypeId { ns_id: 0, id: 20 }; 16) -> Option<Matrix> {
-    //    unsafe { TODO: call clutter_sys:clutter_matrix_init_from_array() }
-    //}
-
-    /// Initializes the `Matrix` `self` with the contents of the
-    /// `Matrix` `b`.
-    /// ## `b`
-    /// the `Matrix` to copy
-    ///
-    /// # Returns
-    ///
-    /// the initialized `Matrix`
-    pub fn init_from_matrix(&mut self, b: &Matrix) -> Option<Matrix> {
-        unsafe {
-            from_glib_none(ffi::clutter_matrix_init_from_matrix(
-                self.to_glib_none_mut().0,
-                b.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Initializes `self` with the identity matrix, i.e.:
-    ///
-    ///
-    /// ```text
-    ///   .xx = 1.0, .xy = 0.0, .xz = 0.0, .xw = 0.0
-    ///   .yx = 0.0, .yy = 1.0, .yz = 0.0, .yw = 0.0
-    ///   .zx = 0.0, .zy = 0.0, .zz = 1.0, .zw = 0.0
-    ///   .wx = 0.0, .wy = 0.0, .wz = 0.0, .ww = 1.0
-    /// ```
-    ///
-    /// # Returns
-    ///
-    /// the initialized `Matrix`
-    pub fn init_identity(&mut self) -> Option<Matrix> {
-        unsafe { from_glib_none(ffi::clutter_matrix_init_identity(self.to_glib_none_mut().0)) }
-    }
-
-    /// Allocates enough memory to hold a `Matrix`.
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `Matrix`
-    pub fn alloc() -> Option<Matrix> {
-        unsafe { from_glib_full(ffi::clutter_matrix_alloc()) }
-    }
-}
-
-#[doc(hidden)]
-impl Uninitialized for Matrix {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        Self::alloc().unwrap()
-    }
-}
diff --git a/src/legacy/media.rs b/src/legacy/media.rs
deleted file mode 100644
index aef683a..0000000
--- a/src/legacy/media.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use glib::{object::IsA, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct Media(Interface<ffi::ClutterMedia>);
-
-    match fn {
-        get_type => || ffi::clutter_media_get_type(),
-    }
-}
-
-/// Trait containing all `Media` methods.
-///
-/// # Implementors
-///
-/// [`Media`](struct.Media.html)
-pub trait MediaExt: 'static {}
-
-impl<O: IsA<Media>> MediaExt for O {}
-
-impl fmt::Display for Media {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Media")
-    }
-}
diff --git a/src/legacy/mod.rs b/src/legacy/mod.rs
deleted file mode 100644
index 970b5a4..0000000
--- a/src/legacy/mod.rs
+++ /dev/null
@@ -1,487 +0,0 @@
-#![allow(
-    clippy::too_many_arguments,
-    clippy::let_and_return,
-    clippy::from_over_into,
-    clippy::upper_case_acronyms,
-    clippy::new_ret_no_self,
-    clippy::wrong_self_convention
-)]
-
-use crate::prelude;
-
-mod action;
-pub use self::action::Action;
-
-mod actor;
-pub use self::actor::{Actor, ActorExt};
-
-mod actor_meta;
-pub use self::actor_meta::{ActorMeta, ActorMetaExt};
-
-mod align_constraint;
-pub use self::align_constraint::AlignConstraint;
-
-mod alpha;
-pub use self::alpha::Alpha;
-
-mod animatable;
-pub use self::animatable::{Animatable, AnimatableExt};
-
-mod backend;
-pub use self::backend::Backend;
-
-mod behaviour;
-pub use self::behaviour::Behaviour;
-
-mod behaviour_ellipse;
-pub use self::behaviour_ellipse::{BehaviourEllipse, BehaviourEllipseClass, BehaviourEllipseExt};
-
-mod behaviour_rotate;
-pub use self::behaviour_rotate::{BehaviourRotate, BehaviourRotateExt};
-
-mod bin_layout;
-pub use self::bin_layout::BinLayout;
-
-mod bind_constraint;
-pub use self::bind_constraint::BindConstraint;
-
-mod binding_pool;
-pub use self::binding_pool::BindingPool;
-
-mod blur_effect;
-pub use self::blur_effect::BlurEffect;
-
-mod box_;
-pub use self::box_::Box;
-
-mod box_layout;
-pub use self::box_layout::{BoxLayout, BoxLayoutExt};
-
-mod brightness_contrast_effect;
-pub use self::brightness_contrast_effect::BrightnessContrastEffect;
-
-mod actor_canvas;
-pub use self::actor_canvas::{ActorCanvas, ActorCanvasExt};
-
-mod child_meta;
-pub use self::child_meta::{ChildMeta, ChildMetaExt};
-
-mod click_action;
-pub use self::click_action::{ClickAction, ClickActionExt};
-
-mod clip_node;
-pub use self::clip_node::{ClipNode, ClipNodeClass};
-
-mod clone;
-pub use self::clone::{Clone, CloneExt};
-
-mod color_node;
-pub use self::color_node::ColorNode;
-
-mod colorize_effect;
-pub use self::colorize_effect::ColorizeEffect;
-
-mod constraint;
-pub use self::constraint::Constraint;
-
-mod container;
-pub use self::container::{Container, ContainerExt};
-
-mod content;
-pub use self::content::{Content, ContentExt};
-
-mod deform_effect;
-pub use self::deform_effect::{DeformEffect, DeformEffectExt};
-
-mod desaturate_effect;
-pub use self::desaturate_effect::DesaturateEffect;
-
-mod device_manager;
-pub use self::device_manager::{DeviceManager, DeviceManagerExt};
-
-mod drag_action;
-pub use self::drag_action::{DragAction, DragActionExt};
-
-mod drop_action;
-pub use self::drop_action::{DropAction, DropActionExt};
-
-mod effect;
-pub use self::effect::{Effect, EffectExt};
-
-mod event_button;
-pub use event_button::ButtonEvent;
-
-mod event_crossing;
-pub use event_crossing::CrossingEvent;
-
-mod event_key;
-pub use event_key::KeyEvent;
-
-mod event_motion;
-pub use event_motion::MotionEvent;
-
-mod event_scroll;
-pub use event_scroll::ScrollEvent;
-
-mod event_touch;
-pub use event_touch::TouchEvent;
-
-mod event;
-pub use event::{Event, FromEvent};
-
-mod fixed_layout;
-pub use self::fixed_layout::FixedLayout;
-
-mod flow_layout;
-pub use self::flow_layout::{FlowLayout, FlowLayoutExt};
-
-mod gesture_action;
-pub use self::gesture_action::{GestureAction, GestureActionExt};
-
-mod grid_layout;
-pub use self::grid_layout::{GridLayout, GridLayoutExt};
-
-mod group;
-pub use self::group::Group;
-
-mod image;
-pub use self::image::{Image, ImageExt};
-
-mod input_device;
-pub use self::input_device::InputDevice;
-
-mod interval;
-pub use self::interval::{Interval, IntervalExt};
-
-mod keyframe_transition;
-pub use self::keyframe_transition::{KeyframeTransition, KeyframeTransitionExt};
-
-mod layout_manager;
-pub use self::layout_manager::{LayoutManager, LayoutManagerExt};
-
-mod layout_meta;
-pub use self::layout_meta::{LayoutMeta, LayoutMetaExt};
-
-mod media;
-pub use self::media::{Media, MediaExt};
-
-mod offscreen_effect;
-pub use self::offscreen_effect::{OffscreenEffect, OffscreenEffectExt};
-
-mod page_turn_effect;
-pub use self::page_turn_effect::PageTurnEffect;
-
-mod paint_node;
-pub use self::paint_node::{PaintNode, PaintNodeExt};
-
-mod pan_action;
-pub use self::pan_action::{PanAction, PanActionExt};
-
-// mod param_spec_color;
-// pub use self::param_spec_color::{ParamSpecColor};
-
-// mod param_spec_unit;
-// pub use self::param_spec_unit::{ParamSpecUnit};
-
-mod path;
-pub use self::path::{Path, PathExt};
-
-mod path_constraint;
-pub use self::path_constraint::PathConstraint;
-
-mod pipeline_node;
-pub use self::pipeline_node::PipelineNode;
-
-mod property_transition;
-pub use self::property_transition::{PropertyTransition, PropertyTransitionExt};
-
-mod rectangle;
-pub use self::rectangle::{Rectangle, RectangleExt};
-
-mod rotate_action;
-pub use self::rotate_action::{RotateAction, RotateActionExt};
-
-mod score;
-pub use self::score::Score;
-
-// mod script;
-// pub use self::script::{Script, ScriptExt};
-
-// mod scriptable;
-// pub use self::scriptable::{Scriptable, ScriptableExt};
-
-mod scroll_actor;
-pub use self::scroll_actor::{ScrollActor, ScrollActorExt};
-
-mod settings;
-pub use self::settings::Settings;
-
-mod shader_effect;
-pub use self::shader_effect::{ShaderEffect, ShaderEffectExt};
-
-mod shader_float;
-pub use self::shader_float::ShaderFloat;
-
-mod shader_int;
-pub use self::shader_int::ShaderInt;
-
-mod shader_matrix;
-pub use self::shader_matrix::ShaderMatrix;
-
-mod snap_constraint;
-pub use self::snap_constraint::SnapConstraint;
-
-mod stage;
-pub use self::stage::{Stage, StageExt};
-
-mod stage_manager;
-pub use self::stage_manager::{StageManager, StageManagerExt};
-
-mod state;
-pub use self::state::State;
-
-mod swipe_action;
-pub use self::swipe_action::{SwipeAction, SwipeActionExt};
-
-mod tap_action;
-pub use self::tap_action::{TapAction, TapActionExt};
-
-mod text;
-pub use self::text::{Text, TextExt};
-
-mod text_buffer;
-pub use self::text_buffer::{TextBuffer, TextBufferExt};
-
-mod text_node;
-pub use self::text_node::TextNode;
-
-mod texture;
-pub use self::texture::{Texture, TextureExt};
-
-mod texture_node;
-pub use self::texture_node::TextureNode;
-
-mod timeline;
-pub use self::timeline::{Timeline, TimelineExt};
-
-mod transition;
-pub use self::transition::{Transition, TransitionExt};
-
-mod transition_group;
-pub use self::transition_group::{TransitionGroup, TransitionGroupExt};
-
-mod zoom_action;
-pub use self::zoom_action::{ZoomAction, ZoomActionExt};
-
-mod actor_box;
-pub use self::actor_box::ActorBox;
-
-mod color;
-pub(crate) use self::color::InternalColor;
-
-mod event_sequence;
-pub use self::event_sequence::EventSequence;
-
-mod geometry;
-pub use self::geometry::Geometry;
-
-mod knot;
-pub use self::knot::Knot;
-
-mod margin;
-pub use self::margin::Margin;
-
-mod matrix;
-pub use self::matrix::Matrix;
-
-mod list_model;
-pub use self::list_model::ListModel;
-
-mod model;
-pub use self::model::Model;
-
-mod model_iter;
-pub use self::model_iter::ModelIter;
-
-mod paint_volume;
-pub use self::paint_volume::PaintVolume;
-
-mod path_node;
-pub use self::path_node::PathNode;
-
-mod perspective;
-pub use self::perspective::Perspective;
-
-mod point;
-pub(crate) use self::point::InternalPoint;
-
-mod rect;
-pub(crate) use self::rect::InternalRect;
-
-// mod size;
-// pub(crate) use self::size::InternalSize;
-
-mod state_key;
-pub use self::state_key::StateKey;
-
-mod units;
-pub use self::units::Units;
-
-mod vertex;
-pub use self::vertex::Vertex;
-
-mod enums;
-pub use self::enums::ActorAlign;
-pub use self::enums::AlignAxis;
-pub use self::enums::AnimationMode;
-pub use self::enums::BinAlignment;
-pub use self::enums::BindCoordinate;
-pub use self::enums::BoxAlignment;
-pub use self::enums::ContentGravity;
-pub use self::enums::DragAxis;
-pub use self::enums::EventType;
-pub use self::enums::FlowOrientation;
-pub use self::enums::GestureTriggerEdge;
-pub use self::enums::GridPosition;
-pub use self::enums::ImageError;
-pub use self::enums::InitError;
-pub use self::enums::InputAxis;
-pub use self::enums::InputDeviceType;
-pub use self::enums::InputMode;
-pub use self::enums::LongPressState;
-pub use self::enums::Orientation;
-pub use self::enums::PanAxis;
-pub use self::enums::PathNodeType;
-pub use self::enums::PickMode;
-pub use self::enums::RequestMode;
-pub use self::enums::RotateAxis;
-pub use self::enums::RotateDirection;
-pub use self::enums::ScalingFilter;
-pub use self::enums::ScriptError;
-pub use self::enums::ScrollDirection;
-pub use self::enums::ScrollSource;
-pub use self::enums::ShaderType;
-pub use self::enums::SnapEdge;
-pub use self::enums::StaticColor;
-pub use self::enums::StepMode;
-pub use self::enums::TextDirection;
-pub use self::enums::TextureError;
-pub use self::enums::TimelineDirection;
-pub use self::enums::TouchpadGesturePhase;
-pub use self::enums::UnitType;
-pub use self::enums::ZoomAxis;
-
-mod flags;
-pub use self::flags::ActorFlags;
-pub use self::flags::AllocationFlags;
-pub use self::flags::ContentRepeat;
-pub use self::flags::EffectPaintFlags;
-pub use self::flags::EventFlags;
-pub use self::flags::FeatureFlags;
-pub use self::flags::ModifierType;
-pub use self::flags::OffscreenRedirect;
-pub use self::flags::RepaintFlags;
-pub use self::flags::ScrollFinishFlags;
-pub use self::flags::ScrollMode;
-pub use self::flags::StageState;
-pub use self::flags::SwipeDirection;
-
-pub type ActorCreateChildFunc = ffi::ClutterActorCreateChildFunc;
-pub type BindingActionFunc = ffi::ClutterBindingActionFunc;
-
-#[doc(hidden)]
-pub mod traits {
-    pub use super::ActorCanvasExt;
-    pub use super::ActorExt;
-    pub use super::ActorMetaExt;
-    pub use super::AnimatableExt;
-    pub use super::BehaviourEllipseExt;
-    pub use super::BehaviourRotateExt;
-    pub use super::BoxLayoutExt;
-    pub use super::ChildMetaExt;
-    pub use super::ClickActionExt;
-    pub use super::CloneExt;
-    pub use super::ContainerExt;
-    pub use super::ContentExt;
-    pub use super::DeformEffectExt;
-    pub use super::DeviceManagerExt;
-    pub use super::DragActionExt;
-    pub use super::DropActionExt;
-    pub use super::EffectExt;
-    pub use super::FlowLayoutExt;
-    pub use super::GestureActionExt;
-    pub use super::GridLayoutExt;
-    pub use super::ImageExt;
-    pub use super::IntervalExt;
-    pub use super::KeyframeTransitionExt;
-    pub use super::LayoutManagerExt;
-    pub use super::LayoutMetaExt;
-    pub use super::MediaExt;
-    pub use super::OffscreenEffectExt;
-    pub use super::PaintNodeExt;
-    pub use super::PanActionExt;
-    pub use super::PathExt;
-    pub use super::PropertyTransitionExt;
-    pub use super::RectangleExt;
-    pub use super::RotateActionExt;
-    // pub use super::ScriptExt;
-    // pub use super::ScriptableExt;
-    pub use super::ScrollActorExt;
-    pub use super::ShaderEffectExt;
-    pub use super::StageExt;
-    pub use super::StageManagerExt;
-    pub use super::SwipeActionExt;
-    pub use super::TapActionExt;
-    pub use super::TextBufferExt;
-    pub use super::TextExt;
-    pub use super::TextureExt;
-    pub use super::TimelineExt;
-    pub use super::TransitionExt;
-    pub use super::TransitionGroupExt;
-    pub use super::ZoomActionExt;
-}
-
-pub use glib::timeout_add_local as interval;
-
-impl prelude::Object for ActorCanvas {}
-impl prelude::Is<ActorCanvas> for ActorCanvas {}
-
-impl prelude::Object for Action {}
-impl prelude::Is<Action> for Action {}
-
-impl prelude::Object for ActorMeta {}
-impl prelude::Is<ActorMeta> for ActorMeta {}
-
-impl prelude::Object for Actor {}
-impl prelude::Is<Actor> for Actor {}
-
-impl prelude::Object for BoxLayout {}
-impl prelude::Is<BoxLayout> for BoxLayout {}
-
-impl prelude::Object for Constraint {}
-impl prelude::Is<Constraint> for Constraint {}
-
-impl prelude::Object for Content {}
-impl prelude::Is<Content> for Content {}
-
-impl prelude::Object for Effect {}
-impl prelude::Is<Effect> for Effect {}
-
-impl prelude::Object for Image {}
-impl prelude::Is<Image> for Image {}
-
-impl prelude::Object for LayoutManager {}
-impl prelude::Is<LayoutManager> for LayoutManager {}
-
-impl prelude::Object for Model {}
-impl prelude::Is<Model> for Model {}
-
-impl prelude::Object for OffscreenEffect {}
-impl prelude::Is<OffscreenEffect> for OffscreenEffect {}
-
-impl prelude::Object for Text {}
-impl prelude::Is<Text> for Text {}
-impl prelude::Is<Actor> for Text {}
-
-impl prelude::Object for Transition {}
-impl prelude::Is<Transition> for Transition {}
diff --git a/src/legacy/model.rs b/src/legacy/model.rs
deleted file mode 100644
index 824d14b..0000000
--- a/src/legacy/model.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct Model(Object<ffi::ClutterModel, ffi::ClutterModelClass, ModelClass>);
-
-    match fn {
-        get_type => || ffi::clutter_model_get_type(),
-    }
-}
-
-impl Model {}
-
-impl fmt::Display for Model {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Model")
-    }
-}
diff --git a/src/legacy/model_iter.rs b/src/legacy/model_iter.rs
deleted file mode 100644
index 53beaa9..0000000
--- a/src/legacy/model_iter.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ModelIter(Object<ffi::ClutterModelIter, ffi::ClutterModelIterClass, ModelIterClass>);
-
-    match fn {
-        get_type => || ffi::clutter_model_iter_get_type(),
-    }
-}
-
-impl ModelIter {}
-
-impl fmt::Display for ModelIter {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ModelIter")
-    }
-}
diff --git a/src/legacy/offscreen_effect.rs b/src/legacy/offscreen_effect.rs
deleted file mode 100644
index b002e24..0000000
--- a/src/legacy/offscreen_effect.rs
+++ /dev/null
@@ -1,99 +0,0 @@
-use crate::{ActorMeta, Effect, InternalRect};
-use glib::{object as gobject, object::IsA, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct OffscreenEffect(Object<ffi::ClutterOffscreenEffect, ffi::ClutterOffscreenEffectClass, OffscreenEffectClass>) @extends Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_offscreen_effect_get_type(),
-    }
-}
-
-/// Trait containing all `OffscreenEffect` methods.
-///
-/// # Implementors
-///
-/// [`BlurEffect`](struct.BlurEffect.html), [`BrightnessContrastEffect`](struct.BrightnessContrastEffect.html), [`ColorizeEffect`](struct.ColorizeEffect.html), [`DeformEffect`](struct.DeformEffect.html), [`DesaturateEffect`](struct.DesaturateEffect.html), [`OffscreenEffect`](struct.OffscreenEffect.html), [`ShaderEffect`](struct.ShaderEffect.html)
-pub trait OffscreenEffectExt: 'static {
-    //fn create_texture(&self, width: f32, height: f32) -> /*Unimplemented*/Option<dx::Handle>;
-
-    // /// Retrieves the material used as a render target for the offscreen
-    // /// buffer created by `self`
-    // ///
-    // /// You should only use the returned `dx::Material` when painting. The
-    // /// returned material might change between different frames.
-    // ///
-    // /// # Returns
-    // ///
-    // /// a `dx::Material` or `None`. The
-    // ///  returned material is owned by internals and it should not be
-    // ///  modified or freed
-
-    // fn get_target(&self) -> Option<dx::Material>;
-
-    /// Retrieves the origin and size of the offscreen buffer used by `self` to
-    /// paint the actor to which it has been applied.
-    ///
-    /// This function should only be called by `OffscreenEffect`
-    /// implementations, from within the `OffscreenEffectClass.paint_target`()
-    /// virtual function.
-    /// ## `rect`
-    /// return location for the target area
-    ///
-    /// # Returns
-    ///
-    /// `true` if the offscreen buffer has a valid rectangle,
-    ///  and `false` otherwise
-    fn get_target_rect(&self) -> Option<InternalRect>;
-
-    //fn get_texture(&self) -> /*Unimplemented*/Option<dx::Handle>;
-
-    /// Calls the `paint_target` virtual function of the `self`
-    fn paint_target(&self);
-}
-
-impl<O: IsA<OffscreenEffect>> OffscreenEffectExt for O {
-    //fn create_texture(&self, width: f32, height: f32) -> /*Unimplemented*/Option<dx::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_offscreen_effect_create_texture() }
-    //}
-
-    // fn get_target(&self) -> Option<dx::Material> {
-    //     unsafe {
-    //         from_glib_none(ffi::clutter_offscreen_effect_get_target(
-    //             self.as_ref().to_glib_none().0,
-    //         ))
-    //     }
-    // }
-
-    fn get_target_rect(&self) -> Option<InternalRect> {
-        unsafe {
-            let mut rect = InternalRect::uninitialized();
-            let ret = from_glib(ffi::clutter_offscreen_effect_get_target_rect(
-                self.as_ref().to_glib_none().0,
-                rect.to_glib_none_mut().0,
-            ));
-            if ret {
-                Some(rect)
-            } else {
-                None
-            }
-        }
-    }
-
-    //fn get_texture(&self) -> /*Unimplemented*/Option<dx::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_offscreen_effect_get_texture() }
-    //}
-
-    fn paint_target(&self) {
-        unsafe {
-            ffi::clutter_offscreen_effect_paint_target(self.as_ref().to_glib_none().0);
-        }
-    }
-}
-
-impl fmt::Display for OffscreenEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "OffscreenEffect")
-    }
-}
diff --git a/src/legacy/page_turn_effect.rs b/src/legacy/page_turn_effect.rs
deleted file mode 100644
index 9944a86..0000000
--- a/src/legacy/page_turn_effect.rs
+++ /dev/null
@@ -1,173 +0,0 @@
-use crate::{ActorMeta, DeformEffect, Effect, OffscreenEffect};
-use glib::{
-    object as gobject,
-    object::{Cast, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct PageTurnEffect(Object<ffi::ClutterPageTurnEffect, ffi::ClutterPageTurnEffectClass, PageTurnEffectClass>) @extends DeformEffect, OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_page_turn_effect_get_type(),
-    }
-}
-
-impl PageTurnEffect {
-    /// Creates a new `PageTurnEffect` instance with the given parameters
-    /// ## `period`
-    /// the period of the page curl, between 0.0 and 1.0
-    /// ## `angle`
-    /// the angle of the page curl, between 0.0 and 360.0
-    /// ## `radius`
-    /// the radius of the page curl, in pixels
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PageTurnEffect`
-    pub fn new(period: f64, angle: f64, radius: f32) -> PageTurnEffect {
-        unsafe {
-            Effect::from_glib_none(ffi::clutter_page_turn_effect_new(period, angle, radius))
-                .unsafe_cast()
-        }
-    }
-
-    /// Retrieves the value set using `PageTurnEffect::get_angle`
-    ///
-    /// # Returns
-    ///
-    /// the angle of the page curling
-    pub fn get_angle(&self) -> f64 {
-        unsafe { ffi::clutter_page_turn_effect_get_angle(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the value set using `PageTurnEffect::get_period`
-    ///
-    /// # Returns
-    ///
-    /// the period of the page curling
-    pub fn get_period(&self) -> f64 {
-        unsafe { ffi::clutter_page_turn_effect_get_period(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the value set using `PageTurnEffect::set_radius`
-    ///
-    /// # Returns
-    ///
-    /// the radius of the page curling
-    pub fn get_radius(&self) -> f32 {
-        unsafe { ffi::clutter_page_turn_effect_get_radius(self.to_glib_none().0) }
-    }
-
-    /// Sets the angle of the page curling, in degrees
-    /// ## `angle`
-    /// the angle of the page curl, in degrees
-    pub fn set_angle(&self, angle: f64) {
-        unsafe {
-            ffi::clutter_page_turn_effect_set_angle(self.to_glib_none().0, angle);
-        }
-    }
-
-    /// Sets the period of the page curling, between 0.0 (no curling)
-    /// and 1.0 (fully curled)
-    /// ## `period`
-    /// the period of the page curl, between 0.0 and 1.0
-    pub fn set_period(&self, period: f64) {
-        unsafe {
-            ffi::clutter_page_turn_effect_set_period(self.to_glib_none().0, period);
-        }
-    }
-
-    /// Sets the radius of the page curling
-    /// ## `radius`
-    /// the radius of the page curling, in pixels
-    pub fn set_radius(&self, radius: f32) {
-        unsafe {
-            ffi::clutter_page_turn_effect_set_radius(self.to_glib_none().0, radius);
-        }
-    }
-
-    pub fn connect_property_angle_notify<F: Fn(&PageTurnEffect) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_angle_trampoline<F: Fn(&PageTurnEffect) + 'static>(
-            this: *mut ffi::ClutterPageTurnEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::angle\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_angle_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_period_notify<F: Fn(&PageTurnEffect) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_period_trampoline<F: Fn(&PageTurnEffect) + 'static>(
-            this: *mut ffi::ClutterPageTurnEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::period\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_period_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_radius_notify<F: Fn(&PageTurnEffect) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_radius_trampoline<F: Fn(&PageTurnEffect) + 'static>(
-            this: *mut ffi::ClutterPageTurnEffect,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::radius\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_radius_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for PageTurnEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "PageTurnEffect")
-    }
-}
diff --git a/src/legacy/paint_node.rs b/src/legacy/paint_node.rs
deleted file mode 100644
index d2af7f9..0000000
--- a/src/legacy/paint_node.rs
+++ /dev/null
@@ -1,98 +0,0 @@
-use crate::ActorBox;
-use glib::{object::IsA, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct PaintNode(Object<ffi::ClutterPaintNode, ffi::ClutterPaintNodeClass, PaintNodeClass>);
-
-    match fn {
-        get_type => || ffi::clutter_paint_node_get_type(),
-    }
-}
-
-/// Trait containing all `PaintNode` methods.
-///
-/// # Implementors
-///
-/// [`ClipNode`](struct.ClipNode.html), [`PaintNode`](struct.PaintNode.html), [`PipelineNode`](struct.PipelineNode.html), [`TextNode`](struct.TextNode.html)
-pub trait PaintNodeExt: 'static {
-    /// Adds `child` to the list of children of `self`.
-    ///
-    /// This function will acquire a reference on `child`.
-    /// ## `child`
-    /// the child `PaintNode` to add
-    fn add_child<P: IsA<PaintNode>>(&self, child: &P);
-
-    /// Adds a rectangle region to the `self`, as described by the
-    /// passed `rect`.
-    /// ## `rect`
-    /// a `ActorBox`
-    fn add_rectangle(&self, rect: &ActorBox);
-
-    /// Adds a rectangle region to the `self`, with texture coordinates.
-    /// ## `rect`
-    /// a `ActorBox`
-    /// ## `x_1`
-    /// the left X coordinate of the texture
-    /// ## `y_1`
-    /// the top Y coordinate of the texture
-    /// ## `x_2`
-    /// the right X coordinate of the texture
-    /// ## `y_2`
-    /// the bottom Y coordinate of the texture
-    fn add_texture_rectangle(&self, rect: &ActorBox, x_1: f32, y_1: f32, x_2: f32, y_2: f32);
-
-    /// Sets a user-readable `name` for `self`.
-    ///
-    /// The `name` will be used for debugging purposes.
-    ///
-    /// The `self` will copy the passed string.
-    /// ## `name`
-    /// a string annotating the `self`
-    fn set_name(&self, name: &str);
-}
-
-impl<O: IsA<PaintNode>> PaintNodeExt for O {
-    fn add_child<P: IsA<PaintNode>>(&self, child: &P) {
-        unsafe {
-            ffi::clutter_paint_node_add_child(
-                self.as_ref().to_glib_none().0,
-                child.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_rectangle(&self, rect: &ActorBox) {
-        unsafe {
-            ffi::clutter_paint_node_add_rectangle(
-                self.as_ref().to_glib_none().0,
-                rect.to_glib_none().0,
-            );
-        }
-    }
-
-    fn add_texture_rectangle(&self, rect: &ActorBox, x_1: f32, y_1: f32, x_2: f32, y_2: f32) {
-        unsafe {
-            ffi::clutter_paint_node_add_texture_rectangle(
-                self.as_ref().to_glib_none().0,
-                rect.to_glib_none().0,
-                x_1,
-                y_1,
-                x_2,
-                y_2,
-            );
-        }
-    }
-
-    fn set_name(&self, name: &str) {
-        unsafe {
-            ffi::clutter_paint_node_set_name(self.as_ref().to_glib_none().0, name.to_glib_none().0);
-        }
-    }
-}
-
-impl fmt::Display for PaintNode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "PaintNode")
-    }
-}
diff --git a/src/legacy/paint_volume.rs b/src/legacy/paint_volume.rs
deleted file mode 100644
index c62a0c1..0000000
--- a/src/legacy/paint_volume.rs
+++ /dev/null
@@ -1,223 +0,0 @@
-use crate::{Actor, ActorBox, Vertex};
-use glib::{object::IsA, translate::*};
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct PaintVolume(Boxed<ffi::ClutterPaintVolume>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_paint_volume_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_paint_volume_free(ptr),
-        get_type => || ffi::clutter_paint_volume_get_type(),
-    }
-}
-
-impl PaintVolume {
-    /// Retrieves the depth of the volume's, axis aligned, bounding box.
-    ///
-    /// In other words; this takes into account what actor's coordinate
-    /// space `self` belongs too and conceptually fits an axis aligned box
-    /// around the volume. It returns the size of that bounding box as
-    /// measured along the z-axis.
-    ///
-    /// If, for example, `ActorExt::get_transformed_paint_volume`
-    /// is used to transform a 2D child actor that is 100px wide, 100px
-    /// high and 0px deep into container coordinates then the depth might
-    /// not simply be 0px if the child actor has a 3D rotation applied to
-    /// it.
-    ///
-    /// Remember: if `ActorExt::get_transformed_paint_volume` is
-    /// used then the transformed volume will be defined relative to the
-    /// container actor and in container coordinates a 2D child actor
-    /// can have a 3D bounding volume.
-    ///
-    /// There are no accuracy guarantees for the reported depth,
-    /// except that it must always be greater than, or equal to, the actor's
-    /// depth. This is because actors may report simple, loose fitting paint
-    /// volumes for efficiency.
-    ///
-    /// # Returns
-    ///
-    /// the depth, in units of `self`'s local coordinate system.
-    pub fn get_depth(&self) -> f32 {
-        unsafe { ffi::clutter_paint_volume_get_depth(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the height of the volume's, axis aligned, bounding box.
-    ///
-    /// In other words; this takes into account what actor's coordinate
-    /// space `self` belongs too and conceptually fits an axis aligned box
-    /// around the volume. It returns the size of that bounding box as
-    /// measured along the y-axis.
-    ///
-    /// If, for example, `ActorExt::get_transformed_paint_volume`
-    /// is used to transform a 2D child actor that is 100px wide, 100px
-    /// high and 0px deep into container coordinates then the height might
-    /// not simply be 100px if the child actor has a 3D rotation applied to
-    /// it.
-    ///
-    /// Remember: if `ActorExt::get_transformed_paint_volume` is
-    /// used then a transformed child volume will be defined relative to the
-    /// ancestor container actor and so a 2D child actor
-    /// can have a 3D bounding volume.
-    ///
-    /// There are no accuracy guarantees for the reported height,
-    /// except that it must always be greater than, or equal to, the actor's
-    /// height. This is because actors may report simple, loose fitting paint
-    /// volumes for efficiency.
-    ///
-    /// # Returns
-    ///
-    /// the height, in units of `self`'s local coordinate system.
-    pub fn get_height(&self) -> f32 {
-        unsafe { ffi::clutter_paint_volume_get_height(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the origin of the `PaintVolume`.
-    /// ## `vertex`
-    /// the return location for a `Vertex`
-    pub fn get_origin(&self) -> Vertex {
-        unsafe {
-            let mut vertex = Vertex::uninitialized();
-            ffi::clutter_paint_volume_get_origin(
-                self.to_glib_none().0,
-                vertex.to_glib_none_mut().0,
-            );
-            vertex
-        }
-    }
-
-    /// Retrieves the width of the volume's, axis aligned, bounding box.
-    ///
-    /// In other words; this takes into account what actor's coordinate
-    /// space `self` belongs too and conceptually fits an axis aligned box
-    /// around the volume. It returns the size of that bounding box as
-    /// measured along the x-axis.
-    ///
-    /// If, for example, `ActorExt::get_transformed_paint_volume`
-    /// is used to transform a 2D child actor that is 100px wide, 100px
-    /// high and 0px deep into container coordinates then the width might
-    /// not simply be 100px if the child actor has a 3D rotation applied to
-    /// it.
-    ///
-    /// Remember: if `ActorExt::get_transformed_paint_volume` is
-    /// used then a transformed child volume will be defined relative to the
-    /// ancestor container actor and so a 2D child actor can have a 3D
-    /// bounding volume.
-    ///
-    /// There are no accuracy guarantees for the reported width,
-    /// except that it must always be greater than, or equal to, the
-    /// actor's width. This is because actors may report simple, loose
-    /// fitting paint volumes for efficiency.
-    ///
-    /// # Returns
-    ///
-    /// the width, in units of `self`'s local coordinate system.
-    pub fn get_width(&self) -> f32 {
-        unsafe { ffi::clutter_paint_volume_get_width(self.to_glib_none().0) }
-    }
-
-    /// Sets the depth of the paint volume. The depth is measured along
-    /// the z axis in the actor coordinates that `self` is associated with.
-    /// ## `depth`
-    /// the depth of the paint volume, in pixels
-    pub fn set_depth(&mut self, depth: f32) {
-        unsafe {
-            ffi::clutter_paint_volume_set_depth(self.to_glib_none_mut().0, depth);
-        }
-    }
-
-    /// Sets the `PaintVolume` from the allocation of `actor`.
-    ///
-    /// This function should be used when overriding the
-    /// `ActorClass.get_paint_volume`() by `Actor` sub-classes
-    /// that do not paint outside their allocation.
-    ///
-    /// A typical example is:
-    ///
-    ///
-    /// ```text
-    /// static gboolean
-    /// my_actor_get_paint_volume (Actor       *self,
-    ///                            PaintVolume *volume)
-    /// {
-    ///   return paint_volume_set_from_allocation (volume, self);
-    /// }
-    /// ```
-    /// ## `actor`
-    /// a `Actor`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the paint volume was successfully set, and `false`
-    ///  otherwise
-    pub fn set_from_allocation<P: IsA<Actor>>(&mut self, actor: &P) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_paint_volume_set_from_allocation(
-                self.to_glib_none_mut().0,
-                actor.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Sets the height of the paint volume. The height is measured along
-    /// the y axis in the actor coordinates that `self` is associated with.
-    /// ## `height`
-    /// the height of the paint volume, in pixels
-    pub fn set_height(&mut self, height: f32) {
-        unsafe {
-            ffi::clutter_paint_volume_set_height(self.to_glib_none_mut().0, height);
-        }
-    }
-
-    /// Sets the origin of the paint volume.
-    ///
-    /// The origin is defined as the X, Y and Z coordinates of the top-left
-    /// corner of an actor's paint volume, in actor coordinates.
-    ///
-    /// The default is origin is assumed at: (0, 0, 0)
-    /// ## `origin`
-    /// a `Vertex`
-    pub fn set_origin(&mut self, origin: &Vertex) {
-        unsafe {
-            ffi::clutter_paint_volume_set_origin(
-                self.to_glib_none_mut().0,
-                origin.to_glib_none().0,
-            );
-        }
-    }
-
-    /// Sets the width of the paint volume. The width is measured along
-    /// the x axis in the actor coordinates that `self` is associated with.
-    /// ## `width`
-    /// the width of the paint volume, in pixels
-    pub fn set_width(&mut self, width: f32) {
-        unsafe {
-            ffi::clutter_paint_volume_set_width(self.to_glib_none_mut().0, width);
-        }
-    }
-
-    /// Updates the geometry of `self` to encompass `self` and `another_pv`.
-    ///
-    /// There are no guarantees about how precisely the two volumes
-    /// will be unioned.
-    /// ## `another_pv`
-    /// A second `PaintVolume` to union with `self`
-    pub fn union(&mut self, another_pv: &PaintVolume) {
-        unsafe {
-            ffi::clutter_paint_volume_union(self.to_glib_none_mut().0, another_pv.to_glib_none().0);
-        }
-    }
-
-    /// Unions the 2D region represented by `box_` to a `PaintVolume`.
-    ///
-    /// This function is similar to `PaintVolume::union`, but it is
-    /// specific for 2D regions.
-    /// ## `box_`
-    /// a `ActorBox` to union to `self`
-    pub fn union_box(&mut self, box_: &ActorBox) {
-        unsafe {
-            ffi::clutter_paint_volume_union_box(self.to_glib_none_mut().0, box_.to_glib_none().0);
-        }
-    }
-}
diff --git a/src/legacy/pan_action.rs b/src/legacy/pan_action.rs
deleted file mode 100644
index e0534c2..0000000
--- a/src/legacy/pan_action.rs
+++ /dev/null
@@ -1,434 +0,0 @@
-use crate::{Action, Actor, ActorMeta, GestureAction, PanAxis};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct PanAction(Object<ffi::ClutterPanAction, ffi::ClutterPanActionClass, PanActionClass>) @extends GestureAction, Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_pan_action_get_type(),
-    }
-}
-
-impl PanAction {
-    /// Creates a new `PanAction` instance
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PanAction`
-    pub fn new() -> PanAction {
-        unsafe { Action::from_glib_none(ffi::clutter_pan_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for PanAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `PanAction` methods.
-///
-/// # Implementors
-///
-/// [`PanAction`](struct.PanAction.html)
-pub trait PanActionExt: 'static {
-    /// Retrieves the initial acceleration factor for interpolated ::pan events.
-    ///
-    /// # Returns
-    ///
-    /// The initial acceleration factor for interpolated events.
-    fn get_acceleration_factor(&self) -> f64;
-
-    /// Retrieves the delta, in stage space, dependent on the current state
-    /// of the `PanAction`, and respecting the constraint specified by the
-    /// `PanAction:pan-axis` property.
-    /// ## `point`
-    /// the touch point index, with 0 being the first touch
-    ///  point received by the action
-    /// ## `delta_x`
-    /// return location for the X delta
-    /// ## `delta_y`
-    /// return location for the Y delta
-    ///
-    /// # Returns
-    ///
-    /// the distance since last motion event
-    fn get_constrained_motion_delta(&self, point: u32) -> (f32, f32, f32);
-
-    /// Retrieves the deceleration rate of interpolated ::pan events.
-    ///
-    /// # Returns
-    ///
-    /// The deceleration rate of the interpolated events.
-    fn get_deceleration(&self) -> f64;
-
-    /// Checks if the action should emit ::pan events even after releasing
-    /// the pointer during a panning gesture, to emulate some kind of
-    /// kinetic inertia.
-    ///
-    /// # Returns
-    ///
-    /// `true` if interpolated events emission is active.
-    fn get_interpolate(&self) -> bool;
-
-    /// Retrieves the coordinates, in stage space, of the latest interpolated
-    /// event, analogous to `GestureActionExt::get_motion_coords`.
-    /// ## `interpolated_x`
-    /// return location for the latest
-    ///  interpolated event's X coordinate
-    /// ## `interpolated_y`
-    /// return location for the latest
-    ///  interpolated event's Y coordinate
-    fn get_interpolated_coords(&self) -> (f32, f32);
-
-    /// Retrieves the delta, in stage space, since the latest interpolated
-    /// event, analogous to `GestureActionExt::get_motion_delta`.
-    /// ## `delta_x`
-    /// return location for the X delta since
-    ///  the latest interpolated event
-    /// ## `delta_y`
-    /// return location for the Y delta since
-    ///  the latest interpolated event
-    ///
-    /// # Returns
-    ///
-    /// the distance since the latest interpolated event
-    fn get_interpolated_delta(&self) -> (f32, f32, f32);
-
-    /// Retrieves the axis constraint set by `PanActionExt::set_pan_axis`
-    ///
-    /// # Returns
-    ///
-    /// the axis constraint
-    fn get_pan_axis(&self) -> PanAxis;
-
-    /// Factor applied to the momentum velocity at the time of releasing the
-    /// pointer when generating interpolated ::pan events.
-    /// ## `factor`
-    /// The acceleration factor
-    fn set_acceleration_factor(&self, factor: f64);
-
-    /// Sets the deceleration rate of the interpolated ::pan events generated
-    /// after a pan gesture. This is approximately the value that the momentum
-    /// at the time of releasing the pointer is divided by every 60th of a second.
-    /// ## `rate`
-    /// The deceleration rate
-    fn set_deceleration(&self, rate: f64);
-
-    /// Sets whether the action should emit interpolated ::pan events
-    /// after the drag has ended, to emulate the gesture kinetic inertia.
-    /// ## `should_interpolate`
-    /// whether to enable interpolated pan events
-    fn set_interpolate(&self, should_interpolate: bool);
-
-    /// Restricts the panning action to a specific axis
-    /// ## `axis`
-    /// the axis to constraint the panning to
-    fn set_pan_axis(&self, axis: PanAxis);
-
-    /// The ::pan signal is emitted to keep track of the motion during
-    /// a pan gesture. `is_interpolated` is set to `true` during the
-    /// interpolation phase of the pan, after the drag has ended and
-    /// the :interpolate property was set to `true`.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    /// ## `is_interpolated`
-    /// if the event is the result of interpolating
-    ///  the motion velocity at the end of the drag
-    ///
-    /// # Returns
-    ///
-    /// `true` if the pan should continue, and `false` if
-    ///  the pan should be cancelled.
-    fn connect_pan<F: Fn(&Self, &Actor, bool) -> bool + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::pan-stopped signal is emitted at the end of the interpolation
-    /// phase of the pan action, only when :interpolate is set to `true`.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    fn connect_pan_stopped<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_acceleration_factor_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_deceleration_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_interpolate_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_pan_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<PanAction>> PanActionExt for O {
-    fn get_acceleration_factor(&self) -> f64 {
-        unsafe { ffi::clutter_pan_action_get_acceleration_factor(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_constrained_motion_delta(&self, point: u32) -> (f32, f32, f32) {
-        unsafe {
-            let mut delta_x = mem::MaybeUninit::uninit();
-            let mut delta_y = mem::MaybeUninit::uninit();
-            let ret = ffi::clutter_pan_action_get_constrained_motion_delta(
-                self.as_ref().to_glib_none().0,
-                point,
-                delta_x.as_mut_ptr(),
-                delta_y.as_mut_ptr(),
-            );
-            let delta_x = delta_x.assume_init();
-            let delta_y = delta_y.assume_init();
-            (ret, delta_x, delta_y)
-        }
-    }
-
-    fn get_deceleration(&self) -> f64 {
-        unsafe { ffi::clutter_pan_action_get_deceleration(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_interpolate(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_pan_action_get_interpolate(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_interpolated_coords(&self) -> (f32, f32) {
-        unsafe {
-            let mut interpolated_x = mem::MaybeUninit::uninit();
-            let mut interpolated_y = mem::MaybeUninit::uninit();
-            ffi::clutter_pan_action_get_interpolated_coords(
-                self.as_ref().to_glib_none().0,
-                interpolated_x.as_mut_ptr(),
-                interpolated_y.as_mut_ptr(),
-            );
-            let interpolated_x = interpolated_x.assume_init();
-            let interpolated_y = interpolated_y.assume_init();
-            (interpolated_x, interpolated_y)
-        }
-    }
-
-    fn get_interpolated_delta(&self) -> (f32, f32, f32) {
-        unsafe {
-            let mut delta_x = mem::MaybeUninit::uninit();
-            let mut delta_y = mem::MaybeUninit::uninit();
-            let ret = ffi::clutter_pan_action_get_interpolated_delta(
-                self.as_ref().to_glib_none().0,
-                delta_x.as_mut_ptr(),
-                delta_y.as_mut_ptr(),
-            );
-            let delta_x = delta_x.assume_init();
-            let delta_y = delta_y.assume_init();
-            (ret, delta_x, delta_y)
-        }
-    }
-
-    fn get_pan_axis(&self) -> PanAxis {
-        unsafe {
-            from_glib(ffi::clutter_pan_action_get_pan_axis(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_acceleration_factor(&self, factor: f64) {
-        unsafe {
-            ffi::clutter_pan_action_set_acceleration_factor(self.as_ref().to_glib_none().0, factor);
-        }
-    }
-
-    fn set_deceleration(&self, rate: f64) {
-        unsafe {
-            ffi::clutter_pan_action_set_deceleration(self.as_ref().to_glib_none().0, rate);
-        }
-    }
-
-    fn set_interpolate(&self, should_interpolate: bool) {
-        unsafe {
-            ffi::clutter_pan_action_set_interpolate(
-                self.as_ref().to_glib_none().0,
-                should_interpolate.to_glib(),
-            );
-        }
-    }
-
-    fn set_pan_axis(&self, axis: PanAxis) {
-        unsafe {
-            ffi::clutter_pan_action_set_pan_axis(self.as_ref().to_glib_none().0, axis.to_glib());
-        }
-    }
-
-    fn connect_pan<F: Fn(&Self, &Actor, bool) -> bool + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn pan_trampoline<P, F: Fn(&P, &Actor, bool) -> bool + 'static>(
-            this: *mut ffi::ClutterPanAction,
-            actor: *mut ffi::ClutterActor,
-            is_interpolated: glib_sys::gboolean,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<PanAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &PanAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                from_glib(is_interpolated),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"pan\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    pan_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_pan_stopped<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn pan_stopped_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterPanAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<PanAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &PanAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"pan-stopped\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    pan_stopped_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_acceleration_factor_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_acceleration_factor_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterPanAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<PanAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&PanAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::acceleration-factor\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_acceleration_factor_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_deceleration_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_deceleration_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterPanAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<PanAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&PanAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::deceleration\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_deceleration_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_interpolate_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_interpolate_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterPanAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<PanAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&PanAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::interpolate\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_interpolate_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_pan_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_pan_axis_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterPanAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<PanAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&PanAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::pan-axis\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_pan_axis_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for PanAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "PanAction")
-    }
-}
diff --git a/src/legacy/param_spec_color.rs b/src/legacy/param_spec_color.rs
deleted file mode 100644
index 38d672b..0000000
--- a/src/legacy/param_spec_color.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-// use glib::{object as gobject, translate::*};
-// use std::fmt;
-
-// glib_wrapper! {
-//     pub struct ParamSpecColor(Object<ffi::ClutterParamSpecColor, ParamSpecColorClass>) @extends gobject::ParamSpec;
-
-//     match fn {
-//         get_type => || ffi::clutter_param_color_get_type(),
-//     }
-// }
-
-// impl ParamSpecColor {}
-
-// impl fmt::Display for ParamSpecColor {
-//     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-//         write!(f, "ParamSpecColor")
-//     }
-// }
diff --git a/src/legacy/param_spec_unit.rs b/src/legacy/param_spec_unit.rs
deleted file mode 100644
index b37a498..0000000
--- a/src/legacy/param_spec_unit.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-// use glib::translate::*;
-// use std::fmt;
-
-// glib_wrapper! {
-//     pub struct ParamSpecUnit(Object<ffi::ClutterParamSpecUnit, ParamSpecUnitClass>) @extends glib::ParamSpec;
-
-//     match fn {
-//         get_type => || ffi::clutter_param_units_get_type(),
-//     }
-// }
-
-// impl ParamSpecUnit {}
-
-// impl fmt::Display for ParamSpecUnit {
-//     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-//         write!(f, "ParamSpecUnit")
-//     }
-// }
diff --git a/src/legacy/path.rs b/src/legacy/path.rs
deleted file mode 100644
index d67650d..0000000
--- a/src/legacy/path.rs
+++ /dev/null
@@ -1,530 +0,0 @@
-use crate::{Knot, PathNode};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct Path(Object<ffi::ClutterPath, ffi::ClutterPathClass, PathClass>) @extends gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_path_get_type(),
-    }
-}
-
-impl Path {
-    /// Creates a new `Path` instance with no nodes.
-    ///
-    /// The object has a floating reference so if you add it to a
-    /// `BehaviourPath` then you do not need to unref it.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Path`
-    pub fn new() -> Path {
-        unsafe { from_glib_none(ffi::clutter_path_new()) }
-    }
-
-    pub fn with_description(desc: &str) -> Path {
-        unsafe {
-            from_glib_none(ffi::clutter_path_new_with_description(
-                desc.to_glib_none().0,
-            ))
-        }
-    }
-}
-
-impl Default for Path {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `Path` methods.
-///
-/// # Implementors
-///
-/// [`Path`](struct.Path.html)
-pub trait PathExt: 'static {
-    // /// Add the nodes of the Cairo path to the end of `self`.
-    // /// ## `cpath`
-    // /// a Cairo path
-    // fn add_cairo_path(&self, cpath: &cairo::Path);
-
-    /// Adds a `PathNodeType::Close` type node to the path. This creates a
-    /// straight line from the last node to the last `PathNodeType::MoveTo`
-    /// type node.
-    fn add_close(&self);
-
-    /// Adds a `PathNodeType::CurveTo` type node to the path. This causes
-    /// the actor to follow a bezier from the last node to (`x_3`, `y_3`) using
-    /// (`x_1`, `y_1`) and (`x_2`,`y_2`) as control points.
-    /// ## `x_1`
-    /// the x coordinate of the first control point
-    /// ## `y_1`
-    /// the y coordinate of the first control point
-    /// ## `x_2`
-    /// the x coordinate of the second control point
-    /// ## `y_2`
-    /// the y coordinate of the second control point
-    /// ## `x_3`
-    /// the x coordinate of the third control point
-    /// ## `y_3`
-    /// the y coordinate of the third control point
-    fn add_curve_to(&self, x_1: i32, y_1: i32, x_2: i32, y_2: i32, x_3: i32, y_3: i32);
-
-    /// Adds a `PathNodeType::LineTo` type node to the path. This causes the
-    /// actor to move to the new coordinates in a straight line.
-    /// ## `x`
-    /// the x coordinate
-    /// ## `y`
-    /// the y coordinate
-    fn add_line_to(&self, x: i32, y: i32);
-
-    /// Adds a `PathNodeType::MoveTo` type node to the path. This is usually
-    /// used as the first node in a path. It can also be used in the middle
-    /// of the path to cause the actor to jump to the new coordinate.
-    /// ## `x`
-    /// the x coordinate
-    /// ## `y`
-    /// the y coordinate
-    fn add_move_to(&self, x: i32, y: i32);
-
-    /// Adds `node` to the end of the path.
-    /// ## `node`
-    /// a `PathNode`
-    fn add_node(&self, node: &PathNode);
-
-    /// Same as `PathExt::add_curve_to` except the coordinates are
-    /// relative to the previous node.
-    /// ## `x_1`
-    /// the x coordinate of the first control point
-    /// ## `y_1`
-    /// the y coordinate of the first control point
-    /// ## `x_2`
-    /// the x coordinate of the second control point
-    /// ## `y_2`
-    /// the y coordinate of the second control point
-    /// ## `x_3`
-    /// the x coordinate of the third control point
-    /// ## `y_3`
-    /// the y coordinate of the third control point
-    fn add_rel_curve_to(&self, x_1: i32, y_1: i32, x_2: i32, y_2: i32, x_3: i32, y_3: i32);
-
-    /// Same as `PathExt::add_line_to` except the coordinates are
-    /// relative to the previous node.
-    /// ## `x`
-    /// the x coordinate
-    /// ## `y`
-    /// the y coordinate
-    fn add_rel_line_to(&self, x: i32, y: i32);
-
-    /// Same as `PathExt::add_move_to` except the coordinates are
-    /// relative to the previous node.
-    /// ## `x`
-    /// the x coordinate
-    /// ## `y`
-    /// the y coordinate
-    fn add_rel_move_to(&self, x: i32, y: i32);
-
-    /// Adds new nodes to the end of the path as described in `str`. The
-    /// format is a subset of the SVG path format. Each node is represented
-    /// by a letter and is followed by zero, one or three pairs of
-    /// coordinates. The coordinates can be separated by spaces or a
-    /// comma. The types are:
-    ///
-    ///  - `M`: Adds a `PathNodeType::MoveTo` node. Takes one pair of coordinates.
-    ///  - `L`: Adds a `PathNodeType::LineTo` node. Takes one pair of coordinates.
-    ///  - `C`: Adds a `PathNodeType::CurveTo` node. Takes three pairs of coordinates.
-    ///  - `z`: Adds a `PathNodeType::Close` node. No coordinates are needed.
-    ///
-    /// The M, L and C commands can also be specified in lower case which
-    /// means the coordinates are relative to the previous node.
-    ///
-    /// For example, to move an actor in a 100 by 100 pixel square centered
-    /// on the point 300,300 you could use the following path:
-    ///
-    ///
-    /// ```text
-    ///   M 250,350 l 0 -100 L 350,250 l 0 100 z
-    /// ```
-    ///
-    /// If the path description isn't valid `false` will be returned and no
-    /// nodes will be added.
-    /// ## `str`
-    /// a string describing the new nodes
-    ///
-    /// # Returns
-    ///
-    /// `true` is the path description was valid or `false`
-    /// otherwise.
-    fn add_string(&self, str: &str) -> bool;
-
-    /// Removes all nodes from the path.
-    fn clear(&self);
-
-    /// Calls a function for each node of the path.
-    /// ## `callback`
-    /// the function to call with each node
-    /// ## `user_data`
-    /// user data to pass to the function
-    fn foreach<P: FnMut(&PathNode)>(&self, callback: P);
-
-    /// Returns a newly allocated string describing the path in the same
-    /// format as used by `PathExt::add_string`.
-    ///
-    /// # Returns
-    ///
-    /// a string description of the path. Free with `g_free`.
-    fn get_description(&self) -> Option<GString>;
-
-    /// Retrieves an approximation of the total length of the path.
-    ///
-    /// # Returns
-    ///
-    /// the length of the path.
-    fn get_length(&self) -> u32;
-
-    /// Retrieves the number of nodes in the path.
-    ///
-    /// # Returns
-    ///
-    /// the number of nodes.
-    fn get_n_nodes(&self) -> u32;
-
-    /// Retrieves the node of the path indexed by `index`.
-    /// ## `index_`
-    /// the node number to retrieve
-    /// ## `node`
-    /// a location to store a copy of the node
-    fn get_node(&self, index_: u32) -> PathNode;
-
-    /// Returns a `glib::SList` of `PathNode`<!-- -->s. The list should be
-    /// freed with `glib::SList::free`. The nodes are owned by the path and
-    /// should not be freed. Altering the path may cause the nodes in the
-    /// list to become invalid so you should copy them if you want to keep
-    /// the list.
-    ///
-    /// # Returns
-    ///
-    /// a
-    ///  list of nodes in the path.
-    fn get_nodes(&self) -> Vec<PathNode>;
-
-    /// The value in `progress` represents a position along the path where
-    /// 0.0 is the beginning and 1.0 is the end of the path. An
-    /// interpolated position is then stored in `position`.
-    /// ## `progress`
-    /// a position along the path as a fraction of its length
-    /// ## `position`
-    /// location to store the position
-    ///
-    /// # Returns
-    ///
-    /// index of the node used to calculate the position.
-    fn get_position(&self, progress: f64) -> (u32, Knot);
-
-    /// Inserts `node` into the path before the node at the given offset. If
-    /// `index_` is negative it will append the node to the end of the path.
-    /// ## `index_`
-    /// offset of where to insert the node
-    /// ## `node`
-    /// the node to insert
-    fn insert_node(&self, index_: i32, node: &PathNode);
-
-    /// Removes the node at the given offset from the path.
-    /// ## `index_`
-    /// index of the node to remove
-    fn remove_node(&self, index_: u32);
-
-    /// Replaces the node at offset `index_` with `node`.
-    /// ## `index_`
-    /// index to the existing node
-    /// ## `node`
-    /// the replacement node
-    fn replace_node(&self, index_: u32, node: &PathNode);
-
-    /// Replaces all of the nodes in the path with nodes described by
-    /// `str`. See `PathExt::add_string` for details of the format.
-    ///
-    /// If the string is invalid then `false` is returned and the path is
-    /// unaltered.
-    /// ## `str`
-    /// a string describing the path
-    ///
-    /// # Returns
-    ///
-    /// `true` is the path was valid, `false` otherwise.
-    fn set_description(&self, str: &str) -> bool;
-
-    // /// Add the nodes of the Path to the path in the Cairo context.
-    // /// ## `cr`
-    // /// a Cairo context
-    // fn to_cairo_path(&self, cr: &mut cairo::Context);
-
-    fn connect_property_description_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Path>> PathExt for O {
-    // fn add_cairo_path(&self, cpath: &cairo::Path) {
-    //     unsafe {
-    //         ffi::clutter_path_add_cairo_path(
-    //             self.as_ref().to_glib_none().0,
-    //             cpath.to_glib_none().0,
-    //         );
-    //     }
-    // }
-
-    fn add_close(&self) {
-        unsafe {
-            ffi::clutter_path_add_close(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn add_curve_to(&self, x_1: i32, y_1: i32, x_2: i32, y_2: i32, x_3: i32, y_3: i32) {
-        unsafe {
-            ffi::clutter_path_add_curve_to(
-                self.as_ref().to_glib_none().0,
-                x_1,
-                y_1,
-                x_2,
-                y_2,
-                x_3,
-                y_3,
-            );
-        }
-    }
-
-    fn add_line_to(&self, x: i32, y: i32) {
-        unsafe {
-            ffi::clutter_path_add_line_to(self.as_ref().to_glib_none().0, x, y);
-        }
-    }
-
-    fn add_move_to(&self, x: i32, y: i32) {
-        unsafe {
-            ffi::clutter_path_add_move_to(self.as_ref().to_glib_none().0, x, y);
-        }
-    }
-
-    fn add_node(&self, node: &PathNode) {
-        unsafe {
-            ffi::clutter_path_add_node(self.as_ref().to_glib_none().0, node.to_glib_none().0);
-        }
-    }
-
-    fn add_rel_curve_to(&self, x_1: i32, y_1: i32, x_2: i32, y_2: i32, x_3: i32, y_3: i32) {
-        unsafe {
-            ffi::clutter_path_add_rel_curve_to(
-                self.as_ref().to_glib_none().0,
-                x_1,
-                y_1,
-                x_2,
-                y_2,
-                x_3,
-                y_3,
-            );
-        }
-    }
-
-    fn add_rel_line_to(&self, x: i32, y: i32) {
-        unsafe {
-            ffi::clutter_path_add_rel_line_to(self.as_ref().to_glib_none().0, x, y);
-        }
-    }
-
-    fn add_rel_move_to(&self, x: i32, y: i32) {
-        unsafe {
-            ffi::clutter_path_add_rel_move_to(self.as_ref().to_glib_none().0, x, y);
-        }
-    }
-
-    fn add_string(&self, str: &str) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_path_add_string(
-                self.as_ref().to_glib_none().0,
-                str.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn clear(&self) {
-        unsafe {
-            ffi::clutter_path_clear(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn foreach<P: FnMut(&PathNode)>(&self, callback: P) {
-        let callback_data: P = callback;
-        unsafe extern "C" fn callback_func<P: FnMut(&PathNode)>(
-            node: *const ffi::ClutterPathNode,
-            data: glib_sys::gpointer,
-        ) {
-            let node = from_glib_borrow(node);
-            let callback: *mut P = data as *const _ as usize as *mut P;
-            (*callback)(&node);
-        }
-        let callback = Some(callback_func::<P> as _);
-        let super_callback0: &P = &callback_data;
-        unsafe {
-            ffi::clutter_path_foreach(
-                self.as_ref().to_glib_none().0,
-                callback,
-                super_callback0 as *const _ as usize as *mut _,
-            );
-        }
-    }
-
-    fn get_description(&self) -> Option<GString> {
-        unsafe {
-            from_glib_full(ffi::clutter_path_get_description(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_length(&self) -> u32 {
-        unsafe { ffi::clutter_path_get_length(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_n_nodes(&self) -> u32 {
-        unsafe { ffi::clutter_path_get_n_nodes(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_node(&self, index_: u32) -> PathNode {
-        unsafe {
-            let mut node = PathNode::uninitialized();
-            ffi::clutter_path_get_node(
-                self.as_ref().to_glib_none().0,
-                index_,
-                node.to_glib_none_mut().0,
-            );
-            node
-        }
-    }
-
-    fn get_nodes(&self) -> Vec<PathNode> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_path_get_nodes(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_position(&self, progress: f64) -> (u32, Knot) {
-        unsafe {
-            let mut position = Knot::uninitialized();
-            let ret = ffi::clutter_path_get_position(
-                self.as_ref().to_glib_none().0,
-                progress,
-                position.to_glib_none_mut().0,
-            );
-            (ret, position)
-        }
-    }
-
-    fn insert_node(&self, index_: i32, node: &PathNode) {
-        unsafe {
-            ffi::clutter_path_insert_node(
-                self.as_ref().to_glib_none().0,
-                index_,
-                node.to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_node(&self, index_: u32) {
-        unsafe {
-            ffi::clutter_path_remove_node(self.as_ref().to_glib_none().0, index_);
-        }
-    }
-
-    fn replace_node(&self, index_: u32, node: &PathNode) {
-        unsafe {
-            ffi::clutter_path_replace_node(
-                self.as_ref().to_glib_none().0,
-                index_,
-                node.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_description(&self, str: &str) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_path_set_description(
-                self.as_ref().to_glib_none().0,
-                str.to_glib_none().0,
-            ))
-        }
-    }
-
-    // fn to_cairo_path(&self, cr: &mut cairo::Context) {
-    //     unsafe {
-    //         ffi::clutter_path_to_cairo_path(
-    //             self.as_ref().to_glib_none().0,
-    //             cr.to_glib_none_mut().0,
-    //         );
-    //     }
-    // }
-
-    fn connect_property_description_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_description_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterPath,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Path>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Path::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::description\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_description_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_length_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterPath,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Path>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Path::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::length\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_length_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Path {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Path")
-    }
-}
diff --git a/src/legacy/path_constraint.rs b/src/legacy/path_constraint.rs
deleted file mode 100644
index 15fbb0b..0000000
--- a/src/legacy/path_constraint.rs
+++ /dev/null
@@ -1,173 +0,0 @@
-use crate::{Actor, ActorMeta, Constraint, Path};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct PathConstraint(Object<ffi::ClutterPathConstraint, ffi::ClutterPathConstraintClass, PathConstraintClass>) @extends Constraint, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_path_constraint_get_type(),
-    }
-}
-
-impl PathConstraint {
-    /// Creates a new `PathConstraint` with the given `path` and `offset`
-    /// ## `path`
-    /// a `Path`, or `None`
-    /// ## `offset`
-    /// the offset along the `Path`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PathConstraint`
-    pub fn new<P: IsA<Path>>(path: Option<&P>, offset: f32) -> PathConstraint {
-        unsafe {
-            Constraint::from_glib_none(ffi::clutter_path_constraint_new(
-                path.map(|p| p.as_ref()).to_glib_none().0,
-                offset,
-            ))
-            .unsafe_cast()
-        }
-    }
-
-    /// Retrieves the offset along the `Path` used by `self`.
-    ///
-    /// # Returns
-    ///
-    /// the offset
-    pub fn get_offset(&self) -> f32 {
-        unsafe { ffi::clutter_path_constraint_get_offset(self.to_glib_none().0) }
-    }
-
-    /// Retrieves a pointer to the `Path` used by `self`.
-    ///
-    /// # Returns
-    ///
-    /// the `Path` used by the
-    ///  `PathConstraint`, or `None`. The returned `Path` is owned
-    ///  by the constraint and it should not be unreferenced
-    pub fn get_path(&self) -> Option<Path> {
-        unsafe { from_glib_none(ffi::clutter_path_constraint_get_path(self.to_glib_none().0)) }
-    }
-
-    /// Sets the offset along the `Path` used by `self`.
-    /// ## `offset`
-    /// the offset along the path
-    pub fn set_offset(&self, offset: f32) {
-        unsafe {
-            ffi::clutter_path_constraint_set_offset(self.to_glib_none().0, offset);
-        }
-    }
-
-    /// Sets the `path` to be followed by the `PathConstraint`.
-    ///
-    /// The `self` will take ownership of the `Path` passed to this
-    /// function.
-    /// ## `path`
-    /// a `Path`
-    pub fn set_path<P: IsA<Path>>(&self, path: Option<&P>) {
-        unsafe {
-            ffi::clutter_path_constraint_set_path(
-                self.to_glib_none().0,
-                path.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The ::node-reached signal is emitted each time a
-    /// `PathConstraint:offset` value results in the actor
-    /// passing a `PathNode`
-    /// ## `actor`
-    /// the `Actor` using the `constraint`
-    /// ## `index`
-    /// the index of the node that has been reached
-    pub fn connect_node_reached<F: Fn(&PathConstraint, &Actor, u32) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn node_reached_trampoline<
-            F: Fn(&PathConstraint, &Actor, u32) + 'static,
-        >(
-            this: *mut ffi::ClutterPathConstraint,
-            actor: *mut ffi::ClutterActor,
-            index: libc::c_uint,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this), &from_glib_borrow(actor), index)
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"node-reached\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    node_reached_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_offset_notify<F: Fn(&PathConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_offset_trampoline<F: Fn(&PathConstraint) + 'static>(
-            this: *mut ffi::ClutterPathConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::offset\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_offset_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_path_notify<F: Fn(&PathConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_path_trampoline<F: Fn(&PathConstraint) + 'static>(
-            this: *mut ffi::ClutterPathConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::path\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_path_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for PathConstraint {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "PathConstraint")
-    }
-}
diff --git a/src/legacy/path_node.rs b/src/legacy/path_node.rs
deleted file mode 100644
index 87c274f..0000000
--- a/src/legacy/path_node.rs
+++ /dev/null
@@ -1,49 +0,0 @@
-use glib::translate::*;
-use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialOrd, Ord)] // Hash
-    pub struct PathNode(Boxed<ffi::ClutterPathNode>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_path_node_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_path_node_free(ptr),
-        get_type => || ffi::clutter_path_node_get_type(),
-    }
-}
-
-impl PathNode {
-    /// Compares two nodes and checks if they are the same type with the
-    /// same coordinates.
-    /// ## `node_b`
-    /// Second node
-    ///
-    /// # Returns
-    ///
-    /// `true` if the nodes are the same.
-    fn equal(&self, node_b: &PathNode) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_path_node_equal(
-                self.to_glib_none().0,
-                node_b.to_glib_none().0,
-            ))
-        }
-    }
-}
-
-impl PartialEq for PathNode {
-    #[inline]
-    fn eq(&self, other: &Self) -> bool {
-        self.equal(other)
-    }
-}
-
-impl Eq for PathNode {}
-
-#[doc(hidden)]
-impl Uninitialized for PathNode {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        mem::zeroed()
-    }
-}
diff --git a/src/legacy/perspective.rs b/src/legacy/perspective.rs
deleted file mode 100644
index 5dfda31..0000000
--- a/src/legacy/perspective.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-use glib::translate::*;
-use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct Perspective(Boxed<ffi::ClutterPerspective>);
-
-    match fn {
-        copy => |ptr| gobject_sys::g_boxed_copy(ffi::clutter_perspective_get_type(), ptr as *mut _) as *mut ffi::ClutterPerspective,
-        free => |ptr| gobject_sys::g_boxed_free(ffi::clutter_perspective_get_type(), ptr as *mut _),
-        get_type => || ffi::clutter_perspective_get_type(),
-    }
-}
-
-#[doc(hidden)]
-impl Uninitialized for Perspective {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        mem::zeroed()
-    }
-}
diff --git a/src/legacy/pipeline_node.rs b/src/legacy/pipeline_node.rs
deleted file mode 100644
index 87aa51e..0000000
--- a/src/legacy/pipeline_node.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-use crate::PaintNode;
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct PipelineNode(Object<ffi::ClutterPipelineNode, ffi::ClutterPipelineNodeClass, PipelineNodeClass>) @extends PaintNode;
-
-    match fn {
-        get_type => || ffi::clutter_pipeline_node_get_type(),
-    }
-}
-
-impl PipelineNode {}
-
-impl fmt::Display for PipelineNode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "PipelineNode")
-    }
-}
diff --git a/src/legacy/point.rs b/src/legacy/point.rs
deleted file mode 100644
index 8071284..0000000
--- a/src/legacy/point.rs
+++ /dev/null
@@ -1,103 +0,0 @@
-use glib::translate::*;
-use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct InternalPoint(Boxed<ffi::ClutterPoint>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_point_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_point_free(ptr),
-        get_type => || ffi::clutter_point_get_type(),
-    }
-}
-
-impl InternalPoint {
-    /// Allocates a new `Point`.
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `Point`.
-    ///  Use `Point::free` to free its resources.
-    pub fn alloc() -> InternalPoint {
-        unsafe { from_glib_full(ffi::clutter_point_alloc()) }
-    }
-
-    /// Computes the distance between two `Point`.
-    /// ## `b`
-    /// a `Point`
-    /// ## `x_distance`
-    /// return location for the horizontal
-    ///  distance between the points
-    /// ## `y_distance`
-    /// return location for the vertical
-    ///  distance between the points
-    ///
-    /// # Returns
-    ///
-    /// the distance between the points.
-    pub fn distance(&self, b: &InternalPoint) -> (f32, f32, f32) {
-        unsafe {
-            let mut x_distance = mem::MaybeUninit::uninit();
-            let mut y_distance = mem::MaybeUninit::uninit();
-            let ret = ffi::clutter_point_distance(
-                self.to_glib_none().0,
-                b.to_glib_none().0,
-                x_distance.as_mut_ptr(),
-                y_distance.as_mut_ptr(),
-            );
-            let x_distance = x_distance.assume_init();
-            let y_distance = y_distance.assume_init();
-            (ret, x_distance, y_distance)
-        }
-    }
-
-    /// Compares two `Point` for equality.
-    /// ## `b`
-    /// the second `Point` to compare
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `ClutterPoints` are equal
-    pub fn equals(&self, b: &InternalPoint) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_point_equals(
-                self.to_glib_none().0,
-                b.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Initializes `self` with the given coordinates.
-    /// ## `x`
-    /// the X coordinate of the point
-    /// ## `y`
-    /// the Y coordinate of the point
-    ///
-    /// # Returns
-    ///
-    /// the initialized `Point`
-    pub fn init(&mut self, x: f32, y: f32) -> Option<InternalPoint> {
-        unsafe { from_glib_none(ffi::clutter_point_init(self.to_glib_none_mut().0, x, y)) }
-    }
-
-    /// A point centered at (0, 0).
-    ///
-    /// The returned value can be used as a guard.
-    ///
-    /// # Returns
-    ///
-    /// a point centered in (0, 0); the returned `Point`
-    ///  is owned by internals and it should not be modified or freed.
-    pub fn zero() -> Option<InternalPoint> {
-        unsafe { from_glib_none(ffi::clutter_point_zero()) }
-    }
-}
-
-#[doc(hidden)]
-impl Uninitialized for InternalPoint {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        Self::alloc()
-    }
-}
diff --git a/src/legacy/property_transition.rs b/src/legacy/property_transition.rs
deleted file mode 100644
index d87cb75..0000000
--- a/src/legacy/property_transition.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-// Scriptable
-use crate::{Timeline, Transition};
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-// TODO: @implements Scriptable
-glib_wrapper! {
-    pub struct PropertyTransition(Object<ffi::ClutterPropertyTransition, ffi::ClutterPropertyTransitionClass, PropertyTransitionClass>) @extends Transition, Timeline;
-
-    match fn {
-        get_type => || ffi::clutter_property_transition_get_type(),
-    }
-}
-
-impl PropertyTransition {
-    /// Creates a new `PropertyTransition`.
-    /// ## `property_name`
-    /// a property of `animatable`, or `None`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PropertyTransition`.
-    ///  Use `gobject::ObjectExt::unref` when done
-    pub fn new(property_name: Option<&str>) -> PropertyTransition {
-        unsafe {
-            Transition::from_glib_full(ffi::clutter_property_transition_new(
-                property_name.to_glib_none().0,
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-/// Trait containing all `PropertyTransition` methods.
-///
-/// # Implementors
-///
-/// [`KeyframeTransition`](struct.KeyframeTransition.html), [`PropertyTransition`](struct.PropertyTransition.html)
-pub trait PropertyTransitionExt: 'static {
-    /// Retrieves the value of the `PropertyTransition:property-name`
-    /// property.
-    ///
-    /// # Returns
-    ///
-    /// the name of the property being animated, or `None` if
-    ///  none is set. The returned string is owned by the `self` and
-    ///  it should not be freed.
-    fn get_property_name(&self) -> Option<GString>;
-
-    /// Sets the `PropertyTransition:property-name` property of `self`.
-    /// ## `property_name`
-    /// a property name
-    fn set_property_name(&self, property_name: Option<&str>);
-
-    fn connect_property_property_name_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<PropertyTransition>> PropertyTransitionExt for O {
-    fn get_property_name(&self) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_property_transition_get_property_name(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_property_name(&self, property_name: Option<&str>) {
-        unsafe {
-            ffi::clutter_property_transition_set_property_name(
-                self.as_ref().to_glib_none().0,
-                property_name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_property_name_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_property_name_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterPropertyTransition,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<PropertyTransition>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&PropertyTransition::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::property-name\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_property_name_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for PropertyTransition {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "PropertyTransition")
-    }
-}
diff --git a/src/legacy/rect.rs b/src/legacy/rect.rs
deleted file mode 100644
index 693cf24..0000000
--- a/src/legacy/rect.rs
+++ /dev/null
@@ -1,292 +0,0 @@
-use crate::InternalPoint;
-use glib::translate::*;
-// use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct InternalRect(Boxed<ffi::ClutterRect>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_rect_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_rect_free(ptr),
-        get_type => || ffi::clutter_rect_get_type(),
-    }
-}
-
-impl InternalRect {
-    /// Creates a new, empty `Rect`.
-    ///
-    /// You can use `Rect::init` to initialize the returned rectangle,
-    /// for instance:
-    ///
-    ///
-    /// ```text
-    ///   rect = rect_init (rect_alloc (), x, y, width, height);
-    /// ```
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `Rect`.
-    ///  Use `Rect::free` to free its resources
-    pub fn alloc() -> InternalRect {
-        unsafe { from_glib_full(ffi::clutter_rect_alloc()) }
-    }
-
-    /// Rounds the origin of `self` downwards to the nearest integer, and rounds
-    /// the size of `self` upwards to the nearest integer, so that `self` is
-    /// updated to the smallest rectangle capable of fully containing the
-    /// original, fractional rectangle.
-    pub fn clamp_to_pixel(&mut self) {
-        unsafe {
-            ffi::clutter_rect_clamp_to_pixel(self.to_glib_none_mut().0);
-        }
-    }
-
-    /// Checks whether `point` is contained by `self`, after normalizing the
-    /// rectangle.
-    /// ## `point`
-    /// the point to check
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `point` is contained by `self`.
-    pub fn contains_point(&mut self, point: &mut InternalPoint) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_rect_contains_point(
-                self.to_glib_none_mut().0,
-                point.to_glib_none_mut().0,
-            ))
-        }
-    }
-
-    /// Checks whether `self` contains `b`.
-    ///
-    /// The first rectangle contains the second if the union of the
-    /// two `Rect` is equal to the first rectangle.
-    /// ## `b`
-    /// a `Rect`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the first rectangle contains the second.
-    pub fn contains_rect(&mut self, b: &mut InternalRect) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_rect_contains_rect(
-                self.to_glib_none_mut().0,
-                b.to_glib_none_mut().0,
-            ))
-        }
-    }
-
-    /// Checks whether `self` and `b` are equals.
-    ///
-    /// This function will normalize both `self` and `b` before comparing
-    /// their origin and size.
-    /// ## `b`
-    /// a `Rect`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the rectangles match in origin and size.
-    pub fn equals(&mut self, b: &mut InternalRect) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_rect_equals(
-                self.to_glib_none_mut().0,
-                b.to_glib_none_mut().0,
-            ))
-        }
-    }
-
-    /// Retrieves the center of `self`, after normalizing the rectangle,
-    /// and updates `center` with the correct coordinates.
-    /// ## `center`
-    /// a `Point`
-    pub fn get_center(&mut self) -> InternalPoint {
-        unsafe {
-            let mut center = InternalPoint::uninitialized();
-            ffi::clutter_rect_get_center(self.to_glib_none_mut().0, center.to_glib_none_mut().0);
-            center
-        }
-    }
-
-    /// Retrieves the height of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the height of the rectangle
-    pub fn get_height(&mut self) -> f32 {
-        unsafe { ffi::clutter_rect_get_height(self.to_glib_none_mut().0) }
-    }
-
-    /// Retrieves the width of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the width of the rectangle
-    pub fn get_width(&mut self) -> f32 {
-        unsafe { ffi::clutter_rect_get_width(self.to_glib_none_mut().0) }
-    }
-
-    /// Retrieves the X coordinate of the origin of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the X coordinate of the origin of the rectangle
-    pub fn get_x(&mut self) -> f32 {
-        unsafe { ffi::clutter_rect_get_x(self.to_glib_none_mut().0) }
-    }
-
-    /// Retrieves the Y coordinate of the origin of `self`.
-    ///
-    /// # Returns
-    ///
-    /// the Y coordinate of the origin of the rectangle
-    pub fn get_y(&mut self) -> f32 {
-        unsafe { ffi::clutter_rect_get_y(self.to_glib_none_mut().0) }
-    }
-
-    /// Initializes a `Rect` with the given origin and size.
-    /// ## `x`
-    /// X coordinate of the origin
-    /// ## `y`
-    /// Y coordinate of the origin
-    /// ## `width`
-    /// width of the rectangle
-    /// ## `height`
-    /// height of the rectangle
-    ///
-    /// # Returns
-    ///
-    /// the updated rectangle
-    pub fn init(&mut self, x: f32, y: f32, width: f32, height: f32) -> Option<InternalRect> {
-        unsafe {
-            from_glib_none(ffi::clutter_rect_init(
-                self.to_glib_none_mut().0,
-                x,
-                y,
-                width,
-                height,
-            ))
-        }
-    }
-
-    /// Normalizes the `self` and offsets its origin by the `d_x` and `d_y` values;
-    /// the size is adjusted by (2 * `d_x`, 2 * `d_y`).
-    ///
-    /// If `d_x` and `d_y` are positive the size of the rectangle is decreased; if
-    /// the values are negative, the size of the rectangle is increased.
-    ///
-    /// If the resulting rectangle has a negative width or height, the size is
-    /// set to 0.
-    /// ## `d_x`
-    /// an horizontal value; a positive `d_x` will create an inset rectangle,
-    ///  and a negative value will create a larger rectangle
-    /// ## `d_y`
-    /// a vertical value; a positive `d_x` will create an inset rectangle,
-    ///  and a negative value will create a larger rectangle
-    pub fn inset(&mut self, d_x: f32, d_y: f32) {
-        unsafe {
-            ffi::clutter_rect_inset(self.to_glib_none_mut().0, d_x, d_y);
-        }
-    }
-
-    /// Computes the intersection of `self` and `b`, and places it in `res`, if `res`
-    /// is not `None`.
-    ///
-    /// This function will normalize both `self` and `b` prior to computing their
-    /// intersection.
-    ///
-    /// This function can be used to simply check if the intersection of `self` and `b`
-    /// is not empty, by using `None` for `res`.
-    /// ## `b`
-    /// a `Rect`
-    /// ## `res`
-    /// a `Rect`, or `None`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the intersection of `self` and `b` is not empty
-    pub fn intersection(&mut self, b: &mut InternalRect) -> Option<InternalRect> {
-        unsafe {
-            let mut res = InternalRect::uninitialized();
-            let ret = from_glib(ffi::clutter_rect_intersection(
-                self.to_glib_none_mut().0,
-                b.to_glib_none_mut().0,
-                res.to_glib_none_mut().0,
-            ));
-            if ret {
-                Some(res)
-            } else {
-                None
-            }
-        }
-    }
-
-    /// Normalizes a `Rect`.
-    ///
-    /// A `Rect` is defined by the area covered by its size; this means
-    /// that a `Rect` with `Rect.origin` in [ 0, 0 ] and a
-    /// `Rect.size` of [ 10, 10 ] is equivalent to a `Rect` with
-    /// `Rect.origin` in [ 10, 10 ] and a `Rect.size` of [ -10, -10 ].
-    ///
-    /// This function is useful to ensure that a rectangle has positive width
-    /// and height; it will modify the passed `self` and normalize its size.
-    pub fn normalize(&mut self) -> Option<InternalRect> {
-        unsafe { from_glib_full(ffi::clutter_rect_normalize(self.to_glib_none_mut().0)) }
-    }
-
-    /// Offsets the origin of `self` by the given values, after normalizing
-    /// the rectangle.
-    /// ## `d_x`
-    /// the horizontal offset value
-    /// ## `d_y`
-    /// the vertical offset value
-    pub fn offset(&mut self, d_x: f32, d_y: f32) {
-        unsafe {
-            ffi::clutter_rect_offset(self.to_glib_none_mut().0, d_x, d_y);
-        }
-    }
-
-    /// Computes the smallest possible rectangle capable of fully containing
-    /// both `self` and `b`, and places it into `res`.
-    ///
-    /// This function will normalize both `self` and `b` prior to computing their
-    /// union.
-    /// ## `b`
-    /// a `Rect`
-    /// ## `res`
-    /// a `Rect`
-    pub fn union(&mut self, b: &mut InternalRect) -> InternalRect {
-        unsafe {
-            let mut res = InternalRect::uninitialized();
-            ffi::clutter_rect_union(
-                self.to_glib_none_mut().0,
-                b.to_glib_none_mut().0,
-                res.to_glib_none_mut().0,
-            );
-            res
-        }
-    }
-
-    /// A `Rect` with `Rect.origin` set at (0, 0) and a size
-    /// of 0.
-    ///
-    /// The returned value can be used as a guard.
-    ///
-    /// # Returns
-    ///
-    /// a rectangle with origin in (0, 0) and a size of 0.
-    ///  The returned `Rect` is owned by Clutter and it should not
-    ///  be modified or freed.
-    pub fn zero() -> Option<InternalRect> {
-        unsafe { from_glib_none(ffi::clutter_rect_zero()) }
-    }
-}
-
-#[doc(hidden)]
-impl Uninitialized for InternalRect {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        Self::alloc()
-    }
-}
diff --git a/src/legacy/rectangle.rs b/src/legacy/rectangle.rs
deleted file mode 100644
index c68f17d..0000000
--- a/src/legacy/rectangle.rs
+++ /dev/null
@@ -1,293 +0,0 @@
-// Scriptable
-use crate::{Actor, Animatable, Container, InternalColor, Color, RgbaColor};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct Rectangle(Object<ffi::ClutterRectangle, ffi::ClutterRectangleClass, RectangleClass>) @extends Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_rectangle_get_type(),
-    }
-}
-
-/// Trait containing all `Rectangle` methods.
-///
-/// # Implementors
-///
-/// [`Rectangle`](struct.Rectangle.html)
-pub trait RectangleExt: 'static {
-    /// The color of the border of the rectangle.
-    fn get_property_border_color(&self) -> Option<InternalColor>;
-
-    /// The color of the border of the rectangle.
-    fn set_property_border_color(&self, border_color: Option<Color>);
-
-    /// The width of the border of the rectangle, in pixels.
-    fn get_property_border_width(&self) -> u32;
-
-    /// The width of the border of the rectangle, in pixels.
-    fn set_property_border_width(&self, border_width: u32);
-
-    /// The color of the rectangle.
-    fn get_property_color(&self) -> Option<InternalColor>;
-
-    /// The color of the rectangle.
-    fn set_property_color(&self, color: Option<Color>);
-
-    /// Whether the `Rectangle` should be displayed with a border.
-    fn get_property_has_border(&self) -> bool;
-
-    /// Whether the `Rectangle` should be displayed with a border.
-    fn set_property_has_border(&self, has_border: bool);
-
-    fn connect_property_border_color_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_border_width_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_color_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_has_border_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Rectangle>> RectangleExt for O {
-    fn get_property_border_color(&self) -> Option<InternalColor> {
-        unsafe {
-            let mut value = Value::from_type(<InternalColor as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"border-color\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `border-color` getter")
-        }
-    } 
-
-    fn set_property_border_color(&self, color: Option<Color>) {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"border-color\0".as_ptr() as *const _,
-                Value::from(color.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_border_width(&self) -> u32 {
-        unsafe {
-            let mut value = Value::from_type(<u32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"border-width\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `border-width` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_border_width(&self, border_width: u32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"border-width\0".as_ptr() as *const _,
-                Value::from(&border_width).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_color(&self) -> Option<InternalColor> {
-        unsafe {
-            let mut value = Value::from_type(<InternalColor as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"color\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `color` getter")
-        }
-    }
-
-    fn set_property_color(&self, color: Option<Color>) {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"color\0".as_ptr() as *const _,
-                Value::from(color.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_has_border(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"has-border\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `has-border` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_has_border(&self, has_border: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"has-border\0".as_ptr() as *const _,
-                Value::from(&has_border).to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_border_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_border_color_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterRectangle,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Rectangle>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Rectangle::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::border-color\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_border_color_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_border_width_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_border_width_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterRectangle,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Rectangle>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Rectangle::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::border-width\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_border_width_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_color_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_color_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterRectangle,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Rectangle>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Rectangle::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::color\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_color_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_has_border_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_has_border_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterRectangle,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Rectangle>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Rectangle::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::has-border\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_has_border_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Rectangle {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Rectangle")
-    }
-}
diff --git a/src/legacy/rotate_action.rs b/src/legacy/rotate_action.rs
deleted file mode 100644
index 298b1e1..0000000
--- a/src/legacy/rotate_action.rs
+++ /dev/null
@@ -1,95 +0,0 @@
-use crate::{Action, Actor, ActorMeta, GestureAction};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct RotateAction(Object<ffi::ClutterRotateAction, ffi::ClutterRotateActionClass, RotateActionClass>) @extends GestureAction, Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_rotate_action_get_type(),
-    }
-}
-
-impl RotateAction {
-    /// Creates a new `RotateAction` instance
-    ///
-    /// # Returns
-    ///
-    /// the newly created `RotateAction`
-    pub fn new() -> RotateAction {
-        unsafe { Action::from_glib_none(ffi::clutter_rotate_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for RotateAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `RotateAction` methods.
-///
-/// # Implementors
-///
-/// [`RotateAction`](struct.RotateAction.html)
-pub trait RotateActionExt: 'static {
-    /// The ::rotate signal is emitted when a rotate gesture is
-    /// recognized on the attached actor and when the gesture is
-    /// cancelled (in this case with an angle value of 0).
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    /// ## `angle`
-    /// the difference of angle of rotation between the initial
-    /// rotation and the current rotation
-    ///
-    /// # Returns
-    ///
-    /// `true` if the rotation should continue, and `false` if
-    ///  the rotation should be cancelled.
-    fn connect_rotate<F: Fn(&Self, &Actor, f64) -> bool + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<RotateAction>> RotateActionExt for O {
-    fn connect_rotate<F: Fn(&Self, &Actor, f64) -> bool + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn rotate_trampoline<P, F: Fn(&P, &Actor, f64) -> bool + 'static>(
-            this: *mut ffi::ClutterRotateAction,
-            actor: *mut ffi::ClutterActor,
-            angle: libc::c_double,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<RotateAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &RotateAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                angle,
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"rotate\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    rotate_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for RotateAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "RotateAction")
-    }
-}
diff --git a/src/legacy/score.rs b/src/legacy/score.rs
deleted file mode 100644
index 52acb17..0000000
--- a/src/legacy/score.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct Score(Object<ffi::ClutterScore, ffi::ClutterScoreClass, ScoreClass>);
-
-    match fn {
-        get_type => || ffi::clutter_score_get_type(),
-    }
-}
-
-impl Score {}
-
-impl fmt::Display for Score {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Score")
-    }
-}
diff --git a/src/legacy/script.rs b/src/legacy/script.rs
deleted file mode 100644
index 76b1717..0000000
--- a/src/legacy/script.rs
+++ /dev/null
@@ -1,445 +0,0 @@
-// use glib::{
-//     object::{Cast, IsA},
-//     signal::{connect_raw, SignalHandlerId},
-//     translate::*,
-//     GString, StaticType, Value,
-// };
-// use std::boxed::Box as Box_;
-// use std::{fmt, mem::transmute, ptr};
-
-// glib_wrapper! {
-//     pub struct Script(Object<ffi::ClutterScript, ffi::ClutterScriptClass, ScriptClass>);
-
-//     match fn {
-//         get_type => || ffi::clutter_script_get_type(),
-//     }
-// }
-
-// impl Script {
-//     /// Creates a new `Script` instance. `Script` can be used
-//     /// to load objects definitions for scenegraph elements, like actors,
-//     /// or behavioural elements, like behaviours and timelines. The
-//     /// definitions must be encoded using the JavaScript Object Notation (JSON)
-//     /// language.
-//     ///
-//     /// # Returns
-//     ///
-//     /// the newly created `Script` instance. Use
-//     ///  `gobject::ObjectExt::unref` when done.
-//     pub fn new() -> Script {
-//         unsafe { from_glib_full(ffi::clutter_script_new()) }
-//     }
-// }
-
-// impl Default for Script {
-//     fn default() -> Self {
-//         Self::new()
-//     }
-// }
-
-// pub const NONE_SCRIPT: Option<&Script> = None;
-
-// /// Trait containing all `Script` methods.
-// ///
-// /// # Implementors
-// ///
-// /// [`Script`](struct.Script.html)
-// pub trait ScriptExt: 'static {
-//     /// Adds `paths` to the list of search paths held by `self`.
-//     ///
-//     /// The search paths are used by `ScriptExt::lookup_filename`, which
-//     /// can be used to define search paths for the textures source file name
-//     /// or other custom, file-based properties.
-//     /// ## `paths`
-//     /// an array of strings containing
-//     ///  different search paths
-//     /// ## `n_paths`
-//     /// the length of the passed array
-//     fn add_search_paths(&self, paths: &[&str]);
-
-//     //fn connect_signals(&self, user_data: /*Unimplemented*/Option<Fundamental: Pointer>);
-
-//     //fn connect_signals_full(&self, func: /*Unimplemented*/FnMut(&Script, &glib::Object, &str, &str, &glib::Object, /*Ignored*/glib::ConnectFlags), user_data: /*Unimplemented*/Option<Fundamental: Pointer>);
-
-//     /// Ensure that every object defined inside `self` is correctly
-//     /// constructed. You should rarely need to use this function.
-//     fn ensure_objects(&self);
-
-//     /// Retrieves the object bound to `name`. This function does not increment
-//     /// the reference count of the returned object.
-//     /// ## `name`
-//     /// the name of the object to retrieve
-//     ///
-//     /// # Returns
-//     ///
-//     /// the named object, or `None` if no object
-//     ///  with the given name was available
-//     fn get_object(&self, name: &str) -> Option<glib::Object>;
-
-//     //fn get_objects(&self, first_name: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) -> i32;
-
-//     /// Retrieves the translation domain set using
-//     /// `ScriptExt::set_translation_domain`.
-//     ///
-//     /// # Returns
-//     ///
-//     /// the translation domain, if any is set,
-//     ///  or `None`
-//     fn get_translation_domain(&self) -> Option<GString>;
-
-//     /// Looks up a type by name, using the virtual function that
-//     /// `Script` has for that purpose. This function should
-//     /// rarely be used.
-//     /// ## `type_name`
-//     /// name of the type to look up
-//     ///
-//     /// # Returns
-//     ///
-//     /// the type for the requested type name, or
-//     ///  `G_TYPE_INVALID` if not corresponding type was found.
-//     fn get_type_from_name(&self, type_name: &str) -> glib::types::Type;
-
-//     /// Retrieves all the objects created by `self`.
-//     ///
-//     /// Note: this function does not increment the reference count of the
-//     /// objects it returns.
-//     ///
-//     /// # Returns
-//     ///
-//     /// a list
-//     ///  of `gobject::Object`<!-- -->s, or `None`. The objects are owned by the
-//     ///  `Script` instance. Use `glib::List::free` on the returned list when
-//     ///  done.
-//     fn list_objects(&self) -> Vec<glib::Object>;
-
-//     /// Loads the definitions from `data` into `self` and merges with
-//     /// the currently loaded ones, if any.
-//     /// ## `data`
-//     /// a buffer containing the definitions
-//     /// ## `length`
-//     /// the length of the buffer, or -1 if `data` is a NUL-terminated
-//     ///  buffer
-//     ///
-//     /// # Returns
-//     ///
-//     /// on error, zero is returned and `error` is set
-//     ///  accordingly. On success, the merge id for the UI definitions is
-//     ///  returned. You can use the merge id with `ScriptExt::unmerge_objects`.
-//     fn load_from_data(&self, data: &str) -> Result<(), glib::Error>;
-
-//     /// Loads the definitions from `filename` into `self` and merges with
-//     /// the currently loaded ones, if any.
-//     /// ## `filename`
-//     /// the full path to the definition file
-//     ///
-//     /// # Returns
-//     ///
-//     /// on error, zero is returned and `error` is set
-//     ///  accordingly. On success, the merge id for the UI definitions is
-//     ///  returned. You can use the merge id with `ScriptExt::unmerge_objects`.
-//     fn load_from_file(&self, filename: &str) -> Result<(), glib::Error>;
-
-//     /// Loads the definitions from a resource file into `self` and merges with
-//     /// the currently loaded ones, if any.
-//     /// ## `resource_path`
-//     /// the resource path of the file to parse
-//     ///
-//     /// # Returns
-//     ///
-//     /// on error, zero is returned and `error` is set
-//     ///  accordingly. On success, the merge id for the UI definitions is
-//     ///  returned. You can use the merge id with `ScriptExt::unmerge_objects`.
-//     fn load_from_resource(&self, resource_path: &str) -> Result<(), glib::Error>;
-
-//     /// Looks up `filename` inside the search paths of `self`. If `filename`
-//     /// is found, its full path will be returned .
-//     /// ## `filename`
-//     /// the name of the file to lookup
-//     ///
-//     /// # Returns
-//     ///
-//     /// the full path of `filename` or `None` if no path was
-//     ///  found.
-//     fn lookup_filename(&self, filename: &str) -> Option<GString>;
-
-//     /// Sets the translation domain for `self`.
-//     /// ## `domain`
-//     /// the translation domain, or `None`
-//     fn set_translation_domain(&self, domain: Option<&str>);
-
-//     /// Unmerges the objects identified by `merge_id`.
-//     /// ## `merge_id`
-//     /// merge id returned when loading a UI definition
-//     fn unmerge_objects(&self, merge_id: u32);
-
-//     /// The path of the currently parsed file. If `Script:filename-set`
-//     /// is `false` then the value of this property is undefined.
-//     fn get_property_filename(&self) -> Option<GString>;
-
-//     /// Whether the `Script:filename` property is set. If this property
-//     /// is `true` then the currently parsed data comes from a file, and the
-//     /// file name is stored inside the `Script:filename` property.
-//     fn get_property_filename_set(&self) -> bool;
-
-//     fn connect_property_filename_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-//     fn connect_property_filename_set_notify<F: Fn(&Self) + 'static>(&self, f: F)
-//         -> SignalHandlerId;
-
-//     fn connect_property_translation_domain_notify<F: Fn(&Self) + 'static>(
-//         &self,
-//         f: F,
-//     ) -> SignalHandlerId;
-// }
-
-// impl<O: IsA<Script>> ScriptExt for O {
-//     fn add_search_paths(&self, paths: &[&str]) {
-//         let n_paths = paths.len() as usize;
-//         unsafe {
-//             ffi::clutter_script_add_search_paths(
-//                 self.as_ref().to_glib_none().0,
-//                 paths.to_glib_none().0,
-//                 n_paths,
-//             );
-//         }
-//     }
-
-//     //fn connect_signals(&self, user_data: /*Unimplemented*/Option<Fundamental: Pointer>) {
-//     //    unsafe { TODO: call clutter_sys:clutter_script_connect_signals() }
-//     //}
-
-//     //fn connect_signals_full(&self, func: /*Unimplemented*/FnMut(&Script, &glib::Object, &str, &str, &glib::Object, /*Ignored*/glib::ConnectFlags), user_data: /*Unimplemented*/Option<Fundamental: Pointer>) {
-//     //    unsafe { TODO: call clutter_sys:clutter_script_connect_signals_full() }
-//     //}
-
-//     fn ensure_objects(&self) {
-//         unsafe {
-//             ffi::clutter_script_ensure_objects(self.as_ref().to_glib_none().0);
-//         }
-//     }
-
-//     fn get_object(&self, name: &str) -> Option<glib::Object> {
-//         unsafe {
-//             from_glib_none(ffi::clutter_script_get_object(
-//                 self.as_ref().to_glib_none().0,
-//                 name.to_glib_none().0,
-//             ))
-//         }
-//     }
-
-//     //fn get_objects(&self, first_name: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) -> i32 {
-//     //    unsafe { TODO: call clutter_sys:clutter_script_get_objects() }
-//     //}
-
-//     fn get_translation_domain(&self) -> Option<GString> {
-//         unsafe {
-//             from_glib_none(ffi::clutter_script_get_translation_domain(
-//                 self.as_ref().to_glib_none().0,
-//             ))
-//         }
-//     }
-
-//     fn get_type_from_name(&self, type_name: &str) -> glib::types::Type {
-//         unsafe {
-//             from_glib(ffi::clutter_script_get_type_from_name(
-//                 self.as_ref().to_glib_none().0,
-//                 type_name.to_glib_none().0,
-//             ))
-//         }
-//     }
-
-//     fn list_objects(&self) -> Vec<glib::Object> {
-//         unsafe {
-//             FromGlibPtrContainer::from_glib_container(ffi::clutter_script_list_objects(
-//                 self.as_ref().to_glib_none().0,
-//             ))
-//         }
-//     }
-
-//     fn load_from_data(&self, data: &str) -> Result<(), glib::Error> {
-//         let length = data.len() as isize;
-//         unsafe {
-//             let mut error = ptr::null_mut();
-//             let _ = ffi::clutter_script_load_from_data(
-//                 self.as_ref().to_glib_none().0,
-//                 data.to_glib_none().0,
-//                 length,
-//                 &mut error,
-//             );
-//             if error.is_null() {
-//                 Ok(())
-//             } else {
-//                 Err(from_glib_full(error))
-//             }
-//         }
-//     }
-
-//     fn load_from_file(&self, filename: &str) -> Result<(), glib::Error> {
-//         unsafe {
-//             let mut error = ptr::null_mut();
-//             let _ = ffi::clutter_script_load_from_file(
-//                 self.as_ref().to_glib_none().0,
-//                 filename.to_glib_none().0,
-//                 &mut error,
-//             );
-//             if error.is_null() {
-//                 Ok(())
-//             } else {
-//                 Err(from_glib_full(error))
-//             }
-//         }
-//     }
-
-//     fn load_from_resource(&self, resource_path: &str) -> Result<(), glib::Error> {
-//         unsafe {
-//             let mut error = ptr::null_mut();
-//             let _ = ffi::clutter_script_load_from_resource(
-//                 self.as_ref().to_glib_none().0,
-//                 resource_path.to_glib_none().0,
-//                 &mut error,
-//             );
-//             if error.is_null() {
-//                 Ok(())
-//             } else {
-//                 Err(from_glib_full(error))
-//             }
-//         }
-//     }
-
-//     fn lookup_filename(&self, filename: &str) -> Option<GString> {
-//         unsafe {
-//             from_glib_full(ffi::clutter_script_lookup_filename(
-//                 self.as_ref().to_glib_none().0,
-//                 filename.to_glib_none().0,
-//             ))
-//         }
-//     }
-
-//     fn set_translation_domain(&self, domain: Option<&str>) {
-//         unsafe {
-//             ffi::clutter_script_set_translation_domain(
-//                 self.as_ref().to_glib_none().0,
-//                 domain.to_glib_none().0,
-//             );
-//         }
-//     }
-
-//     fn unmerge_objects(&self, merge_id: u32) {
-//         unsafe {
-//             ffi::clutter_script_unmerge_objects(self.as_ref().to_glib_none().0, merge_id);
-//         }
-//     }
-
-//     fn get_property_filename(&self) -> Option<GString> {
-//         unsafe {
-//             let mut value = Value::from_type(<GString as StaticType>::static_type());
-//             gobject_sys::g_object_get_property(
-//                 self.to_glib_none().0 as *mut gobject_sys::GObject,
-//                 b"filename\0".as_ptr() as *const _,
-//                 value.to_glib_none_mut().0,
-//             );
-//             value
-//                 .get()
-//                 .expect("Return Value for property `filename` getter")
-//         }
-//     }
-
-//     fn get_property_filename_set(&self) -> bool {
-//         unsafe {
-//             let mut value = Value::from_type(<bool as StaticType>::static_type());
-//             gobject_sys::g_object_get_property(
-//                 self.to_glib_none().0 as *mut gobject_sys::GObject,
-//                 b"filename-set\0".as_ptr() as *const _,
-//                 value.to_glib_none_mut().0,
-//             );
-//             value
-//                 .get()
-//                 .expect("Return Value for property `filename-set` getter")
-//                 .unwrap()
-//         }
-//     }
-
-//     fn connect_property_filename_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-//         unsafe extern "C" fn notify_filename_trampoline<P, F: Fn(&P) + 'static>(
-//             this: *mut ffi::ClutterScript,
-//             _param_spec: glib_sys::gpointer,
-//             f: glib_sys::gpointer,
-//         ) where
-//             P: IsA<Script>,
-//         {
-//             let f: &F = &*(f as *const F);
-//             f(&Script::from_glib_borrow(this).unsafe_cast_ref())
-//         }
-//         unsafe {
-//             let f: Box_<F> = Box_::new(f);
-//             connect_raw(
-//                 self.as_ptr() as *mut _,
-//                 b"notify::filename\0".as_ptr() as *const _,
-//                 Some(transmute::<_, unsafe extern "C" fn()>(
-//                     notify_filename_trampoline::<Self, F> as *const (),
-//                 )),
-//                 Box_::into_raw(f),
-//             )
-//         }
-//     }
-
-//     fn connect_property_filename_set_notify<F: Fn(&Self) + 'static>(
-//         &self,
-//         f: F,
-//     ) -> SignalHandlerId {
-//         unsafe extern "C" fn notify_filename_set_trampoline<P, F: Fn(&P) + 'static>(
-//             this: *mut ffi::ClutterScript,
-//             _param_spec: glib_sys::gpointer,
-//             f: glib_sys::gpointer,
-//         ) where
-//             P: IsA<Script>,
-//         {
-//             let f: &F = &*(f as *const F);
-//             f(&Script::from_glib_borrow(this).unsafe_cast_ref())
-//         }
-//         unsafe {
-//             let f: Box_<F> = Box_::new(f);
-//             connect_raw(
-//                 self.as_ptr() as *mut _,
-//                 b"notify::filename-set\0".as_ptr() as *const _,
-//                 Some(transmute::<_, unsafe extern "C" fn()>(
-//                     notify_filename_set_trampoline::<Self, F> as *const (),
-//                 )),
-//                 Box_::into_raw(f),
-//             )
-//         }
-//     }
-
-//     fn connect_property_translation_domain_notify<F: Fn(&Self) + 'static>(
-//         &self,
-//         f: F,
-//     ) -> SignalHandlerId {
-//         unsafe extern "C" fn notify_translation_domain_trampoline<P, F: Fn(&P) + 'static>(
-//             this: *mut ffi::ClutterScript,
-//             _param_spec: glib_sys::gpointer,
-//             f: glib_sys::gpointer,
-//         ) where
-//             P: IsA<Script>,
-//         {
-//             let f: &F = &*(f as *const F);
-//             f(&Script::from_glib_borrow(this).unsafe_cast_ref())
-//         }
-//         unsafe {
-//             let f: Box_<F> = Box_::new(f);
-//             connect_raw(
-//                 self.as_ptr() as *mut _,
-//                 b"notify::translation-domain\0".as_ptr() as *const _,
-//                 Some(transmute::<_, unsafe extern "C" fn()>(
-//                     notify_translation_domain_trampoline::<Self, F> as *const (),
-//                 )),
-//                 Box_::into_raw(f),
-//             )
-//         }
-//     }
-// }
-
-// impl fmt::Display for Script {
-//     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-//         write!(f, "Script")
-//     }
-// }
diff --git a/src/legacy/scriptable.rs b/src/legacy/scriptable.rs
deleted file mode 100644
index 8affa87..0000000
--- a/src/legacy/scriptable.rs
+++ /dev/null
@@ -1,121 +0,0 @@
-// use crate::Script;
-// use glib::{object::IsA, translate::*, GString};
-// use std::fmt;
-
-// glib_wrapper! {
-//     pub struct Scriptable(Interface<ffi::ClutterScriptable>);
-
-//     match fn {
-//         get_type => || ffi::clutter_scriptable_get_type(),
-//     }
-// }
-
-// pub const NONE_SCRIPTABLE: Option<&Scriptable> = None;
-
-// /// Trait containing all `Scriptable` methods.
-// ///
-// /// # Implementors
-// ///
-// /// [`Actor`](struct.Actor.html), [`Alpha`](struct.Alpha.html), [`BehaviourEllipse`](struct.BehaviourEllipse.html), [`BehaviourRotate`](struct.BehaviourRotate.html), [`Behaviour`](struct.Behaviour.html), [`Box`](struct.Box.html), [`Clone`](struct.Clone.html), [`Group`](struct.Group.html), [`Interval`](struct.Interval.html), [`KeyframeTransition`](struct.KeyframeTransition.html), [`PropertyTransition`](struct.PropertyTransition.html), [`Rectangle`](struct.Rectangle.html), [`Scriptable`](struct.Scriptable.html), [`ScrollActor`](struct.ScrollActor.html), [`Stage`](struct.Stage.html), [`State`](struct.State.html), [`Text`](struct.Text.html), [`Texture`](struct.Texture.html), [`Timeline`](struct.Timeline.html), [`TransitionGroup`](struct.TransitionGroup.html), [`Transition`](struct.Transition.html)
-// pub trait ScriptableExt: 'static {
-//     /// Retrieves the id of `self` set using `Scriptable::set_id`.
-//     ///
-//     /// # Returns
-//     ///
-//     /// the id of the object. The returned string is owned by
-//     ///  the scriptable object and should never be modified of freed
-//     fn get_id(&self) -> Option<GString>;
-
-//     // /// Parses the passed JSON node. The implementation must set the type
-//     // /// of the passed `gobject::Value` pointer using `gobject::Value::init`.
-//     // /// ## `script`
-//     // /// the `Script` creating the scriptable instance
-//     // /// ## `value`
-//     // /// the generic value to be set
-//     // /// ## `name`
-//     // /// the name of the node
-//     // /// ## `node`
-//     // /// the JSON node to be parsed
-//     // ///
-//     // /// # Returns
-//     // ///
-//     // /// `true` if the node was successfully parsed, `false` otherwise.
-//     // fn parse_custom_node<P: IsA<Script>>(
-//     //     &self,
-//     //     script: &P,
-//     //     value: &mut glib::Value,
-//     //     name: &str,
-//     //     node: &json::Node,
-//     // ) -> bool;
-
-//     /// Overrides the common properties setting. The underlying virtual
-//     /// function should be used when implementing custom properties.
-//     /// ## `script`
-//     /// the `Script` creating the scriptable instance
-//     /// ## `name`
-//     /// the name of the property
-//     /// ## `value`
-//     /// the value of the property
-//     fn set_custom_property<P: IsA<Script>>(&self, script: &P, name: &str, value: &glib::Value);
-
-//     /// Sets `id_` as the unique Clutter script it for this instance of
-//     /// `ScriptableIface`.
-//     ///
-//     /// This name can be used by user interface designer applications to
-//     /// define a unique name for an object constructable using the UI
-//     /// definition language parsed by `Script`.
-//     /// ## `id_`
-//     /// the `Script` id of the object
-//     fn set_id(&self, id_: &str);
-// }
-
-// impl<O: IsA<Scriptable>> ScriptableExt for O {
-//     // fn get_id(&self) -> Option<GString> {
-//     //     unsafe {
-//     //         from_glib_none(ffi::clutter_scriptable_get_id(
-//     //             self.as_ref().to_glib_none().0,
-//     //         ))
-//     //     }
-//     // }
-
-//     // fn parse_custom_node<P: IsA<Script>>(
-//     //     &self,
-//     //     script: &P,
-//     //     value: &mut glib::Value,
-//     //     name: &str,
-//     //     node: &json::Node,
-//     // ) -> bool {
-//     //     unsafe {
-//     //         from_glib(ffi::clutter_scriptable_parse_custom_node(
-//     //             self.as_ref().to_glib_none().0,
-//     //             script.as_ref().to_glib_none().0,
-//     //             value.to_glib_none_mut().0,
-//     //             name.to_glib_none().0,
-//     //             node.to_glib_none().0,
-//     //         ))
-//     //     }
-//     // }
-
-//     fn set_custom_property<P: IsA<Script>>(&self, script: &P, name: &str, value: &glib::Value) {
-//         unsafe {
-//             ffi::clutter_scriptable_set_custom_property(
-//                 self.as_ref().to_glib_none().0,
-//                 script.as_ref().to_glib_none().0,
-//                 name.to_glib_none().0,
-//                 value.to_glib_none().0,
-//             );
-//         }
-//     }
-
-//     fn set_id(&self, id_: &str) {
-//         unsafe {
-//             ffi::clutter_scriptable_set_id(self.as_ref().to_glib_none().0, id_.to_glib_none().0);
-//         }
-//     }
-// }
-
-// impl fmt::Display for Scriptable {
-//     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-//         write!(f, "Scriptable")
-//     }
-// }
diff --git a/src/legacy/scroll_actor.rs b/src/legacy/scroll_actor.rs
deleted file mode 100644
index 1205219..0000000
--- a/src/legacy/scroll_actor.rs
+++ /dev/null
@@ -1,141 +0,0 @@
-// Scriptable
-use crate::{Actor, Animatable, Container, InternalPoint, InternalRect, ScrollMode};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct ScrollActor(Object<ffi::ClutterScrollActor, ffi::ClutterScrollActorClass, ScrollActorClass>) @extends Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_scroll_actor_get_type(),
-    }
-}
-
-impl ScrollActor {
-    /// Creates a new `ScrollActor`.
-    ///
-    /// # Returns
-    ///
-    /// The newly created `ScrollActor`
-    ///  instance.
-    pub fn new() -> ScrollActor {
-        unsafe { Actor::from_glib_none(ffi::clutter_scroll_actor_new()).unsafe_cast() }
-    }
-}
-
-impl Default for ScrollActor {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `ScrollActor` methods.
-///
-/// # Implementors
-///
-/// [`ScrollActor`](struct.ScrollActor.html)
-pub trait ScrollActorExt: 'static {
-    /// Retrieves the `ScrollActor:scroll-mode` property
-    ///
-    /// # Returns
-    ///
-    /// the scrolling mode
-    fn get_scroll_mode(&self) -> ScrollMode;
-
-    /// Scrolls the contents of `self` so that `point` is the new origin
-    /// of the visible area.
-    ///
-    /// The coordinates of `point` must be relative to the `self`.
-    ///
-    /// This function will use the currently set easing state of the `self`
-    /// to transition from the current scroll origin to the new one.
-    /// ## `point`
-    /// a `Point`
-    fn scroll_to_point(&self, point: &InternalPoint);
-
-    /// Scrolls `self` so that `rect` is in the visible portion.
-    /// ## `rect`
-    /// a `Rect`
-    fn scroll_to_rect(&self, rect: &InternalRect);
-
-    /// Sets the `ScrollActor:scroll-mode` property.
-    /// ## `mode`
-    /// a `ScrollMode`
-    fn set_scroll_mode(&self, mode: ScrollMode);
-
-    fn connect_property_scroll_mode_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<ScrollActor>> ScrollActorExt for O {
-    fn get_scroll_mode(&self) -> ScrollMode {
-        unsafe {
-            from_glib(ffi::clutter_scroll_actor_get_scroll_mode(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn scroll_to_point(&self, point: &InternalPoint) {
-        unsafe {
-            ffi::clutter_scroll_actor_scroll_to_point(
-                self.as_ref().to_glib_none().0,
-                point.to_glib_none().0,
-            );
-        }
-    }
-
-    fn scroll_to_rect(&self, rect: &InternalRect) {
-        unsafe {
-            ffi::clutter_scroll_actor_scroll_to_rect(
-                self.as_ref().to_glib_none().0,
-                rect.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_scroll_mode(&self, mode: ScrollMode) {
-        unsafe {
-            ffi::clutter_scroll_actor_set_scroll_mode(
-                self.as_ref().to_glib_none().0,
-                mode.to_glib(),
-            );
-        }
-    }
-
-    fn connect_property_scroll_mode_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_scroll_mode_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterScrollActor,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ScrollActor>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ScrollActor::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::scroll-mode\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_scroll_mode_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for ScrollActor {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ScrollActor")
-    }
-}
diff --git a/src/legacy/settings.rs b/src/legacy/settings.rs
deleted file mode 100644
index 3a7dc28..0000000
--- a/src/legacy/settings.rs
+++ /dev/null
@@ -1,774 +0,0 @@
-use glib::{
-    object::ObjectType as ObjectType_,
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString, StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct Settings(Object<ffi::ClutterSettings, ffi::ClutterSettingsClass, SettingsClass>);
-
-    match fn {
-        get_type => || ffi::clutter_settings_get_type(),
-    }
-}
-
-impl Settings {
-    /// The default distance that the cursor of a pointer device
-    /// should travel before a drag operation should start.
-    pub fn get_property_dnd_drag_threshold(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"dnd-drag-threshold\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `dnd-drag-threshold` getter")
-                .unwrap()
-        }
-    }
-
-    /// The default distance that the cursor of a pointer device
-    /// should travel before a drag operation should start.
-    pub fn set_property_dnd_drag_threshold(&self, dnd_drag_threshold: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"dnd-drag-threshold\0".as_ptr() as *const _,
-                Value::from(&dnd_drag_threshold).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The maximum distance, in pixels, between button-press events that
-    /// determines whether or not to increase the click count by 1.
-    pub fn get_property_double_click_distance(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"double-click-distance\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `double-click-distance` getter")
-                .unwrap()
-        }
-    }
-
-    /// The maximum distance, in pixels, between button-press events that
-    /// determines whether or not to increase the click count by 1.
-    pub fn set_property_double_click_distance(&self, double_click_distance: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"double-click-distance\0".as_ptr() as *const _,
-                Value::from(&double_click_distance).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The time, in milliseconds, that should elapse between button-press
-    /// events in order to increase the click count by 1.
-    pub fn get_property_double_click_time(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"double-click-time\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `double-click-time` getter")
-                .unwrap()
-        }
-    }
-
-    /// The time, in milliseconds, that should elapse between button-press
-    /// events in order to increase the click count by 1.
-    pub fn set_property_double_click_time(&self, double_click_time: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"double-click-time\0".as_ptr() as *const _,
-                Value::from(&double_click_time).to_glib_none().0,
-            );
-        }
-    }
-
-    /// Whether or not to use antialiasing when rendering text; a value
-    /// of 1 enables it unconditionally; a value of 0 disables it
-    /// unconditionally; and -1 will use the system's default.
-    pub fn get_property_font_antialias(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-antialias\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `font-antialias` getter")
-                .unwrap()
-        }
-    }
-
-    /// Whether or not to use antialiasing when rendering text; a value
-    /// of 1 enables it unconditionally; a value of 0 disables it
-    /// unconditionally; and -1 will use the system's default.
-    pub fn set_property_font_antialias(&self, font_antialias: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-antialias\0".as_ptr() as *const _,
-                Value::from(&font_antialias).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The DPI used when rendering text, as a value of 1024 * dots/inch.
-    ///
-    /// If set to -1, the system's default will be used instead
-    pub fn get_property_font_dpi(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-dpi\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `font-dpi` getter")
-                .unwrap()
-        }
-    }
-
-    /// The DPI used when rendering text, as a value of 1024 * dots/inch.
-    ///
-    /// If set to -1, the system's default will be used instead
-    pub fn set_property_font_dpi(&self, font_dpi: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-dpi\0".as_ptr() as *const _,
-                Value::from(&font_dpi).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The style of the hinting used when rendering text. Valid values
-    /// are:
-    ///
-    ///  - hintnone
-    ///  - hintslight
-    ///  - hintmedium
-    ///  - hintfull
-    pub fn get_property_font_hint_style(&self) -> Option<GString> {
-        unsafe {
-            let mut value = Value::from_type(<GString as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-hint-style\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `font-hint-style` getter")
-        }
-    }
-
-    /// The style of the hinting used when rendering text. Valid values
-    /// are:
-    ///
-    ///  - hintnone
-    ///  - hintslight
-    ///  - hintmedium
-    ///  - hintfull
-    pub fn set_property_font_hint_style(&self, font_hint_style: Option<&str>) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-hint-style\0".as_ptr() as *const _,
-                Value::from(font_hint_style).to_glib_none().0,
-            );
-        }
-    }
-
-    /// Whether or not to use hinting when rendering text; a value of 1
-    /// unconditionally enables it; a value of 0 unconditionally disables
-    /// it; and a value of -1 will use the system's default.
-    pub fn get_property_font_hinting(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-hinting\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `font-hinting` getter")
-                .unwrap()
-        }
-    }
-
-    /// Whether or not to use hinting when rendering text; a value of 1
-    /// unconditionally enables it; a value of 0 unconditionally disables
-    /// it; and a value of -1 will use the system's default.
-    pub fn set_property_font_hinting(&self, font_hinting: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-hinting\0".as_ptr() as *const _,
-                Value::from(&font_hinting).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The default font name that should be used by text actors, as
-    /// a string that can be passed to `pango::FontDescription::from_string`.
-    pub fn get_property_font_name(&self) -> Option<GString> {
-        unsafe {
-            let mut value = Value::from_type(<GString as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-name\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `font-name` getter")
-        }
-    }
-
-    /// The default font name that should be used by text actors, as
-    /// a string that can be passed to `pango::FontDescription::from_string`.
-    pub fn set_property_font_name(&self, font_name: Option<&str>) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-name\0".as_ptr() as *const _,
-                Value::from(font_name).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The type of sub-pixel antialiasing used when rendering text. Valid
-    /// values are:
-    ///
-    ///  - none
-    ///  - rgb
-    ///  - bgr
-    ///  - vrgb
-    ///  - vbgr
-    pub fn get_property_font_subpixel_order(&self) -> Option<GString> {
-        unsafe {
-            let mut value = Value::from_type(<GString as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-subpixel-order\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `font-subpixel-order` getter")
-        }
-    }
-
-    /// The type of sub-pixel antialiasing used when rendering text. Valid
-    /// values are:
-    ///
-    ///  - none
-    ///  - rgb
-    ///  - bgr
-    ///  - vrgb
-    ///  - vbgr
-    pub fn set_property_font_subpixel_order(&self, font_subpixel_order: Option<&str>) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"font-subpixel-order\0".as_ptr() as *const _,
-                Value::from(font_subpixel_order).to_glib_none().0,
-            );
-        }
-    }
-
-    pub fn set_property_fontconfig_timestamp(&self, fontconfig_timestamp: u32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"fontconfig-timestamp\0".as_ptr() as *const _,
-                Value::from(&fontconfig_timestamp).to_glib_none().0,
-            );
-        }
-    }
-
-    /// Sets the minimum duration for a press to be recognized as a long press
-    /// gesture. The duration is expressed in milliseconds.
-    ///
-    /// See also `ClickAction:long-press-duration`.
-    pub fn get_property_long_press_duration(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"long-press-duration\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `long-press-duration` getter")
-                .unwrap()
-        }
-    }
-
-    /// Sets the minimum duration for a press to be recognized as a long press
-    /// gesture. The duration is expressed in milliseconds.
-    ///
-    /// See also `ClickAction:long-press-duration`.
-    pub fn set_property_long_press_duration(&self, long_press_duration: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"long-press-duration\0".as_ptr() as *const _,
-                Value::from(&long_press_duration).to_glib_none().0,
-            );
-        }
-    }
-
-    pub fn get_property_password_hint_time(&self) -> u32 {
-        unsafe {
-            let mut value = Value::from_type(<u32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"password-hint-time\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `password-hint-time` getter")
-                .unwrap()
-        }
-    }
-
-    pub fn set_property_password_hint_time(&self, password_hint_time: u32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"password-hint-time\0".as_ptr() as *const _,
-                Value::from(&password_hint_time).to_glib_none().0,
-            );
-        }
-    }
-
-    pub fn set_property_unscaled_font_dpi(&self, unscaled_font_dpi: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"unscaled-font-dpi\0".as_ptr() as *const _,
-                Value::from(&unscaled_font_dpi).to_glib_none().0,
-            );
-        }
-    }
-
-    pub fn get_property_window_scaling_factor(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"window-scaling-factor\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `window-scaling-factor` getter")
-                .unwrap()
-        }
-    }
-
-    pub fn set_property_window_scaling_factor(&self, window_scaling_factor: i32) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"window-scaling-factor\0".as_ptr() as *const _,
-                Value::from(&window_scaling_factor).to_glib_none().0,
-            );
-        }
-    }
-
-    /// Retrieves the singleton instance of `Settings`
-    ///
-    /// # Returns
-    ///
-    /// the instance of `Settings`. The
-    ///  returned object is owned by internals and it should not be unreferenced
-    ///  directly
-    pub fn get_default() -> Option<Settings> {
-        unsafe { from_glib_none(ffi::clutter_settings_get_default()) }
-    }
-
-    pub fn connect_property_dnd_drag_threshold_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_dnd_drag_threshold_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::dnd-drag-threshold\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_dnd_drag_threshold_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_double_click_distance_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_double_click_distance_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::double-click-distance\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_double_click_distance_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_double_click_time_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_double_click_time_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::double-click-time\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_double_click_time_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_font_antialias_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_antialias_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-antialias\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_antialias_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_font_dpi_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_dpi_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-dpi\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_dpi_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_font_hint_style_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_hint_style_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-hint-style\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_hint_style_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_font_hinting_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_hinting_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-hinting\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_hinting_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_font_name_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_name_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-name\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_name_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_font_subpixel_order_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_subpixel_order_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-subpixel-order\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_subpixel_order_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_fontconfig_timestamp_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_fontconfig_timestamp_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::fontconfig-timestamp\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_fontconfig_timestamp_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_long_press_duration_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_long_press_duration_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::long-press-duration\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_long_press_duration_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_password_hint_time_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_password_hint_time_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::password-hint-time\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_password_hint_time_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_unscaled_font_dpi_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_unscaled_font_dpi_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::unscaled-font-dpi\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_unscaled_font_dpi_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_window_scaling_factor_notify<F: Fn(&Settings) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_window_scaling_factor_trampoline<F: Fn(&Settings) + 'static>(
-            this: *mut ffi::ClutterSettings,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::window-scaling-factor\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_window_scaling_factor_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Settings {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Settings")
-    }
-}
diff --git a/src/legacy/shader_effect.rs b/src/legacy/shader_effect.rs
deleted file mode 100644
index 16f378f..0000000
--- a/src/legacy/shader_effect.rs
+++ /dev/null
@@ -1,120 +0,0 @@
-use crate::{ActorMeta, Effect, OffscreenEffect, ShaderType};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    translate::*,
-};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ShaderEffect(Object<ffi::ClutterShaderEffect, ffi::ClutterShaderEffectClass, ShaderEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_shader_effect_get_type(),
-    }
-}
-
-impl ShaderEffect {
-    /// Creates a new `ShaderEffect`, to be applied to an actor using
-    /// `ActorExt::add_effect`.
-    ///
-    /// The effect will be empty until `ShaderEffectExt::set_shader_source`
-    /// is called.
-    /// ## `shader_type`
-    /// the type of the shader, either `ShaderType::FragmentShader`,
-    ///  or `ShaderType::VertexShader`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `ShaderEffect`.
-    ///  Use `gobject::ObjectExt::unref` when done.
-    pub fn new(shader_type: ShaderType) -> ShaderEffect {
-        unsafe {
-            Effect::from_glib_none(ffi::clutter_shader_effect_new(shader_type.to_glib()))
-                .unsafe_cast()
-        }
-    }
-}
-
-/// Trait containing all `ShaderEffect` methods.
-///
-/// # Implementors
-///
-/// [`ShaderEffect`](struct.ShaderEffect.html)
-pub trait ShaderEffectExt: 'static {
-    //fn get_program(&self) -> /*Unimplemented*/Option<dx::Handle>;
-
-    //fn get_shader(&self) -> /*Unimplemented*/Option<dx::Handle>;
-
-    /// Sets the source of the GLSL shader used by `self`
-    ///
-    /// This function should only be called by implementations of
-    /// the `ShaderEffect` class, and not by application code.
-    ///
-    /// This function can only be called once; subsequent calls will
-    /// yield no result.
-    /// ## `source`
-    /// the source of a GLSL shader
-    ///
-    /// # Returns
-    ///
-    /// `true` if the source was set
-    fn set_shader_source(&self, source: &str) -> bool;
-
-    //fn set_uniform(&self, name: &str, gtype: glib::types::Type, n_values: usize, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets `value` as the payload for the uniform `name` inside the shader
-    /// effect
-    ///
-    /// The `glib::Type` of the `value` must be one of: `G_TYPE_INT`, for a single
-    /// integer value; `G_TYPE_FLOAT`, for a single floating point value;
-    /// `TYPE_SHADER_INT`, for an array of integer values;
-    /// `TYPE_SHADER_FLOAT`, for an array of floating point values;
-    /// and `TYPE_SHADER_MATRIX`, for a matrix of floating point
-    /// values. It also accepts `G_TYPE_DOUBLE` for compatibility with other
-    /// languages than C.
-    /// ## `name`
-    /// the name of the uniform to set
-    /// ## `value`
-    /// a `gobject::Value` with the value of the uniform to set
-    fn set_uniform_value(&self, name: &str, value: &glib::Value);
-}
-
-impl<O: IsA<ShaderEffect>> ShaderEffectExt for O {
-    //fn get_program(&self) -> /*Unimplemented*/Option<dx::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_get_program() }
-    //}
-
-    //fn get_shader(&self) -> /*Unimplemented*/Option<dx::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_get_shader() }
-    //}
-
-    fn set_shader_source(&self, source: &str) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_shader_effect_set_shader_source(
-                self.as_ref().to_glib_none().0,
-                source.to_glib_none().0,
-            ))
-        }
-    }
-
-    //fn set_uniform(&self, name: &str, gtype: glib::types::Type, n_values: usize, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_set_uniform() }
-    //}
-
-    fn set_uniform_value(&self, name: &str, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_shader_effect_set_uniform_value(
-                self.as_ref().to_glib_none().0,
-                name.to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-}
-
-impl fmt::Display for ShaderEffect {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ShaderEffect")
-    }
-}
diff --git a/src/legacy/shader_float.rs b/src/legacy/shader_float.rs
deleted file mode 100644
index a26a8e8..0000000
--- a/src/legacy/shader_float.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ShaderFloat(Object<ffi::ClutterShaderFloat, ShaderFloatClass>);
-
-    match fn {
-        get_type => || ffi::clutter_shader_float_get_type(),
-    }
-}
-
-impl ShaderFloat {}
-
-impl fmt::Display for ShaderFloat {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ShaderFloat")
-    }
-}
diff --git a/src/legacy/shader_int.rs b/src/legacy/shader_int.rs
deleted file mode 100644
index 8d0e997..0000000
--- a/src/legacy/shader_int.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ShaderInt(Object<ffi::ClutterShaderInt, ShaderIntClass>);
-
-    match fn {
-        get_type => || ffi::clutter_shader_int_get_type(),
-    }
-}
-
-impl ShaderInt {}
-
-impl fmt::Display for ShaderInt {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ShaderInt")
-    }
-}
diff --git a/src/legacy/shader_matrix.rs b/src/legacy/shader_matrix.rs
deleted file mode 100644
index d6bb607..0000000
--- a/src/legacy/shader_matrix.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use glib::translate::*;
-use std::fmt;
-
-glib_wrapper! {
-    pub struct ShaderMatrix(Object<ffi::ClutterShaderMatrix, ShaderMatrixClass>);
-
-    match fn {
-        get_type => || ffi::clutter_shader_matrix_get_type(),
-    }
-}
-
-impl ShaderMatrix {}
-
-impl fmt::Display for ShaderMatrix {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ShaderMatrix")
-    }
-}
diff --git a/src/legacy/size.rs b/src/legacy/size.rs
deleted file mode 100644
index fe3ac23..0000000
--- a/src/legacy/size.rs
+++ /dev/null
@@ -1,60 +0,0 @@
-#![allow(dead_code)]
-use glib::translate::*;
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct InternalSize(Boxed<ffi::ClutterSize>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_size_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_size_free(ptr),
-        get_type => || ffi::clutter_size_get_type(),
-    }
-}
-
-impl InternalSize {
-    /// Allocates a new `Size`.
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `Size`.
-    ///  Use `Size::free` to free its resources.
-    pub fn alloc() -> InternalSize {
-        unsafe { from_glib_full(ffi::clutter_size_alloc()) }
-    }
-
-    /// Compares two `Size` for equality.
-    /// ## `b`
-    /// a `Size` to compare
-    ///
-    /// # Returns
-    ///
-    /// `true` if the two `Size` are equal
-    pub fn equals(&self, b: &InternalSize) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_size_equals(
-                self.to_glib_none().0,
-                b.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Initializes a `Size` with the given dimensions.
-    /// ## `width`
-    /// the width
-    /// ## `height`
-    /// the height
-    ///
-    /// # Returns
-    ///
-    /// the initialized `Size`
-    pub fn init(&mut self, width: f32, height: f32) -> Option<InternalSize> {
-        unsafe {
-            from_glib_none(ffi::clutter_size_init(
-                self.to_glib_none_mut().0,
-                width,
-                height,
-            ))
-        }
-    }
-}
diff --git a/src/legacy/snap_constraint.rs b/src/legacy/snap_constraint.rs
deleted file mode 100644
index 5556d69..0000000
--- a/src/legacy/snap_constraint.rs
+++ /dev/null
@@ -1,294 +0,0 @@
-use crate::{Actor, ActorMeta, Constraint, SnapEdge};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA, ObjectType as ObjectType_},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-glib_wrapper! {
-    pub struct SnapConstraint(Object<ffi::ClutterSnapConstraint, ffi::ClutterSnapConstraintClass, SnapConstraintClass>) @extends Constraint, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_snap_constraint_get_type(),
-    }
-}
-
-impl SnapConstraint {
-    /// Creates a new `SnapConstraint` that will snap a `Actor`
-    /// to the `edge` of `source`, with the given `offset`.
-    /// ## `source`
-    /// the `Actor` to use as the source of
-    ///  the constraint, or `None`
-    /// ## `from_edge`
-    /// the edge of the actor to use in the constraint
-    /// ## `to_edge`
-    /// the edge of `source` to use in the constraint
-    /// ## `offset`
-    /// the offset to apply to the constraint, in pixels
-    ///
-    /// # Returns
-    ///
-    /// the newly created `SnapConstraint`
-    pub fn new<P: IsA<Actor>>(
-        source: Option<&P>,
-        from_edge: SnapEdge,
-        to_edge: SnapEdge,
-        offset: f32,
-    ) -> SnapConstraint {
-        unsafe {
-            Constraint::from_glib_none(ffi::clutter_snap_constraint_new(
-                source.map(|p| p.as_ref()).to_glib_none().0,
-                from_edge.to_glib(),
-                to_edge.to_glib(),
-                offset,
-            ))
-            .unsafe_cast()
-        }
-    }
-
-    /// Retrieves the edges used by the `self`
-    /// ## `from_edge`
-    /// return location for the actor's edge, or `None`
-    /// ## `to_edge`
-    /// return location for the source's edge, or `None`
-    pub fn get_edges(&self) -> (SnapEdge, SnapEdge) {
-        unsafe {
-            let mut from_edge = mem::MaybeUninit::uninit();
-            let mut to_edge = mem::MaybeUninit::uninit();
-            ffi::clutter_snap_constraint_get_edges(
-                self.to_glib_none().0,
-                from_edge.as_mut_ptr(),
-                to_edge.as_mut_ptr(),
-            );
-            let from_edge = from_edge.assume_init();
-            let to_edge = to_edge.assume_init();
-            (from_glib(from_edge), from_glib(to_edge))
-        }
-    }
-
-    /// Retrieves the offset set using `SnapConstraint::set_offset`
-    ///
-    /// # Returns
-    ///
-    /// the offset, in pixels
-    pub fn get_offset(&self) -> f32 {
-        unsafe { ffi::clutter_snap_constraint_get_offset(self.to_glib_none().0) }
-    }
-
-    /// Retrieves the `Actor` set using `SnapConstraint::set_source`
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the source actor
-    pub fn get_source(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_snap_constraint_get_source(
-                self.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Sets the edges to be used by the `self`
-    ///
-    /// The `from_edge` is the edge on the `Actor` to which `self`
-    /// has been added. The `to_edge` is the edge of the `Actor` inside
-    /// the `SnapConstraint:source` property.
-    /// ## `from_edge`
-    /// the edge on the actor
-    /// ## `to_edge`
-    /// the edge on the source
-    pub fn set_edges(&self, from_edge: SnapEdge, to_edge: SnapEdge) {
-        unsafe {
-            ffi::clutter_snap_constraint_set_edges(
-                self.to_glib_none().0,
-                from_edge.to_glib(),
-                to_edge.to_glib(),
-            );
-        }
-    }
-
-    /// Sets the offset to be applied to the constraint
-    /// ## `offset`
-    /// the offset to apply, in pixels
-    pub fn set_offset(&self, offset: f32) {
-        unsafe {
-            ffi::clutter_snap_constraint_set_offset(self.to_glib_none().0, offset);
-        }
-    }
-
-    /// Sets the source `Actor` for the constraint
-    /// ## `source`
-    /// a `Actor`, or `None` to unset the source
-    pub fn set_source<P: IsA<Actor>>(&self, source: Option<&P>) {
-        unsafe {
-            ffi::clutter_snap_constraint_set_source(
-                self.to_glib_none().0,
-                source.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The edge of the `Actor` that should be snapped
-    pub fn get_property_from_edge(&self) -> SnapEdge {
-        unsafe {
-            let mut value = Value::from_type(<SnapEdge as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"from-edge\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `from-edge` getter")
-                .unwrap()
-        }
-    }
-
-    /// The edge of the `Actor` that should be snapped
-    pub fn set_property_from_edge(&self, from_edge: SnapEdge) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"from-edge\0".as_ptr() as *const _,
-                Value::from(&from_edge).to_glib_none().0,
-            );
-        }
-    }
-
-    /// The edge of the `SnapConstraint:source` that should be snapped
-    pub fn get_property_to_edge(&self) -> SnapEdge {
-        unsafe {
-            let mut value = Value::from_type(<SnapEdge as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"to-edge\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `to-edge` getter")
-                .unwrap()
-        }
-    }
-
-    /// The edge of the `SnapConstraint:source` that should be snapped
-    pub fn set_property_to_edge(&self, to_edge: SnapEdge) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.as_ptr() as *mut gobject_sys::GObject,
-                b"to-edge\0".as_ptr() as *const _,
-                Value::from(&to_edge).to_glib_none().0,
-            );
-        }
-    }
-
-    pub fn connect_property_from_edge_notify<F: Fn(&SnapConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_from_edge_trampoline<F: Fn(&SnapConstraint) + 'static>(
-            this: *mut ffi::ClutterSnapConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::from-edge\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_from_edge_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_offset_notify<F: Fn(&SnapConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_offset_trampoline<F: Fn(&SnapConstraint) + 'static>(
-            this: *mut ffi::ClutterSnapConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::offset\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_offset_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_source_notify<F: Fn(&SnapConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_source_trampoline<F: Fn(&SnapConstraint) + 'static>(
-            this: *mut ffi::ClutterSnapConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::source\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_source_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    pub fn connect_property_to_edge_notify<F: Fn(&SnapConstraint) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_to_edge_trampoline<F: Fn(&SnapConstraint) + 'static>(
-            this: *mut ffi::ClutterSnapConstraint,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) {
-            let f: &F = &*(f as *const F);
-            f(&from_glib_borrow(this))
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::to-edge\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_to_edge_trampoline::<F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for SnapConstraint {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "SnapConstraint")
-    }
-}
diff --git a/src/legacy/stage.rs b/src/legacy/stage.rs
deleted file mode 100644
index a6b2e07..0000000
--- a/src/legacy/stage.rs
+++ /dev/null
@@ -1,1122 +0,0 @@
-// Scriptable
-use crate::{Actor, Animatable, Container, Event, Group, Perspective, PickMode};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString, StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct Stage(Object<ffi::ClutterStage, ffi::ClutterStageClass, StageClass>) @extends Group, Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_stage_get_type(),
-    }
-}
-
-impl Stage {
-    /// Creates a new, non-default stage. A non-default stage is a new
-    /// top-level actor which can be used as another container. It works
-    /// exactly like the default stage, but while `Stage::get_default`
-    /// will always return the same instance, you will have to keep a pointer
-    /// to any `Stage` returned by `Stage::new`.
-    ///
-    /// The ability to support multiple stages depends on the current
-    /// backend. Use `feature_available` and
-    /// `FeatureFlags::StageMultiple` to check at runtime whether a
-    /// backend supports multiple stages.
-    ///
-    /// # Returns
-    ///
-    /// a new stage, or `None` if the default backend does
-    ///  not support multiple stages. Use `ActorExt::destroy` to
-    ///  programmatically close the returned stage.
-    pub fn new() -> Stage {
-        unsafe { Actor::from_glib_none(ffi::clutter_stage_new()).unsafe_cast() }
-    }
-}
-
-impl Default for Stage {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `Stage` methods.
-///
-/// # Implementors
-///
-/// [`Stage`](struct.Stage.html)
-pub trait StageExt: 'static {
-    /// This function essentially makes sure the right GL context is
-    /// current for the passed stage. It is not intended to
-    /// be used by applications.
-    fn ensure_current(&self);
-
-    /// Ensures that `self` is redrawn
-    ///
-    /// This function should not be called by applications: it is
-    /// used when embedding a `Stage` into a toolkit with
-    /// another windowing system, like GTK+.
-    fn ensure_redraw(&self);
-
-    /// Ensures that the GL viewport is updated with the current
-    /// stage window size.
-    ///
-    /// This function will queue a redraw of `self`.
-    ///
-    /// This function should not be called by applications; it is used
-    /// when embedding a `Stage` into a toolkit with another
-    /// windowing system, like GTK+.
-    fn ensure_viewport(&self);
-
-    /// This function is used to emit an event on the main stage.
-    ///
-    /// You should rarely need to use this function, except for
-    /// synthetised events.
-    /// ## `event`
-    /// a `Event`
-    ///
-    /// # Returns
-    ///
-    /// the return value from the signal emission
-    fn event(&self, event: &mut Event) -> bool;
-
-    /// Retrieves the value set with `StageExt::set_accept_focus`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `Stage` should accept focus, and `false`
-    ///  otherwise
-    fn get_accept_focus(&self) -> bool;
-
-    /// Checks the scene at the coordinates `x` and `y` and returns a pointer
-    /// to the `Actor` at those coordinates.
-    ///
-    /// By using `pick_mode` it is possible to control which actors will be
-    /// painted and thus available.
-    /// ## `pick_mode`
-    /// how the scene graph should be painted
-    /// ## `x`
-    /// X coordinate to check
-    /// ## `y`
-    /// Y coordinate to check
-    ///
-    /// # Returns
-    ///
-    /// the actor at the specified coordinates,
-    ///  if any
-    fn get_actor_at_pos(&self, pick_mode: PickMode, x: i32, y: i32) -> Option<Actor>;
-
-    /// Retrieves whether the stage is full screen or not
-    ///
-    /// # Returns
-    ///
-    /// `true` if the stage is full screen
-    fn get_fullscreen(&self) -> bool;
-
-    /// Retrieves the actor that is currently under key focus.
-    ///
-    /// # Returns
-    ///
-    /// the actor with key focus, or the stage
-    fn get_key_focus(&self) -> Option<Actor>;
-
-    /// Retrieves the minimum size for a stage window as set using
-    /// `StageExt::set_minimum_size`.
-    ///
-    /// The returned size may not correspond to the actual minimum size and
-    /// it is specific to the `Stage` implementation inside the
-    /// backend
-    /// ## `width`
-    /// return location for the minimum width, in pixels,
-    ///  or `None`
-    /// ## `height`
-    /// return location for the minimum height, in pixels,
-    ///  or `None`
-    fn get_minimum_size(&self) -> (u32, u32);
-
-    /// Retrieves the value set using `StageExt::set_motion_events_enabled`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the per-actor motion event delivery is enabled
-    ///  and `false` otherwise
-    fn get_motion_events_enabled(&self) -> bool;
-
-    /// Retrieves the hint set with `StageExt::set_no_clear_hint`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the stage should not clear itself on every paint
-    ///  cycle, and `false` otherwise
-    fn get_no_clear_hint(&self) -> bool;
-
-    /// Retrieves the stage perspective.
-    /// ## `perspective`
-    /// return location for a
-    ///  `Perspective`
-    fn get_perspective(&self) -> Perspective;
-
-    /// Gets the bounds of the current redraw for `self` in stage pixel
-    /// coordinates. E.g., if only a single actor has queued a redraw then
-    /// it may redraw the stage with a clip so that it doesn't have to
-    /// paint every pixel in the stage. This function would then return the
-    /// bounds of that clip. An application can use this information to
-    /// avoid some extra work if it knows that some regions of the stage
-    /// aren't going to be painted. This should only be called while the
-    /// stage is being painted. If there is no current redraw clip then
-    /// this function will set `clip` to the full extents of the stage.
-    /// ## `clip`
-    /// Return location for the clip bounds
-    fn get_redraw_clip_bounds(&self) -> cairo::RectangleInt;
-
-    /// Retrieves the value set with `StageExt::set_throttle_motion_events`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the motion events are being throttled,
-    ///  and `false` otherwise
-    fn get_throttle_motion_events(&self) -> bool;
-
-    /// Gets the stage title.
-    ///
-    /// # Returns
-    ///
-    /// pointer to the title string for the stage. The
-    /// returned string is owned by the actor and should not
-    /// be modified or freed.
-    fn get_title(&self) -> Option<GString>;
-
-    /// Retrieves the value set using `StageExt::set_use_alpha`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the stage should honour the opacity and the
-    ///  alpha channel of the stage color
-    fn get_use_alpha(&self) -> bool;
-
-    /// Retrieves the value set with `StageExt::set_user_resizable`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the stage is resizable by the user.
-    fn get_user_resizable(&self) -> bool;
-
-    /// Makes the cursor invisible on the stage window
-    fn hide_cursor(&self);
-
-    // /// Makes a screenshot of the stage in RGBA 8bit data, returns a
-    // /// linear buffer with `width` * 4 as rowstride.
-    // ///
-    // /// The alpha data contained in the returned buffer is driver-dependent,
-    // /// and not guaranteed to hold any sensible value.
-    // /// ## `x`
-    // /// x coordinate of the first pixel that is read from stage
-    // /// ## `y`
-    // /// y coordinate of the first pixel that is read from stage
-    // /// ## `width`
-    // /// Width dimention of pixels to be read, or -1 for the
-    // ///  entire stage width
-    // /// ## `height`
-    // /// Height dimention of pixels to be read, or -1 for the
-    // ///  entire stage height
-    // ///
-    // /// # Returns
-    // ///
-    // /// a pointer to newly allocated memory with the buffer
-    // ///  or `None` if the read failed. Use `g_free` on the returned data
-    // ///  to release the resources it has allocated.
-    // fn read_pixels(&self, x: i32, y: i32, width: i32, height: i32) -> Vec<u8>;
-
-    /// Sets whether the `self` should accept the key focus when shown.
-    ///
-    /// This function should be called before showing `self` using
-    /// `ActorExt::show`.
-    /// ## `accept_focus`
-    /// `true` to accept focus on show
-    fn set_accept_focus(&self, accept_focus: bool);
-
-    /// Asks to place the stage window in the fullscreen or unfullscreen
-    /// states.
-    ///
-    ///  ( Note that you shouldn't assume the window is definitely full screen
-    /// afterward, because other entities (e.g. the user or window manager)
-    /// could unfullscreen it again, and not all window managers honor
-    /// requests to fullscreen windows.
-    ///
-    /// If you want to receive notification of the fullscreen state you
-    /// should either use the `Stage::fullscreen` and
-    /// `Stage::unfullscreen` signals, or use the notify signal
-    /// for the `Stage:fullscreen-set` property
-    /// ## `fullscreen`
-    /// `true` to to set the stage fullscreen
-    fn set_fullscreen(&self, fullscreen: bool);
-
-    /// Sets the key focus on `actor`. An actor with key focus will receive
-    /// all the key events. If `actor` is `None`, the stage will receive
-    /// focus.
-    /// ## `actor`
-    /// the actor to set key focus to, or `None`
-    fn set_key_focus<P: IsA<Actor>>(&self, actor: Option<&P>);
-
-    /// Sets the minimum size for a stage window, if the default backend
-    /// uses `Stage` inside a window
-    ///
-    /// This is a convenience function, and it is equivalent to setting the
-    /// `Actor:min-width` and `Actor:min-height` on `self`
-    ///
-    /// If the current size of `self` is smaller than the minimum size, the
-    /// `self` will be resized to the new `width` and `height`
-    ///
-    /// This function has no effect if `self` is fullscreen
-    /// ## `width`
-    /// width, in pixels
-    /// ## `height`
-    /// height, in pixels
-    fn set_minimum_size(&self, width: u32, height: u32);
-
-    /// Sets whether per-actor motion events (and relative crossing
-    /// events) should be disabled or not.
-    ///
-    /// The default is `true`.
-    ///
-    /// If `enable` is `false` the following signals will not be emitted
-    /// by the actors children of `self`:
-    ///
-    ///  - `Actor::motion-event`
-    ///  - `Actor::enter-event`
-    ///  - `Actor::leave-event`
-    ///
-    /// The events will still be delivered to the `Stage`.
-    ///
-    /// The main side effect of this function is that disabling the motion
-    /// events will disable picking to detect the `Actor` underneath
-    /// the pointer for each motion event. This is useful, for instance,
-    /// when dragging a `Actor` across the `self`: the actor underneath
-    /// the pointer is not going to change, so it's meaningless to perform
-    /// a pick.
-    /// ## `enabled`
-    /// `true` to enable the motion events delivery, and `false`
-    ///  otherwise
-    fn set_motion_events_enabled(&self, enabled: bool);
-
-    /// Sets whether the `self` should clear itself at the beginning
-    /// of each paint cycle or not.
-    ///
-    /// Clearing the `Stage` can be a costly operation, especially
-    /// if the stage is always covered - for instance, in a full-screen
-    /// video player or in a game with a background texture.
-    ///
-    /// This setting is a hint; it might discard this hint
-    /// depending on its internal state.
-    ///
-    /// If parts of the stage are visible and you disable clearing you
-    /// might end up with visual artifacts while painting the contents of
-    /// the stage.
-    /// ## `no_clear`
-    /// `true` if the `self` should not clear itself on every
-    ///  repaint cycle
-    fn set_no_clear_hint(&self, no_clear: bool);
-
-    /// Sets the stage perspective. Using this function is not recommended
-    /// because it will disable it's attempts to generate an
-    /// appropriate perspective based on the size of the stage.
-    /// ## `perspective`
-    /// A `Perspective`
-    fn set_perspective(&self, perspective: &mut Perspective);
-
-    /// Sets whether motion events received between redraws should
-    /// be throttled or not. If motion events are throttled, those
-    /// events received by the windowing system between redraws will
-    /// be compressed so that only the last event will be propagated
-    /// to the `self` and its actors.
-    ///
-    /// This function should only be used if you want to have all
-    /// the motion events delivered to your application code.
-    /// ## `throttle`
-    /// `true` to throttle motion events
-    fn set_throttle_motion_events(&self, throttle: bool);
-
-    /// Sets the stage title.
-    /// ## `title`
-    /// A utf8 string for the stage windows title.
-    fn set_title(&self, title: &str);
-
-    /// Sets whether the `self` should honour the `Actor:opacity` and
-    /// the alpha channel of the `Stage:color`
-    /// ## `use_alpha`
-    /// whether the stage should honour the opacity or the
-    ///  alpha channel of the stage color
-    fn set_use_alpha(&self, use_alpha: bool);
-
-    /// Sets if the stage is resizable by user interaction (e.g. via
-    /// window manager controls)
-    /// ## `resizable`
-    /// whether the stage should be user resizable.
-    fn set_user_resizable(&self, resizable: bool);
-
-    /// Shows the cursor on the stage window
-    fn show_cursor(&self);
-
-    /// Whether the mouse pointer should be visible
-    fn get_property_cursor_visible(&self) -> bool;
-
-    /// Whether the mouse pointer should be visible
-    fn set_property_cursor_visible(&self, cursor_visible: bool);
-
-    fn get_property_fullscreen_set(&self) -> bool;
-
-    /// The ::activate signal is emitted when the stage receives key focus
-    /// from the underlying window system.
-    fn connect_activate<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::after-paint signal is emitted after the stage is painted,
-    /// but before the results are displayed on the screen.
-    fn connect_after_paint<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::deactivate signal is emitted when the stage loses key focus
-    /// from the underlying window system.
-    fn connect_deactivate<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::delete-event signal is emitted when the user closes a
-    /// `Stage` window using the window controls.
-    ///
-    /// by default will call `main_quit` if `stage` is
-    /// the default stage, and `ActorExt::destroy` for any other
-    /// stage.
-    ///
-    /// It is possible to override the default behaviour by connecting
-    /// a new handler and returning `true` there.
-    ///
-    /// This signal is emitted only on backends that
-    /// embed `Stage` in native windows. It is not emitted for
-    /// backends that use a static frame buffer.
-    /// ## `event`
-    /// a `Event` of type `EventType::Delete`
-    fn connect_delete_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    /// The ::fullscreen signal is emitted when the stage is made fullscreen.
-    fn connect_fullscreen<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::unfullscreen signal is emitted when the stage leaves a fullscreen
-    /// state.
-    fn connect_unfullscreen<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_accept_focus_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_fullscreen_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_key_focus_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_no_clear_hint_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_perspective_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_title_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_use_alpha_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_user_resizable_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<Stage>> StageExt for O {
-    fn ensure_current(&self) {
-        unsafe {
-            ffi::clutter_stage_ensure_current(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn ensure_redraw(&self) {
-        unsafe {
-            ffi::clutter_stage_ensure_redraw(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn ensure_viewport(&self) {
-        unsafe {
-            ffi::clutter_stage_ensure_viewport(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn event(&self, event: &mut Event) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_event(
-                self.as_ref().to_glib_none().0,
-                event.to_glib_none_mut().0,
-            ))
-        }
-    }
-
-    fn get_accept_focus(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_get_accept_focus(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_actor_at_pos(&self, pick_mode: PickMode, x: i32, y: i32) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_stage_get_actor_at_pos(
-                self.as_ref().to_glib_none().0,
-                pick_mode.to_glib(),
-                x,
-                y,
-            ))
-        }
-    }
-
-    fn get_fullscreen(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_get_fullscreen(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_key_focus(&self) -> Option<Actor> {
-        unsafe {
-            from_glib_none(ffi::clutter_stage_get_key_focus(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_minimum_size(&self) -> (u32, u32) {
-        unsafe {
-            let mut width = mem::MaybeUninit::uninit();
-            let mut height = mem::MaybeUninit::uninit();
-            ffi::clutter_stage_get_minimum_size(
-                self.as_ref().to_glib_none().0,
-                width.as_mut_ptr(),
-                height.as_mut_ptr(),
-            );
-            let width = width.assume_init();
-            let height = height.assume_init();
-            (width, height)
-        }
-    }
-
-    fn get_motion_events_enabled(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_get_motion_events_enabled(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_no_clear_hint(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_get_no_clear_hint(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_perspective(&self) -> Perspective {
-        unsafe {
-            let mut perspective = Perspective::uninitialized();
-            ffi::clutter_stage_get_perspective(
-                self.as_ref().to_glib_none().0,
-                perspective.to_glib_none_mut().0,
-            );
-            perspective
-        }
-    }
-
-    fn get_redraw_clip_bounds(&self) -> cairo::RectangleInt {
-        unsafe {
-            let mut clip = cairo::RectangleInt::uninitialized();
-            ffi::clutter_stage_get_redraw_clip_bounds(
-                self.as_ref().to_glib_none().0,
-                clip.to_glib_none_mut().0,
-            );
-            clip
-        }
-    }
-
-    fn get_throttle_motion_events(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_get_throttle_motion_events(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_title(&self) -> Option<GString> {
-        unsafe { from_glib_none(ffi::clutter_stage_get_title(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn get_use_alpha(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_get_use_alpha(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_user_resizable(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_stage_get_user_resizable(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn hide_cursor(&self) {
-        unsafe {
-            ffi::clutter_stage_hide_cursor(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    // fn read_pixels(&self, x: i32, y: i32, width: i32, height: i32) -> Vec<u8> {
-    //     unsafe {
-    //         FromGlibPtrContainer::from_glib_full(ffi::clutter_stage_read_pixels(
-    //             self.as_ref().to_glib_none().0,
-    //             x,
-    //             y,
-    //             width,
-    //             height,
-    //         ))
-    //     }
-    // }
-
-    fn set_accept_focus(&self, accept_focus: bool) {
-        unsafe {
-            ffi::clutter_stage_set_accept_focus(
-                self.as_ref().to_glib_none().0,
-                accept_focus.to_glib(),
-            );
-        }
-    }
-
-    fn set_fullscreen(&self, fullscreen: bool) {
-        unsafe {
-            ffi::clutter_stage_set_fullscreen(self.as_ref().to_glib_none().0, fullscreen.to_glib());
-        }
-    }
-
-    fn set_key_focus<P: IsA<Actor>>(&self, actor: Option<&P>) {
-        unsafe {
-            ffi::clutter_stage_set_key_focus(
-                self.as_ref().to_glib_none().0,
-                actor.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_minimum_size(&self, width: u32, height: u32) {
-        unsafe {
-            ffi::clutter_stage_set_minimum_size(self.as_ref().to_glib_none().0, width, height);
-        }
-    }
-
-    fn set_motion_events_enabled(&self, enabled: bool) {
-        unsafe {
-            ffi::clutter_stage_set_motion_events_enabled(
-                self.as_ref().to_glib_none().0,
-                enabled.to_glib(),
-            );
-        }
-    }
-
-    fn set_no_clear_hint(&self, no_clear: bool) {
-        unsafe {
-            ffi::clutter_stage_set_no_clear_hint(
-                self.as_ref().to_glib_none().0,
-                no_clear.to_glib(),
-            );
-        }
-    }
-
-    fn set_perspective(&self, perspective: &mut Perspective) {
-        unsafe {
-            ffi::clutter_stage_set_perspective(
-                self.as_ref().to_glib_none().0,
-                perspective.to_glib_none_mut().0,
-            );
-        }
-    }
-
-    fn set_throttle_motion_events(&self, throttle: bool) {
-        unsafe {
-            ffi::clutter_stage_set_throttle_motion_events(
-                self.as_ref().to_glib_none().0,
-                throttle.to_glib(),
-            );
-        }
-    }
-
-    fn set_title(&self, title: &str) {
-        unsafe {
-            ffi::clutter_stage_set_title(self.as_ref().to_glib_none().0, title.to_glib_none().0);
-        }
-    }
-
-    fn set_use_alpha(&self, use_alpha: bool) {
-        unsafe {
-            ffi::clutter_stage_set_use_alpha(self.as_ref().to_glib_none().0, use_alpha.to_glib());
-        }
-    }
-
-    fn set_user_resizable(&self, resizable: bool) {
-        unsafe {
-            ffi::clutter_stage_set_user_resizable(
-                self.as_ref().to_glib_none().0,
-                resizable.to_glib(),
-            );
-        }
-    }
-
-    fn show_cursor(&self) {
-        unsafe {
-            ffi::clutter_stage_show_cursor(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn get_property_cursor_visible(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"cursor-visible\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `cursor-visible` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_cursor_visible(&self, cursor_visible: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"cursor-visible\0".as_ptr() as *const _,
-                Value::from(&cursor_visible).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_fullscreen_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"fullscreen-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `fullscreen-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn connect_activate<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn activate_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"activate\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    activate_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_after_paint<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn after_paint_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"after-paint\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    after_paint_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_deactivate<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn deactivate_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"deactivate\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    deactivate_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_delete_event<F: Fn(&Self, &Event) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn delete_event_trampoline<P, F: Fn(&P, &Event) -> bool + 'static>(
-            this: *mut ffi::ClutterStage,
-            event: *mut ffi::ClutterEvent,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Stage::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_none(event),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"delete-event\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    delete_event_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_fullscreen<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn fullscreen_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"fullscreen\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    fullscreen_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_unfullscreen<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn unfullscreen_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"unfullscreen\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    unfullscreen_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_accept_focus_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_accept_focus_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::accept-focus\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_accept_focus_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_cursor_visible_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::cursor-visible\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_cursor_visible_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_fullscreen_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_fullscreen_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::fullscreen-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_fullscreen_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_key_focus_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_key_focus_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::key-focus\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_key_focus_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_no_clear_hint_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_no_clear_hint_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::no-clear-hint\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_no_clear_hint_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_perspective_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_perspective_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::perspective\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_perspective_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_title_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_title_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::title\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_title_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_use_alpha_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_use_alpha_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::use-alpha\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_use_alpha_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_user_resizable_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_user_resizable_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStage,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Stage>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Stage::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::user-resizable\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_user_resizable_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Stage {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Stage")
-    }
-}
diff --git a/src/legacy/stage_manager.rs b/src/legacy/stage_manager.rs
deleted file mode 100644
index 0f5c3fa..0000000
--- a/src/legacy/stage_manager.rs
+++ /dev/null
@@ -1,192 +0,0 @@
-use crate::Stage;
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct StageManager(Object<ffi::ClutterStageManager, ffi::ClutterStageManagerClass, StageManagerClass>);
-
-    match fn {
-        get_type => || ffi::clutter_stage_manager_get_type(),
-    }
-}
-
-impl StageManager {
-    /// Returns the default `StageManager`.
-    ///
-    /// # Returns
-    ///
-    /// the default stage manager instance. The returned
-    ///  object is owned by internals and you should not reference or unreference it.
-    pub fn get_default() -> Option<StageManager> {
-        unsafe { from_glib_none(ffi::clutter_stage_manager_get_default()) }
-    }
-}
-
-/// Trait containing all `StageManager` methods.
-///
-/// # Implementors
-///
-/// [`StageManager`](struct.StageManager.html)
-pub trait StageManagerExt: 'static {
-    /// Returns the default `Stage`.
-    ///
-    /// # Returns
-    ///
-    /// the default stage. The returned object
-    ///  is owned by internals and you should never reference or unreference it
-    fn get_default_stage(&self) -> Option<Stage>;
-
-    /// Lists all currently used stages.
-    ///
-    /// # Returns
-    ///
-    /// a newly
-    ///  allocated list of `Stage` objects. Use `glib::SList::free` to
-    ///  deallocate it when done.
-    fn list_stages(&self) -> Vec<Stage>;
-
-    /// Lists all currently used stages.
-    ///
-    /// # Returns
-    ///
-    /// a pointer
-    ///  to the internal list of `Stage` objects. The returned list
-    ///  is owned by the `StageManager` and should never be modified
-    ///  or freed
-    fn peek_stages(&self) -> Vec<Stage>;
-
-    /// The ::stage-added signal is emitted each time a new `Stage`
-    /// has been added to the stage manager.
-    /// ## `stage`
-    /// the added stage
-    fn connect_stage_added<F: Fn(&Self, &Stage) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::stage-removed signal is emitted each time a `Stage`
-    /// has been removed from the stage manager.
-    /// ## `stage`
-    /// the removed stage
-    fn connect_stage_removed<F: Fn(&Self, &Stage) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_default_stage_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<StageManager>> StageManagerExt for O {
-    fn get_default_stage(&self) -> Option<Stage> {
-        unsafe {
-            from_glib_none(ffi::clutter_stage_manager_get_default_stage(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn list_stages(&self) -> Vec<Stage> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_container(ffi::clutter_stage_manager_list_stages(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn peek_stages(&self) -> Vec<Stage> {
-        unsafe {
-            FromGlibPtrContainer::from_glib_none(ffi::clutter_stage_manager_peek_stages(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn connect_stage_added<F: Fn(&Self, &Stage) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn stage_added_trampoline<P, F: Fn(&P, &Stage) + 'static>(
-            this: *mut ffi::ClutterStageManager,
-            stage: *mut ffi::ClutterStage,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<StageManager>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &StageManager::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(stage),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"stage-added\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    stage_added_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_stage_removed<F: Fn(&Self, &Stage) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn stage_removed_trampoline<P, F: Fn(&P, &Stage) + 'static>(
-            this: *mut ffi::ClutterStageManager,
-            stage: *mut ffi::ClutterStage,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<StageManager>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &StageManager::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(stage),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"stage-removed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    stage_removed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_default_stage_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_default_stage_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterStageManager,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<StageManager>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&StageManager::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::default-stage\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_default_stage_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for StageManager {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "StageManager")
-    }
-}
diff --git a/src/legacy/state.rs b/src/legacy/state.rs
deleted file mode 100644
index f8f92e4..0000000
--- a/src/legacy/state.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-// use crate::Scriptable;
-use glib::translate::*;
-use std::fmt;
-
-// @implements Scriptable
-glib_wrapper! {
-    pub struct State(Object<ffi::ClutterState, ffi::ClutterStateClass, StateClass>);
-
-    match fn {
-        get_type => || ffi::clutter_state_get_type(),
-    }
-}
-
-impl State {}
-
-impl fmt::Display for State {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "State")
-    }
-}
diff --git a/src/legacy/state_key.rs b/src/legacy/state_key.rs
deleted file mode 100644
index fed6b66..0000000
--- a/src/legacy/state_key.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct StateKey(Boxed<ffi::ClutterStateKey>);
-
-    match fn {
-        copy => |ptr| gobject_sys::g_boxed_copy(ffi::clutter_state_key_get_type(), ptr as *mut _) as *mut ffi::ClutterStateKey,
-        free => |ptr| gobject_sys::g_boxed_free(ffi::clutter_state_key_get_type(), ptr as *mut _),
-        get_type => || ffi::clutter_state_key_get_type(),
-    }
-}
diff --git a/src/legacy/swipe_action.rs b/src/legacy/swipe_action.rs
deleted file mode 100644
index 6de13a0..0000000
--- a/src/legacy/swipe_action.rs
+++ /dev/null
@@ -1,102 +0,0 @@
-use crate::{Action, Actor, ActorMeta, GestureAction, SwipeDirection};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct SwipeAction(Object<ffi::ClutterSwipeAction, ffi::ClutterSwipeActionClass, SwipeActionClass>) @extends GestureAction, Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_swipe_action_get_type(),
-    }
-}
-
-impl SwipeAction {
-    /// Creates a new `SwipeAction` instance
-    ///
-    /// # Returns
-    ///
-    /// the newly created `SwipeAction`
-    pub fn new() -> SwipeAction {
-        unsafe { Action::from_glib_none(ffi::clutter_swipe_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for SwipeAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `SwipeAction` methods.
-///
-/// # Implementors
-///
-/// [`SwipeAction`](struct.SwipeAction.html)
-pub trait SwipeActionExt: 'static {
-    /// The ::swipe signal is emitted when a swipe gesture is recognized on the
-    /// attached actor.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    /// ## `direction`
-    /// the main direction of the swipe gesture
-    ///
-    /// # Returns
-    ///
-    /// `true` if the swipe should continue, and `false` if
-    ///  the swipe should be cancelled.
-    fn connect_swipe<F: Fn(&Self, &Actor, SwipeDirection) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<SwipeAction>> SwipeActionExt for O {
-    fn connect_swipe<F: Fn(&Self, &Actor, SwipeDirection) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn swipe_trampoline<
-            P,
-            F: Fn(&P, &Actor, SwipeDirection) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterSwipeAction,
-            actor: *mut ffi::ClutterActor,
-            direction: ffi::ClutterSwipeDirection,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<SwipeAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &SwipeAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                from_glib(direction),
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"swipe\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    swipe_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for SwipeAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "SwipeAction")
-    }
-}
diff --git a/src/legacy/tap_action.rs b/src/legacy/tap_action.rs
deleted file mode 100644
index db01270..0000000
--- a/src/legacy/tap_action.rs
+++ /dev/null
@@ -1,81 +0,0 @@
-use crate::{Action, Actor, ActorMeta, GestureAction};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct TapAction(Object<ffi::ClutterTapAction, ffi::ClutterTapActionClass, TapActionClass>) @extends GestureAction, Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_tap_action_get_type(),
-    }
-}
-
-impl TapAction {
-    /// Creates a new `TapAction` instance
-    ///
-    /// # Returns
-    ///
-    /// the newly created `TapAction`
-    pub fn new() -> TapAction {
-        unsafe { Action::from_glib_none(ffi::clutter_tap_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for TapAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `TapAction` methods.
-///
-/// # Implementors
-///
-/// [`TapAction`](struct.TapAction.html)
-pub trait TapActionExt: 'static {
-    /// The ::tap signal is emitted when the tap gesture is complete.
-    /// ## `actor`
-    /// the `Actor` attached to the `action`
-    fn connect_tap<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<TapAction>> TapActionExt for O {
-    fn connect_tap<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn tap_trampoline<P, F: Fn(&P, &Actor) + 'static>(
-            this: *mut ffi::ClutterTapAction,
-            actor: *mut ffi::ClutterActor,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<TapAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &TapAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"tap\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    tap_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for TapAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "TapAction")
-    }
-}
diff --git a/src/legacy/text.rs b/src/legacy/text.rs
deleted file mode 100644
index 7656fc3..0000000
--- a/src/legacy/text.rs
+++ /dev/null
@@ -1,2295 +0,0 @@
-// Scriptable
-use crate::{
-    Actor, Animatable, Color, Container, InternalColor, InternalRect, RgbaColor, TextBuffer,
-};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA, ObjectExt},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString, StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct Text(Object<ffi::ClutterText, ffi::ClutterTextClass, TextClass>) @extends Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_text_get_type(),
-    }
-}
-
-impl Text {
-    /// Creates a new `Text` actor. This actor can be used to
-    /// display and edit text.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Text` actor
-    pub fn new() -> Text {
-        unsafe { Actor::from_glib_none(ffi::clutter_text_new()).unsafe_cast() }
-    }
-
-    /// Creates a new `Text` actor, using `font_name` as the font
-    /// description; `text` will be used to set the contents of the actor;
-    /// and `color` will be used as the color to render `text`.
-    ///
-    /// This function is equivalent to calling `Text::new`,
-    /// `TextExt::set_font_name`, `TextExt::set_text` and
-    /// `TextExt::set_color`.
-    /// ## `font_name`
-    /// a string with a font description
-    /// ## `text`
-    /// the contents of the actor
-    /// ## `color`
-    /// the color to be used to render `text`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Text` actor
-    pub fn new_full(font_name: &str, text: &str, color: Color) -> Text {
-        let color = {
-            let RgbaColor {
-                red,
-                green,
-                blue,
-                alpha,
-            } = color.into();
-            InternalColor::new(red, green, blue, alpha)
-        };
-
-        unsafe {
-            Actor::from_glib_none(ffi::clutter_text_new_full(
-                font_name.to_glib_none().0,
-                text.to_glib_none().0,
-                color.to_glib_none().0,
-            ))
-            .unsafe_cast()
-        }
-    }
-
-    pub fn with_buffer<P: IsA<TextBuffer>>(buffer: &P) -> Text {
-        unsafe {
-            Actor::from_glib_none(ffi::clutter_text_new_with_buffer(
-                buffer.as_ref().to_glib_none().0,
-            ))
-            .unsafe_cast()
-        }
-    }
-
-    pub fn with_text(font_name: Option<&str>, text: &str) -> Text {
-        unsafe {
-            Actor::from_glib_none(ffi::clutter_text_new_with_text(
-                font_name.to_glib_none().0,
-                text.to_glib_none().0,
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-impl Default for Text {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `Text` methods.
-///
-/// # Implementors
-///
-/// [`Text`](struct.Text.html)
-pub trait TextExt: 'static {
-    /// Emits the `Text::activate` signal, if `self` has been set
-    /// as activatable using `TextExt::set_activatable`.
-    ///
-    /// This function can be used to emit the ::activate signal inside
-    /// a `Actor::captured-event` or `Actor::key-press-event`
-    /// signal handlers before the default signal handler for the
-    /// `Text` is invoked.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the ::activate signal has been emitted,
-    ///  and `false` otherwise
-    fn activate(&self) -> bool;
-
-    /// Retrieves the position of the character at the given coordinates.
-    /// ## `x`
-    /// the X coordinate, relative to the actor
-    /// ## `y`
-    /// the Y coordinate, relative to the actor
-    ///
-    /// # Returns
-    ///
-    /// the position of the character
-    fn coords_to_position(&self, x: f32, y: f32) -> i32;
-
-    /// Deletes `n_chars` inside a `Text` actor, starting from the
-    /// current cursor position.
-    ///
-    /// Somewhat awkwardly, the cursor position is decremented by the same
-    /// number of characters you've deleted.
-    /// ## `n_chars`
-    /// the number of characters to delete
-    fn delete_chars(&self, n_chars: u32);
-
-    /// Deletes the currently selected text
-    ///
-    /// This function is only useful in subclasses of `Text`
-    ///
-    /// # Returns
-    ///
-    /// `true` if text was deleted or if the text actor
-    ///  is empty, and `false` otherwise
-    fn delete_selection(&self) -> bool;
-
-    /// Deletes the text inside a `Text` actor between `start_pos`
-    /// and `end_pos`.
-    ///
-    /// The starting and ending positions are expressed in characters,
-    /// not in bytes.
-    /// ## `start_pos`
-    /// starting position
-    /// ## `end_pos`
-    /// ending position
-    fn delete_text(&self, start_pos: isize, end_pos: isize);
-
-    /// Retrieves whether a `Text` is activatable or not.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is activatable
-    fn get_activatable(&self) -> bool;
-
-    /// Gets the attribute list that was set on the `Text` actor
-    /// `TextExt::set_attributes`, if any.
-    ///
-    /// # Returns
-    ///
-    /// the attribute list, or `None` if none was set. The
-    ///  returned value is owned by the `Text` and should not be unreferenced.
-    fn get_attributes(&self) -> Option<pango::AttrList>;
-
-    /// Get the `TextBuffer` object which holds the text for
-    /// this widget.
-    ///
-    /// # Returns
-    ///
-    /// A ``GtkEntryBuffer`` object.
-    fn get_buffer(&self) -> Option<TextBuffer>;
-
-    /// Retrieves the contents of the `Text` actor between
-    /// `start_pos` and `end_pos`, but not including `end_pos`.
-    ///
-    /// The positions are specified in characters, not in bytes.
-    /// ## `start_pos`
-    /// start of text, in characters
-    /// ## `end_pos`
-    /// end of text, in characters
-    ///
-    /// # Returns
-    ///
-    /// a newly allocated string with the contents of
-    ///  the text actor between the specified positions. Use `g_free`
-    ///  to free the resources when done
-    fn get_chars(&self, start_pos: isize, end_pos: isize) -> Option<GString>;
-
-    /// Retrieves the text color as set by `TextExt::set_color`.
-    /// ## `color`
-    /// return location for a `Color`
-    fn get_color(&self) -> InternalColor;
-
-    /// Retrieves the color of the cursor of a `Text` actor.
-    /// ## `color`
-    /// return location for a `Color`
-    fn get_cursor_color(&self) -> InternalColor;
-
-    /// Retrieves the cursor position.
-    ///
-    /// # Returns
-    ///
-    /// the cursor position, in characters
-    fn get_cursor_position(&self) -> i32;
-
-    /// Retrieves the rectangle that contains the cursor.
-    ///
-    /// The coordinates of the rectangle's origin are in actor-relative
-    /// coordinates.
-    /// ## `rect`
-    /// return location of a `Rect`
-    fn get_cursor_rect(&self) -> InternalRect;
-
-    /// Retrieves the size of the cursor of a `Text` actor.
-    ///
-    /// # Returns
-    ///
-    /// the size of the cursor, in pixels
-    fn get_cursor_size(&self) -> u32;
-
-    /// Retrieves whether the cursor of a `Text` actor is visible.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the cursor is visible
-    fn get_cursor_visible(&self) -> bool;
-
-    /// Retrieves whether a `Text` is editable or not.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is editable
-    fn get_editable(&self) -> bool;
-
-    /// Returns the ellipsizing position of a `Text` actor, as
-    /// set by `TextExt::set_ellipsize`.
-    ///
-    /// # Returns
-    ///
-    /// `pango::EllipsizeMode`
-    fn get_ellipsize(&self) -> pango::EllipsizeMode;
-
-    /// Retrieves the `pango::FontDescription` used by `self`
-    ///
-    /// # Returns
-    ///
-    /// a `pango::FontDescription`. The returned value is owned
-    ///  by the `Text` actor and it should not be modified or freed
-    fn get_font_description(&self) -> Option<pango::FontDescription>;
-
-    /// Retrieves the font name as set by `TextExt::set_font_name`.
-    ///
-    /// # Returns
-    ///
-    /// a string containing the font name. The returned
-    ///  string is owned by the `Text` actor and should not be
-    ///  modified or freed
-    fn get_font_name(&self) -> Option<GString>;
-
-    /// Retrieves whether the `Text` actor should justify its contents
-    /// on both margins.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the text should be justified
-    fn get_justify(&self) -> bool;
-
-    /// Retrieves the current `pango::Layout` used by a `Text` actor.
-    ///
-    /// # Returns
-    ///
-    /// a `pango::Layout`. The returned object is owned by
-    ///  the `Text` actor and should not be modified or freed
-    fn get_layout(&self) -> Option<pango::Layout>;
-
-    /// Obtains the coordinates where the `Text` will draw the `pango::Layout`
-    /// representing the text.
-    /// ## `x`
-    /// location to store X offset of layout, or `None`
-    /// ## `y`
-    /// location to store Y offset of layout, or `None`
-    fn get_layout_offsets(&self) -> (i32, i32);
-
-    /// Retrieves the alignment of a `Text`, as set by
-    /// `TextExt::set_line_alignment`.
-    ///
-    /// # Returns
-    ///
-    /// a `pango::Alignment`
-    fn get_line_alignment(&self) -> pango::Alignment;
-
-    /// Retrieves the value set using `TextExt::set_line_wrap`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `Text` actor should wrap
-    ///  its contents
-    fn get_line_wrap(&self) -> bool;
-
-    /// Retrieves the line wrap mode used by the `Text` actor.
-    ///
-    /// See text_set_line_wrap_mode ().
-    ///
-    /// # Returns
-    ///
-    /// the wrap mode used by the `Text`
-    fn get_line_wrap_mode(&self) -> pango::WrapMode;
-
-    /// Gets the maximum length of text that can be set into a text actor.
-    ///
-    /// See `TextExt::set_max_length`.
-    ///
-    /// # Returns
-    ///
-    /// the maximum number of characters.
-    fn get_max_length(&self) -> i32;
-
-    /// Retrieves the character to use in place of the actual text
-    /// as set by `TextExt::set_password_char`.
-    ///
-    /// # Returns
-    ///
-    /// a Unicode character or 0 if the password
-    ///  character is not set
-    fn get_password_char(&self) -> char;
-
-    /// Retrieves whether a `Text` is selectable or not.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the actor is selectable
-    fn get_selectable(&self) -> bool;
-
-    /// Retrieves the color of selected text of a `Text` actor.
-    /// ## `color`
-    /// return location for a `Color`
-    fn get_selected_text_color(&self) -> InternalColor;
-
-    /// Retrieves the currently selected text.
-    ///
-    /// # Returns
-    ///
-    /// a newly allocated string containing the currently
-    ///  selected text, or `None`. Use `g_free` to free the returned
-    ///  string.
-    fn get_selection(&self) -> Option<GString>;
-
-    /// Retrieves the other end of the selection of a `Text` actor,
-    /// in characters from the current cursor position.
-    ///
-    /// # Returns
-    ///
-    /// the position of the other end of the selection
-    fn get_selection_bound(&self) -> i32;
-
-    /// Retrieves the color of the selection of a `Text` actor.
-    /// ## `color`
-    /// return location for a `Color`
-    fn get_selection_color(&self) -> InternalColor;
-
-    /// Retrieves whether the `Text` actor is in single line mode.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `Text` actor is in single line mode
-    fn get_single_line_mode(&self) -> bool;
-
-    /// Retrieves a pointer to the current contents of a `Text`
-    /// actor.
-    ///
-    /// If you need a copy of the contents for manipulating, either
-    /// use `g_strdup` on the returned string, or use:
-    ///
-    ///
-    /// ```text
-    ///    copy = text_get_chars (text, 0, -1);
-    /// ```
-    ///
-    /// Which will return a newly allocated string.
-    ///
-    /// If the `Text` actor is empty, this function will return
-    /// an empty string, and not `None`.
-    ///
-    /// # Returns
-    ///
-    /// the contents of the actor. The returned
-    ///  string is owned by the `Text` actor and should never be modified
-    ///  or freed
-    fn get_text(&self) -> Option<GString>;
-
-    /// Retrieves whether the contents of the `Text` actor should be
-    /// parsed for the Pango text markup.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the contents will be parsed for markup
-    fn get_use_markup(&self) -> bool;
-
-    /// Inserts `text` into a `Actor` at the given position.
-    ///
-    /// If `position` is a negative number, the text will be appended
-    /// at the end of the current contents of the `Text`.
-    ///
-    /// The position is expressed in characters, not in bytes.
-    /// ## `text`
-    /// the text to be inserted
-    /// ## `position`
-    /// the position of the insertion, or -1
-    fn insert_text(&self, text: &str, position: isize);
-
-    /// Inserts `wc` at the current cursor position of a
-    /// `Text` actor.
-    /// ## `wc`
-    /// a Unicode character
-    fn insert_unichar(&self, wc: char);
-
-    /// Retrieves the coordinates of the given `position`.
-    /// ## `position`
-    /// position in characters
-    /// ## `x`
-    /// return location for the X coordinate, or `None`
-    /// ## `y`
-    /// return location for the Y coordinate, or `None`
-    /// ## `line_height`
-    /// return location for the line height, or `None`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the conversion was successful
-    fn position_to_coords(&self, position: i32) -> Option<(f32, f32, f32)>;
-
-    /// Sets whether a `Text` actor should be activatable.
-    ///
-    /// An activatable `Text` actor will emit the `Text::activate`
-    /// signal whenever the 'Enter' (or 'Return') key is pressed; if it is not
-    /// activatable, a new line will be appended to the current content.
-    ///
-    /// An activatable `Text` must also be set as editable using
-    /// `TextExt::set_editable`.
-    /// ## `activatable`
-    /// whether the `Text` actor should be activatable
-    fn set_activatable(&self, activatable: bool);
-
-    /// Sets the attributes list that are going to be applied to the
-    /// `Text` contents.
-    ///
-    /// The `Text` actor will take a reference on the `pango::AttrList`
-    /// passed to this function.
-    /// ## `attrs`
-    /// a `pango::AttrList` or `None` to unset the attributes
-    fn set_attributes(&self, attrs: Option<&pango::AttrList>);
-
-    /// Set the `TextBuffer` object which holds the text for
-    /// this widget.
-    /// ## `buffer`
-    /// a `TextBuffer`
-    fn set_buffer<P: IsA<TextBuffer>>(&self, buffer: &P);
-
-    /// Sets the color of the contents of a `Text` actor.
-    ///
-    /// The overall opacity of the `Text` actor will be the
-    /// result of the alpha value of `color` and the composited
-    /// opacity of the actor itself on the scenegraph, as returned
-    /// by `ActorExt::get_paint_opacity`.
-    /// ## `color`
-    /// a `Color`
-    fn set_color(&self, color: Color);
-
-    /// Sets the color of the cursor of a `Text` actor.
-    ///
-    /// If `color` is `None`, the cursor color will be the same as the
-    /// text color.
-    /// ## `color`
-    /// the color of the cursor, or `None` to unset it
-    fn set_cursor_color(&self, color: Option<Color>);
-
-    /// Sets the cursor of a `Text` actor at `position`.
-    ///
-    /// The position is expressed in characters, not in bytes.
-    /// ## `position`
-    /// the new cursor position, in characters
-    fn set_cursor_position(&self, position: i32);
-
-    /// Sets the size of the cursor of a `Text`. The cursor
-    /// will only be visible if the `Text:cursor-visible` property
-    /// is set to `true`.
-    /// ## `size`
-    /// the size of the cursor, in pixels, or -1 to use the
-    ///  default value
-    fn set_cursor_size(&self, size: i32);
-
-    /// Sets whether the cursor of a `Text` actor should be
-    /// visible or not.
-    ///
-    /// The color of the cursor will be the same as the text color
-    /// unless `TextExt::set_cursor_color` has been called.
-    ///
-    /// The size of the cursor can be set using `TextExt::set_cursor_size`.
-    ///
-    /// The position of the cursor can be changed programmatically using
-    /// `TextExt::set_cursor_position`.
-    /// ## `cursor_visible`
-    /// whether the cursor should be visible
-    fn set_cursor_visible(&self, cursor_visible: bool);
-
-    /// Sets whether the `Text` actor should be editable.
-    ///
-    /// An editable `Text` with key focus set using
-    /// `ActorExt::grab_key_focus` or `StageExt::set_key_focus`
-    /// will receive key events and will update its contents accordingly.
-    /// ## `editable`
-    /// whether the `Text` should be editable
-    fn set_editable(&self, editable: bool);
-
-    /// Sets the mode used to ellipsize (add an ellipsis: "...") to the
-    /// text if there is not enough space to render the entire contents
-    /// of a `Text` actor
-    /// ## `mode`
-    /// a `pango::EllipsizeMode`
-    fn set_ellipsize(&self, mode: pango::EllipsizeMode);
-
-    /// Sets `font_desc` as the font description for a `Text`
-    ///
-    /// The `pango::FontDescription` is copied by the `Text` actor
-    /// so you can safely call `pango::FontDescription::free` on it after
-    /// calling this function.
-    /// ## `font_desc`
-    /// a `pango::FontDescription`
-    fn set_font_description(&self, font_desc: &mut pango::FontDescription);
-
-    /// Sets the font used by a `Text`. The `font_name` string
-    /// must either be `None`, which means that the font name from the
-    /// default `Backend` will be used; or be something that can
-    /// be parsed by the `pango::FontDescription::from_string` function,
-    /// like:
-    ///
-    ///
-    /// ```text
-    ///   // Set the font to the system's Sans, 10 points
-    ///   text_set_font_name (text, "Sans 10");
-    ///
-    ///   // Set the font to the system's Serif, 16 pixels
-    ///   text_set_font_name (text, "Serif 16px");
-    ///
-    ///   // Set the font to Helvetica, 10 points
-    ///   text_set_font_name (text, "Helvetica 10");
-    /// ```
-    /// ## `font_name`
-    /// a font name, or `None` to set the default font name
-    fn set_font_name(&self, font_name: Option<&str>);
-
-    /// Sets whether the text of the `Text` actor should be justified
-    /// on both margins. This setting is ignored if it is compiled
-    /// against Pango &lt; 1.18.
-    /// ## `justify`
-    /// whether the text should be justified
-    fn set_justify(&self, justify: bool);
-
-    /// Sets the way that the lines of a wrapped label are aligned with
-    /// respect to each other. This does not affect the overall alignment
-    /// of the label within its allocated or specified width.
-    ///
-    /// To align a `Text` actor you should add it to a container
-    /// that supports alignment, or use the anchor point.
-    /// ## `alignment`
-    /// A `pango::Alignment`
-    fn set_line_alignment(&self, alignment: pango::Alignment);
-
-    /// Sets whether the contents of a `Text` actor should wrap,
-    /// if they don't fit the size assigned to the actor.
-    /// ## `line_wrap`
-    /// whether the contents should wrap
-    fn set_line_wrap(&self, line_wrap: bool);
-
-    /// If line wrapping is enabled (see `TextExt::set_line_wrap`) this
-    /// function controls how the line wrapping is performed. The default is
-    /// `pango::WrapMode::Word` which means wrap on word boundaries.
-    /// ## `wrap_mode`
-    /// the line wrapping mode
-    fn set_line_wrap_mode(&self, wrap_mode: pango::WrapMode);
-
-    /// Sets `markup` as the contents of a `Text`.
-    ///
-    /// This is a convenience function for setting a string containing
-    /// Pango markup, and it is logically equivalent to:
-    ///
-    ///
-    /// ```text
-    ///   /&ast; the order is important &ast;/
-    ///   text_set_text (TEXT (actor), markup);
-    ///   text_set_use_markup (TEXT (actor), true);
-    /// ```
-    /// ## `markup`
-    /// a string containing Pango markup.
-    ///  Passing `None` is the same as passing "" (the empty string)
-    fn set_markup(&self, markup: Option<&str>);
-
-    /// Sets the maximum allowed length of the contents of the actor. If the
-    /// current contents are longer than the given length, then they will be
-    /// truncated to fit.
-    /// ## `max`
-    /// the maximum number of characters allowed in the text actor; 0
-    ///  to disable or -1 to set the length of the current string
-    fn set_max_length(&self, max: i32);
-
-    /// Sets the character to use in place of the actual text in a
-    /// password text actor.
-    ///
-    /// If `wc` is 0 the text will be displayed as it is entered in the
-    /// `Text` actor.
-    /// ## `wc`
-    /// a Unicode character, or 0 to unset the password character
-    fn set_password_char(&self, wc: char);
-
-    /// Sets, or unsets, the pre-edit string. This function is useful
-    /// for input methods to display a string (with eventual specific
-    /// Pango attributes) before it is entered inside the `Text`
-    /// buffer.
-    ///
-    /// The preedit string and attributes are ignored if the `Text`
-    /// actor is not editable.
-    ///
-    /// This function should not be used by applications
-    /// ## `preedit_str`
-    /// the pre-edit string, or `None` to unset it
-    /// ## `preedit_attrs`
-    /// the pre-edit string attributes
-    /// ## `cursor_pos`
-    /// the cursor position for the pre-edit string
-    fn set_preedit_string(
-        &self,
-        preedit_str: Option<&str>,
-        preedit_attrs: Option<&pango::AttrList>,
-        cursor_pos: u32,
-    );
-
-    /// Sets whether a `Text` actor should be selectable.
-    ///
-    /// A selectable `Text` will allow selecting its contents using
-    /// the pointer or the keyboard.
-    /// ## `selectable`
-    /// whether the `Text` actor should be selectable
-    fn set_selectable(&self, selectable: bool);
-
-    /// Sets the selected text color of a `Text` actor.
-    ///
-    /// If `color` is `None`, the selected text color will be the same as the
-    /// selection color, which then falls back to cursor, and then text color.
-    /// ## `color`
-    /// the selected text color, or `None` to unset it
-    fn set_selected_text_color(&self, color: Option<Color>);
-
-    /// Selects the region of text between `start_pos` and `end_pos`.
-    ///
-    /// This function changes the position of the cursor to match
-    /// `start_pos` and the selection bound to match `end_pos`.
-    /// ## `start_pos`
-    /// start of the selection, in characters
-    /// ## `end_pos`
-    /// end of the selection, in characters
-    fn set_selection(&self, start_pos: isize, end_pos: isize);
-
-    /// Sets the other end of the selection, starting from the current
-    /// cursor position.
-    ///
-    /// If `selection_bound` is -1, the selection unset.
-    /// ## `selection_bound`
-    /// the position of the end of the selection, in characters
-    fn set_selection_bound(&self, selection_bound: i32);
-
-    /// Sets the color of the selection of a `Text` actor.
-    ///
-    /// If `color` is `None`, the selection color will be the same as the
-    /// cursor color, or if no cursor color is set either then it will be
-    /// the same as the text color.
-    /// ## `color`
-    /// the color of the selection, or `None` to unset it
-    fn set_selection_color(&self, color: Option<Color>);
-
-    /// Sets whether a `Text` actor should be in single line mode
-    /// or not. Only editable `Text`<!-- -->s can be in single line
-    /// mode.
-    ///
-    /// A text actor in single line mode will not wrap text and will clip
-    /// the visible area to the predefined size. The contents of the
-    /// text actor will scroll to display the end of the text if its length
-    /// is bigger than the allocated width.
-    ///
-    /// When setting the single line mode the `Text:activatable`
-    /// property is also set as a side effect. Instead of entering a new
-    /// line character, the text actor will emit the `Text::activate`
-    /// signal.
-    /// ## `single_line`
-    /// whether to enable single line mode
-    fn set_single_line_mode(&self, single_line: bool);
-
-    /// Sets the contents of a `Text` actor.
-    ///
-    /// If the `Text:use-markup` property was set to `true` it
-    /// will be reset to `false` as a side effect. If you want to
-    /// maintain the `Text:use-markup` you should use the
-    /// `TextExt::set_markup` function instead
-    /// ## `text`
-    /// the text to set. Passing `None` is the same
-    ///  as passing "" (the empty string)
-    fn set_text(&self, text: Option<&str>);
-
-    /// Sets whether the contents of the `Text` actor contains markup
-    /// in <link linkend="PangoMarkupFormat">Pango's text markup language`</link>`.
-    ///
-    /// Setting `Text:use-markup` on an editable `Text` will
-    /// not have any effect except hiding the markup.
-    ///
-    /// See also `Text:use-markup`.
-    /// ## `setting`
-    /// `true` if the text should be parsed for markup.
-    fn set_use_markup(&self, setting: bool);
-
-    /// Will be set to `true` if `Text:cursor-color` has been set.
-    fn get_property_cursor_color_set(&self) -> bool;
-
-    /// Will be set to `true` if `Text:selected-text-color` has been set.
-    fn get_property_selected_text_color_set(&self) -> bool;
-
-    /// Will be set to `true` if `Text:selection-color` has been set.
-    fn get_property_selection_color_set(&self) -> bool;
-
-    /// The ::activate signal is emitted each time the actor is 'activated'
-    /// by the user, normally by pressing the 'Enter' key. The signal is
-    /// emitted only if `Text:activatable` is set to `true`.
-    fn connect_activate<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::cursor-changed signal is emitted whenever the cursor
-    /// position or size changes.
-    fn connect_cursor_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// This signal is emitted when text is deleted from the actor by
-    /// the user. It is emitted before `self_` text changes.
-    /// ## `start_pos`
-    /// the starting position
-    /// ## `end_pos`
-    /// the end position
-    fn connect_delete_text<F: Fn(&Self, i32, i32) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn emit_delete_text(&self, start_pos: i32, end_pos: i32);
-
-    //fn connect_insert_text<Unsupported or ignored types>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::text-changed signal is emitted after `actor`'s text changes
-    fn connect_text_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_activatable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_attributes_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_buffer_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_color_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_cursor_color_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_cursor_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_cursor_position_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_cursor_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_editable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_ellipsize_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_font_description_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_font_name_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_justify_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_line_alignment_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_line_wrap_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_line_wrap_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_max_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_password_char_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_selectable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_selected_text_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_selected_text_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_selection_bound_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_selection_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_selection_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_single_line_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_text_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_use_markup_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Text>> TextExt for O {
-    fn activate(&self) -> bool {
-        unsafe { from_glib(ffi::clutter_text_activate(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn coords_to_position(&self, x: f32, y: f32) -> i32 {
-        unsafe { ffi::clutter_text_coords_to_position(self.as_ref().to_glib_none().0, x, y) }
-    }
-
-    fn delete_chars(&self, n_chars: u32) {
-        unsafe {
-            ffi::clutter_text_delete_chars(self.as_ref().to_glib_none().0, n_chars);
-        }
-    }
-
-    fn delete_selection(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_delete_selection(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn delete_text(&self, start_pos: isize, end_pos: isize) {
-        unsafe {
-            ffi::clutter_text_delete_text(self.as_ref().to_glib_none().0, start_pos, end_pos);
-        }
-    }
-
-    fn get_activatable(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_activatable(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_attributes(&self) -> Option<pango::AttrList> {
-        unsafe {
-            from_glib_none(ffi::clutter_text_get_attributes(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_buffer(&self) -> Option<TextBuffer> {
-        unsafe { from_glib_none(ffi::clutter_text_get_buffer(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn get_chars(&self, start_pos: isize, end_pos: isize) -> Option<GString> {
-        unsafe {
-            from_glib_full(ffi::clutter_text_get_chars(
-                self.as_ref().to_glib_none().0,
-                start_pos,
-                end_pos,
-            ))
-        }
-    }
-
-    fn get_color(&self) -> InternalColor {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            ffi::clutter_text_get_color(self.as_ref().to_glib_none().0, color.to_glib_none_mut().0);
-            color
-        }
-    }
-
-    fn get_cursor_color(&self) -> InternalColor {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            ffi::clutter_text_get_cursor_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none_mut().0,
-            );
-            color
-        }
-    }
-
-    fn get_cursor_position(&self) -> i32 {
-        unsafe { ffi::clutter_text_get_cursor_position(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_cursor_rect(&self) -> InternalRect {
-        unsafe {
-            let mut rect = InternalRect::uninitialized();
-            ffi::clutter_text_get_cursor_rect(
-                self.as_ref().to_glib_none().0,
-                rect.to_glib_none_mut().0,
-            );
-            rect
-        }
-    }
-
-    fn get_cursor_size(&self) -> u32 {
-        unsafe { ffi::clutter_text_get_cursor_size(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_cursor_visible(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_cursor_visible(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_editable(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_editable(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_ellipsize(&self) -> pango::EllipsizeMode {
-        unsafe {
-            from_glib(ffi::clutter_text_get_ellipsize(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_font_description(&self) -> Option<pango::FontDescription> {
-        unsafe {
-            from_glib_full(ffi::clutter_text_get_font_description(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_font_name(&self) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_text_get_font_name(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_justify(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_justify(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_layout(&self) -> Option<pango::Layout> {
-        unsafe { from_glib_none(ffi::clutter_text_get_layout(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn get_layout_offsets(&self) -> (i32, i32) {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            ffi::clutter_text_get_layout_offsets(
-                self.as_ref().to_glib_none().0,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-            );
-            let x = x.assume_init();
-            let y = y.assume_init();
-            (x, y)
-        }
-    }
-
-    fn get_line_alignment(&self) -> pango::Alignment {
-        unsafe {
-            from_glib(ffi::clutter_text_get_line_alignment(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_line_wrap(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_line_wrap(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_line_wrap_mode(&self) -> pango::WrapMode {
-        unsafe {
-            from_glib(ffi::clutter_text_get_line_wrap_mode(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_max_length(&self) -> i32 {
-        unsafe { ffi::clutter_text_get_max_length(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_password_char(&self) -> char {
-        unsafe {
-            from_glib(ffi::clutter_text_get_password_char(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_selectable(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_selectable(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_selected_text_color(&self) -> InternalColor {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            ffi::clutter_text_get_selected_text_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none_mut().0,
-            );
-            color
-        }
-    }
-
-    fn get_selection(&self) -> Option<GString> {
-        unsafe {
-            from_glib_full(ffi::clutter_text_get_selection(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_selection_bound(&self) -> i32 {
-        unsafe { ffi::clutter_text_get_selection_bound(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_selection_color(&self) -> InternalColor {
-        unsafe {
-            let mut color = InternalColor::uninitialized();
-            ffi::clutter_text_get_selection_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none_mut().0,
-            );
-            color
-        }
-    }
-
-    fn get_single_line_mode(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_single_line_mode(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_text(&self) -> Option<GString> {
-        unsafe { from_glib_none(ffi::clutter_text_get_text(self.as_ref().to_glib_none().0)) }
-    }
-
-    fn get_use_markup(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_text_get_use_markup(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn insert_text(&self, text: &str, position: isize) {
-        unsafe {
-            ffi::clutter_text_insert_text(
-                self.as_ref().to_glib_none().0,
-                text.to_glib_none().0,
-                position,
-            );
-        }
-    }
-
-    fn insert_unichar(&self, wc: char) {
-        unsafe {
-            ffi::clutter_text_insert_unichar(self.as_ref().to_glib_none().0, wc.to_glib());
-        }
-    }
-
-    fn position_to_coords(&self, position: i32) -> Option<(f32, f32, f32)> {
-        unsafe {
-            let mut x = mem::MaybeUninit::uninit();
-            let mut y = mem::MaybeUninit::uninit();
-            let mut line_height = mem::MaybeUninit::uninit();
-            let ret = from_glib(ffi::clutter_text_position_to_coords(
-                self.as_ref().to_glib_none().0,
-                position,
-                x.as_mut_ptr(),
-                y.as_mut_ptr(),
-                line_height.as_mut_ptr(),
-            ));
-            let x = x.assume_init();
-            let y = y.assume_init();
-            let line_height = line_height.assume_init();
-            if ret {
-                Some((x, y, line_height))
-            } else {
-                None
-            }
-        }
-    }
-
-    fn set_activatable(&self, activatable: bool) {
-        unsafe {
-            ffi::clutter_text_set_activatable(
-                self.as_ref().to_glib_none().0,
-                activatable.to_glib(),
-            );
-        }
-    }
-
-    fn set_attributes(&self, attrs: Option<&pango::AttrList>) {
-        unsafe {
-            ffi::clutter_text_set_attributes(
-                self.as_ref().to_glib_none().0,
-                attrs.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_buffer<P: IsA<TextBuffer>>(&self, buffer: &P) {
-        unsafe {
-            ffi::clutter_text_set_buffer(
-                self.as_ref().to_glib_none().0,
-                buffer.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_color(&self, value: Color) {
-        let color = {
-            let RgbaColor {
-                red,
-                green,
-                blue,
-                alpha,
-            } = value.into();
-            InternalColor::new(red, green, blue, alpha)
-        };
-
-        unsafe {
-            ffi::clutter_text_set_color(self.as_ref().to_glib_none().0, color.to_glib_none().0);
-        }
-    }
-
-    fn set_cursor_color(&self, color: Option<Color>) {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            ffi::clutter_text_set_cursor_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_cursor_position(&self, position: i32) {
-        unsafe {
-            ffi::clutter_text_set_cursor_position(self.as_ref().to_glib_none().0, position);
-        }
-    }
-
-    fn set_cursor_size(&self, size: i32) {
-        unsafe {
-            ffi::clutter_text_set_cursor_size(self.as_ref().to_glib_none().0, size);
-        }
-    }
-
-    fn set_cursor_visible(&self, cursor_visible: bool) {
-        unsafe {
-            ffi::clutter_text_set_cursor_visible(
-                self.as_ref().to_glib_none().0,
-                cursor_visible.to_glib(),
-            );
-        }
-    }
-
-    fn set_editable(&self, editable: bool) {
-        unsafe {
-            ffi::clutter_text_set_editable(self.as_ref().to_glib_none().0, editable.to_glib());
-        }
-    }
-
-    fn set_ellipsize(&self, mode: pango::EllipsizeMode) {
-        unsafe {
-            ffi::clutter_text_set_ellipsize(self.as_ref().to_glib_none().0, mode.to_glib());
-        }
-    }
-
-    fn set_font_description(&self, font_desc: &mut pango::FontDescription) {
-        unsafe {
-            ffi::clutter_text_set_font_description(
-                self.as_ref().to_glib_none().0,
-                font_desc.to_glib_none_mut().0,
-            );
-        }
-    }
-
-    fn set_font_name(&self, font_name: Option<&str>) {
-        unsafe {
-            ffi::clutter_text_set_font_name(
-                self.as_ref().to_glib_none().0,
-                font_name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_justify(&self, justify: bool) {
-        unsafe {
-            ffi::clutter_text_set_justify(self.as_ref().to_glib_none().0, justify.to_glib());
-        }
-    }
-
-    fn set_line_alignment(&self, alignment: pango::Alignment) {
-        unsafe {
-            ffi::clutter_text_set_line_alignment(
-                self.as_ref().to_glib_none().0,
-                alignment.to_glib(),
-            );
-        }
-    }
-
-    fn set_line_wrap(&self, line_wrap: bool) {
-        unsafe {
-            ffi::clutter_text_set_line_wrap(self.as_ref().to_glib_none().0, line_wrap.to_glib());
-        }
-    }
-
-    fn set_line_wrap_mode(&self, wrap_mode: pango::WrapMode) {
-        unsafe {
-            ffi::clutter_text_set_line_wrap_mode(
-                self.as_ref().to_glib_none().0,
-                wrap_mode.to_glib(),
-            );
-        }
-    }
-
-    fn set_markup(&self, markup: Option<&str>) {
-        unsafe {
-            ffi::clutter_text_set_markup(self.as_ref().to_glib_none().0, markup.to_glib_none().0);
-        }
-    }
-
-    fn set_max_length(&self, max: i32) {
-        unsafe {
-            ffi::clutter_text_set_max_length(self.as_ref().to_glib_none().0, max);
-        }
-    }
-
-    fn set_password_char(&self, wc: char) {
-        unsafe {
-            ffi::clutter_text_set_password_char(self.as_ref().to_glib_none().0, wc.to_glib());
-        }
-    }
-
-    fn set_preedit_string(
-        &self,
-        preedit_str: Option<&str>,
-        preedit_attrs: Option<&pango::AttrList>,
-        cursor_pos: u32,
-    ) {
-        unsafe {
-            ffi::clutter_text_set_preedit_string(
-                self.as_ref().to_glib_none().0,
-                preedit_str.to_glib_none().0,
-                preedit_attrs.to_glib_none().0,
-                cursor_pos,
-            );
-        }
-    }
-
-    fn set_selectable(&self, selectable: bool) {
-        unsafe {
-            ffi::clutter_text_set_selectable(self.as_ref().to_glib_none().0, selectable.to_glib());
-        }
-    }
-
-    fn set_selected_text_color(&self, color: Option<Color>) {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            ffi::clutter_text_set_selected_text_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_selection(&self, start_pos: isize, end_pos: isize) {
-        unsafe {
-            ffi::clutter_text_set_selection(self.as_ref().to_glib_none().0, start_pos, end_pos);
-        }
-    }
-
-    fn set_selection_bound(&self, selection_bound: i32) {
-        unsafe {
-            ffi::clutter_text_set_selection_bound(self.as_ref().to_glib_none().0, selection_bound);
-        }
-    }
-
-    fn set_selection_color(&self, color: Option<Color>) {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            ffi::clutter_text_set_selection_color(
-                self.as_ref().to_glib_none().0,
-                color.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_single_line_mode(&self, single_line: bool) {
-        unsafe {
-            ffi::clutter_text_set_single_line_mode(
-                self.as_ref().to_glib_none().0,
-                single_line.to_glib(),
-            );
-        }
-    }
-
-    fn set_text(&self, text: Option<&str>) {
-        unsafe {
-            ffi::clutter_text_set_text(self.as_ref().to_glib_none().0, text.to_glib_none().0);
-        }
-    }
-
-    fn set_use_markup(&self, setting: bool) {
-        unsafe {
-            ffi::clutter_text_set_use_markup(self.as_ref().to_glib_none().0, setting.to_glib());
-        }
-    }
-
-    fn get_property_cursor_color_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"cursor-color-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `cursor-color-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_selected_text_color_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"selected-text-color-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `selected-text-color-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_selection_color_set(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"selection-color-set\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `selection-color-set` getter")
-                .unwrap()
-        }
-    }
-
-    fn connect_activate<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn activate_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"activate\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    activate_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_cursor_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn cursor_changed_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"cursor-changed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    cursor_changed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_delete_text<F: Fn(&Self, i32, i32) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn delete_text_trampoline<P, F: Fn(&P, i32, i32) + 'static>(
-            this: *mut ffi::ClutterText,
-            start_pos: libc::c_int,
-            end_pos: libc::c_int,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Text::from_glib_borrow(this).unsafe_cast_ref(),
-                start_pos,
-                end_pos,
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"delete-text\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    delete_text_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn emit_delete_text(&self, start_pos: i32, end_pos: i32) {
-        let _ = unsafe {
-            glib::Object::from_glib_borrow(self.as_ptr() as *mut gobject_sys::GObject)
-                .emit("delete-text", &[&start_pos, &end_pos])
-                .unwrap()
-        };
-    }
-
-    //fn connect_insert_text<Unsupported or ignored types>(&self, f: F) -> SignalHandlerId {
-    //    Unimplemented position: *.Pointer
-    //}
-
-    fn connect_text_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn text_changed_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"text-changed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    text_changed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_activatable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_activatable_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::activatable\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_activatable_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_attributes_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_attributes_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::attributes\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_attributes_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_buffer_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_buffer_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::buffer\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_buffer_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_color_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_color_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::color\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_color_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_cursor_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_cursor_color_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::cursor-color\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_cursor_color_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_cursor_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_cursor_color_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::cursor-color-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_cursor_color_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_cursor_position_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_cursor_position_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::cursor-position\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_cursor_position_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_cursor_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_cursor_size_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::cursor-size\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_cursor_size_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_cursor_visible_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::cursor-visible\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_cursor_visible_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_editable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_editable_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::editable\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_editable_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_ellipsize_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_ellipsize_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::ellipsize\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_ellipsize_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_font_description_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_description_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-description\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_description_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_font_name_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_font_name_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::font-name\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_font_name_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_justify_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_justify_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::justify\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_justify_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_line_alignment_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_line_alignment_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::line-alignment\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_line_alignment_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_line_wrap_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_line_wrap_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::line-wrap\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_line_wrap_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_line_wrap_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_line_wrap_mode_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::line-wrap-mode\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_line_wrap_mode_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_max_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_max_length_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::max-length\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_max_length_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_password_char_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_password_char_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::password-char\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_password_char_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_selectable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_selectable_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::selectable\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_selectable_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_selected_text_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_selected_text_color_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::selected-text-color\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_selected_text_color_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_selected_text_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_selected_text_color_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::selected-text-color-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_selected_text_color_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_selection_bound_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_selection_bound_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::selection-bound\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_selection_bound_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_selection_color_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_selection_color_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::selection-color\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_selection_color_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_selection_color_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_selection_color_set_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::selection-color-set\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_selection_color_set_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_single_line_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_single_line_mode_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::single-line-mode\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_single_line_mode_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_text_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_text_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::text\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_text_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_use_markup_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_use_markup_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterText,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Text>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Text::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::use-markup\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_use_markup_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Text {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Text")
-    }
-}
diff --git a/src/legacy/text_buffer.rs b/src/legacy/text_buffer.rs
deleted file mode 100644
index ad6d6f2..0000000
--- a/src/legacy/text_buffer.rs
+++ /dev/null
@@ -1,409 +0,0 @@
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct TextBuffer(Object<ffi::ClutterTextBuffer, ffi::ClutterTextBufferClass, TextBufferClass>);
-
-    match fn {
-        get_type => || ffi::clutter_text_buffer_get_type(),
-    }
-}
-
-impl TextBuffer {
-    /// Create a new TextBuffer object.
-    ///
-    /// # Returns
-    ///
-    /// A new TextBuffer object.
-    pub fn new() -> TextBuffer {
-        unsafe { from_glib_full(ffi::clutter_text_buffer_new()) }
-    }
-
-    // pub fn with_text(text: Option<&str>) -> TextBuffer {
-    //     let text_len = text.len() as isize;
-    //     unsafe {
-    //         from_glib_full(ffi::clutter_text_buffer_new_with_text(
-    //             text.to_glib_none().0,
-    //             text_len,
-    //         ))
-    //     }
-    // }
-}
-
-impl Default for TextBuffer {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `TextBuffer` methods.
-///
-/// # Implementors
-///
-/// [`TextBuffer`](struct.TextBuffer.html)
-pub trait TextBufferExt: 'static {
-    /// Deletes a sequence of characters from the buffer. `n_chars` characters are
-    /// deleted starting at `position`. If `n_chars` is negative, then all characters
-    /// until the end of the text are deleted.
-    ///
-    /// If `position` or `n_chars` are out of bounds, then they are coerced to sane
-    /// values.
-    ///
-    /// Note that the positions are specified in characters, not bytes.
-    /// ## `position`
-    /// position at which to delete text
-    /// ## `n_chars`
-    /// number of characters to delete
-    ///
-    /// # Returns
-    ///
-    /// The number of characters deleted.
-    fn delete_text(&self, position: u32, n_chars: i32) -> u32;
-
-    /// Emits the `TextBuffer::deleted-text` signal on `self`.
-    ///
-    /// Used when subclassing `TextBuffer`
-    /// ## `position`
-    /// position at which text was deleted
-    /// ## `n_chars`
-    /// number of characters deleted
-    fn emit_deleted_text(&self, position: u32, n_chars: u32);
-
-    /// Emits the `TextBuffer::inserted-text` signal on `self`.
-    ///
-    /// Used when subclassing `TextBuffer`
-    /// ## `position`
-    /// position at which text was inserted
-    /// ## `chars`
-    /// text that was inserted
-    /// ## `n_chars`
-    /// number of characters inserted
-    fn emit_inserted_text(&self, position: u32, chars: &str, n_chars: u32);
-
-    /// Retrieves the length in bytes of the buffer.
-    /// See `TextBufferExt::get_length`.
-    ///
-    /// # Returns
-    ///
-    /// The byte length of the buffer.
-    fn get_bytes(&self) -> usize;
-
-    /// Retrieves the length in characters of the buffer.
-    ///
-    /// # Returns
-    ///
-    /// The number of characters in the buffer.
-    fn get_length(&self) -> u32;
-
-    /// Retrieves the maximum allowed length of the text in
-    /// `self`. See `TextBufferExt::set_max_length`.
-    ///
-    /// # Returns
-    ///
-    /// the maximum allowed number of characters
-    ///  in `TextBuffer`, or 0 if there is no maximum.
-    fn get_max_length(&self) -> i32;
-
-    /// Retrieves the contents of the buffer.
-    ///
-    /// The memory pointer returned by this call will not change
-    /// unless this object emits a signal, or is finalized.
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the contents of the widget as a
-    ///  string. This string points to internally allocated
-    ///  storage in the buffer and must not be freed, modified or
-    ///  stored.
-    fn get_text(&self) -> Option<GString>;
-
-    /// Inserts `n_chars` characters of `chars` into the contents of the
-    /// buffer, at position `position`.
-    ///
-    /// If `n_chars` is negative, then characters from chars will be inserted
-    /// until a null-terminator is found. If `position` or `n_chars` are out of
-    /// bounds, or the maximum buffer text length is exceeded, then they are
-    /// coerced to sane values.
-    ///
-    /// Note that the position and length are in characters, not in bytes.
-    /// ## `position`
-    /// the position at which to insert text.
-    /// ## `chars`
-    /// the text to insert into the buffer.
-    /// ## `n_chars`
-    /// the length of the text in characters, or -1
-    ///
-    /// # Returns
-    ///
-    /// The number of characters actually inserted.
-    fn insert_text(&self, position: u32, chars: &str, n_chars: i32) -> u32;
-
-    /// Sets the maximum allowed length of the contents of the buffer. If
-    /// the current contents are longer than the given length, then they
-    /// will be truncated to fit.
-    /// ## `max_length`
-    /// the maximum length of the entry buffer, or 0 for no maximum.
-    ///  (other than the maximum length of entries.) The value passed in will
-    ///  be clamped to the range [ 0, `TEXT_BUFFER_MAX_SIZE` ].
-    fn set_max_length(&self, max_length: i32);
-
-    /// Sets the text in the buffer.
-    ///
-    /// This is roughly equivalent to calling `TextBufferExt::delete_text`
-    /// and `TextBufferExt::insert_text`.
-    ///
-    /// Note that `n_chars` is in characters, not in bytes.
-    /// ## `chars`
-    /// the new text
-    /// ## `n_chars`
-    /// the number of characters in `text`, or -1
-    fn set_text(&self, chars: &str, n_chars: i32);
-
-    /// This signal is emitted after text is deleted from the buffer.
-    /// ## `position`
-    /// the position the text was deleted at.
-    /// ## `n_chars`
-    /// The number of characters that were deleted.
-    fn connect_deleted_text<F: Fn(&Self, u32, u32) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// This signal is emitted after text is inserted into the buffer.
-    /// ## `position`
-    /// the position the text was inserted at.
-    /// ## `chars`
-    /// The text that was inserted.
-    /// ## `n_chars`
-    /// The number of characters that were inserted.
-    fn connect_inserted_text<F: Fn(&Self, u32, &str, u32) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_max_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_text_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<TextBuffer>> TextBufferExt for O {
-    fn delete_text(&self, position: u32, n_chars: i32) -> u32 {
-        unsafe {
-            ffi::clutter_text_buffer_delete_text(self.as_ref().to_glib_none().0, position, n_chars)
-        }
-    }
-
-    fn emit_deleted_text(&self, position: u32, n_chars: u32) {
-        unsafe {
-            ffi::clutter_text_buffer_emit_deleted_text(
-                self.as_ref().to_glib_none().0,
-                position,
-                n_chars,
-            );
-        }
-    }
-
-    fn emit_inserted_text(&self, position: u32, chars: &str, n_chars: u32) {
-        unsafe {
-            ffi::clutter_text_buffer_emit_inserted_text(
-                self.as_ref().to_glib_none().0,
-                position,
-                chars.to_glib_none().0,
-                n_chars,
-            );
-        }
-    }
-
-    fn get_bytes(&self) -> usize {
-        unsafe { ffi::clutter_text_buffer_get_bytes(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_length(&self) -> u32 {
-        unsafe { ffi::clutter_text_buffer_get_length(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_max_length(&self) -> i32 {
-        unsafe { ffi::clutter_text_buffer_get_max_length(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_text(&self) -> Option<GString> {
-        unsafe {
-            from_glib_none(ffi::clutter_text_buffer_get_text(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn insert_text(&self, position: u32, chars: &str, n_chars: i32) -> u32 {
-        unsafe {
-            ffi::clutter_text_buffer_insert_text(
-                self.as_ref().to_glib_none().0,
-                position,
-                chars.to_glib_none().0,
-                n_chars,
-            )
-        }
-    }
-
-    fn set_max_length(&self, max_length: i32) {
-        unsafe {
-            ffi::clutter_text_buffer_set_max_length(self.as_ref().to_glib_none().0, max_length);
-        }
-    }
-
-    fn set_text(&self, chars: &str, n_chars: i32) {
-        unsafe {
-            ffi::clutter_text_buffer_set_text(
-                self.as_ref().to_glib_none().0,
-                chars.to_glib_none().0,
-                n_chars,
-            );
-        }
-    }
-
-    fn connect_deleted_text<F: Fn(&Self, u32, u32) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn deleted_text_trampoline<P, F: Fn(&P, u32, u32) + 'static>(
-            this: *mut ffi::ClutterTextBuffer,
-            position: libc::c_uint,
-            n_chars: libc::c_uint,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<TextBuffer>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &TextBuffer::from_glib_borrow(this).unsafe_cast_ref(),
-                position,
-                n_chars,
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"deleted-text\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    deleted_text_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_inserted_text<F: Fn(&Self, u32, &str, u32) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn inserted_text_trampoline<P, F: Fn(&P, u32, &str, u32) + 'static>(
-            this: *mut ffi::ClutterTextBuffer,
-            position: libc::c_uint,
-            chars: *mut libc::c_char,
-            n_chars: libc::c_uint,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<TextBuffer>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &TextBuffer::from_glib_borrow(this).unsafe_cast_ref(),
-                position,
-                &GString::from_glib_borrow(chars),
-                n_chars,
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"inserted-text\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    inserted_text_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_length_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTextBuffer,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<TextBuffer>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&TextBuffer::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::length\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_length_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_max_length_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_max_length_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTextBuffer,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<TextBuffer>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&TextBuffer::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::max-length\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_max_length_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_text_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_text_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTextBuffer,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<TextBuffer>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&TextBuffer::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::text\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_text_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for TextBuffer {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "TextBuffer")
-    }
-}
diff --git a/src/legacy/text_node.rs b/src/legacy/text_node.rs
deleted file mode 100644
index b3ee064..0000000
--- a/src/legacy/text_node.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-use crate::{Color, InternalColor, PaintNode, RgbaColor};
-use glib::{object::Cast, translate::*};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct TextNode(Object<ffi::ClutterTextNode, ffi::ClutterTextNodeClass, TextNodeClass>) @extends PaintNode;
-
-    match fn {
-        get_type => || ffi::clutter_text_node_get_type(),
-    }
-}
-
-impl TextNode {
-    /// Creates a new `PaintNode` that will paint a `pango::Layout`
-    /// with the given color.
-    ///
-    /// This function takes a reference on the passed `layout`, so it
-    /// is safe to call `gobject::ObjectExt::unref` after it returns.
-    /// ## `layout`
-    /// a `pango::Layout`, or `None`
-    /// ## `color`
-    /// the color used to paint the layout,
-    ///  or `None`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PaintNode`.
-    ///  Use `PaintNodeExt::unref` when done
-    pub fn new(layout: Option<&pango::Layout>, color: Option<Color>) -> TextNode {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            PaintNode::from_glib_full(ffi::clutter_text_node_new(
-                layout.to_glib_none().0,
-                color.to_glib_none().0,
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-impl fmt::Display for TextNode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "TextNode")
-    }
-}
diff --git a/src/legacy/texture.rs b/src/legacy/texture.rs
deleted file mode 100644
index 83e0284..0000000
--- a/src/legacy/texture.rs
+++ /dev/null
@@ -1,479 +0,0 @@
-// Scriptable
-use crate::{Actor, Animatable, Container};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    StaticType, Value,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-// TODO: implements atk::ImplementorIface, Scriptable
-glib_wrapper! {
-    pub struct Texture(Object<ffi::ClutterTexture, ffi::ClutterTextureClass, TextureClass>) @extends Actor, gobject::InitiallyUnowned, @implements Animatable, Container;
-
-    match fn {
-        get_type => || ffi::clutter_texture_get_type(),
-    }
-}
-
-/// Trait containing all `Texture` methods.
-///
-/// # Implementors
-///
-/// [`Texture`](struct.Texture.html)
-pub trait TextureExt: 'static {
-    fn get_property_disable_slicing(&self) -> bool;
-
-    //fn get_property_filter_quality(&self) -> /*Ignored*/TextureQuality;
-
-    //fn set_property_filter_quality(&self, filter_quality: /*Ignored*/TextureQuality);
-
-    fn get_property_keep_aspect_ratio(&self) -> bool;
-
-    fn set_property_keep_aspect_ratio(&self, keep_aspect_ratio: bool);
-
-    fn get_property_pick_with_alpha(&self) -> bool;
-
-    fn set_property_pick_with_alpha(&self, pick_with_alpha: bool);
-
-    fn get_property_pixel_format(&self) -> dx::PixelFormat;
-
-    fn get_property_repeat_x(&self) -> bool;
-
-    fn set_property_repeat_x(&self, repeat_x: bool);
-
-    fn get_property_repeat_y(&self) -> bool;
-
-    fn set_property_repeat_y(&self, repeat_y: bool);
-
-    fn get_property_sync_size(&self) -> bool;
-
-    fn set_property_sync_size(&self, sync_size: bool);
-
-    fn get_property_tile_waste(&self) -> i32;
-
-    fn connect_property_filter_quality_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_keep_aspect_ratio_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_pick_with_alpha_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_pixel_format_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_repeat_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_repeat_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_sync_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_tile_waste_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<Texture>> TextureExt for O {
-    fn get_property_disable_slicing(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"disable-slicing\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `disable-slicing` getter")
-                .unwrap()
-        }
-    }
-
-    //fn get_property_filter_quality(&self) -> /*Ignored*/TextureQuality {
-    //    unsafe {
-    //        let mut value = Value::from_type(</*Unknown type*/ as StaticType>::static_type());
-    //        gobject_sys::g_object_get_property(self.to_glib_none().0 as *mut gobject_sys::GObject, b"filter-quality\0".as_ptr() as *const _, value.to_glib_none_mut().0);
-    //        value.get().expect("Return Value for property `filter-quality` getter").unwrap()
-    //    }
-    //}
-
-    //fn set_property_filter_quality(&self, filter_quality: /*Ignored*/TextureQuality) {
-    //    unsafe {
-    //        gobject_sys::g_object_set_property(self.to_glib_none().0 as *mut gobject_sys::GObject, b"filter-quality\0".as_ptr() as *const _, Value::from(&filter_quality).to_glib_none().0);
-    //    }
-    //}
-
-    fn get_property_keep_aspect_ratio(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"keep-aspect-ratio\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `keep-aspect-ratio` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_keep_aspect_ratio(&self, keep_aspect_ratio: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"keep-aspect-ratio\0".as_ptr() as *const _,
-                Value::from(&keep_aspect_ratio).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_pick_with_alpha(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"pick-with-alpha\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `pick-with-alpha` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_pick_with_alpha(&self, pick_with_alpha: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"pick-with-alpha\0".as_ptr() as *const _,
-                Value::from(&pick_with_alpha).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_pixel_format(&self) -> dx::PixelFormat {
-        unsafe {
-            let mut value = Value::from_type(<dx::PixelFormat as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"pixel-format\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `pixel-format` getter")
-                .unwrap()
-        }
-    }
-
-    fn get_property_repeat_x(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"repeat-x\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `repeat-x` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_repeat_x(&self, repeat_x: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"repeat-x\0".as_ptr() as *const _,
-                Value::from(&repeat_x).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_repeat_y(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"repeat-y\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `repeat-y` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_repeat_y(&self, repeat_y: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"repeat-y\0".as_ptr() as *const _,
-                Value::from(&repeat_y).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_sync_size(&self) -> bool {
-        unsafe {
-            let mut value = Value::from_type(<bool as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"sync-size\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `sync-size` getter")
-                .unwrap()
-        }
-    }
-
-    fn set_property_sync_size(&self, sync_size: bool) {
-        unsafe {
-            gobject_sys::g_object_set_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"sync-size\0".as_ptr() as *const _,
-                Value::from(&sync_size).to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_property_tile_waste(&self) -> i32 {
-        unsafe {
-            let mut value = Value::from_type(<i32 as StaticType>::static_type());
-            gobject_sys::g_object_get_property(
-                self.to_glib_none().0 as *mut gobject_sys::GObject,
-                b"tile-waste\0".as_ptr() as *const _,
-                value.to_glib_none_mut().0,
-            );
-            value
-                .get()
-                .expect("Return Value for property `tile-waste` getter")
-                .unwrap()
-        }
-    }
-
-    fn connect_property_filter_quality_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_filter_quality_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::filter-quality\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_filter_quality_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_keep_aspect_ratio_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_keep_aspect_ratio_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::keep-aspect-ratio\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_keep_aspect_ratio_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_pick_with_alpha_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_pick_with_alpha_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::pick-with-alpha\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_pick_with_alpha_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_pixel_format_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_pixel_format_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::pixel-format\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_pixel_format_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_repeat_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_repeat_x_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::repeat-x\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_repeat_x_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_repeat_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_repeat_y_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::repeat-y\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_repeat_y_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_sync_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_sync_size_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::sync-size\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_sync_size_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_tile_waste_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_tile_waste_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTexture,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Texture>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Texture::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::tile-waste\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_tile_waste_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Texture {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Texture")
-    }
-}
diff --git a/src/legacy/texture_node.rs b/src/legacy/texture_node.rs
deleted file mode 100644
index 6ac0ac9..0000000
--- a/src/legacy/texture_node.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-use crate::{Color, InternalColor, PaintNode, PipelineNode, RgbaColor, ScalingFilter};
-use glib::{
-    object::{Cast, IsA},
-    translate::*,
-};
-use std::fmt;
-
-glib_wrapper! {
-    pub struct TextureNode(Object<ffi::ClutterTextureNode, ffi::ClutterTextureNodeClass, TextureNodeClass>) @extends PipelineNode, PaintNode;
-
-    match fn {
-        get_type => || ffi::clutter_texture_node_get_type(),
-    }
-}
-
-impl TextureNode {
-    /// Creates a new `PaintNode` that will paint the passed `texture`.
-    ///
-    /// This function will take a reference on `texture`, so it is safe to
-    /// call `object_unref` on `texture` when it returns.
-    ///
-    /// The `color` must not be pre-multiplied with its `Color.alpha`
-    /// channel value; if `color` is `None`, a fully opaque white color will
-    /// be used for blending.
-    /// ## `texture`
-    /// a `dx::Texture`
-    /// ## `color`
-    /// a `Color` used for blending, or `None`
-    /// ## `min_filter`
-    /// the minification filter for the texture
-    /// ## `mag_filter`
-    /// the magnification filter for the texture
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PaintNode`.
-    ///  Use `PaintNodeExt::unref` when done
-    pub fn new<P: IsA<dx::Texture>>(
-        texture: &P,
-        color: Option<Color>,
-        min_filter: ScalingFilter,
-        mag_filter: ScalingFilter,
-    ) -> TextureNode {
-        let color = match color {
-            Some(value) => {
-                let RgbaColor {
-                    red,
-                    green,
-                    blue,
-                    alpha,
-                } = value.into();
-                Some(InternalColor::new(red, green, blue, alpha))
-            }
-            None => None,
-        };
-        unsafe {
-            PaintNode::from_glib_full(ffi::clutter_texture_node_new(
-                texture.as_ref().to_glib_none().0,
-                color.to_glib_none().0,
-                min_filter.to_glib(),
-                mag_filter.to_glib(),
-            ))
-            .unsafe_cast()
-        }
-    }
-}
-
-impl fmt::Display for TextureNode {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "TextureNode")
-    }
-}
diff --git a/src/legacy/timeline.rs b/src/legacy/timeline.rs
deleted file mode 100644
index a5b2290..0000000
--- a/src/legacy/timeline.rs
+++ /dev/null
@@ -1,1094 +0,0 @@
-// Scriptable
-use crate::{AnimationMode, InternalPoint, StepMode, TimelineDirection};
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-    GString,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem, mem::transmute};
-
-// TODO: @implements Scriptable
-glib_wrapper! {
-    pub struct Timeline(Object<ffi::ClutterTimeline, ffi::ClutterTimelineClass, TimelineClass>);
-
-    match fn {
-        get_type => || ffi::clutter_timeline_get_type(),
-    }
-}
-
-impl Timeline {
-    /// Creates a new `Timeline` with a duration of `msecs`.
-    /// ## `msecs`
-    /// Duration of the timeline in milliseconds
-    ///
-    /// # Returns
-    ///
-    /// the newly created `Timeline` instance. Use
-    ///  `gobject::ObjectExt::unref` when done using it
-    pub fn new(msecs: u32) -> Timeline {
-        unsafe { from_glib_full(ffi::clutter_timeline_new(msecs)) }
-    }
-}
-
-/// Trait containing all `Timeline` methods.
-///
-/// # Implementors
-///
-/// [`Timeline`](struct.Timeline.html), [`Transition`](struct.Transition.html)
-pub trait TimelineExt: 'static {
-    /// Adds a named marker that will be hit when the timeline has reached
-    /// the specified `progress`.
-    ///
-    /// Markers are unique string identifiers for a given position on the
-    /// timeline. Once `self` reaches the given `progress` of its duration,
-    /// if will emit a ::marker-reached signal for each marker attached to
-    /// that particular point.
-    ///
-    /// A marker can be removed with `TimelineExt::remove_marker`. The
-    /// timeline can be advanced to a marker using
-    /// `TimelineExt::advance_to_marker`.
-    ///
-    /// See also: `TimelineExt::add_marker_at_time`
-    /// ## `marker_name`
-    /// the unique name for this marker
-    /// ## `progress`
-    /// the normalized value of the position of the martke
-    fn add_marker(&self, marker_name: &str, progress: f64);
-
-    /// Adds a named marker that will be hit when the timeline has been
-    /// running for `msecs` milliseconds.
-    ///
-    /// Markers are unique string identifiers for a given position on the
-    /// timeline. Once `self` reaches the given `msecs`, it will emit
-    /// a ::marker-reached signal for each marker attached to that position.
-    ///
-    /// A marker can be removed with `TimelineExt::remove_marker`. The
-    /// timeline can be advanced to a marker using
-    /// `TimelineExt::advance_to_marker`.
-    ///
-    /// See also: `TimelineExt::add_marker`
-    /// ## `marker_name`
-    /// the unique name for this marker
-    /// ## `msecs`
-    /// position of the marker in milliseconds
-    fn add_marker_at_time(&self, marker_name: &str, msecs: u32);
-
-    /// Advance timeline to the requested point. The point is given as a
-    /// time in milliseconds since the timeline started.
-    ///
-    /// The `self` will not emit the `Timeline::new-frame`
-    /// signal for the given time. The first ::new-frame signal after the call to
-    /// `TimelineExt::advance` will be emit the skipped markers.
-    /// ## `msecs`
-    /// Time to advance to
-    fn advance(&self, msecs: u32);
-
-    /// Advances `self` to the time of the given `marker_name`.
-    ///
-    /// Like `TimelineExt::advance`, this function will not
-    /// emit the `Timeline::new-frame` for the time where `marker_name`
-    /// is set, nor it will emit `Timeline::marker-reached` for
-    /// `marker_name`.
-    /// ## `marker_name`
-    /// the name of the marker
-    fn advance_to_marker(&self, marker_name: &str);
-
-    /// Retrieves the value set by `TimelineExt::set_auto_reverse`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the timeline should automatically reverse, and
-    ///  `false` otherwise
-    fn get_auto_reverse(&self) -> bool;
-
-    /// Retrieves the control points for the cubic bezier progress mode.
-    /// ## `c_1`
-    /// return location for the first control
-    ///  point of the cubic bezier, or `None`
-    /// ## `c_2`
-    /// return location for the second control
-    ///  point of the cubic bezier, or `None`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `self` is using a cubic bezier progress
-    ///  more, and `false` otherwise
-    fn get_cubic_bezier_progress(&self) -> Option<(InternalPoint, InternalPoint)>;
-
-    /// Retrieves the current repeat for a timeline.
-    ///
-    /// Repeats start at 0.
-    ///
-    /// # Returns
-    ///
-    /// the current repeat
-    fn get_current_repeat(&self) -> i32;
-
-    /// Retrieves the delay set using `TimelineExt::set_delay`.
-    ///
-    /// # Returns
-    ///
-    /// the delay in milliseconds.
-    fn get_delay(&self) -> u32;
-
-    /// Retrieves the amount of time elapsed since the last
-    /// Timeline::new-frame signal.
-    ///
-    /// This function is only useful inside handlers for the ::new-frame
-    /// signal, and its behaviour is undefined if the timeline is not
-    /// playing.
-    ///
-    /// # Returns
-    ///
-    /// the amount of time in milliseconds elapsed since the
-    /// last frame
-    fn get_delta(&self) -> u32;
-
-    /// Retrieves the direction of the timeline set with
-    /// `TimelineExt::set_direction`.
-    ///
-    /// # Returns
-    ///
-    /// the direction of the timeline
-    fn get_direction(&self) -> TimelineDirection;
-
-    /// Retrieves the duration of a `Timeline` in milliseconds.
-    /// See `TimelineExt::set_duration`.
-    ///
-    /// # Returns
-    ///
-    /// the duration of the timeline, in milliseconds.
-    fn get_duration(&self) -> u32;
-
-    /// Retrieves the full duration of the `self`, taking into account the
-    /// current value of the `Timeline:repeat-count` property.
-    ///
-    /// If the `Timeline:repeat-count` property is set to -1, this function
-    /// will return `G_MAXINT64`.
-    ///
-    /// The returned value is to be considered a hint, and it's only valid
-    /// as long as the `self` hasn't been changed.
-    ///
-    /// # Returns
-    ///
-    /// the full duration of the `Timeline`
-    fn get_duration_hint(&self) -> i64;
-
-    /// Request the current time position of the timeline.
-    ///
-    /// # Returns
-    ///
-    /// current elapsed time in milliseconds.
-    fn get_elapsed_time(&self) -> u32;
-
-    /// The position of the timeline in a normalized [-1, 2] interval.
-    ///
-    /// The return value of this function is determined by the progress
-    /// mode set using `TimelineExt::set_progress_mode`, or by the
-    /// progress function set using `TimelineExt::set_progress_func`.
-    ///
-    /// # Returns
-    ///
-    /// the normalized current position in the timeline.
-    fn get_progress(&self) -> f64;
-
-    /// Retrieves the progress mode set using `TimelineExt::set_progress_mode`
-    /// or `TimelineExt::set_progress_func`.
-    ///
-    /// # Returns
-    ///
-    /// a `AnimationMode`
-    fn get_progress_mode(&self) -> AnimationMode;
-
-    /// Retrieves the number set using `TimelineExt::set_repeat_count`.
-    ///
-    /// # Returns
-    ///
-    /// the number of repeats
-    fn get_repeat_count(&self) -> i32;
-
-    /// Retrieves the parameters of the step progress mode used by `self`.
-    /// ## `n_steps`
-    /// return location for the number of steps, or `None`
-    /// ## `step_mode`
-    /// return location for the value change policy,
-    ///  or `None`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `self` is using a step progress
-    ///  mode, and `false` otherwise
-    fn get_step_progress(&self) -> Option<(i32, StepMode)>;
-
-    /// Checks whether `self` has a marker set with the given name.
-    /// ## `marker_name`
-    /// the name of the marker
-    ///
-    /// # Returns
-    ///
-    /// `true` if the marker was found
-    fn has_marker(&self, marker_name: &str) -> bool;
-
-    /// Queries state of a `Timeline`.
-    ///
-    /// # Returns
-    ///
-    /// `true` if timeline is currently playing
-    fn is_playing(&self) -> bool;
-
-    /// Retrieves the list of markers at time `msecs`. If `msecs` is a
-    /// negative integer, all the markers attached to `self` will be
-    /// returned.
-    /// ## `msecs`
-    /// the time to check, or -1
-    /// ## `n_markers`
-    /// the number of markers returned
-    ///
-    /// # Returns
-    ///
-    ///
-    ///  a newly allocated, `None` terminated string array containing the names
-    ///  of the markers. Use `g_strfreev` when done.
-    fn list_markers(&self, msecs: i32) -> Vec<GString>;
-
-    /// Pauses the `Timeline` on current frame
-    fn pause(&self);
-
-    /// Removes `marker_name`, if found, from `self`.
-    /// ## `marker_name`
-    /// the name of the marker to remove
-    fn remove_marker(&self, marker_name: &str);
-
-    /// Rewinds `Timeline` to the first frame if its direction is
-    /// `TimelineDirection::Forward` and the last frame if it is
-    /// `TimelineDirection::Backward`.
-    fn rewind(&self);
-
-    /// Sets whether `self` should reverse the direction after the
-    /// emission of the `Timeline::completed` signal.
-    ///
-    /// Setting the `Timeline:auto-reverse` property to `true` is the
-    /// equivalent of connecting a callback to the `Timeline::completed`
-    /// signal and changing the direction of the timeline from that callback;
-    /// for instance, this code:
-    ///
-    ///
-    /// ```text
-    /// static void
-    /// reverse_timeline (Timeline *timeline)
-    /// {
-    ///   TimelineDirection dir = timeline_get_direction (timeline);
-    ///
-    ///   if (dir == TIMELINE_FORWARD)
-    ///     dir = TIMELINE_BACKWARD;
-    ///   else
-    ///     dir = TIMELINE_FORWARD;
-    ///
-    ///   timeline_set_direction (timeline, dir);
-    /// }
-    /// ...
-    ///   timeline = timeline_new (1000);
-    ///   timeline_set_repeat_count (timeline, -1);
-    ///   g_signal_connect (timeline, "completed",
-    ///                     G_CALLBACK (reverse_timeline),
-    ///                     NULL);
-    /// ```
-    ///
-    /// can be effectively replaced by:
-    ///
-    ///
-    /// ```text
-    ///   timeline = timeline_new (1000);
-    ///   timeline_set_repeat_count (timeline, -1);
-    ///   timeline_set_auto_reverse (timeline);
-    /// ```
-    /// ## `reverse`
-    /// `true` if the `self` should reverse the direction
-    fn set_auto_reverse(&self, reverse: bool);
-
-    /// Sets the `Timeline:progress-mode` of `self`
-    /// to `AnimationMode::CubicBezier`, and sets the two control
-    /// points for the cubic bezier.
-    ///
-    /// The cubic bezier curve is between (0, 0) and (1, 1). The X coordinate
-    /// of the two control points must be in the [ 0, 1 ] range, while the
-    /// Y coordinate of the two control points can exceed this range.
-    /// ## `c_1`
-    /// the first control point for the cubic bezier
-    /// ## `c_2`
-    /// the second control point for the cubic bezier
-    fn set_cubic_bezier_progress(&self, c_1: &InternalPoint, c_2: &InternalPoint);
-
-    /// Sets the delay, in milliseconds, before `self` should start.
-    /// ## `msecs`
-    /// delay in milliseconds
-    fn set_delay(&self, msecs: u32);
-
-    /// Sets the direction of `self`, either `TimelineDirection::Forward` or
-    /// `TimelineDirection::Backward`.
-    /// ## `direction`
-    /// the direction of the timeline
-    fn set_direction(&self, direction: TimelineDirection);
-
-    /// Sets the duration of the timeline, in milliseconds. The speed
-    /// of the timeline depends on the Timeline:fps setting.
-    /// ## `msecs`
-    /// duration of the timeline in milliseconds
-    fn set_duration(&self, msecs: u32);
-
-    /// Sets a custom progress function for `self`. The progress function will
-    /// be called by `TimelineExt::get_progress` and will be used to compute
-    /// the progress value based on the elapsed time and the total duration of the
-    /// timeline.
-    ///
-    /// If `func` is not `None`, the `Timeline:progress-mode` property will
-    /// be set to `AnimationMode::CustomMode`.
-    ///
-    /// If `func` is `None`, any previously set progress function will be unset, and
-    /// the `Timeline:progress-mode` property will be set to `AnimationMode::Linear`.
-    /// ## `func`
-    /// a progress function, or `None`
-    /// ## `data`
-    /// data to pass to `func`
-    /// ## `notify`
-    /// a function to be called when the progress function is removed
-    ///  or the timeline is disposed
-    fn set_progress_func(&self, func: Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>);
-
-    /// Sets the progress function using a value from the `AnimationMode`
-    /// enumeration. The `mode` cannot be `AnimationMode::CustomMode` or bigger than
-    /// `AnimationMode::AnimationLast`.
-    /// ## `mode`
-    /// the progress mode, as a `AnimationMode`
-    fn set_progress_mode(&self, mode: AnimationMode);
-
-    /// Sets the number of times the `self` should repeat.
-    ///
-    /// If `count` is 0, the timeline never repeats.
-    ///
-    /// If `count` is -1, the timeline will always repeat until
-    /// it's stopped.
-    /// ## `count`
-    /// the number of times the timeline should repeat
-    fn set_repeat_count(&self, count: i32);
-
-    /// Sets the `Timeline:progress-mode` of the `self` to `AnimationMode::Steps`
-    /// and provides the parameters of the step function.
-    /// ## `n_steps`
-    /// the number of steps
-    /// ## `step_mode`
-    /// whether the change should happen at the start
-    ///  or at the end of the step
-    fn set_step_progress(&self, n_steps: i32, step_mode: StepMode);
-
-    /// Advance timeline by the requested time in milliseconds
-    /// ## `msecs`
-    /// Amount of time to skip
-    fn skip(&self, msecs: u32);
-
-    /// Starts the `Timeline` playing.
-    fn start(&self);
-
-    /// Stops the `Timeline` and moves to frame 0
-    fn stop(&self);
-
-    /// The `Timeline::completed` signal is emitted when the timeline's
-    /// elapsed time reaches the value of the `Timeline:duration`
-    /// property.
-    ///
-    /// This signal will be emitted even if the `Timeline` is set to be
-    /// repeating.
-    ///
-    /// If you want to get notification on whether the `Timeline` has
-    /// been stopped or has finished its run, including its eventual repeats,
-    /// you should use the `Timeline::stopped` signal instead.
-    fn connect_completed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::marker-reached signal is emitted each time a timeline
-    /// reaches a marker set with
-    /// `TimelineExt::add_marker_at_time`. This signal is detailed
-    /// with the name of the marker as well, so it is possible to connect
-    /// a callback to the ::marker-reached signal for a specific marker
-    /// with:
-    ///
-    /// `<informalexample>``<programlisting>`
-    ///  timeline_add_marker_at_time (timeline, "foo", 500);
-    ///  timeline_add_marker_at_time (timeline, "bar", 750);
-    ///
-    ///  g_signal_connect (timeline, "marker-reached",
-    ///  G_CALLBACK (each_marker_reached), NULL);
-    ///  g_signal_connect (timeline, "marker-reached::foo",
-    ///  G_CALLBACK (foo_marker_reached), NULL);
-    ///  g_signal_connect (timeline, "marker-reached::bar",
-    ///  G_CALLBACK (bar_marker_reached), NULL);
-    /// `</programlisting>``</informalexample>`
-    ///
-    /// In the example, the first callback will be invoked for both
-    /// the "foo" and "bar" marker, while the second and third callbacks
-    /// will be invoked for the "foo" or "bar" markers, respectively.
-    /// ## `marker_name`
-    /// the name of the marker reached
-    /// ## `msecs`
-    /// the elapsed time
-    fn connect_marker_reached<F: Fn(&Self, &str, i32) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::new-frame signal is emitted for each timeline running
-    /// timeline before a new frame is drawn to give animations a chance
-    /// to update the scene.
-    /// ## `msecs`
-    /// the elapsed time between 0 and duration
-    fn connect_new_frame<F: Fn(&Self, i32) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::paused signal is emitted when `TimelineExt::pause` is invoked.
-    fn connect_paused<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The ::started signal is emitted when the timeline starts its run.
-    /// This might be as soon as `TimelineExt::start` is invoked or
-    /// after the delay set in the Timeline:delay property has
-    /// expired.
-    fn connect_started<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    /// The `Timeline::stopped` signal is emitted when the timeline
-    /// has been stopped, either because `TimelineExt::stop` has been
-    /// called, or because it has been exhausted.
-    ///
-    /// This is different from the `Timeline::completed` signal,
-    /// which gets emitted after every repeat finishes.
-    ///
-    /// If the `Timeline` has is marked as infinitely repeating,
-    /// this signal will never be emitted.
-    /// ## `is_finished`
-    /// `true` if the signal was emitted at the end of the
-    ///  timeline.
-    fn connect_stopped<F: Fn(&Self, bool) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_auto_reverse_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-
-    fn connect_property_delay_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_duration_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_progress_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_repeat_count_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> SignalHandlerId;
-}
-
-impl<O: IsA<Timeline>> TimelineExt for O {
-    fn add_marker(&self, marker_name: &str, progress: f64) {
-        unsafe {
-            ffi::clutter_timeline_add_marker(
-                self.as_ref().to_glib_none().0,
-                marker_name.to_glib_none().0,
-                progress,
-            );
-        }
-    }
-
-    fn add_marker_at_time(&self, marker_name: &str, msecs: u32) {
-        unsafe {
-            ffi::clutter_timeline_add_marker_at_time(
-                self.as_ref().to_glib_none().0,
-                marker_name.to_glib_none().0,
-                msecs,
-            );
-        }
-    }
-
-    fn advance(&self, msecs: u32) {
-        unsafe {
-            ffi::clutter_timeline_advance(self.as_ref().to_glib_none().0, msecs);
-        }
-    }
-
-    fn advance_to_marker(&self, marker_name: &str) {
-        unsafe {
-            ffi::clutter_timeline_advance_to_marker(
-                self.as_ref().to_glib_none().0,
-                marker_name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn get_auto_reverse(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_timeline_get_auto_reverse(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_cubic_bezier_progress(&self) -> Option<(InternalPoint, InternalPoint)> {
-        unsafe {
-            let mut c_1 = InternalPoint::uninitialized();
-            let mut c_2 = InternalPoint::uninitialized();
-            let ret = from_glib(ffi::clutter_timeline_get_cubic_bezier_progress(
-                self.as_ref().to_glib_none().0,
-                c_1.to_glib_none_mut().0,
-                c_2.to_glib_none_mut().0,
-            ));
-            if ret {
-                Some((c_1, c_2))
-            } else {
-                None
-            }
-        }
-    }
-
-    fn get_current_repeat(&self) -> i32 {
-        unsafe { ffi::clutter_timeline_get_current_repeat(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_delay(&self) -> u32 {
-        unsafe { ffi::clutter_timeline_get_delay(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_delta(&self) -> u32 {
-        unsafe { ffi::clutter_timeline_get_delta(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_direction(&self) -> TimelineDirection {
-        unsafe {
-            from_glib(ffi::clutter_timeline_get_direction(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_duration(&self) -> u32 {
-        unsafe { ffi::clutter_timeline_get_duration(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_duration_hint(&self) -> i64 {
-        unsafe { ffi::clutter_timeline_get_duration_hint(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_elapsed_time(&self) -> u32 {
-        unsafe { ffi::clutter_timeline_get_elapsed_time(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_progress(&self) -> f64 {
-        unsafe { ffi::clutter_timeline_get_progress(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_progress_mode(&self) -> AnimationMode {
-        unsafe {
-            from_glib(ffi::clutter_timeline_get_progress_mode(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_repeat_count(&self) -> i32 {
-        unsafe { ffi::clutter_timeline_get_repeat_count(self.as_ref().to_glib_none().0) }
-    }
-
-    fn get_step_progress(&self) -> Option<(i32, StepMode)> {
-        unsafe {
-            let mut n_steps = mem::MaybeUninit::uninit();
-            let mut step_mode = mem::MaybeUninit::uninit();
-            let ret = from_glib(ffi::clutter_timeline_get_step_progress(
-                self.as_ref().to_glib_none().0,
-                n_steps.as_mut_ptr(),
-                step_mode.as_mut_ptr(),
-            ));
-            let n_steps = n_steps.assume_init();
-            let step_mode = step_mode.assume_init();
-            if ret {
-                Some((n_steps, from_glib(step_mode)))
-            } else {
-                None
-            }
-        }
-    }
-
-    fn has_marker(&self, marker_name: &str) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_timeline_has_marker(
-                self.as_ref().to_glib_none().0,
-                marker_name.to_glib_none().0,
-            ))
-        }
-    }
-
-    fn is_playing(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_timeline_is_playing(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn list_markers(&self, msecs: i32) -> Vec<GString> {
-        unsafe {
-            let mut n_markers = mem::MaybeUninit::uninit();
-            let ret = FromGlibContainer::from_glib_full_num(
-                ffi::clutter_timeline_list_markers(
-                    self.as_ref().to_glib_none().0,
-                    msecs,
-                    n_markers.as_mut_ptr(),
-                ),
-                n_markers.assume_init() as usize,
-            );
-            ret
-        }
-    }
-
-    fn pause(&self) {
-        unsafe {
-            ffi::clutter_timeline_pause(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn remove_marker(&self, marker_name: &str) {
-        unsafe {
-            ffi::clutter_timeline_remove_marker(
-                self.as_ref().to_glib_none().0,
-                marker_name.to_glib_none().0,
-            );
-        }
-    }
-
-    fn rewind(&self) {
-        unsafe {
-            ffi::clutter_timeline_rewind(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn set_auto_reverse(&self, reverse: bool) {
-        unsafe {
-            ffi::clutter_timeline_set_auto_reverse(
-                self.as_ref().to_glib_none().0,
-                reverse.to_glib(),
-            );
-        }
-    }
-
-    fn set_cubic_bezier_progress(&self, c_1: &InternalPoint, c_2: &InternalPoint) {
-        unsafe {
-            ffi::clutter_timeline_set_cubic_bezier_progress(
-                self.as_ref().to_glib_none().0,
-                c_1.to_glib_none().0,
-                c_2.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_delay(&self, msecs: u32) {
-        unsafe {
-            ffi::clutter_timeline_set_delay(self.as_ref().to_glib_none().0, msecs);
-        }
-    }
-
-    fn set_direction(&self, direction: TimelineDirection) {
-        unsafe {
-            ffi::clutter_timeline_set_direction(
-                self.as_ref().to_glib_none().0,
-                direction.to_glib(),
-            );
-        }
-    }
-
-    fn set_duration(&self, msecs: u32) {
-        unsafe {
-            ffi::clutter_timeline_set_duration(self.as_ref().to_glib_none().0, msecs);
-        }
-    }
-
-    fn set_progress_func(&self, func: Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>) {
-        let func_data: Box_<Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
-            Box_::new(func);
-        unsafe extern "C" fn func_func(
-            timeline: *mut ffi::ClutterTimeline,
-            elapsed: libc::c_double,
-            total: libc::c_double,
-            user_data: glib_sys::gpointer,
-        ) -> libc::c_double {
-            let timeline = from_glib_borrow(timeline);
-            let callback: &Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>> =
-                &*(user_data as *mut _);
-            let res = if let Some(ref callback) = *callback {
-                callback(&timeline, elapsed, total)
-            } else {
-                panic!("cannot get closure...")
-            };
-            res
-        }
-        let func = if func_data.is_some() {
-            Some(func_func as _)
-        } else {
-            None
-        };
-        unsafe extern "C" fn notify_func(data: glib_sys::gpointer) {
-            let _callback: Box_<Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
-                Box_::from_raw(data as *mut _);
-        }
-        let destroy_call3 = Some(notify_func as _);
-        let super_callback0: Box_<Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
-            func_data;
-        unsafe {
-            ffi::clutter_timeline_set_progress_func(
-                self.as_ref().to_glib_none().0,
-                func,
-                Box_::into_raw(super_callback0) as *mut _,
-                destroy_call3,
-            );
-        }
-    }
-
-    fn set_progress_mode(&self, mode: AnimationMode) {
-        unsafe {
-            ffi::clutter_timeline_set_progress_mode(self.as_ref().to_glib_none().0, mode.to_glib());
-        }
-    }
-
-    fn set_repeat_count(&self, count: i32) {
-        unsafe {
-            ffi::clutter_timeline_set_repeat_count(self.as_ref().to_glib_none().0, count);
-        }
-    }
-
-    fn set_step_progress(&self, n_steps: i32, step_mode: StepMode) {
-        unsafe {
-            ffi::clutter_timeline_set_step_progress(
-                self.as_ref().to_glib_none().0,
-                n_steps,
-                step_mode.to_glib(),
-            );
-        }
-    }
-
-    fn skip(&self, msecs: u32) {
-        unsafe {
-            ffi::clutter_timeline_skip(self.as_ref().to_glib_none().0, msecs);
-        }
-    }
-
-    fn start(&self) {
-        unsafe {
-            ffi::clutter_timeline_start(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn stop(&self) {
-        unsafe {
-            ffi::clutter_timeline_stop(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn connect_completed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn completed_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"completed\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    completed_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_marker_reached<F: Fn(&Self, &str, i32) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn marker_reached_trampoline<P, F: Fn(&P, &str, i32) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            marker_name: *mut libc::c_char,
-            msecs: libc::c_int,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Timeline::from_glib_borrow(this).unsafe_cast_ref(),
-                &GString::from_glib_borrow(marker_name),
-                msecs,
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"marker-reached\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    marker_reached_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_new_frame<F: Fn(&Self, i32) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn new_frame_trampoline<P, F: Fn(&P, i32) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            msecs: libc::c_int,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref(), msecs)
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"new-frame\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    new_frame_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_paused<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn paused_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"paused\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    paused_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_started<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn started_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"started\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    started_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_stopped<F: Fn(&Self, bool) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn stopped_trampoline<P, F: Fn(&P, bool) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            is_finished: glib_sys::gboolean,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &Timeline::from_glib_borrow(this).unsafe_cast_ref(),
-                from_glib(is_finished),
-            )
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"stopped\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    stopped_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_auto_reverse_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_auto_reverse_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::auto-reverse\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_auto_reverse_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_delay_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_delay_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::delay\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_delay_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_direction_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::direction\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_direction_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_duration_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_duration_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::duration\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_duration_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_progress_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_progress_mode_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::progress-mode\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_progress_mode_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_repeat_count_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_repeat_count_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTimeline,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Timeline>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Timeline::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::repeat-count\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_repeat_count_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Timeline {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Timeline")
-    }
-}
diff --git a/src/legacy/transition.rs b/src/legacy/transition.rs
deleted file mode 100644
index 68653f4..0000000
--- a/src/legacy/transition.rs
+++ /dev/null
@@ -1,287 +0,0 @@
-// Scriptable
-use super::{Animatable, Interval, Timeline};
-use glib::{
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-// TODO: @implements Scriptable
-glib_wrapper! {
-    pub struct Transition(Object<ffi::ClutterTransition, ffi::ClutterTransitionClass, TransitionClass>) @extends Timeline;
-
-    match fn {
-        get_type => || ffi::clutter_transition_get_type(),
-    }
-}
-
-/// Trait containing all `Transition` methods.
-///
-/// # Implementors
-///
-/// [`PropertyTransition`](struct.PropertyTransition.html), [`TransitionGroup`](struct.TransitionGroup.html), [`Transition`](struct.Transition.html)
-pub trait TransitionExt: 'static {
-    /// Retrieves the `Animatable` set using `TransitionExt::set_animatable`.
-    ///
-    /// # Returns
-    ///
-    /// a `Animatable`, or `None`; the returned
-    ///  animatable is owned by the `Transition`, and it should not be freed
-    ///  directly.
-    fn get_animatable(&self) -> Option<Animatable>;
-
-    /// Retrieves the interval set using `TransitionExt::set_interval`
-    ///
-    /// # Returns
-    ///
-    /// a `Interval`, or `None`; the returned
-    ///  interval is owned by the `Transition` and it should not be freed
-    ///  directly
-    fn get_interval(&self) -> Option<Interval>;
-
-    /// Retrieves the value of the `Transition:remove-on-complete` property.
-    ///
-    /// # Returns
-    ///
-    /// `true` if the `self` should be detached when complete,
-    ///  and `false` otherwise
-    fn get_remove_on_complete(&self) -> bool;
-
-    /// Sets the `Transition:animatable` property.
-    ///
-    /// The `self` will acquire a reference to the `animatable` instance,
-    /// and will call the `TransitionClass.attached`() virtual function.
-    ///
-    /// If an existing `Animatable` is attached to `self`, the
-    /// reference will be released, and the `TransitionClass.detached`()
-    /// virtual function will be called.
-    /// ## `animatable`
-    /// a `Animatable`, or `None`
-    fn set_animatable<P: IsA<Animatable>>(&self, animatable: Option<&P>);
-
-    //fn set_from(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets the initial value of the transition.
-    ///
-    /// This is a convenience function that will either create the
-    /// `Interval` used by `self`, or will update it if
-    /// the `Transition:interval` is already set.
-    ///
-    /// This function will copy the contents of `value`, so it is
-    /// safe to call `gobject::Value::unset` after it returns.
-    ///
-    /// If `self` already has a `Transition:interval` set,
-    /// then `value` must hold the same type, or a transformable type,
-    /// as the interval's `Interval:value-type` property.
-    ///
-    /// This function is meant to be used by language bindings.
-    /// ## `value`
-    /// a `gobject::Value` with the initial value of the transition
-    fn set_from_value(&self, value: &glib::Value);
-
-    /// Sets the `Transition:interval` property using `interval`.
-    ///
-    /// The `self` will acquire a reference on the `interval`, sinking
-    /// the floating flag on it if necessary.
-    /// ## `interval`
-    /// a `Interval`, or `None`
-    fn set_interval<P: IsA<Interval>>(&self, interval: Option<&P>);
-
-    /// Sets whether `self` should be detached from the `Animatable`
-    /// set using `TransitionExt::set_animatable` when the
-    /// `Timeline::completed` signal is emitted.
-    /// ## `remove_complete`
-    /// whether to detach `self` when complete
-    fn set_remove_on_complete(&self, remove_complete: bool);
-
-    //fn set_to(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
-
-    /// Sets the final value of the transition.
-    ///
-    /// This is a convenience function that will either create the
-    /// `Interval` used by `self`, or will update it if
-    /// the `Transition:interval` is already set.
-    ///
-    /// This function will copy the contents of `value`, so it is
-    /// safe to call `gobject::Value::unset` after it returns.
-    ///
-    /// If `self` already has a `Transition:interval` set,
-    /// then `value` must hold the same type, or a transformable type,
-    /// as the interval's `Interval:value-type` property.
-    ///
-    /// This function is meant to be used by language bindings.
-    /// ## `value`
-    /// a `gobject::Value` with the final value of the transition
-    fn set_to_value(&self, value: &glib::Value);
-
-    fn connect_property_animatable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_interval_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-
-    fn connect_property_remove_on_complete_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-}
-
-impl<O: IsA<Transition>> TransitionExt for O {
-    fn get_animatable(&self) -> Option<Animatable> {
-        unsafe {
-            from_glib_none(ffi::clutter_transition_get_animatable(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_interval(&self) -> Option<Interval> {
-        unsafe {
-            from_glib_none(ffi::clutter_transition_get_interval(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn get_remove_on_complete(&self) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_transition_get_remove_on_complete(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_animatable<P: IsA<Animatable>>(&self, animatable: Option<&P>) {
-        unsafe {
-            ffi::clutter_transition_set_animatable(
-                self.as_ref().to_glib_none().0,
-                animatable.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    //fn set_from(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_transition_set_from() }
-    //}
-
-    fn set_from_value(&self, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_transition_set_from_value(
-                self.as_ref().to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_interval<P: IsA<Interval>>(&self, interval: Option<&P>) {
-        unsafe {
-            ffi::clutter_transition_set_interval(
-                self.as_ref().to_glib_none().0,
-                interval.map(|p| p.as_ref()).to_glib_none().0,
-            );
-        }
-    }
-
-    fn set_remove_on_complete(&self, remove_complete: bool) {
-        unsafe {
-            ffi::clutter_transition_set_remove_on_complete(
-                self.as_ref().to_glib_none().0,
-                remove_complete.to_glib(),
-            );
-        }
-    }
-
-    //fn set_to(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_transition_set_to() }
-    //}
-
-    fn set_to_value(&self, value: &glib::Value) {
-        unsafe {
-            ffi::clutter_transition_set_to_value(
-                self.as_ref().to_glib_none().0,
-                value.to_glib_none().0,
-            );
-        }
-    }
-
-    fn connect_property_animatable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_animatable_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTransition,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Transition>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Transition::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::animatable\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_animatable_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_interval_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_interval_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTransition,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Transition>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Transition::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::interval\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_interval_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_remove_on_complete_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn notify_remove_on_complete_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterTransition,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<Transition>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&Transition::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::remove-on-complete\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_remove_on_complete_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for Transition {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Transition")
-    }
-}
diff --git a/src/legacy/transition_group.rs b/src/legacy/transition_group.rs
deleted file mode 100644
index 70c5611..0000000
--- a/src/legacy/transition_group.rs
+++ /dev/null
@@ -1,96 +0,0 @@
-// Scriptable
-use super::{Timeline, Transition};
-use glib::{
-    object::{Cast, IsA},
-    translate::*,
-};
-use std::fmt;
-
-// TODO: @implements Scriptable
-glib_wrapper! {
-    pub struct TransitionGroup(Object<ffi::ClutterTransitionGroup, ffi::ClutterTransitionGroupClass, TransitionGroupClass>) @extends Transition, Timeline;
-
-    match fn {
-        get_type => || ffi::clutter_transition_group_get_type(),
-    }
-}
-
-impl TransitionGroup {
-    /// Creates a new `TransitionGroup` instance.
-    ///
-    /// # Returns
-    ///
-    /// the newly created `TransitionGroup`. Use
-    ///  `gobject::ObjectExt::unref` when done to deallocate the resources it
-    ///  uses
-    pub fn new() -> TransitionGroup {
-        unsafe { Transition::from_glib_full(ffi::clutter_transition_group_new()).unsafe_cast() }
-    }
-}
-
-impl Default for TransitionGroup {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `TransitionGroup` methods.
-///
-/// # Implementors
-///
-/// [`TransitionGroup`](struct.TransitionGroup.html)
-pub trait TransitionGroupExt: 'static {
-    /// Adds `transition` to `self`.
-    ///
-    /// This function acquires a reference on `transition` that will be released
-    /// when calling `TransitionGroupExt::remove_transition`.
-    /// ## `transition`
-    /// a `Transition`
-    fn add_transition<P: IsA<Transition>>(&self, transition: &P);
-
-    /// Removes all transitions from `self`.
-    ///
-    /// This function releases the reference acquired when calling
-    /// `TransitionGroupExt::add_transition`.
-    fn remove_all(&self);
-
-    /// Removes `transition` from `self`.
-    ///
-    /// This function releases the reference acquired on `transition` when
-    /// calling `TransitionGroupExt::add_transition`.
-    /// ## `transition`
-    /// a `Transition`
-    fn remove_transition<P: IsA<Transition>>(&self, transition: &P);
-}
-
-impl<O: IsA<TransitionGroup>> TransitionGroupExt for O {
-    fn add_transition<P: IsA<Transition>>(&self, transition: &P) {
-        unsafe {
-            ffi::clutter_transition_group_add_transition(
-                self.as_ref().to_glib_none().0,
-                transition.as_ref().to_glib_none().0,
-            );
-        }
-    }
-
-    fn remove_all(&self) {
-        unsafe {
-            ffi::clutter_transition_group_remove_all(self.as_ref().to_glib_none().0);
-        }
-    }
-
-    fn remove_transition<P: IsA<Transition>>(&self, transition: &P) {
-        unsafe {
-            ffi::clutter_transition_group_remove_transition(
-                self.as_ref().to_glib_none().0,
-                transition.as_ref().to_glib_none().0,
-            );
-        }
-    }
-}
-
-impl fmt::Display for TransitionGroup {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "TransitionGroup")
-    }
-}
diff --git a/src/legacy/units.rs b/src/legacy/units.rs
deleted file mode 100644
index d4382ca..0000000
--- a/src/legacy/units.rs
+++ /dev/null
@@ -1,220 +0,0 @@
-use super::UnitType;
-use glib::{translate::*, GString};
-use std::{fmt, mem};
-
-glib_wrapper! {
-    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
-    pub struct Units(Boxed<ffi::ClutterUnits>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_units_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_units_free(ptr),
-        get_type => || ffi::clutter_units_get_type(),
-    }
-}
-
-impl Units {
-    /// Retrieves the unit type of the value stored inside `self`
-    ///
-    /// # Returns
-    ///
-    /// a unit type
-    pub fn get_unit_type(&self) -> UnitType {
-        unsafe { from_glib(ffi::clutter_units_get_unit_type(self.to_glib_none().0)) }
-    }
-
-    /// Retrieves the value stored inside `self`
-    ///
-    /// # Returns
-    ///
-    /// the value stored inside a `Units`
-    pub fn get_unit_value(&self) -> f32 {
-        unsafe { ffi::clutter_units_get_unit_value(self.to_glib_none().0) }
-    }
-
-    /// Converts a value in `Units` to pixels
-    ///
-    /// # Returns
-    ///
-    /// the value in pixels
-    pub fn in_pixels(&mut self) -> f32 {
-        unsafe { ffi::clutter_units_to_pixels(self.to_glib_none_mut().0) }
-    }
-
-    /// Converts `self` into a string
-    ///
-    /// See `Units::from_string` for the units syntax and for
-    /// examples of output
-    ///
-    /// Fractional values are truncated to the second decimal
-    /// position for em, mm and cm, and to the first decimal position for
-    /// typographic points. Pixels are integers.
-    ///
-    /// # Returns
-    ///
-    /// a newly allocated string containing the encoded
-    ///  `Units` value. Use `g_free` to free the string
-    fn to_string(&self) -> GString {
-        unsafe { from_glib_full(ffi::clutter_units_to_string(self.to_glib_none().0)) }
-    }
-
-    /// Stores a value in centimeters inside `units`
-    /// ## `units`
-    /// a `Units`
-    /// ## `cm`
-    /// centimeters
-    pub fn from_cm(cm: f32) -> Units {
-        unsafe {
-            let mut units = Units::uninitialized();
-            ffi::clutter_units_from_cm(units.to_glib_none_mut().0, cm);
-            units
-        }
-    }
-
-    /// Stores a value in em inside `units`, using the default font
-    /// name as returned by `Backend::get_font_name`
-    /// ## `units`
-    /// a `Units`
-    /// ## `em`
-    /// em
-    pub fn from_em(em: f32) -> Units {
-        unsafe {
-            let mut units = Units::uninitialized();
-            ffi::clutter_units_from_em(units.to_glib_none_mut().0, em);
-            units
-        }
-    }
-
-    /// Stores a value in em inside `units` using `font_name`
-    /// ## `units`
-    /// a `Units`
-    /// ## `font_name`
-    /// the font name and size
-    /// ## `em`
-    /// em
-    pub fn from_em_for_font(font_name: Option<&str>, em: f32) -> Units {
-        unsafe {
-            let mut units = Units::uninitialized();
-            ffi::clutter_units_from_em_for_font(
-                units.to_glib_none_mut().0,
-                font_name.to_glib_none().0,
-                em,
-            );
-            units
-        }
-    }
-
-    /// Stores a value in millimiters inside `units`
-    /// ## `units`
-    /// a `Units`
-    /// ## `mm`
-    /// millimeters
-    pub fn from_mm(mm: f32) -> Units {
-        unsafe {
-            let mut units = Units::uninitialized();
-            ffi::clutter_units_from_mm(units.to_glib_none_mut().0, mm);
-            units
-        }
-    }
-
-    /// Stores a value in pixels inside `units`
-    /// ## `units`
-    /// a `Units`
-    /// ## `px`
-    /// pixels
-    pub fn from_pixels(px: i32) -> Units {
-        unsafe {
-            let mut units = Units::uninitialized();
-            ffi::clutter_units_from_pixels(units.to_glib_none_mut().0, px);
-            units
-        }
-    }
-
-    /// Stores a value in typographic points inside `units`
-    /// ## `units`
-    /// a `Units`
-    /// ## `pt`
-    /// typographic points
-    pub fn from_pt(pt: f32) -> Units {
-        unsafe {
-            let mut units = Units::uninitialized();
-            ffi::clutter_units_from_pt(units.to_glib_none_mut().0, pt);
-            units
-        }
-    }
-
-    /// Parses a value and updates `units` with it
-    ///
-    /// A `Units` expressed in string should match:
-    ///
-    ///
-    /// ```text
-    ///   units: wsp* unit-value wsp* unit-name? wsp*
-    ///   unit-value: number
-    ///   unit-name: 'px' | 'pt' | 'mm' | 'em' | 'cm'
-    ///   number: digit+
-    ///           | digit* sep digit+
-    ///   sep: '.' | ','
-    ///   digit: '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
-    ///   wsp: (#0x20 | #0x9 | #0xA | #0xB | #0xC | #0xD)+
-    /// ```
-    ///
-    /// For instance, these are valid strings:
-    ///
-    ///
-    /// ```text
-    ///   10 px
-    ///   5.1 em
-    ///   24 pt
-    ///   12.6 mm
-    ///   .3 cm
-    /// ```
-    ///
-    /// While these are not:
-    ///
-    ///
-    /// ```text
-    ///   42 cats
-    ///   omg!1!ponies
-    /// ```
-    ///
-    /// If no unit is specified, pixels are assumed.
-    /// ## `units`
-    /// a `Units`
-    /// ## `str`
-    /// the string to convert
-    ///
-    /// # Returns
-    ///
-    /// `true` if the string was successfully parsed,
-    ///  and `false` otherwise
-    pub fn from_string(str: &str) -> Option<Units> {
-        unsafe {
-            let mut units = Units::uninitialized();
-            let ret = from_glib(ffi::clutter_units_from_string(
-                units.to_glib_none_mut().0,
-                str.to_glib_none().0,
-            ));
-            if ret {
-                Some(units)
-            } else {
-                None
-            }
-        }
-    }
-}
-
-#[doc(hidden)]
-impl Uninitialized for Units {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        mem::zeroed()
-    }
-}
-
-impl fmt::Display for Units {
-    #[inline]
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.to_string())
-    }
-}
diff --git a/src/legacy/vertex.rs b/src/legacy/vertex.rs
deleted file mode 100644
index 2ba08ed..0000000
--- a/src/legacy/vertex.rs
+++ /dev/null
@@ -1,97 +0,0 @@
-use glib::translate::*;
-// use std::mem;
-
-glib_wrapper! {
-    #[derive(Debug, PartialOrd, Ord)] // Hash
-    pub struct Vertex(Boxed<ffi::ClutterVertex>);
-
-    match fn {
-        copy => |ptr| ffi::clutter_vertex_copy(mut_override(ptr)),
-        free => |ptr| ffi::clutter_vertex_free(ptr),
-        get_type => || ffi::clutter_vertex_get_type(),
-    }
-}
-
-impl Vertex {
-    /// Allocates a new, empty `Vertex`.
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `Vertex`.
-    ///  Use `Vertex::free` to free its resources
-    pub fn alloc() -> Vertex {
-        unsafe { from_glib_full(ffi::clutter_vertex_alloc()) }
-    }
-
-    /// Creates a new `Vertex` for the point in 3D space
-    /// identified by the 3 coordinates `x`, `y`, `z`.
-    ///
-    /// This function is the logical equivalent of:
-    ///
-    ///
-    /// ```text
-    ///   vertex_init (vertex_alloc (), x, y, z);
-    /// ```
-    /// ## `x`
-    /// X coordinate
-    /// ## `y`
-    /// Y coordinate
-    /// ## `z`
-    /// Z coordinate
-    ///
-    /// # Returns
-    ///
-    /// the newly allocated `Vertex`.
-    ///  Use `Vertex::free` to free the resources
-    pub fn new(x: f32, y: f32, z: f32) -> Vertex {
-        unsafe { from_glib_full(ffi::clutter_vertex_new(x, y, z)) }
-    }
-
-    /// Compares `self` and `vertex_b` for equality
-    /// ## `vertex_b`
-    /// a `Vertex`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the passed `Vertex` are equal
-    fn equal(&self, vertex_b: &Vertex) -> bool {
-        unsafe {
-            from_glib(ffi::clutter_vertex_equal(
-                self.to_glib_none().0,
-                vertex_b.to_glib_none().0,
-            ))
-        }
-    }
-
-    /// Initializes `self` with the given coordinates.
-    /// ## `x`
-    /// X coordinate
-    /// ## `y`
-    /// Y coordinate
-    /// ## `z`
-    /// Z coordinate
-    ///
-    /// # Returns
-    ///
-    /// the initialized `Vertex`
-    pub fn init(&mut self, x: f32, y: f32, z: f32) -> Option<Vertex> {
-        unsafe { from_glib_none(ffi::clutter_vertex_init(self.to_glib_none_mut().0, x, y, z)) }
-    }
-}
-
-impl PartialEq for Vertex {
-    #[inline]
-    fn eq(&self, other: &Self) -> bool {
-        self.equal(other)
-    }
-}
-
-impl Eq for Vertex {}
-
-#[doc(hidden)]
-impl Uninitialized for Vertex {
-    #[inline]
-    unsafe fn uninitialized() -> Self {
-        Self::alloc()
-    }
-}
diff --git a/src/legacy/zoom_action.rs b/src/legacy/zoom_action.rs
deleted file mode 100644
index 896e4d4..0000000
--- a/src/legacy/zoom_action.rs
+++ /dev/null
@@ -1,197 +0,0 @@
-use super::{Action, Actor, ActorMeta, GestureAction, InternalPoint, ZoomAxis};
-use glib::{
-    object as gobject,
-    object::{Cast, IsA},
-    signal::{connect_raw, SignalHandlerId},
-    translate::*,
-};
-use std::boxed::Box as Box_;
-use std::{fmt, mem::transmute};
-
-glib_wrapper! {
-    pub struct ZoomAction(Object<ffi::ClutterZoomAction, ffi::ClutterZoomActionClass, ZoomActionClass>) @extends GestureAction, Action, ActorMeta, gobject::InitiallyUnowned;
-
-    match fn {
-        get_type => || ffi::clutter_zoom_action_get_type(),
-    }
-}
-
-impl ZoomAction {
-    /// Creates a new `ZoomAction` instance
-    ///
-    /// # Returns
-    ///
-    /// the newly created `ZoomAction`
-    pub fn new() -> ZoomAction {
-        unsafe { Action::from_glib_none(ffi::clutter_zoom_action_new()).unsafe_cast() }
-    }
-}
-
-impl Default for ZoomAction {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-/// Trait containing all `ZoomAction` methods.
-///
-/// # Implementors
-///
-/// [`ZoomAction`](struct.ZoomAction.html)
-pub trait ZoomActionExt: 'static {
-    /// Retrieves the focal point of the current zoom
-    /// ## `point`
-    /// a `Point`
-    fn get_focal_point(&self) -> InternalPoint;
-
-    /// Retrieves the focal point relative to the actor's coordinates of
-    /// the current zoom
-    /// ## `point`
-    /// a `Point`
-    fn get_transformed_focal_point(&self) -> InternalPoint;
-
-    /// Retrieves the axis constraint set by `ZoomActionExt::set_zoom_axis`
-    ///
-    /// # Returns
-    ///
-    /// the axis constraint
-    fn get_zoom_axis(&self) -> ZoomAxis;
-
-    /// Restricts the zooming action to a specific axis
-    /// ## `axis`
-    /// the axis to constraint the zooming to
-    fn set_zoom_axis(&self, axis: ZoomAxis);
-
-    /// The ::zoom signal is emitted for each series of touch events that
-    /// change the distance and focal point between the touch points.
-    ///
-    /// The default handler of the signal will call
-    /// `ActorExt::set_scale` on `actor` using the ratio of the first
-    /// distance between the touch points and the current distance. To
-    /// override the default behaviour, connect to this signal and return
-    /// `false`.
-    /// ## `actor`
-    /// the `Actor` attached to the action
-    /// ## `focal_point`
-    /// the focal point of the zoom
-    /// ## `factor`
-    /// the initial distance between the 2 touch points
-    ///
-    /// # Returns
-    ///
-    /// `true` if the zoom should continue, and `false` if
-    ///  the zoom should be cancelled.
-    fn connect_zoom<F: Fn(&Self, &Actor, &InternalPoint, f64) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId;
-
-    fn connect_property_zoom_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
-}
-
-impl<O: IsA<ZoomAction>> ZoomActionExt for O {
-    fn get_focal_point(&self) -> InternalPoint {
-        unsafe {
-            let mut point = InternalPoint::uninitialized();
-            ffi::clutter_zoom_action_get_focal_point(
-                self.as_ref().to_glib_none().0,
-                point.to_glib_none_mut().0,
-            );
-            point
-        }
-    }
-
-    fn get_transformed_focal_point(&self) -> InternalPoint {
-        unsafe {
-            let mut point = InternalPoint::uninitialized();
-            ffi::clutter_zoom_action_get_transformed_focal_point(
-                self.as_ref().to_glib_none().0,
-                point.to_glib_none_mut().0,
-            );
-            point
-        }
-    }
-
-    fn get_zoom_axis(&self) -> ZoomAxis {
-        unsafe {
-            from_glib(ffi::clutter_zoom_action_get_zoom_axis(
-                self.as_ref().to_glib_none().0,
-            ))
-        }
-    }
-
-    fn set_zoom_axis(&self, axis: ZoomAxis) {
-        unsafe {
-            ffi::clutter_zoom_action_set_zoom_axis(self.as_ref().to_glib_none().0, axis.to_glib());
-        }
-    }
-
-    fn connect_zoom<F: Fn(&Self, &Actor, &InternalPoint, f64) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> SignalHandlerId {
-        unsafe extern "C" fn zoom_trampoline<
-            P,
-            F: Fn(&P, &Actor, &InternalPoint, f64) -> bool + 'static,
-        >(
-            this: *mut ffi::ClutterZoomAction,
-            actor: *mut ffi::ClutterActor,
-            focal_point: *mut ffi::ClutterPoint,
-            factor: libc::c_double,
-            f: glib_sys::gpointer,
-        ) -> glib_sys::gboolean
-        where
-            P: IsA<ZoomAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(
-                &ZoomAction::from_glib_borrow(this).unsafe_cast_ref(),
-                &from_glib_borrow(actor),
-                &from_glib_borrow(focal_point),
-                factor,
-            )
-            .to_glib()
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"zoom\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    zoom_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-
-    fn connect_property_zoom_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
-        unsafe extern "C" fn notify_zoom_axis_trampoline<P, F: Fn(&P) + 'static>(
-            this: *mut ffi::ClutterZoomAction,
-            _param_spec: glib_sys::gpointer,
-            f: glib_sys::gpointer,
-        ) where
-            P: IsA<ZoomAction>,
-        {
-            let f: &F = &*(f as *const F);
-            f(&ZoomAction::from_glib_borrow(this).unsafe_cast_ref())
-        }
-        unsafe {
-            let f: Box_<F> = Box_::new(f);
-            connect_raw(
-                self.as_ptr() as *mut _,
-                b"notify::zoom-axis\0".as_ptr() as *const _,
-                Some(transmute::<_, unsafe extern "C" fn()>(
-                    notify_zoom_axis_trampoline::<Self, F> as *const (),
-                )),
-                Box_::into_raw(f),
-            )
-        }
-    }
-}
-
-impl fmt::Display for ZoomAction {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ZoomAction")
-    }
-}
diff --git a/src/lib.rs b/src/lib.rs
index deead11..6b86b02 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,10 @@
 #![allow(deprecated)]
+#![allow(unused_imports)]
 #![cfg_attr(feature = "cargo-clippy", allow(clippy::cast_ptr_alignment))]
 #![cfg_attr(feature = "cargo-clippy", allow(clippy::trivially_copy_pass_by_ref))]
 
+#![doc(html_logo_url = "https://dudochkin-victor.github.io/assets/ux-animate/logo.svg")]
+
 #[macro_use]
 extern crate log;
 
@@ -25,9 +28,9 @@ pub mod path;
 
 pub mod interpolate;
 
-#[cfg(not(target_arch = "wasm32"))]
-#[macro_use]
-extern crate glib;
+// #[cfg(not(target_arch = "wasm32"))]
+// #[macro_use]
+// extern crate glib;
 
 #[cfg(not(target_arch = "wasm32"))]
 #[macro_use]
@@ -37,15 +40,6 @@ extern crate bitflags;
 #[macro_use]
 mod rt;
 
-#[cfg(not(target_arch = "wasm32"))]
-#[macro_use]
-mod macros;
-
-#[cfg(not(target_arch = "wasm32"))]
-#[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
-#[cfg_attr(feature = "cargo-clippy", allow(clippy::unreadable_literal))]
-mod legacy;
-
 #[cfg(not(target_arch = "wasm32"))]
 #[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
 #[cfg_attr(feature = "cargo-clippy", allow(clippy::unreadable_literal))]
@@ -55,12 +49,12 @@ mod pure;
 pub mod prelude;
 
 #[cfg(not(target_arch = "wasm32"))]
-pub use legacy::*;
+pub use pure::*;
 
 #[cfg(not(target_arch = "wasm32"))]
 pub use self::rt::{init, quit, run, set_initialized};
 
-pub use primitives::colorspace::{Color, RgbColor, RgbaColor};
+// pub use primitives::foundation::colorspace::{Color, RgbColor, RgbaColor};
 pub use primitives::*;
 
 #[cfg(test)]
diff --git a/src/macros.rs b/src/macros.rs
deleted file mode 100644
index b77afae..0000000
--- a/src/macros.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-// use glib::translate::*;
-// use libc::c_void;
-// use std::{fmt, mem, ptr};
-
-macro_rules! event_wrapper {
-    ($name:ident, $ffi_name:ident) => {
-        impl<'a> ToGlibPtr<'a, *const ::ffi::$ffi_name> for $name {
-            type Storage = &'a Self;
-
-            #[inline]
-            fn to_glib_none(&'a self) -> Stash<'a, *const ::ffi::$ffi_name, Self> {
-                let ptr = ToGlibPtr::<*const ::ffi::ClutterEvent>::to_glib_none(&self.0).0;
-                Stash(ptr as *const ::ffi::$ffi_name, self)
-            }
-        }
-
-        impl<'a> ToGlibPtrMut<'a, *mut ::ffi::$ffi_name> for $name {
-            type Storage = &'a mut Self;
-
-            #[inline]
-            fn to_glib_none_mut(&'a mut self) -> StashMut<'a, *mut ::ffi::$ffi_name, Self> {
-                let ptr = ToGlibPtrMut::<*mut ::ffi::ClutterEvent>::to_glib_none_mut(&mut self.0).0;
-                StashMut(ptr as *mut ::ffi::$ffi_name, self)
-            }
-        }
-
-        impl FromGlibPtrNone<*mut ::ffi::$ffi_name> for $name {
-            #[inline]
-            unsafe fn from_glib_none(ptr: *mut ::ffi::$ffi_name) -> Self {
-                $name(from_glib_none(ptr as *mut ::ffi::ClutterEvent))
-            }
-        }
-
-        impl FromGlibPtrBorrow<*mut ::ffi::$ffi_name> for $name {
-            #[inline]
-            unsafe fn from_glib_borrow(
-                ptr: *mut ::ffi::$ffi_name,
-            ) -> glib::translate::Borrowed<Self> {
-                glib::translate::Borrowed::new(
-                    <$name as crate::FromEvent>::from(
-                        crate::Event::from_glib_borrow(ptr as *mut ::ffi::ClutterEvent)
-                            .into_inner(),
-                    )
-                    .map_err(std::mem::forget)
-                    .unwrap(),
-                )
-            }
-        }
-
-        impl FromGlibPtrFull<*mut ::ffi::$ffi_name> for $name {
-            #[inline]
-            unsafe fn from_glib_full(ptr: *mut ::ffi::$ffi_name) -> Self {
-                $name(from_glib_full(ptr as *mut ::ffi::ClutterEvent))
-            }
-        }
-
-        impl AsRef<::ffi::$ffi_name> for $name {
-            #[inline]
-            fn as_ref(&self) -> &::ffi::$ffi_name {
-                unsafe {
-                    let ptr: *const ::ffi::$ffi_name = self.to_glib_none().0;
-                    &*ptr
-                }
-            }
-        }
-
-        impl AsMut<::ffi::$ffi_name> for $name {
-            #[inline]
-            fn as_mut(&mut self) -> &mut ::ffi::$ffi_name {
-                unsafe {
-                    let ptr: *mut ::ffi::$ffi_name = self.to_glib_none_mut().0;
-                    &mut *ptr
-                }
-            }
-        }
-    };
-}
-
-macro_rules! event_subtype {
-    ($name:ident, $($ty:path)|+) => {
-        impl crate::FromEvent for $name {
-            #[inline]
-            fn is(ev: &crate::Event) -> bool {
-                skip_assert_initialized!();
-                match ev.as_ref().type_ {
-                    $($ty)|+ => true,
-                    _ => false,
-                }
-            }
-
-            #[inline]
-            fn from(ev: crate::Event) -> Result<Self, crate::Event> {
-                skip_assert_initialized!();
-                if Self::is(&ev) {
-                    Ok($name(ev))
-                }
-                else {
-                    Err(ev)
-                }
-            }
-        }
-
-        impl ::std::ops::Deref for $name {
-            type Target = crate::Event;
-
-            fn deref(&self) -> &crate::Event {
-                &self.0
-            }
-        }
-
-        impl ::std::ops::DerefMut for $name {
-            fn deref_mut(&mut self) -> &mut crate::Event {
-                &mut self.0
-            }
-        }
-    }
-}
diff --git a/src/path/options.rs b/src/path/options.rs
index 88babf5..0b85fa6 100644
--- a/src/path/options.rs
+++ b/src/path/options.rs
@@ -51,7 +51,7 @@ pub struct WriteOptions {
     /// Elliptical arc curve segment has flags parameters, which can have values of `0` or `1`.
     /// Since we have fixed-width values, we can skip spaces between them.
     ///
-    /// **Note:** Sadly, but most of the viewers doesn't support such notation,
+    ///*Note:** Sadly, but most of the viewers doesn't support such notation,
     /// even though it's valid according to the SVG spec.
     ///
     /// # Examples
diff --git a/src/prelude.rs b/src/prelude.rs
index 84db71e..1954ecb 100644
--- a/src/prelude.rs
+++ b/src/prelude.rs
@@ -1,11 +1,5 @@
-#[doc(hidden)]
-pub use gio::prelude::*;
-
-#[doc(hidden)]
-pub use glib::prelude::*;
-
-#[doc(hidden)]
-pub use pango::prelude::*;
+// #[doc(hidden)]
+// pub use pango::prelude::*;
 
 pub use primitives::prelude::*;
 pub use ruex::prelude::*;
@@ -14,4 +8,6 @@ pub use crate::lottie::LottieBuilderExt;
 pub use crate::AdvancedShapesExt;
 
 #[cfg(not(target_arch = "wasm32"))]
-pub use crate::legacy::traits::*;
+pub use crate::pure::traits::*;
+
+pub use dx::prelude::*;
diff --git a/src/pure/action.rs b/src/pure/action.rs
index c5ee359..5f839a9 100644
--- a/src/pure/action.rs
+++ b/src/pure/action.rs
@@ -2,11 +2,11 @@ use crate::prelude::*;
 use super::ActorMeta;
 use std::fmt;
 
-// * Action:
-// *
-// * The #Action structure contains only private data and
-// * should be accessed using the provided API.
-// *
+// Action:
+//
+// The #Action structure contains only private data and
+// should be accessed using the provided API.
+//
 
 // It should be Trait
 #[derive(Default, Debug, Clone)]
diff --git a/src/pure/actor.rs b/src/pure/actor.rs
index 825d548..c32e116 100644
--- a/src/pure/actor.rs
+++ b/src/pure/actor.rs
@@ -1,3 +1,13 @@
+use std::{
+    cell::RefCell,
+    fmt,
+    rc::{Rc, Weak},
+};
+
+use crate::prelude::*;
+
+use crate::foundation::{colorspace::Color, Rect};
+
 use super::{
     Action, ActorAlign, ActorBox, ActorFlags, AllocationFlags, AnimationMode, ButtonEvent,
     Constraint, Content, ContentGravity, ContentRepeat, CrossingEvent, Effect, Event, HandlerId,
@@ -5,13 +15,757 @@ use super::{
     PaintVolume, RequestMode, RotateAxis, ScalingFilter, ScrollEvent, Stage, TextDirection,
     Transition, Vertex,
 };
-use crate::prelude::*;
-use crate::{Color, Rect};
-use std::fmt;
 
+// @short_description: The basic element of the scene graph
+//
+// The Actor class is the basic element of the scene graph,
+// and it encapsulates the position, size, and transformations of a node in
+// the graph.
+//
+// ## Actor transformations
+//
+// Each actor can be transformed using methods like set_scale()
+// or set_rotation(). The order in which the transformations are
+// applied is decided by  and it is the following:
+//
+//  1. translation by the origin of the #:allocation property
+//  2. translation by the actor's #:z-position property
+//  3. translation by the actor's #:pivot-point property
+//  4. scaling by the #:scale-x and #:scale-y factors
+//  5. rotation around the #:rotation-angle-x and #:rotation-center-x
+//  6. rotation around the #:rotation-angle-y and #:rotation-center-y
+//  7. rotation around the #:rotation-angle-z and #:rotation-center-z
+//  8. negative translation by the #:anchor-x and #:anchor-y point.
+//  9. negative translation by the actor's #:pivot-point
+//
+// ## Modifying an actor's geometry ## {#actor-geometry}
+//
+// Each actor has a bounding box, called #:allocation
+// which is either set by its parent or explicitly through the
+// set_position() and set_size() methods.
+// Each actor also has an implicit preferred size.
+//
+// An actor’s preferred size can be defined by any subclass by
+// overriding the #get_preferred_width() and the
+// #get_preferred_height() virtual functions, or it can
+// be explicitly set by using set_width() and
+// set_height().
+//
+// An actor’s position can be set explicitly by using
+// set_x() and set_y(); the coordinates are
+// relative to the origin of the actor’s parent.
+//
+// ## Managing actor children ## {#actor-children}
+//
+// Each actor can have multiple children, by calling
+// add_child() to add a new child actor, and
+// remove_child() to remove an existing child. #Actor
+// will hold a reference on each child actor, which will be released when
+// the child is removed from its parent, or destroyed using
+// destroy().
+//
+// ```
+//  let actor = Actor::new();
+//
+//  // set the bounding box of the actor
+//  actor.set_position (0, 0);
+//  actor.set_size (480, 640);
+//
+//  // set the background color of the actor
+//  actor.set_background_color (color::ORANGE_5);
+//
+//  // set the bounding box of the child, relative to the parent
+//  let child = Actor::new ();
+//  child.set_position (20, 20);
+//  child.set_size (80, 240);
+//
+//  // set the background color of the child
+//  child.set_background_color(color::BLUE_5);
+//
+//  // add the child to the actor
+//  actor.add_child(child);
+// ```
+//
+// Children can be inserted at a given index, or above and below
+// another child actor. The order of insertion determines the order of the
+// children when iterating over them. Iterating over children is performed
+// by using get_first_child(), get_previous_sibling(),
+// get_next_sibling(), and get_last_child(). It is
+// also possible to retrieve a list of children by using
+// get_children(), as well as retrieving a specific child at a
+// given index by using get_child_at_index().
+//
+// If you need to track additions of children to a #Actor, use
+// the #Container::actor-added signal; similarly, to track removals
+// of children from a Actor, use the #Container::actor-removed
+// signal
+//
+// ## Painting an actor ## {#actor-painting}
+//
+// There are three ways to paint an actor:
+//
+//  - set a delegate #Content as the value for the #Actor:content property of the actor
+//  - subclass #Actor and override the #.paint_node() virtual function
+//  - subclass #Actor and override the #.paint() virtual function.
+//
+// A #Content is a delegate object that takes over the painting
+// operations of one, or more actors. The #Content painting will
+// be performed on top of the #Actor:background-color of the actor,
+// and before calling the actor's own implementation of the
+// #.paint_node() virtual function.
+//
+// ```
+// let actor = Actor::new();
+//
+// // set the bounding box
+// actor.set_position(50, 50);
+// actor.set_size(100, 100);
+//
+// // set the content; the image_content variable is set elsewhere
+// actor.set_content(image_content);
+// ```
+//
+// The #.paint_node() virtual function is invoked whenever
+// an actor needs to be painted. The implementation of the virtual function
+// must only paint the contents of the actor itself, and not the contents of
+// its children, if the actor has any.
+//
+// The #PaintNode passed to the virtual function is the local root of
+// the render tree; any node added to it will be rendered at the correct
+// position, as defined by the actor's #Actor:allocation.
+//
+// ```
+// static void
+// my_actor_paint_node (Actor     *actor,
+//                      PaintNode *root)
+// {
+//   PaintNode *node;
+//   ActorBox box;
+//
+//   // where the content of the actor should be painted
+//   actor.get_allocation_box(&box);
+//
+//   // the cogl_texture variable is set elsewhere
+//   node = texture_node_new (cogl_texture, COLOR_White,
+//                                    SCALING_FILTER_TRILINEAR,
+//                                    SCALING_FILTER_LINEAR);
+//
+//   // paint the content of the node using the allocation
+//   paint_node_add_rectangle (node, &box);
+//
+//   // add the node, and transfer ownership
+//   paint_node_add_child (root, node);
+//   paint_node_unref (node);
+// }
+// ```
+// The #.paint() virtual function is invoked when the
+// #Actor::paint signal is emitted, and after the other signal
+// handlers have been invoked. Overriding the paint virtual function
+// gives total control to the paint sequence of the actor itself,
+// including the children of the actor, if any.
+//
+// It is strongly discouraged to override the #.paint()
+// virtual function, as well as connecting to the #Actor::paint
+// signal. These hooks into the paint sequence are considered legacy, and
+// will be removed when the  API changes.
+//
+// ## Handling events on an actor ## {#actor-event-handling}
+//
+// A #Actor can receive and handle input device events, for
+// instance pointer events and key events, as long as its
+// #Actor:reactive property is set to %TRUE.
+//
+// Once an actor has been determined to be the source of an event,
+//  will traverse the scene graph from the top-level actor towards the
+// event source, emitting the #Actor::captured-event signal on each
+// ancestor until it reaches the source; this phase is also called
+// the "capture" phase. If the event propagation was not stopped, the graph
+// is walked backwards, from the source actor to the top-level, and the
+// #Actor::event signal is emitted, alongside eventual event-specific
+// signals like #Actor::button-press-event or #Actor::motion-event;
+// this phase is also called the "bubble" phase.
+//
+// At any point of the signal emission, signal handlers can stop the propagation
+// through the scene graph by returning %EVENT_STOP; otherwise, they can
+// continue the propagation by returning %EVENT_PROPAGATE.
+//
+// ## Animation ## {#actor-animation}
+//
+// Animation is a core concept of modern user interfaces;  provides a
+// complete and powerful animation framework that automatically tweens the
+// actor's state without requiring direct, frame by frame manipulation from
+// your application code. You have two models at your disposal:
+//
+//  - an implicit animation model
+//  - an explicit animation model
+//
+// The implicit animation model of  assumes that all the
+// changes in an actor state should be gradual and asynchronous;
+// will automatically transition an actor's property change between the
+// current state and the desired one without manual intervention, if the
+// property is defined to be animatable in its documentation.
+//
+// By default, in the 1.0 API series, the transition happens with a duration
+// of zero milliseconds, and the implicit animation is an opt in feature to
+// retain backwards compatibility.
+//
+// Implicit animations depend on the current easing state; in order to use
+// the default easing state for an actor you should call the
+// actor_save_easing_state() function:
+//
+// ```
+// // assume that the actor is currently positioned at (100, 100)
+//
+// // store the current easing state and reset the new easing state to
+// // its default values
+// actor_save_easing_state (actor);
+//
+// // change the actor's position
+// actor_set_position (actor, 500, 500);
+//
+// // restore the previously saved easing state
+// actor_restore_easing_state (actor);
+// ```
+//
+// The example above will trigger an implicit animation of the
+// actor between its current position to a new position.
+//
+// Implicit animations use a default duration of 250 milliseconds,
+// and a default easing mode of %EASE_OUT_CUBIC, unless you call
+// actor_set_easing_mode() and actor_set_easing_duration()
+// after changing the easing state of the actor.
+//
+// It is possible to animate multiple properties of an actor
+// at the same time, and you can animate multiple actors at the same
+// time as well, for instance:
+//
+// ```
+// actor_save_easing_state (actor);
+//
+// // animate the actor's opacity and depth
+// actor_set_opacity (actor, 0);
+// actor_set_depth (actor, -100);
+//
+// actor_restore_easing_state (actor);
+//
+// actor_save_easing_state (another_actor);
+//
+// // animate another actor's opacity
+// actor_set_opacity (another_actor, 255);
+// actor_set_depth (another_actor, 100);
+//
+// actor_restore_easing_state (another_actor);
+// ```
+//
+// Changing the easing state will affect all the following property
+// transitions, but will not affect existing transitions.
+//
+// It is important to note that if you modify the state on an
+// animatable property while a transition is in flight, the transition's
+// final value will be updated, as well as its duration and progress
+// mode by using the current easing state; for instance, in the following
+// example:
+//
+// ```
+// actor_save_easing_state (actor);
+// actor_set_easing_duration (actor, 1000);
+// actor_set_x (actor, 200);
+// actor_restore_easing_state (actor);
+//
+// actor_save_easing_state (actor);
+// actor_set_easing_duration (actor, 500);
+// actor_set_x (actor, 100);
+// actor_restore_easing_state (actor);
+// ```
+//
+// the first call to actor_set_x() will begin a transition
+// of the #Actor:x property from the current value to the value of
+// 200 over a duration of one second; the second call to actor_set_x()
+// will change the transition's final value to 100 and the duration to 500
+// milliseconds.
+//
+// It is possible to receive a notification of the completion of an
+// implicit transition by using the #Actor::transition-stopped
+// signal, decorated with the name of the property. In case you want to
+// know when all the currently in flight transitions are complete, use
+// the #Actor::transitions-completed signal instead.
+//
+// It is possible to retrieve the #Transition used by the
+// animatable properties by using actor_get_transition() and using
+// the property name as the transition name.
+//
+// The explicit animation model supported by  requires that
+// you create a #Transition object, and optionally set the initial
+// and final values. The transition will not start unless you add it to the
+// #Actor.
+//
+// ```
+// Transition *transition;
+//
+// transition = property_transition_new ("opacity");
+// timeline_set_duration (TIMELINE (transition), 3000);
+// timeline_set_repeat_count (TIMELINE (transition), 2);
+// timeline_set_auto_reverse (TIMELINE (transition), TRUE);
+// transition_set_from (transition, G_TYPE_UINT, 255);
+// transition_set_to (transition, G_TYPE_UINT, 0);
+//
+// actor_add_transition (actor, "animate-opacity", transition);
+// ```
+//
+// The example above will animate the #Actor:opacity property
+// of an actor between fully opaque and fully transparent, and back, over
+// a span of 3 seconds. The animation does not begin until it is added to
+// the actor.
+//
+// The explicit animation API applies to all #GObject properties,
+// as well as the custom properties defined through the #Animatable
+// interface, regardless of whether they are defined as implicitly
+// animatable or not.
+//
+// The explicit animation API should also be used when using custom
+// animatable properties for #Action, #Constraint, and
+// #Effect instances associated to an actor; see the section on
+// custom animatable properties below for an example.
+//
+// Finally, explicit animations are useful for creating animations
+// that run continuously, for instance:
+//
+// ```
+// // this animation will pulse the actor's opacity continuously
+// Transition *transition;
+// Interval *interval;
+//
+// transition = property_transition_new ("opacity");
+//
+// // we want to animate the opacity between 0 and 255
+// transition_set_from (transition, G_TYPE_UINT, 0);
+// transition_set_to (transition, G_TYPE_UINT, 255);
+//
+// // over a one second duration, running an infinite amount of times
+// timeline_set_duration (TIMELINE (transition), 1000);
+// timeline_set_repeat_count (TIMELINE (transition), -1);
+//
+// // we want to fade in and out, so we need to auto-reverse the transition
+// timeline_set_auto_reverse (TIMELINE (transition), TRUE);
+//
+// // and we want to use an easing function that eases both in and out
+// timeline_set_progress_mode (TIMELINE (transition),
+//                                     EASE_IN_OUT_CUBIC);
+//
+// // add the transition to the desired actor to start it
+// actor_add_transition (actor, "opacityAnimation", transition);
+// ```
+//
+// ## Implementing an actor ## {#actor-implementing}
+//
+// Careful consideration should be given when deciding to implement
+// a #Actor sub-class. It is generally recommended to implement a
+// sub-class of #Actor only for actors that should be used as leaf
+// nodes of a scene graph.
+//
+// If your actor should be painted in a custom way, you should
+// override the #Actor::paint signal class handler. You can either
+// opt to chain up to the parent class implementation or decide to fully
+// override the default paint implementation;  will set up the
+// transformations and clip regions prior to emitting the #Actor::paint
+// signal.
+//
+// By overriding the #.get_preferred_width() and
+// #.get_preferred_height() virtual functions it is
+// possible to change or provide the preferred size of an actor; similarly,
+// by overriding the #.allocate() virtual function it is
+// possible to control the layout of the children of an actor. Make sure to
+// always chain up to the parent implementation of the
+// #.allocate() virtual function.
+//
+// In general, it is strongly encouraged to use delegation and composition
+// instead of direct subclassing.
+//
+// ## Actor custom properties for Script ## {#actor-custom-script}
+//
+// #Actor defines a custom "rotation" property which allows a short-hand
+// description of the rotations to be applied to an actor.
+//
+// The syntax of the "rotation" property is the following:
+//
+// ```
+// "rotation" : [ { "<axis>" : [ <angle>, [ <center-point> ] ] } ]
+// ```
+//
+// where:
+//
+//  - axis is the name of an enumeration value of type #RotateAxis
+//  - angle is a floating point value representing the rotation angle on the given axis in degrees
+//  - center-point is an optional array, and if present it must contain the center of rotation as described by two coordinates:
+//    - Y and Z for "x-axis"
+//    - X and Z for "y-axis"
+//    - X and Y for "z-axis".
+//
+// #Actor also defines a scriptable "margin" property which follows the CSS "margin" shorthand.
+//
+// ```
+//   // 4 values
+//   "margin" : [ top, right, bottom, left ]
+//   // 3 values
+//   "margin" : [ top, left/right, bottom ]
+//   // 2 values
+//   "margin" : [ top/bottom, left/right ]
+//   // 1 value
+//   "margin" : [ top/right/bottom/left ]
+// ```
+//
+// #Actor will also parse every positional and dimensional
+// property defined as a string through units_from_string(); you
+// should read the documentation for the #Units parser format for
+// the valid units and syntax.
+//
+// ## Custom animatable properties
+//
+// #Actor allows accessing properties of #Action,
+// #Effect, and #Constraint instances associated to an actor
+// instance for animation purposes.
+//
+// In order to access a specific #Action or a #Constraint
+// property it is necessary to set the #ActorMeta:name property on the
+// given action or constraint.
+//
+// The property can be accessed using the following syntax:
+//
+// ```
+//   @<section>.<meta-name>.<property-name>
+// ```
+//
+//  - the initial `@` is mandatory
+//  - the `section` fragment can be one between "actions", "constraints" and "effects"
+//  - the `meta-name` fragment is the name of the action, effect, or constraint, as
+//    specified by the #ActorMeta:name property of #ActorMeta
+//  - the `property-name` fragment is the name of the action, effect, or constraint
+//    property to be animated.
+//
+// The example below animates a #BindConstraint applied to an actor
+// using an explicit transition. The `rect` actor has a binding constraint
+// on the `origin` actor, and in its initial state is overlapping the actor
+// to which is bound to.
+//
+// ```
+// constraint = bind_constraint_new (origin, BIND_X, 0.0);
+// actor_meta_set_name (ACTOR_META (constraint), "bind-x");
+// actor_add_constraint (rect, constraint);
+//
+// constraint = bind_constraint_new (origin, BIND_Y, 0.0);
+// actor_meta_set_name (ACTOR_META (constraint), "bind-y");
+// actor_add_constraint (rect, constraint);
+//
+// actor_set_reactive (origin, TRUE);
+//
+// g_signal_connect (origin, "button-press-event",
+//                   G_CALLBACK (on_button_press),
+//                   rect);
+// ```
+//
+// On button press, the rectangle "slides" from behind the actor to
+// which is bound to, using the #BindConstraint:offset property to
+// achieve the effect:
+//
+// ```
+// gboolean
+// on_button_press (Actor *origin,
+//                  Event *event,
+//                  Actor *rect)
+// {
+//   Transition *transition;
+//
+//   // the offset that we want to apply; this will make the actor
+//   // slide in from behind the origin and rest at the right of
+//   // the origin, plus a padding value
+//   float new_offset = actor_get_width (origin) + h_padding;
+//
+//   // the property we wish to animate; the "@constraints" section
+//   // tells  to check inside the constraints associated
+//   // with the actor; the "bind-x" section is the name of the
+//   // constraint; and the "offset" is the name of the property
+//   // on the constraint
+//   const char *prop = "@constraints.bind-x.offset";
+//
+//   // create a new transition for the given property
+//   transition = property_transition_new (prop);
+//
+//   // set the easing mode and duration
+//   timeline_set_progress_mode (TIMELINE (transition),
+//                                       EASE_OUT_CUBIC);
+//   timeline_set_duration (TIMELINE (transition), 500);
+//
+//   // create the interval with the initial and final values
+//   transition_set_from (transition, G_TYPE_FLOAT, 0.f);
+//   transition_set_to (transition, G_TYPE_FLOAT, new_offset);
+//
+//   // add the transition to the actor; this causes the animation
+//   // to start. the name "offsetAnimation" can be used to retrieve
+//   // the transition later
+//   actor_add_transition (rect, "offsetAnimation", transition);
+//
+//   // we handled the event
+//   return EVENT_STOP;
+// }
+// ```
+
+/* Internal enum used to control mapped state update.  This is a hint
+ * which indicates when to do something other than just enforce
+ * invariants.
+ */
+pub enum MapStateChange {
+    // just enforce invariants.
+    Check,
+    // force unrealize, ignoring invariants,
+    // used when about to unparent.
+    MakeUnrealized,
+    // set mapped, error if invariants not met;
+    // used to set mapped on toplevels.
+    Mapped,
+    // set unmapped, even if parent is mapped,
+    // used just before unmapping parent.
+    MakeUnmapped,
+}
+
+#[derive(Default, Debug, Clone)]
+struct ActorProps {
+    request_mode: RequestMode,
+
+    // our cached size requests for different width / height
+
+    // SizeRequest width_requests[N_CACHED_SIZE_REQUESTS];
+    // SizeRequest height_requests[N_CACHED_SIZE_REQUESTS];
+
+    // An age of 0 means the entry is not set
+    cached_height_age: i32,
+    cached_width_age: i32,
+
+    // the bounding box of the actor, relative to the parent's allocation
+    allocation: ActorBox,
+    allocation_flags: AllocationFlags,
+
+    // clip, in actor coordinates
+    clip: Rect<f32>,
+
+    // the cached transformation matrix; see apply_transform()
+    transform: Matrix,
+    opacity: u8,
+    opacity_override: i32,
+
+    offscreen_redirect: OffscreenRedirect,
+
+    // This is an internal effect used to implement the
+    // offscreen-redirect property
+    flatten_effect: Option<Effect>,
+
+    // scene graph
+    parent: Weak<RefCell<Actor>>,
+    // Actor *prev_sibling;
+    // Actor *next_sibling;
+    // Actor *first_child;
+    // Actor *last_child;
+    siblings: Vec<Rc<RefCell<Actor>>>,
+    children: Vec<Rc<RefCell<Actor>>>,
+    n_children: i32,
+
+    // tracks whenever the children of an actor are changed; the
+    // age is incremented by 1 whenever an actor is added or
+    // removed. the age is not incremented when the first or the
+    // last child pointers are changed, or when grandchildren of
+    // an actor are changed.
+    age: i32,
+
+    // a non-unique name, used for debugging
+    name: Option<String>,
+
+    // per-stage unique id, used for picking
+    pick_id: i32,
+
+    // a back-pointer to the Pango context that we can use
+    // to create pre-configured PangoLayout
+    // pango_context: Option<pango::Context>,
+
+    // the text direction configured for this child - either by
+    // application code, or by the actor's parent
+    text_direction: TextDirection,
+
+    // a counter used to toggle the INTERNAL_CHILD flag
+    internal_child: i32,
+
+    // meta classes
+    actions: Vec<Action>,         // MetaGroup
+    constraints: Vec<Constraint>, // MetaGroup
+    effects: Vec<Effect>,         // MetaGroup
+
+    // delegate object used to allocate the children of this actor
+    layout_manager: Option<LayoutManager>,
+
+    // delegate object used to paint the contents of this actor
+    content: Option<Content>,
+
+    content_box: ActorBox,
+    content_gravity: ContentGravity,
+    min_filter: ScalingFilter,
+    mag_filter: ScalingFilter,
+    content_repeat: ContentRepeat,
+
+    // used when painting, to update the paint volume
+    current_effect: Option<Effect>,
+
+    // This is used to store an effect which needs to be redrawn. A
+    // redraw can be queued to start from a particular effect. This is
+    // used by parametrised effects that can cache an image of the
+    // actor. If a parameter of the effect changes then it only needs to
+    // redraw the cached image, not the actual actor. The pointer is
+    // only valid if is_dirty == TRUE. If the pointer is NULL then the
+    // whole actor is dirty.
+    effect_to_redraw: Option<Effect>,
+
+    // This is used when painting effects to implement the
+    // actor_continue_paint() function. It points to the node in
+    // the list of effects that is next in the chain
+
+    // const GList *next_effect_to_paint;
+    paint_volume: PaintVolume,
+
+    // NB: This volume isn't relative to this actor, it is in eye
+    // coordinates so that it can remain valid after the actor changes.
+    last_paint_volume: PaintVolume,
+
+    // StageQueueRedrawEntry *queue_redraw_entry;
+    bg_color: Color,
+
+    // a set of clones of the actor
+    // GHashTable *clones;
+
+    // whether the actor is inside a cloned branch; this
+    // value is propagated to all the actor's children
+    in_cloned_branch: u64,
+
+    // GListModel *child_model;
+    // ActorCreateChildFunc create_child_func;
+    // gpointer create_child_data;
+    // GDestroyNotify create_child_notify;
+
+    // bitfields: KEEP AT THE END
+
+    // fixed position and sizes
+    position_set: bool,
+    min_width_set: bool,
+    min_height_set: bool,
+    natural_width_set: bool,
+    natural_height_set: bool,
+    // cached request is invalid (implies allocation is too)
+    needs_width_request: bool,
+    // cached request is invalid (implies allocation is too)
+    needs_height_request: bool,
+    // cached allocation is invalid (request has changed, probably)
+    needs_allocation: bool,
+    show_on_set_parent: bool,
+    has_clip: bool,
+    clip_to_allocation: bool,
+    enable_model_view_transform: bool,
+    enable_paint_unmapped: bool,
+    has_pointer: bool,
+    propagated_one_redraw: bool,
+    paint_volume_valid: bool,
+    last_paint_volume_valid: bool,
+    in_clone_paint: bool,
+    transform_valid: bool,
+    // This is TRUE if anything has queued a redraw since we were last
+    // painted. In this case effect_to_redraw will point to an effect
+    // the redraw was queued from or it will be NULL if the redraw was
+    // queued without an effect.
+    is_dirty: bool,
+    bg_color_set: bool,
+    content_box_valid: bool,
+    x_expand_set: bool,
+    y_expand_set: bool,
+    needs_compute_expand: bool,
+    needs_x_expand: bool,
+    needs_y_expand: bool,
+}
+//  * ACTOR_IS_MAPPED:
+//  * @a: a #Actor
+//  *
+//  * Evaluates to %TRUE if the %ACTOR_MAPPED flag is set.
+//  *
+//  * The mapped state is set when the actor is visible and all its parents up
+//  * to a top-level (e.g. a #Stage) are visible, realized, and mapped.
+//  *
+//  * This check can be used to see if an actor is going to be painted, as only
+//  * actors with the %ACTOR_MAPPED flag set are going to be painted.
+//  *
+//  * The %ACTOR_MAPPED flag is managed by  itself, and it should
+//  * not be checked directly; instead, the recommended usage is to connect a
+//  * handler on the #GObject::notify signal for the #Actor:mapped
+//  * property of #Actor, and check the presence of
+//  * the %ACTOR_MAPPED flag on state changes.
+//  *
+//  * It is also important to note that  may delay the changes of
+//  * the %ACTOR_MAPPED flag on top-levels due to backend-specific
+//  * limitations, or during the reparenting of an actor, to optimize
+//  * unnecessary (and potentially expensive) state changes.
+//  *
+//  * Since: 0.2
+//  *
+//  * Deprecated: 1.24: Use actor_is_mapped() or the #Actor:mapped
+//  *   property instead of this macro.
+//  *
+//  * ACTOR_IS_REALIZED:
+//  * @a: a #Actor
+//  *
+//  * Evaluates to %TRUE if the %ACTOR_REALIZED flag is set.
+//  *
+//  * The realized state has an actor-dependant interpretation. If an
+//  * actor wants to delay allocating resources until it is attached to a
+//  * stage, it may use the realize state to do so. However it is
+//  * perfectly acceptable for an actor to allocate Cogl resources before
+//  * being realized because there is only one drawing context used by
+//  * so any resources will work on any stage.  If an actor is mapped it
+//  * must also be realized, but an actor can be realized and unmapped
+//  * (this is so hiding an actor temporarily doesn't do an expensive
+//  * unrealize/realize).
+//  *
+//  * To be realized an actor must be inside a stage, and all its parents
+//  * must be realized.
+//  *
+//  * Since: 0.2
+//  *
+//  * Deprecated: 1.24: Use actor_is_realized() or the #Actor:realized
+//  *   property instead of this macro.
+//  *
+//  * ACTOR_IS_VISIBLE:
+//  * @a: a #Actor
+//  *
+//  * Evaluates to %TRUE if the actor has been shown, %FALSE if it's hidden.
+//  * Equivalent to the Actor::visible object property.
+//  *
+//  * Note that an actor is only painted onscreen if it's mapped, which
+//  * means it's visible, and all its parents are visible, and one of the
+//  * parents is a toplevel stage; see also %ACTOR_IS_MAPPED.
+//  *
+//  * Since: 0.2
+//  *
+//  * Deprecated: 1.24: Use actor_is_visible() or the #Actor:visible
+//  *   property instead of this macro.
+//  *
+//  * ACTOR_IS_REACTIVE:
+//  * @a: a #Actor
+//  *
+//  * Evaluates to %TRUE if the %ACTOR_REACTIVE flag is set.
+//  *
+//  * Only reactive actors will receive event-related signals.
+//  *
+//  * Since: 0.6
+//  *
+//  * Deprecated: 1.24: Use actor_get_reactive() or the
+//  *   #Actor:reactive property instead of this macro.
 // @implements Animatable, Container
 #[derive(Default, Debug, Clone)]
-pub struct Actor {}
+pub struct Actor {
+    props: RefCell<ActorProps>,
+}
 
 impl Actor {
     /// Creates a new `Actor`.
@@ -23,8 +777,7 @@ impl Actor {
     ///
     /// the newly created `Actor`
     pub fn new() -> Actor {
-        // unsafe { from_glib_none(ffi::clutter_actor_new()) }
-        unimplemented!()
+        Default::default()
     }
 }
 
@@ -245,9 +998,7 @@ pub trait ActorExt: 'static {
     ///                                           &min_height,
     ///                                           &natural_height);
     ///       height = CLAMP (natural_height, min_height, available_height);
-    ///     }
-    ///   else if (request_mode == REQUEST_WIDTH_FOR_HEIGHT)
-    ///     {
+    ///     } else if (request_mode == REQUEST_WIDTH_FOR_HEIGHT) {
     ///       actor_get_preferred_height (self, available_width,
     ///                                           &min_height,
     ///                                           &natural_height);
@@ -409,7 +1160,7 @@ pub trait ActorExt: 'static {
     /// the newly created `pango::Context`.
     ///  Use `gobject::ObjectExt::unref` on the returned value to deallocate its
     ///  resources
-    fn create_pango_context(&self) -> Option<pango::Context>;
+    // fn create_pango_context(&self) -> Option<pango::Context>;
 
     /// Creates a new `pango::Layout` from the same `pango::Context` used
     /// by the `Actor`. The `pango::Layout` is already configured
@@ -427,7 +1178,7 @@ pub trait ActorExt: 'static {
     ///
     /// the newly created `pango::Layout`.
     ///  Use `gobject::ObjectExt::unref` when done
-    fn create_pango_layout(&self, text: Option<&str>) -> Option<pango::Layout>;
+    // fn create_pango_layout(&self, text: Option<&str>) -> Option<pango::Layout>;
 
     /// Destroys an actor. When an actor is destroyed, it will break any
     /// references it holds to other objects. If the actor is inside a
@@ -717,7 +1468,7 @@ pub trait ActorExt: 'static {
     /// # Returns
     ///
     /// a pointer to a `Actor`, or `None`
-    fn get_first_child(&self) -> Option<Actor>;
+    fn get_first_child(&self) -> Option<Rc<RefCell<Actor>>>;
 
     /// Checks whether an actor has a fixed position set (and will thus be
     /// unaffected by any layout manager).
@@ -942,7 +1693,7 @@ pub trait ActorExt: 'static {
     /// the `pango::Context` for a `Actor`.
     ///  The returned `pango::Context` is owned by the actor and should not be
     ///  unreferenced by the application code
-    fn get_pango_context(&self) -> Option<pango::Context>;
+    // fn get_pango_context(&self) -> Option<pango::Context>;
 
     /// Retrieves the parent of `self`.
     ///
@@ -1626,7 +2377,7 @@ pub trait ActorExt: 'static {
     /// `ActorExt::queue_redraw`.
     /// ## `clip`
     /// a rectangular clip region, or `None`
-    fn queue_redraw_with_clip(&self, clip: Option<&cairo::RectangleInt>);
+    // fn queue_redraw_with_clip(&self, clip: Option<&cairo::RectangleInt>);
 
     /// Indicates that the actor's size request or other layout-affecting
     /// properties may have changed. This function is used inside `Actor`
@@ -3085,7 +3836,7 @@ pub trait ActorExt: 'static {
 impl<O: Is<Actor>> ActorExt for O {
     fn add_action<P: Is<Action>>(&self, action: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_action(
+        //     ffi::actor_add_action(
         //         self.as_ref().to_glib_none().0,
         //         action.as_ref().to_glib_none().0,
         //     );
@@ -3095,7 +3846,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn add_action_with_name<P: Is<Action>>(&self, name: &str, action: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_action_with_name(
+        //     ffi::actor_add_action_with_name(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //         action.as_ref().to_glib_none().0,
@@ -3106,7 +3857,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn add_child<P: Is<Actor>>(&self, child: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_child(
+        //     ffi::actor_add_child(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //     );
@@ -3116,7 +3867,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn add_constraint<P: Is<Constraint>>(&self, constraint: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_constraint(
+        //     ffi::actor_add_constraint(
         //         self.as_ref().to_glib_none().0,
         //         constraint.as_ref().to_glib_none().0,
         //     );
@@ -3126,7 +3877,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn add_constraint_with_name<P: Is<Constraint>>(&self, name: &str, constraint: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_constraint_with_name(
+        //     ffi::actor_add_constraint_with_name(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //         constraint.as_ref().to_glib_none().0,
@@ -3137,7 +3888,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn add_effect<P: Is<Effect>>(&self, effect: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_effect(
+        //     ffi::actor_add_effect(
         //         self.as_ref().to_glib_none().0,
         //         effect.as_ref().to_glib_none().0,
         //     );
@@ -3147,7 +3898,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn add_effect_with_name<P: Is<Effect>>(&self, name: &str, effect: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_effect_with_name(
+        //     ffi::actor_add_effect_with_name(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //         effect.as_ref().to_glib_none().0,
@@ -3158,7 +3909,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn add_transition<P: Is<Transition>>(&self, name: &str, transition: &P) {
         // unsafe {
-        //     ffi::clutter_actor_add_transition(
+        //     ffi::actor_add_transition(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //         transition.as_ref().to_glib_none().0,
@@ -3169,7 +3920,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn allocate(&self, box_: &ActorBox, flags: AllocationFlags) {
         // unsafe {
-        //     ffi::clutter_actor_allocate(
+        //     ffi::actor_allocate(
         //         self.as_ref().to_glib_none().0,
         //         box_.to_glib_none().0,
         //         flags.to_glib(),
@@ -3188,7 +3939,7 @@ impl<O: Is<Actor>> ActorExt for O {
         flags: AllocationFlags,
     ) {
         // unsafe {
-        //     ffi::clutter_actor_allocate_align_fill(
+        //     ffi::actor_allocate_align_fill(
         //         self.as_ref().to_glib_none().0,
         //         box_.to_glib_none().0,
         //         x_align,
@@ -3210,7 +3961,7 @@ impl<O: Is<Actor>> ActorExt for O {
         flags: AllocationFlags,
     ) {
         // unsafe {
-        //     ffi::clutter_actor_allocate_available_size(
+        //     ffi::actor_allocate_available_size(
         //         self.as_ref().to_glib_none().0,
         //         x,
         //         y,
@@ -3224,7 +3975,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn allocate_preferred_size(&self, flags: AllocationFlags) {
         // unsafe {
-        //     ffi::clutter_actor_allocate_preferred_size(
+        //     ffi::actor_allocate_preferred_size(
         //         self.as_ref().to_glib_none().0,
         //         flags.to_glib(),
         //     );
@@ -3239,7 +3990,7 @@ impl<O: Is<Actor>> ActorExt for O {
     ) -> Vertex {
         // unsafe {
         //     let mut vertex = Vertex::uninitialized();
-        //     ffi::clutter_actor_apply_relative_transform_to_point(
+        //     ffi::actor_apply_relative_transform_to_point(
         //         self.as_ref().to_glib_none().0,
         //         ancestor.map(|p| p.as_ref()).to_glib_none().0,
         //         point.to_glib_none().0,
@@ -3253,7 +4004,7 @@ impl<O: Is<Actor>> ActorExt for O {
     fn apply_transform_to_point(&self, point: &Vertex) -> Vertex {
         // unsafe {
         //     let mut vertex = Vertex::uninitialized();
-        //     ffi::clutter_actor_apply_transform_to_point(
+        //     ffi::actor_apply_transform_to_point(
         //         self.as_ref().to_glib_none().0,
         //         point.to_glib_none().0,
         //         vertex.to_glib_none_mut().0,
@@ -3268,7 +4019,7 @@ impl<O: Is<Actor>> ActorExt for O {
     //     model: Option<&P>,
     //     create_child_func: Q,
     // ) {
-    //     // let create_child_func_data: Box_<Q> = Box_::new(create_child_func);
+    //     // let create_child_func_data: Box<Q> = Box::new(create_child_func);
     //     // unsafe extern "C" fn create_child_func_func<
     //     //     P: Is<gio::ListModel>,
     //     //     Q: Fn(&glib::Object) -> Actor + 'static,
@@ -3288,16 +4039,16 @@ impl<O: Is<Actor>> ActorExt for O {
     //     // >(
     //     //     data: glib_sys::gpointer,
     //     // ) {
-    //     //     let _callback: Box_<Q> = Box_::from_raw(data as *mut _);
+    //     //     let _callback: Box<Q> = Box::from_raw(data as *mut _);
     //     // }
     //     // let destroy_call4 = Some(notify_func::<P, Q> as _);
-    //     // let super_callback0: Box_<Q> = create_child_func_data;
+    //     // let super_callback0: Box<Q> = create_child_func_data;
     //     // unsafe {
-    //     //     ffi::clutter_actor_bind_model(
+    //     //     ffi::actor_bind_model(
     //     //         self.as_ref().to_glib_none().0,
     //     //         model.map(|p| p.as_ref()).to_glib_none().0,
     //     //         create_child_func,
-    //     //         Box_::into_raw(super_callback0) as *mut _,
+    //     //         Box::into_raw(super_callback0) as *mut _,
     //     //         destroy_call4,
     //     //     );
     //     // }
@@ -3305,33 +4056,33 @@ impl<O: Is<Actor>> ActorExt for O {
     // }
 
     //fn bind_model_with_properties<P: Is<gio::ListModel>>(&self, model: &P, child_type: glib::types::Type, first_model_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { clutter_sys:clutter_actor_bind_model_with_properties() }
+    //    unsafe { sys:actor_bind_model_with_properties() }
     //}
 
     fn clear_actions(&self) {
         // unsafe {
-        //     ffi::clutter_actor_clear_actions(self.as_ref().to_glib_none().0);
+        //     ffi::actor_clear_actions(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn clear_constraints(&self) {
         // unsafe {
-        //     ffi::clutter_actor_clear_constraints(self.as_ref().to_glib_none().0);
+        //     ffi::actor_clear_constraints(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn clear_effects(&self) {
         // unsafe {
-        //     ffi::clutter_actor_clear_effects(self.as_ref().to_glib_none().0);
+        //     ffi::actor_clear_effects(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn contains<P: Is<Actor>>(&self, descendant: &P) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_contains(
+        //     from_glib(ffi::actor_contains(
         //         self.as_ref().to_glib_none().0,
         //         descendant.as_ref().to_glib_none().0,
         //     ))
@@ -3341,47 +4092,47 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn continue_paint(&self) {
         // unsafe {
-        //     ffi::clutter_actor_continue_paint(self.as_ref().to_glib_none().0);
+        //     ffi::actor_continue_paint(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
-    fn create_pango_context(&self) -> Option<pango::Context> {
-        // unsafe {
-        //     from_glib_full(ffi::clutter_actor_create_pango_context(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn create_pango_context(&self) -> Option<pango::Context> {
+    //     // unsafe {
+    //     //     from_glib_full(ffi::actor_create_pango_context(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn create_pango_layout(&self, text: Option<&str>) -> Option<pango::Layout> {
-        // unsafe {
-        //     from_glib_full(ffi::clutter_actor_create_pango_layout(
-        //         self.as_ref().to_glib_none().0,
-        //         text.to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn create_pango_layout(&self, text: Option<&str>) -> Option<pango::Layout> {
+    //     // unsafe {
+    //     //     from_glib_full(ffi::actor_create_pango_layout(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         text.to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn destroy(&self) {
         // unsafe {
-        //     ffi::clutter_actor_destroy(self.as_ref().to_glib_none().0);
+        //     ffi::actor_destroy(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn destroy_all_children(&self) {
         // unsafe {
-        //     ffi::clutter_actor_destroy_all_children(self.as_ref().to_glib_none().0);
+        //     ffi::actor_destroy_all_children(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn event(&self, event: &Event, capture: bool) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_event(
+        //     from_glib(ffi::actor_event(
         //         self.as_ref().to_glib_none().0,
         //         event.to_glib_none().0,
         //         capture.to_glib(),
@@ -3391,12 +4142,12 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     //fn get_abs_allocation_vertices(&self, verts: /*Unimplemented*/FixedArray TypeId { ns_id: 1, id: 16 }; 4) {
-    //    unsafe { clutter_sys:clutter_actor_get_abs_allocation_vertices() }
+    //    unsafe { sys:actor_get_abs_allocation_vertices() }
     //}
 
     fn get_action(&self, name: &str) -> Option<Action> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_action(
+        //     from_glib_none(ffi::actor_get_action(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     ))
@@ -3406,7 +4157,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_actions(&self) -> Vec<Action> {
         // unsafe {
-        //     FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_actions(
+        //     FromGlibPtrContainer::from_glib_container(ffi::actor_get_actions(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3414,36 +4165,51 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_allocation_box(&self) -> ActorBox {
-        // unsafe {
-        //     let mut box_ = ActorBox::uninitialized();
-        //     ffi::clutter_actor_get_allocation_box(
-        //         self.as_ref().to_glib_none().0,
-        //         box_.to_glib_none_mut().0,
-        //     );
-        //     box_
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        // XXX - if needs_allocation=TRUE, we can either 1) g_return_if_fail,
+        // which limits calling get_allocation to inside paint() basically; or
+        // we can 2) force a layout, which could be expensive if someone calls
+        // get_allocation somewhere silly; or we can 3) just return the latest
+        // value, allowing it to be out-of-date, and assume people know what
+        // they are doing.
+        //
+        // The least-surprises approach that keeps existing code working is
+        // likely to be 2). People can end up doing some inefficient things,
+        // though, and in general code that requires 2) is probably broken.
+
+        // this implements 2)
+
+        // if props.needs_allocation  {
+        //     Actor *stage = _actor_get_stage_internal (self);
+
+        //     // do not queue a relayout on an unparented actor */
+        //     if stage {
+        //         _stage_maybe_relayout (stage);
+        //     }
         // }
-        unimplemented!()
+
+        // commenting out the code above and just keeping this assigment
+        // implements 3)
+
+        props.allocation
     }
 
     //fn get_allocation_vertices<P: Is<Actor>>(&self, ancestor: Option<&P>, verts: /*Unimplemented*/FixedArray TypeId { ns_id: 1, id: 16 }; 4) {
-    //    unsafe { clutter_sys:clutter_actor_get_allocation_vertices() }
+    //    unsafe { sys:actor_get_allocation_vertices() }
     //}
 
     fn get_background_color(&self) -> Color {
-        // unsafe {
-        //     let mut color = Color::uninitialized();
-        //     ffi::clutter_actor_get_background_color(
-        //         self.as_ref().to_glib_none().0,
-        //         color.to_glib_none_mut().0,
-        //     );
-        //     color
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.bg_color
     }
 
     fn get_child_at_index(&self, index_: i32) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_child_at_index(
+        //     from_glib_none(ffi::actor_get_child_at_index(
         //         self.as_ref().to_glib_none().0,
         //         index_,
         //     ))
@@ -3454,7 +4220,7 @@ impl<O: Is<Actor>> ActorExt for O {
     fn get_child_transform(&self) -> Matrix {
         // unsafe {
         //     let mut transform = Matrix::uninitialized();
-        //     ffi::clutter_actor_get_child_transform(
+        //     ffi::actor_get_child_transform(
         //         self.as_ref().to_glib_none().0,
         //         transform.to_glib_none_mut().0,
         //     );
@@ -3465,7 +4231,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_children(&self) -> Vec<Actor> {
         // unsafe {
-        //     FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_children(
+        //     FromGlibPtrContainer::from_glib_container(ffi::actor_get_children(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3473,39 +4239,29 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_clip(&self) -> (f32, f32, f32, f32) {
-        // unsafe {
-        //     let mut xoff = mem::MaybeUninit::uninit();
-        //     let mut yoff = mem::MaybeUninit::uninit();
-        //     let mut width = mem::MaybeUninit::uninit();
-        //     let mut height = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_clip(
-        //         self.as_ref().to_glib_none().0,
-        //         xoff.as_mut_ptr(),
-        //         yoff.as_mut_ptr(),
-        //         width.as_mut_ptr(),
-        //         height.as_mut_ptr(),
-        //     );
-        //     let xoff = xoff.assume_init();
-        //     let yoff = yoff.assume_init();
-        //     let width = width.assume_init();
-        //     let height = height.assume_init();
-        //     (xoff, yoff, width, height)
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+        let clip = &props.clip;
+
+        let xoff = clip.origin.x;
+        let yoff = clip.origin.y;
+        let width = clip.size.width;
+        let height = clip.size.height;
+        (xoff, yoff, width, height)
     }
 
     fn get_clip_to_allocation(&self) -> bool {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_get_clip_to_allocation(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+        props.clip_to_allocation
     }
 
     fn get_constraint(&self, name: &str) -> Option<Constraint> {
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_constraint(
+        //     from_glib_none(ffi::actor_get_constraint(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     ))
@@ -3514,72 +4270,211 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_constraints(&self) -> Vec<Constraint> {
-        // unsafe {
-        //     FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_constraints(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+        props.constraints.clone()
     }
 
     fn get_content(&self) -> Option<Content> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_content(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+        // props.content
         unimplemented!()
     }
 
     fn get_content_box(&self) -> ActorBox {
-        // unsafe {
-        //     let mut box_ = ActorBox::uninitialized();
-        //     ffi::clutter_actor_get_content_box(
-        //         self.as_ref().to_glib_none().0,
-        //         box_.to_glib_none_mut().0,
-        //     );
-        //     box_
+        // ActorPrivate *priv;
+        // gfloat content_w, content_h;
+        // gfloat alloc_w, alloc_h;
+
+        // g_return_if_fail (IS_ACTOR (self));
+        // g_return_if_fail (box != NULL);
+
+        // priv = self->priv;
+
+        // box->x1 = 0.f;
+        // box->y1 = 0.f;
+        // box->x2 = priv->allocation.x2 - priv->allocation.x1;
+        // box->y2 = priv->allocation.y2 - priv->allocation.y1;
+
+        // if (priv->content_box_valid) {
+        //     *box = priv->content_box;
+        //     return;
+        // }
+
+        // no need to do any more work */
+        // if (priv->content_gravity == CONTENT_GRAVITY_RESIZE_FILL)
+        //     return;
+
+        // if (priv->content == NULL)
+        //     return;
+
+        // if the content does not have a preferred size then there is
+        // no point in computing the content box
+        //
+        // if (!content_get_preferred_size (priv->content,
+        //                                         &content_w,
+        //                                         &content_h))
+        //     return;
+
+        // alloc_w = box->x2;
+        // alloc_h = box->y2;
+
+        // switch (priv->content_gravity) {
+        // case CONTENT_GRAVITY_TOP_LEFT:
+        //     box->x2 = box->x1 + MIN (content_w, alloc_w);
+        //     box->y2 = box->y1 + MIN (content_h, alloc_h);
+        //     break;
+
+        // case CONTENT_GRAVITY_TOP:
+        //     if (alloc_w > content_w)
+        //         {
+        //         box->x1 += ceilf ((alloc_w - content_w) / 2.0);
+        //         box->x2 = box->x1 + content_w;
+        //         }
+        //     box->y2 = box->y1 + MIN (content_h, alloc_h);
+        //     break;
+
+        // case CONTENT_GRAVITY_TOP_RIGHT:
+        //     if (alloc_w > content_w)
+        //         {
+        //         box->x1 += (alloc_w - content_w);
+        //         box->x2 = box->x1 + content_w;
+        //         }
+        //     box->y2 = box->y1 + MIN (content_h, alloc_h);
+        //     break;
+
+        // case CONTENT_GRAVITY_LEFT:
+        //     box->x2 = box->x1 + MIN (content_w, alloc_w);
+        //     if (alloc_h > content_h)
+        //         {
+        //         box->y1 += ceilf ((alloc_h - content_h) / 2.0);
+        //         box->y2 = box->y1 + content_h;
+        //         }
+        //     break;
+
+        // case CONTENT_GRAVITY_CENTER:
+        //     if (alloc_w > content_w)
+        //         {
+        //         box->x1 += ceilf ((alloc_w - content_w) / 2.0);
+        //         box->x2 = box->x1 + content_w;
+        //         }
+        //     if (alloc_h > content_h)
+        //         {
+        //         box->y1 += ceilf ((alloc_h - content_h) / 2.0);
+        //         box->y2 = box->y1 + content_h;
+        //         }
+        //     break;
+
+        // case CONTENT_GRAVITY_RIGHT:
+        //     if (alloc_w > content_w)
+        //         {
+        //         box->x1 += (alloc_w - content_w);
+        //         box->x2 = box->x1 + content_w;
+        //         }
+        //     if (alloc_h > content_h)
+        //         {
+        //         box->y1 += ceilf ((alloc_h - content_h) / 2.0);
+        //         box->y2 = box->y1 + content_h;
+        //         }
+        //     break;
+
+        // case CONTENT_GRAVITY_BOTTOM_LEFT:
+        //     box->x2 = box->x1 + MIN (content_w, alloc_w);
+        //     if (alloc_h > content_h)
+        //         {
+        //         box->y1 += (alloc_h - content_h);
+        //         box->y2 = box->y1 + content_h;
+        //         }
+        //     break;
+
+        // case CONTENT_GRAVITY_BOTTOM:
+        //     if (alloc_w > content_w)
+        //         {
+        //         box->x1 += ceilf ((alloc_w - content_w) / 2.0);
+        //         box->x2 = box->x1 + content_w;
+        //         }
+        //     if (alloc_h > content_h)
+        //         {
+        //         box->y1 += (alloc_h - content_h);
+        //         box->y2 = box->y1 + content_h;
+        //         }
+        //     break;
+
+        // case CONTENT_GRAVITY_BOTTOM_RIGHT:
+        //     if (alloc_w > content_w)
+        //         {
+        //         box->x1 += (alloc_w - content_w);
+        //         box->x2 = box->x1 + content_w;
+        //         }
+        //     if (alloc_h > content_h)
+        //         {
+        //         box->y1 += (alloc_h - content_h);
+        //         box->y2 = box->y1 + content_h;
+        //         }
+        //     break;
+
+        // case CONTENT_GRAVITY_RESIZE_FILL:
+        //     g_assert_not_reached ();
+        //     break;
+
+        // case CONTENT_GRAVITY_RESIZE_ASPECT:
+        //     {
+        //         double r_c = content_w / content_h;
+
+        //         if ((alloc_w / r_c) > alloc_h)
+        //         {
+        //             box->y1 = 0.f;
+        //             box->y2 = alloc_h;
+
+        //             box->x1 = (alloc_w - (alloc_h * r_c)) / 2.0f;
+        //             box->x2 = box->x1 + (alloc_h * r_c);
+        //         }
+        //         else
+        //         {
+        //             box->x1 = 0.f;
+        //             box->x2 = alloc_w;
+
+        //             box->y1 = (alloc_h - (alloc_w / r_c)) / 2.0f;
+        //             box->y2 = box->y1 + (alloc_w / r_c);
+        //         }
+
+        //         NOTE (LAYOUT,
+        //                     "r_c: %.3f, r_a: %.3f\t"
+        //                     "a: [%.2fx%.2f], c: [%.2fx%.2f]\t"
+        //                     "b: [%.2f, %.2f, %.2f, %.2f]",
+        //                     r_c, alloc_w / alloc_h,
+        //                     alloc_w, alloc_h,
+        //                     content_w, content_h,
+        //                     box->x1, box->y1, box->x2, box->y2);
+        //     }
+        //     break;
         // }
         unimplemented!()
     }
 
     fn get_content_gravity(&self) -> ContentGravity {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_get_content_gravity(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+        props.content_gravity
     }
 
     fn get_content_repeat(&self) -> ContentRepeat {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_get_content_repeat(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+        props.content_repeat
     }
 
     fn get_content_scaling_filters(&self) -> (ScalingFilter, ScalingFilter) {
-        // unsafe {
-        //     let mut min_filter = mem::MaybeUninit::uninit();
-        //     let mut mag_filter = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_content_scaling_filters(
-        //         self.as_ref().to_glib_none().0,
-        //         min_filter.as_mut_ptr(),
-        //         mag_filter.as_mut_ptr(),
-        //     );
-        //     let min_filter = min_filter.assume_init();
-        //     let mag_filter = mag_filter.assume_init();
-        //     (from_glib(min_filter), from_glib(mag_filter))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        (props.min_filter, props.mag_filter)
     }
 
     fn get_default_paint_volume(&self) -> Option<PaintVolume> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_default_paint_volume(
+        //     from_glib_none(ffi::actor_get_default_paint_volume(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3587,18 +4482,21 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_easing_delay(&self) -> u32 {
-        // unsafe { ffi::clutter_actor_get_easing_delay(self.as_ref().to_glib_none().0) }
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        // unsafe { ffi::actor_get_easing_delay(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_easing_duration(&self) -> u32 {
-        // unsafe { ffi::clutter_actor_get_easing_duration(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_easing_duration(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_easing_mode(&self) -> AnimationMode {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_get_easing_mode(
+        //     from_glib(ffi::actor_get_easing_mode(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3607,7 +4505,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_effect(&self, name: &str) -> Option<Effect> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_effect(
+        //     from_glib_none(ffi::actor_get_effect(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     ))
@@ -3616,45 +4514,69 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_effects(&self) -> Vec<Effect> {
-        // unsafe {
-        //     FromGlibPtrContainer::from_glib_container(ffi::clutter_actor_get_effects(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.effects.clone()
     }
 
-    fn get_first_child(&self) -> Option<Actor> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_first_child(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+    fn get_first_child(&self) -> Option<Rc<RefCell<Actor>>> {
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+        match props.children.first() {
+            Some(actor) => {
+                let actor = actor.clone();
+                Some(actor)
+            }
+            None => None,
+        }
     }
 
     fn get_fixed_position_set(&self) -> bool {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_get_fixed_position_set(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.position_set
     }
 
     fn get_flags(&self) -> ActorFlags {
-        // unsafe { from_glib(ffi::clutter_actor_get_flags(self.as_ref().to_glib_none().0)) }
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
         unimplemented!()
     }
 
     fn get_height(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_height(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        if props.needs_allocation {
+            if props.request_mode == RequestMode::HeightForWidth {
+                let (_, natural_width) = self.get_preferred_width(-1.0);
+                let (_, natural_height) = self.get_preferred_height(natural_width);
+
+                return natural_height;
+            } else if props.request_mode == RequestMode::WidthForHeight {
+                let (_, natural_height) = self.get_preferred_height(-1.0);
+
+                return natural_height;
+            } else if props.request_mode == RequestMode::ContentSize && props.content.is_some() {
+                if let Some(content) = &props.content {
+                    if let Some((_, natural_height)) = content.get_preferred_size() {
+                        return natural_height;
+                    }
+                }
+            }
+        }
+
+        props.allocation.y2 - props.allocation.y1
     }
 
     fn get_last_child(&self) -> Option<Actor> {
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_last_child(
+        //     from_glib_none(ffi::actor_get_last_child(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3662,8 +4584,10 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_layout_manager(&self) -> Option<LayoutManager> {
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_layout_manager(
+        //     from_glib_none(ffi::actor_get_layout_manager(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3671,9 +4595,12 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_margin(&self) -> Margin {
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
         // unsafe {
         //     let mut margin = Margin::uninitialized();
-        //     ffi::clutter_actor_get_margin(
+        //     ffi::actor_get_margin(
         //         self.as_ref().to_glib_none().0,
         //         margin.to_glib_none_mut().0,
         //     );
@@ -3683,38 +4610,40 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_margin_bottom(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_margin_bottom(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_margin_bottom(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_margin_left(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_margin_left(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_margin_left(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_margin_right(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_margin_right(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_margin_right(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_margin_top(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_margin_top(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_margin_top(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_n_children(&self) -> i32 {
-        // unsafe { ffi::clutter_actor_get_n_children(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_n_children(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_name(&self) -> Option<String> {
-        // unsafe { from_glib_none(ffi::clutter_actor_get_name(self.as_ref().to_glib_none().0)) }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.name.clone()
     }
 
     fn get_next_sibling(&self) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_next_sibling(
+        //     from_glib_none(ffi::actor_get_next_sibling(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3722,23 +4651,23 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_offscreen_redirect(&self) -> OffscreenRedirect {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_get_offscreen_redirect(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.offscreen_redirect
     }
 
     fn get_opacity(&self) -> u8 {
-        // unsafe { ffi::clutter_actor_get_opacity(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.opacity
     }
 
     fn get_paint_box(&self) -> Option<ActorBox> {
         // unsafe {
         //     let mut box_ = ActorBox::uninitialized();
-        //     let ret = from_glib(ffi::clutter_actor_get_paint_box(
+        //     let ret = from_glib(ffi::actor_get_paint_box(
         //         self.as_ref().to_glib_none().0,
         //         box_.to_glib_none_mut().0,
         //     ));
@@ -3752,13 +4681,13 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_paint_opacity(&self) -> u8 {
-        // unsafe { ffi::clutter_actor_get_paint_opacity(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_paint_opacity(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_paint_visibility(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_get_paint_visibility(
+        //     from_glib(ffi::actor_get_paint_visibility(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3767,25 +4696,25 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_paint_volume(&self) -> Option<PaintVolume> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_paint_volume(
+        //     from_glib_none(ffi::actor_get_paint_volume(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
         unimplemented!()
     }
 
-    fn get_pango_context(&self) -> Option<pango::Context> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_pango_context(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn get_pango_context(&self) -> Option<pango::Context> {
+    //     // unsafe {
+    //     //     from_glib_none(ffi::actor_get_pango_context(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_parent(&self) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_parent(
+        //     from_glib_none(ffi::actor_get_parent(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3796,7 +4725,7 @@ impl<O: Is<Actor>> ActorExt for O {
         // unsafe {
         //     let mut pivot_x = mem::MaybeUninit::uninit();
         //     let mut pivot_y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_pivot_point(
+        //     ffi::actor_get_pivot_point(
         //         self.as_ref().to_glib_none().0,
         //         pivot_x.as_mut_ptr(),
         //         pivot_y.as_mut_ptr(),
@@ -3809,31 +4738,19 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_pivot_point_z(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_pivot_point_z(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_pivot_point_z(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_position(&self) -> (f32, f32) {
-        // unsafe {
-        //     let mut x = mem::MaybeUninit::uninit();
-        //     let mut y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_position(
-        //         self.as_ref().to_glib_none().0,
-        //         x.as_mut_ptr(),
-        //         y.as_mut_ptr(),
-        //     );
-        //     let x = x.assume_init();
-        //     let y = y.assume_init();
-        //     (x, y)
-        // }
-        unimplemented!()
+        (self.get_x(), self.get_y())
     }
 
     fn get_preferred_height(&self, for_width: f32) -> (f32, f32) {
         // unsafe {
         //     let mut min_height_p = mem::MaybeUninit::uninit();
         //     let mut natural_height_p = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_preferred_height(
+        //     ffi::actor_get_preferred_height(
         //         self.as_ref().to_glib_none().0,
         //         for_width,
         //         min_height_p.as_mut_ptr(),
@@ -3852,7 +4769,7 @@ impl<O: Is<Actor>> ActorExt for O {
         //     let mut min_height_p = mem::MaybeUninit::uninit();
         //     let mut natural_width_p = mem::MaybeUninit::uninit();
         //     let mut natural_height_p = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_preferred_size(
+        //     ffi::actor_get_preferred_size(
         //         self.as_ref().to_glib_none().0,
         //         min_width_p.as_mut_ptr(),
         //         min_height_p.as_mut_ptr(),
@@ -3872,7 +4789,7 @@ impl<O: Is<Actor>> ActorExt for O {
         // unsafe {
         //     let mut min_width_p = mem::MaybeUninit::uninit();
         //     let mut natural_width_p = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_preferred_width(
+        //     ffi::actor_get_preferred_width(
         //         self.as_ref().to_glib_none().0,
         //         for_height,
         //         min_width_p.as_mut_ptr(),
@@ -3887,7 +4804,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_previous_sibling(&self) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_previous_sibling(
+        //     from_glib_none(ffi::actor_get_previous_sibling(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3896,7 +4813,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_reactive(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_get_reactive(
+        //     from_glib(ffi::actor_get_reactive(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -3904,17 +4821,15 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_request_mode(&self) -> RequestMode {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_get_request_mode(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.request_mode
     }
 
     fn get_rotation_angle(&self, axis: RotateAxis) -> f64 {
         // unsafe {
-        //     ffi::clutter_actor_get_rotation_angle(self.as_ref().to_glib_none().0, axis.to_glib())
+        //     ffi::actor_get_rotation_angle(self.as_ref().to_glib_none().0, axis.to_glib())
         // }
         unimplemented!()
     }
@@ -3923,7 +4838,7 @@ impl<O: Is<Actor>> ActorExt for O {
         // unsafe {
         //     let mut scale_x = mem::MaybeUninit::uninit();
         //     let mut scale_y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_scale(
+        //     ffi::actor_get_scale(
         //         self.as_ref().to_glib_none().0,
         //         scale_x.as_mut_ptr(),
         //         scale_y.as_mut_ptr(),
@@ -3936,44 +4851,30 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_scale_z(&self) -> f64 {
-        // unsafe { ffi::clutter_actor_get_scale_z(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_scale_z(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_size(&self) -> (f32, f32) {
-        // unsafe {
-        //     let mut width = mem::MaybeUninit::uninit();
-        //     let mut height = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_size(
-        //         self.as_ref().to_glib_none().0,
-        //         width.as_mut_ptr(),
-        //         height.as_mut_ptr(),
-        //     );
-        //     let width = width.assume_init();
-        //     let height = height.assume_init();
-        //     (width, height)
-        // }
-        unimplemented!()
+        (self.get_width(), self.get_height())
     }
 
     fn get_stage(&self) -> Option<Stage> {
-        // unsafe { from_glib_none(ffi::clutter_actor_get_stage(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::actor_get_stage(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
     fn get_text_direction(&self) -> TextDirection {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_get_text_direction(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.text_direction
     }
 
     fn get_transform(&self) -> Matrix {
         // unsafe {
         //     let mut transform = Matrix::uninitialized();
-        //     ffi::clutter_actor_get_transform(
+        //     ffi::actor_get_transform(
         //         self.as_ref().to_glib_none().0,
         //         transform.to_glib_none_mut().0,
         //     );
@@ -3987,7 +4888,7 @@ impl<O: Is<Actor>> ActorExt for O {
         relative_to_ancestor: &P,
     ) -> Option<PaintVolume> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_transformed_paint_volume(
+        //     from_glib_none(ffi::actor_get_transformed_paint_volume(
         //         self.as_ref().to_glib_none().0,
         //         relative_to_ancestor.as_ref().to_glib_none().0,
         //     ))
@@ -3996,26 +4897,20 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_transformed_position(&self) -> (f32, f32) {
-        // unsafe {
-        //     let mut x = mem::MaybeUninit::uninit();
-        //     let mut y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_transformed_position(
-        //         self.as_ref().to_glib_none().0,
-        //         x.as_mut_ptr(),
-        //         y.as_mut_ptr(),
-        //     );
-        //     let x = x.assume_init();
-        //     let y = y.assume_init();
-        //     (x, y)
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        let v1 = Vertex::new(0.0, 0.0, 0.0);
+        let v2 = actor.apply_transform_to_point(&v1);
+
+        (v2.x, v2.y)
     }
 
     fn get_transformed_size(&self) -> (f32, f32) {
         // unsafe {
         //     let mut width = mem::MaybeUninit::uninit();
         //     let mut height = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_transformed_size(
+        //     ffi::actor_get_transformed_size(
         //         self.as_ref().to_glib_none().0,
         //         width.as_mut_ptr(),
         //         height.as_mut_ptr(),
@@ -4029,7 +4924,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_transition(&self, name: &str) -> Option<Transition> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_actor_get_transition(
+        //     from_glib_none(ffi::actor_get_transition(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     ))
@@ -4042,7 +4937,7 @@ impl<O: Is<Actor>> ActorExt for O {
         //     let mut translate_x = mem::MaybeUninit::uninit();
         //     let mut translate_y = mem::MaybeUninit::uninit();
         //     let mut translate_z = mem::MaybeUninit::uninit();
-        //     ffi::clutter_actor_get_translation(
+        //     ffi::actor_get_translation(
         //         self.as_ref().to_glib_none().0,
         //         translate_x.as_mut_ptr(),
         //         translate_y.as_mut_ptr(),
@@ -4057,18 +4952,40 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_width(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_width(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        if props.needs_allocation {
+            if props.request_mode == RequestMode::HeightForWidth {
+                let (_, natural_width) = self.get_preferred_width(-1.0);
+                return natural_width;
+            } else if props.request_mode == RequestMode::WidthForHeight {
+                let (_, natural_height) = self.get_preferred_height(-1.0);
+                let (_, natural_width) = self.get_preferred_width(natural_height);
+                return natural_width;
+            } else if props.request_mode == RequestMode::ContentSize {
+                match &props.content {
+                    Some(content) => {
+                        if let Some((natural_width, _)) = content.get_preferred_size() {
+                            return natural_width;
+                        }
+                    }
+                    None => {}
+                }
+            }
+        }
+
+        props.allocation.x2 - props.allocation.x1
     }
 
     fn get_x(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_x(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_x(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_x_align(&self) -> ActorAlign {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_get_x_align(
+        //     from_glib(ffi::actor_get_x_align(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4077,7 +4994,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_x_expand(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_get_x_expand(
+        //     from_glib(ffi::actor_get_x_expand(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4085,13 +5002,13 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_y(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_y(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_y(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_y_align(&self) -> ActorAlign {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_get_y_align(
+        //     from_glib(ffi::actor_get_y_align(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4100,7 +5017,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn get_y_expand(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_get_y_expand(
+        //     from_glib(ffi::actor_get_y_expand(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4108,20 +5025,20 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn get_z_position(&self) -> f32 {
-        // unsafe { ffi::clutter_actor_get_z_position(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::actor_get_z_position(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn grab_key_focus(&self) {
         // unsafe {
-        //     ffi::clutter_actor_grab_key_focus(self.as_ref().to_glib_none().0);
+        //     ffi::actor_grab_key_focus(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn has_actions(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_has_actions(
+        //     from_glib(ffi::actor_has_actions(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4130,7 +5047,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn has_allocation(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_has_allocation(
+        //     from_glib(ffi::actor_has_allocation(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4138,13 +5055,15 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn has_clip(&self) -> bool {
-        // unsafe { from_glib(ffi::clutter_actor_has_clip(self.as_ref().to_glib_none().0)) }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.has_clip
     }
 
     fn has_constraints(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_has_constraints(
+        //     from_glib(ffi::actor_has_constraints(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4153,7 +5072,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn has_effects(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_has_effects(
+        //     from_glib(ffi::actor_has_effects(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4162,7 +5081,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn has_key_focus(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_has_key_focus(
+        //     from_glib(ffi::actor_has_key_focus(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4171,7 +5090,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn has_overlaps(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_has_overlaps(
+        //     from_glib(ffi::actor_has_overlaps(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4179,24 +5098,22 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn has_pointer(&self) -> bool {
-        // unsafe {
-        //     from_glib(ffi::clutter_actor_has_pointer(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        props.has_pointer
     }
 
     fn hide(&self) {
         // unsafe {
-        //     ffi::clutter_actor_hide(self.as_ref().to_glib_none().0);
+        //     ffi::actor_hide(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn insert_child_above<P: Is<Actor>, Q: Is<Actor>>(&self, child: &P, sibling: Option<&Q>) {
         // unsafe {
-        //     ffi::clutter_actor_insert_child_above(
+        //     ffi::actor_insert_child_above(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         sibling.map(|p| p.as_ref()).to_glib_none().0,
@@ -4207,7 +5124,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn insert_child_at_index<P: Is<Actor>>(&self, child: &P, index_: i32) {
         // unsafe {
-        //     ffi::clutter_actor_insert_child_at_index(
+        //     ffi::actor_insert_child_at_index(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         index_,
@@ -4218,7 +5135,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn insert_child_below<P: Is<Actor>, Q: Is<Actor>>(&self, child: &P, sibling: Option<&Q>) {
         // unsafe {
-        //     ffi::clutter_actor_insert_child_below(
+        //     ffi::actor_insert_child_below(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         sibling.map(|p| p.as_ref()).to_glib_none().0,
@@ -4228,8 +5145,19 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn is_in_clone_paint(&self) -> bool {
+        let actor = self.as_ref();
+        let props = actor.props.borrow();
+
+        if props.in_clone_paint {
+            return true;
+        }
+
+        if props.in_cloned_branch == 0 {
+            return false;
+        }
+
         // unsafe {
-        //     from_glib(ffi::clutter_actor_is_in_clone_paint(
+        //     from_glib(ffi::actor_is_in_clone_paint(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4237,13 +5165,13 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn is_mapped(&self) -> bool {
-        // unsafe { from_glib(ffi::clutter_actor_is_mapped(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib(ffi::actor_is_mapped(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
     fn is_realized(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_is_realized(
+        //     from_glib(ffi::actor_is_realized(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4252,7 +5180,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn is_rotated(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_is_rotated(
+        //     from_glib(ffi::actor_is_rotated(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4260,13 +5188,13 @@ impl<O: Is<Actor>> ActorExt for O {
     }
 
     fn is_scaled(&self) -> bool {
-        // unsafe { from_glib(ffi::clutter_actor_is_scaled(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib(ffi::actor_is_scaled(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
     fn is_visible(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_is_visible(
+        //     from_glib(ffi::actor_is_visible(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4275,21 +5203,21 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn map(&self) {
         // unsafe {
-        //     ffi::clutter_actor_map(self.as_ref().to_glib_none().0);
+        //     ffi::actor_map(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn move_by(&self, dx: f32, dy: f32) {
         // unsafe {
-        //     ffi::clutter_actor_move_by(self.as_ref().to_glib_none().0, dx, dy);
+        //     ffi::actor_move_by(self.as_ref().to_glib_none().0, dx, dy);
         // }
         unimplemented!()
     }
 
     fn needs_expand(&self, orientation: Orientation) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_needs_expand(
+        //     from_glib(ffi::actor_needs_expand(
         //         self.as_ref().to_glib_none().0,
         //         orientation.to_glib(),
         //     ))
@@ -4299,38 +5227,38 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn paint(&self) {
         // unsafe {
-        //     ffi::clutter_actor_paint(self.as_ref().to_glib_none().0);
+        //     ffi::actor_paint(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn queue_redraw(&self) {
         // unsafe {
-        //     ffi::clutter_actor_queue_redraw(self.as_ref().to_glib_none().0);
+        //     ffi::actor_queue_redraw(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
-    fn queue_redraw_with_clip(&self, clip: Option<&cairo::RectangleInt>) {
-        // unsafe {
-        //     ffi::clutter_actor_queue_redraw_with_clip(
-        //         self.as_ref().to_glib_none().0,
-        //         clip.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn queue_redraw_with_clip(&self, clip: Option<&cairo::RectangleInt>) {
+    //     // unsafe {
+    //     //     ffi::actor_queue_redraw_with_clip(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         clip.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn queue_relayout(&self) {
         // unsafe {
-        //     ffi::clutter_actor_queue_relayout(self.as_ref().to_glib_none().0);
+        //     ffi::actor_queue_relayout(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn remove_action<P: Is<Action>>(&self, action: &P) {
         // unsafe {
-        //     ffi::clutter_actor_remove_action(
+        //     ffi::actor_remove_action(
         //         self.as_ref().to_glib_none().0,
         //         action.as_ref().to_glib_none().0,
         //     );
@@ -4340,7 +5268,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn remove_action_by_name(&self, name: &str) {
         // unsafe {
-        //     ffi::clutter_actor_remove_action_by_name(
+        //     ffi::actor_remove_action_by_name(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     );
@@ -4350,21 +5278,21 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn remove_all_children(&self) {
         // unsafe {
-        //     ffi::clutter_actor_remove_all_children(self.as_ref().to_glib_none().0);
+        //     ffi::actor_remove_all_children(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn remove_all_transitions(&self) {
         // unsafe {
-        //     ffi::clutter_actor_remove_all_transitions(self.as_ref().to_glib_none().0);
+        //     ffi::actor_remove_all_transitions(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn remove_child<P: Is<Actor>>(&self, child: &P) {
         // unsafe {
-        //     ffi::clutter_actor_remove_child(
+        //     ffi::actor_remove_child(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //     );
@@ -4374,14 +5302,14 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn remove_clip(&self) {
         // unsafe {
-        //     ffi::clutter_actor_remove_clip(self.as_ref().to_glib_none().0);
+        //     ffi::actor_remove_clip(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn remove_constraint<P: Is<Constraint>>(&self, constraint: &P) {
         // unsafe {
-        //     ffi::clutter_actor_remove_constraint(
+        //     ffi::actor_remove_constraint(
         //         self.as_ref().to_glib_none().0,
         //         constraint.as_ref().to_glib_none().0,
         //     );
@@ -4391,7 +5319,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn remove_constraint_by_name(&self, name: &str) {
         // unsafe {
-        //     ffi::clutter_actor_remove_constraint_by_name(
+        //     ffi::actor_remove_constraint_by_name(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     );
@@ -4401,7 +5329,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn remove_effect<P: Is<Effect>>(&self, effect: &P) {
         // unsafe {
-        //     ffi::clutter_actor_remove_effect(
+        //     ffi::actor_remove_effect(
         //         self.as_ref().to_glib_none().0,
         //         effect.as_ref().to_glib_none().0,
         //     );
@@ -4411,7 +5339,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn remove_effect_by_name(&self, name: &str) {
         // unsafe {
-        //     ffi::clutter_actor_remove_effect_by_name(
+        //     ffi::actor_remove_effect_by_name(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     );
@@ -4421,7 +5349,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn remove_transition(&self, name: &str) {
         // unsafe {
-        //     ffi::clutter_actor_remove_transition(
+        //     ffi::actor_remove_transition(
         //         self.as_ref().to_glib_none().0,
         //         name.to_glib_none().0,
         //     );
@@ -4431,7 +5359,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn replace_child<P: Is<Actor>, Q: Is<Actor>>(&self, old_child: &P, new_child: &Q) {
         // unsafe {
-        //     ffi::clutter_actor_replace_child(
+        //     ffi::actor_replace_child(
         //         self.as_ref().to_glib_none().0,
         //         old_child.as_ref().to_glib_none().0,
         //         new_child.as_ref().to_glib_none().0,
@@ -4442,21 +5370,21 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn restore_easing_state(&self) {
         // unsafe {
-        //     ffi::clutter_actor_restore_easing_state(self.as_ref().to_glib_none().0);
+        //     ffi::actor_restore_easing_state(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn save_easing_state(&self) {
         // unsafe {
-        //     ffi::clutter_actor_save_easing_state(self.as_ref().to_glib_none().0);
+        //     ffi::actor_save_easing_state(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn set_allocation(&self, box_: &ActorBox, flags: AllocationFlags) {
         // unsafe {
-        //     ffi::clutter_actor_set_allocation(
+        //     ffi::actor_set_allocation(
         //         self.as_ref().to_glib_none().0,
         //         box_.to_glib_none().0,
         //         flags.to_glib(),
@@ -4480,7 +5408,7 @@ impl<O: Is<Actor>> ActorExt for O {
         // };
 
         // unsafe {
-        //     ffi::clutter_actor_set_background_color(
+        //     ffi::actor_set_background_color(
         //         self.as_ref().to_glib_none().0,
         //         color.to_glib_none().0,
         //     );
@@ -4490,7 +5418,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_child_above_sibling<P: Is<Actor>, Q: Is<Actor>>(&self, child: &P, sibling: Option<&Q>) {
         // unsafe {
-        //     ffi::clutter_actor_set_child_above_sibling(
+        //     ffi::actor_set_child_above_sibling(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         sibling.map(|p| p.as_ref()).to_glib_none().0,
@@ -4501,7 +5429,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_child_at_index<P: Is<Actor>>(&self, child: &P, index_: i32) {
         // unsafe {
-        //     ffi::clutter_actor_set_child_at_index(
+        //     ffi::actor_set_child_at_index(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         index_,
@@ -4512,7 +5440,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_child_below_sibling<P: Is<Actor>, Q: Is<Actor>>(&self, child: &P, sibling: Option<&Q>) {
         // unsafe {
-        //     ffi::clutter_actor_set_child_below_sibling(
+        //     ffi::actor_set_child_below_sibling(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         sibling.map(|p| p.as_ref()).to_glib_none().0,
@@ -4523,7 +5451,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_child_transform(&self, transform: Option<&Matrix>) {
         // unsafe {
-        //     ffi::clutter_actor_set_child_transform(
+        //     ffi::actor_set_child_transform(
         //         self.as_ref().to_glib_none().0,
         //         transform.to_glib_none().0,
         //     );
@@ -4533,14 +5461,14 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_clip(&self, xoff: f32, yoff: f32, width: f32, height: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_clip(self.as_ref().to_glib_none().0, xoff, yoff, width, height);
+        //     ffi::actor_set_clip(self.as_ref().to_glib_none().0, xoff, yoff, width, height);
         // }
         unimplemented!()
     }
 
     fn set_clip_to_allocation(&self, clip_set: bool) {
         // unsafe {
-        //     ffi::clutter_actor_set_clip_to_allocation(
+        //     ffi::actor_set_clip_to_allocation(
         //         self.as_ref().to_glib_none().0,
         //         clip_set.to_glib(),
         //     );
@@ -4550,7 +5478,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_content<P: Is<Content>>(&self, content: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_actor_set_content(
+        //     ffi::actor_set_content(
         //         self.as_ref().to_glib_none().0,
         //         content.map(|p| p.as_ref()).to_glib_none().0,
         //     );
@@ -4560,7 +5488,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_content_gravity(&self, gravity: ContentGravity) {
         // unsafe {
-        //     ffi::clutter_actor_set_content_gravity(
+        //     ffi::actor_set_content_gravity(
         //         self.as_ref().to_glib_none().0,
         //         gravity.to_glib(),
         //     );
@@ -4570,14 +5498,14 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_content_repeat(&self, repeat: ContentRepeat) {
         // unsafe {
-        //     ffi::clutter_actor_set_content_repeat(self.as_ref().to_glib_none().0, repeat.to_glib());
+        //     ffi::actor_set_content_repeat(self.as_ref().to_glib_none().0, repeat.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_content_scaling_filters(&self, min_filter: ScalingFilter, mag_filter: ScalingFilter) {
         // unsafe {
-        //     ffi::clutter_actor_set_content_scaling_filters(
+        //     ffi::actor_set_content_scaling_filters(
         //         self.as_ref().to_glib_none().0,
         //         min_filter.to_glib(),
         //         mag_filter.to_glib(),
@@ -4588,28 +5516,28 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_easing_delay(&self, msecs: u32) {
         // unsafe {
-        //     ffi::clutter_actor_set_easing_delay(self.as_ref().to_glib_none().0, msecs);
+        //     ffi::actor_set_easing_delay(self.as_ref().to_glib_none().0, msecs);
         // }
         unimplemented!()
     }
 
     fn set_easing_duration(&self, msecs: u32) {
         // unsafe {
-        //     ffi::clutter_actor_set_easing_duration(self.as_ref().to_glib_none().0, msecs);
+        //     ffi::actor_set_easing_duration(self.as_ref().to_glib_none().0, msecs);
         // }
         unimplemented!()
     }
 
     fn set_easing_mode(&self, mode: AnimationMode) {
         // unsafe {
-        //     ffi::clutter_actor_set_easing_mode(self.as_ref().to_glib_none().0, mode.to_glib());
+        //     ffi::actor_set_easing_mode(self.as_ref().to_glib_none().0, mode.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_fixed_position_set(&self, is_set: bool) {
         // unsafe {
-        //     ffi::clutter_actor_set_fixed_position_set(
+        //     ffi::actor_set_fixed_position_set(
         //         self.as_ref().to_glib_none().0,
         //         is_set.to_glib(),
         //     );
@@ -4619,21 +5547,21 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_flags(&self, flags: ActorFlags) {
         // unsafe {
-        //     ffi::clutter_actor_set_flags(self.as_ref().to_glib_none().0, flags.to_glib());
+        //     ffi::actor_set_flags(self.as_ref().to_glib_none().0, flags.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_height(&self, height: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_height(self.as_ref().to_glib_none().0, height);
+        //     ffi::actor_set_height(self.as_ref().to_glib_none().0, height);
         // }
         unimplemented!()
     }
 
     fn set_layout_manager<P: Is<LayoutManager>>(&self, manager: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_actor_set_layout_manager(
+        //     ffi::actor_set_layout_manager(
         //         self.as_ref().to_glib_none().0,
         //         manager.map(|p| p.as_ref()).to_glib_none().0,
         //     );
@@ -4643,49 +5571,49 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_margin(&self, margin: &Margin) {
         // unsafe {
-        //     ffi::clutter_actor_set_margin(self.as_ref().to_glib_none().0, margin.to_glib_none().0);
+        //     ffi::actor_set_margin(self.as_ref().to_glib_none().0, margin.to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn set_margin_bottom(&self, margin: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_margin_bottom(self.as_ref().to_glib_none().0, margin);
+        //     ffi::actor_set_margin_bottom(self.as_ref().to_glib_none().0, margin);
         // }
         unimplemented!()
     }
 
     fn set_margin_left(&self, margin: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_margin_left(self.as_ref().to_glib_none().0, margin);
+        //     ffi::actor_set_margin_left(self.as_ref().to_glib_none().0, margin);
         // }
         unimplemented!()
     }
 
     fn set_margin_right(&self, margin: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_margin_right(self.as_ref().to_glib_none().0, margin);
+        //     ffi::actor_set_margin_right(self.as_ref().to_glib_none().0, margin);
         // }
         unimplemented!()
     }
 
     fn set_margin_top(&self, margin: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_margin_top(self.as_ref().to_glib_none().0, margin);
+        //     ffi::actor_set_margin_top(self.as_ref().to_glib_none().0, margin);
         // }
         unimplemented!()
     }
 
     fn set_name(&self, name: &str) {
         // unsafe {
-        //     ffi::clutter_actor_set_name(self.as_ref().to_glib_none().0, name.to_glib_none().0);
+        //     ffi::actor_set_name(self.as_ref().to_glib_none().0, name.to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn set_offscreen_redirect(&self, redirect: OffscreenRedirect) {
         // unsafe {
-        //     ffi::clutter_actor_set_offscreen_redirect(
+        //     ffi::actor_set_offscreen_redirect(
         //         self.as_ref().to_glib_none().0,
         //         redirect.to_glib(),
         //     );
@@ -4695,49 +5623,49 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_opacity(&self, opacity: u8) {
         // unsafe {
-        //     ffi::clutter_actor_set_opacity(self.as_ref().to_glib_none().0, opacity);
+        //     ffi::actor_set_opacity(self.as_ref().to_glib_none().0, opacity);
         // }
         unimplemented!()
     }
 
     fn set_pivot_point(&self, pivot_x: f32, pivot_y: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_pivot_point(self.as_ref().to_glib_none().0, pivot_x, pivot_y);
+        //     ffi::actor_set_pivot_point(self.as_ref().to_glib_none().0, pivot_x, pivot_y);
         // }
         unimplemented!()
     }
 
     fn set_pivot_point_z(&self, pivot_z: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_pivot_point_z(self.as_ref().to_glib_none().0, pivot_z);
+        //     ffi::actor_set_pivot_point_z(self.as_ref().to_glib_none().0, pivot_z);
         // }
         unimplemented!()
     }
 
     fn set_position(&self, x: f32, y: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_position(self.as_ref().to_glib_none().0, x, y);
+        //     ffi::actor_set_position(self.as_ref().to_glib_none().0, x, y);
         // }
         unimplemented!()
     }
 
     fn set_reactive(&self, reactive: bool) {
         // unsafe {
-        //     ffi::clutter_actor_set_reactive(self.as_ref().to_glib_none().0, reactive.to_glib());
+        //     ffi::actor_set_reactive(self.as_ref().to_glib_none().0, reactive.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_request_mode(&self, mode: RequestMode) {
         // unsafe {
-        //     ffi::clutter_actor_set_request_mode(self.as_ref().to_glib_none().0, mode.to_glib());
+        //     ffi::actor_set_request_mode(self.as_ref().to_glib_none().0, mode.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_rotation_angle(&self, axis: RotateAxis, angle: f64) {
         // unsafe {
-        //     ffi::clutter_actor_set_rotation_angle(
+        //     ffi::actor_set_rotation_angle(
         //         self.as_ref().to_glib_none().0,
         //         axis.to_glib(),
         //         angle,
@@ -4748,28 +5676,28 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_scale(&self, scale_x: f64, scale_y: f64) {
         // unsafe {
-        //     ffi::clutter_actor_set_scale(self.as_ref().to_glib_none().0, scale_x, scale_y);
+        //     ffi::actor_set_scale(self.as_ref().to_glib_none().0, scale_x, scale_y);
         // }
         unimplemented!()
     }
 
     fn set_scale_z(&self, scale_z: f64) {
         // unsafe {
-        //     ffi::clutter_actor_set_scale_z(self.as_ref().to_glib_none().0, scale_z);
+        //     ffi::actor_set_scale_z(self.as_ref().to_glib_none().0, scale_z);
         // }
         unimplemented!()
     }
 
     fn set_size(&self, width: f32, height: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_size(self.as_ref().to_glib_none().0, width, height);
+        //     ffi::actor_set_size(self.as_ref().to_glib_none().0, width, height);
         // }
         unimplemented!()
     }
 
     fn set_text_direction(&self, text_dir: TextDirection) {
         // unsafe {
-        //     ffi::clutter_actor_set_text_direction(
+        //     ffi::actor_set_text_direction(
         //         self.as_ref().to_glib_none().0,
         //         text_dir.to_glib(),
         //     );
@@ -4779,7 +5707,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_transform(&self, transform: Option<&Matrix>) {
         // unsafe {
-        //     ffi::clutter_actor_set_transform(
+        //     ffi::actor_set_transform(
         //         self.as_ref().to_glib_none().0,
         //         transform.to_glib_none().0,
         //     );
@@ -4789,7 +5717,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_translation(&self, translate_x: f32, translate_y: f32, translate_z: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_translation(
+        //     ffi::actor_set_translation(
         //         self.as_ref().to_glib_none().0,
         //         translate_x,
         //         translate_y,
@@ -4801,63 +5729,63 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn set_width(&self, width: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_width(self.as_ref().to_glib_none().0, width);
+        //     ffi::actor_set_width(self.as_ref().to_glib_none().0, width);
         // }
         unimplemented!()
     }
 
     fn set_x(&self, x: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_x(self.as_ref().to_glib_none().0, x);
+        //     ffi::actor_set_x(self.as_ref().to_glib_none().0, x);
         // }
         unimplemented!()
     }
 
     fn set_x_align(&self, x_align: ActorAlign) {
         // unsafe {
-        //     ffi::clutter_actor_set_x_align(self.as_ref().to_glib_none().0, x_align.to_glib());
+        //     ffi::actor_set_x_align(self.as_ref().to_glib_none().0, x_align.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_x_expand(&self, expand: bool) {
         // unsafe {
-        //     ffi::clutter_actor_set_x_expand(self.as_ref().to_glib_none().0, expand.to_glib());
+        //     ffi::actor_set_x_expand(self.as_ref().to_glib_none().0, expand.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_y(&self, y: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_y(self.as_ref().to_glib_none().0, y);
+        //     ffi::actor_set_y(self.as_ref().to_glib_none().0, y);
         // }
         unimplemented!()
     }
 
     fn set_y_align(&self, y_align: ActorAlign) {
         // unsafe {
-        //     ffi::clutter_actor_set_y_align(self.as_ref().to_glib_none().0, y_align.to_glib());
+        //     ffi::actor_set_y_align(self.as_ref().to_glib_none().0, y_align.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_y_expand(&self, expand: bool) {
         // unsafe {
-        //     ffi::clutter_actor_set_y_expand(self.as_ref().to_glib_none().0, expand.to_glib());
+        //     ffi::actor_set_y_expand(self.as_ref().to_glib_none().0, expand.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_z_position(&self, z_position: f32) {
         // unsafe {
-        //     ffi::clutter_actor_set_z_position(self.as_ref().to_glib_none().0, z_position);
+        //     ffi::actor_set_z_position(self.as_ref().to_glib_none().0, z_position);
         // }
         unimplemented!()
     }
 
     fn should_pick_paint(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_actor_should_pick_paint(
+        //     from_glib(ffi::actor_should_pick_paint(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -4866,7 +5794,7 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn show(&self) {
         // unsafe {
-        //     ffi::clutter_actor_show(self.as_ref().to_glib_none().0);
+        //     ffi::actor_show(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
@@ -4875,7 +5803,7 @@ impl<O: Is<Actor>> ActorExt for O {
         // unsafe {
         //     let mut x_out = mem::MaybeUninit::uninit();
         //     let mut y_out = mem::MaybeUninit::uninit();
-        //     let ret = from_glib(ffi::clutter_actor_transform_stage_point(
+        //     let ret = from_glib(ffi::actor_transform_stage_point(
         //         self.as_ref().to_glib_none().0,
         //         x,
         //         y,
@@ -4895,14 +5823,14 @@ impl<O: Is<Actor>> ActorExt for O {
 
     fn unmap(&self) {
         // unsafe {
-        //     ffi::clutter_actor_unmap(self.as_ref().to_glib_none().0);
+        //     ffi::actor_unmap(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn unset_flags(&self, flags: ActorFlags) {
         // unsafe {
-        //     ffi::clutter_actor_unset_flags(self.as_ref().to_glib_none().0, flags.to_glib());
+        //     ffi::actor_unset_flags(self.as_ref().to_glib_none().0, flags.to_glib());
         // }
         unimplemented!()
     }
diff --git a/src/pure/actor_box.rs b/src/pure/actor_box.rs
index 03efd9b..5e676bc 100644
--- a/src/pure/actor_box.rs
+++ b/src/pure/actor_box.rs
@@ -1,21 +1,21 @@
 use super::Vertex;
 
-// * ActorBox:
-// * @x1: X coordinate of the top left corner
-// * @y1: Y coordinate of the top left corner
-// * @x2: X coordinate of the bottom right corner
-// * @y2: Y coordinate of the bottom right corner
-// *
-// * Bounding box of an actor. The coordinates of the top left and right bottom
-// * corners of an actor. The coordinates of the two points are expressed in
-// * pixels with sub-pixel precision
-#[derive(Debug, PartialOrd)] // Hash
+// ActorBox:
+// @x1: X coordinate of the top left corner
+// @y1: Y coordinate of the top left corner
+// @x2: X coordinate of the bottom right corner
+// @y2: Y coordinate of the bottom right corner
+//
+// Bounding box of an actor. The coordinates of the top left and right bottom
+// corners of an actor. The coordinates of the two points are expressed in
+// pixels with sub-pixel precision
+#[derive(Default, Debug, PartialOrd, Clone, Copy)] // Hash
 pub struct ActorBox {
-    x1: f32,
-    y1: f32,
+    pub x1: f32,
+    pub y1: f32,
 
-    x2: f32,
-    y2: f32,
+    pub x2: f32,
+    pub y2: f32,
 }
 
 impl ActorBox {
@@ -75,8 +75,7 @@ impl ActorBox {
     ///
     /// `true` if the passed `ActorBox` are equal
     fn equal(&self, other: &ActorBox) -> bool {
-        use std::f32::EPSILON;
-        let error_margin = EPSILON;
+        let error_margin = std::f32::EPSILON;
         (self.x1 - other.x1).abs() < error_margin && (self.y1 - other.y1).abs() < error_margin &&
         (self.x2 - other.x2).abs() < error_margin && (self.y2 - other.y2).abs() < error_margin
     }
diff --git a/src/pure/actor_canvas.rs b/src/pure/actor_canvas.rs
index ecabac0..f5bc29b 100644
--- a/src/pure/actor_canvas.rs
+++ b/src/pure/actor_canvas.rs
@@ -1,38 +1,43 @@
-use super::{Content, HandlerId};
-use crate::prelude::*;
+#![allow(unused_mut)]
 use std::fmt;
-// use cairo::Context;
-
-// * Canvas:
-// *
-// * The #Canvas structure contains
-// * private data and should only be accessed using the provided
-// * API.
-// * @Title: Canvas
-// * @Short_Description: Content for 2D painting
-// * @See_Also: #Content
-// *
-// * The #Canvas class is a #Content implementation that allows
-// * drawing using the Cairo API on a 2D surface.
-// *
-// * In order to draw on a #Canvas, you should connect a handler to the
-// * #Canvas::draw signal; the signal will receive a #cairo_t context
-// * that can be used to draw. #Canvas will emit the #Canvas::draw
-// * signal when invalidated using clutter_content_invalidate().
-// *
-// * See [canvas.c](https://git.gnome.org/browse/clutter/tree/examples/canvas.c?h=clutter-1.18)
-// * for an example of how to use #Canvas.
+
+use dx::platform::core::{Texture, Bitmap};
+
+use crate::prelude::*;
+// use crate::Canvas;
+
+use super::{Actor, Content, HandlerId};
+
+// Canvas:
+//
+// The #Canvas structure contains
+// private data and should only be accessed using the provided
+// API.
+// @Title: Canvas
+// @Short_Description: Content for 2D painting
+// @See_Also: #Content
+//
+// The #Canvas class is a #Content implementation that allows
+// drawing using the Cairo API on a 2D surface.
+//
+// In order to draw on a #Canvas, you should connect a handler to the
+// #Canvas::draw signal; the signal will receive a #cairo_t context
+// that can be used to draw. #Canvas will emit the #Canvas::draw
+// signal when invalidated using content_invalidate().
+//
+// See [canvas.c](https://git.gnome.org/browse/clutter/tree/examples/canvas.c?h=1.18)
+// for an example of how to use #Canvas.
 // @implements Content
+#[derive(Debug)]
 pub struct ActorCanvas {
-    cr: cairo::Context,
+    // cr: cairo::Context,
 
-    width: u32,
-    height: u32,
+    content: Content,
 
-    texture: dx::pure::Texture,
+    texture: Texture,
     dirty: bool,
 
-    buffer: dx::pure::Bitmap,
+    buffer: Bitmap,
 
     scale_factor: u32,
     scale_factor_set: bool,
@@ -59,6 +64,24 @@ impl ActorCanvas {
 }
 
 impl Object for ActorCanvas {}
+
+impl Is<Actor> for ActorCanvas {}
+
+impl AsRef<Actor> for ActorCanvas {
+    fn as_ref(&self) -> &Actor {
+        // &self.content
+        unimplemented!()
+    }
+}
+
+impl Is<Content> for ActorCanvas {}
+
+impl AsRef<Content> for ActorCanvas {
+    fn as_ref(&self) -> &Content {
+        &self.content
+    }
+}
+
 impl Is<ActorCanvas> for ActorCanvas {}
 
 impl AsRef<ActorCanvas> for ActorCanvas {
@@ -119,7 +142,7 @@ pub trait ActorCanvasExt: 'static {
     ///
     /// this function returns `true` if the size change
     ///  caused a content invalidation, and `false` otherwise
-    fn set_size(&self, width: u32, height: u32) -> bool;
+    fn set_content_size(&self, width: u32, height: u32) -> bool;
 
     /// The height of the canvas.
     fn get_property_height(&self) -> u32;
@@ -140,27 +163,27 @@ pub trait ActorCanvasExt: 'static {
     /// The width of the canvas.
     fn set_property_width(&self, width: u32);
 
-    /// The `Canvas::draw` signal is emitted each time a canvas is
-    /// invalidated.
-    ///
-    /// It is safe to connect multiple handlers to this signal: each
-    /// handler invocation will be automatically protected by `cairo_save`
-    /// and `cairo_restore` pairs.
-    /// ## `cr`
-    /// the Cairo context used to draw
-    /// ## `width`
-    /// the width of the `canvas`
-    /// ## `height`
-    /// the height of the `canvas`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the signal emission should stop, and
-    ///  `false` otherwise
-    fn connect_draw<F: Fn(&Self, &cairo::Context, u32, u32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId;
+    // /// The `Canvas::draw` signal is emitted each time a canvas is
+    // /// invalidated.
+    // ///
+    // /// It is safe to connect multiple handlers to this signal: each
+    // /// handler invocation will be automatically protected by `cairo_save`
+    // /// and `cairo_restore` pairs.
+    // /// ## `cr`
+    // /// the Cairo context used to draw
+    // /// ## `width`
+    // /// the width of the `canvas`
+    // /// ## `height`
+    // /// the height of the `canvas`
+    // ///
+    // /// # Returns
+    // ///
+    // /// `true` if the signal emission should stop, and
+    // ///  `false` otherwise
+    // fn connect_draw<F: Fn(&Self, &Canvas, u32, u32) -> bool + 'static>(
+    //     &self,
+    //     f: F,
+    // ) -> HandlerId;
 
     fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
@@ -173,87 +196,104 @@ pub trait ActorCanvasExt: 'static {
 
 impl<O: Is<ActorCanvas>> ActorCanvasExt for O {
     fn get_scale_factor(&self) -> i32 {
-        // let canvas = self.as_ref();
-        // if !canvas.scale_factor_set {
-        //     return -1;
-        // }
+        let actor_canvas = self.as_ref();
 
-        // canvas.scale_factor
-        unimplemented!()
+        if !actor_canvas.scale_factor_set {
+            return -1;
+        }
+
+        actor_canvas.scale_factor as i32
     }
 
     fn set_scale_factor(&self, scale: i32) {
-        // let mut canvas = self.as_ref();
-        // if scale < 0 {
-        //     if !canvas.scale_factor_set {
-        //         return
-        //     }
-        //     canvas.scale_factor_set = false;
-        //     canvas.scale_factor = scale;
-        // } else {
-        //     if canvas.scale_factor_set && canvas.scale_factor == scale {
-        //         return
-        //     }
-        //     canvas.scale_factor_set = true;
-        //     canvas.scale_factor = scale;
-        // }
-        // // invalidate // TODO;
+        let mut actor_canvas = self.as_ref();
+
+        if scale < 0 {
+            if !actor_canvas.scale_factor_set {
+                return
+            }
+            // actor_canvas.scale_factor_set = false;
+            // actor_canvas.scale_factor = scale as u32;
+        } else {
+            if actor_canvas.scale_factor_set && actor_canvas.scale_factor as i32 == scale {
+                return
+            }
+            // actor_canvas.scale_factor_set = true;
+            // actor_canvas.scale_factor = scale as u32;
+        }
+        // invalidate // TODO;
         unimplemented!()
     }
 
-    fn set_size(&self, width: u32, height: u32) -> bool {
-        // let canvas = self.as_ref();
-        // let mut width_changed = false;
-        // let mut height_changed = false;
+    fn set_content_size(&self, width: u32, height: u32) -> bool {
+        let actor_canvas = self.as_ref();
 
-        // if canvas.width != width {
-        //     canvas.width = width;
-        //     width_changed = true;
-        // }
+        let mut width_changed = false;
+        let mut height_changed = false;
 
-        // if canvas.height != height {
-        //     canvas.height = height;
-        //     height_changed = true;
-        // }
+        if actor_canvas.content.width != width {
+            // actor_canvas.content.width = width;
+            width_changed = true;
+        }
 
-        // if width_changed || height_changed {
-        //     // invalidate // TODO:
-        //     return true;
-        // }
+        if actor_canvas.content.height != height {
+            // actor_canvas.content.height = height;
+            height_changed = true;
+        }
+
+        if width_changed || height_changed {
+            // invalidate // TODO:
+            return true;
+        }
 
         // return false;
         unimplemented!()
     }
 
     fn get_property_height(&self) -> u32 {
-        let canvas = self.as_ref();
-        canvas.height
+        let actor_canvas = self.as_ref();
+
+        actor_canvas.content.height
     }
 
     fn set_property_height(&self, height: u32) {
-        unimplemented!()
+        let mut actor_canvas = self.as_ref();
+        
+        if actor_canvas.content.height != height {
+            // actor_canvas.content.height = height;
+            // invalidate // TODO:
+            unimplemented!()
+        }
     }
 
     fn get_property_scale_factor_set(&self) -> bool {
-        let canvas = self.as_ref();
-        canvas.scale_factor_set
+        let actor_canvas = self.as_ref();
+
+        actor_canvas.scale_factor_set
     }
 
     fn get_property_width(&self) -> u32 {
-        let canvas = self.as_ref();
-        canvas.width
+        let actor_canvas = self.as_ref();
+
+        actor_canvas.content.width
     }
 
     fn set_property_width(&self, width: u32) {
-        unimplemented!()
+        let mut actor_canvas = self.as_ref();
+        
+        if actor_canvas.content.width != width {
+            // actor_canvas.content.width = width;
+            // invalidate // TODO:
+            unimplemented!()
+        }
     }
 
-    fn connect_draw<F: Fn(&Self, &cairo::Context, u32, u32) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
-        unimplemented!()
-    }
+    // fn connect_draw<F: Fn(&Self, &Canvas, u32, u32) -> bool + 'static>(
+    //     &self,
+    //     f: F,
+    // ) -> HandlerId {
+    //     unimplemented!()
+    // }
 
     fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
diff --git a/src/pure/align_constraint.rs b/src/pure/align_constraint.rs
index c4890db..915e100 100644
--- a/src/pure/align_constraint.rs
+++ b/src/pure/align_constraint.rs
@@ -2,15 +2,15 @@ use super::{Actor, AlignAxis};
 use crate::prelude::*;
 use std::fmt;
 
-// * AlignConstraint:
-// *
-// * #AlignConstraint is an opaque structure
-// * whose members cannot be directly accesses
-// * @Short_Description: A constraint aligning the position of an actor
-// *
-// * #AlignConstraint is a #Constraint that aligns the position
-// * of the #Actor to which it is applied to the size of another
-// * #Actor using an alignment factor
+// AlignConstraint:
+//
+// #AlignConstraint is an opaque structure
+// whose members cannot be directly accesses
+// @Short_Description: A constraint aligning the position of an actor
+//
+// #AlignConstraint is a #Constraint that aligns the position
+// of the #Actor to which it is applied to the size of another
+// #Actor using an alignment factor
 // @extends Constraint, ActorMeta,
 #[derive(Debug, Clone)]
 pub struct AlignConstraint {
diff --git a/src/pure/alpha.rs b/src/pure/alpha.rs
index 3830d54..367aae1 100644
--- a/src/pure/alpha.rs
+++ b/src/pure/alpha.rs
@@ -1,24 +1,24 @@
-use crate::prelude::*;
-use std::fmt;
-// use crate::Scriptable;
+// use crate::prelude::*;
+// use std::fmt;
+// // use crate::Scriptable;
 
-// TODO: @implements Scriptable
-#[derive(Debug, Clone)]
-pub struct Alpha {}
+// // TODO: @implements Scriptable
+// #[derive(Debug, Clone)]
+// pub struct Alpha {}
 
-impl Alpha {}
+// impl Alpha {}
 
-impl Object for Alpha {}
-impl Is<Alpha> for Alpha {}
+// impl Object for Alpha {}
+// impl Is<Alpha> for Alpha {}
 
-impl AsRef<Alpha> for Alpha {
-    fn as_ref(&self) -> &Alpha {
-        self
-    }
-}
+// impl AsRef<Alpha> for Alpha {
+//     fn as_ref(&self) -> &Alpha {
+//         self
+//     }
+// }
 
-impl fmt::Display for Alpha {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Alpha")
-    }
-}
+// impl fmt::Display for Alpha {
+//     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+//         write!(f, "Alpha")
+//     }
+// }
diff --git a/src/pure/animatable.rs b/src/pure/animatable.rs
index 1a48f12..04dae63 100644
--- a/src/pure/animatable.rs
+++ b/src/pure/animatable.rs
@@ -1,39 +1,41 @@
+#![allow(unused_imports)]
 use crate::prelude::*;
 use super::Interval;
 use std::fmt;
 
-// * AnimatableIface:
-// * @animate_property: virtual function for custom interpolation of a
-// *   property. This virtual function is deprecated
-// * @find_property: virtual function for retrieving the #GParamSpec of
-// *   an animatable property
-// * @get_initial_state: virtual function for retrieving the initial
-// *   state of an animatable property
-// * @set_final_state: virtual function for setting the state of an
-// *   animatable property
-// * @interpolate_value: virtual function for interpolating the progress
-// *   of a property
-// *
-// * Base interface for #GObject<!-- -->s that can be animated by a
-// * a #Animation.
-// * @short_description: Interface for animatable classes
-// *
-// * #Animatable is an interface that allows a #GObject class
-// * to control how a #Animation will animate a property.
-// *
-// * Each #Animatable should implement the
-// * #AnimatableIface.interpolate_property() virtual function of the
-// * interface to compute the animation state between two values of an interval
-// * depending on a progress factor, expressed as a floating point value.
-// *
-// * If a #Animatable is animated by a #Animation
-// * instance, the #Animation will call
-// * clutter_animatable_interpolate_property() passing the name of the
-// * currently animated property; the values interval; and the progress factor.
-// * The #Animatable implementation should return the computed value for
-// * the animated
-// * property.
+// AnimatableIface:
+// @animate_property: virtual function for custom interpolation of a
+//   property. This virtual function is deprecated
+// @find_property: virtual function for retrieving the #GParamSpec of
+//   an animatable property
+// @get_initial_state: virtual function for retrieving the initial
+//   state of an animatable property
+// @set_final_state: virtual function for setting the state of an
+//   animatable property
+// @interpolate_value: virtual function for interpolating the progress
+//   of a property
+//
+// Base interface for #GObject<!-- -->s that can be animated by a
+// a #Animation.
+// @short_description: Interface for animatable classes
+//
+// #Animatable is an interface that allows a #GObject class
+// to control how a #Animation will animate a property.
+//
+// Each #Animatable should implement the
+// #AnimatableIface.interpolate_property() virtual function of the
+// interface to compute the animation state between two values of an interval
+// depending on a progress factor, expressed as a floating point value.
+//
+// If a #Animatable is animated by a #Animation
+// instance, the #Animation will call
+// animatable_interpolate_property() passing the name of the
+// currently animated property; the values interval; and the progress factor.
+// The #Animatable implementation should return the computed value for
+// the animated
+// property.
 
+// Animatable ------------- IS INTERFACE ----------------
 #[derive(Debug, Clone)]
 pub struct Animatable {
 
@@ -54,83 +56,83 @@ impl AsRef<Animatable> for Animatable {
 ///
 /// [`Actor`](struct.Actor.html), [`Animatable`](struct.Animatable.html), [`Box`](struct.Box.html), [`Clone`](struct.Clone.html), [`Group`](struct.Group.html), [`Rectangle`](struct.Rectangle.html), [`ScrollActor`](struct.ScrollActor.html), [`Stage`](struct.Stage.html), [`Text`](struct.Text.html), [`Texture`](struct.Texture.html)
 pub trait AnimatableExt: 'static {
-    /// Finds the `gobject::ParamSpec` for `property_name`
-    /// ## `property_name`
-    /// the name of the animatable property to find
-    ///
-    /// # Returns
-    ///
-    /// The `gobject::ParamSpec` for the given property
-    ///  or `None`
-    fn find_property(&self, property_name: &str) -> Option<glib::ParamSpec>;
+    // /// Finds the `gobject::ParamSpec` for `property_name`
+    // /// ## `property_name`
+    // /// the name of the animatable property to find
+    // ///
+    // /// # Returns
+    // ///
+    // /// The `gobject::ParamSpec` for the given property
+    // ///  or `None`
+    // fn find_property(&self, property_name: &str) -> Option<glib::ParamSpec>;
 
-    /// Retrieves the current state of `property_name` and sets `value` with it
-    /// ## `property_name`
-    /// the name of the animatable property to retrieve
-    /// ## `value`
-    /// a `gobject::Value` initialized to the type of the property to retrieve
-    fn get_initial_state(&self, property_name: &str, value: &mut glib::Value);
+    // /// Retrieves the current state of `property_name` and sets `value` with it
+    // /// ## `property_name`
+    // /// the name of the animatable property to retrieve
+    // /// ## `value`
+    // /// a `gobject::Value` initialized to the type of the property to retrieve
+    // fn get_initial_state(&self, property_name: &str, value: &mut glib::Value);
 
-    /// Asks a `Animatable` implementation to interpolate a
-    /// a named property between the initial and final values of
-    /// a `Interval`, using `progress` as the interpolation
-    /// value, and store the result inside `value`.
-    ///
-    /// This function should be used for every property animation
-    /// involving `Animatable`<!-- -->s.
-    ///
-    /// This function replaces `Animatable::animate_property`.
-    /// ## `property_name`
-    /// the name of the property to interpolate
-    /// ## `interval`
-    /// a `Interval` with the animation range
-    /// ## `progress`
-    /// the progress to use to interpolate between the
-    ///  initial and final values of the `interval`
-    /// ## `value`
-    /// return location for an initialized `gobject::Value`
-    ///  using the same type of the `interval`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the interpolation was successful,
-    ///  and `false` otherwise
-    fn interpolate_value<P: Is<Interval>>(
-        &self,
-        property_name: &str,
-        interval: &P,
-        progress: f64,
-    ) -> Option<glib::Value>;
+    // /// Asks a `Animatable` implementation to interpolate a
+    // /// a named property between the initial and final values of
+    // /// a `Interval`, using `progress` as the interpolation
+    // /// value, and store the result inside `value`.
+    // ///
+    // /// This function should be used for every property animation
+    // /// involving `Animatable`<!-- -->s.
+    // ///
+    // /// This function replaces `Animatable::animate_property`.
+    // /// ## `property_name`
+    // /// the name of the property to interpolate
+    // /// ## `interval`
+    // /// a `Interval` with the animation range
+    // /// ## `progress`
+    // /// the progress to use to interpolate between the
+    // ///  initial and final values of the `interval`
+    // /// ## `value`
+    // /// return location for an initialized `gobject::Value`
+    // ///  using the same type of the `interval`
+    // ///
+    // /// # Returns
+    // ///
+    // /// `true` if the interpolation was successful,
+    // ///  and `false` otherwise
+    // fn interpolate_value<P: Is<Interval>>(
+    //     &self,
+    //     property_name: &str,
+    //     interval: &P,
+    //     progress: f64,
+    // ) -> Option<glib::Value>;
 
-    /// Sets the current state of `property_name` to `value`
-    /// ## `property_name`
-    /// the name of the animatable property to set
-    /// ## `value`
-    /// the value of the animatable property to set
-    fn set_final_state(&self, property_name: &str, value: &glib::Value);
+    // /// Sets the current state of `property_name` to `value`
+    // /// ## `property_name`
+    // /// the name of the animatable property to set
+    // /// ## `value`
+    // /// the value of the animatable property to set
+    // fn set_final_state(&self, property_name: &str, value: &glib::Value);
 }
 
 impl<O: Is<Animatable>> AnimatableExt for O {
-    fn find_property(&self, property_name: &str) -> Option<glib::ParamSpec> {
-        unimplemented!()
-    }
+    // fn find_property(&self, property_name: &str) -> Option<glib::ParamSpec> {
+    //     unimplemented!()
+    // }
 
-    fn get_initial_state(&self, property_name: &str, value: &mut glib::Value) {
-        unimplemented!()
-    }
+    // fn get_initial_state(&self, property_name: &str, value: &mut glib::Value) {
+    //     unimplemented!()
+    // }
 
-    fn interpolate_value<P: Is<Interval>>(
-        &self,
-        property_name: &str,
-        interval: &P,
-        progress: f64,
-    ) -> Option<glib::Value> {
-        unimplemented!()
-    }
+    // fn interpolate_value<P: Is<Interval>>(
+    //     &self,
+    //     property_name: &str,
+    //     interval: &P,
+    //     progress: f64,
+    // ) -> Option<glib::Value> {
+    //     unimplemented!()
+    // }
 
-    fn set_final_state(&self, property_name: &str, value: &glib::Value) {
-        unimplemented!()
-    }
+    // fn set_final_state(&self, property_name: &str, value: &glib::Value) {
+    //     unimplemented!()
+    // }
 }
 
 impl fmt::Display for Animatable {
diff --git a/src/pure/backend.rs b/src/pure/backend.rs
index 69dfb79..a1d9d55 100644
--- a/src/pure/backend.rs
+++ b/src/pure/backend.rs
@@ -1,53 +1,57 @@
-use super::{HandlerId, MainContext, Settings};
 use std::{cell::RefCell, fmt};
 
+use dx::platform::core::{Context, Display, Driver, Onscreen, Renderer};
+
+use super::{HandlerId, MainContext, Settings};
+
 struct BackendProps {
-    dx_renderer: Option<dx::pure::Renderer>,
-    dx_display: Option<dx::pure::Display>,
-    dx_context: Option<dx::pure::Context>,
+    dx_renderer: Option<Renderer>,
+    dx_display: Option<Display>,
+    dx_context: Option<Context>,
     // dx_source: GSource
-    dummy_onscreen: Option<dx::pure::Onscreen>,
-
-    // device_manager: Option<dx::pure::DeviceManager>,
-    font_options: Option<cairo::FontOptions>,
+    dummy_onscreen: Option<Onscreen>,
 
+    // device_manager: Option<dx::DeviceManager>,
+    // font_options: Option<cairo::FontOptions>,
     font_name: Option<String>,
 
     units_per_em: f32,
     units_serial: i32,
     // event_translators: Vec<>
 }
-// * @short_description: Backend abstraction
-// *
-// *  can be compiled against different backends. Each backend
-// * has to implement a set of functions, in order to be used by .
-// *
-// * #Backend is the base class abstracting the various implementation;
-// * it provides a basic API to query the backend for generic information
-// * and settings.
+// @short_description: Backend abstraction
+//
+//  can be compiled against different backends. Each backend
+// has to implement a set of functions, in order to be used by .
+//
+// #Backend is the base class abstracting the various implementation;
+// it provides a basic API to query the backend for generic information
+// and settings.
 pub struct Backend {
     props: RefCell<BackendProps>,
 }
 
 impl Backend {
-    // * clutter_backend_get_dx_context:
-    // * @backend: a #Backend
-    // *
-    // * Retrieves the #CoglContext associated with the given clutter
-    // * @backend. A #CoglContext is required when using some of the
-    // * experimental 2.0 Cogl API.
-    // *
-    // * Since CoglContext is itself experimental API this API should
-    // * be considered experimental too.
-    // *
-    // * This API is not yet supported on OSX because OSX still
-    // * uses the stub Cogl winsys and the  backend doesn't
-    // * explicitly create a CoglContext.
-    // *
-    // * Return value: (transfer none): The #CoglContext associated with @backend.
-    pub fn get_context(&self) -> Option<dx::pure::Context> {
+    // backend_get_dx_context:
+    // @backend: a #Backend
+    //
+    // Retrieves the #CoglContext associated with the given clutter
+    // @backend. A #CoglContext is required when using some of the
+    // experimental 2.0 Cogl API.
+    //
+    // Since CoglContext is itself experimental API this API should
+    // be considered experimental too.
+    //
+    // This API is not yet supported on OSX because OSX still
+    // uses the stub Cogl winsys and the  backend doesn't
+    // explicitly create a CoglContext.
+    //
+    // Return value: (transfer none): The #CoglContext associated with @backend.
+    // TODO: should use singleton
+    pub fn get_context(&self) -> Option<Context> {
         let props = self.props.borrow();
-        props.dx_context.clone()
+        // props.dx_context.clone()
+        unimplemented!()
     }
 
     pub fn create_context(&self) -> bool {
@@ -62,12 +66,12 @@ impl Backend {
         // }
 
         // if allowed_drivers == NULL {
-        //   allowed_drivers = CLUTTER_DRIVERS;
+        //   allowed_drivers = DRIVERS;
         // }
 
         // allow_any = strstr(allowed_drivers, "*") != NULL;
 
-        // drivers_list = g_getenv("CLUTTER_DRIVER");
+        // drivers_list = g_getenv("DRIVER");
         // if drivers_list == NULL {
         //   drivers_list = allowed_drivers;
         // }
@@ -88,14 +92,14 @@ impl Backend {
         //             (is_any && strstr(allowed_drivers, all_known_drivers[j].driver_name)) ||
         //             g_str_equal(all_known_drivers[j].driver_name, driver_name)
         //         {
-        //             CLUTTER_NOTE (BACKEND, "Checking for the %s driver", all_known_drivers[j].driver_desc);
+        //             NOTE (BACKEND, "Checking for the %s driver", all_known_drivers[j].driver_desc);
 
-        //             if (clutter_backend_do_real_create_context(backend, all_known_drivers[j].driver_id, &internal_error))
+        //             if (backend_do_real_create_context(backend, all_known_drivers[j].driver_id, &internal_error))
         //               break;
 
         //             if (internal_error)
         //               {
-        //                 CLUTTER_NOTE(BACKEND, "Unable to use the %s driver: %s",
+        //                 NOTE(BACKEND, "Unable to use the %s driver: %s",
         //                               all_known_drivers[j].driver_desc,
         //                               internal_error.message);
         //                 g_clear_error(&internal_error);
@@ -110,8 +114,8 @@ impl Backend {
         //     if internal_error != NULL {
         //       g_propagate_error(error, internal_error);
         //     } else {
-        //       g_set_error_literal(error, CLUTTER_INIT_ERROR,
-        //                            CLUTTER_INIT_ERROR_BACKEND,
+        //       g_set_error_literal(error, INIT_ERROR,
+        //                            INIT_ERROR_BACKEND,
         //                           _("Unable to initialize the  backend: no available drivers found."));
         //     }
         //     return false;
@@ -123,7 +127,7 @@ impl Backend {
         true
     }
 
-    fn do_real_create_context(&self, driver_id: dx::pure::Driver) -> bool {
+    fn do_real_create_context(&self, driver_id: Driver) -> bool {
         // fn error() -> bool {
         //     if backend.dx_display.is_some() {
         //         dx_object_unref(backend.dx_display);
@@ -146,7 +150,7 @@ impl Backend {
         // CoglSwapChain *swap_chain;
         // GError *internal_error;
 
-        // klass = CLUTTER_BACKEND_GET_CLASS(backend);
+        // klass = BACKEND_GET_CLASS(backend);
 
         // swap_chain = NULL;
         // internal_error = NULL;
@@ -238,67 +242,67 @@ impl Backend {
     pub fn init_events(&self) {
         // let mut input_backend: Option<String> = None;
 
-        // input_backend = g_getenv("CLUTTER_INPUT_BACKEND");
+        // input_backend = g_getenv("INPUT_BACKEND");
         // if input_backend.is_some() {
         //   input_backend = g_intern_string(input_backend);
         // }
 
         #[cfg(target_os = "macos")]
-        if clutter_check_windowing_backend(CLUTTER_WINDOWING_OSX)
-            && (input_backend.is_some() || input_backend == I_(CLUTTER_INPUT_OSX))
+        if check_windowing_backend(WINDOWING_OSX)
+            && (input_backend.is_some() || input_backend == I_(INPUT_OSX))
         {
-            _clutter_backend_osx_events_init(backend);
+            _backend_osx_events_init(backend);
         }
 
         #[cfg(target_os = "windows")]
-        if clutter_check_windowing_backend(CLUTTER_WINDOWING_WIN32)
-            && (input_backend.is_some() || input_backend == I_(CLUTTER_INPUT_WIN32))
+        if check_windowing_backend(WINDOWING_WIN32)
+            && (input_backend.is_some() || input_backend == I_(INPUT_WIN32))
         {
-            _clutter_backend_win32_events_init(backend);
+            _backend_win32_events_init(backend);
         }
 
         if cfg!(target_os = "linux") {
             #[cfg(feature = "x11")]
-            if clutter_check_windowing_backend(CLUTTER_WINDOWING_X11)
-                && (input_backend.is_some() || input_backend == I_(CLUTTER_INPUT_X11))
+            if check_windowing_backend(WINDOWING_X11)
+                && (input_backend.is_some() || input_backend == I_(INPUT_X11))
             {
-                _clutter_backend_x11_events_init(backend);
+                _backend_x11_events_init(backend);
             }
 
             #[cfg(feature = "gdk")]
-            if clutter_check_windowing_backend(CLUTTER_WINDOWING_GDK)
-                && (input_backend.is_some() || input_backend == I_(CLUTTER_INPUT_GDK))
+            if check_windowing_backend(WINDOWING_GDK)
+                && (input_backend.is_some() || input_backend == I_(INPUT_GDK))
             {
-                _clutter_backend_gdk_events_init(backend);
+                _backend_gdk_events_init(backend);
             }
 
             #[cfg(feature = "evdev")]
             // Evdev can be used regardless of the windowing system
-            if input_backend.is_some() && strcmp(input_backend, CLUTTER_INPUT_EVDEV) == 0 {
-                _clutter_events_evdev_init(backend);
+            if input_backend.is_some() && strcmp(input_backend, INPUT_EVDEV) == 0 {
+                _events_evdev_init(backend);
             }
 
             #[cfg(feature = "egl")]
             // but we do want to always use it for EGL native
-            if clutter_check_windowing_backend(CLUTTER_WINDOWING_EGL) {
-                _clutter_events_evdev_init(backend);
+            if check_windowing_backend(WINDOWING_EGL) {
+                _events_evdev_init(backend);
             }
 
             #[cfg(feature = "tslib")]
             // Tslib can be used regardless of the windowing system
-            if input_backend.is_some() && strcmp(input_backend, CLUTTER_INPUT_TSLIB) == 0 {
-                _clutter_events_tslib_init(backend);
+            if input_backend.is_some() && strcmp(input_backend, INPUT_TSLIB) == 0 {
+                _events_tslib_init(backend);
             }
 
             #[cfg(feature = "wayland")]
-            if clutter_check_windowing_backend(CLUTTER_WINDOWING_WAYLAND)
-                && (input_backend.is_some() || input_backend == I_(CLUTTER_INPUT_WAYLAND))
+            if check_windowing_backend(WINDOWING_WAYLAND)
+                && (input_backend.is_some() || input_backend == I_(INPUT_WAYLAND))
             {
-                _clutter_events_wayland_init(backend);
+                _events_wayland_init(backend);
             }
 
             // if input_backend.is_some() {
-            //     if input_backend != I_(CLUTTER_INPUT_NULL) {
+            //     if input_backend != I_(INPUT_NULL) {
             //         error!("Unrecognized input backend '%s'", input_backend);
             //     }
             // } else {
@@ -307,29 +311,29 @@ impl Backend {
         }
     }
 
-    /// Retrieves the font options for `self`.
-    ///
-    /// # Returns
-    ///
-    /// the font options of the `Backend`.
-    ///  The returned `cairo::FontOptions` is owned by the backend and should
-    ///  not be modified or freed
-    pub fn get_font_options(&self) -> cairo::FontOptions {
-        let mut props = self.props.borrow_mut();
-        match &props.font_options {
-            Some(font_options) => font_options.clone(),
-            None => {
-                let mut font_options = cairo::FontOptions::new();
-                font_options.set_hint_style(cairo::HintStyle::None);
-                font_options.set_subpixel_order(cairo::SubpixelOrder::Default);
-                font_options.set_antialias(cairo::Antialias::Default);
-
-                props.font_options = Some(font_options.clone());
-
-                font_options
-            }
-        }
-    }
+    // /// Retrieves the font options for `self`.
+    // ///
+    // /// # Returns
+    // ///
+    // /// the font options of the `Backend`.
+    // ///  The returned `cairo::FontOptions` is owned by the backend and should
+    // ///  not be modified or freed
+    // pub fn get_font_options(&self) -> cairo::FontOptions {
+    //     let mut props = self.props.borrow_mut();
+    //     match &props.font_options {
+    //         Some(font_options) => font_options.clone(),
+    //         None => {
+    //             let mut font_options = cairo::FontOptions::new();
+    //             font_options.set_hint_style(cairo::HintStyle::None);
+    //             font_options.set_subpixel_order(cairo::SubpixelOrder::Default);
+    //             font_options.set_antialias(cairo::Antialias::Default);
+
+    //             props.font_options = Some(font_options.clone());
+
+    //             font_options
+    //         }
+    //     }
+    // }
 
     /// Gets the resolution for font handling on the screen.
     ///
@@ -356,25 +360,25 @@ impl Backend {
         resolution / 1024.0
     }
 
-    /// Sets the new font options for `self`. The `Backend` will
-    /// copy the `cairo::FontOptions`.
-    ///
-    /// If `options` is `None`, the first following call to
-    /// `Backend::get_font_options` will return the default font
-    /// options for `self`.
-    ///
-    /// This function is intended for actors creating a Pango layout
-    /// using the PangoCairo API.
-    /// ## `options`
-    /// Cairo font options for the backend, or `None`
-    pub fn set_font_options(&self, options: Option<cairo::FontOptions>) {
-        let mut props = self.props.borrow_mut();
-
-        if props.font_options != options {
-            props.font_options = options;
-            // g_signal_emit (backend, backend_signals[FONT_CHANGED], 0);
-        }
-    }
+    // /// Sets the new font options for `self`. The `Backend` will
+    // /// copy the `cairo::FontOptions`.
+    // ///
+    // /// If `options` is `None`, the first following call to
+    // /// `Backend::get_font_options` will return the default font
+    // /// options for `self`.
+    // ///
+    // /// This function is intended for actors creating a Pango layout
+    // /// using the PangoCairo API.
+    // /// ## `options`
+    // /// Cairo font options for the backend, or `None`
+    // pub fn set_font_options(&self, options: Option<cairo::FontOptions>) {
+    //     let mut props = self.props.borrow_mut();
+
+    //     if props.font_options != options {
+    //         props.font_options = options;
+    //         // g_signal_emit (backend, backend_signals[FONT_CHANGED], 0);
+    //     }
+    // }
 
     /// The ::font-changed signal is emitted each time the font options
     /// have been changed through `Settings`.
diff --git a/src/pure/behaviour_ellipse.rs b/src/pure/behaviour_ellipse.rs
index 5872537..cdba8f4 100644
--- a/src/pure/behaviour_ellipse.rs
+++ b/src/pure/behaviour_ellipse.rs
@@ -1,279 +1,279 @@
-use super::{Alpha, HandlerId, Knot, RotateAxis, RotateDirection};
-use crate::prelude::*;
-use std::fmt;
+// use super::{Alpha, HandlerId, Knot, RotateAxis, RotateDirection};
+// use crate::prelude::*;
+// use std::fmt;
 
-// * @Title: BehaviourEllipse
-// * @short_description: A behaviour interpolating position along an ellipse
-// * @Deprecated: 1.6: Use clutter_actor_animate() instead
-// *
-// * #BehaviourEllipse interpolates actors along a path defined by
-// *  an ellipse.
-// *
-// * When applying an ellipse behaviour to an actor, the
-// * behaviour will update the actor's position and depth and set them
-// * to what is dictated by the ellipses initial position.
-// *
-// * Deprecated: 1.6: Use clutter_actor_animate(), #Path and a
-// *   #PathConstraint instead.
-// @implements Scriptable @extends Behaviour
-#[derive(Debug, Clone)]
-pub struct BehaviourEllipse {
-    center: Knot,
+// // @Title: BehaviourEllipse
+// // @short_description: A behaviour interpolating position along an ellipse
+// // @Deprecated: 1.6: Use actor_animate() instead
+// //
+// // #BehaviourEllipse interpolates actors along a path defined by
+// //  an ellipse.
+// //
+// // When applying an ellipse behaviour to an actor, the
+// // behaviour will update the actor's position and depth and set them
+// // to what is dictated by the ellipses initial position.
+// //
+// // Deprecated: 1.6: Use actor_animate(), #Path and a
+// //   #PathConstraint instead.
+// // @implements Scriptable @extends Behaviour
+// #[derive(Debug, Clone)]
+// pub struct BehaviourEllipse {
+//     center: Knot,
 
-    /* a = width / 2 */
-    a: u32,
+//     /* a = width / 2 */
+//     a: u32,
 
-    /* b = height / 2 */
-    b: u32,
+//     /* b = height / 2 */
+//     b: u32,
 
-    angle_start: f64,
-    angle_end: f64,
+//     angle_start: f64,
+//     angle_end: f64,
 
-    angle_tilt_x: f64,
-    angle_tilt_y: f64,
-    angle_tilt_z: f64,
+//     angle_tilt_x: f64,
+//     angle_tilt_y: f64,
+//     angle_tilt_z: f64,
 
-    direction: RotateDirection,
-}
+//     direction: RotateDirection,
+// }
 
-impl BehaviourEllipse {
-    pub fn new<P: Is<Alpha>>(
-        alpha: Option<&P>,
-        x: i32,
-        y: i32,
-        width: i32,
-        height: i32,
-        direction: RotateDirection,
-        start: f64,
-        end: f64,
-    ) -> BehaviourEllipse {
-        // Self {
+// impl BehaviourEllipse {
+//     pub fn new<P: Is<Alpha>>(
+//         alpha: Option<&P>,
+//         x: i32,
+//         y: i32,
+//         width: i32,
+//         height: i32,
+//         direction: RotateDirection,
+//         start: f64,
+//         end: f64,
+//     ) -> BehaviourEllipse {
+//         // Self {
 
-        // }
-        unimplemented!()
-    }
-}
+//         // }
+//         unimplemented!()
+//     }
+// }
 
-impl Object for BehaviourEllipse {}
-impl Is<BehaviourEllipse> for BehaviourEllipse {}
+// impl Object for BehaviourEllipse {}
+// impl Is<BehaviourEllipse> for BehaviourEllipse {}
 
-impl AsRef<BehaviourEllipse> for BehaviourEllipse {
-    fn as_ref(&self) -> &BehaviourEllipse {
-        self
-    }
-}
+// impl AsRef<BehaviourEllipse> for BehaviourEllipse {
+//     fn as_ref(&self) -> &BehaviourEllipse {
+//         self
+//     }
+// }
 
-pub trait BehaviourEllipseExt: 'static {
-    fn get_angle_end(&self) -> f64;
+// pub trait BehaviourEllipseExt: 'static {
+//     fn get_angle_end(&self) -> f64;
 
-    fn get_angle_start(&self) -> f64;
+//     fn get_angle_start(&self) -> f64;
 
-    fn get_angle_tilt(&self, axis: RotateAxis) -> f64;
+//     fn get_angle_tilt(&self, axis: RotateAxis) -> f64;
 
-    fn get_center(&self) -> (i32, i32);
+//     fn get_center(&self) -> (i32, i32);
 
-    fn get_direction(&self) -> RotateDirection;
+//     fn get_direction(&self) -> RotateDirection;
 
-    fn get_height(&self) -> i32;
+//     fn get_height(&self) -> i32;
 
-    fn get_tilt(&self) -> (f64, f64, f64);
+//     fn get_tilt(&self) -> (f64, f64, f64);
 
-    fn get_width(&self) -> i32;
+//     fn get_width(&self) -> i32;
 
-    fn set_angle_end(&self, angle_end: f64);
+//     fn set_angle_end(&self, angle_end: f64);
 
-    fn set_angle_start(&self, angle_start: f64);
+//     fn set_angle_start(&self, angle_start: f64);
 
-    fn set_angle_tilt(&self, axis: RotateAxis, angle_tilt: f64);
+//     fn set_angle_tilt(&self, axis: RotateAxis, angle_tilt: f64);
 
-    fn set_center(&self, x: i32, y: i32);
+//     fn set_center(&self, x: i32, y: i32);
 
-    fn set_direction(&self, direction: RotateDirection);
+//     fn set_direction(&self, direction: RotateDirection);
 
-    fn set_height(&self, height: i32);
+//     fn set_height(&self, height: i32);
 
-    fn set_tilt(&self, angle_tilt_x: f64, angle_tilt_y: f64, angle_tilt_z: f64);
+//     fn set_tilt(&self, angle_tilt_x: f64, angle_tilt_y: f64, angle_tilt_z: f64);
 
-    fn set_width(&self, width: i32);
+//     fn set_width(&self, width: i32);
 
-    fn get_property_angle_tilt_x(&self) -> f64;
+//     fn get_property_angle_tilt_x(&self) -> f64;
 
-    fn set_property_angle_tilt_x(&self, angle_tilt_x: f64);
+//     fn set_property_angle_tilt_x(&self, angle_tilt_x: f64);
 
-    fn get_property_angle_tilt_y(&self) -> f64;
+//     fn get_property_angle_tilt_y(&self) -> f64;
 
-    fn set_property_angle_tilt_y(&self, angle_tilt_y: f64);
+//     fn set_property_angle_tilt_y(&self, angle_tilt_y: f64);
 
-    fn get_property_angle_tilt_z(&self) -> f64;
+//     fn get_property_angle_tilt_z(&self) -> f64;
 
-    fn set_property_angle_tilt_z(&self, angle_tilt_z: f64);
+//     fn set_property_angle_tilt_z(&self, angle_tilt_z: f64);
 
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_angle_tilt_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_angle_tilt_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_angle_tilt_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_angle_tilt_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_angle_tilt_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_angle_tilt_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_center_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_center_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
-}
+//     fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+// }
 
-impl<O: Is<BehaviourEllipse>> BehaviourEllipseExt for O {
-    fn get_angle_end(&self) -> f64 {
-        let behaviour = self.as_ref();
-        behaviour.angle_end
-    }
+// impl<O: Is<BehaviourEllipse>> BehaviourEllipseExt for O {
+//     fn get_angle_end(&self) -> f64 {
+//         let behaviour = self.as_ref();
+//         behaviour.angle_end
+//     }
 
-    fn get_angle_start(&self) -> f64 {
-        let behaviour = self.as_ref();
-        behaviour.angle_start
-    }
+//     fn get_angle_start(&self) -> f64 {
+//         let behaviour = self.as_ref();
+//         behaviour.angle_start
+//     }
 
-    fn get_angle_tilt(&self, axis: RotateAxis) -> f64 {
-        let behaviour = self.as_ref();
-        match axis {
-            RotateAxis::XAxis => behaviour.angle_tilt_x,
-            RotateAxis::YAxis => behaviour.angle_tilt_y,
-            RotateAxis::ZAxis => behaviour.angle_tilt_z,
-        }
-    }
+//     fn get_angle_tilt(&self, axis: RotateAxis) -> f64 {
+//         let behaviour = self.as_ref();
+//         match axis {
+//             RotateAxis::XAxis => behaviour.angle_tilt_x,
+//             RotateAxis::YAxis => behaviour.angle_tilt_y,
+//             RotateAxis::ZAxis => behaviour.angle_tilt_z,
+//         }
+//     }
 
-    fn get_center(&self) -> (i32, i32) {
-        // let behaviour = self.as_ref();
-        // (behaviour.center.x, behaviour.center.y)
-        unimplemented!()
-    }
+//     fn get_center(&self) -> (i32, i32) {
+//         // let behaviour = self.as_ref();
+//         // (behaviour.center.x, behaviour.center.y)
+//         unimplemented!()
+//     }
 
-    fn get_direction(&self) -> RotateDirection {
-        let behaviour = self.as_ref();
-        behaviour.direction
-    }
+//     fn get_direction(&self) -> RotateDirection {
+//         let behaviour = self.as_ref();
+//         behaviour.direction
+//     }
 
-    fn get_height(&self) -> i32 {
-        // let behaviour = self.as_ref();
-        // behaviour.height
-        unimplemented!()
-    }
+//     fn get_height(&self) -> i32 {
+//         // let behaviour = self.as_ref();
+//         // behaviour.height
+//         unimplemented!()
+//     }
 
-    fn get_tilt(&self) -> (f64, f64, f64) {
-        let behaviour = self.as_ref();
-        (
-            behaviour.angle_tilt_x,
-            behaviour.angle_tilt_y,
-            behaviour.angle_tilt_z,
-        )
-    }
+//     fn get_tilt(&self) -> (f64, f64, f64) {
+//         let behaviour = self.as_ref();
+//         (
+//             behaviour.angle_tilt_x,
+//             behaviour.angle_tilt_y,
+//             behaviour.angle_tilt_z,
+//         )
+//     }
 
-    fn get_width(&self) -> i32 {
-        // let behaviour = self.as_ref();
-        // behaviour.width
-        unimplemented!()
-    }
+//     fn get_width(&self) -> i32 {
+//         // let behaviour = self.as_ref();
+//         // behaviour.width
+//         unimplemented!()
+//     }
 
-    fn set_angle_end(&self, angle_end: f64) {
-        unimplemented!()
-    }
+//     fn set_angle_end(&self, angle_end: f64) {
+//         unimplemented!()
+//     }
 
-    fn set_angle_start(&self, angle_start: f64) {
-        unimplemented!()
-    }
+//     fn set_angle_start(&self, angle_start: f64) {
+//         unimplemented!()
+//     }
 
-    fn set_angle_tilt(&self, axis: RotateAxis, angle_tilt: f64) {
-        unimplemented!()
-    }
+//     fn set_angle_tilt(&self, axis: RotateAxis, angle_tilt: f64) {
+//         unimplemented!()
+//     }
 
-    fn set_center(&self, x: i32, y: i32) {
-        unimplemented!()
-    }
+//     fn set_center(&self, x: i32, y: i32) {
+//         unimplemented!()
+//     }
 
-    fn set_direction(&self, direction: RotateDirection) {
-        unimplemented!()
-    }
+//     fn set_direction(&self, direction: RotateDirection) {
+//         unimplemented!()
+//     }
 
-    fn set_height(&self, height: i32) {
-        unimplemented!()
-    }
+//     fn set_height(&self, height: i32) {
+//         unimplemented!()
+//     }
 
-    fn set_tilt(&self, angle_tilt_x: f64, angle_tilt_y: f64, angle_tilt_z: f64) {
-        unimplemented!()
-    }
-
-    fn set_width(&self, width: i32) {
-        unimplemented!()
-    }
-
-    fn get_property_angle_tilt_x(&self) -> f64 {
-        unimplemented!()
-    }
-
-    fn set_property_angle_tilt_x(&self, angle_tilt_x: f64) {
-        unimplemented!()
-    }
-
-    fn get_property_angle_tilt_y(&self) -> f64 {
-        unimplemented!()
-    }
-
-    fn set_property_angle_tilt_y(&self, angle_tilt_y: f64) {
-        unimplemented!()
-    }
-
-    fn get_property_angle_tilt_z(&self) -> f64 {
-        unimplemented!()
-    }
-
-    fn set_property_angle_tilt_z(&self, angle_tilt_z: f64) {
-        unimplemented!()
-    }
-
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_angle_tilt_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_angle_tilt_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_angle_tilt_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_center_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-}
-
-impl fmt::Display for BehaviourEllipse {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BehaviourEllipse")
-    }
-}
+//     fn set_tilt(&self, angle_tilt_x: f64, angle_tilt_y: f64, angle_tilt_z: f64) {
+//         unimplemented!()
+//     }
+
+//     fn set_width(&self, width: i32) {
+//         unimplemented!()
+//     }
+
+//     fn get_property_angle_tilt_x(&self) -> f64 {
+//         unimplemented!()
+//     }
+
+//     fn set_property_angle_tilt_x(&self, angle_tilt_x: f64) {
+//         unimplemented!()
+//     }
+
+//     fn get_property_angle_tilt_y(&self) -> f64 {
+//         unimplemented!()
+//     }
+
+//     fn set_property_angle_tilt_y(&self, angle_tilt_y: f64) {
+//         unimplemented!()
+//     }
+
+//     fn get_property_angle_tilt_z(&self) -> f64 {
+//         unimplemented!()
+//     }
+
+//     fn set_property_angle_tilt_z(&self, angle_tilt_z: f64) {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_angle_tilt_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_angle_tilt_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_angle_tilt_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_center_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_height_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_width_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+// }
+
+// impl fmt::Display for BehaviourEllipse {
+//     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+//         write!(f, "BehaviourEllipse")
+//     }
+// }
diff --git a/src/pure/behaviour_rotate.rs b/src/pure/behaviour_rotate.rs
index 94d4b2f..0df7f3c 100644
--- a/src/pure/behaviour_rotate.rs
+++ b/src/pure/behaviour_rotate.rs
@@ -1,210 +1,210 @@
-use super::{Alpha, HandlerId, RotateAxis, RotateDirection};
-use crate::prelude::*;
-use std::fmt;
+// use super::{Alpha, HandlerId, RotateAxis, RotateDirection};
+// use crate::prelude::*;
+// use std::fmt;
 
-// * @short_description: A behaviour controlling rotation
-// *
-// * A #BehaviourRotate rotate actors between a starting and ending
-// * angle on a given axis.
-// *
-// * The #BehaviourRotate is available since version 0.4.
-// *
-// * Deprecated: 1.6: Use the #Actor rotation properties and
-// *   clutter_actor_animate(), or #Animator, or #State
-// *   instead.
-#[derive(Debug, Clone)]
-pub struct BehaviourRotate {
-    angle_start: f64,
-    angle_end: f64,
+// // @short_description: A behaviour controlling rotation
+// //
+// // A #BehaviourRotate rotate actors between a starting and ending
+// // angle on a given axis.
+// //
+// // The #BehaviourRotate is available since version 0.4.
+// //
+// // Deprecated: 1.6: Use the #Actor rotation properties and
+// //   actor_animate(), or #Animator, or #State
+// //   instead.
+// #[derive(Debug, Clone)]
+// pub struct BehaviourRotate {
+//     angle_start: f64,
+//     angle_end: f64,
 
-    axis: RotateAxis,
-    direction: RotateDirection,
+//     axis: RotateAxis,
+//     direction: RotateDirection,
 
-    center_x: i32,
-    center_y: i32,
-    center_z: i32,
-}
+//     center_x: i32,
+//     center_y: i32,
+//     center_z: i32,
+// }
 
-impl BehaviourRotate {
-    pub fn new<P: Is<Alpha>>(
-        alpha: Option<&P>,
-        axis: RotateAxis,
-        direction: RotateDirection,
-        angle_start: f64,
-        angle_end: f64,
-    ) -> BehaviourRotate {
-        unimplemented!()
-    }
-}
+// impl BehaviourRotate {
+//     pub fn new<P: Is<Alpha>>(
+//         alpha: Option<&P>,
+//         axis: RotateAxis,
+//         direction: RotateDirection,
+//         angle_start: f64,
+//         angle_end: f64,
+//     ) -> BehaviourRotate {
+//         unimplemented!()
+//     }
+// }
 
-impl Object for BehaviourRotate {}
+// impl Object for BehaviourRotate {}
 
-pub trait BehaviourRotateExt: 'static {
-    fn get_axis(&self) -> RotateAxis;
+// pub trait BehaviourRotateExt: 'static {
+//     fn get_axis(&self) -> RotateAxis;
 
-    fn get_bounds(&self) -> (f64, f64);
+//     fn get_bounds(&self) -> (f64, f64);
 
-    fn get_center(&self) -> (i32, i32, i32);
+//     fn get_center(&self) -> (i32, i32, i32);
 
-    fn get_direction(&self) -> RotateDirection;
+//     fn get_direction(&self) -> RotateDirection;
 
-    fn set_axis(&self, axis: RotateAxis);
+//     fn set_axis(&self, axis: RotateAxis);
 
-    fn set_bounds(&self, angle_start: f64, angle_end: f64);
+//     fn set_bounds(&self, angle_start: f64, angle_end: f64);
 
-    fn set_center(&self, x: i32, y: i32, z: i32);
+//     fn set_center(&self, x: i32, y: i32, z: i32);
 
-    fn set_direction(&self, direction: RotateDirection);
+//     fn set_direction(&self, direction: RotateDirection);
 
-    fn get_property_angle_end(&self) -> f64;
+//     fn get_property_angle_end(&self) -> f64;
 
-    fn set_property_angle_end(&self, angle_end: f64);
+//     fn set_property_angle_end(&self, angle_end: f64);
 
-    fn get_property_angle_start(&self) -> f64;
+//     fn get_property_angle_start(&self) -> f64;
 
-    fn set_property_angle_start(&self, angle_start: f64);
+//     fn set_property_angle_start(&self, angle_start: f64);
 
-    fn get_property_center_x(&self) -> i32;
+//     fn get_property_center_x(&self) -> i32;
 
-    fn set_property_center_x(&self, center_x: i32);
+//     fn set_property_center_x(&self, center_x: i32);
 
-    fn get_property_center_y(&self) -> i32;
+//     fn get_property_center_y(&self) -> i32;
 
-    fn set_property_center_y(&self, center_y: i32);
+//     fn set_property_center_y(&self, center_y: i32);
 
-    fn get_property_center_z(&self) -> i32;
+//     fn get_property_center_z(&self) -> i32;
 
-    fn set_property_center_z(&self, center_z: i32);
+//     fn set_property_center_z(&self, center_z: i32);
 
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_center_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_center_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_center_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_center_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_center_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+//     fn connect_property_center_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
-}
+//     fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
+// }
 
-impl<O: Is<BehaviourRotate>> BehaviourRotateExt for O {
-    fn get_axis(&self) -> RotateAxis {
-        let behaviour = self.as_ref();
-        behaviour.axis
-    }
+// impl<O: Is<BehaviourRotate>> BehaviourRotateExt for O {
+//     fn get_axis(&self) -> RotateAxis {
+//         let behaviour = self.as_ref();
+//         behaviour.axis
+//     }
 
-    fn get_bounds(&self) -> (f64, f64) {
-        let behaviour = self.as_ref();
-        (behaviour.angle_start, behaviour.angle_end)
-    }
+//     fn get_bounds(&self) -> (f64, f64) {
+//         let behaviour = self.as_ref();
+//         (behaviour.angle_start, behaviour.angle_end)
+//     }
 
-    fn get_center(&self) -> (i32, i32, i32) {
-        // let behaviour = self.as_ref();
-        // (behaviour.x, behaviour.y, behaviour.z)
-        unimplemented!()
-    }
+//     fn get_center(&self) -> (i32, i32, i32) {
+//         // let behaviour = self.as_ref();
+//         // (behaviour.x, behaviour.y, behaviour.z)
+//         unimplemented!()
+//     }
 
-    fn get_direction(&self) -> RotateDirection {
-        let behaviour = self.as_ref();
-        behaviour.direction
-    }
+//     fn get_direction(&self) -> RotateDirection {
+//         let behaviour = self.as_ref();
+//         behaviour.direction
+//     }
 
-    fn set_axis(&self, axis: RotateAxis) {
-        unimplemented!()
-    }
+//     fn set_axis(&self, axis: RotateAxis) {
+//         unimplemented!()
+//     }
 
-    fn set_bounds(&self, angle_start: f64, angle_end: f64) {
-        unimplemented!()
-    }
+//     fn set_bounds(&self, angle_start: f64, angle_end: f64) {
+//         unimplemented!()
+//     }
 
-    fn set_center(&self, x: i32, y: i32, z: i32) {
-        unimplemented!()
-    }
+//     fn set_center(&self, x: i32, y: i32, z: i32) {
+//         unimplemented!()
+//     }
 
-    fn set_direction(&self, direction: RotateDirection) {
-        unimplemented!()
-    }
+//     fn set_direction(&self, direction: RotateDirection) {
+//         unimplemented!()
+//     }
 
-    fn get_property_angle_end(&self) -> f64 {
-        let behaviour = self.as_ref();
-        behaviour.angle_end
-    }
+//     fn get_property_angle_end(&self) -> f64 {
+//         let behaviour = self.as_ref();
+//         behaviour.angle_end
+//     }
 
-    fn set_property_angle_end(&self, angle_end: f64) {
-        unimplemented!()
-    }
+//     fn set_property_angle_end(&self, angle_end: f64) {
+//         unimplemented!()
+//     }
 
-    fn get_property_angle_start(&self) -> f64 {
-        let behaviour = self.as_ref();
-        behaviour.angle_start
-    }
+//     fn get_property_angle_start(&self) -> f64 {
+//         let behaviour = self.as_ref();
+//         behaviour.angle_start
+//     }
 
-    fn set_property_angle_start(&self, angle_start: f64) {
-        unimplemented!()
-    }
+//     fn set_property_angle_start(&self, angle_start: f64) {
+//         unimplemented!()
+//     }
 
-    fn get_property_center_x(&self) -> i32 {
-        let behaviour = self.as_ref();
-        behaviour.center_x
-    }
+//     fn get_property_center_x(&self) -> i32 {
+//         let behaviour = self.as_ref();
+//         behaviour.center_x
+//     }
 
-    fn set_property_center_x(&self, center_x: i32) {
-        unimplemented!()
-    }
+//     fn set_property_center_x(&self, center_x: i32) {
+//         unimplemented!()
+//     }
 
-    fn get_property_center_y(&self) -> i32 {
-        let behaviour = self.as_ref();
-        behaviour.center_y
-    }
+//     fn get_property_center_y(&self) -> i32 {
+//         let behaviour = self.as_ref();
+//         behaviour.center_y
+//     }
 
-    fn set_property_center_y(&self, center_y: i32) {
-        unimplemented!()
-    }
+//     fn set_property_center_y(&self, center_y: i32) {
+//         unimplemented!()
+//     }
 
-    fn get_property_center_z(&self) -> i32 {
-        let behaviour = self.as_ref();
-        behaviour.center_z
-    }
+//     fn get_property_center_z(&self) -> i32 {
+//         let behaviour = self.as_ref();
+//         behaviour.center_z
+//     }
 
-    fn set_property_center_z(&self, center_z: i32) {
-        unimplemented!()
-    }
+//     fn set_property_center_z(&self, center_z: i32) {
+//         unimplemented!()
+//     }
 
-    fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
+//     fn connect_property_angle_end_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
 
-    fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_center_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_center_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_center_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-
-    fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
-        unimplemented!()
-    }
-}
-
-impl fmt::Display for BehaviourRotate {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "BehaviourRotate")
-    }
-}
+//     fn connect_property_angle_start_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_axis_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_center_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_center_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_center_z_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+
+//     fn connect_property_direction_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
+//         unimplemented!()
+//     }
+// }
+
+// impl fmt::Display for BehaviourRotate {
+//     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+//         write!(f, "BehaviourRotate")
+//     }
+// }
diff --git a/src/pure/bin_layout.rs b/src/pure/bin_layout.rs
index 804252b..e5c4b8c 100644
--- a/src/pure/bin_layout.rs
+++ b/src/pure/bin_layout.rs
@@ -9,21 +9,21 @@ pub struct BinLayer {
     y_align: BinAlignment,
 }
 
-// * @short_description: A simple layout manager
-// *
-// * #BinLayout is a layout manager which implements the following
-// * policy:
-// *
-// *   - the preferred size is the maximum preferred size
-// *   between all the children of the container using the
-// *   layout;
-// *   - each child is allocated in "layers", on on top
-// *   of the other;
-// *   - for each layer there are horizontal and vertical
-// *   alignment policies.
-// *
-// * The [bin-layout example](https://git.gnome.org/browse/clutter/tree/examples/bin-layout.c?h=clutter-1.18)
-// * shows how to pack actors inside a #BinLayout.
+// @short_description: A simple layout manager
+//
+// #BinLayout is a layout manager which implements the following
+// policy:
+//
+//   - the preferred size is the maximum preferred size
+//   between all the children of the container using the
+//   layout;
+//   - each child is allocated in "layers", on on top
+//   of the other;
+//   - for each layer there are horizontal and vertical
+//   alignment policies.
+//
+// The [bin-layout example](https://git.gnome.org/browse/clutter/tree/examples/bin-layout.c?h=1.18)
+// shows how to pack actors inside a #BinLayout.
 // @extends LayoutManager
 pub struct BinLayout {
     x_align: BinAlignment,
diff --git a/src/pure/bind_constraint.rs b/src/pure/bind_constraint.rs
index 9ea28fa..83f964c 100644
--- a/src/pure/bind_constraint.rs
+++ b/src/pure/bind_constraint.rs
@@ -2,61 +2,60 @@ use super::{Actor, BindCoordinate, HandlerId};
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-bind-constraint
-// * @Title: BindConstraint
-// * @Short_Description: A constraint binding the position or size of an actor
-// *
-// * #BindConstraint is a #Constraint that binds the
-// * position or the size of the #Actor to which it is applied
-// * to the the position or the size of another #Actor, or
-// * "source".
-// *
-// * An offset can be applied to the constraint, to avoid overlapping. The offset
-// * can also be animated. For instance, the following code will set up three
-// * actors to be bound to the same origin:
-// *
-// * |[<!-- language="C" -->
-// * // source
-// * rect[0] = clutter_rectangle_new_with_color (&red_color);
-// * clutter_actor_set_position (rect[0], x_pos, y_pos);
-// * clutter_actor_set_size (rect[0], 100, 100);
-// *
-// * // second rectangle
-// * rect[1] = clutter_rectangle_new_with_color (&green_color);
-// * clutter_actor_set_size (rect[1], 100, 100);
-// * clutter_actor_set_opacity (rect[1], 0);
-// *
-// * constraint = clutter_bind_constraint_new (rect[0], CLUTTER_BIND_X, 0.0);
-// * clutter_actor_add_constraint_with_name (rect[1], "green-x", constraint);
-// * constraint = clutter_bind_constraint_new (rect[0], CLUTTER_BIND_Y, 0.0);
-// * clutter_actor_add_constraint_with_name (rect[1], "green-y", constraint);
-// *
-// * // third rectangle
-// * rect[2] = clutter_rectangle_new_with_color (&blue_color);
-// * clutter_actor_set_size (rect[2], 100, 100);
-// * clutter_actor_set_opacity (rect[2], 0);
-// *
-// * constraint = clutter_bind_constraint_new (rect[0], CLUTTER_BIND_X, 0.0);
-// * clutter_actor_add_constraint_with_name (rect[2], "blue-x", constraint);
-// * constraint = clutter_bind_constraint_new (rect[0], CLUTTER_BIND_Y, 0.0);
-// * clutter_actor_add_constraint_with_name (rect[2], "blue-y", constraint);
-// * ]|
-// *
-// * The following code animates the second and third rectangles to "expand"
-// * them horizontally from underneath the first rectangle:
-// *
-// * |[<!-- language="C" -->
-// * clutter_actor_animate (rect[1], CLUTTER_EASE_OUT_CUBIC, 250,
-// *                        "@constraints.green-x.offset", 100.0,
-// *                        "opacity", 255,
-// *                        NULL);
-// * clutter_actor_animate (rect[2], CLUTTER_EASE_OUT_CUBIC, 250,
-// *                        "@constraints.blue-x.offset", 200.0,
-// *                        "opacity", 255,
-// *                        NULL);
-// * ]|
-// *
-// * #BindConstraint is available since  1.4
+// @Title: BindConstraint
+// @Short_Description: A constraint binding the position or size of an actor
+//
+// #BindConstraint is a #Constraint that binds the
+// position or the size of the #Actor to which it is applied
+// to the the position or the size of another #Actor, or
+// "source".
+//
+// An offset can be applied to the constraint, to avoid overlapping. The offset
+// can also be animated. For instance, the following code will set up three
+// actors to be bound to the same origin:
+//
+// ```
+// // source
+// rect[0] = rectangle_new_with_color (&red_color);
+// actor_set_position (rect[0], x_pos, y_pos);
+// actor_set_size (rect[0], 100, 100);
+//
+// // second rectangle
+// rect[1] = rectangle_new_with_color (&green_color);
+// actor_set_size (rect[1], 100, 100);
+// actor_set_opacity (rect[1], 0);
+//
+// constraint = bind_constraint_new (rect[0], BIND_X, 0.0);
+// actor_add_constraint_with_name (rect[1], "green-x", constraint);
+// constraint = bind_constraint_new (rect[0], BIND_Y, 0.0);
+// actor_add_constraint_with_name (rect[1], "green-y", constraint);
+//
+// // third rectangle
+// rect[2] = rectangle_new_with_color (&blue_color);
+// actor_set_size (rect[2], 100, 100);
+// actor_set_opacity (rect[2], 0);
+//
+// constraint = bind_constraint_new (rect[0], BIND_X, 0.0);
+// actor_add_constraint_with_name (rect[2], "blue-x", constraint);
+// constraint = bind_constraint_new (rect[0], BIND_Y, 0.0);
+// actor_add_constraint_with_name (rect[2], "blue-y", constraint);
+// ```
+//
+// The following code animates the second and third rectangles to "expand"
+// them horizontally from underneath the first rectangle:
+//
+// ```
+// actor_animate (rect[1], EASE_OUT_CUBIC, 250,
+//                        "@constraints.green-x.offset", 100.0,
+//                        "opacity", 255,
+//                        NULL);
+// actor_animate (rect[2], EASE_OUT_CUBIC, 250,
+//                        "@constraints.blue-x.offset", 200.0,
+//                        "opacity", 255,
+//                        NULL);
+// ```
+//
+// #BindConstraint is available since  1.4
 // @extends Constraint, ActorMeta
 #[derive(Debug, Clone)]
 pub struct BindConstraint {
diff --git a/src/pure/binding_pool.rs b/src/pure/binding_pool.rs
index 4b483a1..f3f603a 100644
--- a/src/pure/binding_pool.rs
+++ b/src/pure/binding_pool.rs
@@ -1,3 +1,4 @@
+#![allow(unused_imports)]
 use super::ModifierType;
 use std::{fmt, collections::HashMap};
 
@@ -11,73 +12,73 @@ struct BindingEntry {
   
     // guint is_blocked  : 1;
 }
-// * @short_description: Pool for key bindings
-// *
-// * #BindingPool is a data structure holding a set of key bindings.
-// * Each key binding associates a key symbol (eventually with modifiers)
-// * to an action. A callback function is associated to each action.
-// *
-// * For a given key symbol and modifier mask combination there can be only one
-// * action; for each action there can be only one callback. There can be
-// * multiple actions with the same name, and the same callback can be used
-// * to handle multiple key bindings.
-// *
-// * Actors requiring key bindings should create a new #BindingPool
-// * inside their class initialization function and then install actions
-// * like this:
-// *
-// * |[<!-- language="C" -->
-// * static void
-// * foo_class_init (FooClass *klass)
-// * {
-// *   BindingPool *binding_pool;
-// *
-// *   binding_pool = clutter_binding_pool_get_for_class (klass);
-// *
-// *   clutter_binding_pool_install_action (binding_pool, "move-up",
-// *                                        CLUTTER_Up, 0,
-// *                                        G_CALLBACK (foo_action_move_up),
-// *                                        NULL, NULL);
-// *   clutter_binding_pool_install_action (binding_pool, "move-up",
-// *                                        CLUTTER_KP_Up, 0,
-// *                                        G_CALLBACK (foo_action_move_up),
-// *                                        NULL, NULL);
-// * }
-// * ]|
-// *
-// * The callback has a signature of:
-// *
-// * |[<!-- language="C" -->
-// *    gboolean (* callback) (GObject             *instance,
-// *                           const gchar         *action_name,
-// *                           guint                key_val,
-// *                           ModifierType  modifiers,
-// *                           gpointer             user_data);
-// * ]|
-// *
-// * The actor should then override the #Actor::key-press-event and
-// * use clutter_binding_pool_activate() to match a #KeyEvent structure
-// * to one of the actions:
-// *
-// * |[<!-- language="C" -->
-// *   BindingPool *pool;
-// *
-// *   // retrieve the binding pool for the type of the actor
-// *   pool = clutter_binding_pool_find (G_OBJECT_TYPE_NAME (actor));
-// *
-// *   // activate any callback matching the key symbol and modifiers
-// *   // mask of the key event. the returned value can be directly
-// *   // used to signal that the actor has handled the event.
-// *   return clutter_binding_pool_activate (pool,
-// *                                         key_event->keyval,
-// *                                         key_event->modifier_state,
-// *                                         G_OBJECT (actor));
-// * ]|
-// *
-// * The clutter_binding_pool_activate() function will return %FALSE if
-// * no action for the given key binding was found, if the action was
-// * blocked (using clutter_binding_pool_block_action()) or if the
-// * key binding handler returned %FALSE.
+// @short_description: Pool for key bindings
+//
+// #BindingPool is a data structure holding a set of key bindings.
+// Each key binding associates a key symbol (eventually with modifiers)
+// to an action. A callback function is associated to each action.
+//
+// For a given key symbol and modifier mask combination there can be only one
+// action; for each action there can be only one callback. There can be
+// multiple actions with the same name, and the same callback can be used
+// to handle multiple key bindings.
+//
+// Actors requiring key bindings should create a new #BindingPool
+// inside their class initialization function and then install actions
+// like this:
+//
+// ```
+// static void
+// foo_class_init (FooClass *klass)
+// {
+//   BindingPool *binding_pool;
+//
+//   binding_pool = binding_pool_get_for_class (klass);
+//
+//   binding_pool_install_action (binding_pool, "move-up",
+//                                        Up, 0,
+//                                        G_CALLBACK (foo_action_move_up),
+//                                        NULL, NULL);
+//   binding_pool_install_action (binding_pool, "move-up",
+//                                        KP_Up, 0,
+//                                        G_CALLBACK (foo_action_move_up),
+//                                        NULL, NULL);
+// }
+// ```
+//
+// The callback has a signature of:
+//
+// ```
+//    gboolean (* callback) (GObject             *instance,
+//                           const gchar         *action_name,
+//                           guint                key_val,
+//                           ModifierType  modifiers,
+//                           gpointer             user_data);
+// ```
+//
+// The actor should then override the #Actor::key-press-event and
+// use binding_pool_activate() to match a #KeyEvent structure
+// to one of the actions:
+//
+// ```
+//   BindingPool *pool;
+//
+//   // retrieve the binding pool for the type of the actor
+//   pool = binding_pool_find (G_OBJECT_TYPE_NAME (actor));
+//
+//   // activate any callback matching the key symbol and modifiers
+//   // mask of the key event. the returned value can be directly
+//   // used to signal that the actor has handled the event.
+//   return binding_pool_activate (pool,
+//                                         key_event->keyval,
+//                                         key_event->modifier_state,
+//                                         G_OBJECT (actor));
+// ```
+//
+// The binding_pool_activate() function will return %FALSE if
+// no action for the given key binding was found, if the action was
+// blocked (using binding_pool_block_action()) or if the
+// key binding handler returned %FALSE.
 pub struct BindingPool {
     // GObject parent_instance;
     name: Option<String>, /* interned string, do not free */
@@ -196,7 +197,7 @@ impl BindingPool {
     //     modifiers: ModifierType,
     //     callback: P,
     // ) {
-    //     let callback_data: Box_<P> = Box_::new(callback);
+    //     let callback_data: Box<P> = Box::new(callback);
     //     unsafe extern "C" fn callback_func<
     //         P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static,
     //     >(
@@ -219,53 +220,53 @@ impl BindingPool {
     //     >(
     //         data: glib_sys::gpointer,
     //     ) {
-    //         let _callback: Box_<P> = Box_::from_raw(data as *mut _);
+    //         let _callback: Box<P> = Box::from_raw(data as *mut _);
     //     }
     //     let destroy_call6 = Some(notify_func::<P> as _);
-    //     let super_callback0: Box_<P> = callback_data;
+    //     let super_callback0: Box<P> = callback_data;
     //     unsafe {
-    //         ffi::clutter_binding_pool_install_action(
+    //         ffi::binding_pool_install_action(
     //             self.to_glib_none().0,
     //             action_name.to_glib_none().0,
     //             key_val,
     //             modifiers.to_glib(),
     //             callback,
-    //             Box_::into_raw(super_callback0) as *mut _,
+    //             Box::into_raw(super_callback0) as *mut _,
     //             destroy_call6,
     //         );
     //     }
     // }
 
-    /// A `gobject::Closure` variant of `BindingPool::install_action`.
-    ///
-    /// Installs a new action inside a `BindingPool`. The action
-    /// is bound to `key_val` and `modifiers`.
-    ///
-    /// The same action name can be used for multiple `key_val`, `modifiers`
-    /// pairs.
-    ///
-    /// When an action has been activated using `BindingPool::activate`
-    /// the passed `closure` will be invoked.
-    ///
-    /// Actions can be blocked with `BindingPool::block_action`
-    /// and then unblocked using `BindingPool::unblock_action`.
-    /// ## `action_name`
-    /// the name of the action
-    /// ## `key_val`
-    /// key symbol
-    /// ## `modifiers`
-    /// bitmask of modifiers
-    /// ## `closure`
-    /// a `gobject::Closure`
-    pub fn install_closure(
-        &self,
-        action_name: &str,
-        key_val: u32,
-        modifiers: ModifierType,
-        closure: &glib::Closure,
-    ) {
-        unimplemented!()
-    }
+    // /// A `gobject::Closure` variant of `BindingPool::install_action`.
+    // ///
+    // /// Installs a new action inside a `BindingPool`. The action
+    // /// is bound to `key_val` and `modifiers`.
+    // ///
+    // /// The same action name can be used for multiple `key_val`, `modifiers`
+    // /// pairs.
+    // ///
+    // /// When an action has been activated using `BindingPool::activate`
+    // /// the passed `closure` will be invoked.
+    // ///
+    // /// Actions can be blocked with `BindingPool::block_action`
+    // /// and then unblocked using `BindingPool::unblock_action`.
+    // /// ## `action_name`
+    // /// the name of the action
+    // /// ## `key_val`
+    // /// key symbol
+    // /// ## `modifiers`
+    // /// bitmask of modifiers
+    // /// ## `closure`
+    // /// a `gobject::Closure`
+    // pub fn install_closure(
+    //     &self,
+    //     action_name: &str,
+    //     key_val: u32,
+    //     modifiers: ModifierType,
+    //     closure: &glib::Closure,
+    // ) {
+    //     unimplemented!()
+    // }
 
     // /// Allows overriding the action for `key_val` and `modifiers` inside a
     // /// `BindingPool`. See `BindingPool::install_action`.
@@ -292,7 +293,7 @@ impl BindingPool {
     //     modifiers: ModifierType,
     //     callback: P,
     // ) {
-    //     let callback_data: Box_<P> = Box_::new(callback);
+    //     let callback_data: Box<P> = Box::new(callback);
     //     unsafe extern "C" fn callback_func<
     //         P: Fn(&glib::Object, &str, u32, &ModifierType) -> bool + 'static,
     //     >(
@@ -315,41 +316,41 @@ impl BindingPool {
     //     >(
     //         data: glib_sys::gpointer,
     //     ) {
-    //         let _callback: Box_<P> = Box_::from_raw(data as *mut _);
+    //         let _callback: Box<P> = Box::from_raw(data as *mut _);
     //     }
     //     let destroy_call5 = Some(notify_func::<P> as _);
-    //     let super_callback0: Box_<P> = callback_data;
+    //     let super_callback0: Box<P> = callback_data;
     //     unsafe {
-    //         ffi::clutter_binding_pool_override_action(
+    //         ffi::binding_pool_override_action(
     //             self.to_glib_none().0,
     //             key_val,
     //             modifiers.to_glib(),
     //             callback,
-    //             Box_::into_raw(super_callback0) as *mut _,
+    //             Box::into_raw(super_callback0) as *mut _,
     //             destroy_call5,
     //         );
     //     }
     // }
 
-    /// A `gobject::Closure` variant of `BindingPool::override_action`.
-    ///
-    /// Allows overriding the action for `key_val` and `modifiers` inside a
-    /// `BindingPool`. See `BindingPool::install_closure`.
-    ///
-    /// When an action has been activated using `BindingPool::activate`
-    /// the passed `callback` will be invoked (with `data`).
-    ///
-    /// Actions can be blocked with `BindingPool::block_action`
-    /// and then unblocked using `BindingPool::unblock_action`.
-    /// ## `key_val`
-    /// key symbol
-    /// ## `modifiers`
-    /// bitmask of modifiers
-    /// ## `closure`
-    /// a `gobject::Closure`
-    pub fn override_closure(&self, key_val: u32, modifiers: ModifierType, closure: &glib::Closure) {
-        unimplemented!()
-    }
+    // /// A `gobject::Closure` variant of `BindingPool::override_action`.
+    // ///
+    // /// Allows overriding the action for `key_val` and `modifiers` inside a
+    // /// `BindingPool`. See `BindingPool::install_closure`.
+    // ///
+    // /// When an action has been activated using `BindingPool::activate`
+    // /// the passed `callback` will be invoked (with `data`).
+    // ///
+    // /// Actions can be blocked with `BindingPool::block_action`
+    // /// and then unblocked using `BindingPool::unblock_action`.
+    // /// ## `key_val`
+    // /// key symbol
+    // /// ## `modifiers`
+    // /// bitmask of modifiers
+    // /// ## `closure`
+    // /// a `gobject::Closure`
+    // pub fn override_closure(&self, key_val: u32, modifiers: ModifierType, closure: &glib::Closure) {
+    //     unimplemented!()
+    // }
 
     /// Removes the action matching the given `key_val`, `modifiers` pair,
     /// if any exists.
@@ -389,7 +390,7 @@ impl BindingPool {
     }
 
     //pub fn get_for_class(klass: /*Unimplemented*/Option<Fundamental: Pointer>) -> Option<BindingPool> {
-    //    unsafe { TODO: call clutter_sys:clutter_binding_pool_get_for_class() }
+    //    unsafe { TODO: call sys:binding_pool_get_for_class() }
     //}
 }
 
diff --git a/src/pure/blur_effect.rs b/src/pure/blur_effect.rs
index 3c69e81..e3e12fb 100644
--- a/src/pure/blur_effect.rs
+++ b/src/pure/blur_effect.rs
@@ -1,13 +1,16 @@
-use super::Actor;
 use std::fmt;
 
-// * @short_description: A blur effect
-// * @see_also: #Effect, #OffscreenEffect
-// *
-// * #BlurEffect is a sub-class of #Effect that allows blurring a
-// * actor and its contents.
-// *
-// * #BlurEffect is available since  1.4
+use dx::platform::core::Pipeline;
+
+use super::Actor;
+
+// @short_description: A blur effect
+// @see_also: #Effect, #OffscreenEffect
+//
+// #BlurEffect is a sub-class of #Effect that allows blurring a
+// actor and its contents.
+//
+// #BlurEffect is available since  1.4
 // @extends OffscreenEffect, Effect, ActorMeta,
 #[derive(Default)]
 pub struct BlurEffect {
@@ -21,7 +24,7 @@ pub struct BlurEffect {
     tex_width: u32,
     tex_height: u32,
 
-    pipeline: Option<dx::pure::Pipeline>,
+    pipeline: Option<Pipeline>,
 }
 
 impl BlurEffect {
diff --git a/src/pure/box_layout.rs b/src/pure/box_layout.rs
index 64d644c..4408b21 100644
--- a/src/pure/box_layout.rs
+++ b/src/pure/box_layout.rs
@@ -2,23 +2,23 @@ use super::{Container, HandlerId, Orientation};
 use crate::prelude::*;
 use std::fmt;
 
-// * @short_description: A layout manager arranging children on a single line
-// *
-// * The #BoxLayout is a #LayoutManager implementing the
-// * following layout policy:
-// *
-// *  - all children are arranged on a single line
-// *  - the axis used is controlled by the #BoxLayout:orientation property
-// *  - the order of the packing is determined by the #BoxLayout:pack-start boolean property
-// *  - each child will be allocated to its natural size or, if #Actor:x-expand or
-// *  #Actor:y-expand are set, the available size
-// *  - honours the #Actor's #Actor:x-align and #Actor:y-align properties
-// *  to fill the available size
-// *  - if the #BoxLayout:homogeneous boolean propert is set, then all widgets will
-// *  get the same size, ignoring expand settings and the preferred sizes
-// *
-// * It is possible to control the spacing between children of a
-// * #BoxLayout by using clutter_box_layout_set_spacing().
+// @short_description: A layout manager arranging children on a single line
+//
+// The #BoxLayout is a #LayoutManager implementing the
+// following layout policy:
+//
+//  - all children are arranged on a single line
+//  - the axis used is controlled by the #BoxLayout:orientation property
+//  - the order of the packing is determined by the #BoxLayout:pack-start boolean property
+//  - each child will be allocated to its natural size or, if #Actor:x-expand or
+//  #Actor:y-expand are set, the available size
+//  - honours the #Actor's #Actor:x-align and #Actor:y-align properties
+//  to fill the available size
+//  - if the #BoxLayout:homogeneous boolean propert is set, then all widgets will
+//  get the same size, ignoring expand settings and the preferred sizes
+//
+// It is possible to control the spacing between children of a
+// #BoxLayout by using box_layout_set_spacing().
 // @extends LayoutManager,
 #[derive(Default, Debug, Clone)]
 pub struct BoxLayout {
diff --git a/src/pure/brightness_contrast_effect.rs b/src/pure/brightness_contrast_effect.rs
index ccddf08..84ab74a 100644
--- a/src/pure/brightness_contrast_effect.rs
+++ b/src/pure/brightness_contrast_effect.rs
@@ -1,13 +1,16 @@
-use super::HandlerId;
 use std::fmt;
 
-// * @short_description: Increase/decrease brightness and/or contrast of actor.
-// * @see_also: #Effect, #OffscreenEffect
-// *
-// * #BrightnessContrastEffect is a sub-class of #Effect that
-// * changes the overall brightness of a #Actor.
-// *
-// * #BrightnessContrastEffect is available since  1.10
+use dx::platform::core::Pipeline;
+
+use super::HandlerId;
+
+// @short_description: Increase/decrease brightness and/or contrast of actor.
+// @see_also: #Effect, #OffscreenEffect
+//
+// #BrightnessContrastEffect is a sub-class of #Effect that
+// changes the overall brightness of a #Actor.
+//
+// #BrightnessContrastEffect is available since  1.10
 // @extends OffscreenEffect, Effect, ActorMeta
 #[derive(Default)]
 pub struct BrightnessContrastEffect {
@@ -29,7 +32,7 @@ pub struct BrightnessContrastEffect {
     tex_width: i32,
     tex_height: i32,
 
-    pipeline: Option<dx::pure::Pipeline>,
+    pipeline: Option<Pipeline>,
 }
 
 impl BrightnessContrastEffect {
diff --git a/src/pure/child_meta.rs b/src/pure/child_meta.rs
index e47dff3..40507b3 100644
--- a/src/pure/child_meta.rs
+++ b/src/pure/child_meta.rs
@@ -4,49 +4,48 @@ use super::{Actor, Container};
 use std::fmt;
 
 
-// * SECTION:clutter-child-meta
-// * @short_description: Wrapper for actors inside a container
-// *
-// * #ChildMeta is a wrapper object created by #Container
-// * implementations in order to store child-specific data and properties.
-// *
-// * A #ChildMeta wraps a #Actor inside a #Container.
-// * ChildMeta:
-// * @container: the container handling this data
-// * @actor: the actor wrapped by this data
-// * 
-// * Base interface for container specific state for child actors. A child
-// * data is meant to be used when you need to keep track of information
-// * about each individual child added to a container.
-// *
-// * In order to use it you should create your own subclass of
-// * #ChildMeta and set the #ContainerIface child_meta_type
-// * interface member to your subclass type, like:
-// *
-// * |[
-// * static void
-// * my_container_iface_init (ContainerIface *iface)
-// * {
-// *   // set the rest of the #Container vtable
-// *
-// *   container_iface->child_meta_type  = MY_TYPE_CHILD_META;
-// * }
-// * ]|
-// *
-// * This will automatically create a #ChildMeta of type
-// * `MY_TYPE_CHILD_META` for every actor that is added to the container.
-// *
-// * The child data for an actor can be retrieved using the
-// * clutter_container_get_child_meta() function.
-// * 
-// * The properties of the data and your subclass can be manipulated with
-// * clutter_container_child_set() and clutter_container_child_get() which
-// * act like g_object_set() and g_object_get().
-// *
-// * You can provide hooks for your own storage as well as control the
-// * instantiation by overriding the #ContainerIface virtual functions
-// * #ContainerIface.create_child_meta(), #ContainerIface.destroy_child_meta(),
-// * and #ContainerIface.get_child_meta().
+// @short_description: Wrapper for actors inside a container
+//
+// #ChildMeta is a wrapper object created by #Container
+// implementations in order to store child-specific data and properties.
+//
+// A #ChildMeta wraps a #Actor inside a #Container.
+// ChildMeta:
+// @container: the container handling this data
+// @actor: the actor wrapped by this data
+// 
+// Base interface for container specific state for child actors. A child
+// data is meant to be used when you need to keep track of information
+// about each individual child added to a container.
+//
+// In order to use it you should create your own subclass of
+// #ChildMeta and set the #ContainerIface child_meta_type
+// interface member to your subclass type, like:
+//
+// ```
+// static void
+// my_container_iface_init (ContainerIface *iface)
+// {
+//   // set the rest of the #Container vtable
+//
+//   container_iface->child_meta_type  = MY_TYPE_CHILD_META;
+// }
+// ```
+//
+// This will automatically create a #ChildMeta of type
+// `MY_TYPE_CHILD_META` for every actor that is added to the container.
+//
+// The child data for an actor can be retrieved using the
+// container_get_child_meta() function.
+// 
+// The properties of the data and your subclass can be manipulated with
+// container_child_set() and container_child_get() which
+// act like g_object_set() and g_object_get().
+//
+// You can provide hooks for your own storage as well as control the
+// instantiation by overriding the #ContainerIface virtual functions
+// #ContainerIface.create_child_meta(), #ContainerIface.destroy_child_meta(),
+// and #ContainerIface.get_child_meta().
 
 #[derive(Debug, Clone)]
 pub struct ChildMeta {
diff --git a/src/pure/click_action.rs b/src/pure/click_action.rs
index 3f37449..874f585 100644
--- a/src/pure/click_action.rs
+++ b/src/pure/click_action.rs
@@ -1,73 +1,72 @@
-use super::{Actor, EventSequence, HandlerId, LongPressState, ModifierType};
+use super::{Action, Actor, EventSequence, HandlerId, LongPressState, ModifierType};
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-click-action
-// * @Title: ClickAction
-// * @Short_Description: Action for clickable actors
-// *
-// * #ClickAction is a sub-class of #Action that implements
-// * the logic for clickable actors, by using the low level events of
-// * #Actor, such as #Actor::button-press-event and
-// * #Actor::button-release-event, to synthesize the high level
-// * #ClickAction::clicked signal.
-// *
-// * To use #ClickAction you just need to apply it to a #Actor
-// * using clutter_actor_add_action() and connect to the
-// * #ClickAction::clicked signal:
-// *
-// * |[
-// *   Action *action = clutter_click_action_new ();
-// *
-// *   clutter_actor_add_action (actor, action);
-// *
-// *   g_signal_connect (action, "clicked", G_CALLBACK (on_clicked), NULL);
-// * ]|
-// *
-// * #ClickAction also supports long press gestures: a long press is
-// * activated if the pointer remains pressed within a certain threshold (as
-// * defined by the #ClickAction:long-press-threshold property) for a
-// * minimum amount of time (as the defined by the
-// * #ClickAction:long-press-duration property).
-// * The #ClickAction::long-press signal is emitted multiple times,
-// * using different #LongPressState values; to handle long presses
-// * you should connect to the #ClickAction::long-press signal and
-// * handle the different states:
-// *
-// * |[
-// *   static gboolean
-// *   on_long_press (ClickAction    *action,
-// *                  Actor          *actor,
-// *                  LongPressState  state)
-// *   {
-// *     switch (state)
-// *       {
-// *       case CLUTTER_LONG_PRESS_QUERY:
-// *         /&ast; return TRUE if the actor should support long press
-// *          &ast; gestures, and FALSE otherwise; this state will be
-// *          &ast; emitted on button presses
-// *          &ast;/
-// *         return TRUE;
-// *
-// *       case CLUTTER_LONG_PRESS_ACTIVATE:
-// *         /&ast; this state is emitted if the minimum duration has
-// *          &ast; been reached without the gesture being cancelled.
-// *          &ast; the return value is not used
-// *          &ast;/
-// *         return TRUE;
-// *
-// *       case CLUTTER_LONG_PRESS_CANCEL:
-// *         /&ast; this state is emitted if the long press was cancelled;
-// *          &ast; for instance, the pointer went outside the actor or the
-// *          &ast; allowed threshold, or the button was released before
-// *          &ast; the minimum duration was reached. the return value is
-// *          &ast; not used
-// *          &ast;/
-// *         return FALSE;
-// *       }
-// *   }
-// * ]|
-// *
+// @Title: ClickAction
+// @Short_Description: Action for clickable actors
+//
+// #ClickAction is a sub-class of #Action that implements
+// the logic for clickable actors, by using the low level events of
+// #Actor, such as #Actor::button-press-event and
+// #Actor::button-release-event, to synthesize the high level
+// #ClickAction::clicked signal.
+//
+// To use #ClickAction you just need to apply it to a #Actor
+// using actor_add_action() and connect to the
+// #ClickAction::clicked signal:
+//
+// ```
+//   Action *action = click_action_new ();
+//
+//   actor_add_action (actor, action);
+//
+//   g_signal_connect (action, "clicked", G_CALLBACK (on_clicked), NULL);
+// ```
+//
+// #ClickAction also supports long press gestures: a long press is
+// activated if the pointer remains pressed within a certain threshold (as
+// defined by the #ClickAction:long-press-threshold property) for a
+// minimum amount of time (as the defined by the
+// #ClickAction:long-press-duration property).
+// The #ClickAction::long-press signal is emitted multiple times,
+// using different #LongPressState values; to handle long presses
+// you should connect to the #ClickAction::long-press signal and
+// handle the different states:
+//
+// ```
+//   static gboolean
+//   on_long_press (ClickAction    *action,
+//                  Actor          *actor,
+//                  LongPressState  state)
+//   {
+//     switch (state)
+//       {
+//       case LONG_PRESS_QUERY:
+//         /&ast; return TRUE if the actor should support long press
+//          &ast; gestures, and FALSE otherwise; this state will be
+//          &ast; emitted on button presses
+//          &ast;/
+//         return TRUE;
+//
+//       case LONG_PRESS_ACTIVATE:
+//         /&ast; this state is emitted if the minimum duration has
+//          &ast; been reached without the gesture being cancelled.
+//          &ast; the return value is not used
+//          &ast;/
+//         return TRUE;
+//
+//       case LONG_PRESS_CANCEL:
+//         /&ast; this state is emitted if the long press was cancelled;
+//          &ast; for instance, the pointer went outside the actor or the
+//          &ast; allowed threshold, or the button was released before
+//          &ast; the minimum duration was reached. the return value is
+//          &ast; not used
+//          &ast;/
+//         return FALSE;
+//       }
+//   }
+// ```
+//
 // @extends Action, ActorMeta
 #[derive(Default, Debug, Clone)]
 pub struct ClickAction {
@@ -112,6 +111,15 @@ impl AsRef<ClickAction> for ClickAction {
     }
 }
 
+impl Is<Action> for ClickAction {}
+
+impl AsRef<Action> for ClickAction {
+    fn as_ref(&self) -> &Action {
+        // self
+        unimplemented!()
+    }
+}
+
 /// Trait containing all `ClickAction` methods.
 ///
 /// # Implementors
diff --git a/src/pure/clone.rs b/src/pure/clone.rs
index 3a68cf0..e4478fe 100644
--- a/src/pure/clone.rs
+++ b/src/pure/clone.rs
@@ -2,16 +2,16 @@ use super::{Actor, HandlerId};
 use crate::prelude::*;
 use std::fmt;
 
-// * @short_description: An actor that displays a clone of a source actor
-// *
-// * #Clone is a #Actor which draws with the paint
-// * function of another actor, scaled to fit its own allocation.
-// *
-// * #Clone can be used to efficiently clone any other actor.
-// *
-// * Unlike clutter_texture_new_from_actor(), #Clone does not require
-// * the presence of support for FBOs in the underlying GL or GLES
-// * implementation.
+// @short_description: An actor that displays a clone of a source actor
+//
+// #Clone is a #Actor which draws with the paint
+// function of another actor, scaled to fit its own allocation.
+//
+// #Clone can be used to efficiently clone any other actor.
+//
+// Unlike texture_new_from_actor(), #Clone does not require
+// the presence of support for FBOs in the underlying GL or GLES
+// implementation.
 // TODO: implements atk::ImplementorIface, Scriptable
 // @implements Animatable, Container
 // @extends Actor
diff --git a/src/pure/color_node.rs b/src/pure/color_node.rs
index c63ddee..47d7014 100644
--- a/src/pure/color_node.rs
+++ b/src/pure/color_node.rs
@@ -1,6 +1,7 @@
-use crate::{Color};
 use std::fmt;
 
+use crate::foundation::colorspace::Color;
+
 // @extends PipelineNode, PaintNode
 pub struct ColorNode {
 }
diff --git a/src/pure/colorize_effect.rs b/src/pure/colorize_effect.rs
index 151f231..63dd298 100644
--- a/src/pure/colorize_effect.rs
+++ b/src/pure/colorize_effect.rs
@@ -1,13 +1,17 @@
-use super::HandlerId;
-use crate::{Color, RgbaColor};
 use std::fmt;
 
-// * SECTION:clutter-colorize-effect
-// * @short_description: A colorization effect
-// * @see_also: #Effect, #OffscreenEffect
-// *
-// * #ColorizeEffect is a sub-class of #Effect that
-// * colorizes an actor with the given tint.
+use dx::{
+    foundation::colorspace::{Color, RgbaColor},
+    platform::core::Pipeline,
+};
+
+use super::HandlerId;
+
+// @short_description: A colorization effect
+// @see_also: #Effect, #OffscreenEffect
+//
+// #ColorizeEffect is a sub-class of #Effect that
+// colorizes an actor with the given tint.
 
 // @extends OffscreenEffect, Effect, ActorMeta
 pub struct ColorizeEffect {
@@ -21,7 +25,7 @@ pub struct ColorizeEffect {
     tex_width: i32,
     tex_height: i32,
 
-    pipeline: Option<dx::pure::Pipeline>,
+    pipeline: Option<Pipeline>,
 }
 
 impl ColorizeEffect {
diff --git a/src/pure/constraint.rs b/src/pure/constraint.rs
index e33e5bc..ed41b5d 100644
--- a/src/pure/constraint.rs
+++ b/src/pure/constraint.rs
@@ -1,109 +1,108 @@
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-constraint
-// * @Title: Constraint
-// * @Short_Description: Abstract class for constraints on position or size
-// * @See_Also: #Action
-// *
-// * #Constraint is a base abstract class for modifiers of a #Actor
-// * position or size.
-// *
-// * A #Constraint sub-class should contain the logic for modifying
-// * the position or size of the #Actor to which it is applied, by
-// * updating the actor's allocation. Each #Constraint can change the
-// * allocation of the actor to which they are applied by overriding the
-// * #ConstraintClass.update_allocation() virtual function.
-// *
-// * #Constraint is available since  1.4
-// *
-// * ## Using Constraints
-// *
-// * Constraints can be used with fixed layout managers, like
-// * #FixedLayout, or with actors implicitly using a fixed layout
-// * manager, like #Group and #Stage.
-// *
-// * Constraints provide a way to build user interfaces by using
-// * relations between #Actors, without explicit fixed
-// * positioning and sizing, similarly to how fluid layout managers like
-// * #BoxLayout and #TableLayout lay out their children.
-// *
-// * Constraints are attached to a #Actor, and are available
-// * for inspection using clutter_actor_get_constraints().
-// *
-// *  provides different implementation of the #Constraint
-// * abstract class, for instance:
-// *
-// *  - #AlignConstraint, a constraint that can be used to align
-// *  an actor to another one on either the horizontal or the vertical
-// *  axis, using a normalized value between 0 and 1.
-// *  - #BindConstraint, a constraint binds the X, Y, width or height
-// *  of an actor to the corresponding position or size of a source actor,
-// *  with or without an offset.
-// *  - #SnapConstraint, a constraint that "snaps" together the edges
-// *  of two #Actors; if an actor uses two constraints on both its
-// *  horizontal or vertical edges then it can also expand to fit the empty
-// *  space.
-// *
-// * The [constraints example](https://git.gnome.org/browse/clutter/tree/examples/constraints.c?h=clutter-1.18)
-// * uses various types of #Constraints to lay out three actors on a
-// * resizable stage. Only the central actor has an explicit size, and no
-// * actor has an explicit position.
-// *
-// *  - The #Actor with #Actor:name `layerA` is explicitly
-// *  sized to 100 pixels by 25 pixels, and it's added to the #Stage
-// *  - two #AlignConstraints are used to anchor `layerA` to the
-// *  center of the stage, by using 0.5 as the alignment #AlignConstraint:factor on
-// *  both the X and Y axis
-// *  - the #Actor with #Actor:name `layerB` is added to the
-// *  #Stage with no explicit size
-// *  - the #Actor:x and #Actor:width of `layerB` are bound
-// *  to the same properties of `layerA` using two #BindConstraint
-// *  objects, thus keeping `layerB` aligned to `layerA`
-// *  - the top edge of `layerB` is snapped together with the bottom edge
-// *  of `layerA`; the bottom edge of `layerB` is also snapped together with
-// *  the bottom edge of the #Stage; an offset is  given to the two
-// *  #SnapConstraintss to allow for some padding; since `layerB` is
-// *  snapped between two different #Actors, its height is stretched
-// *  to match the gap
-// *  - the #Actor with #Actor:name `layerC` mirrors `layerB`,
-// *  snapping the top edge of the #Stage to the top edge of `layerC`
-// *  and the top edge of `layerA` to the bottom edge of `layerC`
-// *
-// * You can try resizing interactively the #Stage and verify
-// * that the three #Actors maintain the same position and
-// * size relative to each other, and to the #Stage.
-// *
-// * It is important to note that  does not avoid loops or
-// * competing constraints; if two or more #Constraints
-// * are operating on the same positional or dimensional attributes of an
-// * actor, or if the constraints on two different actors depend on each
-// * other, then the behavior is undefined.
-// *
-// * ## Implementing a Constraint
-// *
-// * Creating a sub-class of #Constraint requires the
-// * implementation of the #ConstraintClass.update_allocation()
-// * virtual function.
-// *
-// * The `update_allocation()` virtual function is called during the
-// * allocation sequence of a #Actor, and allows any #Constraint
-// * attached to that actor to modify the allocation before it is passed to
-// * the actor's #ActorClass.allocate() implementation.
-// *
-// * The #ActorBox passed to the `update_allocation()` implementation
-// * contains the original allocation of the #Actor, plus the eventual
-// * modifications applied by the other #Constraints, in the same order
-// * the constraints have been applied to the actor.
-// *
-// * It is not necessary for a #Constraint sub-class to chain
-// * up to the parent's implementation.
-// *
-// * If a #Constraint is parametrized - i.e. if it contains
-// * properties that affect the way the constraint is implemented - it should
-// * call clutter_actor_queue_relayout() on the actor to which it is attached
-// * to whenever any parameter is changed. The actor to which it is attached
-// * can be recovered at any point using clutter_actor_meta_get_actor().
+// @Title: Constraint
+// @Short_Description: Abstract class for constraints on position or size
+// @See_Also: #Action
+//
+// #Constraint is a base abstract class for modifiers of a #Actor
+// position or size.
+//
+// A #Constraint sub-class should contain the logic for modifying
+// the position or size of the #Actor to which it is applied, by
+// updating the actor's allocation. Each #Constraint can change the
+// allocation of the actor to which they are applied by overriding the
+// #ConstraintClass.update_allocation() virtual function.
+//
+// #Constraint is available since  1.4
+//
+// ## Using Constraints
+//
+// Constraints can be used with fixed layout managers, like
+// #FixedLayout, or with actors implicitly using a fixed layout
+// manager, like #Group and #Stage.
+//
+// Constraints provide a way to build user interfaces by using
+// relations between #Actors, without explicit fixed
+// positioning and sizing, similarly to how fluid layout managers like
+// #BoxLayout and #TableLayout lay out their children.
+//
+// Constraints are attached to a #Actor, and are available
+// for inspection using actor_get_constraints().
+//
+//  provides different implementation of the #Constraint
+// abstract class, for instance:
+//
+//  - #AlignConstraint, a constraint that can be used to align
+//  an actor to another one on either the horizontal or the vertical
+//  axis, using a normalized value between 0 and 1.
+//  - #BindConstraint, a constraint binds the X, Y, width or height
+//  of an actor to the corresponding position or size of a source actor,
+//  with or without an offset.
+//  - #SnapConstraint, a constraint that "snaps" together the edges
+//  of two #Actors; if an actor uses two constraints on both its
+//  horizontal or vertical edges then it can also expand to fit the empty
+//  space.
+//
+// The [constraints example](https://git.gnome.org/browse/clutter/tree/examples/constraints.c?h=1.18)
+// uses various types of #Constraints to lay out three actors on a
+// resizable stage. Only the central actor has an explicit size, and no
+// actor has an explicit position.
+//
+//  - The #Actor with #Actor:name `layerA` is explicitly
+//  sized to 100 pixels by 25 pixels, and it's added to the #Stage
+//  - two #AlignConstraints are used to anchor `layerA` to the
+//  center of the stage, by using 0.5 as the alignment #AlignConstraint:factor on
+//  both the X and Y axis
+//  - the #Actor with #Actor:name `layerB` is added to the
+//  #Stage with no explicit size
+//  - the #Actor:x and #Actor:width of `layerB` are bound
+//  to the same properties of `layerA` using two #BindConstraint
+//  objects, thus keeping `layerB` aligned to `layerA`
+//  - the top edge of `layerB` is snapped together with the bottom edge
+//  of `layerA`; the bottom edge of `layerB` is also snapped together with
+//  the bottom edge of the #Stage; an offset is  given to the two
+//  #SnapConstraintss to allow for some padding; since `layerB` is
+//  snapped between two different #Actors, its height is stretched
+//  to match the gap
+//  - the #Actor with #Actor:name `layerC` mirrors `layerB`,
+//  snapping the top edge of the #Stage to the top edge of `layerC`
+//  and the top edge of `layerA` to the bottom edge of `layerC`
+//
+// You can try resizing interactively the #Stage and verify
+// that the three #Actors maintain the same position and
+// size relative to each other, and to the #Stage.
+//
+// It is important to note that  does not avoid loops or
+// competing constraints; if two or more #Constraints
+// are operating on the same positional or dimensional attributes of an
+// actor, or if the constraints on two different actors depend on each
+// other, then the behavior is undefined.
+//
+// ## Implementing a Constraint
+//
+// Creating a sub-class of #Constraint requires the
+// implementation of the #ConstraintClass.update_allocation()
+// virtual function.
+//
+// The `update_allocation()` virtual function is called during the
+// allocation sequence of a #Actor, and allows any #Constraint
+// attached to that actor to modify the allocation before it is passed to
+// the actor's #ActorClass.allocate() implementation.
+//
+// The #ActorBox passed to the `update_allocation()` implementation
+// contains the original allocation of the #Actor, plus the eventual
+// modifications applied by the other #Constraints, in the same order
+// the constraints have been applied to the actor.
+//
+// It is not necessary for a #Constraint sub-class to chain
+// up to the parent's implementation.
+//
+// If a #Constraint is parametrized - i.e. if it contains
+// properties that affect the way the constraint is implemented - it should
+// call actor_queue_relayout() on the actor to which it is attached
+// to whenever any parameter is changed. The actor to which it is attached
+// can be recovered at any point using actor_meta_get_actor().
 // @extends ActorMeta,
 #[derive(Debug, Clone)]
 pub struct Constraint {
diff --git a/src/pure/container.rs b/src/pure/container.rs
index cac89b6..914a1da 100644
--- a/src/pure/container.rs
+++ b/src/pure/container.rs
@@ -1,59 +1,59 @@
+#![allow(unused_imports)]
 use super::{Actor, ChildMeta, HandlerId};
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-container
-// * @short_description: An interface for container actors
-// *
-// * #Container is an interface implemented by #Actor, and
-// * it provides some common API for notifying when a child actor is added
-// * or removed, as well as the infrastructure for accessing child properties
-// * through #ChildMeta.
-// *
-// * Until  1.10, the #Container interface was also the public
-// * API for implementing container actors; this part of the interface has
-// * been deprecated: #Container has a default implementation which
-// * defers to #Actor the child addition and removal, as well as the
-// * iteration. See the documentation of #ContainerIface for the list
-// * of virtual functions that should be overridden.
-
-// * ContainerIface:
-// * @add: virtual function for adding an actor to the container. This virtual
-// *   function is deprecated, and it should not be overridden.
-// * @remove: virtual function for removing an actor from the container. This
-// *   virtual function is deprecated, and it should not be overridden.
-// * @foreach: virtual function for iterating over the container's children.
-// *   This virtual function is deprecated, and it should not be overridden.
-// * @foreach_with_internals: virtual functions for iterating over the
-// *   container's children, both added using the #Container API
-// *   and internal children. The implementation of this virtual function
-// *   is required only if the #Container implementation has
-// *   internal children. This virtual function is deprecated, and it should
-// *   not be overridden.
-// * @raise: virtual function for raising a child. This virtual function is
-// *   deprecated and it should not be overridden.
-// * @lower: virtual function for lowering a child. This virtual function is
-// *   deprecated and it should not be overridden.
-// * @sort_depth_order: virtual function for sorting the children of a
-// *   container depending on their depth. This virtual function is deprecated
-// *   and it should not be overridden.
-// * @child_meta_type: The GType used for storing auxiliary information about
-// *   each of the containers children.
-// * @create_child_meta: virtual function that gets called for each added
-// *   child, the function should instantiate an object of type
-// *   #ContainerIface::child_meta_type, set the container and actor
-// *   fields in the instance and add the record to a data structure for
-// *   subsequent access for #ContainerIface::get_child_meta
-// * @destroy_child_meta: virtual function that gets called when a child is
-// *   removed; it shuld release all resources held by the record
-// * @get_child_meta: return the record for a container child
-// * @actor_added: class handler for #Container::actor-added
-// * @actor_removed: class handler for #Container::actor-removed
-// * @child_notify: class handler for #Container::child-notify
-// *
-// * Base interface for container actors. The @add, @remove and @foreach
-// * virtual functions must be provided by any implementation; the other
-// * virtual functions are optional.
+// @short_description: An interface for container actors
+//
+// #Container is an interface implemented by #Actor, and
+// it provides some common API for notifying when a child actor is added
+// or removed, as well as the infrastructure for accessing child properties
+// through #ChildMeta.
+//
+// Until  1.10, the #Container interface was also the public
+// API for implementing container actors; this part of the interface has
+// been deprecated: #Container has a default implementation which
+// defers to #Actor the child addition and removal, as well as the
+// iteration. See the documentation of #ContainerIface for the list
+// of virtual functions that should be overridden.
+
+// ContainerIface:
+// @add: virtual function for adding an actor to the container. This virtual
+//   function is deprecated, and it should not be overridden.
+// @remove: virtual function for removing an actor from the container. This
+//   virtual function is deprecated, and it should not be overridden.
+// @foreach: virtual function for iterating over the container's children.
+//   This virtual function is deprecated, and it should not be overridden.
+// @foreach_with_internals: virtual functions for iterating over the
+//   container's children, both added using the #Container API
+//   and internal children. The implementation of this virtual function
+//   is required only if the #Container implementation has
+//   internal children. This virtual function is deprecated, and it should
+//   not be overridden.
+// @raise: virtual function for raising a child. This virtual function is
+//   deprecated and it should not be overridden.
+// @lower: virtual function for lowering a child. This virtual function is
+//   deprecated and it should not be overridden.
+// @sort_depth_order: virtual function for sorting the children of a
+//   container depending on their depth. This virtual function is deprecated
+//   and it should not be overridden.
+// @child_meta_type: The GType used for storing auxiliary information about
+//   each of the containers children.
+// @create_child_meta: virtual function that gets called for each added
+//   child, the function should instantiate an object of type
+//   #ContainerIface::child_meta_type, set the container and actor
+//   fields in the instance and add the record to a data structure for
+//   subsequent access for #ContainerIface::get_child_meta
+// @destroy_child_meta: virtual function that gets called when a child is
+//   removed; it shuld release all resources held by the record
+// @get_child_meta: return the record for a container child
+// @actor_added: class handler for #Container::actor-added
+// @actor_removed: class handler for #Container::actor-removed
+// @child_notify: class handler for #Container::child-notify
+//
+// Base interface for container actors. The @add, @remove and @foreach
+// virtual functions must be provided by any implementation; the other
+// virtual functions are optional.
 
 #[derive(Debug, Clone)]
 pub struct Container {}
@@ -74,7 +74,7 @@ impl Container {
     //     property_name: &str,
     // ) -> Option<glib::ParamSpec> {
     //     unsafe {
-    //         from_glib_none(ffi::clutter_container_class_find_child_property(
+    //         from_glib_none(ffi::container_class_find_child_property(
     //             klass.to_glib_none_mut().0,
     //             property_name.to_glib_none().0,
     //         ))
@@ -95,7 +95,7 @@ impl Container {
     //     unsafe {
     //         let mut n_properties = mem::MaybeUninit::uninit();
     //         let ret = FromGlibContainer::from_glib_full_num(
-    //             ffi::clutter_container_class_list_child_properties(
+    //             ffi::container_class_list_child_properties(
     //                 klass.to_glib_none_mut().0,
     //                 n_properties.as_mut_ptr(),
     //             ),
@@ -123,20 +123,20 @@ impl AsRef<Container> for Container {
 pub trait ContainerExt: 'static {
     //fn child_get<P: Is<Actor>>(&self, actor: &P, first_prop: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Gets a container specific property of a child of `self`, In general,
-    /// a copy is made of the property contents and the caller is responsible for
-    /// freeing the memory by calling `gobject::Value::unset`.
-    ///
-    /// Note that `Container::child_set_property` is really intended for
-    /// language bindings, `Container::child_set` is much more convenient
-    /// for C programming.
-    /// ## `child`
-    /// a `Actor` that is a child of `self`.
-    /// ## `property`
-    /// the name of the property to set.
-    /// ## `value`
-    /// the value.
-    fn child_get_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &mut glib::Value);
+    // /// Gets a container specific property of a child of `self`, In general,
+    // /// a copy is made of the property contents and the caller is responsible for
+    // /// freeing the memory by calling `gobject::Value::unset`.
+    // ///
+    // /// Note that `Container::child_set_property` is really intended for
+    // /// language bindings, `Container::child_set` is much more convenient
+    // /// for C programming.
+    // /// ## `child`
+    // /// a `Actor` that is a child of `self`.
+    // /// ## `property`
+    // /// the name of the property to set.
+    // /// ## `value`
+    // /// the value.
+    // fn child_get_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &mut glib::Value);
 
     /// Calls the `ContainerIface.child_notify`() virtual function
     /// of `Container`. The default implementation will emit the
@@ -149,14 +149,14 @@ pub trait ContainerExt: 'static {
 
     //fn child_set<P: Is<Actor>>(&self, actor: &P, first_prop: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets a container-specific property on a child of `self`.
-    /// ## `child`
-    /// a `Actor` that is a child of `self`.
-    /// ## `property`
-    /// the name of the property to set.
-    /// ## `value`
-    /// the value.
-    fn child_set_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &glib::Value);
+    // /// Sets a container-specific property on a child of `self`.
+    // /// ## `child`
+    // /// a `Actor` that is a child of `self`.
+    // /// ## `property`
+    // /// the name of the property to set.
+    // /// ## `value`
+    // /// the value.
+    // fn child_set_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &glib::Value);
 
     /// Creates the `ChildMeta` wrapping `actor` inside the
     /// `self`, if the `ContainerIface::child_meta_type`
@@ -218,17 +218,17 @@ pub trait ContainerExt: 'static {
     /// the child that has been removed from `container`
     fn connect_actor_removed<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> HandlerId;
 
-    /// The ::child-notify signal is emitted each time a property is
-    /// being set through the `Container::child_set` and
-    /// `Container::child_set_property` calls.
-    /// ## `actor`
-    /// the child that has had a property set
-    /// ## `pspec`
-    /// the `gobject::ParamSpec` of the property set
-    fn connect_child_notify<F: Fn(&Self, &Actor, &glib::ParamSpec) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId;
+    // /// The ::child-notify signal is emitted each time a property is
+    // /// being set through the `Container::child_set` and
+    // /// `Container::child_set_property` calls.
+    // /// ## `actor`
+    // /// the child that has had a property set
+    // /// ## `pspec`
+    // /// the `gobject::ParamSpec` of the property set
+    // fn connect_child_notify<F: Fn(&Self, &Actor, &glib::ParamSpec) + 'static>(
+    //     &self,
+    //     f: F,
+    // ) -> HandlerId;
 }
 
 impl<O: Is<Container>> ContainerExt for O {
@@ -236,9 +236,9 @@ impl<O: Is<Container>> ContainerExt for O {
     //    unimplemented!()
     //}
 
-    fn child_get_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &mut glib::Value) {
-        unimplemented!()
-    }
+    // fn child_get_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &mut glib::Value) {
+    //     unimplemented!()
+    // }
 
     // fn child_notify<P: Is<Actor>, Q: Is<glib::ParamSpec>>(&self, child: &P, pspec: &Q) {
     //     unimplemented!()
@@ -248,9 +248,9 @@ impl<O: Is<Container>> ContainerExt for O {
     //    unimplemented!()
     //}
 
-    fn child_set_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &glib::Value) {
-        unimplemented!()
-    }
+    // fn child_set_property<P: Is<Actor>>(&self, child: &P, property: &str, value: &glib::Value) {
+    //     unimplemented!()
+    // }
 
     fn create_child_meta<P: Is<Actor>>(&self, actor: &P) {
         unimplemented!()
@@ -276,12 +276,12 @@ impl<O: Is<Container>> ContainerExt for O {
         unimplemented!()
     }
 
-    fn connect_child_notify<F: Fn(&Self, &Actor, &glib::ParamSpec) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
-        unimplemented!()
-    }
+    // fn connect_child_notify<F: Fn(&Self, &Actor, &glib::ParamSpec) + 'static>(
+    //     &self,
+    //     f: F,
+    // ) -> HandlerId {
+    //     unimplemented!()
+    // }
 }
 
 impl fmt::Display for Container {
diff --git a/src/pure/content.rs b/src/pure/content.rs
index abecee1..601ac65 100644
--- a/src/pure/content.rs
+++ b/src/pure/content.rs
@@ -2,32 +2,34 @@ use super::{Actor, HandlerId};
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-content
-// * @Title: Content
-// * @Short_Description: Delegate for painting the content of an actor
-// *
-// * #Content is an interface to implement types responsible for
-// * painting the content of a #Actor.
-// *
-// * Multiple actors can use the same #Content instance, in order
-// * to share the resources associated with painting the same content.
-// *
-// * ContentIface:
-// * @get_preferred_size: virtual function; should be overridden by subclasses
-// *   of #Content that have a natural size
-// * @paint_content: virtual function; called each time the content needs to
-// *   paint itself
-// * @attached: virtual function; called each time a #Content is attached
-// *   to a #Actor.
-// * @detached: virtual function; called each time a #Content is detached
-// *   from a #Actor.
-// * @invalidate: virtual function; called each time a #Content state
-// *   is changed.
-// *
-// * The #ContentIface structure contains only
-// * private data.
+// @Title: Content
+// @Short_Description: Delegate for painting the content of an actor
+//
+// #Content is an interface to implement types responsible for
+// painting the content of a #Actor.
+//
+// Multiple actors can use the same #Content instance, in order
+// to share the resources associated with painting the same content.
+//
+// ContentIface:
+// @get_preferred_size: virtual function; should be overridden by subclasses
+//   of #Content that have a natural size
+// @paint_content: virtual function; called each time the content needs to
+//   paint itself
+// @attached: virtual function; called each time a #Content is attached
+//   to a #Actor.
+// @detached: virtual function; called each time a #Content is detached
+//   from a #Actor.
+// @invalidate: virtual function; called each time a #Content state
+//   is changed.
+//
+// The #ContentIface structure contains only
+// private data.
 #[derive(Debug, Clone)]
-pub struct Content {}
+pub struct Content {
+    pub width: u32,
+    pub height: u32,
+}
 
 impl Object for Content {}
 impl Is<Content> for Content {}
@@ -65,7 +67,7 @@ pub trait ContentExt: 'static {
     /// This function should be called by `Content` implementations when
     /// they change the way a the content should be painted regardless of the
     /// actor state.
-    fn invalidate(&self);
+    fn invalidate(&self) {}
 
     /// This signal is emitted each time a `Content` implementation is
     /// assigned to a `Actor`.
@@ -82,11 +84,8 @@ pub trait ContentExt: 'static {
 
 impl<O: Is<Content>> ContentExt for O {
     fn get_preferred_size(&self) -> Option<(f32, f32)> {
-        unimplemented!()
-    }
-
-    fn invalidate(&self) {
-        unimplemented!()
+        let content = self.as_ref();
+        Some((content.width as f32, content.height as f32))
     }
 
     fn connect_attached<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> HandlerId {
diff --git a/src/pure/deform_effect.rs b/src/pure/deform_effect.rs
index edf8f06..6594bc4 100644
--- a/src/pure/deform_effect.rs
+++ b/src/pure/deform_effect.rs
@@ -1,40 +1,43 @@
-use super::HandlerId;
-use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-deform-effect
-// * @Title: DeformEffect
-// * @Short_Description: A base class for effects deforming the geometry
-// *   of an actor
-// *
-// * #DeformEffect is an abstract class providing all the plumbing
-// * for creating effects that result in the deformation of an actor's
-// * geometry.
-// *
-// * #DeformEffect uses offscreen buffers to render the contents of
-// * a #Actor and then the Cogl vertex buffers API to submit the
-// * geometry to the GPU.
-// *
-// * #DeformEffect is available since  1.4
-// *
-// * ## Implementing DeformEffect
-// *
-// * Sub-classes of #DeformEffect should override the
-// * #DeformEffectClass.deform_vertex() virtual function; this function
-// * is called on every vertex that needs to be deformed by the effect.
-// * Each passed vertex is an in-out parameter that initially contains the
-// * position of the vertex and should be modified according to a specific
-// * deformation algorithm.
+use dx::platform::core::{AttributeBuffer, Pipeline, Primitive};
+
+use crate::prelude::*;
+
+use super::HandlerId;
+
+// @Title: DeformEffect
+// @Short_Description: A base class for effects deforming the geometry
+//   of an actor
+//
+// #DeformEffect is an abstract class providing all the plumbing
+// for creating effects that result in the deformation of an actor's
+// geometry.
+//
+// #DeformEffect uses offscreen buffers to render the contents of
+// a #Actor and then the Cogl vertex buffers API to submit the
+// geometry to the GPU.
+//
+// #DeformEffect is available since  1.4
+//
+// ## Implementing DeformEffect
+//
+// Sub-classes of #DeformEffect should override the
+// #DeformEffectClass.deform_vertex() virtual function; this function
+// is called on every vertex that needs to be deformed by the effect.
+// Each passed vertex is an in-out parameter that initially contains the
+// position of the vertex and should be modified according to a specific
+// deformation algorithm.
 // @extends OffscreenEffect, Effect, ActorMeta,
 pub struct DeformEffect {
-    back_pipeline: Option<dx::pure::Pipeline>,
+    back_pipeline: Option<Pipeline>,
 
     x_tiles: i32,
     y_tiles: i32,
 
-    buffer: Option<dx::pure::AttributeBuffer>,
-    primitive: Option<dx::pure::Primitive>,
-    lines_primitive: Option<dx::pure::Primitive>,
+    buffer: Option<AttributeBuffer>,
+    primitive: Option<Primitive>,
+    lines_primitive: Option<Primitive>,
     n_vertices: i32,
     allocation_id: u64,
 
diff --git a/src/pure/desaturate_effect.rs b/src/pure/desaturate_effect.rs
index 183482b..a343bb0 100644
--- a/src/pure/desaturate_effect.rs
+++ b/src/pure/desaturate_effect.rs
@@ -1,14 +1,16 @@
-use super::{HandlerId, OffscreenEffect};
 use std::fmt;
 
-// * SECTION:clutter-desaturate-effect
-// * @short_description: A desaturation effect
-// * @see_also: #Effect, #OffscreenEffect
-// *
-// * #DesaturateEffect is a sub-class of #Effect that
-// * desaturates the color of an actor and its contents. The strenght
-// * of the desaturation effect is controllable and animatable through
-// * the #DesaturateEffect:factor property.
+use dx::platform::core::Pipeline;
+
+use super::{HandlerId, OffscreenEffect};
+
+// @short_description: A desaturation effect
+// @see_also: #Effect, #OffscreenEffect
+//
+// #DesaturateEffect is a sub-class of #Effect that
+// desaturates the color of an actor and its contents. The strenght
+// of the desaturation effect is controllable and animatable through
+// the #DesaturateEffect:factor property.
 
 // @extends OffscreenEffect, Effect, ActorMeta
 pub struct DesaturateEffect {
@@ -22,7 +24,7 @@ pub struct DesaturateEffect {
     tex_width: i32,
     tex_height: i32,
 
-    pipeline: Option<dx::pure::Pipeline>,
+    pipeline: Option<Pipeline>,
 }
 
 impl DesaturateEffect {
diff --git a/src/pure/device_manager.rs b/src/pure/device_manager.rs
index 37a8273..c53e1c3 100644
--- a/src/pure/device_manager.rs
+++ b/src/pure/device_manager.rs
@@ -2,16 +2,15 @@ use super::{Backend, HandlerId, InputDevice, InputDeviceType};
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-device-manager
-// * @short_description: Maintains the list of input devices
-// *
-// * #DeviceManager is a singleton object, owned by , which
-// * maintains the list of #InputDevice<!-- -->s.
-// *
-// * Depending on the backend used by  it is possible to use the
-// * #DeviceManager::device-added and
-// * #DeviceManager::device-removed to monitor addition and removal
-// * of devices.
+// @short_description: Maintains the list of input devices
+//
+// #DeviceManager is a singleton object, owned by , which
+// maintains the list of #InputDevice<!-- -->s.
+//
+// Depending on the backend used by  it is possible to use the
+// #DeviceManager::device-added and
+// #DeviceManager::device-removed to monitor addition and removal
+// of devices.
 pub struct DeviceManager {
     // back-pointer to the backend
     backend: Option<Backend>,
diff --git a/src/pure/drag_action.rs b/src/pure/drag_action.rs
index 5a78da5..1f4d995 100644
--- a/src/pure/drag_action.rs
+++ b/src/pure/drag_action.rs
@@ -1,44 +1,47 @@
-use super::{Actor, DragAxis, EventSequence, HandlerId, InputDevice, ModifierType, Stage};
-use crate::prelude::*;
-use crate::Rect;
 use std::fmt;
 
-// * @Title: DragAction
-// * @Short_Description: Action enabling dragging on actors
-// *
-// * #DragAction is a sub-class of #Action that implements
-// * all the necessary logic for dragging actors.
-// *
-// * The simplest usage of #DragAction consists in adding it to
-// * a #Actor and setting it as reactive; for instance, the following
-// * code:
-// *
-// * |[<!-- language="C" -->
-// *   clutter_actor_add_action (actor, clutter_drag_action_new ());
-// *   clutter_actor_set_reactive (actor, TRUE);
-// * ]|
-// *
-// * will automatically result in the actor moving to follow the pointer
-// * whenever the pointer's button is pressed over the actor and moved
-// * across the stage.
-// *
-// * The #DragAction will signal the begin and the end of a dragging
-// * through the #DragAction::drag-begin and #DragAction::drag-end
-// * signals, respectively. Each pointer motion during a drag will also result
-// * in the #DragAction::drag-motion signal to be emitted.
-// *
-// * It is also possible to set another #Actor as the dragged actor
-// * by calling clutter_drag_action_set_drag_handle() from within a handle
-// * of the #DragAction::drag-begin signal. The drag handle must be
-// * parented and exist between the emission of #DragAction::drag-begin
-// * and #DragAction::drag-end.
-// *
-// * The [drag-action example](https://git.gnome.org/browse/clutter/tree/examples/drag-action.c?h=clutter-1.18)
-// * allows dragging the rectangle around the stage using a #DragAction.
-// * When pressing the `Shift` key the actor that is being dragged will be a
-// * separate rectangle, and when the drag ends, the original rectangle will be
-// * animated to the final drop coordinates.
-// *
+use crate::prelude::*;
+
+use crate::foundation::Rect;
+
+use super::{Actor, DragAxis, EventSequence, HandlerId, InputDevice, ModifierType, Stage};
+
+// @Title: DragAction
+// @Short_Description: Action enabling dragging on actors
+//
+// #DragAction is a sub-class of #Action that implements
+// all the necessary logic for dragging actors.
+//
+// The simplest usage of #DragAction consists in adding it to
+// a #Actor and setting it as reactive; for instance, the following
+// code:
+//
+// ```
+//   actor_add_action (actor, drag_action_new ());
+//   actor_set_reactive (actor, TRUE);
+// ```
+//
+// will automatically result in the actor moving to follow the pointer
+// whenever the pointer's button is pressed over the actor and moved
+// across the stage.
+//
+// The #DragAction will signal the begin and the end of a dragging
+// through the #DragAction::drag-begin and #DragAction::drag-end
+// signals, respectively. Each pointer motion during a drag will also result
+// in the #DragAction::drag-motion signal to be emitted.
+//
+// It is also possible to set another #Actor as the dragged actor
+// by calling drag_action_set_drag_handle() from within a handle
+// of the #DragAction::drag-begin signal. The drag handle must be
+// parented and exist between the emission of #DragAction::drag-begin
+// and #DragAction::drag-end.
+//
+// The [drag-action example](https://git.gnome.org/browse/clutter/tree/examples/drag-action.c?h=1.18)
+// allows dragging the rectangle around the stage using a #DragAction.
+// When pressing the `Shift` key the actor that is being dragged will be a
+// separate rectangle, and when the drag ends, the original rectangle will be
+// animated to the final drop coordinates.
+//
 // @extends Action, ActorMeta,
 #[derive(Default)]
 pub struct DragAction {
diff --git a/src/pure/drop_action.rs b/src/pure/drop_action.rs
index ba8ea25..5f50de1 100644
--- a/src/pure/drop_action.rs
+++ b/src/pure/drop_action.rs
@@ -3,46 +3,45 @@ use crate::prelude::*;
 use std::fmt;
 
 // typedef struct _DropTarget {
-//     ClutterActor *stage;
+//     Actor *stage;
 
 //     gulong capture_id;
 
 //     GHashTable *actions;
 
-//     ClutterDropAction *last_action;
+//     DropAction *last_action;
 //   } DropTarget;
 
-// * SECTION:clutter-drop-action
-// * @Title: DropAction
-// * @short_description: An action for drop targets
-// *
-// * #DropAction is a #Action that allows a #Actor
-// * implementation to control what happens when an actor dragged using
-// * a #DragAction crosses the target area or when a dragged actor
-// * is released (or "dropped") on the target area.
-// *
-// * A trivial use of #DropAction consists in connecting to the
-// * #DropAction::drop signal and handling the drop from there,
-// * for instance:
-// *
-// * |[<!-- language="C" -->
-// *   Action *action = clutter_drop_action ();
-// *
-// *   g_signal_connect (action, "drop", G_CALLBACK (on_drop), NULL);
-// *   clutter_actor_add_action (an_actor, action);
-// * ]|
-// *
-// * The #DropAction::can-drop can be used to control whether the
-// * #DropAction::drop signal is going to be emitted; returning %FALSE
-// * from a handler connected to the #DropAction::can-drop signal will
-// * cause the #DropAction::drop signal to be skipped when the input
-// * device button is released.
-// *
-// * It's important to note that #DropAction will only work with
-// * actors dragged using #DragAction.
-// *
-// * See [drop-action.c](https://git.gnome.org/browse/clutter/tree/examples/drop-action.c?h=clutter-1.18)
-// * for an example of how to use #DropAction.
+// @Title: DropAction
+// @short_description: An action for drop targets
+//
+// #DropAction is a #Action that allows a #Actor
+// implementation to control what happens when an actor dragged using
+// a #DragAction crosses the target area or when a dragged actor
+// is released (or "dropped") on the target area.
+//
+// A trivial use of #DropAction consists in connecting to the
+// #DropAction::drop signal and handling the drop from there,
+// for instance:
+//
+// ```
+//   Action *action = drop_action ();
+//
+//   g_signal_connect (action, "drop", G_CALLBACK (on_drop), NULL);
+//   actor_add_action (an_actor, action);
+// ```
+//
+// The #DropAction::can-drop can be used to control whether the
+// #DropAction::drop signal is going to be emitted; returning %FALSE
+// from a handler connected to the #DropAction::can-drop signal will
+// cause the #DropAction::drop signal to be skipped when the input
+// device button is released.
+//
+// It's important to note that #DropAction will only work with
+// actors dragged using #DragAction.
+//
+// See [drop-action.c](https://git.gnome.org/browse/clutter/tree/examples/drop-action.c?h=1.18)
+// for an example of how to use #DropAction.
 // @extends Action, ActorMeta
 #[derive(Default, Debug, Clone)]
 pub struct DropAction {
diff --git a/src/pure/effect.rs b/src/pure/effect.rs
index 74630ff..0ef0ca4 100644
--- a/src/pure/effect.rs
+++ b/src/pure/effect.rs
@@ -1,140 +1,139 @@
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-effect
-// * @short_description: Base class for actor effects
-// *
-// * The #Effect class provides a default type and API for creating
-// * effects for generic actors.
-// *
-// * Effects are a #ActorMeta sub-class that modify the way an actor
-// * is painted in a way that is not part of the actor's implementation.
-// *
-// * Effects should be the preferred way to affect the paint sequence of an
-// * actor without sub-classing the actor itself and overriding the
-// * #ActorClass.paint()_ virtual function.
-// *
-// * ## Implementing a Effect
-// *
-// * Creating a sub-class of #Effect requires overriding the
-// * #EffectClass.paint() method. The implementation of the function should look
-// * something like this:
-// *
-// * |[
-// * void effect_paint (Effect *effect, EffectPaintFlags flags)
-// * {
-// *   // Set up initialisation of the paint such as binding a
-// *   // CoglOffscreen or other operations
-// *
-// *   // Chain to the next item in the paint sequence. This will either call
-// *   // ‘paint’ on the next effect or just paint the actor if this is
-// *   // the last effect.
-// *   Actor *actor =
-// *     clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
-// *
-// *   clutter_actor_continue_paint (actor);
-// *
-// *   // perform any cleanup of state, such as popping the CoglOffscreen
-// * }
-// * ]|
-// *
-// * The effect can optionally avoid calling clutter_actor_continue_paint() to skip any
-// * further stages of the paint sequence. This is useful for example if the effect
-// * contains a cached image of the actor. In that case it can optimise painting by
-// * avoiding the actor paint and instead painting the cached image.
-// *
-// * The %CLUTTER_EFFECT_PAINT_ACTOR_DIRTY flag is useful in this case.  will set
-// * this flag when a redraw has been queued on the actor since it was last painted. The
-// * effect can use this information to decide if the cached image is still valid.
-// *
-// * ## A simple Effect implementation
-// *
-// * The example below creates two rectangles: one will be painted "behind" the actor,
-// * while another will be painted "on top" of the actor.
-// *
-// * The #ActorMetaClass.set_actor() implementation will create the two materials
-// * used for the two different rectangles; the #EffectClass.paint() implementation
-// * will paint the first material using dx_rectangle(), before continuing and then it
-// * will paint paint the second material after.
-// *
-// *  |[
-// *  typedef struct {
-// *    Effect parent_instance;
-// *
-// *    CoglHandle rect_1;
-// *    CoglHandle rect_2;
-// *  } MyEffect;
-// *
-// *  typedef struct _EffectClass MyEffectClass;
-// *
-// *  G_DEFINE_TYPE (MyEffect, my_effect, CLUTTER_TYPE_EFFECT);
-// *
-// *  static void
-// *  my_effect_set_actor (ActorMeta *meta,
-// *                       Actor     *actor)
-// *  {
-// *    MyEffect *self = MY_EFFECT (meta);
-// *
-// *    // Clear the previous state //
-// *    if (self->rect_1)
-// *      {
-// *        dx_handle_unref (self->rect_1);
-// *        self->rect_1 = NULL;
-// *      }
-// *
-// *    if (self->rect_2)
-// *      {
-// *        dx_handle_unref (self->rect_2);
-// *        self->rect_2 = NULL;
-// *      }
-// *
-// *    // Maintain a pointer to the actor
-// *    self->actor = actor;
-// *
-// *    // If we've been detached by the actor then we should just bail out here
-// *    if (self->actor == NULL)
-// *      return;
-// *
-// *    // Create a red material
-// *    self->rect_1 = dx_material_new ();
-// *    dx_material_set_color4f (self->rect_1, 1.0, 0.0, 0.0, 1.0);
-// *
-// *    // Create a green material
-// *    self->rect_2 = dx_material_new ();
-// *    dx_material_set_color4f (self->rect_2, 0.0, 1.0, 0.0, 1.0);
-// *  }
-// *
-// *  static gboolean
-// *  my_effect_paint (Effect *effect)
-// *  {
-// *    MyEffect *self = MY_EFFECT (effect);
-// *    gfloat width, height;
-// *
-// *    clutter_actor_get_size (self->actor, &width, &height);
-// *
-// *    // Paint the first rectangle in the upper left quadrant
-// *    dx_set_source (self->rect_1);
-// *    dx_rectangle (0, 0, width / 2, height / 2);
-// *
-// *    // Continue to the rest of the paint sequence
-// *    clutter_actor_continue_paint (self->actor);
-// *
-// *    // Paint the second rectangle in the lower right quadrant
-// *    dx_set_source (self->rect_2);
-// *    dx_rectangle (width / 2, height / 2, width, height);
-// *  }
-// *
-// *  static void
-// *  my_effect_class_init (MyEffectClass *klass)
-// *  {
-// *    ActorMetaClas *meta_class = CLUTTER_ACTOR_META_CLASS (klass);
-// *
-// *    meta_class->set_actor = my_effect_set_actor;
-// *
-// *    klass->paint = my_effect_paint;
-// *  }
-// * ]|
-// *
+// @short_description: Base class for actor effects
+//
+// The #Effect class provides a default type and API for creating
+// effects for generic actors.
+//
+// Effects are a #ActorMeta sub-class that modify the way an actor
+// is painted in a way that is not part of the actor's implementation.
+//
+// Effects should be the preferred way to affect the paint sequence of an
+// actor without sub-classing the actor itself and overriding the
+// #ActorClass.paint()_ virtual function.
+//
+// ## Implementing a Effect
+//
+// Creating a sub-class of #Effect requires overriding the
+// #EffectClass.paint() method. The implementation of the function should look
+// something like this:
+//
+// ```
+// void effect_paint (Effect *effect, EffectPaintFlags flags)
+// {
+//   // Set up initialisation of the paint such as binding a
+//   // CoglOffscreen or other operations
+//
+//   // Chain to the next item in the paint sequence. This will either call
+//   // ‘paint’ on the next effect or just paint the actor if this is
+//   // the last effect.
+//   Actor *actor =
+//     actor_meta_get_actor (ACTOR_META (effect));
+//
+//   actor_continue_paint (actor);
+//
+//   // perform any cleanup of state, such as popping the CoglOffscreen
+// }
+// ```
+//
+// The effect can optionally avoid calling actor_continue_paint() to skip any
+// further stages of the paint sequence. This is useful for example if the effect
+// contains a cached image of the actor. In that case it can optimise painting by
+// avoiding the actor paint and instead painting the cached image.
+//
+// The %EFFECT_PAINT_ACTOR_DIRTY flag is useful in this case.  will set
+// this flag when a redraw has been queued on the actor since it was last painted. The
+// effect can use this information to decide if the cached image is still valid.
+//
+// ## A simple Effect implementation
+//
+// The example below creates two rectangles: one will be painted "behind" the actor,
+// while another will be painted "on top" of the actor.
+//
+// The #ActorMetaClass.set_actor() implementation will create the two materials
+// used for the two different rectangles; the #EffectClass.paint() implementation
+// will paint the first material using dx_rectangle(), before continuing and then it
+// will paint paint the second material after.
+//
+//  ```
+//  typedef struct {
+//    Effect parent_instance;
+//
+//    CoglHandle rect_1;
+//    CoglHandle rect_2;
+//  } MyEffect;
+//
+//  typedef struct _EffectClass MyEffectClass;
+//
+//  G_DEFINE_TYPE (MyEffect, my_effect, TYPE_EFFECT);
+//
+//  static void
+//  my_effect_set_actor (ActorMeta *meta,
+//                       Actor     *actor)
+//  {
+//    MyEffect *self = MY_EFFECT (meta);
+//
+//    // Clear the previous state //
+//    if (self->rect_1)
+//      {
+//        dx_handle_unref (self->rect_1);
+//        self->rect_1 = NULL;
+//      }
+//
+//    if (self->rect_2)
+//      {
+//        dx_handle_unref (self->rect_2);
+//        self->rect_2 = NULL;
+//      }
+//
+//    // Maintain a pointer to the actor
+//    self->actor = actor;
+//
+//    // If we've been detached by the actor then we should just bail out here
+//    if (self->actor == NULL)
+//      return;
+//
+//    // Create a red material
+//    self->rect_1 = dx_material_new ();
+//    dx_material_set_color4f (self->rect_1, 1.0, 0.0, 0.0, 1.0);
+//
+//    // Create a green material
+//    self->rect_2 = dx_material_new ();
+//    dx_material_set_color4f (self->rect_2, 0.0, 1.0, 0.0, 1.0);
+//  }
+//
+//  static gboolean
+//  my_effect_paint (Effect *effect)
+//  {
+//    MyEffect *self = MY_EFFECT (effect);
+//    gfloat width, height;
+//
+//    actor_get_size (self->actor, &width, &height);
+//
+//    // Paint the first rectangle in the upper left quadrant
+//    dx_set_source (self->rect_1);
+//    dx_rectangle (0, 0, width / 2, height / 2);
+//
+//    // Continue to the rest of the paint sequence
+//    actor_continue_paint (self->actor);
+//
+//    // Paint the second rectangle in the lower right quadrant
+//    dx_set_source (self->rect_2);
+//    dx_rectangle (width / 2, height / 2, width, height);
+//  }
+//
+//  static void
+//  my_effect_class_init (MyEffectClass *klass)
+//  {
+//    ActorMetaClas *meta_class = ACTOR_META_CLASS (klass);
+//
+//    meta_class->set_actor = my_effect_set_actor;
+//
+//    klass->paint = my_effect_paint;
+//  }
+// ```
+//
 // @extends ActorMeta
 #[derive(Debug, Clone)]
 pub struct Effect {}
@@ -195,7 +194,7 @@ pub trait EffectExt: 'static {
 impl<O: Is<Effect>> EffectExt for O {
     fn queue_repaint(&self) {
         // unsafe {
-        //     ffi::clutter_effect_queue_repaint(self.as_ref().to_glib_none().0);
+        //     ffi::effect_queue_repaint(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
diff --git a/src/pure/enums.rs b/src/pure/enums.rs
index 165022a..a5ec87e 100644
--- a/src/pure/enums.rs
+++ b/src/pure/enums.rs
@@ -189,6 +189,12 @@ pub enum AnimationMode {
     AnimationLast,
 }
 
+impl Default for AnimationMode {
+    fn default() -> Self {
+        Self::Linear
+    }
+}
+
 impl fmt::Display for AnimationMode {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
@@ -361,6 +367,12 @@ pub enum ContentGravity {
     ResizeAspect,
 }
 
+impl Default for ContentGravity {
+    fn default() -> Self {
+        Self::TopLeft
+    }
+}
+
 impl fmt::Display for ContentGravity {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
@@ -615,7 +627,7 @@ impl fmt::Display for ImageError {
     }
 }
 
-/// Error conditions returned by `clutter_init` and `clutter_init_with_args`.
+/// Error conditions returned by `init` and `init_with_args`.
 #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
 pub enum InitError {
     /// Initialisation successful
@@ -945,6 +957,12 @@ pub enum RequestMode {
     ContentSize,
 }
 
+impl Default for RequestMode {
+    fn default() -> Self {
+        Self::HeightForWidth
+    }
+}
+
 impl fmt::Display for RequestMode {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
@@ -1018,6 +1036,12 @@ pub enum ScalingFilter {
     Trilinear,
 }
 
+impl Default for ScalingFilter {
+    fn default() -> Self {
+        Self::Linear
+    }
+}
+
 impl fmt::Display for ScalingFilter {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
@@ -1332,15 +1356,21 @@ impl fmt::Display for StaticColor {
 #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
 pub enum StepMode {
     /// The change in the value of a
-    ///  `CLUTTER_STEP` progress mode should occur at the start of
+    ///  `STEP` progress mode should occur at the start of
     ///  the transition
     Start,
     /// The change in the value of a
-    ///  `CLUTTER_STEP` progress mode should occur at the end of
+    ///  `STEP` progress mode should occur at the end of
     ///  the transition
     End,
 }
 
+impl Default for StepMode {
+    fn default() -> Self {
+        Self::Start
+    }
+}
+
 impl fmt::Display for StepMode {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
@@ -1358,7 +1388,7 @@ impl fmt::Display for StepMode {
 #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
 pub enum TextDirection {
     /// Use the default setting, as returned
-    ///  by `clutter_get_default_text_direction`
+    ///  by `get_default_text_direction`
     Default,
     /// Use left-to-right text direction
     Ltr,
@@ -1366,6 +1396,12 @@ pub enum TextDirection {
     Rtl,
 }
 
+impl Default for TextDirection {
+    fn default() -> Self {
+        Self::Default
+    }
+}
+
 impl fmt::Display for TextDirection {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
@@ -1389,8 +1425,8 @@ pub enum TextureError {
     ///  found
     NoYuv,
     /// The requested format for
-    /// clutter_texture_set_from_rgb_data or
-    /// clutter_texture_set_from_yuv_data is unsupported.
+    /// texture_set_from_rgb_data or
+    /// texture_set_from_yuv_data is unsupported.
     BadFormat,
 }
 
@@ -1417,6 +1453,12 @@ pub enum TimelineDirection {
     Backward,
 }
 
+impl Default for TimelineDirection {
+    fn default() -> Self {
+        Self::Forward
+    }
+}
+
 impl fmt::Display for TimelineDirection {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
diff --git a/src/pure/event.rs b/src/pure/event.rs
index 2fb9b1f..da7e94e 100644
--- a/src/pure/event.rs
+++ b/src/pure/event.rs
@@ -24,18 +24,18 @@ impl Event {
     /// Creates a new event.
     pub fn new(type_: EventType) -> Event {
         // assert_initialized_main_thread!();
-        // unsafe { from_glib_none(ffi::clutter_event_new(type_.to_glib())) }
+        // unsafe { from_glib_none(ffi::event_new(type_.to_glib())) }
         unimplemented!()
     }
 
     pub fn get() -> Option<Event> {
         // assert_initialized_main_thread!();
-        // unsafe { from_glib_none(ffi::clutter_event_get()) }
+        // unsafe { from_glib_none(ffi::event_get()) }
         unimplemented!()
     }
 
     pub fn put(&self) {
-        // unsafe { ffi::clutter_event_put(self.to_glib_none().0) }
+        // unsafe { ffi::event_put(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -69,7 +69,7 @@ impl Event {
     //         let boxed: Box<F> = Box::new(handler);
     //         let ptr: *mut c_void = Box::into_raw(boxed) as *mut _;
     //         unsafe {
-    //             ffi::clutter_event_handler_set(
+    //             ffi::event_handler_set(
     //                 Some(event_handler_trampoline::<F>),
     //                 ptr,
     //                 Some(event_handler_destroy::<F>),
@@ -98,7 +98,7 @@ impl Event {
     // pub fn get_button(&self) -> Option<u32> {
     //     let mut button = 0u32;
     //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_button(
+    //         from_glib(ffi::event_get_button(
     //             self.to_glib_none().0,
     //             &mut button,
     //         ))
@@ -112,7 +112,7 @@ impl Event {
     // pub fn get_click_count(&self) -> Option<u32> {
     //     let mut click_count = 0u32;
     //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_click_count(
+    //         from_glib(ffi::event_get_click_count(
     //             self.to_glib_none().0,
     //             &mut click_count,
     //         ))
@@ -127,7 +127,7 @@ impl Event {
     //     let mut x_win = 0_f32;
     //     let mut y_win = 0_f32;
     //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_coords(
+    //         from_glib(ffi::event_get_coords(
     //             self.to_glib_none().0,
     //             &mut x_win,
     //             &mut y_win,
@@ -142,7 +142,7 @@ impl Event {
     // pub fn get_keycode(&self) -> Option<u16> {
     //     let mut keycode = 0u16;
     //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_keycode(
+    //         from_glib(ffi::event_get_keycode(
     //             self.to_glib_none().0,
     //             &mut keycode,
     //         ))
@@ -156,7 +156,7 @@ impl Event {
     // pub fn get_keyval(&self) -> Option<u32> {
     //     let mut keyval = 0u32;
     //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_keyval(
+    //         from_glib(ffi::event_get_keyval(
     //             self.to_glib_none().0,
     //             &mut keyval,
     //         ))
@@ -171,7 +171,7 @@ impl Event {
     //     let mut x_root = 0_f32;
     //     let mut y_root = 0_f32;
     //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_coords(
+    //         from_glib(ffi::event_get_coords(
     //             self.to_glib_none().0,
     //             &mut x_root,
     //             &mut y_root,
@@ -186,7 +186,7 @@ impl Event {
     // pub fn get_scroll_direction(&self) -> Option<ScrollDirection> {
     //     unsafe {
     //         let mut direction = mem::MaybeUninit::uninit();
-    //         if from_glib(ffi::clutter_event_get_scroll_direction(
+    //         if from_glib(ffi::event_get_scroll_direction(
     //             self.to_glib_none().0,
     //             direction.as_mut_ptr(),
     //         )) {
@@ -201,7 +201,7 @@ impl Event {
     //     let mut delta_x = 0_f64;
     //     let mut delta_y = 0_f64;
     //     if unsafe {
-    //         from_glib(ffi::clutter_event_get_scroll_delta(
+    //         from_glib(ffi::event_get_scroll_delta(
     //             self.to_glib_none().0,
     //             &mut delta_x,
     //             &mut delta_y,
@@ -224,7 +224,7 @@ impl Event {
     // pub fn get_state(&self) -> Option<ModifierType> {
     //     unsafe {
     //         let mut state = mem::MaybeUninit::uninit();
-    //         if from_glib(ffi::clutter_event_get_scroll_direction(
+    //         if from_glib(ffi::event_get_scroll_direction(
     //             self.to_glib_none().0,
     //             state.as_mut_ptr(),
     //         )) {
@@ -236,39 +236,39 @@ impl Event {
     // }
 
     pub fn get_time(&self) -> u32 {
-        // unsafe { ffi::clutter_event_get_time(self.to_glib_none().0) }
+        // unsafe { ffi::event_get_time(self.to_glib_none().0) }
         unimplemented!()
     }
 
     /// Returns the associated `Window` if applicable.
     // pub fn get_window(&self) -> Option<Window> {
-    //     unsafe { from_glib_none(ffi::clutter_event_get_window(self.to_glib_none().0)) }
+    //     unsafe { from_glib_none(ffi::event_get_window(self.to_glib_none().0)) }
     // }
 
     pub fn get_event_sequence(&self) -> Option<EventSequence> {
-        // unsafe { from_glib_none(ffi::clutter_event_get_event_sequence(self.to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::event_get_event_sequence(self.to_glib_none().0)) }
         unimplemented!()
     }
 
     // pub fn triggers_context_menu(&self) -> bool {
     //     unsafe {
-    //         from_glib(ffi::clutter_event_triggers_context_menu(
+    //         from_glib(ffi::event_triggers_context_menu(
     //             self.to_glib_none().0,
     //         ))
     //     }
     // }
 
     // pub fn get_seat(&self) -> Option<Seat> {
-    //     unsafe { from_glib_none(ffi::clutter_event_get_seat(self.to_glib_none().0)) }
+    //     unsafe { from_glib_none(ffi::event_get_seat(self.to_glib_none().0)) }
     // }
 
     // pub fn get_scancode(&mut self) -> i32 {
-    //     unsafe { ffi::clutter_event_get_scancode(self.to_glib_none_mut().0) }
+    //     unsafe { ffi::event_get_scancode(self.to_glib_none_mut().0) }
     // }
 
     // pub fn get_pointer_emulated(&mut self) -> bool {
     //     unsafe {
-    //         from_glib(ffi::clutter_event_is_pointer_emulated(
+    //         from_glib(ffi::event_is_pointer_emulated(
     //             self.to_glib_none_mut().0,
     //         ))
     //     }
@@ -281,40 +281,40 @@ impl Event {
     // }
 
     // pub fn get_screen(&self) -> Option<Screen> {
-    //     unsafe { from_glib_none(ffi::clutter_event_get_screen(self.to_glib_none().0)) }
+    //     unsafe { from_glib_none(ffi::event_get_screen(self.to_glib_none().0)) }
     // }
 
     pub fn set_device(&mut self, device: Option<&InputDevice>) {
-        // unsafe { ffi::clutter_event_set_device(self.to_glib_none_mut().0, device.to_glib_none().0) }
+        // unsafe { ffi::event_set_device(self.to_glib_none_mut().0, device.to_glib_none().0) }
         unimplemented!()
     }
 
     pub fn get_device(&self) -> Option<InputDevice> {
-        // unsafe { from_glib_none(ffi::clutter_event_get_device(self.to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::event_get_device(self.to_glib_none().0)) }
         unimplemented!()
     }
 
     pub fn set_source_device(&mut self, device: Option<&InputDevice>) {
         // unsafe {
-        //     ffi::clutter_event_set_source_device(self.to_glib_none_mut().0, device.to_glib_none().0)
+        //     ffi::event_set_source_device(self.to_glib_none_mut().0, device.to_glib_none().0)
         // }
         unimplemented!()
     }
 
     pub fn get_source_device(&self) -> Option<InputDevice> {
-        // unsafe { from_glib_none(ffi::clutter_event_get_source_device(self.to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::event_get_source_device(self.to_glib_none().0)) }
         unimplemented!()
     }
 
     // pub fn set_device_tool(&mut self, device: Option<&DeviceTool>) {
     //     unsafe {
-    //         ffi::clutter_event_set_device_tool(self.to_glib_none_mut().0, device.to_glib_none().0)
+    //         ffi::event_set_device_tool(self.to_glib_none_mut().0, device.to_glib_none().0)
     //     }
     // }
 
     // pub fn get_device_tool(&self) -> Option<DeviceTool> {
     //     unsafe {
-    //         from_glib_none(ffi::clutter_event_get_device_tool(
+    //         from_glib_none(ffi::event_get_device_tool(
     //             self.to_glib_none().0,
     //         ))
     //     }
diff --git a/src/pure/event_any.rs b/src/pure/event_any.rs
index 04f9625..f7f6e17 100644
--- a/src/pure/event_any.rs
+++ b/src/pure/event_any.rs
@@ -1,13 +1,13 @@
 use super::{Actor, EventFlags, EventType, ModifierType, Stage};
 
-// * AnyEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @source: event source actor
-// *
-// * Common members for a #Event
-// *
+// AnyEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @source: event source actor
+//
+// Common members for a #Event
+//
 pub struct AnyEvent {
     kind: EventType,
     time: u32,
@@ -18,7 +18,7 @@ pub struct AnyEvent {
 
 impl AnyEvent {
     pub fn get_time(&self) -> u32 {
-        unimplemented!()
+        self.time
     }
 
     pub fn get_state(&self) -> ModifierType {
diff --git a/src/pure/event_button.rs b/src/pure/event_button.rs
index 0459b71..4f6f644 100644
--- a/src/pure/event_button.rs
+++ b/src/pure/event_button.rs
@@ -1,25 +1,25 @@
 use super::{Actor, EventFlags, EventType, InputDevice, ModifierType, Stage};
-// * ButtonEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor
-// * @x: event X coordinate, relative to the stage
-// * @y: event Y coordinate, relative to the stage
-// * @modifier_state: button modifiers
-// * @button: event button
-// * @click_count: number of button presses within the default time
-// *   and radius
-// * @axes: reserved for future use
-// * @device: the device that originated the event. If you want the physical
-// * device the event originated from, use clutter_event_get_source_device()
-// *
-// * Button event.
-// *
-// * The event coordinates are relative to the stage that received the
-// * event, and can be transformed into actor-relative coordinates by
-// * using clutter_actor_transform_stage_point().
+// ButtonEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor
+// @x: event X coordinate, relative to the stage
+// @y: event Y coordinate, relative to the stage
+// @modifier_state: button modifiers
+// @button: event button
+// @click_count: number of button presses within the default time
+//   and radius
+// @axes: reserved for future use
+// @device: the device that originated the event. If you want the physical
+// device the event originated from, use event_get_source_device()
+//
+// Button event.
+//
+// The event coordinates are relative to the stage that received the
+// event, and can be transformed into actor-relative coordinates by
+// using actor_transform_stage_point().
 pub struct ButtonEvent {
     kind: EventType,
     time: u32,
@@ -37,29 +37,24 @@ pub struct ButtonEvent {
 }
 
 impl ButtonEvent {
-    pub fn get_position(&self) -> (f64, f64) {
-        // (self.ev.x, self.ev.y)
-        unimplemented!()
+    pub fn get_position(&self) -> (f32, f32) {
+        (self.x, self.y)
     }
 
     pub fn get_state(&self) -> ModifierType {
-        // self.ev.state
-        unimplemented!()
+        self.modifier_state
     }
 
     pub fn get_time(&self) -> u32 {
-        // self.ev.time
-        unimplemented!()
+        self.time
     }
 
     pub fn get_button(&self) -> u32 {
-        // self.ev.button
-        unimplemented!()
+        self.button
     }
 
-    pub fn get_device(&self) -> Option<InputDevice> {
-        // self.ev.device
-        unimplemented!()
+    pub fn get_device(&self) -> &Option<InputDevice> {
+        &self.device
     }
 
     pub fn get_axes(&self) -> Option<(f64, f64)> {
diff --git a/src/pure/event_crossing.rs b/src/pure/event_crossing.rs
index 6fecdf8..0a9bb4b 100644
--- a/src/pure/event_crossing.rs
+++ b/src/pure/event_crossing.rs
@@ -2,20 +2,20 @@ use super::{Actor, EventFlags, EventType, InputDevice, ModifierType, Stage};
 
 // Window, NotifyType, CrossingMode
 
-// * CrossingEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor
-// * @x: event X coordinate
-// * @y: event Y coordinate
-// * @related: actor related to the crossing
-// * @device: the device that originated the event. If you want the physical
-// * device the event originated from, use clutter_event_get_source_device()
-// *
-// * Event for the movement of the pointer across different actors
-// *
+// CrossingEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor
+// @x: event X coordinate
+// @y: event Y coordinate
+// @related: actor related to the crossing
+// @device: the device that originated the event. If you want the physical
+// device the event originated from, use event_get_source_device()
+//
+// Event for the movement of the pointer across different actors
+//
 pub struct CrossingEvent {
     kind: EventType,
     time: u32,
@@ -30,11 +30,8 @@ pub struct CrossingEvent {
 }
 
 impl CrossingEvent {
-    pub fn get_position(&self) -> (f64, f64) {
-        // let x = self.as_ref().x;
-        // let y = self.as_ref().y;
-        // (x, y)
-        unimplemented!()
+    pub fn get_position(&self) -> (f32, f32) {
+        (self.x, self.y)
     }
 
     // pub fn get_subwindow(&self) -> Option<Window> {
@@ -54,7 +51,7 @@ impl CrossingEvent {
     }
 
     pub fn get_time(&self) -> u32 {
-        unimplemented!()
+        self.time
     }
 
     pub fn get_root(&self) -> (f64, f64) {
diff --git a/src/pure/event_key.rs b/src/pure/event_key.rs
index 91f3b07..1132e63 100644
--- a/src/pure/event_key.rs
+++ b/src/pure/event_key.rs
@@ -1,19 +1,19 @@
 use super::{Actor, EventFlags, EventType, InputDevice, ModifierType, Stage};
 
-// * KeyEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor
-// * @modifier_state: key modifiers
-// * @keyval: raw key value
-// * @hardware_keycode: raw hardware key value
-// * @unicode_value: Unicode representation
-// * @device: the device that originated the event. If you want the physical
-// * device the event originated from, use clutter_event_get_source_device()
-// *
-// * Key event
+// KeyEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor
+// @modifier_state: key modifiers
+// @keyval: raw key value
+// @hardware_keycode: raw hardware key value
+// @unicode_value: Unicode representation
+// @device: the device that originated the event. If you want the physical
+// device the event originated from, use event_get_source_device()
+//
+// Key event
 pub struct KeyEvent {
     kind: EventType,
     time: u32,
@@ -30,11 +30,11 @@ pub struct KeyEvent {
 
 impl KeyEvent {
     pub fn get_time(&self) -> u32 {
-        unimplemented!()
+        self.time
     }
 
     pub fn get_state(&self) -> ModifierType {
-        unimplemented!()
+        self.modifier_state
     }
 
     pub fn get_keyval(&self) -> u32 {
diff --git a/src/pure/event_motion.rs b/src/pure/event_motion.rs
index fc583e0..f4443a1 100644
--- a/src/pure/event_motion.rs
+++ b/src/pure/event_motion.rs
@@ -1,19 +1,19 @@
 use super::{Actor, EventFlags, EventType, InputDevice, ModifierType, Stage};
 
-// * MotionEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor
-// * @x: event X coordinate
-// * @y: event Y coordinate
-// * @modifier_state: button modifiers
-// * @axes: reserved for future use
-// * @device: the device that originated the event. If you want the physical
-// * device the event originated from, use clutter_event_get_source_device()
-// *
-// * Event for the pointer motion
+// MotionEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor
+// @x: event X coordinate
+// @y: event Y coordinate
+// @modifier_state: button modifiers
+// @axes: reserved for future use
+// @device: the device that originated the event. If you want the physical
+// device the event originated from, use event_get_source_device()
+//
+// Event for the pointer motion
 pub struct MotionEvent {
     kind: EventType,
     time: u32,
@@ -29,21 +29,16 @@ pub struct MotionEvent {
 }
 
 impl MotionEvent {
-    pub fn get_position(&self) -> (f64, f64) {
-        // let x = self.as_ref().x;
-        // let y = self.as_ref().y;
-        // (x, y)
-        unimplemented!()
+    pub fn get_position(&self) -> (f32, f32) {
+        (self.x, self.y)
     }
 
     pub fn get_state(&self) -> ModifierType {
-        // from_glib(self.as_ref().state)
-        unimplemented!()
+        self.modifier_state
     }
 
     pub fn get_time(&self) -> u32 {
-        // self.as_ref().time
-        unimplemented!()
+        self.time
     }
 
     pub fn request_motions(&self) {
@@ -51,9 +46,8 @@ impl MotionEvent {
         unimplemented!()
     }
 
-    pub fn get_device(&self) -> Option<InputDevice> {
-        // unsafe { from_glib_none(self.as_ref().device) }
-        unimplemented!()
+    pub fn get_device(&self) -> &Option<InputDevice> {
+        &self.device
     }
 
     pub fn get_axes(&self) -> Option<(f64, f64)> {
diff --git a/src/pure/event_scroll.rs b/src/pure/event_scroll.rs
index 4b81af1..be215c8 100644
--- a/src/pure/event_scroll.rs
+++ b/src/pure/event_scroll.rs
@@ -3,23 +3,23 @@ use super::{
     ScrollSource, Stage,
 };
 
-// * ScrollEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor
-// * @x: event X coordinate
-// * @y: event Y coordinate
-// * @direction: direction of the scrolling
-// * @modifier_state: button modifiers
-// * @axes: reserved for future use
-// * @device: the device that originated the event. If you want the physical
-// * device the event originated from, use clutter_event_get_source_device()
-// * @scroll_source: the source of scroll events. This field is available since 1.26
-// * @finish_flags: the axes that were stopped in this event. This field is available since 1.26
-// *
-// * Scroll wheel (or similar device) event
+// ScrollEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor
+// @x: event X coordinate
+// @y: event Y coordinate
+// @direction: direction of the scrolling
+// @modifier_state: button modifiers
+// @axes: reserved for future use
+// @device: the device that originated the event. If you want the physical
+// device the event originated from, use event_get_source_device()
+// @scroll_source: the source of scroll events. This field is available since 1.26
+// @finish_flags: the axes that were stopped in this event. This field is available since 1.26
+//
+// Scroll wheel (or similar device) event
 pub struct ScrollEvent {
     kind: EventType,
     time: u32,
@@ -39,30 +39,23 @@ pub struct ScrollEvent {
 
 impl ScrollEvent {
     pub fn get_time(&self) -> u32 {
-        // self.as_ref().time
-        unimplemented!()
+        self.time
     }
 
-    pub fn get_position(&self) -> (f64, f64) {
-        // let x = self.as_ref().x;
-        // let y = self.as_ref().y;
-        // (x, y)
-        unimplemented!()
+    pub fn get_position(&self) -> (f32, f32) {
+        (self.x, self.y)
     }
 
     pub fn get_state(&self) -> ModifierType {
-        // from_glib(self.as_ref().state)
-        unimplemented!()
+        self.modifier_state
     }
 
-    pub fn get_device(&self) -> Option<InputDevice> {
-        // unsafe { from_glib_none(self.as_ref().device) }
-        unimplemented!()
+    pub fn get_device(&self) -> &Option<InputDevice> {
+        &self.device
     }
 
     pub fn get_direction(&self) -> ScrollDirection {
-        // from_glib(self.as_ref().direction)
-        unimplemented!()
+        self.direction
     }
 
     pub fn get_root(&self) -> (f64, f64) {
diff --git a/src/pure/event_stage_state.rs b/src/pure/event_stage_state.rs
index daf0bae..8f0cccb 100644
--- a/src/pure/event_stage_state.rs
+++ b/src/pure/event_stage_state.rs
@@ -1,16 +1,16 @@
 use super::{ModifierType, EventType, StageState, EventFlags, Stage, Actor};
 
-// * StageStateEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor (unused)
-// * @changed_mask: bitwise OR of the changed flags
-// * @new_state: bitwise OR of the current state flags
-// *
-// * Event signalling a change in the #Stage state.
-// *
+// StageStateEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor (unused)
+// @changed_mask: bitwise OR of the changed flags
+// @new_state: bitwise OR of the current state flags
+//
+// Event signalling a change in the #Stage state.
+//
 pub struct StageStateEvent {
     kind: EventType,
     time: u32,
@@ -24,7 +24,7 @@ pub struct StageStateEvent {
 
 impl StageStateEvent {
     pub fn get_time(&self) -> u32 {
-        unimplemented!()
+        self.time
     }
 
     pub fn get_state(&self) -> ModifierType {
diff --git a/src/pure/event_touch.rs b/src/pure/event_touch.rs
index 6ac2724..aba6583 100644
--- a/src/pure/event_touch.rs
+++ b/src/pure/event_touch.rs
@@ -1,34 +1,34 @@
 use super::{Actor, EventFlags, EventSequence, EventType, InputDevice, ModifierType, Stage};
 
-// * TouchEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor (unused)
-// * @x: the X coordinate of the pointer, relative to the stage
-// * @y: the Y coordinate of the pointer, relative to the stage
-// * @sequence: the event sequence that this event belongs to
-// * @modifier_state: (type ModifierType): a bit-mask representing the state
-// *   of modifier keys (e.g. Control, Shift, and Alt) and the pointer
-// *   buttons. See #ModifierType
-// * @axes: reserved
-// * @device: the device that originated the event. If you want the physical
-// * device the event originated from, use clutter_event_get_source_device()
-// *
-// * Used for touch events.
-// *
-// * The @type field will be one of %CLUTTER_TOUCH_BEGIN, %CLUTTER_TOUCH_END,
-// * %CLUTTER_TOUCH_UPDATE, or %CLUTTER_TOUCH_CANCEL.
-// *
-// * Touch events are grouped into sequences; each touch sequence will begin
-// * with a %CLUTTER_TOUCH_BEGIN event, progress with %CLUTTER_TOUCH_UPDATE
-// * events, and end either with a %CLUTTER_TOUCH_END event or with a
-// * %CLUTTER_TOUCH_CANCEL event.
-// *
-// * With multi-touch capable devices there can be multiple event sequence
-// * running at the same time.
-// *
+// TouchEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor (unused)
+// @x: the X coordinate of the pointer, relative to the stage
+// @y: the Y coordinate of the pointer, relative to the stage
+// @sequence: the event sequence that this event belongs to
+// @modifier_state: (type ModifierType): a bit-mask representing the state
+//   of modifier keys (e.g. Control, Shift, and Alt) and the pointer
+//   buttons. See #ModifierType
+// @axes: reserved
+// @device: the device that originated the event. If you want the physical
+// device the event originated from, use event_get_source_device()
+//
+// Used for touch events.
+//
+// The @type field will be one of %TOUCH_BEGIN, %TOUCH_END,
+// %TOUCH_UPDATE, or %TOUCH_CANCEL.
+//
+// Touch events are grouped into sequences; each touch sequence will begin
+// with a %TOUCH_BEGIN event, progress with %TOUCH_UPDATE
+// events, and end either with a %TOUCH_END event or with a
+// %TOUCH_CANCEL event.
+//
+// With multi-touch capable devices there can be multiple event sequence
+// running at the same time.
+//
 pub struct TouchEvent {
     kind: EventType,
     time: u32,
@@ -46,20 +46,15 @@ pub struct TouchEvent {
 
 impl TouchEvent {
     pub fn get_time(&self) -> u32 {
-        // self.as_ref().time
-        unimplemented!()
+        self.time
     }
 
-    pub fn get_position(&self) -> (f64, f64) {
-        // let x = self.as_ref().x;
-        // let y = self.as_ref().y;
-        // (x, y)
-        unimplemented!()
+    pub fn get_position(&self) -> (f32, f32) {
+        (self.x, self.y)
     }
 
     pub fn get_state(&self) -> ModifierType {
-        // from_glib(self.as_ref().state)
-        unimplemented!()
+        self.modifier_state
     }
 
     pub fn is_emulating_pointer(&self) -> bool {
@@ -67,9 +62,8 @@ impl TouchEvent {
         unimplemented!()
     }
 
-    pub fn get_device(&self) -> Option<InputDevice> {
-        // unsafe { from_glib_none(self.as_ref().device) }
-        unimplemented!()
+    pub fn get_device(&self) -> &Option<InputDevice> {
+        &self.device
     }
 
     pub fn get_axes(&self) -> Option<(f64, f64)> {
diff --git a/src/pure/event_touchpad_pinch.rs b/src/pure/event_touchpad_pinch.rs
index f9a287b..e228939 100644
--- a/src/pure/event_touchpad_pinch.rs
+++ b/src/pure/event_touchpad_pinch.rs
@@ -3,29 +3,29 @@ use super::{
     TouchpadGesturePhase,
 };
 
-// * TouchpadPinchEvent:
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor (unused)
-// * @phase: the current phase of the gesture
-// * @x: the X coordinate of the pointer, relative to the stage
-// * @y: the Y coordinate of the pointer, relative to the stage
-// * @dx: movement delta of the pinch focal point in the X axis
-// * @dy: movement delta of the pinch focal point in the Y axis
-// * @angle_delta: angle delta in degrees, clockwise rotations are
-// *   represented by positive deltas
-// * @scale: the current scale
-// *
-// * Used for touchpad pinch gesture events. The current state of the
-// * gesture will be determined by the @phase field.
-// *
-// * Each event with phase %CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN
-// * will report a @scale of 1.0, all later phases in the gesture
-// * report the current scale relative to the initial 1.0 value
-// * (eg. 0.5 being half the size, 2.0 twice as big).
-// *
+// TouchpadPinchEvent:
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor (unused)
+// @phase: the current phase of the gesture
+// @x: the X coordinate of the pointer, relative to the stage
+// @y: the Y coordinate of the pointer, relative to the stage
+// @dx: movement delta of the pinch focal point in the X axis
+// @dy: movement delta of the pinch focal point in the Y axis
+// @angle_delta: angle delta in degrees, clockwise rotations are
+//   represented by positive deltas
+// @scale: the current scale
+//
+// Used for touchpad pinch gesture events. The current state of the
+// gesture will be determined by the @phase field.
+//
+// Each event with phase %TOUCHPAD_GESTURE_PHASE_BEGIN
+// will report a @scale of 1.0, all later phases in the gesture
+// report the current scale relative to the initial 1.0 value
+// (eg. 0.5 being half the size, 2.0 twice as big).
+//
 pub struct TouchpadPinchEvent {
     kind: EventType,
     time: u32,
@@ -44,12 +44,10 @@ pub struct TouchpadPinchEvent {
 
 impl TouchpadPinchEvent {
     pub fn get_time(&self) -> u32 {
-        // self.as_ref().time
-        unimplemented!()
+        self.time
     }
 
     pub fn get_state(&self) -> ModifierType {
-        // from_glib(self.as_ref().state)
         unimplemented!()
     }
 
diff --git a/src/pure/event_touchpad_swipe.rs b/src/pure/event_touchpad_swipe.rs
index 566a905..5b9be6a 100644
--- a/src/pure/event_touchpad_swipe.rs
+++ b/src/pure/event_touchpad_swipe.rs
@@ -3,22 +3,22 @@ use super::{
     TouchpadGesturePhase,
 };
 
-// * TouchpadSwipeEvent
-// * @type: event type
-// * @time: event time
-// * @flags: event flags
-// * @stage: event source stage
-// * @source: event source actor (unused)
-// * @phase: the current phase of the gesture
-// * @n_fingers: the number of fingers triggering the swipe
-// * @x: the X coordinate of the pointer, relative to the stage
-// * @y: the Y coordinate of the pointer, relative to the stage
-// * @dx: movement delta of the pinch focal point in the X axis
-// * @dy: movement delta of the pinch focal point in the Y axis
-// *
-// * Used for touchpad swipe gesture events. The current state of the
-// * gesture will be determined by the @phase field.
-// *
+// TouchpadSwipeEvent
+// @type: event type
+// @time: event time
+// @flags: event flags
+// @stage: event source stage
+// @source: event source actor (unused)
+// @phase: the current phase of the gesture
+// @n_fingers: the number of fingers triggering the swipe
+// @x: the X coordinate of the pointer, relative to the stage
+// @y: the Y coordinate of the pointer, relative to the stage
+// @dx: movement delta of the pinch focal point in the X axis
+// @dy: movement delta of the pinch focal point in the Y axis
+//
+// Used for touchpad swipe gesture events. The current state of the
+// gesture will be determined by the @phase field.
+//
 pub struct TouchpadSwipeEvent {
     kind: EventType,
     time: u32,
@@ -36,8 +36,7 @@ pub struct TouchpadSwipeEvent {
 
 impl TouchpadSwipeEvent {
     pub fn get_time(&self) -> u32 {
-        // self.as_ref().time
-        unimplemented!()
+        self.time
     }
 
     pub fn get_state(&self) -> ModifierType {
diff --git a/src/pure/fixed_layout.rs b/src/pure/fixed_layout.rs
index 774f9b0..469f41b 100644
--- a/src/pure/fixed_layout.rs
+++ b/src/pure/fixed_layout.rs
@@ -12,7 +12,7 @@ impl FixedLayout {
     ///
     /// the newly created `FixedLayout`
     pub fn new() -> FixedLayout {
-        // unsafe { LayoutManager::from_glib_none(ffi::clutter_fixed_layout_new()).unsafe_cast() }
+        // unsafe { LayoutManager::from_glib_none(ffi::fixed_layout_new()).unsafe_cast() }
         unimplemented!()
     }
 }
diff --git a/src/pure/flow_layout.rs b/src/pure/flow_layout.rs
index cd7ccef..e4573af 100644
--- a/src/pure/flow_layout.rs
+++ b/src/pure/flow_layout.rs
@@ -16,7 +16,7 @@ impl FlowLayout {
     /// the newly created `FlowLayout`
     pub fn new(orientation: FlowOrientation) -> FlowLayout {
         // unsafe {
-        //     LayoutManager::from_glib_none(ffi::clutter_flow_layout_new(orientation.to_glib()))
+        //     LayoutManager::from_glib_none(ffi::flow_layout_new(orientation.to_glib()))
         //         .unsafe_cast()
         // }
         unimplemented!()
@@ -182,7 +182,7 @@ pub trait FlowLayoutExt: 'static {
 
 impl<O: Is<FlowLayout>> FlowLayoutExt for O {
     fn get_column_spacing(&self) -> f32 {
-        // unsafe { ffi::clutter_flow_layout_get_column_spacing(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::flow_layout_get_column_spacing(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
@@ -190,7 +190,7 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
         // unsafe {
         //     let mut min_width = mem::MaybeUninit::uninit();
         //     let mut max_width = mem::MaybeUninit::uninit();
-        //     ffi::clutter_flow_layout_get_column_width(
+        //     ffi::flow_layout_get_column_width(
         //         self.as_ref().to_glib_none().0,
         //         min_width.as_mut_ptr(),
         //         max_width.as_mut_ptr(),
@@ -204,7 +204,7 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
 
     fn get_homogeneous(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_flow_layout_get_homogeneous(
+        //     from_glib(ffi::flow_layout_get_homogeneous(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -213,7 +213,7 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
 
     fn get_orientation(&self) -> FlowOrientation {
         // unsafe {
-        //     from_glib(ffi::clutter_flow_layout_get_orientation(
+        //     from_glib(ffi::flow_layout_get_orientation(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -224,7 +224,7 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
         // unsafe {
         //     let mut min_height = mem::MaybeUninit::uninit();
         //     let mut max_height = mem::MaybeUninit::uninit();
-        //     ffi::clutter_flow_layout_get_row_height(
+        //     ffi::flow_layout_get_row_height(
         //         self.as_ref().to_glib_none().0,
         //         min_height.as_mut_ptr(),
         //         max_height.as_mut_ptr(),
@@ -237,13 +237,13 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
     }
 
     fn get_row_spacing(&self) -> f32 {
-        // unsafe { ffi::clutter_flow_layout_get_row_spacing(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::flow_layout_get_row_spacing(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_snap_to_grid(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_flow_layout_get_snap_to_grid(
+        //     from_glib(ffi::flow_layout_get_snap_to_grid(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -252,14 +252,14 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
 
     fn set_column_spacing(&self, spacing: f32) {
         // unsafe {
-        //     ffi::clutter_flow_layout_set_column_spacing(self.as_ref().to_glib_none().0, spacing);
+        //     ffi::flow_layout_set_column_spacing(self.as_ref().to_glib_none().0, spacing);
         // }
         unimplemented!()
     }
 
     fn set_column_width(&self, min_width: f32, max_width: f32) {
         // unsafe {
-        //     ffi::clutter_flow_layout_set_column_width(
+        //     ffi::flow_layout_set_column_width(
         //         self.as_ref().to_glib_none().0,
         //         min_width,
         //         max_width,
@@ -270,7 +270,7 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
 
     fn set_homogeneous(&self, homogeneous: bool) {
         // unsafe {
-        //     ffi::clutter_flow_layout_set_homogeneous(
+        //     ffi::flow_layout_set_homogeneous(
         //         self.as_ref().to_glib_none().0,
         //         homogeneous.to_glib(),
         //     );
@@ -280,7 +280,7 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
 
     fn set_orientation(&self, orientation: FlowOrientation) {
         // unsafe {
-        //     ffi::clutter_flow_layout_set_orientation(
+        //     ffi::flow_layout_set_orientation(
         //         self.as_ref().to_glib_none().0,
         //         orientation.to_glib(),
         //     );
@@ -290,7 +290,7 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
 
     fn set_row_height(&self, min_height: f32, max_height: f32) {
         // unsafe {
-        //     ffi::clutter_flow_layout_set_row_height(
+        //     ffi::flow_layout_set_row_height(
         //         self.as_ref().to_glib_none().0,
         //         min_height,
         //         max_height,
@@ -301,13 +301,13 @@ impl<O: Is<FlowLayout>> FlowLayoutExt for O {
 
     fn set_row_spacing(&self, spacing: f32) {
         // unsafe {
-        //     ffi::clutter_flow_layout_set_row_spacing(self.as_ref().to_glib_none().0, spacing);
+        //     ffi::flow_layout_set_row_spacing(self.as_ref().to_glib_none().0, spacing);
         // }
     }
 
     fn set_snap_to_grid(&self, snap_to_grid: bool) {
         // unsafe {
-        //     ffi::clutter_flow_layout_set_snap_to_grid(
+        //     ffi::flow_layout_set_snap_to_grid(
         //         self.as_ref().to_glib_none().0,
         //         snap_to_grid.to_glib(),
         //     );
diff --git a/src/pure/gesture_action.rs b/src/pure/gesture_action.rs
index 13060c3..ddd3227 100644
--- a/src/pure/gesture_action.rs
+++ b/src/pure/gesture_action.rs
@@ -37,62 +37,61 @@ struct GestureActionProps {
     in_gesture: bool,
 }
 
-// * SECTION:clutter-gesture-action
-// * @Title: ClutterGestureAction
-// * @Short_Description: Action for gesture gestures
-// *
-// * #ClutterGestureAction is a sub-class of #ClutterAction that implements
-// * the logic for recognizing gesture gestures. It listens for low level events
-// * such as #ClutterButtonEvent and #ClutterMotionEvent on the stage to raise
-// * the #ClutterGestureAction::gesture-begin, #ClutterGestureAction::gesture-progress,
-// * and #ClutterGestureAction::gesture-end signals.
-// *
-// * To use #ClutterGestureAction you just need to apply it to a #ClutterActor
-// * using clutter_actor_add_action() and connect to the signals:
-// *
-// * |[<!-- language="C" -->
-// *   ClutterAction *action = clutter_gesture_action_new ();
-// *
-// *   clutter_actor_add_action (actor, action);
-// *
-// *   g_signal_connect (action, "gesture-begin", G_CALLBACK (on_gesture_begin), NULL);
-// *   g_signal_connect (action, "gesture-progress", G_CALLBACK (on_gesture_progress), NULL);
-// *   g_signal_connect (action, "gesture-end", G_CALLBACK (on_gesture_end), NULL);
-// * ]|
-// *
-// * ## Creating Gesture actions
-// *
-// * A #ClutterGestureAction provides four separate states that can be
-// * used to recognize or ignore gestures when writing a new action class:
-// *
-// *  - Prepare -> Cancel
-// *  - Prepare -> Begin -> Cancel
-// *  - Prepare -> Begin -> End
-// *  - Prepare -> Begin -> Progress -> Cancel
-// *  - Prepare -> Begin -> Progress -> End
-// *
-// * Each #ClutterGestureAction starts in the "prepare" state, and calls
-// * the #ClutterGestureActionClass.gesture_prepare() virtual function; this
-// * state can be used to reset the internal state of a #ClutterGestureAction
-// * subclass, but it can also immediately cancel a gesture without going
-// * through the rest of the states.
-// *
-// * The "begin" state follows the "prepare" state, and calls the
-// * #ClutterGestureActionClass.gesture_begin() virtual function. This state
-// * signals the start of a gesture recognizing process. From the "begin" state
-// * the gesture recognition process can successfully end, by going to the
-// * "end" state; it can continue in the "progress" state, in case of a
-// * continuous gesture; or it can be terminated, by moving to the "cancel"
-// * state.
-// *
-// * In case of continuous gestures, the #ClutterGestureAction will use
-// * the "progress" state, calling the #ClutterGestureActionClass.gesture_progress()
-// * virtual function; the "progress" state will continue until the end of the
-// * gesture, in which case the "end" state will be reached, or until the
-// * gesture is cancelled, in which case the "cancel" gesture will be used
-// * instead.
-// *
-// * Since: 1.8
+// @Title: GestureAction
+// @Short_Description: Action for gesture gestures
+//
+// #GestureAction is a sub-class of #Action that implements
+// the logic for recognizing gesture gestures. It listens for low level events
+// such as #ButtonEvent and #MotionEvent on the stage to raise
+// the #GestureAction::gesture-begin, #GestureAction::gesture-progress,
+// and #GestureAction::gesture-end signals.
+//
+// To use #GestureAction you just need to apply it to a #Actor
+// using actor_add_action() and connect to the signals:
+//
+// ```
+//   Action *action = gesture_action_new ();
+//
+//   actor_add_action (actor, action);
+//
+//   g_signal_connect (action, "gesture-begin", G_CALLBACK (on_gesture_begin), NULL);
+//   g_signal_connect (action, "gesture-progress", G_CALLBACK (on_gesture_progress), NULL);
+//   g_signal_connect (action, "gesture-end", G_CALLBACK (on_gesture_end), NULL);
+// ```
+//
+// ## Creating Gesture actions
+//
+// A #GestureAction provides four separate states that can be
+// used to recognize or ignore gestures when writing a new action class:
+//
+//  - Prepare -> Cancel
+//  - Prepare -> Begin -> Cancel
+//  - Prepare -> Begin -> End
+//  - Prepare -> Begin -> Progress -> Cancel
+//  - Prepare -> Begin -> Progress -> End
+//
+// Each #GestureAction starts in the "prepare" state, and calls
+// the #GestureActionClass.gesture_prepare() virtual function; this
+// state can be used to reset the internal state of a #GestureAction
+// subclass, but it can also immediately cancel a gesture without going
+// through the rest of the states.
+//
+// The "begin" state follows the "prepare" state, and calls the
+// #GestureActionClass.gesture_begin() virtual function. This state
+// signals the start of a gesture recognizing process. From the "begin" state
+// the gesture recognition process can successfully end, by going to the
+// "end" state; it can continue in the "progress" state, in case of a
+// continuous gesture; or it can be terminated, by moving to the "cancel"
+// state.
+//
+// In case of continuous gestures, the #GestureAction will use
+// the "progress" state, calling the #GestureActionClass.gesture_progress()
+// virtual function; the "progress" state will continue until the end of the
+// gesture, in which case the "end" state will be reached, or until the
+// gesture is cancelled, in which case the "cancel" gesture will be used
+// instead.
+//
+// Since: 1.8
 // @extends Action, ActorMeta,
 #[derive(Default, Debug)]
 pub struct GestureAction {
@@ -107,7 +106,7 @@ impl GestureAction {
     ///
     /// the newly created `GestureAction`
     pub fn new() -> GestureAction {
-        // unsafe { Action::from_glib_none(ffi::clutter_gesture_action_new()).unsafe_cast() }
+        // unsafe { Action::from_glib_none(ffi::gesture_action_new()).unsafe_cast() }
         unimplemented!()
     }
 }
@@ -341,14 +340,14 @@ pub trait GestureActionExt: 'static {
 impl<O: Is<GestureAction>> GestureActionExt for O {
     fn cancel(&self) {
         // unsafe {
-        //     ffi::clutter_gesture_action_cancel(self.as_ref().to_glib_none().0);
+        //     ffi::gesture_action_cancel(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn get_device(&self, point: u32) -> Option<InputDevice> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_gesture_action_get_device(
+        //     from_glib_none(ffi::gesture_action_get_device(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //     ))
@@ -358,7 +357,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
 
     fn get_last_event(&self, point: u32) -> Option<Event> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_gesture_action_get_last_event(
+        //     from_glib_none(ffi::gesture_action_get_last_event(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //     ))
@@ -370,7 +369,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
         // unsafe {
         //     let mut motion_x = mem::MaybeUninit::uninit();
         //     let mut motion_y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_gesture_action_get_motion_coords(
+        //     ffi::gesture_action_get_motion_coords(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //         motion_x.as_mut_ptr(),
@@ -387,7 +386,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
         // unsafe {
         //     let mut delta_x = mem::MaybeUninit::uninit();
         //     let mut delta_y = mem::MaybeUninit::uninit();
-        //     let ret = ffi::clutter_gesture_action_get_motion_delta(
+        //     let ret = ffi::gesture_action_get_motion_delta(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //         delta_x.as_mut_ptr(),
@@ -401,12 +400,12 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
     }
 
     fn get_n_current_points(&self) -> u32 {
-        // unsafe { ffi::clutter_gesture_action_get_n_current_points(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::gesture_action_get_n_current_points(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_n_touch_points(&self) -> i32 {
-        // unsafe { ffi::clutter_gesture_action_get_n_touch_points(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::gesture_action_get_n_touch_points(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
@@ -414,7 +413,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
         // unsafe {
         //     let mut press_x = mem::MaybeUninit::uninit();
         //     let mut press_y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_gesture_action_get_press_coords(
+        //     ffi::gesture_action_get_press_coords(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //         press_x.as_mut_ptr(),
@@ -431,7 +430,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
         // unsafe {
         //     let mut release_x = mem::MaybeUninit::uninit();
         //     let mut release_y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_gesture_action_get_release_coords(
+        //     ffi::gesture_action_get_release_coords(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //         release_x.as_mut_ptr(),
@@ -446,7 +445,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
 
     fn get_sequence(&self, point: u32) -> Option<EventSequence> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_gesture_action_get_sequence(
+        //     from_glib_none(ffi::gesture_action_get_sequence(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //     ))
@@ -458,7 +457,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
         // unsafe {
         //     let mut x = mem::MaybeUninit::uninit();
         //     let mut y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_gesture_action_get_threshold_trigger_distance(
+        //     ffi::gesture_action_get_threshold_trigger_distance(
         //         self.as_ref().to_glib_none().0,
         //         x.as_mut_ptr(),
         //         y.as_mut_ptr(),
@@ -472,7 +471,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
 
     fn get_threshold_trigger_edge(&self) -> GestureTriggerEdge {
         // unsafe {
-        //     from_glib(ffi::clutter_gesture_action_get_threshold_trigger_edge(
+        //     from_glib(ffi::gesture_action_get_threshold_trigger_edge(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -483,7 +482,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
         // unsafe {
         //     let mut velocity_x = mem::MaybeUninit::uninit();
         //     let mut velocity_y = mem::MaybeUninit::uninit();
-        //     let ret = ffi::clutter_gesture_action_get_velocity(
+        //     let ret = ffi::gesture_action_get_velocity(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //         velocity_x.as_mut_ptr(),
@@ -498,7 +497,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
 
     fn set_n_touch_points(&self, nb_points: i32) {
         // unsafe {
-        //     ffi::clutter_gesture_action_set_n_touch_points(
+        //     ffi::gesture_action_set_n_touch_points(
         //         self.as_ref().to_glib_none().0,
         //         nb_points,
         //     );
@@ -508,7 +507,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
 
     fn set_threshold_trigger_distance(&self, x: f32, y: f32) {
         // unsafe {
-        //     ffi::clutter_gesture_action_set_threshold_trigger_distance(
+        //     ffi::gesture_action_set_threshold_trigger_distance(
         //         self.as_ref().to_glib_none().0,
         //         x,
         //         y,
@@ -519,7 +518,7 @@ impl<O: Is<GestureAction>> GestureActionExt for O {
 
     fn set_threshold_trigger_edge(&self, edge: GestureTriggerEdge) {
         // unsafe {
-        //     ffi::clutter_gesture_action_set_threshold_trigger_edge(
+        //     ffi::gesture_action_set_threshold_trigger_edge(
         //         self.as_ref().to_glib_none().0,
         //         edge.to_glib(),
         //     );
diff --git a/src/pure/grid_layout.rs b/src/pure/grid_layout.rs
index b559ab2..ab5f857 100644
--- a/src/pure/grid_layout.rs
+++ b/src/pure/grid_layout.rs
@@ -13,7 +13,7 @@ impl GridLayout {
     ///
     /// the new `GridLayout`
     pub fn new() -> GridLayout {
-        // unsafe { LayoutManager::from_glib_none(ffi::clutter_grid_layout_new()).unsafe_cast() }
+        // unsafe { LayoutManager::from_glib_none(ffi::grid_layout_new()).unsafe_cast() }
         unimplemented!()
     }
 }
@@ -203,7 +203,7 @@ pub trait GridLayoutExt: 'static {
 impl<O: Is<GridLayout>> GridLayoutExt for O {
     fn attach<P: Is<Actor>>(&self, child: &P, left: i32, top: i32, width: i32, height: i32) {
         // unsafe {
-        //     ffi::clutter_grid_layout_attach(
+        //     ffi::grid_layout_attach(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         left,
@@ -224,7 +224,7 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
         height: i32,
     ) {
         // unsafe {
-        //     ffi::clutter_grid_layout_attach_next_to(
+        //     ffi::grid_layout_attach_next_to(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //         sibling.map(|p| p.as_ref()).to_glib_none().0,
@@ -238,7 +238,7 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
 
     fn get_child_at(&self, left: i32, top: i32) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_grid_layout_get_child_at(
+        //     from_glib_none(ffi::grid_layout_get_child_at(
         //         self.as_ref().to_glib_none().0,
         //         left,
         //         top,
@@ -249,7 +249,7 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
 
     fn get_column_homogeneous(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_grid_layout_get_column_homogeneous(
+        //     from_glib(ffi::grid_layout_get_column_homogeneous(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -257,13 +257,13 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
     }
 
     fn get_column_spacing(&self) -> u32 {
-        // unsafe { ffi::clutter_grid_layout_get_column_spacing(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::grid_layout_get_column_spacing(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_orientation(&self) -> Orientation {
         // unsafe {
-        //     from_glib(ffi::clutter_grid_layout_get_orientation(
+        //     from_glib(ffi::grid_layout_get_orientation(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -272,7 +272,7 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
 
     fn get_row_homogeneous(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_grid_layout_get_row_homogeneous(
+        //     from_glib(ffi::grid_layout_get_row_homogeneous(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -280,20 +280,20 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
     }
 
     fn get_row_spacing(&self) -> u32 {
-        // unsafe { ffi::clutter_grid_layout_get_row_spacing(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::grid_layout_get_row_spacing(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn insert_column(&self, position: i32) {
         // unsafe {
-        //     ffi::clutter_grid_layout_insert_column(self.as_ref().to_glib_none().0, position);
+        //     ffi::grid_layout_insert_column(self.as_ref().to_glib_none().0, position);
         // }
         unimplemented!()
     }
 
     fn insert_next_to<P: Is<Actor>>(&self, sibling: &P, side: GridPosition) {
         // unsafe {
-        //     ffi::clutter_grid_layout_insert_next_to(
+        //     ffi::grid_layout_insert_next_to(
         //         self.as_ref().to_glib_none().0,
         //         sibling.as_ref().to_glib_none().0,
         //         side.to_glib(),
@@ -304,14 +304,14 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
 
     fn insert_row(&self, position: i32) {
         // unsafe {
-        //     ffi::clutter_grid_layout_insert_row(self.as_ref().to_glib_none().0, position);
+        //     ffi::grid_layout_insert_row(self.as_ref().to_glib_none().0, position);
         // }
         unimplemented!()
     }
 
     fn set_column_homogeneous(&self, homogeneous: bool) {
         // unsafe {
-        //     ffi::clutter_grid_layout_set_column_homogeneous(
+        //     ffi::grid_layout_set_column_homogeneous(
         //         self.as_ref().to_glib_none().0,
         //         homogeneous.to_glib(),
         //     );
@@ -321,14 +321,14 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
 
     fn set_column_spacing(&self, spacing: u32) {
         // unsafe {
-        //     ffi::clutter_grid_layout_set_column_spacing(self.as_ref().to_glib_none().0, spacing);
+        //     ffi::grid_layout_set_column_spacing(self.as_ref().to_glib_none().0, spacing);
         // }
         unimplemented!()
     }
 
     fn set_orientation(&self, orientation: Orientation) {
         // unsafe {
-        //     ffi::clutter_grid_layout_set_orientation(
+        //     ffi::grid_layout_set_orientation(
         //         self.as_ref().to_glib_none().0,
         //         orientation.to_glib(),
         //     );
@@ -338,7 +338,7 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
 
     fn set_row_homogeneous(&self, homogeneous: bool) {
         // unsafe {
-        //     ffi::clutter_grid_layout_set_row_homogeneous(
+        //     ffi::grid_layout_set_row_homogeneous(
         //         self.as_ref().to_glib_none().0,
         //         homogeneous.to_glib(),
         //     );
@@ -348,7 +348,7 @@ impl<O: Is<GridLayout>> GridLayoutExt for O {
 
     fn set_row_spacing(&self, spacing: u32) {
         // unsafe {
-        //     ffi::clutter_grid_layout_set_row_spacing(self.as_ref().to_glib_none().0, spacing);
+        //     ffi::grid_layout_set_row_spacing(self.as_ref().to_glib_none().0, spacing);
         // }
         unimplemented!()
     }
diff --git a/src/pure/image.rs b/src/pure/image.rs
index 6acfdf2..f4e5bbc 100644
--- a/src/pure/image.rs
+++ b/src/pure/image.rs
@@ -1,4 +1,5 @@
-use super::Content;
+#![allow(unused_imports)]
+use super::{Actor, Content, HandlerId};
 use crate::prelude::*;
 use std::fmt;
 
@@ -14,7 +15,7 @@ impl Image {
     /// the newly created `Image` instance.
     ///  Use `gobject::ObjectExt::unref` when done.
     pub fn new() -> Option<Content> {
-        // unsafe { from_glib_full(ffi::clutter_image_new()) }
+        // unsafe { from_glib_full(ffi::image_new()) }
         unimplemented!()
     }
 }
@@ -36,77 +37,95 @@ impl AsRef<Image> for Image {
 pub trait ImageExt: 'static {
     //fn set_area(&self, data: &[u8], pixel_format: dx::pure::PixelFormat, rect: &cairo::RectangleInt, row_stride: u32) -> Result<(), glib::Error>;
 
-    /// Sets the image data stored inside a `glib::Bytes` to be displayed by `self`.
-    ///
-    /// If the image data was successfully loaded, the `self` will be invalidated.
-    ///
-    /// In case of error, the `error` value will be set, and this function will
-    /// return `false`.
-    ///
-    /// The image data contained inside the `glib::Bytes` is copied in texture memory,
-    /// and no additional reference is acquired on the `data`.
-    /// ## `data`
-    /// the image data, as a `glib::Bytes`
-    /// ## `pixel_format`
-    /// the Cogl pixel format of the image data
-    /// ## `width`
-    /// the width of the image data
-    /// ## `height`
-    /// the height of the image data
-    /// ## `row_stride`
-    /// the length of each row inside `data`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the image data was successfully loaded,
-    ///  and `false` otherwise.
-    fn set_bytes(
-        &self,
-        data: &glib::Bytes,
-        pixel_format: dx::pure::PixelFormat,
-        width: u32,
-        height: u32,
-        row_stride: u32,
-    ) -> Result<(), glib::Error>;
+    // /// Sets the image data stored inside a `glib::Bytes` to be displayed by `self`.
+    // ///
+    // /// If the image data was successfully loaded, the `self` will be invalidated.
+    // ///
+    // /// In case of error, the `error` value will be set, and this function will
+    // /// return `false`.
+    // ///
+    // /// The image data contained inside the `glib::Bytes` is copied in texture memory,
+    // /// and no additional reference is acquired on the `data`.
+    // /// ## `data`
+    // /// the image data, as a `glib::Bytes`
+    // /// ## `pixel_format`
+    // /// the Cogl pixel format of the image data
+    // /// ## `width`
+    // /// the width of the image data
+    // /// ## `height`
+    // /// the height of the image data
+    // /// ## `row_stride`
+    // /// the length of each row inside `data`
+    // ///
+    // /// # Returns
+    // ///
+    // /// `true` if the image data was successfully loaded,
+    // ///  and `false` otherwise.
+    // fn set_bytes(
+    //     &self,
+    //     data: &glib::Bytes,
+    //     pixel_format: dx::PixelFormat,
+    //     width: u32,
+    //     height: u32,
+    //     row_stride: u32,
+    // ) -> Result<(), glib::Error>;
 
     //fn set_data(&self, data: &[u8], pixel_format: dx::pure::PixelFormat, width: u32, height: u32, row_stride: u32) -> Result<(), glib::Error>;
 }
 
+impl ContentExt for Image {
+    fn get_preferred_size(&self) -> Option<(f32, f32)> {
+        unimplemented!()
+    }
+
+    fn invalidate(&self) {
+        unimplemented!()
+    }
+
+    fn connect_attached<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> HandlerId {
+        unimplemented!()
+    }
+
+    fn connect_detached<F: Fn(&Self, &Actor) + 'static>(&self, f: F) -> HandlerId {
+        unimplemented!()
+    }
+}
+
 impl<O: Is<Image>> ImageExt for O {
     //fn set_area(&self, data: &[u8], pixel_format: dx::pure::PixelFormat, rect: &cairo::RectangleInt, row_stride: u32) -> Result<(), glib::Error> {
-    //    unsafe { TODO: call clutter_sys:clutter_image_set_area() }
+    //    unsafe { TODO: call sys:image_set_area() }
     //}
 
-    fn set_bytes(
-        &self,
-        data: &glib::Bytes,
-        pixel_format: dx::pure::PixelFormat,
-        width: u32,
-        height: u32,
-        row_stride: u32,
-    ) -> Result<(), glib::Error> {
-        // unsafe {
-        //     let mut error = ptr::null_mut();
-        //     let _ = ffi::clutter_image_set_bytes(
-        //         self.as_ref().to_glib_none().0,
-        //         data.to_glib_none().0,
-        //         pixel_format.to_glib(),
-        //         width,
-        //         height,
-        //         row_stride,
-        //         &mut error,
-        //     );
-        //     if error.is_null() {
-        //         Ok(())
-        //     } else {
-        //         Err(from_glib_full(error))
-        //     }
-        // }
-        unimplemented!()
-    }
+    // fn set_bytes(
+    //     &self,
+    //     data: &glib::Bytes,
+    //     pixel_format: dx::PixelFormat,
+    //     width: u32,
+    //     height: u32,
+    //     row_stride: u32,
+    // ) -> Result<(), glib::Error> {
+    //     // unsafe {
+    //     //     let mut error = ptr::null_mut();
+    //     //     let _ = ffi::image_set_bytes(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         data.to_glib_none().0,
+    //     //         pixel_format.to_glib(),
+    //     //         width,
+    //     //         height,
+    //     //         row_stride,
+    //     //         &mut error,
+    //     //     );
+    //     //     if error.is_null() {
+    //     //         Ok(())
+    //     //     } else {
+    //     //         Err(from_glib_full(error))
+    //     //     }
+    //     // }
+    //     unimplemented!()
+    // }
 
     //fn set_data(&self, data: &[u8], pixel_format: dx::pure::PixelFormat, width: u32, height: u32, row_stride: u32) -> Result<(), glib::Error> {
-    //    unsafe { TODO: call clutter_sys:clutter_image_set_data() }
+    //    unsafe { TODO: call sys:image_set_data() }
     //}
 }
 
diff --git a/src/pure/input_device.rs b/src/pure/input_device.rs
index 3926688..31fc36b 100644
--- a/src/pure/input_device.rs
+++ b/src/pure/input_device.rs
@@ -21,7 +21,7 @@ impl InputDevice {
     /// a `InputDevice`, or `None`
     pub fn get_associated_device(&self) -> Option<InputDevice> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_input_device_get_associated_device(
+        //     from_glib_none(ffi::input_device_get_associated_device(
         //         self.to_glib_none().0,
         //     ))
         // }
@@ -37,7 +37,7 @@ impl InputDevice {
     /// the axis type
     pub fn get_axis(&self, index_: u32) -> InputAxis {
         // unsafe {
-        //     from_glib(ffi::clutter_input_device_get_axis(
+        //     from_glib(ffi::input_device_get_axis(
         //         self.to_glib_none().0,
         //         index_,
         //     ))
@@ -46,7 +46,7 @@ impl InputDevice {
     }
 
     //pub fn get_axis_value(&self, axes: &[f64], axis: InputAxis) -> Option<f64> {
-    //    unsafe { TODO: call clutter_sys:clutter_input_device_get_axis_value() }
+    //    unsafe { TODO: call sys:input_device_get_axis_value() }
     //}
 
     // /// Retrieves the latest coordinates of a pointer or touch point of
@@ -255,7 +255,7 @@ impl InputDevice {
     // /// `true` if the conversion succeeded, `false` otherwise.
     // pub fn keycode_to_evdev(&self, hardware_keycode: u32, evdev_keycode: u32) -> bool {
     //     unsafe {
-    //         from_glib(ffi::clutter_input_device_keycode_to_evdev(
+    //         from_glib(ffi::input_device_keycode_to_evdev(
     //             self.to_glib_none().0,
     //             hardware_keycode,
     //             evdev_keycode,
@@ -273,7 +273,7 @@ impl InputDevice {
     /// a `Actor`, or `None`
     pub fn sequence_get_grabbed_actor(&self, sequence: &mut EventSequence) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_input_device_sequence_get_grabbed_actor(
+        //     from_glib_none(ffi::input_device_sequence_get_grabbed_actor(
         //         self.to_glib_none().0,
         //         sequence.to_glib_none_mut().0,
         //     ))
@@ -297,7 +297,7 @@ impl InputDevice {
     /// a `Actor`
     pub fn sequence_grab<P: Is<Actor>>(&self, sequence: &mut EventSequence, actor: &P) {
         // unsafe {
-        //     ffi::clutter_input_device_sequence_grab(
+        //     ffi::input_device_sequence_grab(
         //         self.to_glib_none().0,
         //         sequence.to_glib_none_mut().0,
         //         actor.as_ref().to_glib_none().0,
@@ -312,7 +312,7 @@ impl InputDevice {
     /// a `EventSequence`
     pub fn sequence_ungrab(&self, sequence: &mut EventSequence) {
         // unsafe {
-        //     ffi::clutter_input_device_sequence_ungrab(
+        //     ffi::input_device_sequence_ungrab(
         //         self.to_glib_none().0,
         //         sequence.to_glib_none_mut().0,
         //     );
@@ -329,7 +329,7 @@ impl InputDevice {
     /// `true` to enable the `self`
     pub fn set_enabled(&self, enabled: bool) {
         // unsafe {
-        //     ffi::clutter_input_device_set_enabled(self.to_glib_none().0, enabled.to_glib());
+        //     ffi::input_device_set_enabled(self.to_glib_none().0, enabled.to_glib());
         // }
         unimplemented!()
     }
@@ -346,7 +346,7 @@ impl InputDevice {
     /// a bitmask of modifiers
     pub fn set_key(&self, index_: u32, keyval: u32, modifiers: ModifierType) {
         // unsafe {
-        //     ffi::clutter_input_device_set_key(
+        //     ffi::input_device_set_key(
         //         self.to_glib_none().0,
         //         index_,
         //         keyval,
@@ -359,7 +359,7 @@ impl InputDevice {
     /// Releases the grab on the `self`, if one is in place.
     pub fn ungrab(&self) {
         // unsafe {
-        //     ffi::clutter_input_device_ungrab(self.to_glib_none().0);
+        //     ffi::input_device_ungrab(self.to_glib_none().0);
         // }
         unimplemented!()
     }
@@ -367,7 +367,7 @@ impl InputDevice {
     /// Forcibly updates the state of the `self` using a `Event`
     ///
     /// This function should never be used by applications: it is meant
-    /// for integration with embedding toolkits, like clutter-gtk
+    /// for integration with embedding toolkits, like gtk
     ///
     /// Embedding toolkits that disable the event collection inside
     /// need to use this function to update the state of input devices depending
@@ -424,7 +424,7 @@ impl InputDevice {
     ///  using the stage of the event
     pub fn update_from_event(&self, event: &mut Event, update_stage: bool) {
         // unsafe {
-        //     ffi::clutter_input_device_update_from_event(
+        //     ffi::input_device_update_from_event(
         //         self.to_glib_none().0,
         //         event.to_glib_none_mut().0,
         //         update_stage.to_glib(),
diff --git a/src/pure/interval.rs b/src/pure/interval.rs
index 1fc8837..3244997 100644
--- a/src/pure/interval.rs
+++ b/src/pure/interval.rs
@@ -1,33 +1,41 @@
+#![allow(unused_imports)]
 use super::HandlerId;
 use crate::prelude::*;
 use std::fmt;
 
 // TODO: , @implements Scriptable
 #[derive(Debug, Clone)]
-pub struct Interval {}
+pub struct Interval {
+    value_type: bool, //GType,
+    values: bool, //GValue,
+}
+
+// Gtypes
+// INT, INT64, UINT, UINT64, CHAR, UCHAR, FLOAT, DOUBLE, BOOLEAN, BOXED 
+
 
 impl Interval {
     //pub fn new(gtype: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) -> Interval {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_new() }
+    //    unsafe { TODO: call sys:interval_new() }
     //}
 
-    pub fn with_values(
-        gtype: glib::types::Type,
-        initial: Option<&glib::Value>,
-        final_: Option<&glib::Value>,
-    ) -> Interval {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_interval_new_with_values(
-        //         gtype.to_glib(),
-        //         initial.to_glib_none().0,
-        //         final_.to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // pub fn with_values(
+    //     gtype: glib::types::Type,
+    //     initial: Option<&glib::Value>,
+    //     final_: Option<&glib::Value>,
+    // ) -> Interval {
+    //     // unsafe {
+    //     //     from_glib_none(ffi::interval_new_with_values(
+    //     //         gtype.to_glib(),
+    //     //         initial.to_glib_none().0,
+    //     //         final_.to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     //pub fn register_progress_func<P: Fn(&glib::Value, &glib::Value, f64, &glib::Value) -> bool + 'static>(value_type: glib::types::Type, func: P) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_register_progress_func() }
+    //    unsafe { TODO: call sys:interval_register_progress_func() }
     //}
 }
 
@@ -53,62 +61,62 @@ pub trait IntervalExt: 'static {
     /// the newly created `Interval`
     fn clone(&self) -> Option<Interval>;
 
-    /// Computes the value between the `self` boundaries given the
-    /// progress `factor`
-    ///
-    /// Unlike `IntervalExt::compute_value`, this function will
-    /// return a const pointer to the computed value
-    ///
-    /// You should use this function if you immediately pass the computed
-    /// value to another function that makes a copy of it, like
-    /// `gobject::ObjectExt::set_property`
-    /// ## `factor`
-    /// the progress factor, between 0 and 1
-    ///
-    /// # Returns
-    ///
-    /// a pointer to the computed value,
-    ///  or `None` if the computation was not successfull
-    fn compute(&self, factor: f64) -> Option<glib::Value>;
-
-    /// Computes the value between the `self` boundaries given the
-    /// progress `factor` and copies it into `value`.
-    /// ## `factor`
-    /// the progress factor, between 0 and 1
-    /// ## `value`
-    /// return location for an initialized `gobject::Value`
-    ///
-    /// # Returns
-    ///
-    /// `true` if the operation was successful
-    fn compute_value(&self, factor: f64) -> Option<glib::Value>;
+    // /// Computes the value between the `self` boundaries given the
+    // /// progress `factor`
+    // ///
+    // /// Unlike `IntervalExt::compute_value`, this function will
+    // /// return a const pointer to the computed value
+    // ///
+    // /// You should use this function if you immediately pass the computed
+    // /// value to another function that makes a copy of it, like
+    // /// `gobject::ObjectExt::set_property`
+    // /// ## `factor`
+    // /// the progress factor, between 0 and 1
+    // ///
+    // /// # Returns
+    // ///
+    // /// a pointer to the computed value,
+    // ///  or `None` if the computation was not successfull
+    // fn compute(&self, factor: f64) -> Option<glib::Value>;
+
+    // /// Computes the value between the `self` boundaries given the
+    // /// progress `factor` and copies it into `value`.
+    // /// ## `factor`
+    // /// the progress factor, between 0 and 1
+    // /// ## `value`
+    // /// return location for an initialized `gobject::Value`
+    // ///
+    // /// # Returns
+    // ///
+    // /// `true` if the operation was successful
+    // fn compute_value(&self, factor: f64) -> Option<glib::Value>;
 
-    /// Retrieves the final value of `self` and copies
-    /// it into `value`.
-    ///
-    /// The passed `gobject::Value` must be initialized to the value held by
-    /// the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn get_final_value(&self) -> glib::Value;
-
-    /// Retrieves the initial value of `self` and copies
-    /// it into `value`.
-    ///
-    /// The passed `gobject::Value` must be initialized to the value held by
-    /// the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn get_initial_value(&self) -> glib::Value;
+    // /// Retrieves the final value of `self` and copies
+    // /// it into `value`.
+    // ///
+    // /// The passed `gobject::Value` must be initialized to the value held by
+    // /// the `Interval`.
+    // /// ## `value`
+    // /// a `gobject::Value`
+    // fn get_final_value(&self) -> glib::Value;
+
+    // /// Retrieves the initial value of `self` and copies
+    // /// it into `value`.
+    // ///
+    // /// The passed `gobject::Value` must be initialized to the value held by
+    // /// the `Interval`.
+    // /// ## `value`
+    // /// a `gobject::Value`
+    // fn get_initial_value(&self) -> glib::Value;
 
     //fn get_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Retrieves the `glib::Type` of the values inside `self`.
-    ///
-    /// # Returns
-    ///
-    /// the type of the value, or G_TYPE_INVALID
-    fn get_value_type(&self) -> glib::types::Type;
+    // /// Retrieves the `glib::Type` of the values inside `self`.
+    // ///
+    // /// # Returns
+    // ///
+    // /// the type of the value, or G_TYPE_INVALID
+    // fn get_value_type(&self) -> glib::types::Type;
 
     /// Checks if the `self` has a valid initial and final values.
     ///
@@ -118,39 +126,39 @@ pub trait IntervalExt: 'static {
     ///  final values, and `false` otherwise
     fn is_valid(&self) -> bool;
 
-    /// Gets the pointer to the final value of `self`
-    ///
-    /// # Returns
-    ///
-    /// the final value of the interval.
-    ///  The value is owned by the `Interval` and it should not be
-    ///  modified or freed
-    fn peek_final_value(&self) -> Option<glib::Value>;
+    // /// Gets the pointer to the final value of `self`
+    // ///
+    // /// # Returns
+    // ///
+    // /// the final value of the interval.
+    // ///  The value is owned by the `Interval` and it should not be
+    // ///  modified or freed
+    // fn peek_final_value(&self) -> Option<glib::Value>;
 
-    /// Gets the pointer to the initial value of `self`
-    ///
-    /// # Returns
-    ///
-    /// the initial value of the interval.
-    ///  The value is owned by the `Interval` and it should not be
-    ///  modified or freed
-    fn peek_initial_value(&self) -> Option<glib::Value>;
+    // /// Gets the pointer to the initial value of `self`
+    // ///
+    // /// # Returns
+    // ///
+    // /// the initial value of the interval.
+    // ///  The value is owned by the `Interval` and it should not be
+    // ///  modified or freed
+    // fn peek_initial_value(&self) -> Option<glib::Value>;
 
     //fn set_final(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets the final value of `self` to `value`. The value is
-    /// copied inside the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn set_final_value(&self, value: &glib::Value);
+    // /// Sets the final value of `self` to `value`. The value is
+    // /// copied inside the `Interval`.
+    // /// ## `value`
+    // /// a `gobject::Value`
+    // fn set_final_value(&self, value: &glib::Value);
 
     //fn set_initial(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets the initial value of `self` to `value`. The value is copied
-    /// inside the `Interval`.
-    /// ## `value`
-    /// a `gobject::Value`
-    fn set_initial_value(&self, value: &glib::Value);
+    // /// Sets the initial value of `self` to `value`. The value is copied
+    // /// inside the `Interval`.
+    // /// ## `value`
+    // /// a `gobject::Value`
+    // fn set_initial_value(&self, value: &glib::Value);
 
     //fn set_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
@@ -177,136 +185,136 @@ pub trait IntervalExt: 'static {
 
 impl<O: Is<Interval>> IntervalExt for O {
     fn clone(&self) -> Option<Interval> {
-        // unsafe { from_glib_full(ffi::clutter_interval_clone(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib_full(ffi::interval_clone(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
-    fn compute(&self, factor: f64) -> Option<glib::Value> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_interval_compute(
-        //         self.as_ref().to_glib_none().0,
-        //         factor,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn compute(&self, factor: f64) -> Option<glib::Value> {
+    //     // unsafe {
+    //     //     from_glib_none(ffi::interval_compute(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         factor,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn compute_value(&self, factor: f64) -> Option<glib::Value> {
-        // unsafe {
-        //     let mut value = glib::Value::uninitialized();
-        //     let ret = from_glib(ffi::clutter_interval_compute_value(
-        //         self.as_ref().to_glib_none().0,
-        //         factor,
-        //         value.to_glib_none_mut().0,
-        //     ));
-        //     if ret {
-        //         Some(value)
-        //     } else {
-        //         None
-        //     }
-        // }
-        unimplemented!()
-    }
+    // fn compute_value(&self, factor: f64) -> Option<glib::Value> {
+    //     // unsafe {
+    //     //     let mut value = glib::Value::uninitialized();
+    //     //     let ret = from_glib(ffi::interval_compute_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         factor,
+    //     //         value.to_glib_none_mut().0,
+    //     //     ));
+    //     //     if ret {
+    //     //         Some(value)
+    //     //     } else {
+    //     //         None
+    //     //     }
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn get_final_value(&self) -> glib::Value {
-        // unsafe {
-        //     let mut value = glib::Value::uninitialized();
-        //     ffi::clutter_interval_get_final_value(
-        //         self.as_ref().to_glib_none().0,
-        //         value.to_glib_none_mut().0,
-        //     );
-        //     value
-        // }
-        unimplemented!()
-    }
+    // fn get_final_value(&self) -> glib::Value {
+    //     // unsafe {
+    //     //     let mut value = glib::Value::uninitialized();
+    //     //     ffi::interval_get_final_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         value.to_glib_none_mut().0,
+    //     //     );
+    //     //     value
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn get_initial_value(&self) -> glib::Value {
-        // unsafe {
-        //     let mut value = glib::Value::uninitialized();
-        //     ffi::clutter_interval_get_initial_value(
-        //         self.as_ref().to_glib_none().0,
-        //         value.to_glib_none_mut().0,
-        //     );
-        //     value
-        // }
-        unimplemented!()
-    }
+    // fn get_initial_value(&self) -> glib::Value {
+    //     // unsafe {
+    //     //     let mut value = glib::Value::uninitialized();
+    //     //     ffi::interval_get_initial_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         value.to_glib_none_mut().0,
+    //     //     );
+    //     //     value
+    //     // }
+    //     unimplemented!()
+    // }
 
     //fn get_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_get_interval() }
+    //    unsafe { TODO: call sys:interval_get_interval() }
     //}
 
-    fn get_value_type(&self) -> glib::types::Type {
-        // unsafe {
-        //     from_glib(ffi::clutter_interval_get_value_type(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn get_value_type(&self) -> glib::types::Type {
+    //     // unsafe {
+    //     //     from_glib(ffi::interval_get_value_type(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn is_valid(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_interval_is_valid(
+        //     from_glib(ffi::interval_is_valid(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
         unimplemented!()
     }
 
-    fn peek_final_value(&self) -> Option<glib::Value> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_interval_peek_final_value(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn peek_final_value(&self) -> Option<glib::Value> {
+    //     // unsafe {
+    //     //     from_glib_none(ffi::interval_peek_final_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn peek_initial_value(&self) -> Option<glib::Value> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_interval_peek_initial_value(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn peek_initial_value(&self) -> Option<glib::Value> {
+    //     // unsafe {
+    //     //     from_glib_none(ffi::interval_peek_initial_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     //fn set_final(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_set_final() }
+    //    unsafe { TODO: call sys:interval_set_final() }
     //}
 
-    fn set_final_value(&self, value: &glib::Value) {
-        // unsafe {
-        //     ffi::clutter_interval_set_final_value(
-        //         self.as_ref().to_glib_none().0,
-        //         value.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_final_value(&self, value: &glib::Value) {
+    //     // unsafe {
+    //     //     ffi::interval_set_final_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         value.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     //fn set_initial(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_set_initial() }
+    //    unsafe { TODO: call sys:interval_set_initial() }
     //}
 
-    fn set_initial_value(&self, value: &glib::Value) {
-        // unsafe {
-        //     ffi::clutter_interval_set_initial_value(
-        //         self.as_ref().to_glib_none().0,
-        //         value.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_initial_value(&self, value: &glib::Value) {
+    //     // unsafe {
+    //     //     ffi::interval_set_initial_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         value.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     //fn set_interval(&self, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_interval_set_interval() }
+    //    unsafe { TODO: call sys:interval_set_interval() }
     //}
 
     // fn validate<P: Is<glib::ParamSpec>>(&self, pspec: &P) -> bool {
     //     unsafe {
-    //         from_glib(ffi::clutter_interval_validate(
+    //         from_glib(ffi::interval_validate(
     //             self.as_ref().to_glib_none().0,
     //             pspec.as_ref().to_glib_none().0,
     //         ))
diff --git a/src/pure/keyframe_transition.rs b/src/pure/keyframe_transition.rs
index 0ebcc89..be02fec 100644
--- a/src/pure/keyframe_transition.rs
+++ b/src/pure/keyframe_transition.rs
@@ -1,3 +1,4 @@
+#![allow(unused_imports)]
 use super::AnimationMode;
 use crate::prelude::*;
 use std::fmt;
@@ -19,7 +20,7 @@ impl KeyframeTransition {
     ///  done to free its resources.
     pub fn new(property_name: &str) -> KeyframeTransition {
         // unsafe {
-        //     Transition::from_glib_full(ffi::clutter_keyframe_transition_new(
+        //     Transition::from_glib_full(ffi::keyframe_transition_new(
         //         property_name.to_glib_none().0,
         //     ))
         //     .unsafe_cast()
@@ -46,20 +47,20 @@ pub trait KeyframeTransitionExt: 'static {
     /// Removes all key frames from `self`.
     fn clear(&self);
 
-    /// Retrieves the details of the key frame at `index_` inside `self`.
-    ///
-    /// The `self` must already have key frames set, and `index_` must be
-    /// smaller than the number of key frames.
-    /// ## `index_`
-    /// the index of the key frame
-    /// ## `key`
-    /// return location for the key, or `None`
-    /// ## `mode`
-    /// return location for the easing mode, or `None`
-    /// ## `value`
-    /// a `gobject::Value` initialized with the type of
-    ///  the values
-    fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value);
+    // /// Retrieves the details of the key frame at `index_` inside `self`.
+    // ///
+    // /// The `self` must already have key frames set, and `index_` must be
+    // /// smaller than the number of key frames.
+    // /// ## `index_`
+    // /// the index of the key frame
+    // /// ## `key`
+    // /// return location for the key, or `None`
+    // /// ## `mode`
+    // /// return location for the easing mode, or `None`
+    // /// ## `value`
+    // /// a `gobject::Value` initialized with the type of
+    // ///  the values
+    // fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value);
 
     /// Retrieves the number of key frames inside `self`.
     ///
@@ -70,19 +71,19 @@ pub trait KeyframeTransitionExt: 'static {
 
     //fn set(&self, gtype: glib::types::Type, n_key_frames: u32, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets the details of the key frame at `index_` inside `self`.
-    ///
-    /// The `self` must already have a key frame at `index_`, and `index_`
-    /// must be smaller than the number of key frames inside `self`.
-    /// ## `index_`
-    /// the index of the key frame
-    /// ## `key`
-    /// the key of the key frame
-    /// ## `mode`
-    /// the easing mode of the key frame
-    /// ## `value`
-    /// a `gobject::Value` containing the value of the key frame
-    fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value);
+    // /// Sets the details of the key frame at `index_` inside `self`.
+    // ///
+    // /// The `self` must already have a key frame at `index_`, and `index_`
+    // /// must be smaller than the number of key frames inside `self`.
+    // /// ## `index_`
+    // /// the index of the key frame
+    // /// ## `key`
+    // /// the key of the key frame
+    // /// ## `mode`
+    // /// the easing mode of the key frame
+    // /// ## `value`
+    // /// a `gobject::Value` containing the value of the key frame
+    // fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value);
 
     /// Sets the keys for each key frame inside `self`.
     ///
@@ -98,72 +99,72 @@ pub trait KeyframeTransitionExt: 'static {
 
     //fn set_modes(&self, modes: /*Unimplemented*/&CArray TypeId { ns_id: 1, id: 28 });
 
-    /// Sets the values for each key frame inside `self`.
-    ///
-    /// If `self` does not hold any key frame, `n_values` key frames will
-    /// be created; if `self` already has key frames, `values` must have
-    /// at least as many elements as the number of key frames.
-    /// ## `n_values`
-    /// the number of values
-    /// ## `values`
-    /// an array of values, one for each
-    ///  key frame
-    fn set_values(&self, values: &[&glib::Value]);
+    // /// Sets the values for each key frame inside `self`.
+    // ///
+    // /// If `self` does not hold any key frame, `n_values` key frames will
+    // /// be created; if `self` already has key frames, `values` must have
+    // /// at least as many elements as the number of key frames.
+    // /// ## `n_values`
+    // /// the number of values
+    // /// ## `values`
+    // /// an array of values, one for each
+    // ///  key frame
+    // fn set_values(&self, values: &[&glib::Value]);
 }
 
 impl<O: Is<KeyframeTransition>> KeyframeTransitionExt for O {
     fn clear(&self) {
         // unsafe {
-        //     ffi::clutter_keyframe_transition_clear(self.as_ref().to_glib_none().0);
+        //     ffi::keyframe_transition_clear(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
-    fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value) {
-        // unsafe {
-        //     let mut key = mem::MaybeUninit::uninit();
-        //     let mut mode = mem::MaybeUninit::uninit();
-        //     let mut value = glib::Value::uninitialized();
-        //     ffi::clutter_keyframe_transition_get_key_frame(
-        //         self.as_ref().to_glib_none().0,
-        //         index_,
-        //         key.as_mut_ptr(),
-        //         mode.as_mut_ptr(),
-        //         value.to_glib_none_mut().0,
-        //     );
-        //     let key = key.assume_init();
-        //     let mode = mode.assume_init();
-        //     (key, from_glib(mode), value)
-        // }
-        unimplemented!()
-    }
+    // fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value) {
+    //     // unsafe {
+    //     //     let mut key = mem::MaybeUninit::uninit();
+    //     //     let mut mode = mem::MaybeUninit::uninit();
+    //     //     let mut value = glib::Value::uninitialized();
+    //     //     ffi::keyframe_transition_get_key_frame(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         index_,
+    //     //         key.as_mut_ptr(),
+    //     //         mode.as_mut_ptr(),
+    //     //         value.to_glib_none_mut().0,
+    //     //     );
+    //     //     let key = key.assume_init();
+    //     //     let mode = mode.assume_init();
+    //     //     (key, from_glib(mode), value)
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_n_key_frames(&self) -> u32 {
-        // unsafe { ffi::clutter_keyframe_transition_get_n_key_frames(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::keyframe_transition_get_n_key_frames(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     //fn set(&self, gtype: glib::types::Type, n_key_frames: u32, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_keyframe_transition_set() }
+    //    unsafe { TODO: call sys:keyframe_transition_set() }
     //}
 
-    fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value) {
-        // unsafe {
-        //     ffi::clutter_keyframe_transition_set_key_frame(
-        //         self.as_ref().to_glib_none().0,
-        //         index_,
-        //         key,
-        //         mode.to_glib(),
-        //         value.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value) {
+    //     // unsafe {
+    //     //     ffi::keyframe_transition_set_key_frame(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         index_,
+    //     //         key,
+    //     //         mode.to_glib(),
+    //     //         value.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_key_frames(&self, key_frames: &[f64]) {
         // let n_key_frames = key_frames.len() as u32;
         // unsafe {
-        //     ffi::clutter_keyframe_transition_set_key_frames(
+        //     ffi::keyframe_transition_set_key_frames(
         //         self.as_ref().to_glib_none().0,
         //         n_key_frames,
         //         key_frames.to_glib_none().0,
@@ -173,20 +174,20 @@ impl<O: Is<KeyframeTransition>> KeyframeTransitionExt for O {
     }
 
     //fn set_modes(&self, modes: /*Unimplemented*/&CArray TypeId { ns_id: 1, id: 28 }) {
-    //    unsafe { TODO: call clutter_sys:clutter_keyframe_transition_set_modes() }
+    //    unsafe { TODO: call sys:keyframe_transition_set_modes() }
     //}
 
-    fn set_values(&self, values: &[&glib::Value]) {
-        // let n_values = values.len() as u32;
-        // unsafe {
-        //     ffi::clutter_keyframe_transition_set_values(
-        //         self.as_ref().to_glib_none().0,
-        //         n_values,
-        //         values.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_values(&self, values: &[&glib::Value]) {
+    //     // let n_values = values.len() as u32;
+    //     // unsafe {
+    //     //     ffi::keyframe_transition_set_values(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         n_values,
+    //     //         values.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 }
 
 impl fmt::Display for KeyframeTransition {
diff --git a/src/pure/knot.rs b/src/pure/knot.rs
index efda3c4..8ed1229 100644
--- a/src/pure/knot.rs
+++ b/src/pure/knot.rs
@@ -1,10 +1,10 @@
-// * ClutterKnot:
-// * @x: X coordinate of the knot
-// * @y: Y coordinate of the knot
-// *
-// * Point in a path behaviour.
-// *
-// * Since: 0.2
+// Knot:
+// @x: X coordinate of the knot
+// @y: Y coordinate of the knot
+//
+// Point in a path behaviour.
+//
+// Since: 0.2
 #[derive(Debug, Clone, PartialOrd, Ord)]
 pub struct Knot {
     x: i32,
@@ -21,7 +21,7 @@ impl Knot {
     /// `true` if the knots point to the same location.
     fn equal(&self, knot_b: &Knot) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_knot_equal(
+        //     from_glib(ffi::knot_equal(
         //         self.to_glib_none().0,
         //         knot_b.to_glib_none().0,
         //     ))
diff --git a/src/pure/layout_manager.rs b/src/pure/layout_manager.rs
index cde814d..486958d 100644
--- a/src/pure/layout_manager.rs
+++ b/src/pure/layout_manager.rs
@@ -1,3 +1,4 @@
+#![allow(unused_imports)]
 use super::{Actor, ActorBox, AllocationFlags, Container, HandlerId, LayoutMeta};
 use crate::prelude::*;
 use std::fmt;
@@ -39,60 +40,60 @@ pub trait LayoutManagerExt: 'static {
 
     //fn child_get<P: Is<Container>, Q: Is<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Gets a property on the `LayoutMeta` created by `self` and
-    /// attached to a child of `container`
-    ///
-    /// The `gobject::Value` must already be initialized to the type of the property
-    /// and has to be unset with `gobject::Value::unset` after extracting the real
-    /// value out of it
-    /// ## `container`
-    /// a `Container` using `self`
-    /// ## `actor`
-    /// a `Actor` child of `container`
-    /// ## `property_name`
-    /// the name of the property to get
-    /// ## `value`
-    /// a `gobject::Value` with the value of the property to get
-    fn child_get_property<P: Is<Container>, Q: Is<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &mut glib::Value,
-    );
+    // /// Gets a property on the `LayoutMeta` created by `self` and
+    // /// attached to a child of `container`
+    // ///
+    // /// The `gobject::Value` must already be initialized to the type of the property
+    // /// and has to be unset with `gobject::Value::unset` after extracting the real
+    // /// value out of it
+    // /// ## `container`
+    // /// a `Container` using `self`
+    // /// ## `actor`
+    // /// a `Actor` child of `container`
+    // /// ## `property_name`
+    // /// the name of the property to get
+    // /// ## `value`
+    // /// a `gobject::Value` with the value of the property to get
+    // fn child_get_property<P: Is<Container>, Q: Is<Actor>>(
+    //     &self,
+    //     container: &P,
+    //     actor: &Q,
+    //     property_name: &str,
+    //     value: &mut glib::Value,
+    // );
 
     //fn child_set<P: Is<Container>, Q: Is<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets a property on the `LayoutMeta` created by `self` and
-    /// attached to a child of `container`
-    /// ## `container`
-    /// a `Container` using `self`
-    /// ## `actor`
-    /// a `Actor` child of `container`
-    /// ## `property_name`
-    /// the name of the property to set
-    /// ## `value`
-    /// a `gobject::Value` with the value of the property to set
-    fn child_set_property<P: Is<Container>, Q: Is<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &glib::Value,
-    );
+    // /// Sets a property on the `LayoutMeta` created by `self` and
+    // /// attached to a child of `container`
+    // /// ## `container`
+    // /// a `Container` using `self`
+    // /// ## `actor`
+    // /// a `Actor` child of `container`
+    // /// ## `property_name`
+    // /// the name of the property to set
+    // /// ## `value`
+    // /// a `gobject::Value` with the value of the property to set
+    // fn child_set_property<P: Is<Container>, Q: Is<Actor>>(
+    //     &self,
+    //     container: &P,
+    //     actor: &Q,
+    //     property_name: &str,
+    //     value: &glib::Value,
+    // );
 
-    /// Retrieves the `gobject::ParamSpec` for the layout property `name` inside
-    /// the `LayoutMeta` sub-class used by `self`
-    /// ## `name`
-    /// the name of the property
-    ///
-    /// # Returns
-    ///
-    /// a `gobject::ParamSpec` describing the property,
-    ///  or `None` if no property with that name exists. The returned
-    ///  `gobject::ParamSpec` is owned by the layout manager and should not be
-    ///  modified or freed
-    fn find_child_property(&self, name: &str) -> Option<glib::ParamSpec>;
+    // /// Retrieves the `gobject::ParamSpec` for the layout property `name` inside
+    // /// the `LayoutMeta` sub-class used by `self`
+    // /// ## `name`
+    // /// the name of the property
+    // ///
+    // /// # Returns
+    // ///
+    // /// a `gobject::ParamSpec` describing the property,
+    // ///  or `None` if no property with that name exists. The returned
+    // ///  `gobject::ParamSpec` is owned by the layout manager and should not be
+    // ///  modified or freed
+    // fn find_child_property(&self, name: &str) -> Option<glib::ParamSpec>;
 
     /// Retrieves the `LayoutMeta` that the layout `self` associated
     /// to the `actor` child of `container`, eventually by creating one if the
@@ -152,18 +153,18 @@ pub trait LayoutManagerExt: 'static {
     /// `LayoutManager` class
     fn layout_changed(&self);
 
-    /// Retrieves all the `gobject::ParamSpec`<!-- -->s for the layout properties
-    /// stored inside the `LayoutMeta` sub-class used by `self`
-    /// ## `n_pspecs`
-    /// return location for the number of returned
-    ///  `gobject::ParamSpec`<!-- -->s
-    ///
-    /// # Returns
-    ///
-    /// the newly-allocated,
-    ///  `None`-terminated array of `gobject::ParamSpec`<!-- -->s. Use `g_free` to free the
-    ///  resources allocated for the array
-    fn list_child_properties(&self) -> Vec<glib::ParamSpec>;
+    // /// Retrieves all the `gobject::ParamSpec`<!-- -->s for the layout properties
+    // /// stored inside the `LayoutMeta` sub-class used by `self`
+    // /// ## `n_pspecs`
+    // /// return location for the number of returned
+    // ///  `gobject::ParamSpec`<!-- -->s
+    // ///
+    // /// # Returns
+    // ///
+    // /// the newly-allocated,
+    // ///  `None`-terminated array of `gobject::ParamSpec`<!-- -->s. Use `g_free` to free the
+    // ///  resources allocated for the array
+    // fn list_child_properties(&self) -> Vec<glib::ParamSpec>;
 
     /// If the `LayoutManager` sub-class allows it, allow
     /// adding a weak reference of the `container` using `self`
@@ -209,7 +210,7 @@ impl<O: Is<LayoutManager>> LayoutManagerExt for O {
         flags: AllocationFlags,
     ) {
         // unsafe {
-        //     ffi::clutter_layout_manager_allocate(
+        //     ffi::layout_manager_allocate(
         //         self.as_ref().to_glib_none().0,
         //         container.as_ref().to_glib_none().0,
         //         allocation.to_glib_none().0,
@@ -220,60 +221,60 @@ impl<O: Is<LayoutManager>> LayoutManagerExt for O {
     }
 
     //fn child_get<P: Is<Container>, Q: Is<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_layout_manager_child_get() }
+    //    unsafe { TODO: call sys:layout_manager_child_get() }
     //}
 
-    fn child_get_property<P: Is<Container>, Q: Is<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &mut glib::Value,
-    ) {
-        // unsafe {
-        //     ffi::clutter_layout_manager_child_get_property(
-        //         self.as_ref().to_glib_none().0,
-        //         container.as_ref().to_glib_none().0,
-        //         actor.as_ref().to_glib_none().0,
-        //         property_name.to_glib_none().0,
-        //         value.to_glib_none_mut().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn child_get_property<P: Is<Container>, Q: Is<Actor>>(
+    //     &self,
+    //     container: &P,
+    //     actor: &Q,
+    //     property_name: &str,
+    //     value: &mut glib::Value,
+    // ) {
+    //     // unsafe {
+    //     //     ffi::layout_manager_child_get_property(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         container.as_ref().to_glib_none().0,
+    //     //         actor.as_ref().to_glib_none().0,
+    //     //         property_name.to_glib_none().0,
+    //     //         value.to_glib_none_mut().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     //fn child_set<P: Is<Container>, Q: Is<Actor>>(&self, container: &P, actor: &Q, first_property: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_layout_manager_child_set() }
+    //    unsafe { TODO: call sys:layout_manager_child_set() }
     //}
 
-    fn child_set_property<P: Is<Container>, Q: Is<Actor>>(
-        &self,
-        container: &P,
-        actor: &Q,
-        property_name: &str,
-        value: &glib::Value,
-    ) {
-        // unsafe {
-        //     ffi::clutter_layout_manager_child_set_property(
-        //         self.as_ref().to_glib_none().0,
-        //         container.as_ref().to_glib_none().0,
-        //         actor.as_ref().to_glib_none().0,
-        //         property_name.to_glib_none().0,
-        //         value.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn child_set_property<P: Is<Container>, Q: Is<Actor>>(
+    //     &self,
+    //     container: &P,
+    //     actor: &Q,
+    //     property_name: &str,
+    //     value: &glib::Value,
+    // ) {
+    //     // unsafe {
+    //     //     ffi::layout_manager_child_set_property(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         container.as_ref().to_glib_none().0,
+    //     //         actor.as_ref().to_glib_none().0,
+    //     //         property_name.to_glib_none().0,
+    //     //         value.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn find_child_property(&self, name: &str) -> Option<glib::ParamSpec> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_layout_manager_find_child_property(
-        //         self.as_ref().to_glib_none().0,
-        //         name.to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn find_child_property(&self, name: &str) -> Option<glib::ParamSpec> {
+    //     // unsafe {
+    //     //     from_glib_none(ffi::layout_manager_find_child_property(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         name.to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_child_meta<P: Is<Container>, Q: Is<Actor>>(
         &self,
@@ -281,7 +282,7 @@ impl<O: Is<LayoutManager>> LayoutManagerExt for O {
         actor: &Q,
     ) -> Option<LayoutMeta> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_layout_manager_get_child_meta(
+        //     from_glib_none(ffi::layout_manager_get_child_meta(
         //         self.as_ref().to_glib_none().0,
         //         container.as_ref().to_glib_none().0,
         //         actor.as_ref().to_glib_none().0,
@@ -294,7 +295,7 @@ impl<O: Is<LayoutManager>> LayoutManagerExt for O {
         // unsafe {
         //     let mut min_height_p = mem::MaybeUninit::uninit();
         //     let mut nat_height_p = mem::MaybeUninit::uninit();
-        //     ffi::clutter_layout_manager_get_preferred_height(
+        //     ffi::layout_manager_get_preferred_height(
         //         self.as_ref().to_glib_none().0,
         //         container.as_ref().to_glib_none().0,
         //         for_width,
@@ -312,7 +313,7 @@ impl<O: Is<LayoutManager>> LayoutManagerExt for O {
         // unsafe {
         //     let mut min_width_p = mem::MaybeUninit::uninit();
         //     let mut nat_width_p = mem::MaybeUninit::uninit();
-        //     ffi::clutter_layout_manager_get_preferred_width(
+        //     ffi::layout_manager_get_preferred_width(
         //         self.as_ref().to_glib_none().0,
         //         container.as_ref().to_glib_none().0,
         //         for_height,
@@ -328,29 +329,29 @@ impl<O: Is<LayoutManager>> LayoutManagerExt for O {
 
     fn layout_changed(&self) {
         // unsafe {
-        //     ffi::clutter_layout_manager_layout_changed(self.as_ref().to_glib_none().0);
+        //     ffi::layout_manager_layout_changed(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
-    fn list_child_properties(&self) -> Vec<glib::ParamSpec> {
-        // unsafe {
-        //     let mut n_pspecs = mem::MaybeUninit::uninit();
-        //     let ret = FromGlibContainer::from_glib_full_num(
-        //         ffi::clutter_layout_manager_list_child_properties(
-        //             self.as_ref().to_glib_none().0,
-        //             n_pspecs.as_mut_ptr(),
-        //         ),
-        //         n_pspecs.assume_init() as usize,
-        //     );
-        //     ret
-        // }
-        unimplemented!()
-    }
+    // fn list_child_properties(&self) -> Vec<glib::ParamSpec> {
+    //     // unsafe {
+    //     //     let mut n_pspecs = mem::MaybeUninit::uninit();
+    //     //     let ret = FromGlibContainer::from_glib_full_num(
+    //     //         ffi::layout_manager_list_child_properties(
+    //     //             self.as_ref().to_glib_none().0,
+    //     //             n_pspecs.as_mut_ptr(),
+    //     //         ),
+    //     //         n_pspecs.assume_init() as usize,
+    //     //     );
+    //     //     ret
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_container<P: Is<Container>>(&self, container: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_layout_manager_set_container(
+        //     ffi::layout_manager_set_container(
         //         self.as_ref().to_glib_none().0,
         //         container.map(|p| p.as_ref()).to_glib_none().0,
         //     );
diff --git a/src/pure/layout_meta.rs b/src/pure/layout_meta.rs
index c9bde0f..0c63a99 100644
--- a/src/pure/layout_meta.rs
+++ b/src/pure/layout_meta.rs
@@ -32,7 +32,7 @@ pub trait LayoutMetaExt: 'static {
 impl<O: Is<LayoutMeta>> LayoutMetaExt for O {
     fn get_manager(&self) -> Option<LayoutManager> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_layout_meta_get_manager(
+        //     from_glib_none(ffi::layout_meta_get_manager(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
diff --git a/src/pure/main_context.rs b/src/pure/main_context.rs
index bcb0e0a..0f9872d 100644
--- a/src/pure/main_context.rs
+++ b/src/pure/main_context.rs
@@ -1,34 +1,36 @@
 #![allow(unused_imports)]
-use super::{Actor, Backend, Event, FeatureFlags, PickMode, Settings, StageManager, TextDirection};
 use once_cell::sync::{Lazy, OnceCell};
 use std::{
     cell::RefCell,
     sync::{Arc, Mutex},
 };
 
-// * SECTION:clutter-main
-// * @short_description: Various 'global'  functions.
-// *
-// * Functions to retrieve various global  resources and other utility
-// * functions for mainloops, events and threads
-// *
-// * ## The  Threading Model
-// *
-// *  is *thread-aware*: all operations performed by  are assumed
-// * to be under the Big  Lock, which is created when the threading is
-// * initialized through clutter_init(), and entered when calling user-related
-// * code during event handling and actor drawing.
-// *
-// * The only safe and portable way to use the  API in a multi-threaded
-// * environment is to only access the  API from a thread that did called
-// * clutter_init() and clutter_main().
-// *
-// * The common pattern for using threads with  is to use worker threads
-// * to perform blocking operations and then install idle or timeout sources with
-// * the result when the thread finishes, and update the UI from those callbacks.
-// *
-// * For a working example of how to use a worker thread to update the UI, see
-// * [threads.c](https://git.gnome.org/browse/clutter/tree/examples/threads.c?h=clutter-1.18)
+use dx::platform::core::FeatureFlags as DxFeatureFlags;
+
+use super::{Actor, Backend, Event, FeatureFlags, PickMode, Settings, StageManager, TextDirection};
+
+// @short_description: Various 'global'  functions.
+//
+// Functions to retrieve various global  resources and other utility
+// functions for mainloops, events and threads
+//
+// ## The  Threading Model
+//
+//  is *thread-aware*: all operations performed by  are assumed
+// to be under the Big  Lock, which is created when the threading is
+// initialized through init(), and entered when calling user-related
+// code during event handling and actor drawing.
+//
+// The only safe and portable way to use the  API in a multi-threaded
+// environment is to only access the  API from a thread that did called
+// init() and main().
+//
+// The common pattern for using threads with  is to use worker threads
+// to perform blocking operations and then install idle or timeout sources with
+// the result when the thread finishes, and update the UI from those callbacks.
+//
+// For a working example of how to use a worker thread to update the UI, see
+// [threads.c](https://git.gnome.org/browse/clutter/tree/examples/threads.c?h=1.18)
 
 #[derive(Default)]
 pub struct MainContextProps {
@@ -44,7 +46,7 @@ pub struct MainContextProps {
     // the main event queue
     // events_queue: Option<GQueue>,
 
-    // the event filters added via clutter_event_add_filter. these are
+    // the event filters added via event_add_filter. these are
     // ordered from least recently added to most recently added
     event_filters: Option<Vec<bool>>,
 
@@ -92,9 +94,9 @@ pub struct MainContextProps {
 
 unsafe impl Send for MainContextProps {}
 
-// * MainContext:
-// *
-// * The shared state of 
+// MainContext:
+//
+// The shared state of
 pub struct MainContext {
     props: Arc<Mutex<MainContextProps>>,
 }
@@ -110,7 +112,7 @@ impl MainContext {
         }
     }
 
-    // replacement for clutter_context_get_default
+    // replacement for context_get_default
     pub fn global() -> &'static Self {
         static CONTEXT_INSTANCE: OnceCell<MainContext> = OnceCell::new();
         CONTEXT_INSTANCE.get_or_init(Self::new)
@@ -140,7 +142,7 @@ fn base_init() {
         Ok(mut initialized) => {
             *initialized = true;
 
-            // bindtextdomain (GETTEXT_PACKAGE, CLUTTER_LOCALEDIR);
+            // bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
             // bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 
             // initialise GLib type system
@@ -156,15 +158,15 @@ fn base_init() {
 }
 
 fn get_text_direction() -> TextDirection {
-    // TextDirection dir = CLUTTER_TEXT_DIRECTION_LTR;
+    // TextDirection dir = TEXT_DIRECTION_LTR;
     // const gchar *direction;
 
-    // direction = g_getenv ("CLUTTER_TEXT_DIRECTION");
+    // direction = g_getenv ("TEXT_DIRECTION");
     // if direction && *direction != '\0' {
     //     if strcmp(direction, "rtl") == 0 {
-    //       dir = CLUTTER_TEXT_DIRECTION_RTL;
+    //       dir = TEXT_DIRECTION_RTL;
     //     } else if strcmp(direction, "ltr") == 0 {
-    //       dir = CLUTTER_TEXT_DIRECTION_LTR;
+    //       dir = TEXT_DIRECTION_LTR;
     //     }
     // } else {
     //     /* Translators: Leave this UNTRANSLATED if your language is
@@ -177,16 +179,16 @@ fn get_text_direction() -> TextDirection {
     //     char *e = _("default:LTR");
 
     //     if strcmp (e, "default:RTL") == 0 {
-    //       dir = CLUTTER_TEXT_DIRECTION_RTL;
+    //       dir = TEXT_DIRECTION_RTL;
     //     } else if (strcmp (e, "default:LTR") == 0 {
-    //       dir = CLUTTER_TEXT_DIRECTION_LTR;
+    //       dir = TEXT_DIRECTION_LTR;
     //     } else {
     //       g_warning ("Whoever translated default:LTR did so wrongly.");
     //     }
     // }
 
-    // CLUTTER_NOTE(MISC, "Text direction: %s",
-    //               dir == CLUTTER_TEXT_DIRECTION_RTL ? "rtl" : "ltr");
+    // NOTE(MISC, "Text direction: %s",
+    //               dir == TEXT_DIRECTION_RTL ? "rtl" : "ltr");
 
     // return dir;
     unimplemented!()
@@ -197,24 +199,23 @@ pub struct Features {
     features_set: bool,
 }
 
-// * SECTION:clutter-feature
-// * @short_description: Run-time detection of  features
-// *
-// * Parts of  depend on the underlying platform, including the
-// * capabilities of the backend used and the OpenGL features exposed through the
-// *  and COGL API.
-// *
-// * It is possible to ask whether  has support for specific features at
-// * run-time.
-// *
-// * See also dx_get_features() and #CoglFeatureFlags
+// @short_description: Run-time detection of  features
+//
+// Parts of  depend on the underlying platform, including the
+// capabilities of the backend used and the OpenGL features exposed through the
+//  and COGL API.
+//
+// It is possible to ask whether  has support for specific features at
+// run-time.
+//
+// See also dx_get_features() and #CoglFeatureFlags
 fn feature_init(backend: &Option<Backend>) -> bool {
     // MainContext *context;
 
-    // CLUTTER_NOTE (MISC, "checking features");
+    // NOTE (MISC, "checking features");
 
     // if !__features {
-    //     CLUTTER_NOTE (MISC, "allocating features data");
+    //     NOTE (MISC, "allocating features data");
     //     __features = g_new0 (Features, 1);
     //     __features->features_set = FALSE; /* don't rely on zero-ing */
     // }
@@ -223,7 +224,7 @@ fn feature_init(backend: &Option<Backend>) -> bool {
     //     return true;
     // }
 
-    // context = _clutter_context_get_default ();
+    // context = _context_get_default ();
 
     // makes sure we have a GL context; if we have, this is a no-op
     match backend {
@@ -235,40 +236,40 @@ fn feature_init(backend: &Option<Backend>) -> bool {
         None => {}
     }
 
-    // __features->flags = (clutter_features_from_cogl (dx_get_features ())
-    //                     | _clutter_backend_get_features (context->backend));
+    // __features->flags = (features_from_cogl (dx_get_features ())
+    //                     | _backend_get_features (context->backend));
 
     // __features->features_set = TRUE;
 
-    // CLUTTER_NOTE (MISC, "features checked");
+    // NOTE (MISC, "features checked");
 
-    return true;
+    true
 }
 
-fn features_from_cogl(dx_flags: dx::pure::FeatureFlags) -> FeatureFlags {
-    let mut clutter_flags: FeatureFlags = FeatureFlags::NONE;
+fn features_from_cogl(dx_flags: DxFeatureFlags) -> FeatureFlags {
+    let mut flags: FeatureFlags = FeatureFlags::NONE;
 
-    if (dx_flags & dx::pure::FeatureFlags::TEXTURE_NPOT).bits() != 0 {
-        clutter_flags |= FeatureFlags::TEXTURE_NPOT;
+    if (dx_flags & DxFeatureFlags::TEXTURE_NPOT).bits() != 0 {
+        flags |= FeatureFlags::TEXTURE_NPOT;
     }
 
-    if (dx_flags & dx::pure::FeatureFlags::TEXTURE_YUV).bits() != 0 {
-        clutter_flags |= FeatureFlags::TEXTURE_YUV;
+    if (dx_flags & DxFeatureFlags::TEXTURE_YUV).bits() != 0 {
+        flags |= FeatureFlags::TEXTURE_YUV;
     }
 
-    if (dx_flags & dx::pure::FeatureFlags::TEXTURE_READ_PIXELS).bits() != 0 {
-        clutter_flags |= FeatureFlags::TEXTURE_READ_PIXELS;
+    if (dx_flags & DxFeatureFlags::TEXTURE_READ_PIXELS).bits() != 0 {
+        flags |= FeatureFlags::TEXTURE_READ_PIXELS;
     }
 
-    if (dx_flags & dx::pure::FeatureFlags::SHADERS_GLSL).bits() != 0 {
-        clutter_flags |= FeatureFlags::SHADERS_GLSL;
+    if (dx_flags & DxFeatureFlags::SHADERS_GLSL).bits() != 0 {
+        flags |= FeatureFlags::SHADERS_GLSL;
     }
 
-    if (dx_flags & dx::pure::FeatureFlags::OFFSCREEN).bits() != 0 {
-        clutter_flags |= FeatureFlags::OFFSCREEN;
+    if (dx_flags & DxFeatureFlags::OFFSCREEN).bits() != 0 {
+        flags |= FeatureFlags::OFFSCREEN;
     }
 
-    clutter_flags
+    flags
 }
 
 fn init_real(props: &mut MainContextProps) -> InitError {
@@ -281,31 +282,31 @@ fn init_real(props: &mut MainContextProps) -> InitError {
         // if error {
         //     // g_set_error(error, InitError,
         //     //     InitError::ErrorInternal,
-        //     //     r#"When using clutter_get_option_group_without_init()
-        //     //     "you must parse options before calling clutter_init()"#);
+        //     //     r#"When using get_option_group_without_init()
+        //     //     "you must parse options before calling init()"#);
         // } else {
-        //     // g_critical(r#"When using clutter_get_option_group_without_init()
-        //     //     "you must parse options before calling clutter_init()"#);
+        //     // g_critical(r#"When using get_option_group_without_init()
+        //     //     "you must parse options before calling init()"#);
         // }
         // return InitError::Internal;
     }
 
     // // Call backend post parse hooks.
-    // if !_clutter_backend_post_parse(backend, error) {
+    // if !_backend_post_parse(backend, error) {
     //     return InitError::Backend;
     // }
 
     // // If we are displaying the regions that would get redrawn with clipped
     // // redraws enabled we actually have to disable the clipped redrawing
     // // because otherwise we end up with nasty trails of rectangles everywhere.
-    // if clutter_paint_debug_flags & CLUTTER_DEBUG_REDRAWS {
-    //     clutter_paint_debug_flags |= CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS;
+    // if paint_debug_flags & DEBUG_REDRAWS {
+    //     paint_debug_flags |= DEBUG_DISABLE_CLIPPED_REDRAWS;
     // }
 
     // // The same is true when drawing the outlines of paint volumes...
-    // if clutter_paint_debug_flags & CLUTTER_DEBUG_PAINT_VOLUMES {
-    //     clutter_paint_debug_flags |=
-    //         CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS | CLUTTER_DEBUG_DISABLE_CULLING;
+    // if paint_debug_flags & DEBUG_PAINT_VOLUMES {
+    //     paint_debug_flags |=
+    //         DEBUG_DISABLE_CLIPPED_REDRAWS | DEBUG_DISABLE_CULLING;
     // }
 
     // this will take care of initializing Cogl's state and
@@ -314,7 +315,7 @@ fn init_real(props: &mut MainContextProps) -> InitError {
         return InitError::Backend;
     }
 
-    // clutter_text_direction = get_text_direction();
+    // text_direction = get_text_direction();
 
     // Initiate event collection
     match backend {
@@ -324,41 +325,41 @@ fn init_real(props: &mut MainContextProps) -> InitError {
         None => {}
     }
 
-    // clutter_is_initialized = true;
+    // is_initialized = true;
     props.is_initialized = true;
 
     // // Initialize a11y */
-    // if clutter_enable_accessibility {
+    // if enable_accessibility {
     //     cally_accessibility_init();
     // }
 
     InitError::Sucess
 }
 
-// * clutter_init:
-// * @argc: (inout): The number of arguments in @argv
-// * @argv: (array length=argc) (inout) (allow-none): A pointer to an array
-// *   of arguments.
-// *
-// * Initialises everything needed to operate with  and parses some
-// * standard command line options; @argc and @argv are adjusted accordingly
-// * so your own code will never see those standard arguments.
-// *
-// * It is safe to call this function multiple times.
-// *
-// * This function will not abort in case of errors during
-// * initialization; clutter_init() will print out the error message on
-// * stderr, and will return an error code. It is up to the application
-// * code to handle this case. If you need to display the error message
-// * yourself, you can use clutter_init_with_args(), which takes a #GError
-// * pointer.
-// *
-// * If this function fails, and returns an error code, any subsequent
-// *  API will have undefined behaviour - including segmentation
-// * faults and assertion failures. Make sure to handle the returned
-// * #InitError enumeration value.
-// *
-// * Return value: a #InitError value
+// init:
+// @argc: (inout): The number of arguments in @argv
+// @argv: (array length=argc) (inout) (allow-none): A pointer to an array
+//   of arguments.
+//
+// Initialises everything needed to operate with  and parses some
+// standard command line options; @argc and @argv are adjusted accordingly
+// so your own code will never see those standard arguments.
+//
+// It is safe to call this function multiple times.
+//
+// This function will not abort in case of errors during
+// initialization; init() will print out the error message on
+// stderr, and will return an error code. It is up to the application
+// code to handle this case. If you need to display the error message
+// yourself, you can use init_with_args(), which takes a #GError
+// pointer.
+//
+// If this function fails, and returns an error code, any subsequent
+//  API will have undefined behaviour - including segmentation
+// faults and assertion failures. Make sure to handle the returned
+// #InitError enumeration value.
+//
+// Return value: a #InitError value
 pub fn animate_init() {
     base_init();
     let ctx = MainContext::global();
@@ -418,15 +419,15 @@ pub enum CullResult {
     ResultPartial,
 }
 
-// * InitError:
-// * @CLUTTER_INIT_SUCCESS: Initialisation successful
-// * @CLUTTER_INIT_ERROR_UNKNOWN: Unknown error
-// * @CLUTTER_INIT_ERROR_THREADS: Thread initialisation failed
-// * @CLUTTER_INIT_ERROR_BACKEND: Backend initialisation failed
-// * @CLUTTER_INIT_ERROR_INTERNAL: Internal error
-// *
-// * Error conditions returned by clutter_init() and clutter_init_with_args().
-// *
+// InitError:
+// @INIT_SUCCESS: Initialisation successful
+// @INIT_ERROR_UNKNOWN: Unknown error
+// @INIT_ERROR_THREADS: Thread initialisation failed
+// @INIT_ERROR_BACKEND: Backend initialisation failed
+// @INIT_ERROR_INTERNAL: Internal error
+//
+// Error conditions returned by init() and init_with_args().
+//
 pub enum InitError {
     Sucess = 1,
     Unknown = 0,
diff --git a/src/pure/margin.rs b/src/pure/margin.rs
index b8377b7..65911a5 100644
--- a/src/pure/margin.rs
+++ b/src/pure/margin.rs
@@ -1,15 +1,15 @@
-// * @left: the margin from the left
-// * @right: the margin from the right
-// * @top: the margin from the top
-// * @bottom: the margin from the bottom
-// *
-// * A representation of the components of a margin.
-#[derive(Default, Debug, PartialEq, PartialOrd)]
+// @left: the margin from the left
+// @right: the margin from the right
+// @top: the margin from the top
+// @bottom: the margin from the bottom
+//
+// A representation of the components of a margin.
+#[derive(Default, Debug, PartialEq, PartialOrd, Clone, Copy)]
 pub struct Margin {
-    left: f32,
-    right: f32,
-    top: f32,
-    bottom: f32,
+    pub left: f32,
+    pub right: f32,
+    pub top: f32,
+    pub bottom: f32,
 }
 
 impl Margin {
diff --git a/src/pure/matrix.rs b/src/pure/matrix.rs
index 73c826a..29ba9fc 100644
--- a/src/pure/matrix.rs
+++ b/src/pure/matrix.rs
@@ -1,9 +1,9 @@
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
 pub struct Matrix {}
 
 impl Matrix {
     //pub fn init_from_array(&mut self, values: /*Unimplemented*/FixedArray TypeId { ns_id: 0, id: 20 }; 16) -> Option<Matrix> {
-    //    unsafe { TODO: call clutter_sys:clutter_matrix_init_from_array() }
+    //    unsafe { TODO: call sys:matrix_init_from_array() }
     //}
 
     /// Initializes the `Matrix` `self` with the contents of the
@@ -16,7 +16,7 @@ impl Matrix {
     /// the initialized `Matrix`
     pub fn init_from_matrix(&mut self, b: &Matrix) -> Option<Matrix> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_matrix_init_from_matrix(
+        //     from_glib_none(ffi::matrix_init_from_matrix(
         //         self.to_glib_none_mut().0,
         //         b.to_glib_none().0,
         //     ))
@@ -38,7 +38,7 @@ impl Matrix {
     ///
     /// the initialized `Matrix`
     pub fn init_identity(&mut self) -> Option<Matrix> {
-        // unsafe { from_glib_none(ffi::clutter_matrix_init_identity(self.to_glib_none_mut().0)) }
+        // unsafe { from_glib_none(ffi::matrix_init_identity(self.to_glib_none_mut().0)) }
         unimplemented!()
     }
 
@@ -48,7 +48,7 @@ impl Matrix {
     ///
     /// the newly allocated `Matrix`
     pub fn alloc() -> Option<Matrix> {
-        // unsafe { from_glib_full(ffi::clutter_matrix_alloc()) }
+        // unsafe { from_glib_full(ffi::matrix_alloc()) }
         unimplemented!()
     }
 }
diff --git a/src/pure/mod.rs b/src/pure/mod.rs
index fe1ceec..3c8bf7b 100644
--- a/src/pure/mod.rs
+++ b/src/pure/mod.rs
@@ -26,8 +26,9 @@ pub use self::actor_meta::{ActorMeta, ActorMetaExt};
 mod align_constraint;
 pub use self::align_constraint::AlignConstraint;
 
-mod alpha;
-pub use self::alpha::Alpha;
+// deprecated
+// mod alpha;
+// pub use self::alpha::Alpha;
 
 mod animatable;
 pub use self::animatable::{Animatable, AnimatableExt};
@@ -38,11 +39,12 @@ pub use self::backend::Backend;
 mod behaviour;
 pub use self::behaviour::Behaviour;
 
-mod behaviour_ellipse;
-pub use self::behaviour_ellipse::{BehaviourEllipse, BehaviourEllipseExt};
+// deprecated
+// mod behaviour_ellipse;
+// pub use self::behaviour_ellipse::{BehaviourEllipse, BehaviourEllipseExt};
 
-mod behaviour_rotate;
-pub use self::behaviour_rotate::{BehaviourRotate, BehaviourRotateExt};
+// mod behaviour_rotate;
+// pub use self::behaviour_rotate::{BehaviourRotate, BehaviourRotateExt};
 
 mod bin_layout;
 pub use self::bin_layout::BinLayout;
@@ -242,9 +244,6 @@ pub use self::perspective::{Perspective, Fog};
 mod pipeline_node;
 pub use self::pipeline_node::PipelineNode;
 
-mod platform;
-pub(crate) use self::platform::*;
-
 mod property_transition;
 pub use self::property_transition::{PropertyTransition, PropertyTransitionExt};
 
@@ -403,8 +402,8 @@ pub mod traits {
     pub use super::ActorExt;
     pub use super::ActorMetaExt;
     pub use super::AnimatableExt;
-    pub use super::BehaviourEllipseExt;
-    pub use super::BehaviourRotateExt;
+    // pub use super::BehaviourEllipseExt;
+    // pub use super::BehaviourRotateExt;
     pub use super::BoxLayoutExt;
     pub use super::ChildMetaExt;
     pub use super::ClickActionExt;
@@ -449,4 +448,4 @@ pub mod traits {
     pub use super::ZoomActionExt;
 }
 
-pub use glib::timeout_add_local as interval;
+// pub use glib::timeout_add_local as interval;
diff --git a/src/pure/offscreen_effect.rs b/src/pure/offscreen_effect.rs
index 93df21e..1494dac 100644
--- a/src/pure/offscreen_effect.rs
+++ b/src/pure/offscreen_effect.rs
@@ -1,7 +1,9 @@
-use crate::prelude::*;
-use crate::Rect;
 use std::fmt;
 
+use crate::prelude::*;
+
+use crate::foundation::Rect;
+
 // @extends Effect, ActorMeta,
 #[derive(Debug, Clone)]
 pub struct OffscreenEffect {
@@ -61,12 +63,12 @@ pub trait OffscreenEffectExt: 'static {
 
 impl<O: Is<OffscreenEffect>> OffscreenEffectExt for O {
     //fn create_texture(&self, width: f32, height: f32) -> /*Unimplemented*/Option<dx::pure::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_offscreen_effect_create_texture() }
+    //    unsafe { TODO: call sys:offscreen_effect_create_texture() }
     //}
 
     // fn get_target(&self) -> Option<dx::pure::Material> {
     //     unsafe {
-    //         from_glib_none(ffi::clutter_offscreen_effect_get_target(
+    //         from_glib_none(ffi::offscreen_effect_get_target(
     //             self.as_ref().to_glib_none().0,
     //         ))
     //     }
@@ -75,7 +77,7 @@ impl<O: Is<OffscreenEffect>> OffscreenEffectExt for O {
     fn get_target_rect(&self) -> Option<Rect<f64>> {
         // unsafe {
         //     let mut rect = Rect::uninitialized();
-        //     let ret = from_glib(ffi::clutter_offscreen_effect_get_target_rect(
+        //     let ret = from_glib(ffi::offscreen_effect_get_target_rect(
         //         self.as_ref().to_glib_none().0,
         //         rect.to_glib_none_mut().0,
         //     ));
@@ -89,12 +91,12 @@ impl<O: Is<OffscreenEffect>> OffscreenEffectExt for O {
     }
 
     //fn get_texture(&self) -> /*Unimplemented*/Option<dx::pure::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_offscreen_effect_get_texture() }
+    //    unsafe { TODO: call sys:offscreen_effect_get_texture() }
     //}
 
     fn paint_target(&self) {
         // unsafe {
-        //     ffi::clutter_offscreen_effect_paint_target(self.as_ref().to_glib_none().0);
+        //     ffi::offscreen_effect_paint_target(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
diff --git a/src/pure/page_turn_effect.rs b/src/pure/page_turn_effect.rs
index 03bd55b..9d374e1 100644
--- a/src/pure/page_turn_effect.rs
+++ b/src/pure/page_turn_effect.rs
@@ -19,7 +19,7 @@ impl PageTurnEffect {
     /// the newly created `PageTurnEffect`
     pub fn new(period: f64, angle: f64, radius: f32) -> PageTurnEffect {
         // unsafe {
-        //     Effect::from_glib_none(ffi::clutter_page_turn_effect_new(period, angle, radius))
+        //     Effect::from_glib_none(ffi::page_turn_effect_new(period, angle, radius))
         //         .unsafe_cast()
         // }
         unimplemented!()
@@ -31,7 +31,7 @@ impl PageTurnEffect {
     ///
     /// the angle of the page curling
     pub fn get_angle(&self) -> f64 {
-        // unsafe { ffi::clutter_page_turn_effect_get_angle(self.to_glib_none().0) }
+        // unsafe { ffi::page_turn_effect_get_angle(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -41,7 +41,7 @@ impl PageTurnEffect {
     ///
     /// the period of the page curling
     pub fn get_period(&self) -> f64 {
-        // unsafe { ffi::clutter_page_turn_effect_get_period(self.to_glib_none().0) }
+        // unsafe { ffi::page_turn_effect_get_period(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -51,7 +51,7 @@ impl PageTurnEffect {
     ///
     /// the radius of the page curling
     pub fn get_radius(&self) -> f32 {
-        // unsafe { ffi::clutter_page_turn_effect_get_radius(self.to_glib_none().0) }
+        // unsafe { ffi::page_turn_effect_get_radius(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -60,7 +60,7 @@ impl PageTurnEffect {
     /// the angle of the page curl, in degrees
     pub fn set_angle(&self, angle: f64) {
         // unsafe {
-        //     ffi::clutter_page_turn_effect_set_angle(self.to_glib_none().0, angle);
+        //     ffi::page_turn_effect_set_angle(self.to_glib_none().0, angle);
         // }
         unimplemented!()
     }
@@ -71,7 +71,7 @@ impl PageTurnEffect {
     /// the period of the page curl, between 0.0 and 1.0
     pub fn set_period(&self, period: f64) {
         // unsafe {
-        //     ffi::clutter_page_turn_effect_set_period(self.to_glib_none().0, period);
+        //     ffi::page_turn_effect_set_period(self.to_glib_none().0, period);
         // }
         unimplemented!()
     }
@@ -81,7 +81,7 @@ impl PageTurnEffect {
     /// the radius of the page curling, in pixels
     pub fn set_radius(&self, radius: f32) {
         // unsafe {
-        //     ffi::clutter_page_turn_effect_set_radius(self.to_glib_none().0, radius);
+        //     ffi::page_turn_effect_set_radius(self.to_glib_none().0, radius);
         // }
         unimplemented!()
     }
diff --git a/src/pure/paint_node.rs b/src/pure/paint_node.rs
index c10e2a7..a59d7d9 100644
--- a/src/pure/paint_node.rs
+++ b/src/pure/paint_node.rs
@@ -1,23 +1,27 @@
-use super::{Actor, ActorBox};
+use std::{cell::RefCell, fmt};
+
 use crate::prelude::*;
-use std::{fmt, cell::RefCell};
-
-// * SECTION:clutter-paint-node
-// * @Title: PaintNode
-// * @Short_Description: Paint objects
-// *
-// * #PaintNode is an element in the render graph.
-// *
-// * The render graph contains all the elements that need to be painted by
-// *  when submitting a frame to the graphics system.
-// *
-// * The render graph is distinct from the scene graph: the scene graph is
-// * composed by actors, which can be visible or invisible; the scene graph
-// * elements also respond to events. The render graph, instead, is only
-// * composed by nodes that will be painted.
-// *
-// * Each #Actor can submit multiple #PaintNode<!-- -->s to
-// * the render graph.
+
+use dx::foundation::colorspace::Color;
+use dx::platform::core::{Texture, Pipeline, Matrix, Framebuffer, Path, Primitive, BufferBit};
+
+use super::{Actor, ActorBox};
+
+// @Title: PaintNode
+// @Short_Description: Paint objects
+//
+// #PaintNode is an element in the render graph.
+//
+// The render graph contains all the elements that need to be painted by
+//  when submitting a frame to the graphics system.
+//
+// The render graph is distinct from the scene graph: the scene graph is
+// composed by actors, which can be visible or invisible; the scene graph
+// elements also respond to events. The render graph, instead, is only
+// composed by nodes that will be painted.
+//
+// Each #Actor can submit multiple #PaintNode<!-- -->s to
+// the render graph.
 
 pub const PAINT_OP_INIT: PaintOperation = PaintOperation {
     opcode: PaintOpCode::Invalid,
@@ -26,8 +30,8 @@ pub const PAINT_OP_INIT: PaintOperation = PaintOperation {
 pub enum PaintOpCode {
     Invalid,
     TexRect([f32; 8]),
-    Path(dx::pure::Path),
-    Primitive(dx::pure::Primitive),
+    Path(Path),
+    Primitive(Primitive),
 }
 
 pub struct PaintOperation {
@@ -44,16 +48,15 @@ pub struct PaintOperation {
 pub struct LayerNode {
     pub parent_instance: PaintNode,
 
-    pub viewport: cairo::Rectangle,
-
-    pub projection: dx::pure::Matrix,
+    // pub viewport: cairo::Rectangle,
+    pub projection: Matrix,
 
     pub fbo_width: f32,
     pub fbo_height: f32,
 
-    pub state: Option<dx::pure::Pipeline>,
-    pub offscreen: Option<dx::pure::Framebuffer>,
-    pub texture: Option<dx::pure::Texture>,
+    pub state: Option<Pipeline>,
+    pub offscreen: Option<Framebuffer>,
+    pub texture: Option<Texture>,
 
     pub opacity: u8,
 }
@@ -61,29 +64,29 @@ pub struct LayerNode {
 pub struct RootNode {
     pub parent_instance: PaintNode,
 
-    pub framebuffer: Option<dx::pure::Framebuffer>,
+    pub framebuffer: Option<Framebuffer>,
 
-    pub clear_flags: dx::pure::BufferBit,
-    pub clear_color: dx::pure::Color,
+    pub clear_flags: BufferBit,
+    pub clear_color: Color,
 }
 
 pub struct TransformNode {
     pub parent_instance: PaintNode,
 
-    pub modelview: dx::pure::Matrix,
+    pub modelview: Matrix,
 }
 
 struct DummyNode {
     pub parent_instance: PaintNode,
 
     pub actor: Option<Actor>,
-    pub framebuffer: Option<dx::pure::Framebuffer>,
+    pub framebuffer: Option<Framebuffer>,
 }
 
 pub struct PipelineNode {
     pub parent_instance: PaintNode,
 
-    pub pipeline: Option<dx::pure::Pipeline>,
+    pub pipeline: Option<Pipeline>,
 }
 
 pub struct ColorNode {
@@ -97,8 +100,8 @@ struct TextureNode {
 pub struct TextNode {
     pub parent_instance: PaintNode,
 
-    pub layout: Option<pango::Layout>,
-    pub color: dx::pure::Color,
+    // pub layout: Option<pango::Layout>,
+    pub color: dx::foundation::colorspace::Color,
 }
 
 #[derive(Default)]
@@ -122,7 +125,7 @@ struct PaintNodeProps {
 
 #[derive(Default)]
 pub struct PaintNode {
-    props: RefCell<PaintNodeProps>
+    props: RefCell<PaintNodeProps>,
 }
 
 impl Object for PaintNode {}
@@ -179,7 +182,7 @@ pub trait PaintNodeExt: 'static {
 impl<O: Is<PaintNode>> PaintNodeExt for O {
     fn add_child<P: Is<PaintNode>>(&self, child: &P) {
         // unsafe {
-        //     ffi::clutter_paint_node_add_child(
+        //     ffi::paint_node_add_child(
         //         self.as_ref().to_glib_none().0,
         //         child.as_ref().to_glib_none().0,
         //     );
@@ -189,7 +192,7 @@ impl<O: Is<PaintNode>> PaintNodeExt for O {
 
     fn add_rectangle(&self, rect: &ActorBox) {
         // unsafe {
-        //     ffi::clutter_paint_node_add_rectangle(
+        //     ffi::paint_node_add_rectangle(
         //         self.as_ref().to_glib_none().0,
         //         rect.to_glib_none().0,
         //     );
@@ -206,7 +209,7 @@ impl<O: Is<PaintNode>> PaintNodeExt for O {
         let operation = PAINT_OP_INIT;
 
         // unsafe {
-        //     ffi::clutter_paint_node_add_texture_rectangle(
+        //     ffi::paint_node_add_texture_rectangle(
         //         self.as_ref().to_glib_none().0,
         //         rect.to_glib_none().0,
         //         x1,
diff --git a/src/pure/paint_volume.rs b/src/pure/paint_volume.rs
index 630aca8..81c15cd 100644
--- a/src/pure/paint_volume.rs
+++ b/src/pure/paint_volume.rs
@@ -1,7 +1,7 @@
 use crate::prelude::*;
 use super::{Actor, ActorBox, Vertex};
 
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
+#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
 pub struct PaintVolume{
 }
 
@@ -33,7 +33,7 @@ impl PaintVolume {
     ///
     /// the depth, in units of `self`'s local coordinate system.
     pub fn get_depth(&self) -> f32 {
-        // unsafe { ffi::clutter_paint_volume_get_depth(self.to_glib_none().0) }
+        // unsafe { ffi::paint_volume_get_depth(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -64,7 +64,7 @@ impl PaintVolume {
     ///
     /// the height, in units of `self`'s local coordinate system.
     pub fn get_height(&self) -> f32 {
-        // unsafe { ffi::clutter_paint_volume_get_height(self.to_glib_none().0) }
+        // unsafe { ffi::paint_volume_get_height(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -74,7 +74,7 @@ impl PaintVolume {
     pub fn get_origin(&self) -> Vertex {
         // unsafe {
         //     let mut vertex = Vertex::uninitialized();
-        //     ffi::clutter_paint_volume_get_origin(
+        //     ffi::paint_volume_get_origin(
         //         self.to_glib_none().0,
         //         vertex.to_glib_none_mut().0,
         //     );
@@ -110,7 +110,7 @@ impl PaintVolume {
     ///
     /// the width, in units of `self`'s local coordinate system.
     pub fn get_width(&self) -> f32 {
-        // unsafe { ffi::clutter_paint_volume_get_width(self.to_glib_none().0) }
+        // unsafe { ffi::paint_volume_get_width(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -120,7 +120,7 @@ impl PaintVolume {
     /// the depth of the paint volume, in pixels
     pub fn set_depth(&mut self, depth: f32) {
         // unsafe {
-        //     ffi::clutter_paint_volume_set_depth(self.to_glib_none_mut().0, depth);
+        //     ffi::paint_volume_set_depth(self.to_glib_none_mut().0, depth);
         // }
         unimplemented!()
     }
@@ -151,7 +151,7 @@ impl PaintVolume {
     ///  otherwise
     pub fn set_from_allocation<P: Is<Actor>>(&mut self, actor: &P) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_paint_volume_set_from_allocation(
+        //     from_glib(ffi::paint_volume_set_from_allocation(
         //         self.to_glib_none_mut().0,
         //         actor.as_ref().to_glib_none().0,
         //     ))
@@ -165,7 +165,7 @@ impl PaintVolume {
     /// the height of the paint volume, in pixels
     pub fn set_height(&mut self, height: f32) {
         // unsafe {
-        //     ffi::clutter_paint_volume_set_height(self.to_glib_none_mut().0, height);
+        //     ffi::paint_volume_set_height(self.to_glib_none_mut().0, height);
         // }
         unimplemented!()
     }
@@ -180,7 +180,7 @@ impl PaintVolume {
     /// a `Vertex`
     pub fn set_origin(&mut self, origin: &Vertex) {
         // unsafe {
-        //     ffi::clutter_paint_volume_set_origin(
+        //     ffi::paint_volume_set_origin(
         //         self.to_glib_none_mut().0,
         //         origin.to_glib_none().0,
         //     );
@@ -194,7 +194,7 @@ impl PaintVolume {
     /// the width of the paint volume, in pixels
     pub fn set_width(&mut self, width: f32) {
         // unsafe {
-        //     ffi::clutter_paint_volume_set_width(self.to_glib_none_mut().0, width);
+        //     ffi::paint_volume_set_width(self.to_glib_none_mut().0, width);
         // }
         unimplemented!()
     }
@@ -207,7 +207,7 @@ impl PaintVolume {
     /// A second `PaintVolume` to union with `self`
     pub fn union(&mut self, another_pv: &PaintVolume) {
         // unsafe {
-        //     ffi::clutter_paint_volume_union(self.to_glib_none_mut().0, another_pv.to_glib_none().0);
+        //     ffi::paint_volume_union(self.to_glib_none_mut().0, another_pv.to_glib_none().0);
         // }
         unimplemented!()
     }
@@ -220,7 +220,7 @@ impl PaintVolume {
     /// a `ActorBox` to union to `self`
     pub fn union_box(&mut self, box_: &ActorBox) {
         // unsafe {
-        //     ffi::clutter_paint_volume_union_box(self.to_glib_none_mut().0, box_.to_glib_none().0);
+        //     ffi::paint_volume_union_box(self.to_glib_none_mut().0, box_.to_glib_none().0);
         // }
         unimplemented!()
     }
diff --git a/src/pure/pan_action.rs b/src/pure/pan_action.rs
index 5ff76d4..add6b8a 100644
--- a/src/pure/pan_action.rs
+++ b/src/pure/pan_action.rs
@@ -29,24 +29,23 @@ impl Default for PinState {
     }
 }
 
-// * SECTION:clutter-pan-action
-// * @Title: ClutterPanAction
-// * @Short_Description: Action for pan gestures
-// *
-// * #ClutterPanAction is a sub-class of #ClutterGestureAction that implements
-// * the logic for recognizing pan gestures.
-// *
-// * The simplest usage of #ClutterPanAction consists in adding it to
-// * a #ClutterActor with a child and setting it as reactive; for instance,
-// * the following code:
-// *
-// * |[
-// *   clutter_actor_add_action (actor, clutter_pan_action_new ());
-// *   clutter_actor_set_reactive (actor, TRUE);
-// * ]|
-// *
-// * will automatically result in the actor children to be moved
-// * when dragging.
+// @Title: PanAction
+// @Short_Description: Action for pan gestures
+//
+// #PanAction is a sub-class of #GestureAction that implements
+// the logic for recognizing pan gestures.
+//
+// The simplest usage of #PanAction consists in adding it to
+// a #Actor with a child and setting it as reactive; for instance,
+// the following code:
+//
+// ```
+//   actor_add_action (actor, pan_action_new ());
+//   actor_set_reactive (actor, TRUE);
+// ```
+//
+// will automatically result in the actor children to be moved
+// when dragging.
 // @extends GestureAction, Action, ActorMeta
 #[derive(Default, Debug, Clone)]
 pub struct PanAction {
@@ -230,7 +229,7 @@ pub trait PanActionExt: 'static {
 
 impl<O: Is<PanAction>> PanActionExt for O {
     fn get_acceleration_factor(&self) -> f64 {
-        // unsafe { ffi::clutter_pan_action_get_acceleration_factor(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::pan_action_get_acceleration_factor(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
@@ -238,7 +237,7 @@ impl<O: Is<PanAction>> PanActionExt for O {
         // unsafe {
         //     let mut delta_x = mem::MaybeUninit::uninit();
         //     let mut delta_y = mem::MaybeUninit::uninit();
-        //     let ret = ffi::clutter_pan_action_get_constrained_motion_delta(
+        //     let ret = ffi::pan_action_get_constrained_motion_delta(
         //         self.as_ref().to_glib_none().0,
         //         point,
         //         delta_x.as_mut_ptr(),
@@ -252,13 +251,13 @@ impl<O: Is<PanAction>> PanActionExt for O {
     }
 
     fn get_deceleration(&self) -> f64 {
-        // unsafe { ffi::clutter_pan_action_get_deceleration(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::pan_action_get_deceleration(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_interpolate(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_pan_action_get_interpolate(
+        //     from_glib(ffi::pan_action_get_interpolate(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -269,7 +268,7 @@ impl<O: Is<PanAction>> PanActionExt for O {
         // unsafe {
         //     let mut interpolated_x = mem::MaybeUninit::uninit();
         //     let mut interpolated_y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_pan_action_get_interpolated_coords(
+        //     ffi::pan_action_get_interpolated_coords(
         //         self.as_ref().to_glib_none().0,
         //         interpolated_x.as_mut_ptr(),
         //         interpolated_y.as_mut_ptr(),
@@ -285,7 +284,7 @@ impl<O: Is<PanAction>> PanActionExt for O {
         // unsafe {
         //     let mut delta_x = mem::MaybeUninit::uninit();
         //     let mut delta_y = mem::MaybeUninit::uninit();
-        //     let ret = ffi::clutter_pan_action_get_interpolated_delta(
+        //     let ret = ffi::pan_action_get_interpolated_delta(
         //         self.as_ref().to_glib_none().0,
         //         delta_x.as_mut_ptr(),
         //         delta_y.as_mut_ptr(),
@@ -299,7 +298,7 @@ impl<O: Is<PanAction>> PanActionExt for O {
 
     fn get_pan_axis(&self) -> PanAxis {
         // unsafe {
-        //     from_glib(ffi::clutter_pan_action_get_pan_axis(
+        //     from_glib(ffi::pan_action_get_pan_axis(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -308,21 +307,21 @@ impl<O: Is<PanAction>> PanActionExt for O {
 
     fn set_acceleration_factor(&self, factor: f64) {
         // unsafe {
-        //     ffi::clutter_pan_action_set_acceleration_factor(self.as_ref().to_glib_none().0, factor);
+        //     ffi::pan_action_set_acceleration_factor(self.as_ref().to_glib_none().0, factor);
         // }
         unimplemented!()
     }
 
     fn set_deceleration(&self, rate: f64) {
         // unsafe {
-        //     ffi::clutter_pan_action_set_deceleration(self.as_ref().to_glib_none().0, rate);
+        //     ffi::pan_action_set_deceleration(self.as_ref().to_glib_none().0, rate);
         // }
         unimplemented!()
     }
 
     fn set_interpolate(&self, should_interpolate: bool) {
         // unsafe {
-        //     ffi::clutter_pan_action_set_interpolate(
+        //     ffi::pan_action_set_interpolate(
         //         self.as_ref().to_glib_none().0,
         //         should_interpolate.to_glib(),
         //     );
@@ -332,7 +331,7 @@ impl<O: Is<PanAction>> PanActionExt for O {
 
     fn set_pan_axis(&self, axis: PanAxis) {
         // unsafe {
-        //     ffi::clutter_pan_action_set_pan_axis(self.as_ref().to_glib_none().0, axis.to_glib());
+        //     ffi::pan_action_set_pan_axis(self.as_ref().to_glib_none().0, axis.to_glib());
         // }
         unimplemented!()
     }
diff --git a/src/pure/param_spec_color.rs b/src/pure/param_spec_color.rs
index 7e46fe4..e232cf6 100644
--- a/src/pure/param_spec_color.rs
+++ b/src/pure/param_spec_color.rs
@@ -5,7 +5,7 @@
 //     pub struct ParamSpecColor(Object<ffi::ParamSpecColor, ParamSpecColorClass>) @extends gobject::ParamSpec;
 
 //     match fn {
-//         get_type => || ffi::clutter_param_color_get_type(),
+//         get_type => || ffi::param_color_get_type(),
 //     }
 // }
 
diff --git a/src/pure/param_spec_unit.rs b/src/pure/param_spec_unit.rs
index 315d6ff..6b5a3af 100644
--- a/src/pure/param_spec_unit.rs
+++ b/src/pure/param_spec_unit.rs
@@ -4,7 +4,7 @@
 //     pub struct ParamSpecUnit(Object<ffi::ParamSpecUnit, ParamSpecUnitClass>) @extends glib::ParamSpec;
 
 //     match fn {
-//         get_type => || ffi::clutter_param_units_get_type(),
+//         get_type => || ffi::param_units_get_type(),
 //     }
 // }
 
diff --git a/src/pure/path.rs b/src/pure/path.rs
index e9b0f9c..0d2d827 100644
--- a/src/pure/path.rs
+++ b/src/pure/path.rs
@@ -15,13 +15,13 @@ impl Path {
     ///
     /// the newly created `Path`
     pub fn new() -> Path {
-        // unsafe { from_glib_none(ffi::clutter_path_new()) }
+        // unsafe { from_glib_none(ffi::path_new()) }
         unimplemented!()
     }
 
     pub fn with_description(desc: &str) -> Path {
         // unsafe {
-        //     from_glib_none(ffi::clutter_path_new_with_description(
+        //     from_glib_none(ffi::path_new_with_description(
         //         desc.to_glib_none().0,
         //     ))
         // }
@@ -268,7 +268,7 @@ pub trait PathExt: 'static {
 impl<O: Is<Path>> PathExt for O {
     // fn add_cairo_path(&self, cpath: &cairo::Path) {
     //     unsafe {
-    //         ffi::clutter_path_add_cairo_path(
+    //         ffi::path_add_cairo_path(
     //             self.as_ref().to_glib_none().0,
     //             cpath.to_glib_none().0,
     //         );
@@ -277,14 +277,14 @@ impl<O: Is<Path>> PathExt for O {
 
     fn add_close(&self) {
         // unsafe {
-        //     ffi::clutter_path_add_close(self.as_ref().to_glib_none().0);
+        //     ffi::path_add_close(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn add_curve_to(&self, x1: i32, y1: i32, x2: i32, y2: i32, x_3: i32, y_3: i32) {
         // unsafe {
-        //     ffi::clutter_path_add_curve_to(
+        //     ffi::path_add_curve_to(
         //         self.as_ref().to_glib_none().0,
         //         x1,
         //         y1,
@@ -299,28 +299,28 @@ impl<O: Is<Path>> PathExt for O {
 
     fn add_line_to(&self, x: i32, y: i32) {
         // unsafe {
-        //     ffi::clutter_path_add_line_to(self.as_ref().to_glib_none().0, x, y);
+        //     ffi::path_add_line_to(self.as_ref().to_glib_none().0, x, y);
         // }
         unimplemented!()
     }
 
     fn add_move_to(&self, x: i32, y: i32) {
         // unsafe {
-        //     ffi::clutter_path_add_move_to(self.as_ref().to_glib_none().0, x, y);
+        //     ffi::path_add_move_to(self.as_ref().to_glib_none().0, x, y);
         // }
         unimplemented!()
     }
 
     fn add_node(&self, node: &PathNode) {
         // unsafe {
-        //     ffi::clutter_path_add_node(self.as_ref().to_glib_none().0, node.to_glib_none().0);
+        //     ffi::path_add_node(self.as_ref().to_glib_none().0, node.to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn add_rel_curve_to(&self, x1: i32, y1: i32, x2: i32, y2: i32, x_3: i32, y_3: i32) {
         // unsafe {
-        //     ffi::clutter_path_add_rel_curve_to(
+        //     ffi::path_add_rel_curve_to(
         //         self.as_ref().to_glib_none().0,
         //         x1,
         //         y1,
@@ -335,20 +335,20 @@ impl<O: Is<Path>> PathExt for O {
 
     fn add_rel_line_to(&self, x: i32, y: i32) {
         // unsafe {
-        //     ffi::clutter_path_add_rel_line_to(self.as_ref().to_glib_none().0, x, y);
+        //     ffi::path_add_rel_line_to(self.as_ref().to_glib_none().0, x, y);
         // }
         unimplemented!()
     }
 
     fn add_rel_move_to(&self, x: i32, y: i32) {
         // unsafe {
-        //     ffi::clutter_path_add_rel_move_to(self.as_ref().to_glib_none().0, x, y);
+        //     ffi::path_add_rel_move_to(self.as_ref().to_glib_none().0, x, y);
         // }
     }
 
     fn add_string(&self, str: &str) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_path_add_string(
+        //     from_glib(ffi::path_add_string(
         //         self.as_ref().to_glib_none().0,
         //         str.to_glib_none().0,
         //     ))
@@ -358,7 +358,7 @@ impl<O: Is<Path>> PathExt for O {
 
     fn clear(&self) {
         // unsafe {
-        //     ffi::clutter_path_clear(self.as_ref().to_glib_none().0);
+        //     ffi::path_clear(self.as_ref().to_glib_none().0);
         // }
     }
 
@@ -375,7 +375,7 @@ impl<O: Is<Path>> PathExt for O {
         // let callback = Some(callback_func::<P> as _);
         // let super_callback0: &P = &callback_data;
         // unsafe {
-        //     ffi::clutter_path_foreach(
+        //     ffi::path_foreach(
         //         self.as_ref().to_glib_none().0,
         //         callback,
         //         super_callback0 as *const _ as usize as *mut _,
@@ -386,7 +386,7 @@ impl<O: Is<Path>> PathExt for O {
 
     fn get_description(&self) -> Option<String> {
         // unsafe {
-        //     from_glib_full(ffi::clutter_path_get_description(
+        //     from_glib_full(ffi::path_get_description(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -394,19 +394,19 @@ impl<O: Is<Path>> PathExt for O {
     }
 
     fn get_length(&self) -> u32 {
-        // unsafe { ffi::clutter_path_get_length(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::path_get_length(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_n_nodes(&self) -> u32 {
-        // unsafe { ffi::clutter_path_get_n_nodes(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::path_get_n_nodes(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_node(&self, index_: u32) -> PathNode {
         // unsafe {
         //     let mut node = PathNode::uninitialized();
-        //     ffi::clutter_path_get_node(
+        //     ffi::path_get_node(
         //         self.as_ref().to_glib_none().0,
         //         index_,
         //         node.to_glib_none_mut().0,
@@ -418,7 +418,7 @@ impl<O: Is<Path>> PathExt for O {
 
     fn get_nodes(&self) -> Vec<PathNode> {
         // unsafe {
-        //     FromGlibPtrContainer::from_glib_container(ffi::clutter_path_get_nodes(
+        //     FromGlibPtrContainer::from_glib_container(ffi::path_get_nodes(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -428,7 +428,7 @@ impl<O: Is<Path>> PathExt for O {
     fn get_position(&self, progress: f64) -> (u32, Knot) {
         // unsafe {
         //     let mut position = Knot::uninitialized();
-        //     let ret = ffi::clutter_path_get_position(
+        //     let ret = ffi::path_get_position(
         //         self.as_ref().to_glib_none().0,
         //         progress,
         //         position.to_glib_none_mut().0,
@@ -440,7 +440,7 @@ impl<O: Is<Path>> PathExt for O {
 
     fn insert_node(&self, index_: i32, node: &PathNode) {
         // unsafe {
-        //     ffi::clutter_path_insert_node(
+        //     ffi::path_insert_node(
         //         self.as_ref().to_glib_none().0,
         //         index_,
         //         node.to_glib_none().0,
@@ -451,14 +451,14 @@ impl<O: Is<Path>> PathExt for O {
 
     fn remove_node(&self, index_: u32) {
         // unsafe {
-        //     ffi::clutter_path_remove_node(self.as_ref().to_glib_none().0, index_);
+        //     ffi::path_remove_node(self.as_ref().to_glib_none().0, index_);
         // }
         unimplemented!()
     }
 
     fn replace_node(&self, index_: u32, node: &PathNode) {
         // unsafe {
-        //     ffi::clutter_path_replace_node(
+        //     ffi::path_replace_node(
         //         self.as_ref().to_glib_none().0,
         //         index_,
         //         node.to_glib_none().0,
@@ -469,7 +469,7 @@ impl<O: Is<Path>> PathExt for O {
 
     fn set_description(&self, str: &str) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_path_set_description(
+        //     from_glib(ffi::path_set_description(
         //         self.as_ref().to_glib_none().0,
         //         str.to_glib_none().0,
         //     ))
@@ -479,7 +479,7 @@ impl<O: Is<Path>> PathExt for O {
 
     // fn to_cairo_path(&self, cr: &mut cairo::Context) {
     //     unsafe {
-    //         ffi::clutter_path_to_cairo_path(
+    //         ffi::path_to_cairo_path(
     //             self.as_ref().to_glib_none().0,
     //             cr.to_glib_none_mut().0,
     //         );
diff --git a/src/pure/path_constraint.rs b/src/pure/path_constraint.rs
index e3236fc..ab47141 100644
--- a/src/pure/path_constraint.rs
+++ b/src/pure/path_constraint.rs
@@ -18,7 +18,7 @@ impl PathConstraint {
     /// the newly created `PathConstraint`
     pub fn new<P: Is<Path>>(path: Option<&P>, offset: f32) -> PathConstraint {
         // unsafe {
-        //     Constraint::from_glib_none(ffi::clutter_path_constraint_new(
+        //     Constraint::from_glib_none(ffi::path_constraint_new(
         //         path.map(|p| p.as_ref()).to_glib_none().0,
         //         offset,
         //     ))
@@ -33,7 +33,7 @@ impl PathConstraint {
     ///
     /// the offset
     pub fn get_offset(&self) -> f32 {
-        // unsafe { ffi::clutter_path_constraint_get_offset(self.to_glib_none().0) }
+        // unsafe { ffi::path_constraint_get_offset(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -45,7 +45,7 @@ impl PathConstraint {
     ///  `PathConstraint`, or `None`. The returned `Path` is owned
     ///  by the constraint and it should not be unreferenced
     pub fn get_path(&self) -> Option<Path> {
-        // unsafe { from_glib_none(ffi::clutter_path_constraint_get_path(self.to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::path_constraint_get_path(self.to_glib_none().0)) }
         unimplemented!()
     }
 
@@ -54,7 +54,7 @@ impl PathConstraint {
     /// the offset along the path
     pub fn set_offset(&self, offset: f32) {
         // unsafe {
-        //     ffi::clutter_path_constraint_set_offset(self.to_glib_none().0, offset);
+        //     ffi::path_constraint_set_offset(self.to_glib_none().0, offset);
         // }
         unimplemented!()
     }
@@ -67,7 +67,7 @@ impl PathConstraint {
     /// a `Path`
     pub fn set_path<P: Is<Path>>(&self, path: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_path_constraint_set_path(
+        //     ffi::path_constraint_set_path(
         //         self.to_glib_none().0,
         //         path.map(|p| p.as_ref()).to_glib_none().0,
         //     );
diff --git a/src/pure/path_node.rs b/src/pure/path_node.rs
index a0c75f1..14b3c47 100644
--- a/src/pure/path_node.rs
+++ b/src/pure/path_node.rs
@@ -1,14 +1,14 @@
 use super::{Knot, PathNodeType};
-// * ClutterPathNode:
-// * @type: the node's type
-// * @points: the coordinates of the node
-// *
-// * Represents a single node of a #ClutterPath.
-// *
-// * Some of the coordinates in @points may be unused for some node
-// * types. %CLUTTER_PATH_MOVE_TO and %CLUTTER_PATH_LINE_TO use only one
-// * pair of coordinates, %CLUTTER_PATH_CURVE_TO uses all three and
-// * %CLUTTER_PATH_CLOSE uses none.
+// PathNode:
+// @type: the node's type
+// @points: the coordinates of the node
+//
+// Represents a single node of a #Path.
+//
+// Some of the coordinates in @points may be unused for some node
+// types. %PATH_MOVE_TO and %PATH_LINE_TO use only one
+// pair of coordinates, %PATH_CURVE_TO uses all three and
+// %PATH_CLOSE uses none.
 #[derive(Debug, PartialOrd)] // Hash
 pub struct PathNode {
     kind: PathNodeType,
@@ -26,7 +26,7 @@ impl PathNode {
     /// `true` if the nodes are the same.
     fn equal(&self, node_b: &PathNode) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_path_node_equal(
+        //     from_glib(ffi::path_node_equal(
         //         self.to_glib_none().0,
         //         node_b.to_glib_none().0,
         //     ))
diff --git a/src/pure/perspective.rs b/src/pure/perspective.rs
index e2514a2..9d20849 100644
--- a/src/pure/perspective.rs
+++ b/src/pure/perspective.rs
@@ -1,15 +1,15 @@
-// * Perspective:
-// * @fovy: the field of view angle, in degrees, in the y direction
-// * @aspect: the aspect ratio that determines the field of view in the x
-// *   direction. The aspect ratio is the ratio of x (width) to y (height)
-// * @z_near: the distance from the viewer to the near clipping
-// *   plane (always positive)
-// * @z_far: the distance from the viewer to the far clipping
-// *   plane (always positive)
-// *
-// * Stage perspective definition. #Perspective is only used by
-// * the fixed point version of clutter_stage_set_perspective().
-// *
+// Perspective:
+// @fovy: the field of view angle, in degrees, in the y direction
+// @aspect: the aspect ratio that determines the field of view in the x
+//   direction. The aspect ratio is the ratio of x (width) to y (height)
+// @z_near: the distance from the viewer to the near clipping
+//   plane (always positive)
+// @z_far: the distance from the viewer to the far clipping
+//   plane (always positive)
+//
+// Stage perspective definition. #Perspective is only used by
+// the fixed point version of stage_set_perspective().
+//
 #[derive(Default, Debug, Clone)]
 pub struct Perspective {
     fovy: f32,
@@ -18,18 +18,18 @@ pub struct Perspective {
     z_far: f32,
 }
 
-// * Fog:
-// * @z_near: starting distance from the viewer to the near clipping
-// *   plane (always positive)
-// * @z_far: final distance from the viewer to the far clipping
-// *   plane (always positive)
-// *
-// * Fog settings used to create the depth cueing effect.
-// *
-// * Since: 0.6
-// *
-// * Deprecated: 1.10: The fog-related API in #Stage has been
-// *   deprecated as well.
+// Fog:
+// @z_near: starting distance from the viewer to the near clipping
+//   plane (always positive)
+// @z_far: final distance from the viewer to the far clipping
+//   plane (always positive)
+//
+// Fog settings used to create the depth cueing effect.
+//
+// Since: 0.6
+//
+// Deprecated: 1.10: The fog-related API in #Stage has been
+//   deprecated as well.
 #[derive(Default, Debug, Clone)]
 pub struct Fog {
     z_near: f32,
diff --git a/src/pure/platform/canvas/mod.rs b/src/pure/platform/canvas/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/cogl/mod.rs b/src/pure/platform/cogl/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/egl/mod.rs b/src/pure/platform/egl/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/evdev/mod.rs b/src/pure/platform/evdev/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/gdk/mod.rs b/src/pure/platform/gdk/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/mod.rs b/src/pure/platform/mod.rs
deleted file mode 100644
index 565075c..0000000
--- a/src/pure/platform/mod.rs
+++ /dev/null
@@ -1,65 +0,0 @@
-#![allow(unused_imports)]
-
-#[cfg(target_arch = "wasm32")]
-mod canvas;
-#[cfg(target_arch = "wasm32")]
-pub(crate) use self::canvas::*;
-
-mod cogl;
-pub(crate) use self::cogl::*;
-
-// Android, Wayland, Mesa, SDL, NVIDIA, Tizen, Blackberry
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod egl;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::egl::*;
-
-// Handler library for evdev events
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod evdev;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::evdev::*;
-
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod gdk;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::gdk::*;
-
-#[cfg(all(not(target_arch = "wasm32"), target_os = "macos"))]
-mod osx;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "macos"))]
-pub(crate) use self::osx::*;
-
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod sdl;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::sdl::*;
-
-// Touchscreen Access Library
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod tslib;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::tslib::*;
-
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod vulkan;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::vulkan::*;
-
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod wayland;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::wayland::*;
-
-#[cfg(all(not(target_arch = "wasm32"), target_os = "windows"))]
-mod win;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "windows"))]
-pub(crate) use self::win::*;
-
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-mod x11;
-#[cfg(all(not(target_arch = "wasm32"), target_os = "linux"))]
-pub(crate) use self::x11::*;
-
-mod stage_window;
-pub(crate) use self::stage_window::*;
\ No newline at end of file
diff --git a/src/pure/platform/osx/mod.rs b/src/pure/platform/osx/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/sdl/mod.rs b/src/pure/platform/sdl/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/stage_window.rs b/src/pure/platform/stage_window.rs
deleted file mode 100644
index ddb4f5d..0000000
--- a/src/pure/platform/stage_window.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-#[derive(Debug, Clone)]
-pub struct StageWindow {
-
-}
\ No newline at end of file
diff --git a/src/pure/platform/tslib/mod.rs b/src/pure/platform/tslib/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/vulkan/mod.rs b/src/pure/platform/vulkan/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/wayland/mod.rs b/src/pure/platform/wayland/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/win/mod.rs b/src/pure/platform/win/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/platform/x11/mod.rs b/src/pure/platform/x11/mod.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pure/property_transition.rs b/src/pure/property_transition.rs
index f165a04..3aaba64 100644
--- a/src/pure/property_transition.rs
+++ b/src/pure/property_transition.rs
@@ -18,7 +18,7 @@ impl PropertyTransition {
     ///  Use `gobject::ObjectExt::unref` when done
     pub fn new(property_name: Option<&str>) -> PropertyTransition {
         // unsafe {
-        //     Transition::from_glib_full(ffi::clutter_property_transition_new(
+        //     Transition::from_glib_full(ffi::property_transition_new(
         //         property_name.to_glib_none().0,
         //     ))
         //     .unsafe_cast()
@@ -63,7 +63,7 @@ pub trait PropertyTransitionExt: 'static {
 impl<O: Is<PropertyTransition>> PropertyTransitionExt for O {
     fn get_property_name(&self) -> Option<String> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_property_transition_get_property_name(
+        //     from_glib_none(ffi::property_transition_get_property_name(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -72,7 +72,7 @@ impl<O: Is<PropertyTransition>> PropertyTransitionExt for O {
 
     fn set_property_name(&self, property_name: Option<&str>) {
         // unsafe {
-        //     ffi::clutter_property_transition_set_property_name(
+        //     ffi::property_transition_set_property_name(
         //         self.as_ref().to_glib_none().0,
         //         property_name.to_glib_none().0,
         //     );
diff --git a/src/pure/rectangle.rs b/src/pure/rectangle.rs
index f9041d0..a333914 100644
--- a/src/pure/rectangle.rs
+++ b/src/pure/rectangle.rs
@@ -1,8 +1,11 @@
-use super::HandlerId;
-use crate::prelude::*;
-use crate::Color;
 use std::fmt;
 
+use crate::prelude::*;
+
+use crate::foundation::colorspace::Color;
+
+use super::HandlerId;
+
 // TODO: implements atk::ImplementorIface, Scriptable
 // @extends Actor,
 #[derive(Debug, Clone)]
diff --git a/src/pure/rotate_action.rs b/src/pure/rotate_action.rs
index e97f360..d5c9348 100644
--- a/src/pure/rotate_action.rs
+++ b/src/pure/rotate_action.rs
@@ -13,7 +13,7 @@ impl RotateAction {
     ///
     /// the newly created `RotateAction`
     pub fn new() -> RotateAction {
-        // unsafe { Action::from_glib_none(ffi::clutter_rotate_action_new()).unsafe_cast() }
+        // unsafe { Action::from_glib_none(ffi::rotate_action_new()).unsafe_cast() }
         unimplemented!()
     }
 }
diff --git a/src/pure/script.rs b/src/pure/script.rs
index bb12665..34eb694 100644
--- a/src/pure/script.rs
+++ b/src/pure/script.rs
@@ -1,5 +1,4 @@
 // use super::HandlerId;
-// use std::boxed::Box as Box_;
 // use std::{fmt, mem::transmute, ptr};
 
 // #[derive(Default)]
@@ -18,7 +17,7 @@
 //     /// the newly created `Script` instance. Use
 //     ///  `gobject::ObjectExt::unref` when done.
 //     pub fn new() -> Script {
-//         unsafe { from_glib_full(ffi::clutter_script_new()) }
+//         unsafe { from_glib_full(ffi::script_new()) }
 //     }
 // }
 
@@ -181,7 +180,7 @@
 //     fn add_search_paths(&self, paths: &[&str]) {
 //         let n_paths = paths.len() as usize;
 //         unsafe {
-//             ffi::clutter_script_add_search_paths(
+//             ffi::script_add_search_paths(
 //                 self.as_ref().to_glib_none().0,
 //                 paths.to_glib_none().0,
 //                 n_paths,
@@ -190,22 +189,22 @@
 //     }
 
 //     //fn connect_signals(&self, user_data: /*Unimplemented*/Option<Fundamental: Pointer>) {
-//     //    unsafe { TODO: call clutter_sys:clutter_script_connect_signals() }
+//     //    unsafe { TODO: call sys:script_connect_signals() }
 //     //}
 
 //     //fn connect_signals_full(&self, func: /*Unimplemented*/FnMut(&Script, &glib::Object, &str, &str, &glib::Object, /*Ignored*/glib::ConnectFlags), user_data: /*Unimplemented*/Option<Fundamental: Pointer>) {
-//     //    unsafe { TODO: call clutter_sys:clutter_script_connect_signals_full() }
+//     //    unsafe { TODO: call sys:script_connect_signals_full() }
 //     //}
 
 //     fn ensure_objects(&self) {
 //         unsafe {
-//             ffi::clutter_script_ensure_objects(self.as_ref().to_glib_none().0);
+//             ffi::script_ensure_objects(self.as_ref().to_glib_none().0);
 //         }
 //     }
 
 //     fn get_object(&self, name: &str) -> Option<glib::Object> {
 //         unsafe {
-//             from_glib_none(ffi::clutter_script_get_object(
+//             from_glib_none(ffi::script_get_object(
 //                 self.as_ref().to_glib_none().0,
 //                 name.to_glib_none().0,
 //             ))
@@ -213,12 +212,12 @@
 //     }
 
 //     //fn get_objects(&self, first_name: &str, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) -> i32 {
-//     //    unsafe { TODO: call clutter_sys:clutter_script_get_objects() }
+//     //    unsafe { TODO: call sys:script_get_objects() }
 //     //}
 
 //     fn get_translation_domain(&self) -> Option<GString> {
 //         unsafe {
-//             from_glib_none(ffi::clutter_script_get_translation_domain(
+//             from_glib_none(ffi::script_get_translation_domain(
 //                 self.as_ref().to_glib_none().0,
 //             ))
 //         }
@@ -226,7 +225,7 @@
 
 //     fn get_type_from_name(&self, type_name: &str) -> glib::types::Type {
 //         unsafe {
-//             from_glib(ffi::clutter_script_get_type_from_name(
+//             from_glib(ffi::script_get_type_from_name(
 //                 self.as_ref().to_glib_none().0,
 //                 type_name.to_glib_none().0,
 //             ))
@@ -235,7 +234,7 @@
 
 //     fn list_objects(&self) -> Vec<glib::Object> {
 //         unsafe {
-//             FromGlibPtrContainer::from_glib_container(ffi::clutter_script_list_objects(
+//             FromGlibPtrContainer::from_glib_container(ffi::script_list_objects(
 //                 self.as_ref().to_glib_none().0,
 //             ))
 //         }
@@ -245,7 +244,7 @@
 //         let length = data.len() as isize;
 //         unsafe {
 //             let mut error = ptr::null_mut();
-//             let _ = ffi::clutter_script_load_from_data(
+//             let _ = ffi::script_load_from_data(
 //                 self.as_ref().to_glib_none().0,
 //                 data.to_glib_none().0,
 //                 length,
@@ -262,7 +261,7 @@
 //     fn load_from_file(&self, filename: &str) -> Result<(), glib::Error> {
 //         unsafe {
 //             let mut error = ptr::null_mut();
-//             let _ = ffi::clutter_script_load_from_file(
+//             let _ = ffi::script_load_from_file(
 //                 self.as_ref().to_glib_none().0,
 //                 filename.to_glib_none().0,
 //                 &mut error,
@@ -278,7 +277,7 @@
 //     fn load_from_resource(&self, resource_path: &str) -> Result<(), glib::Error> {
 //         unsafe {
 //             let mut error = ptr::null_mut();
-//             let _ = ffi::clutter_script_load_from_resource(
+//             let _ = ffi::script_load_from_resource(
 //                 self.as_ref().to_glib_none().0,
 //                 resource_path.to_glib_none().0,
 //                 &mut error,
@@ -293,7 +292,7 @@
 
 //     fn lookup_filename(&self, filename: &str) -> Option<GString> {
 //         unsafe {
-//             from_glib_full(ffi::clutter_script_lookup_filename(
+//             from_glib_full(ffi::script_lookup_filename(
 //                 self.as_ref().to_glib_none().0,
 //                 filename.to_glib_none().0,
 //             ))
@@ -302,7 +301,7 @@
 
 //     fn set_translation_domain(&self, domain: Option<&str>) {
 //         unsafe {
-//             ffi::clutter_script_set_translation_domain(
+//             ffi::script_set_translation_domain(
 //                 self.as_ref().to_glib_none().0,
 //                 domain.to_glib_none().0,
 //             );
@@ -311,7 +310,7 @@
 
 //     fn unmerge_objects(&self, merge_id: u32) {
 //         unsafe {
-//             ffi::clutter_script_unmerge_objects(self.as_ref().to_glib_none().0, merge_id);
+//             ffi::script_unmerge_objects(self.as_ref().to_glib_none().0, merge_id);
 //         }
 //     }
 
@@ -356,14 +355,14 @@
 //             f(&Script::from_glib_borrow(this).unsafe_cast_ref())
 //         }
 //         unsafe {
-//             let f: Box_<F> = Box_::new(f);
+//             let f: Box<F> = Box::new(f);
 //             connect_raw(
 //                 self.as_ptr() as *mut _,
 //                 b"notify::filename\0".as_ptr() as *const _,
 //                 Some(transmute::<_, unsafe extern "C" fn()>(
 //                     notify_filename_trampoline::<Self, F> as *const (),
 //                 )),
-//                 Box_::into_raw(f),
+//                 Box::into_raw(f),
 //             )
 //         }
 //     }
@@ -383,14 +382,14 @@
 //             f(&Script::from_glib_borrow(this).unsafe_cast_ref())
 //         }
 //         unsafe {
-//             let f: Box_<F> = Box_::new(f);
+//             let f: Box<F> = Box::new(f);
 //             connect_raw(
 //                 self.as_ptr() as *mut _,
 //                 b"notify::filename-set\0".as_ptr() as *const _,
 //                 Some(transmute::<_, unsafe extern "C" fn()>(
 //                     notify_filename_set_trampoline::<Self, F> as *const (),
 //                 )),
-//                 Box_::into_raw(f),
+//                 Box::into_raw(f),
 //             )
 //         }
 //     }
@@ -410,14 +409,14 @@
 //             f(&Script::from_glib_borrow(this).unsafe_cast_ref())
 //         }
 //         unsafe {
-//             let f: Box_<F> = Box_::new(f);
+//             let f: Box<F> = Box::new(f);
 //             connect_raw(
 //                 self.as_ptr() as *mut _,
 //                 b"notify::translation-domain\0".as_ptr() as *const _,
 //                 Some(transmute::<_, unsafe extern "C" fn()>(
 //                     notify_translation_domain_trampoline::<Self, F> as *const (),
 //                 )),
-//                 Box_::into_raw(f),
+//                 Box::into_raw(f),
 //             )
 //         }
 //     }
diff --git a/src/pure/scriptable.rs b/src/pure/scriptable.rs
index 2960b62..9400c1c 100644
--- a/src/pure/scriptable.rs
+++ b/src/pure/scriptable.rs
@@ -5,7 +5,7 @@
 //     pub struct Scriptable(Interface<ffi::Scriptable>);
 
 //     match fn {
-//         get_type => || ffi::clutter_scriptable_get_type(),
+//         get_type => || ffi::scriptable_get_type(),
 //     }
 // }
 
@@ -71,7 +71,7 @@
 // impl<O: Is<Scriptable>> ScriptableExt for O {
 //     // fn get_id(&self) -> Option<GString> {
 //     //     unsafe {
-//     //         from_glib_none(ffi::clutter_scriptable_get_id(
+//     //         from_glib_none(ffi::scriptable_get_id(
 //     //             self.as_ref().to_glib_none().0,
 //     //         ))
 //     //     }
@@ -85,7 +85,7 @@
 //     //     node: &json::Node,
 //     // ) -> bool {
 //     //     unsafe {
-//     //         from_glib(ffi::clutter_scriptable_parse_custom_node(
+//     //         from_glib(ffi::scriptable_parse_custom_node(
 //     //             self.as_ref().to_glib_none().0,
 //     //             script.as_ref().to_glib_none().0,
 //     //             value.to_glib_none_mut().0,
@@ -97,7 +97,7 @@
 
 //     fn set_custom_property<P: Is<Script>>(&self, script: &P, name: &str, value: &glib::Value) {
 //         unsafe {
-//             ffi::clutter_scriptable_set_custom_property(
+//             ffi::scriptable_set_custom_property(
 //                 self.as_ref().to_glib_none().0,
 //                 script.as_ref().to_glib_none().0,
 //                 name.to_glib_none().0,
@@ -108,7 +108,7 @@
 
 //     fn set_id(&self, id_: &str) {
 //         unsafe {
-//             ffi::clutter_scriptable_set_id(self.as_ref().to_glib_none().0, id_.to_glib_none().0);
+//             ffi::scriptable_set_id(self.as_ref().to_glib_none().0, id_.to_glib_none().0);
 //         }
 //     }
 // }
diff --git a/src/pure/scroll_actor.rs b/src/pure/scroll_actor.rs
index a658c2e..959de78 100644
--- a/src/pure/scroll_actor.rs
+++ b/src/pure/scroll_actor.rs
@@ -1,8 +1,11 @@
-use super::{HandlerId, ScrollMode};
-use crate::prelude::*;
-use crate::{Point, Rect};
 use std::fmt;
 
+use crate::prelude::*;
+
+use crate::foundation::{Point, Rect};
+
+use super::{HandlerId, ScrollMode};
+
 // TODO: implements atk::ImplementorIface, Scriptable, @implements Animatable, Container
 // @extends Actor
 #[derive(Default, Debug, Clone)]
@@ -16,7 +19,7 @@ impl ScrollActor {
     /// The newly created `ScrollActor`
     ///  instance.
     pub fn new() -> ScrollActor {
-        // unsafe { Actor::from_glib_none(ffi::clutter_scroll_actor_new()).unsafe_cast() }
+        // unsafe { Actor::from_glib_none(ffi::scroll_actor_new()).unsafe_cast() }
         unimplemented!()
     }
 }
@@ -70,7 +73,7 @@ pub trait ScrollActorExt: 'static {
 impl<O: Is<ScrollActor>> ScrollActorExt for O {
     fn get_scroll_mode(&self) -> ScrollMode {
         // unsafe {
-        //     from_glib(ffi::clutter_scroll_actor_get_scroll_mode(
+        //     from_glib(ffi::scroll_actor_get_scroll_mode(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -79,7 +82,7 @@ impl<O: Is<ScrollActor>> ScrollActorExt for O {
 
     fn scroll_to_point(&self, point: &Point<f32>) {
         // unsafe {
-        //     ffi::clutter_scroll_actor_scroll_to_point(
+        //     ffi::scroll_actor_scroll_to_point(
         //         self.as_ref().to_glib_none().0,
         //         point.to_glib_none().0,
         //     );
@@ -89,7 +92,7 @@ impl<O: Is<ScrollActor>> ScrollActorExt for O {
 
     fn scroll_to_rect(&self, rect: &Rect<f32>) {
         // unsafe {
-        //     ffi::clutter_scroll_actor_scroll_to_rect(
+        //     ffi::scroll_actor_scroll_to_rect(
         //         self.as_ref().to_glib_none().0,
         //         rect.to_glib_none().0,
         //     );
@@ -99,7 +102,7 @@ impl<O: Is<ScrollActor>> ScrollActorExt for O {
 
     fn set_scroll_mode(&self, mode: ScrollMode) {
         // unsafe {
-        //     ffi::clutter_scroll_actor_set_scroll_mode(
+        //     ffi::scroll_actor_set_scroll_mode(
         //         self.as_ref().to_glib_none().0,
         //         mode.to_glib(),
         //     );
diff --git a/src/pure/shader_effect.rs b/src/pure/shader_effect.rs
index 8f4a84c..1c1a7d8 100644
--- a/src/pure/shader_effect.rs
+++ b/src/pure/shader_effect.rs
@@ -1,3 +1,4 @@
+#![allow(unused_imports)]
 use super::ShaderType;
 use crate::prelude::*;
 use std::fmt;
@@ -22,7 +23,7 @@ impl ShaderEffect {
     ///  Use `gobject::ObjectExt::unref` when done.
     pub fn new(shader_type: ShaderType) -> ShaderEffect {
         // unsafe {
-        //     Effect::from_glib_none(ffi::clutter_shader_effect_new(shader_type.to_glib()))
+        //     Effect::from_glib_none(ffi::shader_effect_new(shader_type.to_glib()))
         //         .unsafe_cast()
         // }
         unimplemented!()
@@ -65,35 +66,35 @@ pub trait ShaderEffectExt: 'static {
 
     //fn set_uniform(&self, name: &str, gtype: glib::types::Type, n_values: usize, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets `value` as the payload for the uniform `name` inside the shader
-    /// effect
-    ///
-    /// The `glib::Type` of the `value` must be one of: `G_TYPE_INT`, for a single
-    /// integer value; `G_TYPE_FLOAT`, for a single floating point value;
-    /// `TYPE_SHADER_INT`, for an array of integer values;
-    /// `TYPE_SHADER_FLOAT`, for an array of floating point values;
-    /// and `TYPE_SHADER_MATRIX`, for a matrix of floating point
-    /// values. It also accepts `G_TYPE_DOUBLE` for compatibility with other
-    /// languages than C.
-    /// ## `name`
-    /// the name of the uniform to set
-    /// ## `value`
-    /// a `gobject::Value` with the value of the uniform to set
-    fn set_uniform_value(&self, name: &str, value: &glib::Value);
+    // /// Sets `value` as the payload for the uniform `name` inside the shader
+    // /// effect
+    // ///
+    // /// The `glib::Type` of the `value` must be one of: `G_TYPE_INT`, for a single
+    // /// integer value; `G_TYPE_FLOAT`, for a single floating point value;
+    // /// `TYPE_SHADER_INT`, for an array of integer values;
+    // /// `TYPE_SHADER_FLOAT`, for an array of floating point values;
+    // /// and `TYPE_SHADER_MATRIX`, for a matrix of floating point
+    // /// values. It also accepts `G_TYPE_DOUBLE` for compatibility with other
+    // /// languages than C.
+    // /// ## `name`
+    // /// the name of the uniform to set
+    // /// ## `value`
+    // /// a `gobject::Value` with the value of the uniform to set
+    // fn set_uniform_value(&self, name: &str, value: &glib::Value);
 }
 
 impl<O: Is<ShaderEffect>> ShaderEffectExt for O {
     //fn get_program(&self) -> /*Unimplemented*/Option<dx::pure::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_get_program() }
+    //    unsafe { TODO: call sys:shader_effect_get_program() }
     //}
 
     //fn get_shader(&self) -> /*Unimplemented*/Option<dx::pure::Handle> {
-    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_get_shader() }
+    //    unsafe { TODO: call sys:shader_effect_get_shader() }
     //}
 
     fn set_shader_source(&self, source: &str) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_shader_effect_set_shader_source(
+        //     from_glib(ffi::shader_effect_set_shader_source(
         //         self.as_ref().to_glib_none().0,
         //         source.to_glib_none().0,
         //     ))
@@ -102,19 +103,19 @@ impl<O: Is<ShaderEffect>> ShaderEffectExt for O {
     }
 
     //fn set_uniform(&self, name: &str, gtype: glib::types::Type, n_values: usize, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_set_uniform() }
+    //    unsafe { TODO: call sys:shader_effect_set_uniform() }
     //}
 
-    fn set_uniform_value(&self, name: &str, value: &glib::Value) {
-        // unsafe {
-        //     ffi::clutter_shader_effect_set_uniform_value(
-        //         self.as_ref().to_glib_none().0,
-        //         name.to_glib_none().0,
-        //         value.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_uniform_value(&self, name: &str, value: &glib::Value) {
+    //     // unsafe {
+    //     //     ffi::shader_effect_set_uniform_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         name.to_glib_none().0,
+    //     //         value.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 }
 
 impl fmt::Display for ShaderEffect {
diff --git a/src/pure/snap_constraint.rs b/src/pure/snap_constraint.rs
index 2dde460..22d12cd 100644
--- a/src/pure/snap_constraint.rs
+++ b/src/pure/snap_constraint.rs
@@ -28,7 +28,7 @@ impl SnapConstraint {
         offset: f32,
     ) -> SnapConstraint {
         // unsafe {
-        //     Constraint::from_glib_none(ffi::clutter_snap_constraint_new(
+        //     Constraint::from_glib_none(ffi::snap_constraint_new(
         //         source.map(|p| p.as_ref()).to_glib_none().0,
         //         from_edge.to_glib(),
         //         to_edge.to_glib(),
@@ -48,7 +48,7 @@ impl SnapConstraint {
         // unsafe {
         //     let mut from_edge = mem::MaybeUninit::uninit();
         //     let mut to_edge = mem::MaybeUninit::uninit();
-        //     ffi::clutter_snap_constraint_get_edges(
+        //     ffi::snap_constraint_get_edges(
         //         self.to_glib_none().0,
         //         from_edge.as_mut_ptr(),
         //         to_edge.as_mut_ptr(),
@@ -66,7 +66,7 @@ impl SnapConstraint {
     ///
     /// the offset, in pixels
     pub fn get_offset(&self) -> f32 {
-        // unsafe { ffi::clutter_snap_constraint_get_offset(self.to_glib_none().0) }
+        // unsafe { ffi::snap_constraint_get_offset(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -77,7 +77,7 @@ impl SnapConstraint {
     /// a pointer to the source actor
     pub fn get_source(&self) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_snap_constraint_get_source(
+        //     from_glib_none(ffi::snap_constraint_get_source(
         //         self.to_glib_none().0,
         //     ))
         // }
@@ -95,7 +95,7 @@ impl SnapConstraint {
     /// the edge on the source
     pub fn set_edges(&self, from_edge: SnapEdge, to_edge: SnapEdge) {
         // unsafe {
-        //     ffi::clutter_snap_constraint_set_edges(
+        //     ffi::snap_constraint_set_edges(
         //         self.to_glib_none().0,
         //         from_edge.to_glib(),
         //         to_edge.to_glib(),
@@ -109,7 +109,7 @@ impl SnapConstraint {
     /// the offset to apply, in pixels
     pub fn set_offset(&self, offset: f32) {
         // unsafe {
-        //     ffi::clutter_snap_constraint_set_offset(self.to_glib_none().0, offset);
+        //     ffi::snap_constraint_set_offset(self.to_glib_none().0, offset);
         // }
         unimplemented!()
     }
@@ -119,7 +119,7 @@ impl SnapConstraint {
     /// a `Actor`, or `None` to unset the source
     pub fn set_source<P: Is<Actor>>(&self, source: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_snap_constraint_set_source(
+        //     ffi::snap_constraint_set_source(
         //         self.to_glib_none().0,
         //         source.map(|p| p.as_ref()).to_glib_none().0,
         //     );
diff --git a/src/pure/stage.rs b/src/pure/stage.rs
index c5fc582..c0e9172 100644
--- a/src/pure/stage.rs
+++ b/src/pure/stage.rs
@@ -1,22 +1,25 @@
-use super::{Actor, AllocationFlags, ActorBox, Event, Fog, Perspective, PickMode, StageWindow, HandlerId};
-use crate::prelude::*;
-use std::{fmt, cell::RefCell};
+use std::{cell::RefCell, fmt};
+
+use dx::platform::core::{Framebuffer, Matrix, FramebufferType};
+
+use crate::{Group, prelude::*};
+
+use super::{Actor, ActorBox, AllocationFlags, Event, Fog, HandlerId, Perspective, PickMode};
 
 pub struct Vector4 {
-  x: f32,
-  y: f32,
-  z: f32,
-  w: f32,
+    x: f32,
+    y: f32,
+    z: f32,
+    w: f32,
 }
 
-#[derive(Default, Debug, Clone)]
+#[derive(Default, Debug)]
 struct StageProps {
-    // the stage implementation
-    implementation: Option<StageWindow>,
+    framebuffer: Framebuffer,
     perspective: Perspective,
-    projection: dx::pure::Matrix,
-    inverse_projection: dx::pure::Matrix,
-    view: dx::pure::Matrix,
+    projection: Matrix,
+    inverse_projection: Matrix,
+    view: Matrix,
     viewport: [f32; 4],
 
     fog: Fog,
@@ -32,7 +35,7 @@ struct StageProps {
     // current_clip_planes: [Plane; 4],
     pending_queue_redraws: Option<Vec<String>>,
 
-    active_framebuffer: Option<dx::pure::Framebuffer>,
+    active_framebuffer: Option<Framebuffer>,
 
     sync_delay: i32,
 
@@ -61,29 +64,28 @@ struct StageProps {
     has_custom_perspective: bool,
 }
 
-// * SECTION:clutter-stage
-// * @short_description: Top level visual element to which actors are placed.
-// *
-// * #Stage is a top level 'window' on which child actors are placed
-// * and manipulated.
-// *
-// * Backends might provide support for multiple stages. The support for this
-// * feature can be checked at run-time using the clutter_feature_available()
-// * function and the %CLUTTER_FEATURE_STAGE_MULTIPLE flag. If the backend used
-// * supports multiple stages, new #Stage instances can be created
-// * using clutter_stage_new(). These stages must be managed by the developer
-// * using clutter_actor_destroy(), which will take care of destroying all the
-// * actors contained inside them.
-// *
-// * #Stage is a proxy actor, wrapping the backend-specific
-// * implementation of the windowing system. It is possible to subclass
-// * #Stage, as long as every overridden virtual function chains up to
-// * the parent class corresponding function.
+// @short_description: Top level visual element to which actors are placed.
+//
+// #Stage is a top level 'window' on which child actors are placed
+// and manipulated.
+//
+// Backends might provide support for multiple stages. The support for this
+// feature can be checked at run-time using the feature_available()
+// function and the %FEATURE_STAGE_MULTIPLE flag. If the backend used
+// supports multiple stages, new #Stage instances can be created
+// using stage_new(). These stages must be managed by the developer
+// using actor_destroy(), which will take care of destroying all the
+// actors contained inside them.
+//
+// #Stage is a proxy actor, wrapping the backend-specific
+// implementation of the windowing system. It is possible to subclass
+// #Stage, as long as every overridden virtual function chains up to
+// the parent class corresponding function.
 // TODO: implements atk::ImplementorIface, Scriptable, Animatable, Container
 // @extends Group, Actor
 #[derive(Default, Debug)]
 pub struct Stage {
-    props: RefCell<StageProps>
+    props: RefCell<StageProps>,
 }
 
 impl Stage {
@@ -109,27 +111,28 @@ impl Stage {
 
     fn init(&self) {
         // cairo_rectangle_int_t geom = { 0, };
-        // ClutterStagePrivate *priv;
-        // ClutterStageWindow *impl;
-        // ClutterBackend *backend;
+        // StagePrivate *priv;
+        // StageWindow *stagewindow;
+        // Backend *backend;
         // int window_scale = 1;
         // GError *error;
 
-        // /* a stage is a top-level object */
-        // CLUTTER_SET_PRIVATE_FLAGS(self, CLUTTER_IS_TOPLEVEL);
+        // a stage is a top-level object
+        
+        // SET_PRIVATE_FLAGS(self, IS_TOPLEVEL);
 
-        // self->priv = priv = clutter_stage_get_instance_private(self);
+        // self->priv = priv = stage_get_instance_private(self);
 
-        // CLUTTER_NOTE (BACKEND, "Creating stage from the default backend");
-        // backend = clutter_get_default_backend();
+        // NOTE (BACKEND, "Creating stage from the default backend");
+        // backend = get_default_backend();
 
         // error = NULL;
-        // impl = _clutter_backend_create_stage(backend, self, &error);
+        // stagewindow = _backend_create_stage(backend, self, &error);
 
-        // if G_LIKELY(impl != NULL) {
-        //     _clutter_stage_set_window(self, impl);
-        //     _clutter_stage_window_get_geometry(priv->impl, &geom);
-        //     window_scale = _clutter_stage_window_get_scale_factor(priv->impl);
+        // if G_LIKELY(stagewindow != NULL) {
+        //     _stage_set_window(self, stagewindow);
+        //     _stage_window_get_geometry(priv->stagewindow, &geom);
+        //     window_scale = _stage_window_get_scale_factor(priv->stagewindow);
         // } else {
         //     if error != NULL {
         //         g_critical("Unable to create a new stage implementation: %s",
@@ -150,18 +153,18 @@ impl Stage {
         // priv->min_size_changed = FALSE;
         // priv->sync_delay = -1;
 
-        // /* XXX - we need to keep the invariant that calling
-        // * clutter_set_motion_event_enabled() before the stage creation
-        // * will cause motion event delivery to be disabled on any newly
-        // * created stage. this can go away when we break API and remove
-        // * deprecated functions.
-        // */
-        // priv->motion_events_enabled = _clutter_context_get_motion_events_enabled();
+        // XXX - we need to keep the invariant that calling
+        // set_motion_event_enabled() before the stage creation
+        // will cause motion event delivery to be disabled on any newly
+        // created stage. this can go away when we break API and remove
+        // deprecated functions.
 
-        // clutter_actor_set_background_color(CLUTTER_ACTOR(self),
+        // priv->motion_events_enabled = _context_get_motion_events_enabled();
+
+        // actor_set_background_color(ACTOR(self),
         //                                     &default_stage_color);
 
-        // priv->perspective.fovy   = 60.0; /* 60 Degrees */
+        // priv->perspective.fovy   = 60.0; // 60 Degrees
         // priv->perspective.aspect = (float) geom.width / (float) geom.height;
         // priv->perspective.z_near = 0.1;
         // priv->perspective.z_far  = 100.0;
@@ -183,94 +186,93 @@ impl Stage {
         //                                     geom.width * window_scale,
         //                                     geom.height * window_scale);
 
-
-        // /* FIXME - remove for 2.0 */
+        // FIXME - remove for 2.0 */
         // priv->fog.z_near = 1.0;
         // priv->fog.z_far  = 2.0;
 
         // priv->relayout_pending = TRUE;
 
-        // clutter_actor_set_reactive(CLUTTER_ACTOR(self), TRUE);
-        // clutter_stage_set_title(self, g_get_prgname ());
-        // clutter_stage_set_key_focus(self, NULL);
+        // actor_set_reactive(ACTOR(self), TRUE);
+        // stage_set_title(self, g_get_prgname ());
+        // stage_set_key_focus(self, NULL);
 
         // g_signal_connect(self, "notify::min-width",
-        //                     G_CALLBACK(clutter_stage_notify_min_size), NULL);
+        //                     G_CALLBACK(stage_notify_min_size), NULL);
         // g_signal_connect(self, "notify::min-height",
-        //                     G_CALLBACK(clutter_stage_notify_min_size), NULL);
+        //                     G_CALLBACK(stage_notify_min_size), NULL);
 
-        // _clutter_stage_set_viewport(self,
+        // _stage_set_viewport(self,
         //                             0, 0,
         //                             geom.width,
         //                             geom.height);
 
         // priv->paint_volume_stack =
-        //     g_array_new(FALSE, FALSE, sizeof (ClutterPaintVolume));
+        //     g_array_new(FALSE, FALSE, sizeof (PaintVolume));
 
-        // priv->pick_id_pool = _clutter_id_pool_new(256);
+        // priv->pick_id_pool = _id_pool_new(256);
     }
 
     fn allocate(&self, box_: ActorBox, flags: AllocationFlags) {
-        // ClutterStagePrivate *priv = CLUTTER_STAGE(self)->priv;
-        // ClutterActorBox alloc = CLUTTER_ACTOR_BOX_INIT_ZERO;
+        // StagePrivate *priv = STAGE(self)->priv;
+        // ActorBox alloc = ACTOR_BOX_INIT_ZERO;
         // float old_width, old_height;
         // float new_width, new_height;
         // float width, height;
         // cairo_rectangle_int_t window_size;
         // int scale_factor;
-      
-        // if priv->impl == NULL {
+
+        // if priv->stagewindow == NULL {
         //   return;
         // }
-      
-        // /* our old allocation */
-        // clutter_actor_get_allocation_box(self, &alloc);
-        // clutter_actor_box_get_size(&alloc, &old_width, &old_height);
-      
-        // /* the current allocation */
-        // clutter_actor_box_get_size(box, &width, &height);
-      
-        // /* the current Stage implementation size */
-        // _clutter_stage_window_get_geometry(priv->impl, &window_size);
-      
-        // /* if the stage is fixed size (for instance, it's using a EGL framebuffer)
+
+        // our old allocation */
+        // actor_get_allocation_box(self, &alloc);
+        // actor_box_get_size(&alloc, &old_width, &old_height);
+
+        // the current allocation */
+        // actor_box_get_size(box, &width, &height);
+
+        // the current Stage implementation size */
+        // _stage_window_get_geometry(priv->stagewindow, &window_size);
+
+        // if the stage is fixed size (for instance, it's using a EGL framebuffer)
         //  * then we simply ignore any allocation request and override the
         //  * allocation chain - because we cannot forcibly change the size of the
         //  * stage window.
         //  */
-        // if (!clutter_feature_available(CLUTTER_FEATURE_STAGE_STATIC))
+        // if (!feature_available(FEATURE_STAGE_STATIC))
         //   {
-        //     CLUTTER_NOTE (LAYOUT,
+        //     NOTE (LAYOUT,
         //                   "Following allocation to %.2fx%.2f (absolute origin %s)",
         //                   width, height,
-        //                   (flags & CLUTTER_ABSOLUTE_ORIGIN_CHANGED)
+        //                   (flags & ABSOLUTE_ORIGIN_CHANGED)
         //                     ? "changed"
         //                     : "not changed");
-      
-        //     clutter_actor_set_allocation(self, box,
-        //                                   flags | CLUTTER_DELEGATE_LAYOUT);
-      
+
+        //     actor_set_allocation(self, box,
+        //                                   flags | DELEGATE_LAYOUT);
+
         //     // Ensure the window is sized correctly
         //     if !priv->is_fullscreen {
         //         if priv->min_size_changed {
         //             gfloat min_width, min_height;
         //             gboolean min_width_set, min_height_set;
-      
+
         //             g_object_get(G_OBJECT (self),
         //                           "min-width", &min_width,
         //                           "min-width-set", &min_width_set,
         //                           "min-height", &min_height,
         //                           "min-height-set", &min_height_set,
         //                           NULL);
-      
+
         //             if !min_width_set {
         //               min_width = 1;
         //             }
-                    
+
         //             if !min_height_set {
         //               min_height = 1;
         //             }
-      
+
         //             if width < min_width {
         //               width = min_width;
         //             }
@@ -278,80 +280,108 @@ impl Stage {
         //             if height < min_height {
         //               height = min_height;
         //             }
-      
+
         //             priv->min_size_changed = FALSE;
         //         }
-      
-        //         if window_size.width != CLUTTER_NEARBYINT (width) ||
-        //             window_size.height != CLUTTER_NEARBYINT (height) {
-        //             _clutter_stage_window_resize(priv->impl,
-        //                                           CLUTTER_NEARBYINT (width),
-        //                                           CLUTTER_NEARBYINT (height));
+
+        //         if window_size.width != NEARBYINT (width) ||
+        //             window_size.height != NEARBYINT (height) {
+        //             _stage_window_resize(priv->stagewindow,
+        //                                           NEARBYINT (width),
+        //                                           NEARBYINT (height));
         //         }
         //     }
         // } else {
-        //     ClutterActorBox override = { 0, };
-      
+        //     ActorBox override = { 0, };
+
         //     /* override the passed allocation */
         //     override.x1 = 0;
         //     override.y1 = 0;
         //     override.x2 = window_size.width;
         //     override.y2 = window_size.height;
-      
-        //     CLUTTER_NOTE(LAYOUT,
+
+        //     NOTE(LAYOUT,
         //                   "Overriding original allocation of %.2fx%.2f "
         //                   "with %.2fx%.2f (absolute origin %s)",
         //                   width, height,
         //                   override.x2, override.y2,
-        //                   (flags & CLUTTER_ABSOLUTE_ORIGIN_CHANGED)
+        //                   (flags & ABSOLUTE_ORIGIN_CHANGED)
         //                     ? "changed"
         //                     : "not changed");
-      
+
         //     /* and store the overridden allocation */
-        //     clutter_actor_set_allocation(self, &override,
-        //                                   flags | CLUTTER_DELEGATE_LAYOUT);
+        //     actor_set_allocation(self, &override,
+        //                                   flags | DELEGATE_LAYOUT);
         //   }
-      
-        // /* XXX: Until Cogl becomes fully responsible for backend windows
-        //  * Clutter need to manually keep it informed of the current window
+
+        // XXX: Until Cogl becomes fully responsible for backend windows
+        //  *  need to manually keep it informed of the current window
         //  * size. We do this after the allocation above so that the stage
         //  * window has a chance to update the window size based on the
         //  * allocation.
         //  */
-        // _clutter_stage_window_get_geometry(priv->impl, &window_size);
-      
-        // scale_factor = _clutter_stage_window_get_scale_factor(priv->impl);
-      
+        // _stage_window_get_geometry(priv->stagewindow, &window_size);
+
+        // scale_factor = _stage_window_get_scale_factor(priv->stagewindow);
+
         // window_size.width *= scale_factor;
         // window_size.height *= scale_factor;
-      
-        // cogl_onscreen_clutter_backend_set_size(window_size.width,
+
+        // cogl_onscreen_backend_set_size(window_size.width,
         //                                         window_size.height);
-      
-        // /* reset the viewport if the allocation effectively changed */
-        // clutter_actor_get_allocation_box(self, &alloc);
-        // clutter_actor_box_get_size(&alloc, &new_width, &new_height);
-      
-        // if CLUTTER_NEARBYINT (old_width) != CLUTTER_NEARBYINT (new_width) ||
-        //     CLUTTER_NEARBYINT (old_height) != CLUTTER_NEARBYINT (new_height) {
-        //     int real_width = CLUTTER_NEARBYINT(new_width);
-        //     int real_height = CLUTTER_NEARBYINT(new_height);
-      
-        //     _clutter_stage_set_viewport(CLUTTER_STAGE (self),
+
+        // reset the viewport if the allocation effectively changed */
+        // actor_get_allocation_box(self, &alloc);
+        // actor_box_get_size(&alloc, &new_width, &new_height);
+
+        // if NEARBYINT (old_width) != NEARBYINT (new_width) ||
+        //     NEARBYINT (old_height) != NEARBYINT (new_height) {
+        //     int real_width = NEARBYINT(new_width);
+        //     int real_height = NEARBYINT(new_height);
+
+        //     _stage_set_viewport(STAGE (self),
         //                                  0, 0,
         //                                  real_width,
         //                                  real_height);
-      
+
         //     /* Note: we don't assume that set_viewport will queue a full redraw
         //      * since it may bail-out early if something preemptively set the
         //      * viewport before the stage was really allocated its new size.
         //      */
-        //     queue_full_redraw(CLUTTER_STAGE (self));
+        //     queue_full_redraw(STAGE (self));
         // }
     }
+
+    /// set_window_size:
+    /// @window: A #Stage
+    /// @width: A width, in pixels
+    /// @height: A height, in pixels
+    ///
+    /// Sets the size of the window, taking into account any window border. This
+    /// corresponds to the window's available area for its child, minus the area
+    /// occupied by the window's toolbar, if it's enabled.
+    ///
+    /// <note><para>
+    /// Setting the window size may involve a request to the underlying windowing
+    /// system, and may not immediately be reflected.
+    /// </para></note>
+    ///
+    pub fn set_window_size(&self, width: i32, height: i32) {
+        let props = self.props.borrow();
+        props.framebuffer.set_window_size(width, height);
+    }
 }
 
 impl Object for Stage {}
+impl Is<Actor> for Stage {}
+
+impl AsRef<Actor> for Stage {
+    fn as_ref(&self) -> &Actor {
+        unimplemented!()
+        // self
+    }
+}
+
 impl Is<Stage> for Stage {}
 
 impl AsRef<Stage> for Stage {
@@ -476,18 +506,18 @@ pub trait StageExt: 'static {
     ///  `Perspective`
     fn get_perspective(&self) -> Perspective;
 
-    /// Gets the bounds of the current redraw for `self` in stage pixel
-    /// coordinates. E.g., if only a single actor has queued a redraw then
-    /// it may redraw the stage with a clip so that it doesn't have to
-    /// paint every pixel in the stage. This function would then return the
-    /// bounds of that clip. An application can use this information to
-    /// avoid some extra work if it knows that some regions of the stage
-    /// aren't going to be painted. This should only be called while the
-    /// stage is being painted. If there is no current redraw clip then
-    /// this function will set `clip` to the full extents of the stage.
-    /// ## `clip`
-    /// Return location for the clip bounds
-    fn get_redraw_clip_bounds(&self) -> cairo::RectangleInt;
+    // /// Gets the bounds of the current redraw for `self` in stage pixel
+    // /// coordinates. E.g., if only a single actor has queued a redraw then
+    // /// it may redraw the stage with a clip so that it doesn't have to
+    // /// paint every pixel in the stage. This function would then return the
+    // /// bounds of that clip. An application can use this information to
+    // /// avoid some extra work if it knows that some regions of the stage
+    // /// aren't going to be painted. This should only be called while the
+    // /// stage is being painted. If there is no current redraw clip then
+    // /// this function will set `clip` to the full extents of the stage.
+    // /// ## `clip`
+    // /// Return location for the clip bounds
+    // fn get_redraw_clip_bounds(&self) -> cairo::RectangleInt;
 
     /// Retrieves the value set with `StageExt::set_throttle_motion_events`
     ///
@@ -514,12 +544,12 @@ pub trait StageExt: 'static {
     ///  alpha channel of the stage color
     fn get_use_alpha(&self) -> bool;
 
-    /// Retrieves the value set with `StageExt::set_user_resizable`.
+    /// Retrieves the value set with `StageExt::set_resizable`.
     ///
     /// # Returns
     ///
     /// `true` if the stage is resizable by the user.
-    fn get_user_resizable(&self) -> bool;
+    fn get_resizable(&self) -> bool;
 
     /// Makes the cursor invisible on the stage window
     fn hide_cursor(&self);
@@ -672,7 +702,7 @@ pub trait StageExt: 'static {
     /// window manager controls)
     /// ## `resizable`
     /// whether the stage should be user resizable.
-    fn set_user_resizable(&self, resizable: bool);
+    fn set_resizable(&self, resizable: bool);
 
     /// Shows the cursor on the stage window
     fn show_cursor(&self);
@@ -712,8 +742,7 @@ pub trait StageExt: 'static {
     /// backends that use a static frame buffer.
     /// ## `event`
     /// a `Event` of type `EventType::Delete`
-    fn connect_delete_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F)
-        -> HandlerId;
+    fn connect_delete_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F) -> HandlerId;
 
     /// The ::fullscreen signal is emitted when the stage is made fullscreen.
     fn connect_fullscreen<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
@@ -722,25 +751,15 @@ pub trait StageExt: 'static {
     /// state.
     fn connect_unfullscreen<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_accept_focus_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> HandlerId;
+    fn connect_property_accept_focus_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId;
+    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_fullscreen_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId;
+    fn connect_property_fullscreen_set_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
     fn connect_property_key_focus_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_no_clear_hint_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId;
+    fn connect_property_no_clear_hint_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
     fn connect_property_perspective_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
@@ -748,37 +767,34 @@ pub trait StageExt: 'static {
 
     fn connect_property_use_alpha_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_user_resizable_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId;
+    fn connect_property_user_resizable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 }
 
 impl<O: Is<Stage>> StageExt for O {
     fn ensure_current(&self) {
         // unsafe {
-        //     ffi::clutter_stage_ensure_current(self.as_ref().to_glib_none().0);
+        //     ffi::stage_ensure_current(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn ensure_redraw(&self) {
         // unsafe {
-        //     ffi::clutter_stage_ensure_redraw(self.as_ref().to_glib_none().0);
+        //     ffi::stage_ensure_redraw(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn ensure_viewport(&self) {
         // unsafe {
-        //     ffi::clutter_stage_ensure_viewport(self.as_ref().to_glib_none().0);
+        //     ffi::stage_ensure_viewport(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn event(&self, event: &mut Event) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_event(
+        //     from_glib(ffi::stage_event(
         //         self.as_ref().to_glib_none().0,
         //         event.to_glib_none_mut().0,
         //     ))
@@ -788,7 +804,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn get_accept_focus(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_get_accept_focus(
+        //     from_glib(ffi::stage_get_accept_focus(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -797,7 +813,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn get_actor_at_pos(&self, pick_mode: PickMode, x: i32, y: i32) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_stage_get_actor_at_pos(
+        //     from_glib_none(ffi::stage_get_actor_at_pos(
         //         self.as_ref().to_glib_none().0,
         //         pick_mode.to_glib(),
         //         x,
@@ -809,7 +825,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn get_fullscreen(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_get_fullscreen(
+        //     from_glib(ffi::stage_get_fullscreen(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -818,7 +834,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn get_key_focus(&self) -> Option<Actor> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_stage_get_key_focus(
+        //     from_glib_none(ffi::stage_get_key_focus(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -829,7 +845,7 @@ impl<O: Is<Stage>> StageExt for O {
         // unsafe {
         //     let mut width = mem::MaybeUninit::uninit();
         //     let mut height = mem::MaybeUninit::uninit();
-        //     ffi::clutter_stage_get_minimum_size(
+        //     ffi::stage_get_minimum_size(
         //         self.as_ref().to_glib_none().0,
         //         width.as_mut_ptr(),
         //         height.as_mut_ptr(),
@@ -843,7 +859,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn get_motion_events_enabled(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_get_motion_events_enabled(
+        //     from_glib(ffi::stage_get_motion_events_enabled(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -852,7 +868,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn get_no_clear_hint(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_get_no_clear_hint(
+        //     from_glib(ffi::stage_get_no_clear_hint(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -862,7 +878,7 @@ impl<O: Is<Stage>> StageExt for O {
     fn get_perspective(&self) -> Perspective {
         // unsafe {
         //     let mut perspective = Perspective::uninitialized();
-        //     ffi::clutter_stage_get_perspective(
+        //     ffi::stage_get_perspective(
         //         self.as_ref().to_glib_none().0,
         //         perspective.to_glib_none_mut().0,
         //     );
@@ -871,21 +887,21 @@ impl<O: Is<Stage>> StageExt for O {
         unimplemented!()
     }
 
-    fn get_redraw_clip_bounds(&self) -> cairo::RectangleInt {
-        // unsafe {
-        //     let mut clip = cairo::RectangleInt::uninitialized();
-        //     ffi::clutter_stage_get_redraw_clip_bounds(
-        //         self.as_ref().to_glib_none().0,
-        //         clip.to_glib_none_mut().0,
-        //     );
-        //     clip
-        // }
-        unimplemented!()
-    }
+    // fn get_redraw_clip_bounds(&self) -> cairo::RectangleInt {
+    //     // unsafe {
+    //     //     let mut clip = cairo::RectangleInt::uninitialized();
+    //     //     ffi::stage_get_redraw_clip_bounds(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         clip.to_glib_none_mut().0,
+    //     //     );
+    //     //     clip
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_throttle_motion_events(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_get_throttle_motion_events(
+        //     from_glib(ffi::stage_get_throttle_motion_events(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -893,22 +909,22 @@ impl<O: Is<Stage>> StageExt for O {
     }
 
     fn get_title(&self) -> Option<String> {
-        // unsafe { from_glib_none(ffi::clutter_stage_get_title(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::stage_get_title(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
     fn get_use_alpha(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_get_use_alpha(
+        //     from_glib(ffi::stage_get_use_alpha(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
         unimplemented!()
     }
 
-    fn get_user_resizable(&self) -> bool {
+    fn get_resizable(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_stage_get_user_resizable(
+        //     from_glib(ffi::stage_get_user_resizable(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -917,14 +933,14 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn hide_cursor(&self) {
         // unsafe {
-        //     ffi::clutter_stage_hide_cursor(self.as_ref().to_glib_none().0);
+        //     ffi::stage_hide_cursor(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     // fn read_pixels(&self, x: i32, y: i32, width: i32, height: i32) -> Vec<u8> {
     //     unsafe {
-    //         FromGlibPtrContainer::from_glib_full(ffi::clutter_stage_read_pixels(
+    //         FromGlibPtrContainer::from_glib_full(ffi::stage_read_pixels(
     //             self.as_ref().to_glib_none().0,
     //             x,
     //             y,
@@ -936,7 +952,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn set_accept_focus(&self, accept_focus: bool) {
         // unsafe {
-        //     ffi::clutter_stage_set_accept_focus(
+        //     ffi::stage_set_accept_focus(
         //         self.as_ref().to_glib_none().0,
         //         accept_focus.to_glib(),
         //     );
@@ -946,14 +962,14 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn set_fullscreen(&self, fullscreen: bool) {
         // unsafe {
-        //     ffi::clutter_stage_set_fullscreen(self.as_ref().to_glib_none().0, fullscreen.to_glib());
+        //     ffi::stage_set_fullscreen(self.as_ref().to_glib_none().0, fullscreen.to_glib());
         // }
         unimplemented!()
     }
 
     fn set_key_focus<P: Is<Actor>>(&self, actor: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_stage_set_key_focus(
+        //     ffi::stage_set_key_focus(
         //         self.as_ref().to_glib_none().0,
         //         actor.map(|p| p.as_ref()).to_glib_none().0,
         //     );
@@ -963,14 +979,14 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn set_minimum_size(&self, width: u32, height: u32) {
         // unsafe {
-        //     ffi::clutter_stage_set_minimum_size(self.as_ref().to_glib_none().0, width, height);
+        //     ffi::stage_set_minimum_size(self.as_ref().to_glib_none().0, width, height);
         // }
         unimplemented!()
     }
 
     fn set_motion_events_enabled(&self, enabled: bool) {
         // unsafe {
-        //     ffi::clutter_stage_set_motion_events_enabled(
+        //     ffi::stage_set_motion_events_enabled(
         //         self.as_ref().to_glib_none().0,
         //         enabled.to_glib(),
         //     );
@@ -979,7 +995,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn set_no_clear_hint(&self, no_clear: bool) {
         // unsafe {
-        //     ffi::clutter_stage_set_no_clear_hint(
+        //     ffi::stage_set_no_clear_hint(
         //         self.as_ref().to_glib_none().0,
         //         no_clear.to_glib(),
         //     );
@@ -989,7 +1005,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn set_perspective(&self, perspective: &mut Perspective) {
         // unsafe {
-        //     ffi::clutter_stage_set_perspective(
+        //     ffi::stage_set_perspective(
         //         self.as_ref().to_glib_none().0,
         //         perspective.to_glib_none_mut().0,
         //     );
@@ -999,7 +1015,7 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn set_throttle_motion_events(&self, throttle: bool) {
         // unsafe {
-        //     ffi::clutter_stage_set_throttle_motion_events(
+        //     ffi::stage_set_throttle_motion_events(
         //         self.as_ref().to_glib_none().0,
         //         throttle.to_glib(),
         //     );
@@ -1009,31 +1025,32 @@ impl<O: Is<Stage>> StageExt for O {
 
     fn set_title(&self, title: &str) {
         // unsafe {
-        //     ffi::clutter_stage_set_title(self.as_ref().to_glib_none().0, title.to_glib_none().0);
+        //     ffi::stage_set_title(self.as_ref().to_glib_none().0, title.to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn set_use_alpha(&self, use_alpha: bool) {
         // unsafe {
-        //     ffi::clutter_stage_set_use_alpha(self.as_ref().to_glib_none().0, use_alpha.to_glib());
+        //     ffi::stage_set_use_alpha(self.as_ref().to_glib_none().0, use_alpha.to_glib());
         // }
         unimplemented!()
     }
 
-    fn set_user_resizable(&self, resizable: bool) {
-        // unsafe {
-        //     ffi::clutter_stage_set_user_resizable(
-        //         self.as_ref().to_glib_none().0,
-        //         resizable.to_glib(),
-        //     );
-        // }
-        unimplemented!()
+    fn set_resizable(&self, resizable: bool) {
+        let stage = self.as_ref();
+        let props = stage.props.borrow();
+
+        let frontend: &FramebufferType = props.framebuffer.as_ref();
+        match frontend {
+            FramebufferType::OnScreen(onscreen) => onscreen.set_resizable(resizable),
+            FramebufferType::OffScreen(offscreen) => {}
+        }
     }
 
     fn show_cursor(&self) {
         // unsafe {
-        //     ffi::clutter_stage_show_cursor(self.as_ref().to_glib_none().0);
+        //     ffi::stage_show_cursor(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
@@ -1093,10 +1110,7 @@ impl<O: Is<Stage>> StageExt for O {
         unimplemented!()
     }
 
-    fn connect_delete_event<F: Fn(&Self, &Event) -> bool + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_delete_event<F: Fn(&Self, &Event) -> bool + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 
@@ -1108,24 +1122,15 @@ impl<O: Is<Stage>> StageExt for O {
         unimplemented!()
     }
 
-    fn connect_property_accept_focus_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_accept_focus_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 
-    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_cursor_visible_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 
-    fn connect_property_fullscreen_set_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_fullscreen_set_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 
@@ -1133,10 +1138,7 @@ impl<O: Is<Stage>> StageExt for O {
         unimplemented!()
     }
 
-    fn connect_property_no_clear_hint_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_no_clear_hint_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 
@@ -1152,10 +1154,7 @@ impl<O: Is<Stage>> StageExt for O {
         unimplemented!()
     }
 
-    fn connect_property_user_resizable_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_user_resizable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 }
diff --git a/src/pure/stage_manager.rs b/src/pure/stage_manager.rs
index 444997b..e708a94 100644
--- a/src/pure/stage_manager.rs
+++ b/src/pure/stage_manager.rs
@@ -13,7 +13,7 @@ impl StageManager {
     /// the default stage manager instance. The returned
     ///  object is owned by internals and you should not reference or unreference it.
     pub fn get_default() -> Option<StageManager> {
-        // unsafe { from_glib_none(ffi::clutter_stage_manager_get_default()) }
+        // unsafe { from_glib_none(ffi::stage_manager_get_default()) }
         unimplemented!()
     }
 }
@@ -78,7 +78,7 @@ pub trait StageManagerExt: 'static {
 impl<O: Is<StageManager>> StageManagerExt for O {
     fn get_default_stage(&self) -> Option<Stage> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_stage_manager_get_default_stage(
+        //     from_glib_none(ffi::stage_manager_get_default_stage(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -87,7 +87,7 @@ impl<O: Is<StageManager>> StageManagerExt for O {
 
     fn list_stages(&self) -> Vec<Stage> {
         // unsafe {
-        //     FromGlibPtrContainer::from_glib_container(ffi::clutter_stage_manager_list_stages(
+        //     FromGlibPtrContainer::from_glib_container(ffi::stage_manager_list_stages(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -96,7 +96,7 @@ impl<O: Is<StageManager>> StageManagerExt for O {
 
     fn peek_stages(&self) -> Vec<Stage> {
         // unsafe {
-        //     FromGlibPtrContainer::from_glib_none(ffi::clutter_stage_manager_peek_stages(
+        //     FromGlibPtrContainer::from_glib_none(ffi::stage_manager_peek_stages(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
diff --git a/src/pure/swipe_action.rs b/src/pure/swipe_action.rs
index a0b57fc..38235aa 100644
--- a/src/pure/swipe_action.rs
+++ b/src/pure/swipe_action.rs
@@ -2,12 +2,11 @@ use super::{Actor, HandlerId, SwipeDirection};
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-swipe-action
-// * @Title: ClutterSwipeAction
-// * @Short_Description: Action for swipe gestures
-// *
-// * #ClutterSwipeAction is a sub-class of #ClutterGestureAction that implements
-// * the logic for recognizing swipe gestures.
+// @Title: SwipeAction
+// @Short_Description: Action for swipe gestures
+//
+// #SwipeAction is a sub-class of #GestureAction that implements
+// the logic for recognizing swipe gestures.
 // @extends GestureAction, Action, ActorMeta
 #[derive(Default, Debug, Clone)]
 pub struct SwipeAction {
diff --git a/src/pure/tap_action.rs b/src/pure/tap_action.rs
index 266f44f..704781e 100644
--- a/src/pure/tap_action.rs
+++ b/src/pure/tap_action.rs
@@ -2,25 +2,24 @@ use super::{Actor, GestureAction, HandlerId};
 use crate::prelude::*;
 use std::fmt;
 
-// * SECTION:clutter-tap-action
-// * @Title: ClutterTapAction
-// * @Short_Description: Action for tap gestures
-// *
-// * #ClutterTapAction is a sub-class of #ClutterGestureAction that implements
-// * the logic for recognizing mouse clicks and touch tap gestures.
-// *
-// * The simplest usage of #ClutterTapAction consists in adding it to
-// * a #ClutterActor, setting it as reactive and connecting a
-// * callback for the #ClutterTapAction::tap signal, along the lines of the
-// * following code:
-// *
-// * |[
-// *   clutter_actor_add_action (actor, clutter_tap_action_new ());
-// *   clutter_actor_set_reactive (actor, TRUE);
-// *   g_signal_connect (action, "tap", G_CALLBACK (on_tap_callback), NULL);
-// * ]|
-// *
-// * Since: 1.14
+// @Title: TapAction
+// @Short_Description: Action for tap gestures
+//
+// #TapAction is a sub-class of #GestureAction that implements
+// the logic for recognizing mouse clicks and touch tap gestures.
+//
+// The simplest usage of #TapAction consists in adding it to
+// a #Actor, setting it as reactive and connecting a
+// callback for the #TapAction::tap signal, along the lines of the
+// following code:
+//
+// ```
+//   actor_add_action (actor, tap_action_new ());
+//   actor_set_reactive (actor, TRUE);
+//   g_signal_connect (action, "tap", G_CALLBACK (on_tap_callback), NULL);
+// ```
+//
+// Since: 1.14
 // @extends GestureAction, Action, ActorMeta
 #[derive(Default, Debug)]
 pub struct TapAction {
diff --git a/src/pure/text.rs b/src/pure/text.rs
index 6c74207..d150d73 100644
--- a/src/pure/text.rs
+++ b/src/pure/text.rs
@@ -1,8 +1,14 @@
-use super::{HandlerId, TextBuffer};
-use crate::prelude::*;
-use crate::{Color, Rect};
 use std::fmt;
 
+use crate::prelude::*;
+
+use crate::{
+    foundation::{colorspace::Color, Rect},
+    Actor,
+};
+
+use super::{HandlerId, TextBuffer};
+
 // TODO: implements atk::ImplementorIface, Scriptable, Animatable, Container
 // @extends Actor,
 #[derive(Default, Debug, Clone)]
@@ -16,7 +22,7 @@ impl Text {
     ///
     /// the newly created `Text` actor
     pub fn new() -> Text {
-        // unsafe { Actor::from_glib_none(ffi::clutter_text_new()).unsafe_cast() }
+        // unsafe { Actor::from_glib_none(ffi::text_new()).unsafe_cast() }
         unimplemented!()
     }
 
@@ -49,7 +55,7 @@ impl Text {
         // };
 
         // unsafe {
-        //     Actor::from_glib_none(ffi::clutter_text_new_full(
+        //     Actor::from_glib_none(ffi::text_new_full(
         //         font_name.to_glib_none().0,
         //         text.to_glib_none().0,
         //         color.to_glib_none().0,
@@ -61,7 +67,7 @@ impl Text {
 
     pub fn with_buffer<P: Is<TextBuffer>>(buffer: &P) -> Text {
         // unsafe {
-        //     Actor::from_glib_none(ffi::clutter_text_new_with_buffer(
+        //     Actor::from_glib_none(ffi::text_new_with_buffer(
         //         buffer.as_ref().to_glib_none().0,
         //     ))
         //     .unsafe_cast()
@@ -71,7 +77,7 @@ impl Text {
 
     pub fn with_text(font_name: Option<&str>, text: &str) -> Text {
         // unsafe {
-        //     Actor::from_glib_none(ffi::clutter_text_new_with_text(
+        //     Actor::from_glib_none(ffi::text_new_with_text(
         //         font_name.to_glib_none().0,
         //         text.to_glib_none().0,
         //     ))
@@ -82,8 +88,16 @@ impl Text {
 }
 
 impl Object for Text {}
+impl Is<Actor> for Text {}
+
+impl AsRef<Actor> for Text {
+    fn as_ref(&self) -> &Actor {
+        unimplemented!()
+        // self
+    }
+}
+
 impl Is<Text> for Text {}
-// impl Is<Actor> for Text {}
 
 impl AsRef<Text> for Text {
     fn as_ref(&self) -> &Text {
@@ -159,14 +173,14 @@ pub trait TextExt: 'static {
     /// `true` if the actor is activatable
     fn get_activatable(&self) -> bool;
 
-    /// Gets the attribute list that was set on the `Text` actor
-    /// `TextExt::set_attributes`, if any.
-    ///
-    /// # Returns
-    ///
-    /// the attribute list, or `None` if none was set. The
-    ///  returned value is owned by the `Text` and should not be unreferenced.
-    fn get_attributes(&self) -> Option<pango::AttrList>;
+    // /// Gets the attribute list that was set on the `Text` actor
+    // /// `TextExt::set_attributes`, if any.
+    // ///
+    // /// # Returns
+    // ///
+    // /// the attribute list, or `None` if none was set. The
+    // ///  returned value is owned by the `Text` and should not be unreferenced.
+    // fn get_attributes(&self) -> Option<pango::AttrList>;
 
     /// Get the `TextBuffer` object which holds the text for
     /// this widget.
@@ -238,21 +252,21 @@ pub trait TextExt: 'static {
     /// `true` if the actor is editable
     fn get_editable(&self) -> bool;
 
-    /// Returns the ellipsizing position of a `Text` actor, as
-    /// set by `TextExt::set_ellipsize`.
-    ///
-    /// # Returns
-    ///
-    /// `pango::EllipsizeMode`
-    fn get_ellipsize(&self) -> pango::EllipsizeMode;
-
-    /// Retrieves the `pango::FontDescription` used by `self`
-    ///
-    /// # Returns
-    ///
-    /// a `pango::FontDescription`. The returned value is owned
-    ///  by the `Text` actor and it should not be modified or freed
-    fn get_font_description(&self) -> Option<pango::FontDescription>;
+    // /// Returns the ellipsizing position of a `Text` actor, as
+    // /// set by `TextExt::set_ellipsize`.
+    // ///
+    // /// # Returns
+    // ///
+    // /// `pango::EllipsizeMode`
+    // fn get_ellipsize(&self) -> pango::EllipsizeMode;
+
+    // /// Retrieves the `pango::FontDescription` used by `self`
+    // ///
+    // /// # Returns
+    // ///
+    // /// a `pango::FontDescription`. The returned value is owned
+    // ///  by the `Text` actor and it should not be modified or freed
+    // fn get_font_description(&self) -> Option<pango::FontDescription>;
 
     /// Retrieves the font name as set by `TextExt::set_font_name`.
     ///
@@ -271,13 +285,13 @@ pub trait TextExt: 'static {
     /// `true` if the text should be justified
     fn get_justify(&self) -> bool;
 
-    /// Retrieves the current `pango::Layout` used by a `Text` actor.
-    ///
-    /// # Returns
-    ///
-    /// a `pango::Layout`. The returned object is owned by
-    ///  the `Text` actor and should not be modified or freed
-    fn get_layout(&self) -> Option<pango::Layout>;
+    // /// Retrieves the current `pango::Layout` used by a `Text` actor.
+    // ///
+    // /// # Returns
+    // ///
+    // /// a `pango::Layout`. The returned object is owned by
+    // ///  the `Text` actor and should not be modified or freed
+    // fn get_layout(&self) -> Option<pango::Layout>;
 
     /// Obtains the coordinates where the `Text` will draw the `pango::Layout`
     /// representing the text.
@@ -287,13 +301,13 @@ pub trait TextExt: 'static {
     /// location to store Y offset of layout, or `None`
     fn get_layout_offsets(&self) -> (i32, i32);
 
-    /// Retrieves the alignment of a `Text`, as set by
-    /// `TextExt::set_line_alignment`.
-    ///
-    /// # Returns
-    ///
-    /// a `pango::Alignment`
-    fn get_line_alignment(&self) -> pango::Alignment;
+    // /// Retrieves the alignment of a `Text`, as set by
+    // /// `TextExt::set_line_alignment`.
+    // ///
+    // /// # Returns
+    // ///
+    // /// a `pango::Alignment`
+    // fn get_line_alignment(&self) -> pango::Alignment;
 
     /// Retrieves the value set using `TextExt::set_line_wrap`.
     ///
@@ -303,14 +317,14 @@ pub trait TextExt: 'static {
     ///  its contents
     fn get_line_wrap(&self) -> bool;
 
-    /// Retrieves the line wrap mode used by the `Text` actor.
-    ///
-    /// See text_set_line_wrap_mode ().
-    ///
-    /// # Returns
-    ///
-    /// the wrap mode used by the `Text`
-    fn get_line_wrap_mode(&self) -> pango::WrapMode;
+    // /// Retrieves the line wrap mode used by the `Text` actor.
+    // ///
+    // /// See text_set_line_wrap_mode ().
+    // ///
+    // /// # Returns
+    // ///
+    // /// the wrap mode used by the `Text`
+    // fn get_line_wrap_mode(&self) -> pango::WrapMode;
 
     /// Gets the maximum length of text that can be set into a text actor.
     ///
@@ -447,14 +461,14 @@ pub trait TextExt: 'static {
     /// whether the `Text` actor should be activatable
     fn set_activatable(&self, activatable: bool);
 
-    /// Sets the attributes list that are going to be applied to the
-    /// `Text` contents.
-    ///
-    /// The `Text` actor will take a reference on the `pango::AttrList`
-    /// passed to this function.
-    /// ## `attrs`
-    /// a `pango::AttrList` or `None` to unset the attributes
-    fn set_attributes(&self, attrs: Option<&pango::AttrList>);
+    // /// Sets the attributes list that are going to be applied to the
+    // /// `Text` contents.
+    // ///
+    // /// The `Text` actor will take a reference on the `pango::AttrList`
+    // /// passed to this function.
+    // /// ## `attrs`
+    // /// a `pango::AttrList` or `None` to unset the attributes
+    // fn set_attributes(&self, attrs: Option<&pango::AttrList>);
 
     /// Set the `TextBuffer` object which holds the text for
     /// this widget.
@@ -518,21 +532,21 @@ pub trait TextExt: 'static {
     /// whether the `Text` should be editable
     fn set_editable(&self, editable: bool);
 
-    /// Sets the mode used to ellipsize (add an ellipsis: "...") to the
-    /// text if there is not enough space to render the entire contents
-    /// of a `Text` actor
-    /// ## `mode`
-    /// a `pango::EllipsizeMode`
-    fn set_ellipsize(&self, mode: pango::EllipsizeMode);
-
-    /// Sets `font_desc` as the font description for a `Text`
-    ///
-    /// The `pango::FontDescription` is copied by the `Text` actor
-    /// so you can safely call `pango::FontDescription::free` on it after
-    /// calling this function.
-    /// ## `font_desc`
-    /// a `pango::FontDescription`
-    fn set_font_description(&self, font_desc: &mut pango::FontDescription);
+    // /// Sets the mode used to ellipsize (add an ellipsis: "...") to the
+    // /// text if there is not enough space to render the entire contents
+    // /// of a `Text` actor
+    // /// ## `mode`
+    // /// a `pango::EllipsizeMode`
+    // fn set_ellipsize(&self, mode: pango::EllipsizeMode);
+
+    // /// Sets `font_desc` as the font description for a `Text`
+    // ///
+    // /// The `pango::FontDescription` is copied by the `Text` actor
+    // /// so you can safely call `pango::FontDescription::free` on it after
+    // /// calling this function.
+    // /// ## `font_desc`
+    // /// a `pango::FontDescription`
+    // fn set_font_description(&self, font_desc: &mut pango::FontDescription);
 
     /// Sets the font used by a `Text`. The `font_name` string
     /// must either be `None`, which means that the font name from the
@@ -562,15 +576,15 @@ pub trait TextExt: 'static {
     /// whether the text should be justified
     fn set_justify(&self, justify: bool);
 
-    /// Sets the way that the lines of a wrapped label are aligned with
-    /// respect to each other. This does not affect the overall alignment
-    /// of the label within its allocated or specified width.
-    ///
-    /// To align a `Text` actor you should add it to a container
-    /// that supports alignment, or use the anchor point.
-    /// ## `alignment`
-    /// A `pango::Alignment`
-    fn set_line_alignment(&self, alignment: pango::Alignment);
+    // /// Sets the way that the lines of a wrapped label are aligned with
+    // /// respect to each other. This does not affect the overall alignment
+    // /// of the label within its allocated or specified width.
+    // ///
+    // /// To align a `Text` actor you should add it to a container
+    // /// that supports alignment, or use the anchor point.
+    // /// ## `alignment`
+    // /// A `pango::Alignment`
+    // fn set_line_alignment(&self, alignment: pango::Alignment);
 
     /// Sets whether the contents of a `Text` actor should wrap,
     /// if they don't fit the size assigned to the actor.
@@ -578,12 +592,12 @@ pub trait TextExt: 'static {
     /// whether the contents should wrap
     fn set_line_wrap(&self, line_wrap: bool);
 
-    /// If line wrapping is enabled (see `TextExt::set_line_wrap`) this
-    /// function controls how the line wrapping is performed. The default is
-    /// `pango::WrapMode::Word` which means wrap on word boundaries.
-    /// ## `wrap_mode`
-    /// the line wrapping mode
-    fn set_line_wrap_mode(&self, wrap_mode: pango::WrapMode);
+    // /// If line wrapping is enabled (see `TextExt::set_line_wrap`) this
+    // /// function controls how the line wrapping is performed. The default is
+    // /// `pango::WrapMode::Word` which means wrap on word boundaries.
+    // /// ## `wrap_mode`
+    // /// the line wrapping mode
+    // fn set_line_wrap_mode(&self, wrap_mode: pango::WrapMode);
 
     /// Sets `markup` as the contents of a `Text`.
     ///
@@ -618,27 +632,27 @@ pub trait TextExt: 'static {
     /// a Unicode character, or 0 to unset the password character
     fn set_password_char(&self, wc: char);
 
-    /// Sets, or unsets, the pre-edit string. This function is useful
-    /// for input methods to display a string (with eventual specific
-    /// Pango attributes) before it is entered inside the `Text`
-    /// buffer.
-    ///
-    /// The preedit string and attributes are ignored if the `Text`
-    /// actor is not editable.
-    ///
-    /// This function should not be used by applications
-    /// ## `preedit_str`
-    /// the pre-edit string, or `None` to unset it
-    /// ## `preedit_attrs`
-    /// the pre-edit string attributes
-    /// ## `cursor_pos`
-    /// the cursor position for the pre-edit string
-    fn set_preedit_string(
-        &self,
-        preedit_str: Option<&str>,
-        preedit_attrs: Option<&pango::AttrList>,
-        cursor_pos: u32,
-    );
+    // /// Sets, or unsets, the pre-edit string. This function is useful
+    // /// for input methods to display a string (with eventual specific
+    // /// Pango attributes) before it is entered inside the `Text`
+    // /// buffer.
+    // ///
+    // /// The preedit string and attributes are ignored if the `Text`
+    // /// actor is not editable.
+    // ///
+    // /// This function should not be used by applications
+    // /// ## `preedit_str`
+    // /// the pre-edit string, or `None` to unset it
+    // /// ## `preedit_attrs`
+    // /// the pre-edit string attributes
+    // /// ## `cursor_pos`
+    // /// the cursor position for the pre-edit string
+    // fn set_preedit_string(
+    //     &self,
+    //     preedit_str: Option<&str>,
+    //     preedit_attrs: Option<&pango::AttrList>,
+    //     cursor_pos: u32,
+    // );
 
     /// Sets whether a `Text` actor should be selectable.
     ///
@@ -823,25 +837,25 @@ pub trait TextExt: 'static {
 
 impl<O: Is<Text>> TextExt for O {
     fn activate(&self) -> bool {
-        // unsafe { from_glib(ffi::clutter_text_activate(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib(ffi::text_activate(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
     fn coords_to_position(&self, x: f32, y: f32) -> i32 {
-        // unsafe { ffi::clutter_text_coords_to_position(self.as_ref().to_glib_none().0, x, y) }
+        // unsafe { ffi::text_coords_to_position(self.as_ref().to_glib_none().0, x, y) }
         unimplemented!()
     }
 
     fn delete_chars(&self, n_chars: u32) {
         // unsafe {
-        //     ffi::clutter_text_delete_chars(self.as_ref().to_glib_none().0, n_chars);
+        //     ffi::text_delete_chars(self.as_ref().to_glib_none().0, n_chars);
         // }
         unimplemented!()
     }
 
     fn delete_selection(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_delete_selection(
+        //     from_glib(ffi::text_delete_selection(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -850,37 +864,37 @@ impl<O: Is<Text>> TextExt for O {
 
     fn delete_text(&self, start_pos: isize, end_pos: isize) {
         // unsafe {
-        //     ffi::clutter_text_delete_text(self.as_ref().to_glib_none().0, start_pos, end_pos);
+        //     ffi::text_delete_text(self.as_ref().to_glib_none().0, start_pos, end_pos);
         // }
         unimplemented!()
     }
 
     fn get_activatable(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_activatable(
+        //     from_glib(ffi::text_get_activatable(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
         unimplemented!()
     }
 
-    fn get_attributes(&self) -> Option<pango::AttrList> {
-        // unsafe {
-        //     from_glib_none(ffi::clutter_text_get_attributes(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn get_attributes(&self) -> Option<pango::AttrList> {
+    //     // unsafe {
+    //     //     from_glib_none(ffi::text_get_attributes(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_buffer(&self) -> Option<TextBuffer> {
-        // unsafe { from_glib_none(ffi::clutter_text_get_buffer(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::text_get_buffer(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
     fn get_chars(&self, start_pos: isize, end_pos: isize) -> Option<String> {
         // unsafe {
-        //     from_glib_full(ffi::clutter_text_get_chars(
+        //     from_glib_full(ffi::text_get_chars(
         //         self.as_ref().to_glib_none().0,
         //         start_pos,
         //         end_pos,
@@ -892,7 +906,7 @@ impl<O: Is<Text>> TextExt for O {
     fn get_color(&self) -> Color {
         // unsafe {
         //     let mut color = Color::uninitialized();
-        //     ffi::clutter_text_get_color(self.as_ref().to_glib_none().0, color.to_glib_none_mut().0);
+        //     ffi::text_get_color(self.as_ref().to_glib_none().0, color.to_glib_none_mut().0);
         //     color
         // }
         unimplemented!()
@@ -901,7 +915,7 @@ impl<O: Is<Text>> TextExt for O {
     fn get_cursor_color(&self) -> Color {
         // unsafe {
         //     let mut color = Color::uninitialized();
-        //     ffi::clutter_text_get_cursor_color(
+        //     ffi::text_get_cursor_color(
         //         self.as_ref().to_glib_none().0,
         //         color.to_glib_none_mut().0,
         //     );
@@ -911,14 +925,14 @@ impl<O: Is<Text>> TextExt for O {
     }
 
     fn get_cursor_position(&self) -> i32 {
-        // unsafe { ffi::clutter_text_get_cursor_position(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::text_get_cursor_position(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_cursor_rect(&self) -> Rect<f32> {
         // unsafe {
         //     let mut rect = Rect::uninitialized();
-        //     ffi::clutter_text_get_cursor_rect(
+        //     ffi::text_get_cursor_rect(
         //         self.as_ref().to_glib_none().0,
         //         rect.to_glib_none_mut().0,
         //     );
@@ -928,13 +942,13 @@ impl<O: Is<Text>> TextExt for O {
     }
 
     fn get_cursor_size(&self) -> u32 {
-        // unsafe { ffi::clutter_text_get_cursor_size(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::text_get_cursor_size(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_cursor_visible(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_cursor_visible(
+        //     from_glib(ffi::text_get_cursor_visible(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -943,34 +957,34 @@ impl<O: Is<Text>> TextExt for O {
 
     fn get_editable(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_editable(
+        //     from_glib(ffi::text_get_editable(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
         unimplemented!()
     }
 
-    fn get_ellipsize(&self) -> pango::EllipsizeMode {
-        // unsafe {
-        //     from_glib(ffi::clutter_text_get_ellipsize(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn get_ellipsize(&self) -> pango::EllipsizeMode {
+    //     // unsafe {
+    //     //     from_glib(ffi::text_get_ellipsize(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn get_font_description(&self) -> Option<pango::FontDescription> {
-        // unsafe {
-        //     from_glib_full(ffi::clutter_text_get_font_description(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn get_font_description(&self) -> Option<pango::FontDescription> {
+    //     // unsafe {
+    //     //     from_glib_full(ffi::text_get_font_description(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_font_name(&self) -> Option<String> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_text_get_font_name(
+        //     from_glib_none(ffi::text_get_font_name(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -979,23 +993,23 @@ impl<O: Is<Text>> TextExt for O {
 
     fn get_justify(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_justify(
+        //     from_glib(ffi::text_get_justify(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
         unimplemented!()
     }
 
-    fn get_layout(&self) -> Option<pango::Layout> {
-        // unsafe { from_glib_none(ffi::clutter_text_get_layout(self.as_ref().to_glib_none().0)) }
-        unimplemented!()
-    }
+    // fn get_layout(&self) -> Option<pango::Layout> {
+    //     // unsafe { from_glib_none(ffi::text_get_layout(self.as_ref().to_glib_none().0)) }
+    //     unimplemented!()
+    // }
 
     fn get_layout_offsets(&self) -> (i32, i32) {
         // unsafe {
         //     let mut x = mem::MaybeUninit::uninit();
         //     let mut y = mem::MaybeUninit::uninit();
-        //     ffi::clutter_text_get_layout_offsets(
+        //     ffi::text_get_layout_offsets(
         //         self.as_ref().to_glib_none().0,
         //         x.as_mut_ptr(),
         //         y.as_mut_ptr(),
@@ -1007,41 +1021,41 @@ impl<O: Is<Text>> TextExt for O {
         unimplemented!()
     }
 
-    fn get_line_alignment(&self) -> pango::Alignment {
-        // unsafe {
-        //     from_glib(ffi::clutter_text_get_line_alignment(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn get_line_alignment(&self) -> pango::Alignment {
+    //     // unsafe {
+    //     //     from_glib(ffi::text_get_line_alignment(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_line_wrap(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_line_wrap(
+        //     from_glib(ffi::text_get_line_wrap(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
         unimplemented!()
     }
 
-    fn get_line_wrap_mode(&self) -> pango::WrapMode {
-        // unsafe {
-        //     from_glib(ffi::clutter_text_get_line_wrap_mode(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
-    }
+    // fn get_line_wrap_mode(&self) -> pango::WrapMode {
+    //     // unsafe {
+    //     //     from_glib(ffi::text_get_line_wrap_mode(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //     ))
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn get_max_length(&self) -> i32 {
-        // unsafe { ffi::clutter_text_get_max_length(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::text_get_max_length(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_password_char(&self) -> char {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_password_char(
+        //     from_glib(ffi::text_get_password_char(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -1050,7 +1064,7 @@ impl<O: Is<Text>> TextExt for O {
 
     fn get_selectable(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_selectable(
+        //     from_glib(ffi::text_get_selectable(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -1060,7 +1074,7 @@ impl<O: Is<Text>> TextExt for O {
     fn get_selected_text_color(&self) -> Color {
         // unsafe {
         //     let mut color = Color::uninitialized();
-        //     ffi::clutter_text_get_selected_text_color(
+        //     ffi::text_get_selected_text_color(
         //         self.as_ref().to_glib_none().0,
         //         color.to_glib_none_mut().0,
         //     );
@@ -1071,7 +1085,7 @@ impl<O: Is<Text>> TextExt for O {
 
     fn get_selection(&self) -> Option<String> {
         // unsafe {
-        //     from_glib_full(ffi::clutter_text_get_selection(
+        //     from_glib_full(ffi::text_get_selection(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -1079,14 +1093,14 @@ impl<O: Is<Text>> TextExt for O {
     }
 
     fn get_selection_bound(&self) -> i32 {
-        // unsafe { ffi::clutter_text_get_selection_bound(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::text_get_selection_bound(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_selection_color(&self) -> Color {
         // unsafe {
         //     let mut color = Color::uninitialized();
-        //     ffi::clutter_text_get_selection_color(
+        //     ffi::text_get_selection_color(
         //         self.as_ref().to_glib_none().0,
         //         color.to_glib_none_mut().0,
         //     );
@@ -1097,7 +1111,7 @@ impl<O: Is<Text>> TextExt for O {
 
     fn get_single_line_mode(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_single_line_mode(
+        //     from_glib(ffi::text_get_single_line_mode(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -1105,13 +1119,13 @@ impl<O: Is<Text>> TextExt for O {
     }
 
     fn get_text(&self) -> Option<String> {
-        // unsafe { from_glib_none(ffi::clutter_text_get_text(self.as_ref().to_glib_none().0)) }
+        // unsafe { from_glib_none(ffi::text_get_text(self.as_ref().to_glib_none().0)) }
         unimplemented!()
     }
 
     fn get_use_markup(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_text_get_use_markup(
+        //     from_glib(ffi::text_get_use_markup(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -1120,7 +1134,7 @@ impl<O: Is<Text>> TextExt for O {
 
     fn insert_text(&self, text: &str, position: isize) {
         // unsafe {
-        //     ffi::clutter_text_insert_text(
+        //     ffi::text_insert_text(
         //         self.as_ref().to_glib_none().0,
         //         text.to_glib_none().0,
         //         position,
@@ -1131,7 +1145,7 @@ impl<O: Is<Text>> TextExt for O {
 
     fn insert_unichar(&self, wc: char) {
         // unsafe {
-        //     ffi::clutter_text_insert_unichar(self.as_ref().to_glib_none().0, wc.to_glib());
+        //     ffi::text_insert_unichar(self.as_ref().to_glib_none().0, wc.to_glib());
         // }
         unimplemented!()
     }
@@ -1141,7 +1155,7 @@ impl<O: Is<Text>> TextExt for O {
         //     let mut x = mem::MaybeUninit::uninit();
         //     let mut y = mem::MaybeUninit::uninit();
         //     let mut line_height = mem::MaybeUninit::uninit();
-        //     let ret = from_glib(ffi::clutter_text_position_to_coords(
+        //     let ret = from_glib(ffi::text_position_to_coords(
         //         self.as_ref().to_glib_none().0,
         //         position,
         //         x.as_mut_ptr(),
@@ -1162,7 +1176,7 @@ impl<O: Is<Text>> TextExt for O {
 
     fn set_activatable(&self, activatable: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_activatable(
+        //     ffi::text_set_activatable(
         //         self.as_ref().to_glib_none().0,
         //         activatable.to_glib(),
         //     );
@@ -1170,19 +1184,19 @@ impl<O: Is<Text>> TextExt for O {
         unimplemented!()
     }
 
-    fn set_attributes(&self, attrs: Option<&pango::AttrList>) {
-        // unsafe {
-        //     ffi::clutter_text_set_attributes(
-        //         self.as_ref().to_glib_none().0,
-        //         attrs.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_attributes(&self, attrs: Option<&pango::AttrList>) {
+    //     // unsafe {
+    //     //     ffi::text_set_attributes(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         attrs.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_buffer<P: Is<TextBuffer>>(&self, buffer: &P) {
         // unsafe {
-        //     ffi::clutter_text_set_buffer(
+        //     ffi::text_set_buffer(
         //         self.as_ref().to_glib_none().0,
         //         buffer.as_ref().to_glib_none().0,
         //     );
@@ -1202,7 +1216,7 @@ impl<O: Is<Text>> TextExt for O {
         // };
 
         // unsafe {
-        //     ffi::clutter_text_set_color(self.as_ref().to_glib_none().0, color.to_glib_none().0);
+        //     ffi::text_set_color(self.as_ref().to_glib_none().0, color.to_glib_none().0);
         // }
         unimplemented!()
     }
@@ -1221,7 +1235,7 @@ impl<O: Is<Text>> TextExt for O {
         //     None => None,
         // };
         // unsafe {
-        //     ffi::clutter_text_set_cursor_color(
+        //     ffi::text_set_cursor_color(
         //         self.as_ref().to_glib_none().0,
         //         color.to_glib_none().0,
         //     );
@@ -1231,21 +1245,21 @@ impl<O: Is<Text>> TextExt for O {
 
     fn set_cursor_position(&self, position: i32) {
         // unsafe {
-        //     ffi::clutter_text_set_cursor_position(self.as_ref().to_glib_none().0, position);
+        //     ffi::text_set_cursor_position(self.as_ref().to_glib_none().0, position);
         // }
         unimplemented!()
     }
 
     fn set_cursor_size(&self, size: i32) {
         // unsafe {
-        //     ffi::clutter_text_set_cursor_size(self.as_ref().to_glib_none().0, size);
+        //     ffi::text_set_cursor_size(self.as_ref().to_glib_none().0, size);
         // }
         unimplemented!()
     }
 
     fn set_cursor_visible(&self, cursor_visible: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_cursor_visible(
+        //     ffi::text_set_cursor_visible(
         //         self.as_ref().to_glib_none().0,
         //         cursor_visible.to_glib(),
         //     );
@@ -1255,31 +1269,31 @@ impl<O: Is<Text>> TextExt for O {
 
     fn set_editable(&self, editable: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_editable(self.as_ref().to_glib_none().0, editable.to_glib());
+        //     ffi::text_set_editable(self.as_ref().to_glib_none().0, editable.to_glib());
         // }
         unimplemented!()
     }
 
-    fn set_ellipsize(&self, mode: pango::EllipsizeMode) {
-        // unsafe {
-        //     ffi::clutter_text_set_ellipsize(self.as_ref().to_glib_none().0, mode.to_glib());
-        // }
-        unimplemented!()
-    }
+    // fn set_ellipsize(&self, mode: pango::EllipsizeMode) {
+    //     // unsafe {
+    //     //     ffi::text_set_ellipsize(self.as_ref().to_glib_none().0, mode.to_glib());
+    //     // }
+    //     unimplemented!()
+    // }
 
-    fn set_font_description(&self, font_desc: &mut pango::FontDescription) {
-        // unsafe {
-        //     ffi::clutter_text_set_font_description(
-        //         self.as_ref().to_glib_none().0,
-        //         font_desc.to_glib_none_mut().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_font_description(&self, font_desc: &mut pango::FontDescription) {
+    //     // unsafe {
+    //     //     ffi::text_set_font_description(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         font_desc.to_glib_none_mut().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_font_name(&self, font_name: Option<&str>) {
         // unsafe {
-        //     ffi::clutter_text_set_font_name(
+        //     ffi::text_set_font_name(
         //         self.as_ref().to_glib_none().0,
         //         font_name.to_glib_none().0,
         //     );
@@ -1289,79 +1303,79 @@ impl<O: Is<Text>> TextExt for O {
 
     fn set_justify(&self, justify: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_justify(self.as_ref().to_glib_none().0, justify.to_glib());
+        //     ffi::text_set_justify(self.as_ref().to_glib_none().0, justify.to_glib());
         // }
         unimplemented!()
     }
 
-    fn set_line_alignment(&self, alignment: pango::Alignment) {
-        // unsafe {
-        //     ffi::clutter_text_set_line_alignment(
-        //         self.as_ref().to_glib_none().0,
-        //         alignment.to_glib(),
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_line_alignment(&self, alignment: pango::Alignment) {
+    //     // unsafe {
+    //     //     ffi::text_set_line_alignment(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         alignment.to_glib(),
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_line_wrap(&self, line_wrap: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_line_wrap(self.as_ref().to_glib_none().0, line_wrap.to_glib());
+        //     ffi::text_set_line_wrap(self.as_ref().to_glib_none().0, line_wrap.to_glib());
         // }
         unimplemented!()
     }
 
-    fn set_line_wrap_mode(&self, wrap_mode: pango::WrapMode) {
-        // unsafe {
-        //     ffi::clutter_text_set_line_wrap_mode(
-        //         self.as_ref().to_glib_none().0,
-        //         wrap_mode.to_glib(),
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_line_wrap_mode(&self, wrap_mode: pango::WrapMode) {
+    //     // unsafe {
+    //     //     ffi::text_set_line_wrap_mode(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         wrap_mode.to_glib(),
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_markup(&self, markup: Option<&str>) {
         // unsafe {
-        //     ffi::clutter_text_set_markup(self.as_ref().to_glib_none().0, markup.to_glib_none().0);
+        //     ffi::text_set_markup(self.as_ref().to_glib_none().0, markup.to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn set_max_length(&self, max: i32) {
         // unsafe {
-        //     ffi::clutter_text_set_max_length(self.as_ref().to_glib_none().0, max);
+        //     ffi::text_set_max_length(self.as_ref().to_glib_none().0, max);
         // }
         unimplemented!()
     }
 
     fn set_password_char(&self, wc: char) {
         // unsafe {
-        //     ffi::clutter_text_set_password_char(self.as_ref().to_glib_none().0, wc.to_glib());
+        //     ffi::text_set_password_char(self.as_ref().to_glib_none().0, wc.to_glib());
         // }
         unimplemented!()
     }
 
-    fn set_preedit_string(
-        &self,
-        preedit_str: Option<&str>,
-        preedit_attrs: Option<&pango::AttrList>,
-        cursor_pos: u32,
-    ) {
-        // unsafe {
-        //     ffi::clutter_text_set_preedit_string(
-        //         self.as_ref().to_glib_none().0,
-        //         preedit_str.to_glib_none().0,
-        //         preedit_attrs.to_glib_none().0,
-        //         cursor_pos,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_preedit_string(
+    //     &self,
+    //     preedit_str: Option<&str>,
+    //     preedit_attrs: Option<&pango::AttrList>,
+    //     cursor_pos: u32,
+    // ) {
+    //     // unsafe {
+    //     //     ffi::text_set_preedit_string(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         preedit_str.to_glib_none().0,
+    //     //         preedit_attrs.to_glib_none().0,
+    //     //         cursor_pos,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_selectable(&self, selectable: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_selectable(self.as_ref().to_glib_none().0, selectable.to_glib());
+        //     ffi::text_set_selectable(self.as_ref().to_glib_none().0, selectable.to_glib());
         // }
         unimplemented!()
     }
@@ -1380,7 +1394,7 @@ impl<O: Is<Text>> TextExt for O {
         //     None => None,
         // };
         // unsafe {
-        //     ffi::clutter_text_set_selected_text_color(
+        //     ffi::text_set_selected_text_color(
         //         self.as_ref().to_glib_none().0,
         //         color.to_glib_none().0,
         //     );
@@ -1390,13 +1404,13 @@ impl<O: Is<Text>> TextExt for O {
 
     fn set_selection(&self, start_pos: isize, end_pos: isize) {
         // unsafe {
-        //     ffi::clutter_text_set_selection(self.as_ref().to_glib_none().0, start_pos, end_pos);
+        //     ffi::text_set_selection(self.as_ref().to_glib_none().0, start_pos, end_pos);
         // }
     }
 
     fn set_selection_bound(&self, selection_bound: i32) {
         // unsafe {
-        //     ffi::clutter_text_set_selection_bound(self.as_ref().to_glib_none().0, selection_bound);
+        //     ffi::text_set_selection_bound(self.as_ref().to_glib_none().0, selection_bound);
         // }
         unimplemented!()
     }
@@ -1415,7 +1429,7 @@ impl<O: Is<Text>> TextExt for O {
         //     None => None,
         // };
         // unsafe {
-        //     ffi::clutter_text_set_selection_color(
+        //     ffi::text_set_selection_color(
         //         self.as_ref().to_glib_none().0,
         //         color.to_glib_none().0,
         //     );
@@ -1425,7 +1439,7 @@ impl<O: Is<Text>> TextExt for O {
 
     fn set_single_line_mode(&self, single_line: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_single_line_mode(
+        //     ffi::text_set_single_line_mode(
         //         self.as_ref().to_glib_none().0,
         //         single_line.to_glib(),
         //     );
@@ -1435,14 +1449,14 @@ impl<O: Is<Text>> TextExt for O {
 
     fn set_text(&self, text: Option<&str>) {
         // unsafe {
-        //     ffi::clutter_text_set_text(self.as_ref().to_glib_none().0, text.to_glib_none().0);
+        //     ffi::text_set_text(self.as_ref().to_glib_none().0, text.to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn set_use_markup(&self, setting: bool) {
         // unsafe {
-        //     ffi::clutter_text_set_use_markup(self.as_ref().to_glib_none().0, setting.to_glib());
+        //     ffi::text_set_use_markup(self.as_ref().to_glib_none().0, setting.to_glib());
         // }
         unimplemented!()
     }
diff --git a/src/pure/text_buffer.rs b/src/pure/text_buffer.rs
index 4ae064a..a6b08b8 100644
--- a/src/pure/text_buffer.rs
+++ b/src/pure/text_buffer.rs
@@ -12,14 +12,14 @@ impl TextBuffer {
     ///
     /// A new TextBuffer object.
     pub fn new() -> TextBuffer {
-        // unsafe { from_glib_full(ffi::clutter_text_buffer_new()) }
+        // unsafe { from_glib_full(ffi::text_buffer_new()) }
         unimplemented!()
     }
 
     // pub fn with_text(text: Option<&str>) -> TextBuffer {
     //     let text_len = text.len() as isize;
     //     unsafe {
-    //         from_glib_full(ffi::clutter_text_buffer_new_with_text(
+    //         from_glib_full(ffi::text_buffer_new_with_text(
     //             text.to_glib_none().0,
     //             text_len,
     //         ))
@@ -185,14 +185,14 @@ pub trait TextBufferExt: 'static {
 impl<O: Is<TextBuffer>> TextBufferExt for O {
     fn delete_text(&self, position: u32, n_chars: i32) -> u32 {
         // unsafe {
-        //     ffi::clutter_text_buffer_delete_text(self.as_ref().to_glib_none().0, position, n_chars)
+        //     ffi::text_buffer_delete_text(self.as_ref().to_glib_none().0, position, n_chars)
         // }
         unimplemented!()
     }
 
     fn emit_deleted_text(&self, position: u32, n_chars: u32) {
         // unsafe {
-        //     ffi::clutter_text_buffer_emit_deleted_text(
+        //     ffi::text_buffer_emit_deleted_text(
         //         self.as_ref().to_glib_none().0,
         //         position,
         //         n_chars,
@@ -203,7 +203,7 @@ impl<O: Is<TextBuffer>> TextBufferExt for O {
 
     fn emit_inserted_text(&self, position: u32, chars: &str, n_chars: u32) {
         // unsafe {
-        //     ffi::clutter_text_buffer_emit_inserted_text(
+        //     ffi::text_buffer_emit_inserted_text(
         //         self.as_ref().to_glib_none().0,
         //         position,
         //         chars.to_glib_none().0,
@@ -214,23 +214,23 @@ impl<O: Is<TextBuffer>> TextBufferExt for O {
     }
 
     fn get_bytes(&self) -> usize {
-        // unsafe { ffi::clutter_text_buffer_get_bytes(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::text_buffer_get_bytes(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_length(&self) -> u32 {
-        // unsafe { ffi::clutter_text_buffer_get_length(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::text_buffer_get_length(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_max_length(&self) -> i32 {
-        // unsafe { ffi::clutter_text_buffer_get_max_length(self.as_ref().to_glib_none().0) }
+        // unsafe { ffi::text_buffer_get_max_length(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_text(&self) -> Option<String> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_text_buffer_get_text(
+        //     from_glib_none(ffi::text_buffer_get_text(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -239,7 +239,7 @@ impl<O: Is<TextBuffer>> TextBufferExt for O {
 
     fn insert_text(&self, position: u32, chars: &str, n_chars: i32) -> u32 {
         // unsafe {
-        //     ffi::clutter_text_buffer_insert_text(
+        //     ffi::text_buffer_insert_text(
         //         self.as_ref().to_glib_none().0,
         //         position,
         //         chars.to_glib_none().0,
@@ -251,14 +251,14 @@ impl<O: Is<TextBuffer>> TextBufferExt for O {
 
     fn set_max_length(&self, max_length: i32) {
         // unsafe {
-        //     ffi::clutter_text_buffer_set_max_length(self.as_ref().to_glib_none().0, max_length);
+        //     ffi::text_buffer_set_max_length(self.as_ref().to_glib_none().0, max_length);
         // }
         unimplemented!()
     }
 
     fn set_text(&self, chars: &str, n_chars: i32) {
         // unsafe {
-        //     ffi::clutter_text_buffer_set_text(
+        //     ffi::text_buffer_set_text(
         //         self.as_ref().to_glib_none().0,
         //         chars.to_glib_none().0,
         //         n_chars,
diff --git a/src/pure/text_node.rs b/src/pure/text_node.rs
index 5a2e47e..54af27f 100644
--- a/src/pure/text_node.rs
+++ b/src/pure/text_node.rs
@@ -1,48 +1,49 @@
-use crate::{Color};
 use std::fmt;
 
+use crate::foundation::colorspace::Color;
+
 // @extends PaintNode
 pub struct TextNode {
 }
 
 impl TextNode {
-    /// Creates a new `PaintNode` that will paint a `pango::Layout`
-    /// with the given color.
-    ///
-    /// This function takes a reference on the passed `layout`, so it
-    /// is safe to call `gobject::ObjectExt::unref` after it returns.
-    /// ## `layout`
-    /// a `pango::Layout`, or `None`
-    /// ## `color`
-    /// the color used to paint the layout,
-    ///  or `None`
-    ///
-    /// # Returns
-    ///
-    /// the newly created `PaintNode`.
-    ///  Use `PaintNodeExt::unref` when done
-    pub fn new(layout: Option<&pango::Layout>, color: Option<Color>) -> TextNode {
-        // let color = match color {
-        //     Some(value) => {
-        //         let RgbaColor {
-        //             red,
-        //             green,
-        //             blue,
-        //             alpha,
-        //         } = value.into();
-        //         Some(Color::new(red, green, blue, alpha))
-        //     }
-        //     None => None,
-        // };
-        // unsafe {
-        //     PaintNode::from_glib_full(ffi::clutter_text_node_new(
-        //         layout.to_glib_none().0,
-        //         color.to_glib_none().0,
-        //     ))
-        //     .unsafe_cast()
-        // }
-        unimplemented!()
-    }
+    // /// Creates a new `PaintNode` that will paint a `pango::Layout`
+    // /// with the given color.
+    // ///
+    // /// This function takes a reference on the passed `layout`, so it
+    // /// is safe to call `gobject::ObjectExt::unref` after it returns.
+    // /// ## `layout`
+    // /// a `pango::Layout`, or `None`
+    // /// ## `color`
+    // /// the color used to paint the layout,
+    // ///  or `None`
+    // ///
+    // /// # Returns
+    // ///
+    // /// the newly created `PaintNode`.
+    // ///  Use `PaintNodeExt::unref` when done
+    // pub fn new(layout: Option<&pango::Layout>, color: Option<Color>) -> TextNode {
+    //     // let color = match color {
+    //     //     Some(value) => {
+    //     //         let RgbaColor {
+    //     //             red,
+    //     //             green,
+    //     //             blue,
+    //     //             alpha,
+    //     //         } = value.into();
+    //     //         Some(Color::new(red, green, blue, alpha))
+    //     //     }
+    //     //     None => None,
+    //     // };
+    //     // unsafe {
+    //     //     PaintNode::from_glib_full(ffi::text_node_new(
+    //     //         layout.to_glib_none().0,
+    //     //         color.to_glib_none().0,
+    //     //     ))
+    //     //     .unsafe_cast()
+    //     // }
+    //     unimplemented!()
+    // }
 }
 
 impl fmt::Display for TextNode {
diff --git a/src/pure/texture.rs b/src/pure/texture.rs
index c06d3a9..c479238 100644
--- a/src/pure/texture.rs
+++ b/src/pure/texture.rs
@@ -1,7 +1,11 @@
-use super::HandlerId;
-use crate::prelude::*;
 use std::fmt;
 
+use dx::platform::core::PixelFormat;
+
+use crate::prelude::*;
+
+use super::HandlerId;
+
 // TODO: implements atk::ImplementorIface, Scriptable, Animatable, Container
 // @extends Actor
 #[derive(Debug, Clone)]
@@ -36,7 +40,7 @@ pub trait TextureExt: 'static {
 
     fn set_property_pick_with_alpha(&self, pick_with_alpha: bool);
 
-    fn get_property_pixel_format(&self) -> dx::pure::PixelFormat;
+    fn get_property_pixel_format(&self) -> PixelFormat;
 
     fn get_property_repeat_x(&self) -> bool;
 
@@ -154,7 +158,7 @@ impl<O: Is<Texture>> TextureExt for O {
         unimplemented!()
     }
 
-    fn get_property_pixel_format(&self) -> dx::pure::PixelFormat {
+    fn get_property_pixel_format(&self) -> PixelFormat {
         // unsafe {
         //     let mut value = Value::from_type(<dx::pure::PixelFormat as StaticType>::static_type());
         //     gobject_sys::g_object_get_property(
diff --git a/src/pure/texture_node.rs b/src/pure/texture_node.rs
index cdd1e65..e51b61f 100644
--- a/src/pure/texture_node.rs
+++ b/src/pure/texture_node.rs
@@ -1,11 +1,15 @@
-use crate::prelude::*;
-use crate::{Color};
-use super::{ScalingFilter};
 use std::fmt;
 
+use crate::prelude::*;
+
+use dx::platform::core::Texture;
+
+use crate::foundation::colorspace::Color;
+
+use super::ScalingFilter;
+
 // @extends PipelineNode, PaintNode
-pub struct TextureNode {
-}
+pub struct TextureNode {}
 
 impl TextureNode {
     /// Creates a new `PaintNode` that will paint the passed `texture`.
@@ -29,7 +33,7 @@ impl TextureNode {
     ///
     /// the newly created `PaintNode`.
     ///  Use `PaintNodeExt::unref` when done
-    pub fn new<P: Is<dx::pure::Texture>>(
+    pub fn new<P: Is<dx::platform::core::Texture>>(
         texture: &P,
         color: Option<Color>,
         min_filter: ScalingFilter,
@@ -48,7 +52,7 @@ impl TextureNode {
         //     None => None,
         // };
         // unsafe {
-        //     PaintNode::from_glib_full(ffi::clutter_texture_node_new(
+        //     PaintNode::from_glib_full(ffi::texture_node_new(
         //         texture.as_ref().to_glib_none().0,
         //         color.to_glib_none().0,
         //         min_filter.to_glib(),
diff --git a/src/pure/timeline.rs b/src/pure/timeline.rs
index 7df533a..f1757ef 100644
--- a/src/pure/timeline.rs
+++ b/src/pure/timeline.rs
@@ -1,12 +1,168 @@
-use super::{AnimationMode, StepMode, TimelineDirection, HandlerId};
+use std::{borrow::BorrowMut, cell::RefCell, collections::HashMap, fmt};
+
 use crate::prelude::*;
-use crate::Point;
-use std::boxed::Box as Box_;
-use std::fmt;
 
+use crate::foundation::Point;
+
+use super::{AnimationMode, HandlerId, StepMode, TimelineDirection};
+
+#[derive(Default, Debug, Clone)]
+struct TimelineProps {
+    direction: TimelineDirection,
+
+    delay_id: u32,
+
+    // The total length in milliseconds of this timeline
+    duration: u32,
+    delay: u32,
+
+    // The current amount of elapsed time
+    elapsed_time: u32,
+
+    // The elapsed time since the last frame was fired
+    msecs_delta: u32,
+
+    markers_by_name: HashMap<String, TimelineMarker>,
+
+    // Time we last advanced the elapsed time and showed a frame
+    last_frame_time: u32,
+
+    // How many times the timeline should repeat
+    repeat_count: i32,
+
+    // The number of times the timeline has repeated
+    current_repeat: i32,
+
+    // progress_func: ProgressFunc
+    // gpointer progress_data;
+    // GDestroyNotify progress_notify;
+    progress_mode: AnimationMode,
+
+    // step() parameters
+    n_steps: i32,
+    step_mode: StepMode,
+
+    // cubic-bezier() parameters
+    cb_1: Point<f32>,
+    cb_2: Point<f32>,
+    is_playing: bool,
+
+    // If we've just started playing and haven't yet gotten
+    // a tick from the master clock
+    waiting_first_tick: bool,
+    auto_reverse: bool,
+}
+
+#[derive(Debug, Clone, Copy)]
+pub enum MarkerValue {
+    Msecs(u32),
+    Progress(f64),
+}
+
+#[derive(Debug, Clone)]
+pub struct TimelineMarker {
+    name: String,
+    data: MarkerValue,
+}
+
+impl TimelineMarker {
+    pub fn new_time(name: String, msecs: u32) -> Self {
+        Self {
+            name,
+            data: MarkerValue::Msecs(msecs),
+        }
+    }
+
+    pub fn new_progress(name: String, progress: f64) -> Self {
+        let progress = progress.clamp(0.0, 1.0);
+
+        Self {
+            name,
+            data: MarkerValue::Progress(progress),
+        }
+    }
+
+    pub fn is_relative(&self) -> bool {
+        match self.data {
+            MarkerValue::Progress(_) => true,
+            _ => false,
+        }
+    }
+}
+
+// @short_description: A class for time-based events
+// @see_also: #Animation, #Animator, #State
+//
+// #Timeline is a base class for managing time-based event that cause
+//  to redraw a stage, such as animations.
+//
+// Each #Timeline instance has a duration: once a timeline has been
+// started, using timeline_start(), it will emit a signal that can
+// be used to update the state of the actors.
+//
+// It is important to note that #Timeline is not a generic API for
+// calling closures after an interval; each Timeline is tied into the master
+// clock used to drive the frame cycle. If you need to schedule a closure
+// after an interval, see threads_add_timeout() instead.
+//
+// Users of #Timeline should connect to the #Timeline::new-frame
+// signal, which is emitted each time a timeline is advanced during the maste
+// clock iteration. The #Timeline::new-frame signal provides the time
+// elapsed since the beginning of the timeline, in milliseconds. A normalized
+// progress value can be obtained by calling timeline_get_progress().
+// By using timeline_get_delta() it is possible to obtain the wallclock
+// time elapsed since the last emission of the #Timeline::new-frame
+// signal.
+//
+// Initial state can be set up by using the #Timeline::started signal,
+// while final state can be set up by using the #Timeline::stopped
+// signal. The #Timeline guarantees the emission of at least a single
+// #Timeline::new-frame signal, as well as the emission of the
+// #Timeline::completed signal every time the #Timeline reaches
+// its #Timeline:duration.
+//
+// It is possible to connect to specific points in the timeline progress by
+// adding markers using timeline_add_marker_at_time() and connecting
+// to the #Timeline::marker-reached signal.
+//
+// Timelines can be made to loop once they reach the end of their duration, by
+// using timeline_set_repeat_count(); a looping timeline will still
+// emit the #Timeline::completed signal once it reaches the end of its
+// duration at each repeat. If you want to be notified of the end of the last
+// repeat, use the #Timeline::stopped signal.
+//
+// Timelines have a #Timeline:direction: the default direction is
+// %TIMELINE_FORWARD, and goes from 0 to the duration; it is possible
+// to change the direction to %TIMELINE_BACKWARD, and have the timeline
+// go from the duration to 0. The direction can be automatically reversed
+// when reaching completion by using the #Timeline:auto-reverse property.
+//
+// Timelines are used in the  animation framework by classes like
+// #Animation, #Animator, and #State.
+//
+// ## Defining Timelines in Script
+//
+// A #Timeline can be described in #Script like any
+// other object. Additionally, it is possible to define markers directly
+// inside the JSON definition by using the `markers` JSON object member,
+// such as:
+//
+// ```
+// {
+//  "type" : "Timeline",
+//  "duration" : 1000,
+//  "markers" : [
+//    { "name" : "quarter", "time" : 250 },
+//    { "name" : "half-time", "time" : 500 },
+//    { "name" : "three-quarters", "time" : 750 }
+//  ]
+// }
+// ```
 // TODO: @implements Scriptable
 #[derive(Default, Debug, Clone)]
-pub struct Timeline {}
+pub struct Timeline {
+    props: RefCell<TimelineProps>,
+}
 
 impl Timeline {
     /// Creates a new `Timeline` with a duration of `msecs`.
@@ -17,7 +173,7 @@ impl Timeline {
     ///
     /// the newly created `Timeline` instance. Use
     ///  `gobject::ObjectExt::unref` when done using it
-    pub fn new(msecs: u32) -> Timeline {
+    pub fn new(msecs: u32) -> Self {
         Default::default()
     }
 }
@@ -354,7 +510,7 @@ pub trait TimelineExt: 'static {
     /// ## `notify`
     /// a function to be called when the progress function is removed
     ///  or the timeline is disposed
-    fn set_progress_func(&self, func: Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>);
+    fn set_progress_func(&self, func: Option<Box<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>);
 
     /// Sets the progress function using a value from the `AnimationMode`
     /// enumeration. The `mode` cannot be `AnimationMode::CustomMode` or bigger than
@@ -463,8 +619,7 @@ pub trait TimelineExt: 'static {
     ///  timeline.
     fn connect_stopped<F: Fn(&Self, bool) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_auto_reverse_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> HandlerId;
+    fn connect_property_auto_reverse_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
     fn connect_property_delay_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
@@ -472,69 +627,67 @@ pub trait TimelineExt: 'static {
 
     fn connect_property_duration_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_progress_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId;
+    fn connect_property_progress_mode_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
-    fn connect_property_repeat_count_notify<F: Fn(&Self) + 'static>(&self, f: F)
-        -> HandlerId;
+    fn connect_property_repeat_count_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 }
 
 impl<O: Is<Timeline>> TimelineExt for O {
     fn add_marker(&self, marker_name: &str, progress: f64) {
-        // unsafe {
-        //     ffi::clutter_timeline_add_marker(
-        //         self.as_ref().to_glib_none().0,
-        //         marker_name.to_glib_none().0,
-        //         progress,
-        //     );
-        // }
-        unimplemented!()
+        let marker = TimelineMarker::new_progress(marker_name.into(), progress);
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.markers_by_name.insert(marker_name.into(), marker);
     }
 
     fn add_marker_at_time(&self, marker_name: &str, msecs: u32) {
-        // unsafe {
-        //     ffi::clutter_timeline_add_marker_at_time(
-        //         self.as_ref().to_glib_none().0,
-        //         marker_name.to_glib_none().0,
-        //         msecs,
-        //     );
-        // }
-        unimplemented!()
+        // TODO: assert msecs > timeline duration
+        let marker = TimelineMarker::new_time(marker_name.into(), msecs);
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.markers_by_name.insert(marker_name.into(), marker);
     }
 
     fn advance(&self, msecs: u32) {
-        // unsafe {
-        //     ffi::clutter_timeline_advance(self.as_ref().to_glib_none().0, msecs);
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.elapsed_time = msecs.clamp(0, props.duration);
     }
 
     fn advance_to_marker(&self, marker_name: &str) {
-        // unsafe {
-        //     ffi::clutter_timeline_advance_to_marker(
-        //         self.as_ref().to_glib_none().0,
-        //         marker_name.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
+        let marker_name = marker_name.to_string();
+
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        if let Some(marker) = props.markers_by_name.get(&marker_name) {
+            let msecs = match marker.data {
+                MarkerValue::Progress(progress) => {
+                    // is relative
+                    (progress * props.duration as f64).trunc() as u32
+                }
+                MarkerValue::Msecs(msecs) => msecs,
+            };
+
+            self.advance(msecs)
+        }
     }
 
     fn get_auto_reverse(&self) -> bool {
-        // unsafe {
-        //     from_glib(ffi::clutter_timeline_get_auto_reverse(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.auto_reverse
     }
 
     fn get_cubic_bezier_progress(&self) -> Option<(Point<f32>, Point<f32>)> {
         // unsafe {
         //     let mut c_1 = Point::uninitialized();
         //     let mut c_2 = Point::uninitialized();
-        //     let ret = from_glib(ffi::clutter_timeline_get_cubic_bezier_progress(
+        //     let ret = from_glib(ffi::timeline_get_cubic_bezier_progress(
         //         self.as_ref().to_glib_none().0,
         //         c_1.to_glib_none_mut().0,
         //         c_2.to_glib_none_mut().0,
@@ -549,68 +702,89 @@ impl<O: Is<Timeline>> TimelineExt for O {
     }
 
     fn get_current_repeat(&self) -> i32 {
-        // unsafe { ffi::clutter_timeline_get_current_repeat(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.current_repeat
     }
 
     fn get_delay(&self) -> u32 {
-        // unsafe { ffi::clutter_timeline_get_delay(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.delay
     }
 
     fn get_delta(&self) -> u32 {
-        // unsafe { ffi::clutter_timeline_get_delta(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        if self.is_playing() {
+            let timeline = self.as_ref();
+            let props = timeline.props.borrow();
+
+            return props.msecs_delta;
+        }
+
+        0
     }
 
     fn get_direction(&self) -> TimelineDirection {
-        // unsafe {
-        //     from_glib(ffi::clutter_timeline_get_direction(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.direction
     }
 
     fn get_duration(&self) -> u32 {
-        // unsafe { ffi::clutter_timeline_get_duration(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.duration
     }
 
     fn get_duration_hint(&self) -> i64 {
-        // unsafe { ffi::clutter_timeline_get_duration_hint(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        if props.repeat_count == 0 {
+            props.duration as i64
+        } else if props.repeat_count < 0 {
+            i64::MAX
+        } else {
+            props.repeat_count as i64 * props.duration as i64
+        }
     }
 
     fn get_elapsed_time(&self) -> u32 {
-        // unsafe { ffi::clutter_timeline_get_elapsed_time(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.elapsed_time
     }
 
     fn get_progress(&self) -> f64 {
-        // unsafe { ffi::clutter_timeline_get_progress(self.as_ref().to_glib_none().0) }
+        // TODO: here functional with Easing functions
+        // unsafe { ffi::timeline_get_progress(self.as_ref().to_glib_none().0) }
         unimplemented!()
     }
 
     fn get_progress_mode(&self) -> AnimationMode {
-        // unsafe {
-        //     from_glib(ffi::clutter_timeline_get_progress_mode(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.progress_mode
     }
 
     fn get_repeat_count(&self) -> i32 {
-        // unsafe { ffi::clutter_timeline_get_repeat_count(self.as_ref().to_glib_none().0) }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.repeat_count
     }
 
     fn get_step_progress(&self) -> Option<(i32, StepMode)> {
         // unsafe {
         //     let mut n_steps = mem::MaybeUninit::uninit();
         //     let mut step_mode = mem::MaybeUninit::uninit();
-        //     let ret = from_glib(ffi::clutter_timeline_get_step_progress(
+        //     let ret = from_glib(ffi::timeline_get_step_progress(
         //         self.as_ref().to_glib_none().0,
         //         n_steps.as_mut_ptr(),
         //         step_mode.as_mut_ptr(),
@@ -627,111 +801,151 @@ impl<O: Is<Timeline>> TimelineExt for O {
     }
 
     fn has_marker(&self, marker_name: &str) -> bool {
-        // unsafe {
-        //     from_glib(ffi::clutter_timeline_has_marker(
-        //         self.as_ref().to_glib_none().0,
-        //         marker_name.to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        let marker_name = marker_name.to_string();
+        props.markers_by_name.contains_key(&marker_name)
     }
 
     fn is_playing(&self) -> bool {
-        // unsafe {
-        //     from_glib(ffi::clutter_timeline_is_playing(
-        //         self.as_ref().to_glib_none().0,
-        //     ))
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        props.is_playing
     }
 
     fn list_markers(&self, msecs: i32) -> Vec<String> {
-        // unsafe {
-        //     let mut n_markers = mem::MaybeUninit::uninit();
-        //     let ret = FromGlibContainer::from_glib_full_num(
-        //         ffi::clutter_timeline_list_markers(
-        //             self.as_ref().to_glib_none().0,
-        //             msecs,
-        //             n_markers.as_mut_ptr(),
-        //         ),
-        //         n_markers.assume_init() as usize,
-        //     );
-        //     ret
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        if msecs < 0 {
+            props
+                .markers_by_name
+                .keys()
+                .cloned()
+                .collect::<Vec<String>>()
+        } else {
+            props
+                .markers_by_name
+                .iter()
+                .filter(|(_, marker)| {
+                    let marker_msecs = match marker.data {
+                        MarkerValue::Progress(progress) => {
+                            (progress * props.duration as f64).trunc() as u32
+                        }
+                        MarkerValue::Msecs(msecs) => msecs,
+                    };
+                    marker_msecs == msecs as u32
+                })
+                .map(|(key, _)| key.clone())
+                .collect::<Vec<String>>()
+        }
     }
 
     fn pause(&self) {
-        // unsafe {
-        //     ffi::clutter_timeline_pause(self.as_ref().to_glib_none().0);
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        if props.delay_id == 0 && !props.is_playing {
+            return;
+        }
+
+        props.delay_id = 0;
+        props.msecs_delta = 0;
+
+        // set_is_playing false
+        let is_paying = false;
+        {
+            if props.is_playing == is_paying {
+                return;
+            } else {
+                props.is_playing = is_paying;
+            }
+
+            // let master_clock = MasterClock::get_default();
+
+            // if props.is_playing {
+            //     props.waiting_first_tick = true;
+            //     props.current_repeat = 0;
+            //     master_clock.add_timeline(self);
+            // } else {
+            //     master_clock.remove_timeline(self);
+            // }
+            unimplemented!()
+        }
     }
 
     fn remove_marker(&self, marker_name: &str) {
-        // unsafe {
-        //     ffi::clutter_timeline_remove_marker(
-        //         self.as_ref().to_glib_none().0,
-        //         marker_name.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.markers_by_name.remove(&marker_name.to_string());
     }
 
     fn rewind(&self) {
-        // unsafe {
-        //     ffi::clutter_timeline_rewind(self.as_ref().to_glib_none().0);
-        // }
+        let timeline = self.as_ref();
+        let props = timeline.props.borrow();
+
+        if props.direction == TimelineDirection::Forward {
+            timeline.advance(0);
+        } else {
+            timeline.advance(props.duration);
+        }
     }
 
     fn set_auto_reverse(&self, reverse: bool) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_auto_reverse(
-        //         self.as_ref().to_glib_none().0,
-        //         reverse.to_glib(),
-        //     );
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.auto_reverse = reverse;
     }
 
     fn set_cubic_bezier_progress(&self, c_1: &Point<f32>, c_2: &Point<f32>) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_cubic_bezier_progress(
-        //         self.as_ref().to_glib_none().0,
-        //         c_1.to_glib_none().0,
-        //         c_2.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.cb_1 = *c_1;
+        props.cb_2 = *c_2;
+
+        // ensure range on X coordinate
+
+        props.cb_1.x = props.cb_1.x.clamp(0.0, 1.0);
+        props.cb_2.x = props.cb_2.x.clamp(0.0, 1.0);
+
+        self.set_progress_mode(AnimationMode::CubicBezier);
     }
 
     fn set_delay(&self, msecs: u32) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_delay(self.as_ref().to_glib_none().0, msecs);
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.delay = msecs;
     }
 
     fn set_direction(&self, direction: TimelineDirection) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_direction(
-        //         self.as_ref().to_glib_none().0,
-        //         direction.to_glib(),
-        //     );
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        if props.direction != direction {
+            props.direction = direction;
+
+            if props.elapsed_time == 0 {
+                props.elapsed_time = props.duration;
+            }
+        }
     }
 
     fn set_duration(&self, msecs: u32) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_duration(self.as_ref().to_glib_none().0, msecs);
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.duration = msecs;
     }
 
-    fn set_progress_func(&self, func: Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>) {
-        // let func_data: Box_<Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
-        //     Box_::new(func);
+    fn set_progress_func(&self, func: Option<Box<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>) {
+        // let func_data: Box<Option<Box<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
+        //     Box::new(func);
         // unsafe extern "C" fn func_func(
         //     timeline: *mut ffi::Timeline,
         //     elapsed: libc::c_double,
@@ -739,7 +953,7 @@ impl<O: Is<Timeline>> TimelineExt for O {
         //     user_data: glib_sys::gpointer,
         // ) -> libc::c_double {
         //     let timeline = from_glib_borrow(timeline);
-        //     let callback: &Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>> =
+        //     let callback: &Option<Box<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>> =
         //         &*(user_data as *mut _);
         //     let res = if let Some(ref callback) = *callback {
         //         callback(&timeline, elapsed, total)
@@ -754,17 +968,17 @@ impl<O: Is<Timeline>> TimelineExt for O {
         //     None
         // };
         // unsafe extern "C" fn notify_func(data: glib_sys::gpointer) {
-        //     let _callback: Box_<Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
-        //         Box_::from_raw(data as *mut _);
+        //     let _callback: Box<Option<Box<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
+        //         Box::from_raw(data as *mut _);
         // }
         // let destroy_call3 = Some(notify_func as _);
-        // let super_callback0: Box_<Option<Box_<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
+        // let super_callback0: Box<Option<Box<dyn Fn(&Timeline, f64, f64) -> f64 + 'static>>> =
         //     func_data;
         // unsafe {
-        //     ffi::clutter_timeline_set_progress_func(
+        //     ffi::timeline_set_progress_func(
         //         self.as_ref().to_glib_none().0,
         //         func,
-        //         Box_::into_raw(super_callback0) as *mut _,
+        //         Box::into_raw(super_callback0) as *mut _,
         //         destroy_call3,
         //     );
         // }
@@ -772,46 +986,110 @@ impl<O: Is<Timeline>> TimelineExt for O {
     }
 
     fn set_progress_mode(&self, mode: AnimationMode) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_progress_mode(self.as_ref().to_glib_none().0, mode.to_glib());
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        props.progress_mode = mode;
     }
 
     fn set_repeat_count(&self, count: i32) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_repeat_count(self.as_ref().to_glib_none().0, count);
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        if count < 0 {
+            return;
+        }
+
+        props.repeat_count = count;
     }
 
     fn set_step_progress(&self, n_steps: i32, step_mode: StepMode) {
-        // unsafe {
-        //     ffi::clutter_timeline_set_step_progress(
-        //         self.as_ref().to_glib_none().0,
-        //         n_steps,
-        //         step_mode.to_glib(),
-        //     );
-        // }
-        unimplemented!()
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        if props.progress_mode == AnimationMode::Steps
+            && props.n_steps == n_steps
+            && props.step_mode == step_mode
+        {
+            return;
+        }
+
+        props.n_steps = n_steps;
+        props.step_mode = step_mode;
+        self.set_progress_mode(AnimationMode::Steps);
     }
 
     fn skip(&self, msecs: u32) {
-        // unsafe {
-        //     ffi::clutter_timeline_skip(self.as_ref().to_glib_none().0, msecs);
-        // }
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        if props.direction == TimelineDirection::Forward {
+            props.elapsed_time += msecs;
+
+            if props.elapsed_time > props.duration {
+                props.elapsed_time = 1;
+            }
+        } else {
+            // Backward
+            props.elapsed_time -= msecs;
+
+            if props.elapsed_time < 1 {
+                props.elapsed_time = props.duration - 1;
+            }
+        }
+
+        props.msecs_delta = 0;
     }
 
     fn start(&self) {
-        // unsafe {
-        //     ffi::clutter_timeline_start(self.as_ref().to_glib_none().0);
-        // }
+        let timeline = self.as_ref();
+        let mut props = timeline.props.borrow_mut();
+
+        if props.delay_id != 0 || props.is_playing {
+            return;
+        }
+
+        if props.duration == 0 {
+            return;
+        }
+
+        if props.delay != 0 {
+            // props.delay_id = Threads::add_timeout(props.delay, delay_timeout_func, timeline)
+            unimplemented!()
+        } else {
+            props.msecs_delta = 0;
+            // set_is_playing true
+
+            let is_paying = true;
+            {
+                if props.is_playing == is_paying {
+                    return;
+                } else {
+                    props.is_playing = is_paying;
+                }
+
+                // let master_clock = MasterClock::get_default();
+
+                // if props.is_playing {
+                //     props.waiting_first_tick = true;
+                //     props.current_repeat = 0;
+                //     master_clock.add_timeline(self);
+                // } else {
+                //     master_clock.remove_timeline(self);
+                // }
+                unimplemented!()
+            }
+        }
     }
 
     fn stop(&self) {
-        // unsafe {
-        //     ffi::clutter_timeline_stop(self.as_ref().to_glib_none().0);
-        // }
+        // let timeline = self.as_ref();
+        // let mut props = timeline.props.borrow_mut();
+
+        // let was_playing = props.is_playing; // neded for emit, but we dont
+
+        self.pause();
+        self.rewind();
     }
 
     fn connect_completed<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
@@ -838,10 +1116,7 @@ impl<O: Is<Timeline>> TimelineExt for O {
         unimplemented!()
     }
 
-    fn connect_property_auto_reverse_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_auto_reverse_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 
@@ -857,17 +1132,11 @@ impl<O: Is<Timeline>> TimelineExt for O {
         unimplemented!()
     }
 
-    fn connect_property_progress_mode_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_progress_mode_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 
-    fn connect_property_repeat_count_notify<F: Fn(&Self) + 'static>(
-        &self,
-        f: F,
-    ) -> HandlerId {
+    fn connect_property_repeat_count_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
     }
 }
diff --git a/src/pure/transition.rs b/src/pure/transition.rs
index 3b67e69..0d357a6 100644
--- a/src/pure/transition.rs
+++ b/src/pure/transition.rs
@@ -1,11 +1,23 @@
-use super::{Animatable, HandlerId, Interval};
-use crate::prelude::*;
+#![allow(unused_imports)]
 use std::fmt;
 
+use crate::prelude::*;
+
+use super::{Animatable, HandlerId, Interval, Timeline};
+
 // TODO: @implements Scriptable
 // @extends Timeline
 #[derive(Debug, Clone)]
-pub struct Transition {}
+pub struct Transition {
+    // public
+
+    // private
+    interval: Interval,
+    animatable: Animatable,
+    remove_on_complete: bool,
+
+    parent_instance: Timeline,
+}
 
 impl Object for Transition {}
 impl Is<Transition> for Transition {}
@@ -62,23 +74,23 @@ pub trait TransitionExt: 'static {
 
     //fn set_from(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets the initial value of the transition.
-    ///
-    /// This is a convenience function that will either create the
-    /// `Interval` used by `self`, or will update it if
-    /// the `Transition:interval` is already set.
-    ///
-    /// This function will copy the contents of `value`, so it is
-    /// safe to call `gobject::Value::unset` after it returns.
-    ///
-    /// If `self` already has a `Transition:interval` set,
-    /// then `value` must hold the same type, or a transformable type,
-    /// as the interval's `Interval:value-type` property.
-    ///
-    /// This function is meant to be used by language bindings.
-    /// ## `value`
-    /// a `gobject::Value` with the initial value of the transition
-    fn set_from_value(&self, value: &glib::Value);
+    // /// Sets the initial value of the transition.
+    // ///
+    // /// This is a convenience function that will either create the
+    // /// `Interval` used by `self`, or will update it if
+    // /// the `Transition:interval` is already set.
+    // ///
+    // /// This function will copy the contents of `value`, so it is
+    // /// safe to call `gobject::Value::unset` after it returns.
+    // ///
+    // /// If `self` already has a `Transition:interval` set,
+    // /// then `value` must hold the same type, or a transformable type,
+    // /// as the interval's `Interval:value-type` property.
+    // ///
+    // /// This function is meant to be used by language bindings.
+    // /// ## `value`
+    // /// a `gobject::Value` with the initial value of the transition
+    // fn set_from_value(&self, value: &glib::Value);
 
     /// Sets the `Transition:interval` property using `interval`.
     ///
@@ -97,23 +109,23 @@ pub trait TransitionExt: 'static {
 
     //fn set_to(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
 
-    /// Sets the final value of the transition.
-    ///
-    /// This is a convenience function that will either create the
-    /// `Interval` used by `self`, or will update it if
-    /// the `Transition:interval` is already set.
-    ///
-    /// This function will copy the contents of `value`, so it is
-    /// safe to call `gobject::Value::unset` after it returns.
-    ///
-    /// If `self` already has a `Transition:interval` set,
-    /// then `value` must hold the same type, or a transformable type,
-    /// as the interval's `Interval:value-type` property.
-    ///
-    /// This function is meant to be used by language bindings.
-    /// ## `value`
-    /// a `gobject::Value` with the final value of the transition
-    fn set_to_value(&self, value: &glib::Value);
+    // /// Sets the final value of the transition.
+    // ///
+    // /// This is a convenience function that will either create the
+    // /// `Interval` used by `self`, or will update it if
+    // /// the `Transition:interval` is already set.
+    // ///
+    // /// This function will copy the contents of `value`, so it is
+    // /// safe to call `gobject::Value::unset` after it returns.
+    // ///
+    // /// If `self` already has a `Transition:interval` set,
+    // /// then `value` must hold the same type, or a transformable type,
+    // /// as the interval's `Interval:value-type` property.
+    // ///
+    // /// This function is meant to be used by language bindings.
+    // /// ## `value`
+    // /// a `gobject::Value` with the final value of the transition
+    // fn set_to_value(&self, value: &glib::Value);
 
     fn connect_property_animatable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId;
 
@@ -126,7 +138,7 @@ pub trait TransitionExt: 'static {
 impl<O: Is<Transition>> TransitionExt for O {
     fn get_animatable(&self) -> Option<Animatable> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_transition_get_animatable(
+        //     from_glib_none(ffi::transition_get_animatable(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -135,7 +147,7 @@ impl<O: Is<Transition>> TransitionExt for O {
 
     fn get_interval(&self) -> Option<Interval> {
         // unsafe {
-        //     from_glib_none(ffi::clutter_transition_get_interval(
+        //     from_glib_none(ffi::transition_get_interval(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -144,7 +156,7 @@ impl<O: Is<Transition>> TransitionExt for O {
 
     fn get_remove_on_complete(&self) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_transition_get_remove_on_complete(
+        //     from_glib(ffi::transition_get_remove_on_complete(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -153,7 +165,7 @@ impl<O: Is<Transition>> TransitionExt for O {
 
     fn set_animatable<P: Is<Animatable>>(&self, animatable: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_transition_set_animatable(
+        //     ffi::transition_set_animatable(
         //         self.as_ref().to_glib_none().0,
         //         animatable.map(|p| p.as_ref()).to_glib_none().0,
         //     );
@@ -162,22 +174,22 @@ impl<O: Is<Transition>> TransitionExt for O {
     }
 
     //fn set_from(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_transition_set_from() }
+    //    unsafe { TODO: call sys:transition_set_from() }
     //}
 
-    fn set_from_value(&self, value: &glib::Value) {
-        // unsafe {
-        //     ffi::clutter_transition_set_from_value(
-        //         self.as_ref().to_glib_none().0,
-        //         value.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_from_value(&self, value: &glib::Value) {
+    //     // unsafe {
+    //     //     ffi::transition_set_from_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         value.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn set_interval<P: Is<Interval>>(&self, interval: Option<&P>) {
         // unsafe {
-        //     ffi::clutter_transition_set_interval(
+        //     ffi::transition_set_interval(
         //         self.as_ref().to_glib_none().0,
         //         interval.map(|p| p.as_ref()).to_glib_none().0,
         //     );
@@ -187,7 +199,7 @@ impl<O: Is<Transition>> TransitionExt for O {
 
     fn set_remove_on_complete(&self, remove_complete: bool) {
         // unsafe {
-        //     ffi::clutter_transition_set_remove_on_complete(
+        //     ffi::transition_set_remove_on_complete(
         //         self.as_ref().to_glib_none().0,
         //         remove_complete.to_glib(),
         //     );
@@ -196,18 +208,18 @@ impl<O: Is<Transition>> TransitionExt for O {
     }
 
     //fn set_to(&self, value_type: glib::types::Type, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
-    //    unsafe { TODO: call clutter_sys:clutter_transition_set_to() }
+    //    unsafe { TODO: call sys:transition_set_to() }
     //}
 
-    fn set_to_value(&self, value: &glib::Value) {
-        // unsafe {
-        //     ffi::clutter_transition_set_to_value(
-        //         self.as_ref().to_glib_none().0,
-        //         value.to_glib_none().0,
-        //     );
-        // }
-        unimplemented!()
-    }
+    // fn set_to_value(&self, value: &glib::Value) {
+    //     // unsafe {
+    //     //     ffi::transition_set_to_value(
+    //     //         self.as_ref().to_glib_none().0,
+    //     //         value.to_glib_none().0,
+    //     //     );
+    //     // }
+    //     unimplemented!()
+    // }
 
     fn connect_property_animatable_notify<F: Fn(&Self) + 'static>(&self, f: F) -> HandlerId {
         unimplemented!()
diff --git a/src/pure/transition_group.rs b/src/pure/transition_group.rs
index 75b94d5..5aa2067 100644
--- a/src/pure/transition_group.rs
+++ b/src/pure/transition_group.rs
@@ -16,7 +16,7 @@ impl TransitionGroup {
     ///  `gobject::ObjectExt::unref` when done to deallocate the resources it
     ///  uses
     pub fn new() -> TransitionGroup {
-        // unsafe { Transition::from_glib_full(ffi::clutter_transition_group_new()).unsafe_cast() }
+        // unsafe { Transition::from_glib_full(ffi::transition_group_new()).unsafe_cast() }
         unimplemented!()
     }
 }
@@ -62,7 +62,7 @@ pub trait TransitionGroupExt: 'static {
 impl<O: Is<TransitionGroup>> TransitionGroupExt for O {
     fn add_transition<P: Is<Transition>>(&self, transition: &P) {
         // unsafe {
-        //     ffi::clutter_transition_group_add_transition(
+        //     ffi::transition_group_add_transition(
         //         self.as_ref().to_glib_none().0,
         //         transition.as_ref().to_glib_none().0,
         //     );
@@ -72,14 +72,14 @@ impl<O: Is<TransitionGroup>> TransitionGroupExt for O {
 
     fn remove_all(&self) {
         // unsafe {
-        //     ffi::clutter_transition_group_remove_all(self.as_ref().to_glib_none().0);
+        //     ffi::transition_group_remove_all(self.as_ref().to_glib_none().0);
         // }
         unimplemented!()
     }
 
     fn remove_transition<P: Is<Transition>>(&self, transition: &P) {
         // unsafe {
-        //     ffi::clutter_transition_group_remove_transition(
+        //     ffi::transition_group_remove_transition(
         //         self.as_ref().to_glib_none().0,
         //         transition.as_ref().to_glib_none().0,
         //     );
diff --git a/src/pure/units.rs b/src/pure/units.rs
index 4336763..d5395de 100644
--- a/src/pure/units.rs
+++ b/src/pure/units.rs
@@ -11,7 +11,7 @@ impl Units {
     ///
     /// a unit type
     pub fn get_unit_type(&self) -> UnitType {
-        // unsafe { from_glib(ffi::clutter_units_get_unit_type(self.to_glib_none().0)) }
+        // unsafe { from_glib(ffi::units_get_unit_type(self.to_glib_none().0)) }
         unimplemented!()
     }
 
@@ -21,7 +21,7 @@ impl Units {
     ///
     /// the value stored inside a `Units`
     pub fn get_unit_value(&self) -> f32 {
-        // unsafe { ffi::clutter_units_get_unit_value(self.to_glib_none().0) }
+        // unsafe { ffi::units_get_unit_value(self.to_glib_none().0) }
         unimplemented!()
     }
 
@@ -31,7 +31,7 @@ impl Units {
     ///
     /// the value in pixels
     pub fn in_pixels(&mut self) -> f32 {
-        // unsafe { ffi::clutter_units_to_pixels(self.to_glib_none_mut().0) }
+        // unsafe { ffi::units_to_pixels(self.to_glib_none_mut().0) }
         unimplemented!()
     }
 
@@ -49,7 +49,7 @@ impl Units {
     // /// a newly allocated string containing the encoded
     // ///  `Units` value. Use `g_free` to free the string
     // fn to_string(&self) -> String {
-    //     // unsafe { from_glib_full(ffi::clutter_units_to_string(self.to_glib_none().0)) }
+    //     // unsafe { from_glib_full(ffi::units_to_string(self.to_glib_none().0)) }
     //     unimplemented!()
     // }
 
@@ -61,7 +61,7 @@ impl Units {
     pub fn from_cm(cm: f32) -> Units {
         // unsafe {
         //     let mut units = Units::uninitialized();
-        //     ffi::clutter_units_from_cm(units.to_glib_none_mut().0, cm);
+        //     ffi::units_from_cm(units.to_glib_none_mut().0, cm);
         //     units
         // }
         unimplemented!()
@@ -76,7 +76,7 @@ impl Units {
     pub fn from_em(em: f32) -> Units {
         // unsafe {
         //     let mut units = Units::uninitialized();
-        //     ffi::clutter_units_from_em(units.to_glib_none_mut().0, em);
+        //     ffi::units_from_em(units.to_glib_none_mut().0, em);
         //     units
         // }
         unimplemented!()
@@ -92,7 +92,7 @@ impl Units {
     pub fn from_em_for_font(font_name: Option<&str>, em: f32) -> Units {
         // unsafe {
         //     let mut units = Units::uninitialized();
-        //     ffi::clutter_units_from_em_for_font(
+        //     ffi::units_from_em_for_font(
         //         units.to_glib_none_mut().0,
         //         font_name.to_glib_none().0,
         //         em,
@@ -110,7 +110,7 @@ impl Units {
     pub fn from_mm(mm: f32) -> Units {
         // unsafe {
         //     let mut units = Units::uninitialized();
-        //     ffi::clutter_units_from_mm(units.to_glib_none_mut().0, mm);
+        //     ffi::units_from_mm(units.to_glib_none_mut().0, mm);
         //     units
         // }
         unimplemented!()
@@ -124,7 +124,7 @@ impl Units {
     pub fn from_pixels(px: i32) -> Units {
         // unsafe {
         //     let mut units = Units::uninitialized();
-        //     ffi::clutter_units_from_pixels(units.to_glib_none_mut().0, px);
+        //     ffi::units_from_pixels(units.to_glib_none_mut().0, px);
         //     units
         // }
         unimplemented!()
@@ -138,7 +138,7 @@ impl Units {
     pub fn from_pt(pt: f32) -> Units {
         // unsafe {
         //     let mut units = Units::uninitialized();
-        //     ffi::clutter_units_from_pt(units.to_glib_none_mut().0, pt);
+        //     ffi::units_from_pt(units.to_glib_none_mut().0, pt);
         //     units
         // }
         unimplemented!()
@@ -192,7 +192,7 @@ impl Units {
     pub fn from_string(str: &str) -> Option<Units> {
         // unsafe {
         //     let mut units = Units::uninitialized();
-        //     let ret = from_glib(ffi::clutter_units_from_string(
+        //     let ret = from_glib(ffi::units_from_string(
         //         units.to_glib_none_mut().0,
         //         str.to_glib_none().0,
         //     ));
diff --git a/src/pure/vertex.rs b/src/pure/vertex.rs
index 8d274e1..84dac0b 100644
--- a/src/pure/vertex.rs
+++ b/src/pure/vertex.rs
@@ -13,7 +13,7 @@ impl Vertex {
     /// the newly allocated `Vertex`.
     ///  Use `Vertex::free` to free its resources
     pub fn alloc() -> Vertex {
-        // unsafe { from_glib_full(ffi::clutter_vertex_alloc()) }
+        // unsafe { from_glib_full(ffi::vertex_alloc()) }
         unimplemented!()
     }
 
@@ -38,7 +38,7 @@ impl Vertex {
     /// the newly allocated `Vertex`.
     ///  Use `Vertex::free` to free the resources
     pub fn new(x: f32, y: f32, z: f32) -> Vertex {
-        // unsafe { from_glib_full(ffi::clutter_vertex_new(x, y, z)) }
+        // unsafe { from_glib_full(ffi::vertex_new(x, y, z)) }
         unimplemented!()
     }
 
@@ -51,7 +51,7 @@ impl Vertex {
     /// `true` if the passed `Vertex` are equal
     fn equal(&self, vertex_b: &Vertex) -> bool {
         // unsafe {
-        //     from_glib(ffi::clutter_vertex_equal(
+        //     from_glib(ffi::vertex_equal(
         //         self.to_glib_none().0,
         //         vertex_b.to_glib_none().0,
         //     ))
@@ -71,7 +71,7 @@ impl Vertex {
     ///
     /// the initialized `Vertex`
     pub fn init(&mut self, x: f32, y: f32, z: f32) -> Option<Vertex> {
-        // unsafe { from_glib_none(ffi::clutter_vertex_init(self.to_glib_none_mut().0, x, y, z)) }
+        // unsafe { from_glib_none(ffi::vertex_init(self.to_glib_none_mut().0, x, y, z)) }
         unimplemented!()
     }
 }
diff --git a/src/pure/zoom_action.rs b/src/pure/zoom_action.rs
index cd150ef..99d84fb 100644
--- a/src/pure/zoom_action.rs
+++ b/src/pure/zoom_action.rs
@@ -1,8 +1,11 @@
-use super::{Actor, HandlerId, ZoomAxis};
-use crate::prelude::*;
-use crate::Point;
 use std::fmt;
 
+use crate::prelude::*;
+
+use crate::foundation::Point;
+
+use super::{Actor, HandlerId, ZoomAxis};
+
 // @extends GestureAction, Action, ActorMeta
 #[derive(Default, Debug, Clone)]
 pub struct ZoomAction {}
@@ -14,7 +17,7 @@ impl ZoomAction {
     ///
     /// the newly created `ZoomAction`
     pub fn new() -> ZoomAction {
-        // unsafe { Action::from_glib_none(ffi::clutter_zoom_action_new()).unsafe_cast() }
+        // unsafe { Action::from_glib_none(ffi::zoom_action_new()).unsafe_cast() }
         unimplemented!()
     }
 }
@@ -88,7 +91,7 @@ impl<O: Is<ZoomAction>> ZoomActionExt for O {
     fn get_focal_point(&self) -> Point<f32> {
         // unsafe {
         //     let mut point = Point::uninitialized();
-        //     ffi::clutter_zoom_action_get_focal_point(
+        //     ffi::zoom_action_get_focal_point(
         //         self.as_ref().to_glib_none().0,
         //         point.to_glib_none_mut().0,
         //     );
@@ -100,7 +103,7 @@ impl<O: Is<ZoomAction>> ZoomActionExt for O {
     fn get_transformed_focal_point(&self) -> Point<f32> {
         // unsafe {
         //     let mut point = Point::uninitialized();
-        //     ffi::clutter_zoom_action_get_transformed_focal_point(
+        //     ffi::zoom_action_get_transformed_focal_point(
         //         self.as_ref().to_glib_none().0,
         //         point.to_glib_none_mut().0,
         //     );
@@ -111,7 +114,7 @@ impl<O: Is<ZoomAction>> ZoomActionExt for O {
 
     fn get_zoom_axis(&self) -> ZoomAxis {
         // unsafe {
-        //     from_glib(ffi::clutter_zoom_action_get_zoom_axis(
+        //     from_glib(ffi::zoom_action_get_zoom_axis(
         //         self.as_ref().to_glib_none().0,
         //     ))
         // }
@@ -120,7 +123,7 @@ impl<O: Is<ZoomAction>> ZoomActionExt for O {
 
     fn set_zoom_axis(&self, axis: ZoomAxis) {
         // unsafe {
-        //     ffi::clutter_zoom_action_set_zoom_axis(self.as_ref().to_glib_none().0, axis.to_glib());
+        //     ffi::zoom_action_set_zoom_axis(self.as_ref().to_glib_none().0, axis.to_glib());
         // }
         unimplemented!()
     }
diff --git a/src/rt.rs b/src/rt.rs
index da5c62a..13da257 100644
--- a/src/rt.rs
+++ b/src/rt.rs
@@ -1,3 +1,4 @@
+#![allow(unused_imports)]
 #![allow(clippy::missing_safety_doc)]
 
 use std::cell::Cell;
@@ -66,7 +67,7 @@ pub unsafe fn set_initialized() {
 pub fn init() {
     assert_not_initialized!();
     unsafe {
-        ffi::clutter_init(ptr::null_mut(), ptr::null_mut());
+        // ffi::init(ptr::null_mut(), ptr::null_mut());
         set_initialized();
     }
 }
@@ -74,14 +75,14 @@ pub fn init() {
 pub fn run() {
     assert_initialized_main_thread!();
     unsafe {
-        ffi::clutter_main();
+        // ffi::main();
         set_initialized();
     }
 }
 
 pub fn quit() {
     assert_initialized_main_thread!();
-    unsafe {
-        ffi::clutter_main_quit();
-    }
+    // unsafe {
+    //     ffi::main_quit();
+    // }
 }
diff --git a/src/runtime/lottie/composition.rs b/src/runtime/lottie/composition.rs
index 3cbe958..12e81ae 100644
--- a/src/runtime/lottie/composition.rs
+++ b/src/runtime/lottie/composition.rs
@@ -1,7 +1,8 @@
-use crate::Rect;
 use bytes::Bytes;
 use std::{collections::HashMap, fmt, time::Duration};
 
+use crate::foundation::Rect;
+
 use super::{
     model::{layer::Layer, Font, FontCharacter, Marker},
     LottieImageAsset,
diff --git a/src/runtime/lottie/lottie_drawable.rs b/src/runtime/lottie/lottie_drawable.rs
index bd212c5..978a168 100644
--- a/src/runtime/lottie/lottie_drawable.rs
+++ b/src/runtime/lottie/lottie_drawable.rs
@@ -1,7 +1,9 @@
-use crate::{Canvas, Pattern, Rect, Size};
+// use crate::{Canvas, Pattern};
 // use dx::Matrix; // not available in wasm
 // use crate::Image; // not available in wasm
-use primitives::CanvasContext;
+use primitives::prelude::CanvasContext;
+
+use crate::foundation::{Rect, Size};
 
 use super::{
     model::{layer::CompositionLayer, KeyPath},
@@ -92,7 +94,7 @@ impl LottieDrawable {
 
     // )))
     // should add `fit` and `alignment`
-    pub fn draw(&self, canvas: Canvas, rect: Rect<f64>) {
-        unimplemented!()
-    }
+    // pub fn draw(&self, canvas: Canvas, rect: Rect<f64>) {
+    //     unimplemented!()
+    // }
 }
diff --git a/src/runtime/lottie/mod.rs b/src/runtime/lottie/mod.rs
index 376201c..0fe0ab0 100644
--- a/src/runtime/lottie/mod.rs
+++ b/src/runtime/lottie/mod.rs
@@ -4,6 +4,7 @@
 #![allow(clippy::new_without_default)]
 
 use crate::prelude::*;
+use ruex::foundation::patterns::builder::Builder;
 use bytes::Bytes;
 use ruex::prelude::*;
 use std::{cell::RefCell, fs::File, rc::Rc};
diff --git a/src/runtime/lottie/model/document_data.rs b/src/runtime/lottie/model/document_data.rs
index 22b5d4d..da083b3 100644
--- a/src/runtime/lottie/model/document_data.rs
+++ b/src/runtime/lottie/model/document_data.rs
@@ -1,5 +1,5 @@
 #![allow(clippy::clippy::too_many_arguments)]
-use crate::Color;
+use crate::foundation::colorspace::Color;
 
 #[derive(PartialEq)]
 pub enum Justification {
diff --git a/src/runtime/lottie/model/layer/composition_layer.rs b/src/runtime/lottie/model/layer/composition_layer.rs
index 7c373d6..8805b31 100644
--- a/src/runtime/lottie/model/layer/composition_layer.rs
+++ b/src/runtime/lottie/model/layer/composition_layer.rs
@@ -1,11 +1,13 @@
 // use dx::Matrix; // not available in wasm
 use crate::{
+    foundation::{Rect, Size},
     lottie::{
         animation::keyframe::BaseKeyframeAnimation, model::KeyPath, value::LottieValueCallback,
     },
-    Canvas, Rect, Size,
 };
 
+// use crate::Canvas;
+
 use super::BaseLayer;
 
 pub struct CompositionLayer {
diff --git a/src/runtime/lottie/render_lottie.rs b/src/runtime/lottie/render_lottie.rs
index 17e1a26..afe99dc 100644
--- a/src/runtime/lottie/render_lottie.rs
+++ b/src/runtime/lottie/render_lottie.rs
@@ -1,4 +1,4 @@
-use primitives::Size;
+use primitives::foundation::Size;
 
 use super::{FrameRate, LottieComposition, LottieDelegates};
 
