Matthew Barnes 13b7de
--- evolution-2.8.0/widgets/text/e-text.c.indic-cursor-movement	2006-09-13 14:53:39.000000000 -0400
Matthew Barnes 13b7de
+++ evolution-2.8.0/widgets/text/e-text.c	2006-09-13 14:53:48.000000000 -0400
Matthew Barnes 13b7de
@@ -2876,6 +2876,76 @@
Matthew Barnes 13b7de
 	}
Matthew Barnes 13b7de
 }
Matthew Barnes 13b7de
 
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+/* direction = TRUE (move forward), FALSE (move backward)
Matthew Barnes 13b7de
+   Any error shall return length(text->text) or 0 or text->selection_end (as deemed fit) */
Matthew Barnes 13b7de
+static int
Matthew Barnes 13b7de
+_get_updated_position (EText *text, gboolean direction)
Matthew Barnes 13b7de
+{
Matthew Barnes 13b7de
+	PangoLogAttr *log_attrs = NULL;
Matthew Barnes 13b7de
+	gint n_attrs;
Matthew Barnes 13b7de
+	char *p = NULL;
Matthew Barnes 13b7de
+	gint new_pos = 0;
Matthew Barnes 13b7de
+	gint length = 0;
Matthew Barnes 13b7de
+	
Matthew Barnes 13b7de
+	/* Basic sanity test, return whatever position we are currently at. */
Matthew Barnes 13b7de
+	g_return_val_if_fail (text->layout != NULL, text->selection_end);
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+	length = g_utf8_strlen (text->text, -1);	
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+	/* length checks to make sure we are not wandering off into nonexistant memory... */
Matthew Barnes 13b7de
+	if((text->selection_end >= length) && (TRUE == direction))	/* forward */
Matthew Barnes 13b7de
+		return length;
Matthew Barnes 13b7de
+	/* checking for -ve value wont hurt! */
Matthew Barnes 13b7de
+	if((text->selection_end <= 0) && (FALSE == direction))		/* backward */
Matthew Barnes 13b7de
+		return 0;
Matthew Barnes 13b7de
+	
Matthew Barnes 13b7de
+	/* check for validness of full text->text */
Matthew Barnes 13b7de
+	if(!g_utf8_validate(text->text, -1, NULL))
Matthew Barnes 13b7de
+		return text->selection_end;
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+	/* get layout's PangoLogAttr to facilitate moving when moving across grapheme cluster as in indic langs */
Matthew Barnes 13b7de
+	pango_layout_get_log_attrs (text->layout, &log_attrs, &n_attrs);
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+	/* Fetch the current char index in the line & keep moving
Matthew Barnes 13b7de
+	   forward until we can display cursor */
Matthew Barnes 13b7de
+	p = g_utf8_offset_to_pointer (text->text, text->selection_end);
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+	new_pos = text->selection_end;
Matthew Barnes 13b7de
+	while(1)
Matthew Barnes 13b7de
+	{
Matthew Barnes 13b7de
+		/* check before moving forward/backwards if we have more chars to move or not */
Matthew Barnes 13b7de
+		if(TRUE == direction)
Matthew Barnes 13b7de
+			p = g_utf8_next_char (p);
Matthew Barnes 13b7de
+		else
Matthew Barnes 13b7de
+			p = g_utf8_prev_char (p);
Matthew Barnes 13b7de
+			
Matthew Barnes 13b7de
+		/* validate the new string & return with original position if check fails */
Matthew Barnes 13b7de
+		if(!g_utf8_validate (p, -1, NULL))
Matthew Barnes 13b7de
+			break;	/* will return old value of new_pos */
Matthew Barnes 13b7de
+			
Matthew Barnes 13b7de
+		new_pos = g_utf8_pointer_to_offset (text->text, p);
Matthew Barnes 13b7de
+		
Matthew Barnes 13b7de
+		/* if is_cursor_position is set, cursor can appear in front of character.
Matthew Barnes 13b7de
+		   i.e. this is a grapheme boundary AND make some sanity checks */
Matthew Barnes 13b7de
+		if((new_pos >=0) && (new_pos < n_attrs) && (log_attrs[new_pos].is_cursor_position))
Matthew Barnes 13b7de
+			break;
Matthew Barnes 13b7de
+		else if((new_pos < 0) || (new_pos >= n_attrs))
Matthew Barnes 13b7de
+		{
Matthew Barnes 13b7de
+			new_pos = text->selection_end;
Matthew Barnes 13b7de
+			break;
Matthew Barnes 13b7de
+		}
Matthew Barnes 13b7de
+	}
Matthew Barnes 13b7de
+	
Matthew Barnes 13b7de
+	if(log_attrs)
Matthew Barnes 13b7de
+		g_free(log_attrs);
Matthew Barnes 13b7de
+	
Matthew Barnes 13b7de
+	return new_pos;
Matthew Barnes 13b7de
+}
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
+
Matthew Barnes 13b7de
 static int
