clutter: some fixes from upstream via Arch.

This commit is contained in:
Juan RP 2015-01-13 18:20:07 +01:00
parent 2edb2464cf
commit 58d42769fb
5 changed files with 350 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}
}