From 69ea470a26b5b9b710d099a8764e9d7cbf2fe2ab Mon Sep 17 00:00:00 2001 From: Evgeny Pestov Date: Fri, 17 Dec 2021 00:49:16 +0700 Subject: [PATCH] CEdit::MoveChar never moves cursor between bytes of one UTF-8 symbol --- src/ui/controls/edit.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ui/controls/edit.cpp b/src/ui/controls/edit.cpp index d9d31605..037a8d06 100644 --- a/src/ui/controls/edit.cpp +++ b/src/ui/controls/edit.cpp @@ -2261,7 +2261,7 @@ void CEdit::MoveChar(int move, bool bWord, bool bSelect) { int character; - if ( move == -1 ) // back? + if ( move == -1 ) // back { if ( bWord ) { @@ -2306,12 +2306,15 @@ void CEdit::MoveChar(int move, bool bWord, bool bSelect) } else { - m_cursor1 --; - if ( m_cursor1 < 0 ) m_cursor1 = 0; + if ( m_cursor1 > 0 ) + { + m_cursor1 --; + while ( m_cursor1 > 0 && (m_text[m_cursor1] & 0xC0) == 0x80 ) m_cursor1 --; + } } } - if ( move == 1 ) // advance? + if ( move == 1 ) // advance { if ( bWord ) { @@ -2356,8 +2359,11 @@ void CEdit::MoveChar(int move, bool bWord, bool bSelect) } else { - m_cursor1 ++; - if ( m_cursor1 > m_len ) m_cursor1 = m_len; + if ( m_cursor1 < m_len ) + { + m_cursor1 ++; + while ( m_cursor1 < m_len && (m_text[m_cursor1] & 0xC0) == 0x80 ) m_cursor1 ++; + } } }