Matthew Barnes 13b7de
 _get_position(EText *text, ETextEventProcessorCommand *command)
Matthew Barnes 13b7de
 {
Matthew Barnes 13b7de
@@ -2951,15 +3021,14 @@
Matthew Barnes 13b7de
 		if (text->selection_end >= length)
Matthew Barnes 13b7de
 			new_pos = length;
Matthew Barnes 13b7de
 		else
Matthew Barnes 13b7de
-			new_pos = text->selection_end + 1;
Matthew Barnes 13b7de
-
Matthew Barnes 13b7de
+			new_pos = _get_updated_position(text, TRUE);	/* get updated position to display cursor */
Matthew Barnes 13b7de
+		
Matthew Barnes 13b7de
 		break;
Matthew Barnes 13b7de
 
Matthew Barnes 13b7de
 	case E_TEP_BACKWARD_CHARACTER:
Matthew Barnes 13b7de
 		new_pos = 0;
Matthew Barnes 13b7de
-		if (text->selection_end >= 1) {
Matthew Barnes 13b7de
-			new_pos = text->selection_end - 1;
Matthew Barnes 13b7de
-		}
Matthew Barnes 13b7de
+		if (text->selection_end >= 1)
Matthew Barnes 13b7de
+			new_pos = _get_updated_position(text, FALSE);	/* get updated position to display cursor */
Matthew Barnes 13b7de
 
Matthew Barnes 13b7de
 		break;
Matthew Barnes 13b7de
 
Matthew Barnes 13b7de
@@ -3341,6 +3410,7 @@
Matthew Barnes 13b7de
 	if (!text->layout)
Matthew Barnes 13b7de
 		create_layout (text);
Matthew Barnes 13b7de
 
Matthew Barnes 13b7de
+	/* We move cursor only if scroll is TRUE */
Matthew Barnes 13b7de
 	if (scroll && !text->button_down) {
Matthew Barnes 13b7de
 		/* XXX do we really need the @trailing logic here?  if
Matthew Barnes 13b7de
 		   we don't we can scrap the loop and just use
Matthew Barnes 13b7de
@@ -3349,7 +3419,9 @@
Matthew Barnes 13b7de
 		int selection_index;
Matthew Barnes 13b7de
 		PangoLayoutIter *iter = pango_layout_get_iter (text->layout);
Matthew Barnes 13b7de
 
Matthew Barnes 13b7de
+		/* check if we are using selection_start or selection_end for moving? */
Matthew Barnes 13b7de
 		selection_index = use_start ? text->selection_start : text->selection_end;
Matthew Barnes 13b7de
+		
Matthew Barnes 13b7de
 		/* convert to a byte index */
Matthew Barnes 13b7de
 		selection_index = g_utf8_offset_to_pointer (text->text, selection_index) - text->text;
Matthew Barnes 13b7de