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

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

Update Qtermwidget to Qt6 version
Remove build files

  • Property mode set to 100644
File size: 17.5 KB
RevLine 
[45157b3]1/*
2    This file is part of Konsole, an X terminal.
3
[64efc22]4    Copyright 2007-2008 by Robert Knight <robertknight@gmail.com>
5    Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de>
[45157b3]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
[64efc22]27#include <cstdio>
[45157b3]28
[64efc22]29// Qt
30#include <QKeyEvent>
[45157b3]31//#include <QPointer>
[fedf2a2]32#if QT_VERSION >= 0x060000
33#include <QtCore5Compat/QTextCodec>
34#else
[64efc22]35#include <QTextCodec>
[fedf2a2]36#endif
[64efc22]37#include <QTextStream>
38#include <QTimer>
[45157b3]39
[64efc22]40#include "qtermwidget_export.h"
41#include "KeyboardTranslator.h"
[45157b3]42
43namespace Konsole
44{
45
46class HistoryType;
47class Screen;
48class ScreenWindow;
49class TerminalCharacterDecoder;
50
[64efc22]51/**
52 * This enum describes the available states which
[45157b3]53 * the terminal emulation may be set to.
54 *
[64efc22]55 * These are the values used by Emulation::stateChanged()
[45157b3]56 */
[64efc22]57enum
58{
[45157b3]59    /** The emulation is currently receiving user input. */
[64efc22]60    NOTIFYNORMAL=0,
61    /**
[45157b3]62     * The terminal program has triggered a bell event
63     * to get the user's attention.
64     */
[64efc22]65    NOTIFYBELL=1,
66    /**
67     * The emulation is currently receiving data from its
[45157b3]68     * terminal input.
69     */
70    NOTIFYACTIVITY=2,
71
[64efc22]72    // unused here?
73    NOTIFYSILENCE=3
[45157b3]74};
75
76/**
77 * Base class for terminal emulation back-ends.
78 *
[64efc22]79 * The back-end is responsible for decoding an incoming character stream and
[45157b3]80 * producing an output image of characters.
81 *
82 * When input from the terminal is received, the receiveData() slot should be called with
[64efc22]83 * the data which has arrived.  The emulation will process the data and update the
[45157b3]84 * screen image accordingly.  The codec used to decode the incoming character stream
[64efc22]85 * into the unicode characters used internally can be specified using setCodec()
[45157b3]86 *
[64efc22]87 * The size of the screen image can be specified by calling setImageSize() with the
[45157b3]88 * desired number of lines and columns.  When new lines are added, old content
[64efc22]89 * is moved into a history store, which can be set by calling setHistory().
[45157b3]90 *
[64efc22]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
[45157b3]94 * image size returned by imageSize().  The screen window can be moved up and down
[64efc22]95 * and provides transparent access to both the current on-screen image and the
[45157b3]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
[64efc22]99 * of output changes from the screen window which they are associated with and updating
100 * accordingly.
[45157b3]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 *
[64efc22]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().
[45157b3]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 */
[64efc22]125class QTERMWIDGET_EXPORT Emulation : public QObject
126{
[45157b3]127Q_OBJECT
128
129public:
[64efc22]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 */
[45157b3]152   Emulation();
[64efc22]153  ~Emulation() override;
[45157b3]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 */
[64efc22]163  QSize imageSize() const;
[45157b3]164
165  /**
166   * Returns the total number of lines, including those stored in the history.
[64efc22]167   */
168  int lineCount() const;
[45157b3]169
[64efc22]170  /**
[45157b3]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
[64efc22]173   * store.
[45157b3]174   *
[64efc22]175   * The number of lines which are kept and the storage location depend on the
[45157b3]176   * type of store.
177   */
178  void setHistory(const HistoryType&);
179  /** Returns the history store used by this emulation.  See setHistory() */
[64efc22]180  const HistoryType& history() const;
[45157b3]181  /** Clears the history scroll. */
182  void clearHistory();
183
[64efc22]184  /**
185   * Copies the output history from @p startLine to @p endLine
[45157b3]186   * into @p stream, using @p decoder to convert the terminal
[64efc22]187   * characters into text.
[45157b3]188   *
[64efc22]189   * @param decoder A decoder which converts lines of terminal characters with
[45157b3]190   * appearance attributes into output text.  PlainTextDecoder is the most commonly
191   * used decoder.
[64efc22]192   * @param startLine Index of first line to copy
193   * @param endLine Index of last line to copy
[45157b3]194   */
195  virtual void writeToStream(TerminalCharacterDecoder* decoder,int startLine,int endLine);
[64efc22]196
[45157b3]197  /** Returns the codec used to decode incoming characters.  See setCodec() */
[64efc22]198  const QTextCodec* codec() const { return _codec; }
[45157b3]199  /** Sets the codec used to decode incoming characters.  */
200  void setCodec(const QTextCodec*);
201
[64efc22]202  /**
203   * Convenience method.
[45157b3]204   * Returns true if the current codec used to decode incoming
205   * characters is UTF-8
206   */
[64efc22]207  bool utf8() const
208  { Q_ASSERT(_codec); return _codec->mibEnum() == 106; }
209
[45157b3]210
211  /** TODO Document me */
[64efc22]212  virtual char eraseChar() const;
[45157b3]213
[64efc22]214  /**
[45157b3]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);
[64efc22]220  /**
[45157b3]221   * Returns the name of the emulation's current key bindings.
222   * See setKeyBindings()
223   */
[64efc22]224  QString keyBindings() const;
[45157b3]225
[64efc22]226  /**
[45157b3]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
[64efc22]234  /**
[45157b3]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
[64efc22]243  bool programBracketedPasteMode() const;
244
245public slots:
[45157b3]246
247  /** Change the size of the emulation's image */
248  virtual void setImageSize(int lines, int columns);
[64efc22]249
250  /**
[45157b3]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
[64efc22]256  /**
[45157b3]257   * Interprets a key press event and emits the sendData() signal with
[64efc22]258   * the resulting character stream.
[45157b3]259   */
[64efc22]260  virtual void sendKeyEvent(QKeyEvent*, bool fromPaste);
261
262  /**
[45157b3]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);
[64efc22]267
[45157b3]268  /**
[64efc22]269   * Sends a string of characters to the foreground terminal process.
[45157b3]270   *
[64efc22]271   * @param string The characters to send.
[45157b3]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
[64efc22]277  /**
[45157b3]278   * Processes an incoming stream of characters.  receiveData() decodes the incoming
279   * character buffer using the current codec(), and then calls receiveChar() for
[64efc22]280   * each unicode character in the resulting buffer.
[45157b3]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
[64efc22]293  /**
294   * Emitted when a buffer of data is ready to send to the
[45157b3]295   * standard input of the terminal.
296   *
297   * @param data The buffer of data ready to be sent
[64efc22]298   * @param len The length of @p data in bytes
[45157b3]299   */
300  void sendData(const char* data,int len);
301
[64efc22]302  /**
[45157b3]303   * Requests that sending of input to the emulation
304   * from the terminal process be suspended or resumed.
305   *
[64efc22]306   * @param suspend If true, requests that sending of
307   * input from the terminal process' stdout be
[45157b3]308   * suspended.  Otherwise requests that sending of
[64efc22]309   * input be resumed.
[45157b3]310   */
311  void lockPtyRequest(bool suspend);
312
313  /**
314   * Requests that the pty used by the terminal process
[64efc22]315   * be set to UTF 8 mode.
[45157b3]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
[64efc22]343  /**
[45157b3]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
[64efc22]352  void programBracketedPasteModeChanged(bool bracketedPasteMode);
353
354  /**
[45157b3]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
[64efc22]364   * own outputChanged() signal in response to this signal.
[45157b3]365   */
366  void outputChanged();
367
368  /**
[64efc22]369   * Emitted when the program running in the terminal wishes to update the
[45157b3]370   * session's title.  This also allows terminal programs to customize other
[64efc22]371   * aspects of the terminal emulation display.
[45157b3]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
[64efc22]379   * the user-title of the session.
[45157b3]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,
[64efc22]387   *         where @p newTitle can be an HTML-style string ("#RRGGBB") or a named
388   *         color (eg 'red', 'blue').
[45157b3]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>
[64efc22]393   * <li>32 - Sets the icon associated with the session.  @p newTitle is the name
[45157b3]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>
[64efc22]397   * @param newTitle Specifies the new title
[45157b3]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
[64efc22]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  /**
[45157b3]421   * Emitted when the terminal program requests to change various properties
[64efc22]422   * of the terminal display.
[45157b3]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
[64efc22]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
[45157b3]452protected:
[64efc22]453  virtual void setMode(int mode) = 0;
[45157b3]454  virtual void resetMode(int mode) = 0;
[64efc22]455
456  /**
[45157b3]457   * Processes an incoming character.  See receiveData()
[64efc22]458   * @p ch A unicode character code.
[45157b3]459   */
[64efc22]460  virtual void receiveChar(wchar_t ch);
[45157b3]461
[64efc22]462  /**
[45157b3]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   */
[64efc22]469  void setScreen(int index);
[45157b3]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;
[64efc22]480
481  Screen* _currentScreen;  // pointer to the screen which is currently active,
[45157b3]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 )
[64efc22]488
489
490  //decodes an incoming C-style character stream into a unicode QString using
[45157b3]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:
[64efc22]497  /**
[45157b3]498   * Schedules an update of attached views.
499   * Repeated calls to bufferedUpdate() in close succession will result in only a single update,
[64efc22]500   * much like the Qt buffered update of widgets.
[45157b3]501   */
502  void bufferedUpdate();
503
[64efc22]504private slots:
[45157b3]505
506  // triggered by timer, causes the emulation to send an updated screen image to each
507  // view
[64efc22]508  void showBulk();
[45157b3]509
510  void usesMouseChanged(bool usesMouse);
511
[64efc22]512  void bracketedPasteModeChanged(bool bracketedPasteMode);
[45157b3]513
[64efc22]514private:
[45157b3]515  bool _usesMouse;
[64efc22]516  bool _bracketedPasteMode;
[45157b3]517  QTimer _bulkTimer1;
518  QTimer _bulkTimer2;
[64efc22]519
[45157b3]520};
521
522}
523
524#endif // ifndef EMULATION_H
Note: See TracBrowser for help on using the repository browser.