|
@@ -667,9 +667,9 @@ static int is_word_boundary( IMSTB_TEXTEDIT_STRING *str, int idx )
|
|
|
#ifndef STB_TEXTEDIT_MOVEWORDLEFT
|
|
|
static int stb_textedit_move_to_word_previous( IMSTB_TEXTEDIT_STRING *str, int c )
|
|
|
{
|
|
|
- --c; // always move at least one character
|
|
|
- while( c >= 0 && !is_word_boundary( str, c ) )
|
|
|
- --c;
|
|
|
+ c = IMSTB_TEXTEDIT_GETPREVCHARINDEX( str, c ); // always move at least one character
|
|
|
+ while (c >= 0 && !is_word_boundary(str, c))
|
|
|
+ c = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, c);
|
|
|
|
|
|
if( c < 0 )
|
|
|
c = 0;
|
|
@@ -683,9 +683,9 @@ static int stb_textedit_move_to_word_previous( IMSTB_TEXTEDIT_STRING *str, int c
|
|
|
static int stb_textedit_move_to_word_next( IMSTB_TEXTEDIT_STRING *str, int c )
|
|
|
{
|
|
|
const int len = STB_TEXTEDIT_STRINGLEN(str);
|
|
|
- ++c; // always move at least one character
|
|
|
+ c = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, c); // always move at least one character
|
|
|
while( c < len && !is_word_boundary( str, c ) )
|
|
|
- ++c;
|
|
|
+ c = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, c);
|
|
|
|
|
|
if( c > len )
|
|
|
c = len;
|
|
@@ -1005,8 +1005,13 @@ retry:
|
|
|
// go to previous line
|
|
|
// (we need to scan previous line the hard way. maybe we could expose this as a new API function?)
|
|
|
prev_scan = find.prev_first > 0 ? find.prev_first - 1 : 0;
|
|
|
- while (prev_scan > 0 && STB_TEXTEDIT_GETCHAR(str, prev_scan - 1) != STB_TEXTEDIT_NEWLINE)
|
|
|
- --prev_scan;
|
|
|
+ while (prev_scan > 0)
|
|
|
+ {
|
|
|
+ int prev = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, prev_scan);
|
|
|
+ if (STB_TEXTEDIT_GETCHAR(str, prev) == STB_TEXTEDIT_NEWLINE)
|
|
|
+ break;
|
|
|
+ prev_scan = prev;
|
|
|
+ }
|
|
|
find.first_char = find.prev_first;
|
|
|
find.prev_first = prev_scan;
|
|
|
}
|
|
@@ -1085,7 +1090,7 @@ retry:
|
|
|
if (state->single_line)
|
|
|
state->cursor = 0;
|
|
|
else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE)
|
|
|
- --state->cursor;
|
|
|
+ state->cursor = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
|
|
|
state->has_preferred_x = 0;
|
|
|
break;
|
|
|
|
|
@@ -1097,9 +1102,9 @@ retry:
|
|
|
stb_textedit_clamp(str, state);
|
|
|
stb_textedit_move_to_first(state);
|
|
|
if (state->single_line)
|
|
|
- state->cursor = n;
|
|
|
+ state->cursor = n;
|
|
|
else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE)
|
|
|
- ++state->cursor;
|
|
|
+ state->cursor = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, state->cursor);
|
|
|
state->has_preferred_x = 0;
|
|
|
break;
|
|
|
}
|
|
@@ -1113,7 +1118,7 @@ retry:
|
|
|
if (state->single_line)
|
|
|
state->cursor = 0;
|
|
|
else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE)
|
|
|
- --state->cursor;
|
|
|
+ state->cursor = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
|
|
|
state->select_end = state->cursor;
|
|
|
state->has_preferred_x = 0;
|
|
|
break;
|
|
@@ -1128,7 +1133,7 @@ retry:
|
|
|
if (state->single_line)
|
|
|
state->cursor = n;
|
|
|
else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE)
|
|
|
- ++state->cursor;
|
|
|
+ state->cursor = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, state->cursor);
|
|
|
state->select_end = state->cursor;
|
|
|
state->has_preferred_x = 0;
|
|
|
break;
|