1 /* 2 This file is part of Konsole, an X terminal. 3 4 Copyright (C) 2007, 2013 by Robert Knight <robertknight@gmail.com> 5 Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> 6 7 Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 8 9 This program is free software: you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 2 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 22 02110-1301 USA. 23 */ 24 25 #ifndef VT102EMULATION_H 26 #define VT102EMULATION_H 27 28 // Standard Library 29 #include <stdio.h> 30 31 // Qt 32 #include <QKeyEvent> 33 #include <QtCore/QHash> 34 #include <QtCore/QTimer> 35 36 // Konsole 37 #include "unix/Emulation.h" 38 #include "unix/Screen.h" 39 40 #define MODE_AppScreen (MODES_SCREEN+0) 41 #define MODE_AppCuKeys (MODES_SCREEN+1) 42 #define MODE_AppKeyPad (MODES_SCREEN+2) 43 #define MODE_Mouse1000 (MODES_SCREEN+3) 44 #define MODE_Mouse1001 (MODES_SCREEN+4) 45 #define MODE_Mouse1002 (MODES_SCREEN+5) 46 #define MODE_Mouse1003 (MODES_SCREEN+6) 47 #define MODE_Ansi (MODES_SCREEN+7) 48 #define MODE_BracketedPaste (MODES_SCREEN+8) 49 #define MODE_total (MODES_SCREEN+9) 50 51 struct DECpar 52 { 53 bool mode[MODE_total]; 54 }; 55 56 struct CharCodes 57 { 58 // coding info 59 char charset[4]; // 60 int cu_cs; // actual charset. 61 bool graphic; // Some VT100 tricks 62 bool pound ; // Some VT100 tricks 63 bool sa_graphic; // saved graphic 64 bool sa_pound; // saved pound 65 }; 66 67 /** 68 * Provides an xterm compatible terminal emulation based on the DEC VT102 terminal. 69 * A full description of this terminal can be found at http://vt100.net/docs/vt102-ug/ 70 * 71 * In addition, various additional xterm escape sequences are supported to provide 72 * features such as mouse input handling. 73 * See http://rtfm.etla.org/xterm/ctlseq.html for a description of xterm's escape 74 * sequences. 75 * 76 */ 77 class Vt102Emulation : public Emulation 78 { 79 Q_OBJECT 80 81 public: 82 83 /** Constructs a new emulation */ 84 Vt102Emulation(); 85 ~Vt102Emulation(); 86 87 // reimplemented 88 virtual void clearEntireScreen(); 89 virtual void reset(); 90 91 // reimplemented 92 virtual char getErase() const; 93 94 public slots: 95 96 // reimplemented 97 virtual void sendString(const char*,int length = -1); 98 virtual void sendText(const QString& text); 99 virtual void sendKeyEvent(QKeyEvent*); 100 virtual void sendMouseEvent( int buttons, int column, int line , int eventType ); 101 102 protected: 103 // reimplemented 104 virtual void setMode (int mode); 105 virtual void resetMode (int mode); 106 107 // reimplemented 108 virtual void receiveChar(int cc); 109 110 111 private slots: 112 113 //causes changeTitle() to be emitted for each (int,QString) pair in pendingTitleUpdates 114 //used to buffer multiple title updates 115 void updateTitle(); 116 117 118 private: 119 unsigned short applyCharset(unsigned short c); 120 void setCharset(int n, int cs); 121 void useCharset(int n); 122 void setAndUseCharset(int n, int cs); 123 void saveCursor(); 124 void restoreCursor(); 125 void resetCharset(int scrno); 126 127 void setMargins(int top, int bottom); 128 //set margins for all screens back to their defaults 129 void setDefaultMargins(); 130 131 // returns true if 'mode' is set or false otherwise 132 bool getMode (int mode); 133 // saves the current boolean value of 'mode' 134 void saveMode (int mode); 135 // restores the boolean value of 'mode' 136 void restoreMode(int mode); 137 // resets all modes 138 void resetModes(); 139 140 void resetToken(); 141 #define MAXPBUF 80 142 void pushToToken(int cc); 143 int pbuf[MAXPBUF]; //FIXME: overflow? 144 int ppos; 145 #define MAXARGS 15 146 void addDigit(int dig); 147 void addArgument(); 148 int argv[MAXARGS]; 149 int argc; 150 void initTokenizer(); 151 int tbl[256]; 152 153 void scan_buffer_report(); //FIXME: rename 154 void ReportErrorToken(); //FIXME: rename 155 156 void tau(int code, int p, int q); 157 void XtermHack(); 158 159 void reportTerminalType(); 160 void reportSecondaryAttributes(); 161 void reportStatus(); 162 void reportAnswerBack(); 163 void reportCursorPosition(); 164 void reportTerminalParms(int p); 165 166 void onScrollLock(); 167 void scrollLock(const bool lock); 168 169 // clears the screen and resizes it to the specified 170 // number of columns 171 void clearScreenAndSetColumns(int columnCount); 172 173 CharCodes _charset[2]; 174 175 DECpar _currParm; 176 DECpar _saveParm; 177 178 //hash table and timer for buffering calls to the session instance 179 //to update the name of the session 180 //or window title. 181 //these calls occur when certain escape sequences are seen in the 182 //output from the terminal 183 QHash<int,QString> _pendingTitleUpdates; 184 QTimer* _titleUpdateTimer; 185 186 }; 187 188 #endif // VT102EMULATION_H 189