Make 'Line Breaking' UTF-8 safe (to work with non-ASCII characters).
git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@3014 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
parent
8f94954706
commit
72cbba79f7
@ -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>
|
||||
|
30
src/editor.c
30
src/editor.c
@ -346,7 +346,7 @@ static void on_update_ui(GeanyEditor *editor, G_GNUC_UNUSED SCNotification *nt)
|
||||
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 @@ static void check_line_breaking(GeanyEditor *editor, gint pos, gchar c)
|
||||
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 @@ static void check_line_breaking(GeanyEditor *editor, gint pos, gchar c)
|
||||
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 @@ static void check_line_breaking(GeanyEditor *editor, gint pos, gchar c)
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user