Fix crash if key bindings specified in profile cannot be found. Improve
[personal-kdebase.git] / apps / konsole / src / Vt102Emulation.h
blob7f10b16b180ca5c8ecc6027e4d4be62f5ddec271
1 /*
2 This file is part of Konsole, an X terminal.
4 Copyright 2007-2008 by Robert Knight <robertknight@gmail.com>
5 Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de>
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.
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.
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.
23 #ifndef VT102EMULATION_H
24 #define VT102EMULATION_H
26 // Standard Library
27 #include <stdio.h>
29 // Qt
30 #include <QtGui/QKeyEvent>
31 #include <QtCore/QHash>
32 #include <QtCore/QTimer>
34 // Konsole
35 #include "Emulation.h"
36 #include "Screen.h"
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_Ansi (MODES_SCREEN+7) // Use US Ascii for character sets G0-G3 (DECANM)
46 #define MODE_132Columns (MODES_SCREEN+8) // 80 <-> 132 column mode switch (DECCOLM)
47 #define MODE_Allow132Columns (MODES_SCREEN+9) // Allow DECCOLM mode
48 #define MODE_total (MODES_SCREEN+10)
50 namespace Konsole
53 struct CharCodes
55 // coding info
56 char charset[4]; //
57 int cu_cs; // actual charset.
58 bool graphic; // Some VT100 tricks
59 bool pound ; // Some VT100 tricks
60 bool sa_graphic; // saved graphic
61 bool sa_pound; // saved pound
64 /**
65 * Provides an xterm compatible terminal emulation based on the DEC VT102 terminal.
66 * A full description of this terminal can be found at http://vt100.net/docs/vt102-ug/
68 * In addition, various additional xterm escape sequences are supported to provide
69 * features such as mouse input handling.
70 * See http://rtfm.etla.org/xterm/ctlseq.html for a description of xterm's escape
71 * sequences.
74 class Vt102Emulation : public Emulation
76 Q_OBJECT
78 public:
79 /** Constructs a new emulation */
80 Vt102Emulation();
81 ~Vt102Emulation();
83 // reimplemented from Emulation
84 virtual void clearEntireScreen();
85 virtual void reset();
86 virtual char eraseChar() const;
88 public slots:
89 // reimplemented from Emulation
90 virtual void sendString(const char*,int length = -1);
91 virtual void sendText(const QString& text);
92 virtual void sendKeyEvent(QKeyEvent*);
93 virtual void sendMouseEvent(int buttons, int column, int line, int eventType);
95 protected:
96 // reimplemented from Emulation
97 virtual void setMode(int mode);
98 virtual void resetMode(int mode);
99 virtual void receiveChar(int cc);
101 private slots:
102 //causes changeTitle() to be emitted for each (int,QString) pair in pendingTitleUpdates
103 //used to buffer multiple title updates
104 void updateTitle();
106 private:
107 unsigned short applyCharset(unsigned short c);
108 void setCharset(int n, int cs);
109 void useCharset(int n);
110 void setAndUseCharset(int n, int cs);
111 void saveCursor();
112 void restoreCursor();
113 void resetCharset(int scrno);
115 void setMargins(int top, int bottom);
116 //set margins for all screens back to their defaults
117 void setDefaultMargins();
119 // returns true if 'mode' is set or false otherwise
120 bool getMode (int mode);
121 // saves the current boolean value of 'mode'
122 void saveMode (int mode);
123 // restores the boolean value of 'mode'
124 void restoreMode(int mode);
125 // resets all modes
126 // (except MODE_Allow132Columns)
127 void resetModes();
129 void resetTokenizer();
130 #define MAX_TOKEN_LENGTH 80
131 void addToCurrentToken(int cc);
132 int tokenBuffer[MAX_TOKEN_LENGTH]; //FIXME: overflow?
133 int tokenBufferPos;
134 #define MAXARGS 15
135 void addDigit(int dig);
136 void addArgument();
137 int argv[MAXARGS];
138 int argc;
139 void initTokenizer();
141 // Set of flags for each of the ASCII characters which indicates
142 // what category they fall into (printable character, control, digit etc.)
143 // for the purposes of decoding terminal output
144 int charClass[256];
146 void reportDecodingError();
148 void processToken(int code, int p, int q);
149 void processWindowAttributeChange();
151 void reportTerminalType();
152 void reportSecondaryAttributes();
153 void reportStatus();
154 void reportAnswerBack();
155 void reportCursorPosition();
156 void reportTerminalParms(int p);
158 void onScrollLock();
159 void scrollLock(const bool lock);
161 // clears the screen and resizes it to the specified
162 // number of columns
163 void clearScreenAndSetColumns(int columnCount);
165 CharCodes _charset[2];
167 class TerminalState
169 public:
170 // Initializes all modes to false
171 TerminalState()
172 { memset(&mode,false,MODE_total * sizeof(bool)); }
174 bool mode[MODE_total];
177 TerminalState _currentModes;
178 TerminalState _savedModes;
180 //hash table and timer for buffering calls to the session instance
181 //to update the name of the session
182 //or window title.
183 //these calls occur when certain escape sequences are seen in the
184 //output from the terminal
185 QHash<int,QString> _pendingTitleUpdates;
186 QTimer* _titleUpdateTimer;
191 #endif // VT102EMULATION_H