source: ogBrowser-Git/qtermwidget/src/Emulation.h @ 0c33630

jenkinsmain
Last change on this file since 0c33630 was 050d67a, checked in by adelcastillo <adelcastillo@…>, 16 years ago

Ahora el browser tiene consola en vez del output.
Pasado todo el sistema de compilacion a cmake.

git-svn-id: https://opengnsys.es/svn/trunk@408 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100644
File size: 15.8 KB
Line 
1/*
2    This file is part of Konsole, an X terminal.
3   
4    Copyright (C) 2007 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 EMULATION_H
26#define EMULATION_H
27
28// System
29#include <stdio.h>
30
31// Qt
32#include <QtGui/QKeyEvent>
33//#include <QPointer>
34#include <QtCore/QTextCodec>
35#include <QtCore/QTextStream>
36#include <QtCore/QTimer>
37
38
39namespace Konsole
40{
41
42class KeyboardTranslator;
43class HistoryType;
44class Screen;
45class ScreenWindow;
46class TerminalCharacterDecoder;
47
48/**
49 * This enum describes the available states which
50 * the terminal emulation may be set to.
51 *
52 * These are the values used by Emulation::stateChanged()
53 */
54enum
55{
56    /** The emulation is currently receiving user input. */
57    NOTIFYNORMAL=0,
58    /**
59     * The terminal program has triggered a bell event
60     * to get the user's attention.
61     */
62    NOTIFYBELL=1,
63    /**
64     * The emulation is currently receiving data from its
65     * terminal input.
66     */
67    NOTIFYACTIVITY=2,
68
69    // unused here?
70    NOTIFYSILENCE=3
71};
72
73/**
74 * Base class for terminal emulation back-ends.
75 *
76 * The back-end is responsible for decoding an incoming character stream and
77 * producing an output image of characters.
78 *
79 * When input from the terminal is received, the receiveData() slot should be called with
80 * the data which has arrived.  The emulation will process the data and update the
81 * screen image accordingly.  The codec used to decode the incoming character stream
82 * into the unicode characters used internally can be specified using setCodec()
83 *
84 * The size of the screen image can be specified by calling setImageSize() with the
85 * desired number of lines and columns.  When new lines are added, old content
86 * is moved into a history store, which can be set by calling setHistory().
87 *
88 * The screen image can be accessed by creating a ScreenWindow onto this emulation
89 * by calling createWindow().  Screen windows provide access to a section of the
90 * output.  Each screen window covers the same number of lines and columns as the
91 * image size returned by imageSize().  The screen window can be moved up and down
92 * and provides transparent access to both the current on-screen image and the
93 * previous output.  The screen windows emit an outputChanged signal
94 * when the section of the image they are looking at changes.
95 * Graphical views can then render the contents of a screen window, listening for notifications
96 * of output changes from the screen window which they are associated with and updating
97 * accordingly.
98 *
99 * The emulation also is also responsible for converting input from the connected views such
100 * as keypresses and mouse activity into a character string which can be sent
101 * to the terminal program.  Key presses can be processed by calling the sendKeyEvent() slot,
102 * while mouse events can be processed using the sendMouseEvent() slot.  When the character
103 * stream has been produced, the emulation will emit a sendData() signal with a pointer
104 * to the character buffer.  This data should be fed to the standard input of the terminal
105 * process.  The translation of key presses into an output character stream is performed
106 * using a lookup in a set of key bindings which map key sequences to output
107 * character sequences.  The name of the key bindings set used can be specified using
108 * setKeyBindings()
109 *
110 * The emulation maintains certain state information which changes depending on the
111 * input received.  The emulation can be reset back to its starting state by calling
112 * reset(). 
113 *
114 * The emulation also maintains an activity state, which specifies whether
115 * terminal is currently active ( when data is received ), normal
116 * ( when the terminal is idle or receiving user input ) or trying
117 * to alert the user ( also known as a "Bell" event ).  The stateSet() signal
118 * is emitted whenever the activity state is set.  This can be used to determine
119 * how long the emulation has been active/idle for and also respond to
120 * a 'bell' event in different ways.
121 */
122class Emulation : public QObject
123{
124Q_OBJECT
125
126public:
127 
128   /** Constructs a new terminal emulation */
129   Emulation();
130  ~Emulation();
131
132  /**
133   * Creates a new window onto the output from this emulation.  The contents
134   * of the window are then rendered by views which are set to use this window using the
135   * TerminalDisplay::setScreenWindow() method.
136   */
137  ScreenWindow* createWindow();
138
139  /** Returns the size of the screen image which the emulation produces */
140  QSize imageSize();
141
142  /**
143   * Returns the total number of lines, including those stored in the history.
144   */
145  int lineCount();
146
147 
148  /**
149   * Sets the history store used by this emulation.  When new lines
150   * are added to the output, older lines at the top of the screen are transferred to a history
151   * store.   
152   *
153   * The number of lines which are kept and the storage location depend on the
154   * type of store.
155   */
156  void setHistory(const HistoryType&);
157  /** Returns the history store used by this emulation.  See setHistory() */
158  const HistoryType& history();
159  /** Clears the history scroll. */
160  void clearHistory();
161
162  /**
163   * Copies the output history from @p startLine to @p endLine
164   * into @p stream, using @p decoder to convert the terminal
165   * characters into text.
166   *
167   * @param decoder A decoder which converts lines of terminal characters with
168   * appearance attributes into output text.  PlainTextDecoder is the most commonly
169   * used decoder.
170   * @param startLine The first
171   */
172  virtual void writeToStream(TerminalCharacterDecoder* decoder,int startLine,int endLine);
173 
174 
175  /** Returns the codec used to decode incoming characters.  See setCodec() */
176  const QTextCodec* codec() { return _codec; }
177  /** Sets the codec used to decode incoming characters.  */
178  void setCodec(const QTextCodec*);
179
180  /**
181   * Convenience method. 
182   * Returns true if the current codec used to decode incoming
183   * characters is UTF-8
184   */
185  bool utf8() { Q_ASSERT(_codec); return _codec->mibEnum() == 106; }
186 
187
188  /** TODO Document me */
189  virtual char getErase() const;
190
191  /**
192   * Sets the key bindings used to key events
193   * ( received through sendKeyEvent() ) into character
194   * streams to send to the terminal.
195   */
196  void setKeyBindings(const QString& name);
197  /**
198   * Returns the name of the emulation's current key bindings.
199   * See setKeyBindings()
200   */
201  QString keyBindings();
202
203  /**
204   * Copies the current image into the history and clears the screen.
205   */
206  virtual void clearEntireScreen() =0;
207
208  /** Resets the state of the terminal. */
209  virtual void reset() =0;
210
211  /**
212   * Returns true if the active terminal program wants
213   * mouse input events.
214   *
215   * The programUsesMouseChanged() signal is emitted when this
216   * changes.
217   */
218  bool programUsesMouse() const;
219
220public slots:
221
222  /** Change the size of the emulation's image */
223  virtual void setImageSize(int lines, int columns);
224 
225  /**
226   * Interprets a sequence of characters and sends the result to the terminal.
227   * This is equivalent to calling sendKeyEvent() for each character in @p text in succession.
228   */
229  virtual void sendText(const QString& text) = 0;
230
231  /**
232   * Interprets a key press event and emits the sendData() signal with
233   * the resulting character stream.
234   */
235  virtual void sendKeyEvent(QKeyEvent*);
236 
237  /**
238   * Converts information about a mouse event into an xterm-compatible escape
239   * sequence and emits the character sequence via sendData()
240   */
241  virtual void sendMouseEvent(int buttons, int column, int line, int eventType);
242 
243  /**
244   * Sends a string of characters to the foreground terminal process.
245   *
246   * @param string The characters to send. 
247   * @param length Length of @p string or if set to a negative value, @p string will
248   * be treated as a null-terminated string and its length will be determined automatically.
249   */
250  virtual void sendString(const char* string, int length = -1) = 0;
251
252  /**
253   * Processes an incoming stream of characters.  receiveData() decodes the incoming
254   * character buffer using the current codec(), and then calls receiveChar() for
255   * each unicode character in the resulting buffer. 
256   *
257   * receiveData() also starts a timer which causes the outputChanged() signal
258   * to be emitted when it expires.  The timer allows multiple updates in quick
259   * succession to be buffered into a single outputChanged() signal emission.
260   *
261   * @param buffer A string of characters received from the terminal program.
262   * @param len The length of @p buffer
263   */
264  void receiveData(const char* buffer,int len);
265
266signals:
267
268  /**
269   * Emitted when a buffer of data is ready to send to the
270   * standard input of the terminal.
271   *
272   * @param data The buffer of data ready to be sent
273   * @paran len The length of @p data in bytes
274   */
275  void sendData(const char* data,int len);
276
277  /**
278   * Requests that sending of input to the emulation
279   * from the terminal process be suspended or resumed.
280   *
281   * @param suspend If true, requests that sending of
282   * input from the terminal process' stdout be
283   * suspended.  Otherwise requests that sending of
284   * input be resumed.
285   */
286  void lockPtyRequest(bool suspend);
287
288  /**
289   * Requests that the pty used by the terminal process
290   * be set to UTF 8 mode. 
291   *
292   * TODO: More documentation
293   */
294  void useUtf8Request(bool);
295
296  /**
297   * Emitted when the activity state of the emulation is set.
298   *
299   * @param state The new activity state, one of NOTIFYNORMAL, NOTIFYACTIVITY
300   * or NOTIFYBELL
301   */
302  void stateSet(int state);
303
304  /** TODO Document me */
305  void zmodemDetected();
306
307
308  /**
309   * Requests that the color of the text used
310   * to represent the tabs associated with this
311   * emulation be changed.  This is a Konsole-specific
312   * extension from pre-KDE 4 times.
313   *
314   * TODO: Document how the parameter works.
315   */
316  void changeTabTextColorRequest(int color);
317
318  /**
319   * This is emitted when the program running in the shell indicates whether or
320   * not it is interested in mouse events.
321   *
322   * @param usesMouse This will be true if the program wants to be informed about
323   * mouse events or false otherwise.
324   */
325  void programUsesMouseChanged(bool usesMouse);
326
327  /**
328   * Emitted when the contents of the screen image change.
329   * The emulation buffers the updates from successive image changes,
330   * and only emits outputChanged() at sensible intervals when
331   * there is a lot of terminal activity.
332   *
333   * Normally there is no need for objects other than the screen windows
334   * created with createWindow() to listen for this signal.
335   *
336   * ScreenWindow objects created using createWindow() will emit their
337   * own outputChanged() signal in response to this signal.
338   */
339  void outputChanged();
340
341  /**
342   * Emitted when the program running in the terminal wishes to update the
343   * session's title.  This also allows terminal programs to customize other
344   * aspects of the terminal emulation display.
345   *
346   * This signal is emitted when the escape sequence "\033]ARG;VALUE\007"
347   * is received in the input string, where ARG is a number specifying what
348   * should change and VALUE is a string specifying the new value.
349   *
350   * TODO:  The name of this method is not very accurate since this method
351   * is used to perform a whole range of tasks besides just setting
352   * the user-title of the session.   
353   *
354   * @param title Specifies what to change.
355   * <ul>
356   * <li>0 - Set window icon text and session title to @p newTitle</li>
357   * <li>1 - Set window icon text to @p newTitle</li>
358   * <li>2 - Set session title to @p newTitle</li>
359   * <li>11 - Set the session's default background color to @p newTitle,
360   *         where @p newTitle can be an HTML-style string (#RRGGBB) or a named
361   *         color (eg 'red', 'blue'). 
362   *         See http://doc.trolltech.com/4.2/qcolor.html#setNamedColor for more
363   *         details.
364   * </li>
365   * <li>31 - Supposedly treats @p newTitle as a URL and opens it (NOT IMPLEMENTED)</li>
366   * <li>32 - Sets the icon associated with the session.  @p newTitle is the name
367   *    of the icon to use, which can be the name of any icon in the current KDE icon
368   *    theme (eg: 'konsole', 'kate', 'folder_home')</li>
369   * </ul>
370   * @param newTitle Specifies the new title
371   */
372
373  void titleChanged(int title,const QString& newTitle);
374
375  /**
376   * Emitted when the program running in the terminal changes the
377   * screen size.
378   */
379  void imageSizeChanged(int lineCount , int columnCount);
380
381  /**
382   * Emitted when the terminal program requests to change various properties
383   * of the terminal display. 
384   *
385   * A profile change command occurs when a special escape sequence, followed
386   * by a string containing a series of name and value pairs is received.
387   * This string can be parsed using a ProfileCommandParser instance.
388   *
389   * @param text A string expected to contain a series of key and value pairs in
390   * the form:  name=value;name2=value2 ...
391   */
392  void profileChangeCommandReceived(const QString& text);
393
394protected:
395  virtual void setMode  (int mode) = 0;
396  virtual void resetMode(int mode) = 0;
397   
398 /**
399   * Processes an incoming character.  See receiveData()
400   * @p ch A unicode character code.
401   */
402  virtual void receiveChar(int ch);
403
404  /**
405   * Sets the active screen.  The terminal has two screens, primary and alternate.
406   * The primary screen is used by default.  When certain interactive programs such
407   * as Vim are run, they trigger a switch to the alternate screen.
408   *
409   * @param index 0 to switch to the primary screen, or 1 to switch to the alternate screen
410   */
411  void setScreen(int index);
412
413  enum EmulationCodec
414  {
415      LocaleCodec = 0,
416      Utf8Codec   = 1
417  };
418  void setCodec(EmulationCodec codec); // codec number, 0 = locale, 1=utf8
419
420
421  QList<ScreenWindow*> _windows;
422 
423  Screen* _currentScreen;  // pointer to the screen which is currently active,
424                            // this is one of the elements in the screen[] array
425
426  Screen* _screen[2];      // 0 = primary screen ( used by most programs, including the shell
427                            //                      scrollbars are enabled in this mode )
428                            // 1 = alternate      ( used by vi , emacs etc.
429                            //                      scrollbars are not enabled in this mode )
430                           
431 
432  //decodes an incoming C-style character stream into a unicode QString using
433  //the current text codec.  (this allows for rendering of non-ASCII characters in text files etc.)
434  const QTextCodec* _codec;
435  QTextDecoder* _decoder;
436
437  const KeyboardTranslator* _keyTranslator; // the keyboard layout
438
439protected slots:
440  /**
441   * Schedules an update of attached views.
442   * Repeated calls to bufferedUpdate() in close succession will result in only a single update,
443   * much like the Qt buffered update of widgets.
444   */
445  void bufferedUpdate();
446
447private slots:
448
449  // triggered by timer, causes the emulation to send an updated screen image to each
450  // view
451  void showBulk();
452
453  void usesMouseChanged(bool usesMouse);
454
455private:
456
457  bool _usesMouse;
458  QTimer _bulkTimer1;
459  QTimer _bulkTimer2;
460 
461};
462
463}
464
465#endif // ifndef EMULATION_H
Note: See TracBrowser for help on using the repository browser.