diff --git a/src/Character.h b/src/Character.h --- a/src/Character.h +++ b/src/Character.h @@ -25,6 +25,10 @@ // Konsole #include "CharacterColor.h" +#include "konsole_wcwidth.h" + +// Qt +#include namespace Konsole { typedef unsigned char LineProperty; @@ -155,6 +159,27 @@ return QChar(character).isSpace(); } } + + inline int width() const { + return width(character); + } + + static int width(uint ucs4) { + return konsole_wcwidth(ucs4); + } + + static int stringWidth(const uint *ucs4Str, int len) { + int w = 0; + for (int i = 0; i < len; ++i) { + w += width(ucs4Str[i]); + } + return w; + } + + inline static int stringWidth(const QString &str) { + auto ucs4Str = str.toUcs4(); + return stringWidth(ucs4Str.constData(), ucs4Str.length()); + } }; inline bool operator ==(const Character &a, const Character &b) diff --git a/src/Filter.cpp b/src/Filter.cpp --- a/src/Filter.cpp +++ b/src/Filter.cpp @@ -40,7 +40,6 @@ // Konsole #include "Session.h" #include "TerminalCharacterDecoder.h" -#include "konsole_wcwidth.h" using namespace Konsole; diff --git a/src/Screen.cpp b/src/Screen.cpp --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -27,7 +27,6 @@ #include // Konsole -#include "konsole_wcwidth.h" #include "TerminalCharacterDecoder.h" #include "History.h" #include "ExtendedCharTable.h" @@ -691,7 +690,7 @@ // We indicate the fact that a newline has to be triggered by // putting the cursor one right to the last column of the screen. - int w = konsole_wcwidth(c); + int w = Character::width(c); if (w < 0) { // Non-printable character diff --git a/src/TerminalCharacterDecoder.cpp b/src/TerminalCharacterDecoder.cpp --- a/src/TerminalCharacterDecoder.cpp +++ b/src/TerminalCharacterDecoder.cpp @@ -26,7 +26,6 @@ #include // Konsole -#include "konsole_wcwidth.h" #include "ExtendedCharTable.h" #include "ColorScheme.h" @@ -154,7 +153,7 @@ // of `dialog --infobox "qwe" 10 10` . if (characters[i].isRealCharacter || i <= realCharacterGuard) { plainText.append(QString::fromUcs4(&characters[i].character, 1)); - i += qMax(1, konsole_wcwidth(characters[i].character)); + i += qMax(1, characters[i].width()); } else { ++i; // should we 'break' directly here? } diff --git a/src/TerminalDisplay.cpp b/src/TerminalDisplay.cpp --- a/src/TerminalDisplay.cpp +++ b/src/TerminalDisplay.cpp @@ -61,7 +61,6 @@ // Konsole #include "Filter.h" #include "konsoledebug.h" -#include "konsole_wcwidth.h" #include "TerminalCharacterDecoder.h" #include "Screen.h" #include "LineFont.h" @@ -1991,7 +1990,7 @@ const int cursorLocation = loc(cursorPosition().x(), cursorPosition().y()); Q_ASSERT(cursorLocation < _imageSize); - int charWidth = konsole_wcwidth(_image[cursorLocation].character); + int charWidth = _image[cursorLocation].width(); QRect cursorRect = imageToWidget(QRect(cursorPosition(), QSize(charWidth, 1))); update(cursorRect); } diff --git a/src/autotests/CharacterWidthTest.cpp b/src/autotests/CharacterWidthTest.cpp --- a/src/autotests/CharacterWidthTest.cpp +++ b/src/autotests/CharacterWidthTest.cpp @@ -23,7 +23,7 @@ // KDE #include -#include "../konsole_wcwidth.h" +#include "../Character.h" #include "konsoleprivate_export.h" using namespace Konsole; @@ -69,7 +69,7 @@ QEXPECT_FAIL("0x1F943 tumbler glass", "emoji width currently broken", Continue); QEXPECT_FAIL("0x1F944 spoon", "emoji width currently broken", Continue); - QTEST(konsole_wcwidth(character), "width"); + QTEST(Character::width(character), "width"); } QTEST_GUILESS_MAIN(CharacterWidthTest)