[gimp] app: create separate tag lists for IME preedit colors.



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]