diff --git a/srcpkgs/clutter/patches/closure-annotation.patch b/srcpkgs/clutter/patches/closure-annotation.patch
new file mode 100644
index 00000000000..30e7b47fe78
--- /dev/null
+++ b/srcpkgs/clutter/patches/closure-annotation.patch
@@ -0,0 +1,22 @@
+From 084dc49a0cdadeed7de896df81e9af536f2ab678 Mon Sep 17 00:00:00 2001
+From: Rico Tzschichholz <ricotz@ubuntu.com>
+Date: Thu, 2 Oct 2014 09:27:36 +0200
+Subject: x11: Add missing closure annotation to ClutterX11FilterFunc
+
+
+diff --git a/clutter/x11/clutter-x11.h b/clutter/x11/clutter-x11.h
+index b0ab8a1..285ea51 100644
+--- a/clutter/x11/clutter-x11.h
++++ b/clutter/x11/clutter-x11.h
+@@ -85,7 +85,7 @@ typedef struct _ClutterX11XInputDevice ClutterX11XInputDevice;
+  * ClutterX11FilterFunc:
+  * @xev: Native X11 event structure
+  * @cev: Clutter event structure
+- * @data: user data passed to the filter function
++ * @data: (closure): user data passed to the filter function
+  *
+  * Filter function for X11 native events.
+  *
+-- 
+cgit v0.10.1
+
diff --git a/srcpkgs/clutter/patches/create-pangocontext-per-actor.patch b/srcpkgs/clutter/patches/create-pangocontext-per-actor.patch
new file mode 100644
index 00000000000..5dbbc2cbcd9
--- /dev/null
+++ b/srcpkgs/clutter/patches/create-pangocontext-per-actor.patch
@@ -0,0 +1,224 @@
+From 46877cc2bd497ec23acfa07fedaf29f45522dc6f Mon Sep 17 00:00:00 2001
+From: "Jasper St. Pierre" <jstpierre@mecheye.net>
+Date: Wed, 22 Oct 2014 18:44:22 -0700
+Subject: actor: Create a PangoContext per actor
+
+For a variety of complicated reasons, ClutterText currently sets fields
+on the PangoContext when creating a layout. This causes ClutterText to
+behave somewhat erratically in certain cases, since the PangoContext is
+currently shared between all actors.
+
+GTK+ creates a PangoContext for every single GtkWidget, so it seems like
+we should do the same here.
+
+Move the private code that was previously in clutter-main.c into
+clutter-actor.c and clean it up a bit. This gives every actor its own
+PangoContext it can mutilate whenever it wants, at its heart's content.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=739050
+
+diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
+index 6a0582a..33fe3e7 100644
+--- a/clutter/clutter-actor.c
++++ b/clutter/clutter-actor.c
+@@ -15474,6 +15474,46 @@ clutter_actor_grab_key_focus (ClutterActor *self)
+     clutter_stage_set_key_focus (CLUTTER_STAGE (stage), self);
+ }
+ 
++static void
++update_pango_context (ClutterBackend *backend,
++                      PangoContext   *context)
++{
++  ClutterSettings *settings;
++  PangoFontDescription *font_desc;
++  const cairo_font_options_t *font_options;
++  gchar *font_name;
++  PangoDirection pango_dir;
++  gdouble resolution;
++
++  settings = clutter_settings_get_default ();
++
++  /* update the text direction */
++  if (clutter_get_default_text_direction () == CLUTTER_TEXT_DIRECTION_RTL)
++    pango_dir = PANGO_DIRECTION_RTL;
++  else
++    pango_dir = PANGO_DIRECTION_LTR;
++
++  pango_context_set_base_dir (context, pango_dir);
++
++  g_object_get (settings, "font-name", &font_name, NULL);
++
++  /* get the configuration for the PangoContext from the backend */
++  font_options = clutter_backend_get_font_options (backend);
++  resolution = clutter_backend_get_resolution (backend);
++
++  font_desc = pango_font_description_from_string (font_name);
++
++  if (resolution < 0)
++    resolution = 96.0; /* fall back */
++
++  pango_context_set_font_description (context, font_desc);
++  pango_cairo_context_set_font_options (context, font_options);
++  pango_cairo_context_set_resolution (context, resolution);
++
++  pango_font_description_free (font_desc);
++  g_free (font_name);
++}
++
+ /**
+  * clutter_actor_get_pango_context:
+  * @self: a #ClutterActor
+@@ -15500,16 +15540,23 @@ PangoContext *
+ clutter_actor_get_pango_context (ClutterActor *self)
+ {
+   ClutterActorPrivate *priv;
++  ClutterBackend *backend = clutter_get_default_backend ();
+ 
+   g_return_val_if_fail (CLUTTER_IS_ACTOR (self), NULL);
+ 
+   priv = self->priv;
+ 
+-  if (priv->pango_context != NULL)
+-    return priv->pango_context;
++  if (G_UNLIKELY (priv->pango_context == NULL))
++    {
++      priv->pango_context = clutter_actor_create_pango_context (self);
+ 
+-  priv->pango_context = _clutter_context_get_pango_context ();
+-  g_object_ref (priv->pango_context);
++      g_signal_connect_object (backend, "resolution-changed",
++                               G_CALLBACK (update_pango_context), priv->pango_context, 0);
++      g_signal_connect_object (backend, "font-changed",
++                               G_CALLBACK (update_pango_context), priv->pango_context, 0);
++    }
++  else
++    update_pango_context (backend, priv->pango_context);
+ 
+   return priv->pango_context;
+ }
+@@ -15533,9 +15580,16 @@ clutter_actor_get_pango_context (ClutterActor *self)
+ PangoContext *
+ clutter_actor_create_pango_context (ClutterActor *self)
+ {
+-  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), NULL);
++  CoglPangoFontMap *font_map;
++  PangoContext *context;
++
++  font_map = COGL_PANGO_FONT_MAP (clutter_get_font_map ());
++
++  context = cogl_pango_font_map_create_context (font_map);
++  update_pango_context (clutter_get_default_backend (), context);
++  pango_context_set_language (context, pango_language_get_default ());
+ 
+-  return _clutter_context_create_pango_context ();
++  return context;
+ }
+ 
+ /**
+diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
+index 3b9385a..1a337c0 100644
+--- a/clutter/clutter-main.c
++++ b/clutter/clutter-main.c
+@@ -764,86 +764,6 @@ clutter_get_text_direction (void)
+   return dir;
+ }
+ 
+-static void
+-update_pango_context (ClutterBackend *backend,
+-                      PangoContext   *context)
+-{
+-  ClutterSettings *settings;
+-  PangoFontDescription *font_desc;
+-  const cairo_font_options_t *font_options;
+-  gchar *font_name;
+-  PangoDirection pango_dir;
+-  gdouble resolution;
+-
+-  settings = clutter_settings_get_default ();
+-
+-  /* update the text direction */
+-  if (clutter_text_direction == CLUTTER_TEXT_DIRECTION_RTL)
+-    pango_dir = PANGO_DIRECTION_RTL;
+-  else
+-    pango_dir = PANGO_DIRECTION_LTR;
+-
+-  pango_context_set_base_dir (context, pango_dir);
+-
+-  g_object_get (settings, "font-name", &font_name, NULL);
+-
+-  /* get the configuration for the PangoContext from the backend */
+-  font_options = clutter_backend_get_font_options (backend);
+-  resolution = clutter_backend_get_resolution (backend);
+-
+-  font_desc = pango_font_description_from_string (font_name);
+-
+-  if (resolution < 0)
+-    resolution = 96.0; /* fall back */
+-
+-  pango_context_set_font_description (context, font_desc);
+-  pango_cairo_context_set_font_options (context, font_options);
+-  pango_cairo_context_set_resolution (context, resolution);
+-
+-  pango_font_description_free (font_desc);
+-  g_free (font_name);
+-}
+-
+-PangoContext *
+-_clutter_context_get_pango_context (void)
+-{
+-  ClutterMainContext *self = _clutter_context_get_default ();
+-
+-  if (G_UNLIKELY (self->pango_context == NULL))
+-    {
+-      PangoContext *context;
+-
+-      context = _clutter_context_create_pango_context ();
+-      self->pango_context = context;
+-
+-      g_signal_connect (self->backend, "resolution-changed",
+-                        G_CALLBACK (update_pango_context),
+-                        self->pango_context);
+-      g_signal_connect (self->backend, "font-changed",
+-                        G_CALLBACK (update_pango_context),
+-                        self->pango_context);
+-    }
+-  else
+-    update_pango_context (self->backend, self->pango_context);
+-
+-  return self->pango_context;
+-}
+-
+-PangoContext *
+-_clutter_context_create_pango_context (void)
+-{
+-  CoglPangoFontMap *font_map;
+-  PangoContext *context;
+-
+-  font_map = clutter_context_get_pango_fontmap ();
+-
+-  context = cogl_pango_font_map_create_context (font_map);
+-  update_pango_context (clutter_get_default_backend (), context);
+-  pango_context_set_language (context, pango_language_get_default ());
+-
+-  return context;
+-}
+-
+ /**
+  * clutter_main_quit:
+  *
+diff --git a/clutter/clutter-private.h b/clutter/clutter-private.h
+index bf92626..b714edc 100644
+--- a/clutter/clutter-private.h
++++ b/clutter/clutter-private.h
+@@ -198,8 +198,6 @@ ClutterMainContext *    _clutter_context_get_default                    (void);
+ void                    _clutter_context_lock                           (void);
+ void                    _clutter_context_unlock                         (void);
+ gboolean                _clutter_context_is_initialized                 (void);
+-PangoContext *          _clutter_context_create_pango_context           (void);
+-PangoContext *          _clutter_context_get_pango_context              (void);
+ ClutterPickMode         _clutter_context_get_pick_mode                  (void);
+ void                    _clutter_context_push_shader_stack              (ClutterActor *actor);
+ ClutterActor *          _clutter_context_pop_shader_stack               (ClutterActor *actor);
+-- 
+cgit v0.10.1
+
diff --git a/srcpkgs/clutter/patches/dont-update-pangocontext.patch b/srcpkgs/clutter/patches/dont-update-pangocontext.patch
new file mode 100644
index 00000000000..689fb5976c9
--- /dev/null
+++ b/srcpkgs/clutter/patches/dont-update-pangocontext.patch
@@ -0,0 +1,37 @@
+From 14d28e7908d5421f15f9b94f4f37d66f14c4222e Mon Sep 17 00:00:00 2001
+From: "Jasper St. Pierre" <jstpierre@mecheye.net>
+Date: Wed, 22 Oct 2014 18:44:16 -0700
+Subject: main: Don't update the PangoContext in clutter_set_font_flags
+
+clutter_set_font_flags already calls clutter_backend_set_font_options,
+which emits a signal which our PangoContext listens to, so this is just
+duplicate and unneeded code.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=739050
+
+diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
+index 444ceba..3b9385a 100644
+--- a/clutter/clutter-main.c
++++ b/clutter/clutter-main.c
+@@ -3276,7 +3276,6 @@ clutter_clear_glyph_cache (void)
+ void
+ clutter_set_font_flags (ClutterFontFlags flags)
+ {
+-  ClutterMainContext *context = _clutter_context_get_default ();
+   CoglPangoFontMap *font_map;
+   ClutterFontFlags old_flags, changed_flags;
+   const cairo_font_options_t *font_options;
+@@ -3326,10 +3325,6 @@ clutter_set_font_flags (ClutterFontFlags flags)
+   clutter_backend_set_font_options (backend, new_font_options);
+ 
+   cairo_font_options_destroy (new_font_options);
+-
+-  /* update the default pango context, if any */
+-  if (context->pango_context != NULL)
+-    update_pango_context (backend, context->pango_context);
+ }
+ 
+ /**
+-- 
+cgit v0.10.1
+
diff --git a/srcpkgs/clutter/patches/evdev-flush-event-queue.patch b/srcpkgs/clutter/patches/evdev-flush-event-queue.patch
new file mode 100644
index 00000000000..2b278b34817
--- /dev/null
+++ b/srcpkgs/clutter/patches/evdev-flush-event-queue.patch
@@ -0,0 +1,54 @@
+From 7764fd2079318fede95b4b96c72d18bd31699270 Mon Sep 17 00:00:00 2001
+From: Carlos Garnacho <carlosg@gnome.org>
+Date: Tue, 14 Oct 2014 12:41:10 +0200
+Subject: evdev: Flush event queue before removing an input device
+
+libinput_suspend() will trigger the removal of input devices, but also
+the emission of button/key releases pairing everything that is pressed
+at that moment. These events are queued, but the ClutterInputDevice
+pointers in these will point to invalid memory at the time these are
+processed.
+
+Fix this by flushing the event queue, in order to ensure there are no
+unprocessed input events after libinput_suspend().
+
+https://bugzilla.gnome.org/show_bug.cgi?id=738520
+
+diff --git a/clutter/evdev/clutter-device-manager-evdev.c b/clutter/evdev/clutter-device-manager-evdev.c
+index 77a8ec6..7b48481 100644
+--- a/clutter/evdev/clutter-device-manager-evdev.c
++++ b/clutter/evdev/clutter-device-manager-evdev.c
+@@ -1017,6 +1017,18 @@ clutter_seat_evdev_sync_leds (ClutterSeatEvdev *seat)
+     }
+ }
+ 
++static void
++flush_event_queue (void)
++{
++  ClutterEvent *event;
++
++  while ((event = clutter_event_get ()) != NULL)
++    {
++      _clutter_process_event (event);
++      clutter_event_free (event);
++    }
++}
++
+ static gboolean
+ process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
+                     struct libinput_event *event)
+@@ -1034,6 +1046,11 @@ process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
+       break;
+ 
+     case LIBINPUT_EVENT_DEVICE_REMOVED:
++      /* Flush all queued events, there
++       * might be some from this device.
++       */
++      flush_event_queue ();
++
+       libinput_device = libinput_event_get_device (event);
+ 
+       device = libinput_device_get_user_data (libinput_device);
+-- 
+cgit v0.10.1
+
diff --git a/srcpkgs/clutter/template b/srcpkgs/clutter/template
index 051feb91633..bfe50b17edb 100644
--- a/srcpkgs/clutter/template
+++ b/srcpkgs/clutter/template
@@ -1,11 +1,13 @@
 # Template file for 'clutter'
 pkgname=clutter
 version=1.20.0
