source: ogBrowser-Git/qtermwidget/lib/Emulation.h @ c0cec9d

jenkinsmain
Last change on this file since c0cec9d was fedf2a2, checked in by Vadim Troshchinskiy Shmelev <vtroshchinskiy@…>, 18 months ago

Update Qtermwidget to Qt6 version
Remove build files

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