[gimp] app: fix cursor placement and selecting by mouse when there is manual kerning



commit 3d1f677b4f02fc6c2d9f896f3bec070b2c62797f
Author: Michael Natterer <mitch gimp org>
Date:   Mon Mar 1 21:19:08 2010 +0100

    app: fix cursor placement and selecting by mouse when there is manual kerning
    
    Forgot to convert the layout coords to buffer offsets functions when
    porting everything to the new iter/index conversion functions in
    GimpTextBuffer.

 app/tools/gimptexttool-editor.c |   93 ++++++++++++++++++++++----------------
 app/tools/gimptexttool.h        |    2 +-
 2 files changed, 55 insertions(+), 40 deletions(-)
---
diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c
index 21319e7..e5c90c7 100644
--- a/app/tools/gimptexttool-editor.c
+++ b/app/tools/gimptexttool-editor.c
@@ -83,9 +83,10 @@ static void   gimp_text_tool_editor_destroy     (GtkWidget       *dialog,
                                                  GimpTextTool    *text_tool);
 static void   gimp_text_tool_enter_text         (GimpTextTool    *text_tool,
                                                  const gchar     *str);
-static gint   gimp_text_tool_xy_to_offset       (GimpTextTool    *text_tool,
+static gint   gimp_text_tool_xy_to_index        (GimpTextTool    *text_tool,
                                                  gdouble          x,
-                                                 gdouble          y);
+                                                 gdouble          y,
+                                                 gboolean        *trailing);
 static void   gimp_text_tool_im_commit          (GtkIMContext    *context,
                                                  const gchar     *str,
                                                  GimpTextTool    *text_tool);
@@ -270,17 +271,24 @@ gimp_text_tool_editor_button_press (GimpTextTool        *text_tool,
   GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer);
   GtkTextIter    cursor;
   GtkTextIter    selection;
-  gint           offset;
+  gint           index;
+  gboolean       trailing;
 
-  offset = gimp_text_tool_xy_to_offset (text_tool, x, y);
+  index = gimp_text_tool_xy_to_index (text_tool, x, y, &trailing);
 
-  gtk_text_buffer_get_iter_at_offset (buffer, &cursor, offset);
+  gimp_text_buffer_get_iter_at_index (text_tool->buffer, &cursor, index, TRUE);
+  if (trailing)
+    {
+      gtk_text_iter_forward_char (&cursor);
+      index = gimp_text_buffer_get_iter_index (text_tool->buffer,
+                                               &cursor, TRUE);
+    }
 
   selection = cursor;
 
-  text_tool->select_start_offset = offset;
-  text_tool->select_words        = FALSE;
-  text_tool->select_lines        = FALSE;
+  text_tool->select_start_index = index;
+  text_tool->select_words       = FALSE;
+  text_tool->select_lines       = FALSE;
 
   switch (press_type)
     {
@@ -338,19 +346,22 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
   GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer);
   GtkTextIter    cursor;
   GtkTextIter    selection;
-  gint           cursor_offset;
-  gint           selection_offset;
-  gint           offset;
+  gint           cursor_index;
+  gint           selection_index;
+  gint           index;
+  gboolean       trailing;
 
-  offset = gimp_text_tool_xy_to_offset (text_tool, x, y);
+  index = gimp_text_tool_xy_to_index (text_tool, x, y, &trailing);
 
   gtk_text_buffer_get_iter_at_mark (buffer, &cursor,
                                     gtk_text_buffer_get_insert (buffer));
   gtk_text_buffer_get_iter_at_mark (buffer, &selection,
                                     gtk_text_buffer_get_selection_bound (buffer));
 
-  cursor_offset    = gtk_text_iter_get_offset (&cursor);
-  selection_offset = gtk_text_iter_get_offset (&selection);
+  cursor_index    = gimp_text_buffer_get_iter_index (text_tool->buffer,
+                                                     &cursor, TRUE);
+  selection_index = gimp_text_buffer_get_iter_index (text_tool->buffer,
+                                                     &selection, TRUE);
 
   if (text_tool->select_words ||
       text_tool->select_lines)
