File konsole-D10064.id25855.diff of Package konsole
Subject: Support ECMA-48 REP
From: Chih-Hsuan Yen
References: boo#1054448
References: bsc#1078565
References: kde#384620
Based on https://phabricator.kde.org/D10064
diff --git konsole-17.12.1/src/Screen.cpp konsole-17.12.1/src/Screen.cpp
--- konsole-17.12.1/src/Screen.cpp
+++ konsole-17.12.1/src/Screen.cpp
@@ -73,7 +73,8 @@ Screen::Screen(int lines, int columns):
_effectiveForeground(CharacterColor()),
_effectiveBackground(CharacterColor()),
_effectiveRendition(DEFAULT_RENDITION),
- _lastPos(-1)
+ _lastPos(-1),
+ _lastDrawnChar(0)
{
_lineProperties.resize(_lines + 1);
for (int i = 0; i < _lines + 1; i++)
@@ -223,6 +224,24 @@ void Screen::insertChars(int n)
_screenLines[_cuY].resize(_columns);
}
+void Screen::repeatChars(int n)
+{
+ if (n == 0) {
+ n = 1; // Default
+ }
+
+ // From ECMA-48 version 5, section 8.3.103:
+ // "If the character preceding REP is a control function or part of a
+ // control function, the effect of REP is not defined by this Standard."
+ //
+ // So, a "normal" program should always use REP immediately after a visible
+ // character (those other than escape sequences). So, _lastDrawnChar can be
+ // safely used.
+ for (int i = 0; i < n; i++) {
+ displayCharacter(_lastDrawnChar);
+ }
+}
+
void Screen::deleteLines(int n)
{
if (n == 0) n = 1; // Default
@@ -695,6 +714,8 @@ void Screen::displayCharacter(unsigned s
currentChar.rendition = _effectiveRendition;
currentChar.isRealCharacter = true;
+ _lastDrawnChar = c;
+
int i = 0;
const int newCursorX = _cuX + w--;
while (w != 0) {
diff --git konsole-17.12.1/src/Screen.h konsole-17.12.1/src/Screen.h
--- konsole-17.12.1/src/Screen.h
+++ konsole-17.12.1/src/Screen.h
@@ -203,6 +203,11 @@ public:
*/
void insertChars(int n);
/**
+ * Repeat the preceeding graphic character @n times, including SPACE.
+ * If @n is 0 then the character is repeated once.
+ */
+ void repeatChars(int n);
+ /**
* Removes @p n lines beginning from the current cursor position.
* The position of the cursor is not altered.
* If @p n is 0 then one line is removed.
@@ -714,6 +719,9 @@ private:
// last position where we added a character
int _lastPos;
+
+ // used in REP (repeating char)
+ unsigned short _lastDrawnChar;
};
}
diff --git konsole-17.12.1/src/Vt102Emulation.cpp konsole-17.12.1/src/Vt102Emulation.cpp
--- konsole-17.12.1/src/Vt102Emulation.cpp
+++ konsole-17.12.1/src/Vt102Emulation.cpp
@@ -240,7 +240,7 @@ void Vt102Emulation::initTokenizer()
for (i = 32; i < 256; ++i) {
charClass[i] |= CHR;
}
- for (s = (quint8 *)"@ABCDGHILMPSTXZcdfry"; *s != 0u; ++s) {
+ for (s = (quint8 *)"@ABCDGHILMPSTXZbcdfry"; *s != 0u; ++s) {
charClass[*s] |= CPN;
}
// resize = \e[8;<row>;<col>t
@@ -680,6 +680,7 @@ void Vt102Emulation::processToken(int to
case TY_CSI_PN('T' ) : _currentScreen->scrollDown (p ); break;
case TY_CSI_PN('X' ) : _currentScreen->eraseChars (p ); break;
case TY_CSI_PN('Z' ) : _currentScreen->backtab (p ); break;
+ case TY_CSI_PN('b' ) : _currentScreen->repeatChars (p ); break;
case TY_CSI_PN('c' ) : reportTerminalType ( ); break; //VT100
case TY_CSI_PN('d' ) : _currentScreen->setCursorY (p ); break; //LINUX
case TY_CSI_PN('f' ) : _currentScreen->setCursorYX (p, q); break; //VT100