diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c index 0ceb2571e9..8061a326a5 100644 --- a/app/tools/gimptexttool-editor.c +++ b/app/tools/gimptexttool-editor.c @@ -1465,15 +1465,15 @@ gimp_text_tool_im_preedit_changed (GtkIMContext *context, if (attr->klass->type == PANGO_ATTR_BACKGROUND) { - gimp_text_buffer_set_bg_color (text_tool->buffer, - &start, &end, - &color); + gimp_text_buffer_set_preedit_bg_color (text_tool->buffer, + &start, &end, + &color); } else { - gimp_text_buffer_set_color (text_tool->buffer, - &start, &end, - &color); + gimp_text_buffer_set_preedit_color (text_tool->buffer, + &start, &end, + &color); } } break; diff --git a/app/widgets/gimptextbuffer.c b/app/widgets/gimptextbuffer.c index 271cb41901..60564fc21f 100644 --- a/app/widgets/gimptextbuffer.c +++ b/app/widgets/gimptextbuffer.c @@ -160,10 +160,16 @@ gimp_text_buffer_finalize (GObject *object) buffer->color_tags = NULL; } - if (buffer->bg_color_tags) + if (buffer->preedit_color_tags) { - g_list_free (buffer->bg_color_tags); - buffer->bg_color_tags = NULL; + g_list_free (buffer->preedit_color_tags); + buffer->preedit_color_tags = NULL; + } + + if (buffer->preedit_bg_color_tags) + { + g_list_free (buffer->preedit_bg_color_tags); + buffer->preedit_bg_color_tags = NULL; } gimp_text_buffer_clear_insert_tags (buffer); @@ -1013,8 +1019,8 @@ gimp_text_buffer_set_color (GimpTextBuffer *buffer, } GtkTextTag * -gimp_text_buffer_get_bg_color_tag (GimpTextBuffer *buffer, - const GimpRGB *color) +gimp_text_buffer_get_preedit_color_tag (GimpTextBuffer *buffer, + const GimpRGB *color) { GList *list; GtkTextTag *tag; @@ -1024,7 +1030,89 @@ gimp_text_buffer_get_bg_color_tag (GimpTextBuffer *buffer, gimp_rgb_get_uchar (color, &r, &g, &b); - for (list = buffer->bg_color_tags; list; list = g_list_next (list)) + for (list = buffer->preedit_color_tags; list; list = g_list_next (list)) + { + GimpRGB tag_color; + guchar tag_r, tag_g, tag_b; + + tag = list->data; + + gimp_text_tag_get_color (tag, &tag_color); + + gimp_rgb_get_uchar (&tag_color, &tag_r, &tag_g, &tag_b); + + /* Do not compare the alpha channel, since it's unused */ + if (tag_r == r && + tag_g == g && + tag_b == b) + { + return tag; + } + } + + g_snprintf (name, sizeof (name), "preedit-color-#%02x%02x%02x", + r, g, b); + + gimp_rgb_get_gdk_color (color, &gdk_color); + + tag = gtk_text_buffer_create_tag (GTK_TEXT_BUFFER (buffer), + name, + "foreground-gdk", &gdk_color, + "foreground-set", TRUE, + NULL); + + buffer->preedit_color_tags = g_list_prepend (buffer->preedit_color_tags, tag); + + return tag; +} + +void +gimp_text_buffer_set_preedit_color (GimpTextBuffer *buffer, + const GtkTextIter *start, + const GtkTextIter *end, + const GimpRGB *color) +{ + GList *list; + + g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer)); + g_return_if_fail (start != NULL); + g_return_if_fail (end != NULL); + + if (gtk_text_iter_equal (start, end)) + return; + + gtk_text_buffer_begin_user_action (GTK_TEXT_BUFFER (buffer)); + + for (list = buffer->preedit_color_tags; list; list = g_list_next (list)) + { + gtk_text_buffer_remove_tag (GTK_TEXT_BUFFER (buffer), list->data, + start, end); + } + + if (color) + { + GtkTextTag *tag = gimp_text_buffer_get_preedit_color_tag (buffer, color); + + gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), tag, + start, end); + } + + gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer)); +} + +GtkTextTag * +gimp_text_buffer_get_preedit_bg_color_tag (GimpTextBuffer *buffer, + const GimpRGB *color) +{ + GList *list; + GtkTextTag *tag; + gchar name[256]; + GdkColor gdk_color; + guchar r, g, b; + + gimp_rgb_get_uchar (color, &r, &g, &b); + + for (list = buffer->preedit_bg_color_tags; list; list = g_list_next (list)) { GimpRGB tag_color; guchar tag_r, tag_g, tag_b; @@ -1055,16 +1143,16 @@ gimp_text_buffer_get_bg_color_tag (GimpTextBuffer *buffer, "background-set", TRUE, NULL); - buffer->bg_color_tags = g_list_prepend (buffer->bg_color_tags, tag); + buffer->preedit_bg_color_tags = g_list_prepend (buffer->preedit_bg_color_tags, tag); return tag; } void -gimp_text_buffer_set_bg_color (GimpTextBuffer *buffer, - const GtkTextIter *start, - const GtkTextIter *end, - const GimpRGB *color) +gimp_text_buffer_set_preedit_bg_color (GimpTextBuffer *buffer, + const GtkTextIter *start, + const GtkTextIter *end, + const GimpRGB *color) { GList *list; @@ -1077,7 +1165,7 @@ gimp_text_buffer_set_bg_color (GimpTextBuffer *buffer, gtk_text_buffer_begin_user_action (GTK_TEXT_BUFFER (buffer)); - for (list = buffer->bg_color_tags; list; list = g_list_next (list)) + for (list = buffer->preedit_bg_color_tags; list; list = g_list_next (list)) { gtk_text_buffer_remove_tag (GTK_TEXT_BUFFER (buffer), list->data, start, end); @@ -1085,7 +1173,7 @@ gimp_text_buffer_set_bg_color (GimpTextBuffer *buffer, if (color) { - GtkTextTag *tag = gimp_text_buffer_get_bg_color_tag (buffer, color); + GtkTextTag *tag = gimp_text_buffer_get_preedit_bg_color_tag (buffer, color); gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), tag, start, end); @@ -1102,6 +1190,7 @@ gimp_text_buffer_set_bg_color (GimpTextBuffer *buffer, #define GIMP_TEXT_ATTR_NAME_FONT "font" #define GIMP_TEXT_ATTR_NAME_STYLE "style" #define GIMP_TEXT_ATTR_NAME_COLOR "foreground" +#define GIMP_TEXT_ATTR_NAME_FG_COLOR "fgcolor" #define GIMP_TEXT_ATTR_NAME_BG_COLOR "background" #define GIMP_TEXT_ATTR_NAME_UNDERLINE "underline" @@ -1194,7 +1283,28 @@ gimp_text_buffer_tag_to_name (GimpTextBuffer *buffer, return "span"; } - else if (g_list_find (buffer->bg_color_tags, tag)) + else if (g_list_find (buffer->preedit_color_tags, tag)) + { + /* "foreground" and "fgcolor" attributes are similar, but I use + * one or the other as a trick to differentiate the color chosen + * from the user and a display color for preedit. */ + if (attribute) + *attribute = GIMP_TEXT_ATTR_NAME_FG_COLOR; + + if (value) + { + GimpRGB color; + guchar r, g, b; + + gimp_text_tag_get_color (tag, &color); + gimp_rgb_get_uchar (&color, &r, &g, &b); + + *value = g_strdup_printf ("#%02x%02x%02x", r, g, b); + } + + return "span"; + } + else if (g_list_find (buffer->preedit_bg_color_tags, tag)) { if (attribute) *attribute = GIMP_TEXT_ATTR_NAME_BG_COLOR; diff --git a/app/widgets/gimptextbuffer.h b/app/widgets/gimptextbuffer.h index 15b7ccd47f..a155915a7e 100644 --- a/app/widgets/gimptextbuffer.h +++ b/app/widgets/gimptextbuffer.h @@ -45,9 +45,10 @@ struct _GimpTextBuffer GList *kerning_tags; GList *font_tags; GList *color_tags; - GList *bg_color_tags; GtkTextTag *preedit_underline_tag; + GList *preedit_color_tags; + GList *preedit_bg_color_tags; gboolean insert_tags_set; GList *insert_tags; @@ -134,12 +135,18 @@ void gimp_text_buffer_set_color (GimpTextBuffer *buffer, const GtkTextIter *end, const GimpRGB *color); -GtkTextTag * gimp_text_buffer_get_bg_color_tag (GimpTextBuffer *buffer, - const GimpRGB *color); -void gimp_text_buffer_set_bg_color (GimpTextBuffer *buffer, - const GtkTextIter *start, - const GtkTextIter *end, - const GimpRGB *color); +GtkTextTag * gimp_text_buffer_get_preedit_color_tag (GimpTextBuffer *buffer, + const GimpRGB *color); +void gimp_text_buffer_set_preedit_color (GimpTextBuffer *buffer, + const GtkTextIter *start, + const GtkTextIter *end, + const GimpRGB *color); +GtkTextTag * gimp_text_buffer_get_preedit_bg_color_tag (GimpTextBuffer *buffer, + const GimpRGB *color); +void gimp_text_buffer_set_preedit_bg_color (GimpTextBuffer *buffer, + const GtkTextIter *start, + const GtkTextIter *end, + const GimpRGB *color); const gchar * gimp_text_buffer_tag_to_name (GimpTextBuffer *buffer, GtkTextTag *tag,