summaryrefslogtreecommitdiff
path: root/gtk/gtktexttag.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtktexttag.c')
-rw-r--r--gtk/gtktexttag.c179
1 files changed, 178 insertions, 1 deletions
diff --git a/gtk/gtktexttag.c b/gtk/gtktexttag.c
index e469d46792..f5f34f0c32 100644
--- a/gtk/gtktexttag.c
+++ b/gtk/gtktexttag.c
@@ -74,6 +74,7 @@
#include <stdlib.h>
#include <string.h>
+#include "gtktextattributesprivate.h"
#include "gtktexttag.h"
#include "gtktexttypes.h"
#include "gtktexttagtable.h"
@@ -119,8 +120,10 @@ enum {
PROP_LEFT_MARGIN,
PROP_INDENT,
PROP_STRIKETHROUGH,
+ PROP_STRIKETHROUGH_RGBA,
PROP_RIGHT_MARGIN,
PROP_UNDERLINE,
+ PROP_UNDERLINE_RGBA,
PROP_RISE,
PROP_BACKGROUND_FULL_HEIGHT,
PROP_LANGUAGE,
@@ -154,8 +157,10 @@ enum {
PROP_LEFT_MARGIN_SET,
PROP_INDENT_SET,
PROP_STRIKETHROUGH_SET,
+ PROP_STRIKETHROUGH_RGBA_SET,
PROP_RIGHT_MARGIN_SET,
PROP_UNDERLINE_SET,
+ PROP_UNDERLINE_RGBA_SET,
PROP_RISE_SET,
PROP_BACKGROUND_FULL_HEIGHT_SET,
PROP_LANGUAGE_SET,
@@ -518,7 +523,43 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
PANGO_TYPE_UNDERLINE,
PANGO_UNDERLINE_NONE,
GTK_PARAM_READWRITE));
-
+
+ /**
+ * GtkTextTag:underline-rgba:
+ *
+ * This property modifies the color of underlines. If not set, underlines
+ * will use the forground color.
+ *
+ * If #GtkTextTag:underline is set to %PANGO_UNDERLINE_ERROR, an alternate
+ * color may be applied instead of the foreground. Setting this property
+ * will always override those defaults.
+ *
+ * Since: 3.18
+ */
+ g_object_class_install_property (object_class,
+ PROP_UNDERLINE_RGBA,
+ g_param_spec_boxed ("underline-rgba",
+ P_("Underline RGBA"),
+ P_("Color of underline for this text"),
+ GDK_TYPE_RGBA,
+ GTK_PARAM_READWRITE));
+
+ /**
+ * GtkTextTag:strikethrough-rgba:
+ *
+ * This property modifies the color of strikeouts. If not set, strikeouts
+ * will use the forground color.
+ *
+ * Since: 3.18
+ */
+ g_object_class_install_property (object_class,
+ PROP_STRIKETHROUGH_RGBA,
+ g_param_spec_boxed ("strikethrough-rgba",
+ P_("Strike-through RGBA"),
+ P_("Color of strike-through for this text"),
+ GDK_TYPE_RGBA,
+ GTK_PARAM_READWRITE));
+
g_object_class_install_property (object_class,
PROP_WRAP_MODE,
g_param_spec_enum ("wrap-mode",
@@ -746,6 +787,28 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
P_("Underline set"),
P_("Whether this tag affects underlining"));
+ /**
+ * GtkTextTag:underline-rgba-set:
+ *
+ * If the #GtkTextTag:underline-rgba property has been set.
+ *
+ * Since: 3.18
+ */
+ ADD_SET_PROP ("underline-rgba-set", PROP_UNDERLINE_RGBA_SET,
+ P_("Underline RGBA set"),
+ P_("Whether this tag affects underlining color"));
+
+ /**
+ * GtkTextTag:strikethrough-rgba-set:
+ *
+ * If the #GtkTextTag:strikethrough-rgba property has been set.
+ *
+ * Since: 3.18
+ */
+ ADD_SET_PROP ("strikethrough-rgba-set", PROP_STRIKETHROUGH_RGBA_SET,
+ P_("Strikethrough RGBA set"),
+ P_("Whether this tag affects strikethrough color"));
+
ADD_SET_PROP ("wrap-mode-set", PROP_WRAP_MODE_SET,
P_("Wrap mode set"),
P_("Whether this tag affects line wrap mode"));
@@ -863,6 +926,66 @@ copy_gdk_color_to_rgba (GdkColor *src,
}
static void
+set_underline_rgba (GtkTextTag *tag,
+ const GdkRGBA *rgba)
+{
+ GtkTextTagPrivate *priv = tag->priv;
+
+ if (rgba)
+ {
+ GTK_TEXT_APPEARANCE_SET_UNDERLINE_RGBA (&priv->values->appearance, rgba);
+
+ if (!GTK_TEXT_APPEARANCE_GET_UNDERLINE_RGBA_SET (&priv->values->appearance))
+ {
+ GTK_TEXT_APPEARANCE_SET_UNDERLINE_RGBA_SET (&priv->values->appearance, TRUE);
+ g_object_notify (G_OBJECT (tag), "underline-rgba-set");
+ }
+ }
+ else
+ {
+ GdkRGBA black = { 0 };
+
+ GTK_TEXT_APPEARANCE_SET_UNDERLINE_RGBA (&priv->values->appearance, &black);
+
+ if (GTK_TEXT_APPEARANCE_GET_UNDERLINE_RGBA_SET (&priv->values->appearance))
+ {
+ GTK_TEXT_APPEARANCE_SET_UNDERLINE_RGBA_SET (&priv->values->appearance, FALSE);
+ g_object_notify (G_OBJECT (tag), "underline-rgba-set");
+ }
+ }
+}
+
+static void
+set_strikethrough_rgba (GtkTextTag *tag,
+ const GdkRGBA *rgba)
+{
+ GtkTextTagPrivate *priv = tag->priv;
+
+ if (rgba)
+ {
+ GTK_TEXT_APPEARANCE_SET_STRIKETHROUGH_RGBA (&priv->values->appearance, rgba);
+
+ if (!GTK_TEXT_APPEARANCE_GET_STRIKETHROUGH_RGBA_SET (&priv->values->appearance))
+ {
+ GTK_TEXT_APPEARANCE_SET_STRIKETHROUGH_RGBA_SET (&priv->values->appearance, TRUE);
+ g_object_notify (G_OBJECT (tag), "strikethrough-rgba-set");
+ }
+ }
+ else
+ {
+ GdkRGBA black = { 0 };
+
+ GTK_TEXT_APPEARANCE_SET_STRIKETHROUGH_RGBA (&priv->values->appearance, &black);
+
+ if (GTK_TEXT_APPEARANCE_GET_STRIKETHROUGH_RGBA_SET (&priv->values->appearance))
+ {
+ GTK_TEXT_APPEARANCE_SET_STRIKETHROUGH_RGBA_SET (&priv->values->appearance, FALSE);
+ g_object_notify (G_OBJECT (tag), "strikethrough-rgba-set");
+ }
+ }
+}
+
+static void
set_bg_rgba (GtkTextTag *tag, GdkRGBA *rgba)
{
GtkTextTagPrivate *priv = tag->priv;
@@ -1409,6 +1532,13 @@ gtk_text_tag_set_property (GObject *object,
g_object_notify (object, "strikethrough-set");
break;
+ case PROP_STRIKETHROUGH_RGBA:
+ {
+ GdkRGBA *color = g_value_get_boxed (value);
+ set_strikethrough_rgba (text_tag, color);
+ }
+ break;
+
case PROP_RIGHT_MARGIN:
priv->right_margin_set = TRUE;
priv->values->right_margin = g_value_get_int (value);
@@ -1422,6 +1552,13 @@ gtk_text_tag_set_property (GObject *object,
g_object_notify (object, "underline-set");
break;
+ case PROP_UNDERLINE_RGBA:
+ {
+ GdkRGBA *color = g_value_get_boxed (value);
+ set_underline_rgba (text_tag, color);
+ }
+ break;
+
case PROP_RISE:
priv->rise_set = TRUE;
priv->values->appearance.rise = g_value_get_int (value);
@@ -1593,6 +1730,11 @@ gtk_text_tag_set_property (GObject *object,
priv->strikethrough_set = g_value_get_boolean (value);
break;
+ case PROP_STRIKETHROUGH_RGBA_SET:
+ GTK_TEXT_APPEARANCE_SET_STRIKETHROUGH_RGBA_SET (&priv->values->appearance,
+ g_value_get_boolean (value));
+ break;
+
case PROP_RIGHT_MARGIN_SET:
priv->right_margin_set = g_value_get_boolean (value);
size_changed = TRUE;
@@ -1602,6 +1744,11 @@ gtk_text_tag_set_property (GObject *object,
priv->underline_set = g_value_get_boolean (value);
break;
+ case PROP_UNDERLINE_RGBA_SET:
+ GTK_TEXT_APPEARANCE_SET_UNDERLINE_RGBA_SET (&priv->values->appearance,
+ g_value_get_boolean (value));
+ break;
+
case PROP_RISE_SET:
priv->rise_set = g_value_get_boolean (value);
size_changed = TRUE;
@@ -1790,6 +1937,16 @@ gtk_text_tag_get_property (GObject *object,
g_value_set_boolean (value, priv->values->appearance.strikethrough);
break;
+ case PROP_STRIKETHROUGH_RGBA:
+ if (GTK_TEXT_APPEARANCE_GET_STRIKETHROUGH_RGBA_SET (&priv->values->appearance))
+ {
+ GdkRGBA rgba;
+
+ GTK_TEXT_APPEARANCE_GET_STRIKETHROUGH_RGBA (&priv->values->appearance, &rgba);
+ g_value_set_boxed (value, &rgba);
+ }
+ break;
+
case PROP_RIGHT_MARGIN:
g_value_set_int (value, priv->values->right_margin);
break;
@@ -1798,6 +1955,16 @@ gtk_text_tag_get_property (GObject *object,
g_value_set_enum (value, priv->values->appearance.underline);
break;
+ case PROP_UNDERLINE_RGBA:
+ if (GTK_TEXT_APPEARANCE_GET_UNDERLINE_RGBA_SET (&priv->values->appearance))
+ {
+ GdkRGBA rgba;
+
+ GTK_TEXT_APPEARANCE_GET_UNDERLINE_RGBA (&priv->values->appearance, &rgba);
+ g_value_set_boxed (value, &rgba);
+ }
+ break;
+
case PROP_RISE:
g_value_set_int (value, priv->values->appearance.rise);
break;
@@ -1901,6 +2068,11 @@ gtk_text_tag_get_property (GObject *object,
g_value_set_boolean (value, priv->strikethrough_set);
break;
+ case PROP_STRIKETHROUGH_RGBA_SET:
+ g_value_set_boolean (value,
+ GTK_TEXT_APPEARANCE_GET_STRIKETHROUGH_RGBA_SET (&priv->values->appearance));
+ break;
+
case PROP_RIGHT_MARGIN_SET:
g_value_set_boolean (value, priv->right_margin_set);
break;
@@ -1909,6 +2081,11 @@ gtk_text_tag_get_property (GObject *object,
g_value_set_boolean (value, priv->underline_set);
break;
+ case PROP_UNDERLINE_RGBA_SET:
+ g_value_set_boolean (value,
+ GTK_TEXT_APPEARANCE_GET_UNDERLINE_RGBA_SET (&priv->values->appearance));
+ break;
+
case PROP_RISE_SET:
g_value_set_boolean (value, priv->rise_set);
break;