-revision=1
+revision=2
+patch_args="-Np1"
 build_style=gnu-configure
-configure_args="--enable-introspection --enable-evdev-input
+build_options="gir"
+configure_args="$(vopt_enable gir introspection) --enable-evdev-input
  --enable-wayland-backend --enable-egl-backend --enable-wayland-compositor"
-hostmakedepends="pkg-config intltool gobject-introspection glib-devel"
+hostmakedepends="pkg-config intltool glib-devel $(vopt_if gir gobject-introspection)"
 makedepends="
  atk-devel pango-devel libXi-devel libXcomposite-devel json-glib-devel
  libxkbcommon-devel cogl-devel>=1.18 libinput-devel eudev-libgudev-devel
@@ -19,17 +21,20 @@ checksum=cc940809e6e1469ce349c4bddb0cbcc2c13c087d4fc15cda9278d855ee2d1293
 update_site="${GNOME_SITE}/$pkgname/cache.json"
 update_ignore="1.*[13579].*"
 
+if [ -z "$CROSS_BUILD" ]; then
+	build_options_default="gir"
+fi
+
 clutter-devel_package() {
-	depends="cogl-devel>=1.18 cairo-devel atk-devel pango-devel json-glib-devel
-		libX11-devel libXext-devel libXfixes-devel libXdamage-devel
-		libXcomposite-devel libXi-devel libinput-devel
-		libxkbcommon-devel clutter>=${version}_${revision}"
+	depends="${makedepends} clutter>=${version}_${revision}"
 	short_desc+=" - development files"
 	pkg_install() {
 		vmove usr/include
 		vmove usr/lib/pkgconfig
 		vmove "usr/lib/*.so"
 		vmove usr/share/gtk-doc
-		vmove "usr/share/gir-*"
+		if [ "$build_option_gir" ]; then
+			vmove usr/share/gir-1.0
+		fi
 	}
 }