diff options
| author | Michele Calgaro <michele.calgaro@yahoo.it> | 2025-01-30 23:40:14 +0900 |
|---|---|---|
| committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2025-02-13 22:39:51 +0900 |
| commit | 67cb0f6762768ee0d32adef1d7307ff7bb985407 (patch) | |
| tree | 9c391724f3eae5ba2b8279ea9de6245a1f44d25b /src/widgets | |
| parent | fd79f0c8b020ff0c60b62c83745beb030ef38997 (diff) | |
| download | tqt-67cb0f67.tar.gz tqt-67cb0f67.zip | |
Fix editing of text containing surrogate characters.
This relates to issue #162.
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit 9c648bea9bfb1113c070a05b36f78ff006d0877a)
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/qlineedit.cpp | 14 | ||||
| -rw-r--r-- | src/widgets/qtextedit.cpp | 16 |
2 files changed, 25 insertions, 5 deletions
diff --git a/src/widgets/qlineedit.cpp b/src/widgets/qlineedit.cpp index bcf9b2d0d..eba3f6b20 100644 --- a/src/widgets/qlineedit.cpp +++ b/src/widgets/qlineedit.cpp @@ -877,10 +877,18 @@ void TQLineEdit::backspace() if ( d->hasSelectedText() ) { d->removeSelectedText(); } else if ( d->cursor ) { + --d->cursor; + if ( d->maskData ) { + d->cursor = d->prevMaskBlank( d->cursor ); + } + // second half of a surrogate, check if we have the first half as well, + // if yes delete both at once + if (d->cursor > 0 && d->text.at(d->cursor).isLowSurrogate() && + d->text.at(d->cursor - 1).isHighSurrogate()) { + d->del(true); --d->cursor; - if ( d->maskData ) - d->cursor = d->prevMaskBlank( d->cursor ); - d->del( TRUE ); + } + d->del(true); } d->finishChange( priorState ); } diff --git a/src/widgets/qtextedit.cpp b/src/widgets/qtextedit.cpp index bac58af15..73e800be8 100644 --- a/src/widgets/qtextedit.cpp +++ b/src/widgets/qtextedit.cpp @@ -1783,8 +1783,20 @@ void TQTextEdit::doKeyboardAction( KeyboardAction action ) undoRedoInfo.index = cursor->index(); undoRedoInfo.d->text = TQString::null; } - undoRedoInfo.d->text.insert( 0, cursor->paragraph()->at( cursor->index()-1 ), TRUE ); - undoRedoInfo.index = cursor->index()-1; + int cur_idx = cursor->index(); + const TQTextParagraph *para = cursor->paragraph(); + if (para->at(cur_idx - 1)->c.isLowSurrogate() && cur_idx > 1 && + para->at(cur_idx - 2)->c.isHighSurrogate()) + { + undoRedoInfo.d->text.insert( 0, para->at(cur_idx - 1), TRUE ); + undoRedoInfo.d->text.insert( 0, para->at(cur_idx - 2), TRUE ); + undoRedoInfo.index = cursor->index() - 2; + } + else + { + undoRedoInfo.d->text.insert( 0, para->at(cur_idx - 1), TRUE ); + undoRedoInfo.index = cursor->index() - 1; + } } cursor->removePreviousChar(); lastFormatted = cursor->paragraph(); |
