Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.0
konsole
konsole-D10064.id25855.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor