diff --git a/demos/gtk-demo/fontify.c b/demos/gtk-demo/fontify.c index de6a9ca699..b39c3ffee6 100644 --- a/demos/gtk-demo/fontify.c +++ b/demos/gtk-demo/fontify.c @@ -271,6 +271,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer, break; case PANGO_ATTR_TEXT_TRANSFORM: + INT_ATTR (text_transform); break; case PANGO_ATTR_INVALID: diff --git a/gtk/gtktextattributes.c b/gtk/gtktextattributes.c index fbc63a7d63..87208a8100 100644 --- a/gtk/gtktextattributes.c +++ b/gtk/gtktextattributes.c @@ -438,6 +438,9 @@ _gtk_text_attributes_fill_from_tags (GtkTextAttributes *dest, if (tag->priv->insert_hyphens_set) dest->no_hyphens = vals->no_hyphens; + + if (tag->priv->text_transform_set) + dest->text_transform = vals->text_transform; } dest->left_margin += left_margin_accumulative; @@ -467,7 +470,8 @@ _gtk_text_tag_affects_size (GtkTextTag *tag) priv->wrap_mode_set || priv->invisible_set || priv->font_features_set || - priv->letter_spacing_set; + priv->letter_spacing_set || + priv->text_transform_set; } gboolean diff --git a/gtk/gtktextattributes.h b/gtk/gtktextattributes.h index 3648dabf7c..f1ebc857db 100644 --- a/gtk/gtktextattributes.h +++ b/gtk/gtktextattributes.h @@ -159,6 +159,7 @@ struct _GtkTextAttributes guint show_spaces : 3; /* PangoShowFlags */ guint no_hyphens : 1; guint line_height_is_absolute : 1; + guint text_transform : 3; /* PangoTextTransform */ }; GtkTextAttributes* gtk_text_attributes_new (void); diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c index 38315286b4..fd457df699 100644 --- a/gtk/gtktextbuffer.c +++ b/gtk/gtktextbuffer.c @@ -4713,6 +4713,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer, break; case PANGO_ATTR_TEXT_TRANSFORM: + INT_ATTR (text_transform); break; case PANGO_ATTR_SHAPE: diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c index d6ad07ceaf..88d4c409b4 100644 --- a/gtk/gtktextlayout.c +++ b/gtk/gtktextlayout.c @@ -1683,6 +1683,15 @@ add_text_attrs (GtkTextLayout *layout, attr->start_index = start; attr->end_index = start + byte_count; + pango_attr_list_insert (attrs, attr); + } + + if (style->text_transform != PANGO_TEXT_TRANSFORM_NONE) + { + attr = pango_attr_text_transform_new (style->text_transform); + attr->start_index = start; + attr->end_index = start + byte_count; + pango_attr_list_insert (attrs, attr); } } diff --git a/gtk/gtktexttag.c b/gtk/gtktexttag.c index cebc1ddbe4..f998ad9a40 100644 --- a/gtk/gtktexttag.c +++ b/gtk/gtktexttag.c @@ -134,6 +134,7 @@ enum { PROP_ALLOW_BREAKS, PROP_SHOW_SPACES, PROP_INSERT_HYPHENS, + PROP_TEXT_TRANSFORM, /* Behavior args */ PROP_ACCUMULATIVE_MARGIN, @@ -176,6 +177,7 @@ enum { PROP_ALLOW_BREAKS_SET, PROP_SHOW_SPACES_SET, PROP_INSERT_HYPHENS_SET, + PROP_TEXT_TRANSFORM_SET, LAST_ARG }; @@ -856,6 +858,22 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) TRUE, GTK_PARAM_READWRITE)); + /** + * GtkTextTag:text-transform: + * + * How to transform the text for display. + * + * Since: 4.6 + */ + g_object_class_install_property (object_class, + PROP_TEXT_TRANSFORM, + g_param_spec_enum ("text-transform", + P_("Text Transform"), + P_("Whether to transform text for display."), + PANGO_TYPE_TEXT_TRANSFORM, + PANGO_TEXT_TRANSFORM_NONE, + GTK_PARAM_READWRITE)); + /** * GtkTextTag:accumulative-margin: * @@ -1034,6 +1052,10 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) ADD_SET_PROP ("insert-hyphens-set", PROP_INSERT_HYPHENS_SET, P_("Insert hyphens set"), P_("Whether this tag affects insertion of hyphens")); + + ADD_SET_PROP ("text-transform-set", PROP_TEXT_TRANSFORM_SET, + P_("Text transform set"), + P_("Whether this tag affects text transformation")); } static void @@ -1783,6 +1805,12 @@ gtk_text_tag_set_property (GObject *object, g_object_notify (object, "insert-hyphens-set"); break; + case PROP_TEXT_TRANSFORM: + priv->text_transform_set = TRUE; + priv->values->text_transform = g_value_get_enum (value); + g_object_notify (object, "text-transform-set"); + break; + case PROP_ACCUMULATIVE_MARGIN: priv->accumulative_margin = g_value_get_boolean (value); g_object_notify (object, "accumulative-margin"); @@ -1947,6 +1975,10 @@ gtk_text_tag_set_property (GObject *object, priv->insert_hyphens_set = g_value_get_boolean (value); break; + case PROP_TEXT_TRANSFORM_SET: + priv->text_transform_set = g_value_get_boolean (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2159,6 +2191,10 @@ gtk_text_tag_get_property (GObject *object, g_value_set_boolean (value, !priv->values->no_hyphens); break; + case PROP_TEXT_TRANSFORM: + g_value_set_enum (value, priv->values->text_transform); + break; + case PROP_ACCUMULATIVE_MARGIN: g_value_set_boolean (value, priv->accumulative_margin); break; @@ -2301,6 +2337,10 @@ gtk_text_tag_get_property (GObject *object, g_value_set_boolean (value, priv->insert_hyphens_set); break; + case PROP_TEXT_TRANSFORM_SET: + g_value_set_boolean (value, priv->text_transform_set); + break; + case PROP_BACKGROUND: case PROP_FOREGROUND: case PROP_PARAGRAPH_BACKGROUND: diff --git a/gtk/gtktexttagprivate.h b/gtk/gtktexttagprivate.h index 2b7b078bda..ee6a5fa591 100644 --- a/gtk/gtktexttagprivate.h +++ b/gtk/gtktexttagprivate.h @@ -87,6 +87,7 @@ struct _GtkTextTagPrivate guint allow_breaks_set : 1; guint show_spaces_set : 1; guint insert_hyphens_set : 1; + guint text_transform_set : 1; /* Whether these margins accumulate or override */ guint accumulative_margin : 1;