Revision: 3014 http://geany.svn.sourceforge.net/geany/?rev=3014&view=rev Author: eht16 Date: 2008-09-27 14:06:43 +0000 (Sat, 27 Sep 2008)
Log Message: ----------- Make 'Line Breaking' UTF-8 safe (to work with non-ASCII characters).
Modified Paths: -------------- trunk/ChangeLog trunk/src/editor.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-09-27 14:06:22 UTC (rev 3013) +++ trunk/ChangeLog 2008-09-27 14:06:43 UTC (rev 3014) @@ -5,6 +5,8 @@ Enable wrapping of messages to avoid horizontal scrolling. Automatically scroll to the end of the messages when showing the dialog or updating its contents. + * src/editor.c: + Make 'Line Breaking' UTF-8 safe (to work with non-ASCII characters).
2008-09-26 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/src/editor.c =================================================================== --- trunk/src/editor.c 2008-09-27 14:06:22 UTC (rev 3013) +++ trunk/src/editor.c 2008-09-27 14:06:43 UTC (rev 3014) @@ -346,7 +346,7 @@ static void check_line_breaking(GeanyEditor *editor, gint pos, gchar c) { ScintillaObject *sci = editor->sci; - gint line, lstart; + gint line, lstart, col;
if (!editor->line_breaking) return; @@ -355,9 +355,12 @@ pos--; /* Look for previous space, not the new one */
line = sci_get_current_line(sci); + lstart = sci_get_position_from_line(sci, line);
- if (pos - lstart < editor_prefs.line_break_column) + /* use column instead of position which might be different with multibyte characters */ + col = sci_get_col_from_position(sci, pos); + if (col < editor_prefs.line_break_column) return;
/* look for the last space before line_break_column */ @@ -368,20 +371,20 @@ c = sci_get_char_at(sci, --pos); if (c == GDK_space) { - gint col, len, diff; + gint diff, last_pos, last_col; const gchar *eol = editor_get_eol_char(editor);
+ /* remember the distance between the current column and the last column on the line + * (we use column position in case the previous line gets altered, such as removing + * trailing spaces or in case it contains multibyte characters) */ + last_pos = sci_get_line_end_position(sci, line); + last_col = sci_get_col_from_position(sci, last_pos); + diff = last_col - col; + /* break the line after the space */ sci_insert_text(sci, pos + 1, eol); line++;
- /* remember distance from end of line (we use column position in case - * the previous line gets altered, such as removing trailing spaces). */ - pos = sci_get_current_position(sci); - len = sci_get_line_length(sci, line); - col = sci_get_col_from_position(sci, pos); - diff = len - col; - /* set position as if user had pressed return */ pos = sci_get_position_from_line(sci, line); sci_set_current_position(sci, pos, FALSE); @@ -389,9 +392,12 @@ on_new_line_added(editor);
/* correct cursor position (might not be at line end) */ - pos = sci_get_position_from_line(sci, line); - pos += sci_get_line_length(sci, line) - diff; + last_pos = sci_get_line_end_position(sci, line); + last_col = sci_get_col_from_position(sci, last_pos); /* get last column on line */ + /* last column - distance is the desired column, then retrieve its document position */ + pos = SSM(sci, SCI_FINDCOLUMN, line, last_col - diff); sci_set_current_position(sci, pos, FALSE); + return; } }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.