summaryrefslogtreecommitdiff
path: root/clutter/clutter-actor.c
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2014-10-22 18:44:22 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2014-10-23 12:30:54 -0700
commit46877cc2bd497ec23acfa07fedaf29f45522dc6f (patch)
treed0cc6f174570f04e0afda3ecae31a3dcaf1b6eb2 /clutter/clutter-actor.c
parent14d28e7908d5421f15f9b94f4f37d66f14c4222e (diff)
downloadclutter-46877cc2bd497ec23acfa07fedaf29f45522dc6f.tar.gz
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
Diffstat (limited to 'clutter/clutter-actor.c')
-rw-r--r--clutter/clutter-actor.c66
1 files changed, 60 insertions, 6 deletions
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 6a0582a60..33fe3e71b 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;
}
/**