1/*
2 This file is part of Konsole, an X terminal.
3
4 Copyright 2007-2008 by Robert Knight <robertknight@gmail.com>
5 Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301 USA.
21*/
22
23#ifndef VT102EMULATION_H
24#define VT102EMULATION_H
25
26// Standard Library
27#include <stdio.h>
28
29// Qt
30#include <QKeyEvent>
31#include <QHash>
32#include <QTimer>
33
34// Konsole
35#include "Emulation.h"
36#include "Screen.h"
37
38#define MODE_AppScreen (MODES_SCREEN+0) // Mode #1
39#define MODE_AppCuKeys (MODES_SCREEN+1) // Application cursor keys (DECCKM)
40#define MODE_AppKeyPad (MODES_SCREEN+2) //
41#define MODE_Mouse1000 (MODES_SCREEN+3) // Send mouse X,Y position on press and release
42#define MODE_Mouse1001 (MODES_SCREEN+4) // Use Hilight mouse tracking
43#define MODE_Mouse1002 (MODES_SCREEN+5) // Use cell motion mouse tracking
44#define MODE_Mouse1003 (MODES_SCREEN+6) // Use all motion mouse tracking
45#define MODE_Mouse1005 (MODES_SCREEN+7) // Xterm-style extended coordinates
46#define MODE_Mouse1006 (MODES_SCREEN+8) // 2nd Xterm-style extended coordinates
47#define MODE_Mouse1015 (MODES_SCREEN+9) // Urxvt-style extended coordinates
48#define MODE_Ansi (MODES_SCREEN+10) // Use US Ascii for character sets G0-G3 (DECANM)
49#define MODE_132Columns (MODES_SCREEN+11) // 80 <-> 132 column mode switch (DECCOLM)
50#define MODE_Allow132Columns (MODES_SCREEN+12) // Allow DECCOLM mode
51#define MODE_BracketedPaste (MODES_SCREEN+13) // Xterm-style bracketed paste mode
52#define MODE_total (MODES_SCREEN+14)
53
54namespace Konsole
55{
56
57struct CharCodes
58{
59 // coding info
60 char charset[4]; //
61 int cu_cs; // actual charset.
62 bool graphic; // Some VT100 tricks
63 bool pound ; // Some VT100 tricks
64 bool sa_graphic; // saved graphic
65 bool sa_pound; // saved pound
66};
67
68/**
69 * Provides an xterm compatible terminal emulation based on the DEC VT102 terminal.
70 * A full description of this terminal can be found at http://vt100.net/docs/vt102-ug/
71 *
72 * In addition, various additional xterm escape sequences are supported to provide
73 * features such as mouse input handling.
74 * See http://rtfm.etla.org/xterm/ctlseq.html for a description of xterm's escape
75 * sequences.
76 *
77 */
78class Vt102Emulation : public Emulation
79{
80Q_OBJECT
81
82public:
83 /** Constructs a new emulation */
84 Vt102Emulation();
85 ~Vt102Emulation();
86
87 // reimplemented from Emulation
88 virtual void clearEntireScreen();
89 virtual void reset();
90 virtual char eraseChar() const;
91
92public slots:
93 // reimplemented from Emulation
94 virtual void sendString(const char*,int length = -1);
95 virtual void sendText(const QString& text);
96 virtual void sendKeyEvent(QKeyEvent*);
97 virtual void sendMouseEvent(int buttons, int column, int line, int eventType);
98 virtual void focusLost();
99 virtual void focusGained();
100
101protected:
102 // reimplemented from Emulation
103 virtual void setMode(int mode);
104 virtual void resetMode(int mode);
105 virtual void receiveChar(wchar_t cc);
106
107private slots:
108 //causes changeTitle() to be emitted for each (int,QString) pair in pendingTitleUpdates
109 //used to buffer multiple title updates
110 void updateTitle();
111
112private:
113 wchar_t applyCharset(wchar_t c);
114 void setCharset(int n, int cs);
115 void useCharset(int n);
116 void setAndUseCharset(int n, int cs);
117 void saveCursor();
118 void restoreCursor();
119 void resetCharset(int scrno);
120
121 void setMargins(int top, int bottom);
122 //set margins for all screens back to their defaults
123 void setDefaultMargins();
124
125 // returns true if 'mode' is set or false otherwise
126 bool getMode (int mode);
127 // saves the current boolean value of 'mode'
128 void saveMode (int mode);
129 // restores the boolean value of 'mode'
130 void restoreMode(int mode);
131 // resets all modes
132 // (except MODE_Allow132Columns)
133 void resetModes();
134
135 void resetTokenizer();
136 #define MAX_TOKEN_LENGTH 256 // Max length of tokens (e.g. window title)
137 void addToCurrentToken(wchar_t cc);
138 wchar_t tokenBuffer[MAX_TOKEN_LENGTH]; //FIXME: overflow?
139 int tokenBufferPos;
140#define MAXARGS 15
141 void addDigit(int dig);
142 void addArgument();
143 int argv[MAXARGS];
144 int argc;
145 void initTokenizer();
146 int prevCC;
147
148 // Set of flags for each of the ASCII characters which indicates
149 // what category they fall into (printable character, control, digit etc.)
150 // for the purposes of decoding terminal output
151 int charClass[256];
152
153 void reportDecodingError();
154
155 void processToken(int code, wchar_t p, int q);
156 void processWindowAttributeChange();
157 void requestWindowAttribute(int);
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 class TerminalState
176 {
177 public:
178 // Initializes all modes to false
179 TerminalState()
180 { memset(&mode,false,MODE_total * sizeof(bool)); }
181
182 bool mode[MODE_total];
183 };
184
185 TerminalState _currentModes;
186 TerminalState _savedModes;
187
188 //hash table and timer for buffering calls to the session instance
189 //to update the name of the session
190 //or window title.
191 //these calls occur when certain escape sequences are seen in the
192 //output from the terminal
193 QHash<int,QString> _pendingTitleUpdates;
194 QTimer* _titleUpdateTimer;
195
196 bool _reportFocusEvents;
197};
198
199}
200
201#endif // VT102EMULATION_H
202