text: Do not set the markup unconditionally

When setting :use-markup we always pass the contents of the Text actor
to clutter_text_set_markup_internal(); if string contains any markup,
this ends up being parsed and used - even when :use-markup is set to
FALSE.

http://bugzilla.clutter-project.org/show_bug.cgi?id=2239
This commit is contained in:
Emmanuele Bassi 2010-08-06 17:04:37 +01:00
parent fcbfd4ec34
commit d07a525ecc

View File

@ -101,8 +101,11 @@ struct _ClutterTextPrivate
{ {
PangoFontDescription *font_desc; PangoFontDescription *font_desc;
/* the displayed text */
gchar *text; gchar *text;
gchar *font_name; gchar *font_name;
gchar *preedit_str; gchar *preedit_str;
ClutterColor text_color; ClutterColor text_color;
@ -307,7 +310,7 @@ clutter_text_ensure_effective_attributes (ClutterText *self)
do anything */ do anything */
if (priv->effective_attrs == NULL) if (priv->effective_attrs == NULL)
{ {
if (priv->attrs) if (priv->attrs != NULL)
{ {
/* If there are no markup attributes then we can just use /* If there are no markup attributes then we can just use
these attributes directly */ these attributes directly */
@ -338,11 +341,13 @@ clutter_text_ensure_effective_attributes (ClutterText *self)
while (pango_attr_iterator_next (iter)); while (pango_attr_iterator_next (iter));
} }
} }
else if (priv->markup_attrs) else if (priv->markup_attrs != NULL)
{
/* We can just use the markup attributes directly */ /* We can just use the markup attributes directly */
priv->effective_attrs = pango_attr_list_ref (priv->markup_attrs); priv->effective_attrs = pango_attr_list_ref (priv->markup_attrs);
} }
} }
}
static PangoLayout * static PangoLayout *
clutter_text_create_layout_no_cache (ClutterText *text, clutter_text_create_layout_no_cache (ClutterText *text,
@ -405,7 +410,7 @@ clutter_text_create_layout_no_cache (ClutterText *text,
property if needed */ property if needed */
clutter_text_ensure_effective_attributes (text); clutter_text_ensure_effective_attributes (text);
if (priv->effective_attrs) if (priv->effective_attrs != NULL)
pango_layout_set_attributes (layout, priv->effective_attrs); pango_layout_set_attributes (layout, priv->effective_attrs);
} }
@ -1051,17 +1056,19 @@ clutter_text_set_markup_internal (ClutterText *self,
strlen (text), &tmp_pos); strlen (text), &tmp_pos);
clutter_text_set_text_internal (self, text); clutter_text_set_text_internal (self, text);
g_free (text); g_free (text);
} }
/* Store the new markup attributes */ /* Store the new markup attributes */
if (priv->markup_attrs) if (priv->markup_attrs != NULL)
pango_attr_list_unref (priv->markup_attrs); pango_attr_list_unref (priv->markup_attrs);
priv->markup_attrs = attrs; priv->markup_attrs = attrs;
/* Clear the effective attributes so they will be regenerated when a /* Clear the effective attributes so they will be regenerated when a
layout is created */ layout is created */
if (priv->effective_attrs) if (priv->effective_attrs != NULL)
{ {
pango_attr_list_unref (priv->effective_attrs); pango_attr_list_unref (priv->effective_attrs);
priv->effective_attrs = NULL; priv->effective_attrs = NULL;
@ -2726,8 +2733,15 @@ clutter_text_class_init (ClutterTextClass *klass)
/** /**
* ClutterText:use-markup: * ClutterText:use-markup:
* *
* Whether the text includes Pango markup. See pango_layout_set_markup() * Whether the text includes Pango markup.
* in the Pango documentation. *
* For more informations about the Pango markup format, see
* pango_layout_set_markup() in the Pango documentation.
*
* <note>It is not possible to round-trip this property between
* %TRUE and %FALSE. Once a string with markup has been set on
* a #ClutterText actor with :use-markup set to %TRUE, the markup
* is stripped from the string.</note>
* *
* Since: 1.0 * Since: 1.0
*/ */
@ -3870,6 +3884,21 @@ clutter_text_set_use_markup_internal (ClutterText *self,
{ {
priv->use_markup = use_markup; priv->use_markup = use_markup;
/* reset the attributes lists so that they can be
* re-generated
*/
if (priv->effective_attrs != NULL)
{
pango_attr_list_unref (priv->effective_attrs);
priv->effective_attrs = NULL;
}
if (priv->markup_attrs)
{
pango_attr_list_unref (priv->markup_attrs);
priv->markup_attrs = NULL;
}
g_object_notify (G_OBJECT (self), "use-markup"); g_object_notify (G_OBJECT (self), "use-markup");
} }
} }
@ -4308,7 +4337,9 @@ clutter_text_get_line_alignment (ClutterText *self)
* in <link linkend="PangoMarkupFormat">Pango's text markup language</link>. * in <link linkend="PangoMarkupFormat">Pango's text markup language</link>.
* *
* Setting #ClutterText:use-markup on an editable #ClutterText will * Setting #ClutterText:use-markup on an editable #ClutterText will
* make the actor discard any markup. * not have any effect except hiding the markup.
*
* See also #ClutterText:use-markup.
* *
* Since: 1.0 * Since: 1.0
*/ */
@ -4316,10 +4347,23 @@ void
clutter_text_set_use_markup (ClutterText *self, clutter_text_set_use_markup (ClutterText *self,
gboolean setting) gboolean setting)
{ {
ClutterTextPrivate *priv;
gchar *str;
g_return_if_fail (CLUTTER_IS_TEXT (self)); g_return_if_fail (CLUTTER_IS_TEXT (self));
priv = self->priv;
str = g_strdup (priv->text);
clutter_text_set_use_markup_internal (self, setting); clutter_text_set_use_markup_internal (self, setting);
clutter_text_set_markup_internal (self, self->priv->text);
if (setting)
clutter_text_set_markup_internal (self, str);
else
clutter_text_set_text_internal (self, str);
g_free (str);
clutter_text_dirty_cache (self); clutter_text_dirty_cache (self);