[gimp] app: create separate tag lists for IME preedit colors.
- From: Jehan Pagès <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: create separate tag lists for IME preedit colors.
- Date: Wed, 1 Jun 2016 15:52:18 +0000 (UTC)
commit cd641fa14f15e85689784cc017e384dfa56a7ccd
Author: Jehan <jehan girinstud io>
Date: Wed Jun 1 17:34:28 2016 +0200
app: create separate tag lists for IME preedit colors.
In particular, I don't want the preedit foreground colors to be
displayed in the text style editor UI. They are only temporary hints
and should not be taken into account as user-chosen style.
app/tools/gimptexttool-editor.c | 12 ++--
app/widgets/gimptextbuffer.c | 138 +++++++++++++++++++++++++++++++++++----
app/widgets/gimptextbuffer.h | 21 ++++--
3 files changed, 144 insertions(+), 27 deletions(-)
---
diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c
index 0ceb257..8061a32 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 271cb41..60564fc 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,90 @@ 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;
+ gchar name[256];
+ GdkColor gdk_color;
+ guchar r, g, b;
+
+ gimp_rgb_get_uchar (color, &r, &g, &b);
+
+ 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;
@@ -1024,7 +1112,7 @@ 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_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 15b7ccd..a155915 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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]