diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-03-20 23:54:39 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-03-20 23:58:23 -0400 |
commit | a8c6ae6085f72219548141a0d833cdc729e26c67 (patch) | |
tree | 4a5d3fe76291b6f21698cf07630eeb47be15e3ec /gtk/gtktexttag.c | |
parent | 28e7a0a5659ef96cc0fd0eed7171395cd90b2ed2 (diff) | |
download | gtk+-a8c6ae6085f72219548141a0d833cdc729e26c67.tar.gz |
texttag: Support overline and hyphenation control
Add support for recently added Pango attributes
for overlines and hyphenation control. The new
properties of GtkTextTag are
overline, overline-rgba, allow-breaks, show-spaces
and insert-hyphens.
Diffstat (limited to 'gtk/gtktexttag.c')
-rw-r--r-- | gtk/gtktexttag.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/gtk/gtktexttag.c b/gtk/gtktexttag.c index d04606f463..7465465eb9 100644 --- a/gtk/gtktexttag.c +++ b/gtk/gtktexttag.c @@ -116,7 +116,9 @@ enum { PROP_STRIKETHROUGH_RGBA, PROP_RIGHT_MARGIN, PROP_UNDERLINE, + PROP_OVERLINE, PROP_UNDERLINE_RGBA, + PROP_OVERLINE_RGBA, PROP_RISE, PROP_BACKGROUND_FULL_HEIGHT, PROP_LANGUAGE, @@ -127,6 +129,9 @@ enum { PROP_FALLBACK, PROP_LETTER_SPACING, PROP_FONT_FEATURES, + PROP_ALLOW_BREAKS, + PROP_SHOW_SPACES, + PROP_INSERT_HYPHENS, /* Behavior args */ PROP_ACCUMULATIVE_MARGIN, @@ -153,7 +158,9 @@ enum { PROP_STRIKETHROUGH_RGBA_SET, PROP_RIGHT_MARGIN_SET, PROP_UNDERLINE_SET, + PROP_OVERLINE_SET, PROP_UNDERLINE_RGBA_SET, + PROP_OVERLINE_RGBA_SET, PROP_RISE_SET, PROP_BACKGROUND_FULL_HEIGHT_SET, PROP_LANGUAGE_SET, @@ -163,6 +170,9 @@ enum { PROP_FALLBACK_SET, PROP_LETTER_SPACING_SET, PROP_FONT_FEATURES_SET, + PROP_ALLOW_BREAKS_SET, + PROP_SHOW_SPACES_SET, + PROP_INSERT_HYPHENS_SET, LAST_ARG }; @@ -482,6 +492,15 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) PANGO_UNDERLINE_NONE, GTK_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_OVERLINE, + g_param_spec_enum ("overline", + P_("Overline"), + P_("Style of overline for this text"), + PANGO_TYPE_OVERLINE, + PANGO_OVERLINE_NONE, + GTK_PARAM_READWRITE)); + /** * GtkTextTag:underline-rgba: * @@ -500,6 +519,14 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) GDK_TYPE_RGBA, GTK_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_OVERLINE_RGBA, + g_param_spec_boxed ("overline-rgba", + P_("Overline RGBA"), + P_("Color of overline for this text"), + GDK_TYPE_RGBA, + GTK_PARAM_READWRITE)); + /** * GtkTextTag:strikethrough-rgba: * @@ -617,6 +644,31 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) NULL, GTK_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_ALLOW_BREAKS, + g_param_spec_boolean ("allow-breaks", + P_("Allow Breaks"), + P_("Whether breaks are allowed."), + TRUE, + GTK_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_SHOW_SPACES, + g_param_spec_flags ("show-spaces", + P_("Show spaces"), + P_("How to render invisible characters."), + PANGO_TYPE_SHOW_FLAGS, + PANGO_SHOW_NONE, + GTK_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_INSERT_HYPHENS, + g_param_spec_boolean ("insert-hyphens", + P_("Insert hyphens"), + P_("Whether to insert hyphens at breaks."), + TRUE, + GTK_PARAM_READWRITE)); + /** * GtkTextTag:accumulative-margin: * @@ -726,6 +778,10 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) P_("Underline set"), P_("Whether this tag affects underlining")); + ADD_SET_PROP ("overline-set", PROP_OVERLINE_SET, + P_("Overline set"), + P_("Whether this tag affects overlining")); + /** * GtkTextTag:underline-rgba-set: * @@ -735,6 +791,10 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) P_("Underline RGBA set"), P_("Whether this tag affects underlining color")); + ADD_SET_PROP ("overline-rgba-set", PROP_OVERLINE_RGBA_SET, + P_("Overline RGBA set"), + P_("Whether this tag affects overlining color")); + /** * GtkTextTag:strikethrough-rgba-set: * @@ -771,6 +831,18 @@ gtk_text_tag_class_init (GtkTextTagClass *klass) ADD_SET_PROP ("font-features-set", PROP_FONT_FEATURES_SET, P_("Font features set"), P_("Whether this tag affects font features")); + + ADD_SET_PROP ("allow-breaks-set", PROP_ALLOW_BREAKS_SET, + P_("Allow breaks set"), + P_("Whether this tag affects line breaks")); + + ADD_SET_PROP ("show-spaces-set", PROP_SHOW_SPACES_SET, + P_("Show spaces set"), + P_("Whether this tag affects rendering of invisible characters")); + + ADD_SET_PROP ("insert-hyphens-set", PROP_INSERT_HYPHENS_SET, + P_("Insert hyphens set"), + P_("Whether this tag affects insertion of hyphens")); } static void @@ -850,6 +922,36 @@ set_underline_rgba (GtkTextTag *tag, } static void +set_overline_rgba (GtkTextTag *tag, + const GdkRGBA *rgba) +{ + GtkTextTagPrivate *priv = tag->priv; + + if (priv->values->appearance.overline_rgba) + gdk_rgba_free (priv->values->appearance.overline_rgba); + priv->values->appearance.overline_rgba = NULL; + + if (rgba) + { + priv->values->appearance.overline_rgba = gdk_rgba_copy (rgba); + + if (!priv->overline_rgba_set) + { + priv->overline_rgba_set = TRUE; + g_object_notify (G_OBJECT (tag), "overline-rgba-set"); + } + } + else + { + if (priv->overline_rgba_set) + { + priv->overline_rgba_set = FALSE; + g_object_notify (G_OBJECT (tag), "overline-rgba-set"); + } + } +} + +static void set_strikethrough_rgba (GtkTextTag *tag, const GdkRGBA *rgba) { @@ -1366,6 +1468,12 @@ gtk_text_tag_set_property (GObject *object, g_object_notify (object, "underline-set"); break; + case PROP_OVERLINE: + priv->overline_set = TRUE; + priv->values->appearance.overline = g_value_get_enum (value); + g_object_notify (object, "overline-set"); + break; + case PROP_UNDERLINE_RGBA: { GdkRGBA *color = g_value_get_boxed (value); @@ -1373,6 +1481,13 @@ gtk_text_tag_set_property (GObject *object, } break; + case PROP_OVERLINE_RGBA: + { + GdkRGBA *color = g_value_get_boxed (value); + set_overline_rgba (text_tag, color); + } + break; + case PROP_RISE: priv->rise_set = TRUE; priv->values->appearance.rise = g_value_get_int (value); @@ -1453,6 +1568,24 @@ gtk_text_tag_set_property (GObject *object, g_object_notify (object, "font-features-set"); break; + case PROP_ALLOW_BREAKS: + priv->allow_breaks_set = TRUE; + priv->values->no_breaks = !g_value_get_boolean (value); + g_object_notify (object, "allow-breaks-set"); + break; + + case PROP_SHOW_SPACES: + priv->show_spaces_set = TRUE; + priv->values->show_spaces = g_value_get_flags (value); + g_object_notify (object, "show-spaces-set"); + break; + + case PROP_INSERT_HYPHENS: + priv->insert_hyphens_set = TRUE; + priv->values->no_hyphens = !g_value_get_boolean (value); + g_object_notify (object, "insert-hyphens-set"); + break; + case PROP_ACCUMULATIVE_MARGIN: priv->accumulative_margin = g_value_get_boolean (value); g_object_notify (object, "accumulative-margin"); @@ -1553,10 +1686,18 @@ gtk_text_tag_set_property (GObject *object, priv->underline_set = g_value_get_boolean (value); break; + case PROP_OVERLINE_SET: + priv->overline_set = g_value_get_boolean (value); + break; + case PROP_UNDERLINE_RGBA_SET: priv->underline_rgba_set = g_value_get_boolean (value); break; + case PROP_OVERLINE_RGBA_SET: + priv->overline_rgba_set = g_value_get_boolean (value); + break; + case PROP_RISE_SET: priv->rise_set = g_value_get_boolean (value); size_changed = TRUE; @@ -1597,6 +1738,18 @@ gtk_text_tag_set_property (GObject *object, priv->font_features_set = g_value_get_boolean (value); break; + case PROP_ALLOW_BREAKS_SET: + priv->allow_breaks_set = g_value_get_boolean (value); + break; + + case PROP_SHOW_SPACES_SET: + priv->show_spaces_set = g_value_get_boolean (value); + break; + + case PROP_INSERT_HYPHENS_SET: + priv->insert_hyphens_set = g_value_get_boolean (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1741,11 +1894,20 @@ gtk_text_tag_get_property (GObject *object, g_value_set_enum (value, priv->values->appearance.underline); break; + case PROP_OVERLINE: + g_value_set_enum (value, priv->values->appearance.overline); + break; + case PROP_UNDERLINE_RGBA: if (priv->underline_rgba_set) g_value_set_boxed (value, priv->values->appearance.underline_rgba); break; + case PROP_OVERLINE_RGBA: + if (priv->overline_rgba_set) + g_value_set_boxed (value, priv->values->appearance.overline_rgba); + break; + case PROP_RISE: g_value_set_int (value, priv->values->appearance.rise); break; @@ -1784,6 +1946,18 @@ gtk_text_tag_get_property (GObject *object, g_value_set_string (value, priv->values->font_features); break; + case PROP_ALLOW_BREAKS: + g_value_set_boolean (value, !priv->values->no_breaks); + break; + + case PROP_SHOW_SPACES: + g_value_set_flags (value, priv->values->show_spaces); + break; + + case PROP_INSERT_HYPHENS: + g_value_set_boolean (value, !priv->values->no_hyphens); + break; + case PROP_ACCUMULATIVE_MARGIN: g_value_set_boolean (value, priv->accumulative_margin); break; @@ -1862,10 +2036,18 @@ gtk_text_tag_get_property (GObject *object, g_value_set_boolean (value, priv->underline_set); break; + case PROP_OVERLINE_SET: + g_value_set_boolean (value, priv->overline_set); + break; + case PROP_UNDERLINE_RGBA_SET: g_value_set_boolean (value, priv->underline_rgba_set); break; + case PROP_OVERLINE_RGBA_SET: + g_value_set_boolean (value, priv->overline_rgba_set); + break; + case PROP_RISE_SET: g_value_set_boolean (value, priv->rise_set); break; @@ -1902,6 +2084,18 @@ gtk_text_tag_get_property (GObject *object, g_value_set_boolean (value, priv->font_features_set); break; + case PROP_ALLOW_BREAKS_SET: + g_value_set_boolean (value, priv->allow_breaks_set); + break; + + case PROP_SHOW_SPACES_SET: + g_value_set_boolean (value, priv->show_spaces_set); + break; + + case PROP_INSERT_HYPHENS_SET: + g_value_set_boolean (value, priv->insert_hyphens_set); + break; + case PROP_BACKGROUND: case PROP_FOREGROUND: case PROP_PARAGRAPH_BACKGROUND: |