@@ -358,12 +369,19 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
       GtkTextIter start;
       GtkTextIter end;
 
-      gtk_text_buffer_get_iter_at_offset (buffer, &cursor,
-                                          offset);
-      gtk_text_buffer_get_iter_at_offset (buffer, &selection,
-                                          text_tool->select_start_offset);
+      gimp_text_buffer_get_iter_at_index (text_tool->buffer, &cursor,
+                                          index, TRUE);
+      if (trailing)
+        {
+          gtk_text_iter_forward_char (&cursor);
+          index = gimp_text_buffer_get_iter_index (text_tool->buffer,
+                                                   &cursor, TRUE);
+        }
 
-      if (offset <= text_tool->select_start_offset)
+      gimp_text_buffer_get_iter_at_index (text_tool->buffer, &selection,
+                                          text_tool->select_start_index, TRUE);
+
+      if (index <= text_tool->select_start_index)
         {
           start = cursor;
           end   = selection;
@@ -389,7 +407,7 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
           gtk_text_iter_forward_to_line_end (&end);
         }
 
-      if (offset <= text_tool->select_start_offset)
+      if (index <= text_tool->select_start_index)
         {
           cursor    = start;
           selection = end;
@@ -402,14 +420,19 @@ gimp_text_tool_editor_motion (GimpTextTool *text_tool,
     }
   else
     {
-      if (cursor_offset != offset)
+      if (cursor_index != index)
         {
-          gtk_text_buffer_get_iter_at_offset (buffer, &cursor, offset);
+          gimp_text_buffer_get_iter_at_index (text_tool->buffer, &cursor,
+                                              index, TRUE);
         }
     }
 
-  if (cursor_offset    != gtk_text_iter_get_offset (&cursor) ||
-      selection_offset != gtk_text_iter_get_offset (&selection))
+  if (cursor_index    != gimp_text_buffer_get_iter_index (text_tool->buffer,
+                                                          &cursor,
+                                                          TRUE) ||
+      selection_index != gimp_text_buffer_get_iter_index (text_tool->buffer,
+                                                          &selection,
+                                                          TRUE))
     {
       gimp_draw_tool_pause (GIMP_DRAW_TOOL (text_tool));
 
@@ -1201,15 +1224,14 @@ gimp_text_tool_enter_text (GimpTextTool *text_tool,
 }
 
 static gint
-gimp_text_tool_xy_to_offset (GimpTextTool *text_tool,
-                             gdouble       x,
-                             gdouble       y)
+gimp_text_tool_xy_to_index (GimpTextTool *text_tool,
+                            gdouble       x,
+                            gdouble       y,
+                            gboolean     *trailing)
 {
   PangoLayout    *layout;
   PangoRectangle  ink_extents;
-  gchar          *string;
-  gint            offset;
-  gint            trailing;
+  gint            index;
 
   gimp_text_tool_ensure_layout (text_tool);
 
@@ -1225,19 +1247,12 @@ gimp_text_tool_xy_to_offset (GimpTextTool *text_tool,
   if (ink_extents.y < 0)
     y += ink_extents.y;
 
-  string = gimp_text_buffer_get_text (text_tool->buffer);
-
   pango_layout_xy_to_index (layout,
                             x * PANGO_SCALE,
                             y * PANGO_SCALE,
-                            &offset, &trailing);
-
-  offset = g_utf8_pointer_to_offset (string, string + offset);
-  offset += trailing;
-
-  g_free (string);
+                            &index, trailing);
 
-  return offset;
+  return index;
 }
 
 static void
diff --git a/app/tools/gimptexttool.h b/app/tools/gimptexttool.h
index 4b2c262..e4cacb7 100644
--- a/app/tools/gimptexttool.h
+++ b/app/tools/gimptexttool.h
@@ -69,7 +69,7 @@ struct _GimpTextTool
   GtkWidget      *style_editor;
 
   gboolean        selecting;
-  gint            select_start_offset;
+  gint            select_start_index;
   gboolean        select_words;
   gboolean        select_lines;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]