mirror of
https://github.com/brl/mutter.git
synced 2025-03-28 14:13:47 +00:00
text: Make the :text property not set the :use-markup one
Currently, setting the :text property has the side-effect of setting the :use-markup property to FALSE. This prevents constructing a Text actor, or setting its properties, like: g_object_set (text, "use-markup", TRUE, "text", some_string, NULL); as the ordering becomes important. Unfortunately, the ordering of the properties cannot be enforced with ClutterScript or with language bindings. The documentation of the clutter_text_set_text() method should be expanded to properly specify that the set_text() method will change the :use-markup property to FALSE as a side effect.
This commit is contained in:
parent
1f207c00d9
commit
3bbc96e17e
@ -638,6 +638,143 @@ clutter_text_delete_selection (ClutterText *self)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_text_merge_attributes (ClutterText *self)
|
||||||
|
{
|
||||||
|
ClutterTextPrivate *priv = self->priv;
|
||||||
|
PangoAttrIterator *iter;
|
||||||
|
GSList *attributes, *l;
|
||||||
|
|
||||||
|
if (!priv->attrs)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!priv->effective_attrs)
|
||||||
|
{
|
||||||
|
priv->effective_attrs = pango_attr_list_ref (priv->attrs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter = pango_attr_list_get_iterator (priv->attrs);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
attributes = pango_attr_iterator_get_attrs (iter);
|
||||||
|
|
||||||
|
for (l = attributes; l != NULL; l = l->next)
|
||||||
|
{
|
||||||
|
PangoAttribute *attr = l->data;
|
||||||
|
|
||||||
|
pango_attr_list_insert (priv->effective_attrs, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_slist_free (attributes);
|
||||||
|
}
|
||||||
|
while (pango_attr_iterator_next (iter));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
clutter_text_set_text_internal (ClutterText *self,
|
||||||
|
const gchar *text)
|
||||||
|
{
|
||||||
|
ClutterTextPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (self));
|
||||||
|
|
||||||
|
if (priv->max_length > 0)
|
||||||
|
{
|
||||||
|
gint len = g_utf8_strlen (text, -1);
|
||||||
|
|
||||||
|
if (len < priv->max_length)
|
||||||
|
{
|
||||||
|
g_free (priv->text);
|
||||||
|
|
||||||
|
priv->text = g_strdup (text);
|
||||||
|
priv->n_bytes = strlen (text);
|
||||||
|
priv->n_chars = len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gchar *p = g_utf8_offset_to_pointer (text, priv->max_length);
|
||||||
|
gchar *n = g_malloc0 ((p - text) + 1);
|
||||||
|
|
||||||
|
g_free (priv->text);
|
||||||
|
|
||||||
|
g_utf8_strncpy (n, text, priv->max_length);
|
||||||
|
|
||||||
|
priv->text = n;
|
||||||
|
priv->n_bytes = strlen (n);
|
||||||
|
priv->n_chars = priv->max_length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_free (priv->text);
|
||||||
|
|
||||||
|
priv->text = g_strdup (text);
|
||||||
|
priv->n_bytes = strlen (text);
|
||||||
|
priv->n_chars = g_utf8_strlen (text, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priv->n_bytes == 0)
|
||||||
|
{
|
||||||
|
clutter_text_set_cursor_position (self, -1);
|
||||||
|
clutter_text_set_selection_bound (self, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_signal_emit (self, text_signals[TEXT_CHANGED], 0);
|
||||||
|
g_object_notify (G_OBJECT (self), "text");
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (self));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
clutter_text_set_markup_internal (ClutterText *self,
|
||||||
|
const gchar *str)
|
||||||
|
{
|
||||||
|
ClutterTextPrivate *priv = self->priv;
|
||||||
|
GError *error;
|
||||||
|
gchar *text = NULL;
|
||||||
|
PangoAttrList *attrs = NULL;
|
||||||
|
gboolean res;
|
||||||
|
|
||||||
|
error = NULL;
|
||||||
|
res = pango_parse_markup (str, -1, 0,
|
||||||
|
&attrs,
|
||||||
|
&text,
|
||||||
|
NULL,
|
||||||
|
&error);
|
||||||
|
if (!res)
|
||||||
|
{
|
||||||
|
if (G_LIKELY (error))
|
||||||
|
{
|
||||||
|
g_warning ("Failed to set the markup of the actor of class '%s': %s",
|
||||||
|
G_OBJECT_TYPE_NAME (self),
|
||||||
|
error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
g_warning ("Failed to set the markup of the actor of class '%s'",
|
||||||
|
G_OBJECT_TYPE_NAME (self));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (text)
|
||||||
|
{
|
||||||
|
clutter_text_set_text_internal (self, text);
|
||||||
|
g_free (text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attrs)
|
||||||
|
{
|
||||||
|
if (priv->effective_attrs)
|
||||||
|
pango_attr_list_unref (priv->effective_attrs);
|
||||||
|
|
||||||
|
priv->effective_attrs = attrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_text_merge_attributes (self);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_text_set_property (GObject *gobject,
|
clutter_text_set_property (GObject *gobject,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@ -649,7 +786,7 @@ clutter_text_set_property (GObject *gobject,
|
|||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_TEXT:
|
case PROP_TEXT:
|
||||||
clutter_text_set_text (self, g_value_get_string (value));
|
clutter_text_set_text_internal (self, g_value_get_string (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_COLOR:
|
case PROP_COLOR:
|
||||||
@ -2483,39 +2620,6 @@ clutter_text_init (ClutterText *self)
|
|||||||
self);
|
self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
clutter_text_merge_attributes (ClutterText *self)
|
|
||||||
{
|
|
||||||
ClutterTextPrivate *priv = self->priv;
|
|
||||||
PangoAttrIterator *iter;
|
|
||||||
GSList *attributes, *l;
|
|
||||||
|
|
||||||
if (!priv->attrs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!priv->effective_attrs)
|
|
||||||
{
|
|
||||||
priv->effective_attrs = pango_attr_list_ref (priv->attrs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iter = pango_attr_list_get_iterator (priv->attrs);
|
|
||||||
do
|
|
||||||
{
|
|
||||||
attributes = pango_attr_iterator_get_attrs (iter);
|
|
||||||
|
|
||||||
for (l = attributes; l != NULL; l = l->next)
|
|
||||||
{
|
|
||||||
PangoAttribute *attr = l->data;
|
|
||||||
|
|
||||||
pango_attr_list_insert (priv->effective_attrs, attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_slist_free (attributes);
|
|
||||||
}
|
|
||||||
while (pango_attr_iterator_next (iter));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_text_new:
|
* clutter_text_new:
|
||||||
*
|
*
|
||||||
@ -3228,110 +3332,6 @@ clutter_text_set_use_markup_internal (ClutterText *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
clutter_text_set_text_internal (ClutterText *self,
|
|
||||||
const gchar *text)
|
|
||||||
{
|
|
||||||
ClutterTextPrivate *priv = self->priv;
|
|
||||||
|
|
||||||
g_object_freeze_notify (G_OBJECT (self));
|
|
||||||
|
|
||||||
if (priv->max_length > 0)
|
|
||||||
{
|
|
||||||
gint len = g_utf8_strlen (text, -1);
|
|
||||||
|
|
||||||
if (len < priv->max_length)
|
|
||||||
{
|
|
||||||
g_free (priv->text);
|
|
||||||
|
|
||||||
priv->text = g_strdup (text);
|
|
||||||
priv->n_bytes = strlen (text);
|
|
||||||
priv->n_chars = len;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gchar *p = g_utf8_offset_to_pointer (text, priv->max_length);
|
|
||||||
gchar *n = g_malloc0 ((p - text) + 1);
|
|
||||||
|
|
||||||
g_free (priv->text);
|
|
||||||
|
|
||||||
g_utf8_strncpy (n, text, priv->max_length);
|
|
||||||
|
|
||||||
priv->text = n;
|
|
||||||
priv->n_bytes = strlen (n);
|
|
||||||
priv->n_chars = priv->max_length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_free (priv->text);
|
|
||||||
|
|
||||||
priv->text = g_strdup (text);
|
|
||||||
priv->n_bytes = strlen (text);
|
|
||||||
priv->n_chars = g_utf8_strlen (text, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->n_bytes == 0)
|
|
||||||
{
|
|
||||||
clutter_text_set_cursor_position (self, -1);
|
|
||||||
clutter_text_set_selection_bound (self, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_signal_emit (self, text_signals[TEXT_CHANGED], 0);
|
|
||||||
g_object_notify (G_OBJECT (self), "text");
|
|
||||||
|
|
||||||
g_object_thaw_notify (G_OBJECT (self));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
clutter_text_set_markup_internal (ClutterText *self,
|
|
||||||
const gchar *str)
|
|
||||||
{
|
|
||||||
ClutterTextPrivate *priv = self->priv;
|
|
||||||
GError *error;
|
|
||||||
gchar *text = NULL;
|
|
||||||
PangoAttrList *attrs = NULL;
|
|
||||||
gboolean res;
|
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
res = pango_parse_markup (str, -1, 0,
|
|
||||||
&attrs,
|
|
||||||
&text,
|
|
||||||
NULL,
|
|
||||||
&error);
|
|
||||||
if (!res)
|
|
||||||
{
|
|
||||||
if (G_LIKELY (error))
|
|
||||||
{
|
|
||||||
g_warning ("Failed to set the markup of the actor of class '%s': %s",
|
|
||||||
G_OBJECT_TYPE_NAME (self),
|
|
||||||
error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
g_warning ("Failed to set the markup of the actor of class '%s'",
|
|
||||||
G_OBJECT_TYPE_NAME (self));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text)
|
|
||||||
{
|
|
||||||
clutter_text_set_text_internal (self, text);
|
|
||||||
g_free (text);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attrs)
|
|
||||||
{
|
|
||||||
if (priv->effective_attrs)
|
|
||||||
pango_attr_list_unref (priv->effective_attrs);
|
|
||||||
|
|
||||||
priv->effective_attrs = attrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
clutter_text_merge_attributes (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_text_set_text:
|
* clutter_text_set_text:
|
||||||
* @self: a #ClutterText
|
* @self: a #ClutterText
|
||||||
@ -3340,6 +3340,11 @@ clutter_text_set_markup_internal (ClutterText *self,
|
|||||||
*
|
*
|
||||||
* Sets the contents of a #ClutterText actor.
|
* Sets the contents of a #ClutterText actor.
|
||||||
*
|
*
|
||||||
|
* If the #ClutterText:use-markup property was set to %TRUE it
|
||||||
|
* will be reset to %FALSE as a side effect. If you want to
|
||||||
|
* maintain the #ClutterText:use-markup you should use the
|
||||||
|
* clutter_text_set_markup() function instead
|
||||||
|
*
|
||||||
* Since: 1.0
|
* Since: 1.0
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@ -3368,8 +3373,8 @@ clutter_text_set_text (ClutterText *self,
|
|||||||
* Pango markup, and it is logically equivalent to:
|
* Pango markup, and it is logically equivalent to:
|
||||||
*
|
*
|
||||||
* |[
|
* |[
|
||||||
* clutter_text_set_use_markup (CLUTTER_TEXT (actor), TRUE);
|
|
||||||
* clutter_text_set_text (CLUTTER_TEXT (actor), markup);
|
* clutter_text_set_text (CLUTTER_TEXT (actor), markup);
|
||||||
|
* clutter_text_set_use_markup (CLUTTER_TEXT (actor), TRUE);
|
||||||
* ]|
|
* ]|
|
||||||
*
|
*
|
||||||
* Since: 1.0
|
* Since: 1.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user