Warning, file /plasma/libksysguard/processui/KTextEditVT.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 KSysGuard, the KDE System Guard 0003 0004 SPDX-FileCopyrightText: 2007 Trent Waddington <trent.waddington@gmail.com> 0005 SPDX-FileCopyrightText: 2008 John Tapsell <tapsell@kde.org> 0006 0007 SPDX-License-Identifier: LGPL-2.0-or-later 0008 0009 0010 */ 0011 0012 #include "KTextEditVT.h" 0013 0014 #include <QFontDatabase> 0015 0016 KTextEditVT::KTextEditVT(QWidget *parent) 0017 : QTextEdit(parent) 0018 , escape_code(QChar(0)) 0019 { 0020 mParseAnsi = true; 0021 escape_sequence = false; 0022 escape_CSI = false; 0023 escape_OSC = false; 0024 escape_number1 = -1; 0025 escape_number_separator = false; 0026 escape_number2 = -1; 0027 setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); 0028 } 0029 0030 void KTextEditVT::insertVTChar(const QChar &c) 0031 { 0032 if (escape_sequence) { 0033 if (escape_CSI || escape_OSC) { 0034 if (c.isDigit()) { 0035 if (!escape_number_separator) { 0036 if (escape_number1 == -1) 0037 escape_number1 = c.digitValue(); 0038 else 0039 escape_number1 = escape_number1 * 10 + c.digitValue(); 0040 } else { 0041 if (escape_number2 == -1) 0042 escape_number2 = c.digitValue(); 0043 else 0044 escape_number2 = escape_number2 * 10 + c.digitValue(); 0045 } 0046 } else if (c == QLatin1Char(';')) { 0047 escape_number_separator = true; 0048 } else if (escape_OSC && c == QChar(7)) { // Throw away any letters that are not OSC 0049 escape_code = c; 0050 } else if (escape_CSI) 0051 escape_code = c; 0052 } else if (c == QLatin1Char('[')) { 0053 escape_CSI = true; 0054 } else if (c == QLatin1Char(']')) { 0055 escape_OSC = true; 0056 } else if (c == QLatin1Char('(') || c == QLatin1Char(')')) { 0057 } else 0058 escape_code = c; 0059 if (!escape_code.isNull()) { 0060 // We've read in the whole escape sequence. Now parse it 0061 if (escape_code == QLatin1Char('m')) { // change color 0062 switch (escape_number2) { 0063 case 0: // all off 0064 setFontWeight(QFont::Normal); 0065 setTextColor(Qt::black); 0066 break; 0067 case 1: // bold 0068 setFontWeight(QFont::Bold); 0069 break; 0070 case 31: // red 0071 setTextColor(Qt::red); 0072 break; 0073 case 32: // green 0074 setTextColor(Qt::green); 0075 break; 0076 case 33: // yellow 0077 setTextColor(Qt::yellow); 0078 break; 0079 case 34: // blue 0080 setTextColor(Qt::blue); 0081 break; 0082 case 35: // magenta 0083 setTextColor(Qt::magenta); 0084 break; 0085 case 36: // cyan 0086 setTextColor(Qt::cyan); 0087 break; 0088 case -1: 0089 case 30: // black 0090 case 39: // reset 0091 case 37: // white 0092 setTextColor(Qt::black); 0093 break; 0094 } 0095 } 0096 escape_code = QChar(0); 0097 escape_number1 = -1; 0098 escape_number2 = -1; 0099 escape_CSI = false; 0100 escape_OSC = false; 0101 escape_sequence = false; 0102 escape_number_separator = false; 0103 } 0104 } else if (c == QChar(0x0d)) { 0105 insertPlainText(QStringLiteral("\n")); 0106 } else if (c.isPrint() || c == QLatin1Char('\n')) { 0107 insertPlainText(c); 0108 } else if (mParseAnsi) { 0109 if (c == QChar(127) || c == QChar(8)) { // delete or backspace, respectively 0110 textCursor().deletePreviousChar(); 0111 } else if (c == QChar(27)) { // escape key 0112 escape_sequence = true; 0113 } else if (c == QChar(0x9b)) { // CSI - equivalent to esc [ 0114 escape_sequence = true; 0115 escape_CSI = true; 0116 } else if (c == QChar(0x9d)) { // OSC - equivalent to esc ] 0117 escape_sequence = true; 0118 escape_OSC = true; 0119 } 0120 0121 } else if (!c.isNull()) { 0122 insertPlainText(QStringLiteral("[")); 0123 QString num; 0124 num = c; 0125 insertPlainText(num); 0126 insertPlainText(QStringLiteral("]")); 0127 } 0128 } 0129 0130 void KTextEditVT::insertVTText(const QByteArray &string) 0131 { 0132 const int size = string.size(); 0133 for (int i = 0; i < size; i++) 0134 insertVTChar(QLatin1Char(string.at(i))); 0135 } 0136 0137 void KTextEditVT::insertVTText(const QString &string) 0138 { 0139 int size = string.size(); 0140 for (int i = 0; i < size; i++) 0141 insertVTChar(string.at(i)); 0142 } 0143 0144 void KTextEditVT::setParseAnsiEscapeCodes(bool parseAnsi) 0145 { 0146 mParseAnsi = parseAnsi; 0147 } 0148 0149 bool KTextEditVT::parseAnsiEscapeCodes() const 0150 { 0151 return mParseAnsi; 0152 }