changeset 29336:036079c9ee12 stable

make bracketed paste mode work in GUI terminal Import relevant parts of the following qtermwidget changes: commit c472676560e4fd87038cc9dba86d3021784d6e4b Author: Igor <f2404@yandex.ru> Date: Mon Feb 1 19:26:39 2016 +0300 Bracketed paste mode implementation commit 1d4ddc8afd4185c8683f09ecbb933d76f74d4446 Author: Zang MingJie <zealot0630@gmail.com> Date: Fri Dec 29 19:40:06 2017 +0800 Expose bracket text function commit 7514ebbe1a54be25a8b5d63eb9bc9f71fc637196 Author: Tsu Jan <tsujan2000@gmail.com> Date: Sun Dec 20 20:57:26 2020 +0330 Added a QTermWidget method to disable bracketed paste mode Will be followed and used by a QTerminal patch. commit f792b5f5ca5f34aeeb54d77c418cd2a7aca32287 Author: Paulo Lieuthier <paulolieuthier@gmail.com> Date: Fri Nov 6 08:58:23 2015 -0300 Rebase Vt102Emulation to Konsole * Emulation.h, Emulation.cpp (Emulation::_bracketedPasteMode): New data member. (Emulation::Emulation): Connect programBracketedPasteModeChanged signal to bracketedPasteModeChanged slot. (Emulation::programBracketedPasteMode(void)): New function. (Emulation::programBracketedPasteModeChanged(bool)): New signal. (Emulation::bracketedPasteModeChanged(bool)): New private slot. * TerminalModel.cpp (TerminalModel::addView): Connect _emulation->programBracketedPasteModeChanged signal to widget->setBracketedPasteMode slot. Set widget bracketedPasteMode to _emulation programBracketedPasteMode. * TerminalView.h, TerminalView.cpp (TerminalView::__disabledBracketedPasteMode): New data member. (TerminalView::TerminalView): Set initial bracketed paste mode. (TerminalView::setBracketedPasteMode, TerminalView::bracketedPasteMode): New slots. (TerminalView::bracketText): New function. (TerminalView::emitSelection): Call bracketText on pasted text. * Vt102Emulation.h, Vt102Emulation.cpp (Vt102Emulation::tau): Handle bracketed paste escape sequences. (Vt102Emulation::resetModes): Also reset and save MODE_BracketedPaste. (Vt102Emulation::setMode, Vt102Emulation::resetMode): Also handle MODE_BracketedPaste. (MODE_BracketedPaste): New macro. (MODE_total): Update value.
author John W. Eaton <jwe@octave.org>
date Wed, 27 Jan 2021 08:36:45 -0500
parents 3180f830d396
children cabb840fc3f6
files libgui/qterminal/libqterminal/unix/Emulation.cpp libgui/qterminal/libqterminal/unix/Emulation.h libgui/qterminal/libqterminal/unix/TerminalModel.cpp libgui/qterminal/libqterminal/unix/TerminalView.cpp libgui/qterminal/libqterminal/unix/TerminalView.h libgui/qterminal/libqterminal/unix/Vt102Emulation.cpp libgui/qterminal/libqterminal/unix/Vt102Emulation.h
diffstat 7 files changed, 83 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/qterminal/libqterminal/unix/Emulation.cpp	Wed Jan 27 06:42:38 2021 -0500
+++ b/libgui/qterminal/libqterminal/unix/Emulation.cpp	Wed Jan 27 08:36:45 2021 -0500
@@ -54,7 +54,8 @@
   _codec(nullptr),
   _decoder(nullptr),
   _keyTranslator(nullptr),
-  _usesMouse(false)
+  _usesMouse(false),
+  _bracketedPasteMode(false)
 {
 
   // create screens with a default size
@@ -68,6 +69,8 @@
   // listen for mouse status changes
   connect( this , SIGNAL(programUsesMouseChanged(bool)) ,
            SLOT(usesMouseChanged(bool)) );
+  connect(this , SIGNAL(programBracketedPasteModeChanged(bool)) ,
+           SLOT(bracketedPasteModeChanged(bool)));
 }
 
 bool Emulation::programUsesMouse() const
@@ -80,6 +83,16 @@
     _usesMouse = usesMouse;
 }
 
+bool Emulation::programBracketedPasteMode() const
+{
+    return _bracketedPasteMode;
+}
+
+void Emulation::bracketedPasteModeChanged(bool bracketedPasteMode)
+{
+    _bracketedPasteMode = bracketedPasteMode;
+}
+
 ScreenWindow* Emulation::createWindow()
 {
     ScreenWindow* window = new ScreenWindow();
--- a/libgui/qterminal/libqterminal/unix/Emulation.h	Wed Jan 27 06:42:38 2021 -0500
+++ b/libgui/qterminal/libqterminal/unix/Emulation.h	Wed Jan 27 08:36:45 2021 -0500
@@ -213,6 +213,8 @@
    */
   bool programUsesMouse() const;
 
+  bool programBracketedPasteMode() const;
+
 public slots:
 
   /** Change the size of the emulation's image */
@@ -317,6 +319,8 @@
    */
   void programUsesMouseChanged(bool usesMouse);
 
+  void programBracketedPasteModeChanged(bool bracketedPasteMode);
+
   /**
    * Emitted when the contents of the screen image change.
    * The emulation buffers the updates from successive image changes,
@@ -445,9 +449,12 @@
 
   void usesMouseChanged(bool usesMouse);
 
+  void bracketedPasteModeChanged(bool bracketedPasteMode);
+
 private:
 
   bool _usesMouse;
+  bool _bracketedPasteMode;
   QTimer _bulkTimer1;
   QTimer _bulkTimer2;
 
--- a/libgui/qterminal/libqterminal/unix/TerminalModel.cpp	Wed Jan 27 06:42:38 2021 -0500
+++ b/libgui/qterminal/libqterminal/unix/TerminalModel.cpp	Wed Jan 27 08:36:45 2021 -0500
@@ -131,6 +131,11 @@
 
         widget->setUsesMouse( _emulation->programUsesMouse() );
 
+        connect( _emulation , SIGNAL(programBracketedPasteModeChanged(bool)) ,
+                 widget , SLOT(setBracketedPasteMode(bool)) );
+
+        widget->setBracketedPasteMode(_emulation->programBracketedPasteMode());
+
         widget->setScreenWindow(_emulation->createWindow());
     }
 
--- a/libgui/qterminal/libqterminal/unix/TerminalView.cpp	Wed Jan 27 06:42:38 2021 -0500
+++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp	Wed Jan 27 08:36:45 2021 -0500
@@ -254,6 +254,7 @@
   ,_resizing(false)
   ,_terminalSizeHint(false)
   ,_terminalSizeStartup(true)
+  ,_disabledBracketedPasteMode(false)
   ,_actSel(0)
   ,_wordSelectionMode(false)
   ,_lineSelectionMode(false)
@@ -312,6 +313,7 @@
   //  QCursor::setAutoHideCursor( this, true );
 
   setUsesMouse(true);
+  setBracketedPasteMode(false);
   setColorTable(base_color_table);
   setMouseTracking(true);
 
@@ -2187,6 +2189,16 @@
   return _mouseMarks;
 }
 
+void TerminalView::setBracketedPasteMode(bool on)
+{
+  _bracketedPasteMode = on;
+}
+bool TerminalView::bracketedPasteMode() const
+{
+    return _bracketedPasteMode;
+}
+
+
 /* ------------------------------------------------------------------------- */
 /*                                                                           */
 /*                               Clipboard                                   */
@@ -2208,6 +2220,7 @@
   if ( ! text.isEmpty() )
     {
       text.replace("\n", "\r");
+      bracketText(text);
       QKeyEvent e(QEvent::KeyPress, 0, Qt::NoModifier, text);
       emit keyPressedSignal(&e); // expose as a big fat keypress event
 
@@ -2215,6 +2228,15 @@
     }
 }
 
+void TerminalView::bracketText(QString& text)
+{
+  if (bracketedPasteMode() && !_disabledBracketedPasteMode)
+    {
+        text.prepend("\033[200~");
+        text.append("\033[201~");
+    }
+}
+
 void TerminalView::setSelection(const QString& t)
 {
   QApplication::clipboard()->setText(t, QClipboard::Selection);
--- a/libgui/qterminal/libqterminal/unix/TerminalView.h	Wed Jan 27 06:42:38 2021 -0500
+++ b/libgui/qterminal/libqterminal/unix/TerminalView.h	Wed Jan 27 08:36:45 2021 -0500
@@ -160,6 +160,9 @@
 
     void emitSelection(bool useXselection,bool appendReturn);
 
+    /** change and wrap text corresponding to paste mode **/
+    void bracketText(QString& text);
+
     /**
      * This enum describes the available shapes for the keyboard cursor.
      * See setKeyboardCursorShape()
@@ -379,6 +382,9 @@
      */
     void visibility_changed (bool visible);
 
+    void disableBracketedPasteMode(bool disable) { _disabledBracketedPasteMode = disable; }
+    bool bracketedPasteModeIsDisabled() const { return _disabledBracketedPasteMode; }
+
 public slots:
 
     /**
@@ -455,6 +461,9 @@
     /** See setUsesMouse() */
     bool usesMouse() const;
 
+    void setBracketedPasteMode(bool bracketedPasteMode);
+    bool bracketedPasteMode() const;
+
 signals:
 
     void interrupt_signal (void);
@@ -663,6 +672,8 @@
     bool _terminalSizeHint;
     bool _terminalSizeStartup;
     bool _mouseMarks;
+    bool _bracketedPasteMode;
+    bool _disabledBracketedPasteMode;
 
     QPoint  _iPntSel; // initial selection point
     QPoint  _pntSel; // current selection point
--- a/libgui/qterminal/libqterminal/unix/Vt102Emulation.cpp	Wed Jan 27 06:42:38 2021 -0500
+++ b/libgui/qterminal/libqterminal/unix/Vt102Emulation.cpp	Wed Jan 27 08:36:45 2021 -0500
@@ -752,6 +752,11 @@
     case TY_CSI_PR('h', 1049) : saveCursor(); _screen[1]->clearEntireScreen(); setMode(MODE_AppScreen); break; //XTERM
     case TY_CSI_PR('l', 1049) : resetMode(MODE_AppScreen); restoreCursor(); break; //XTERM
 
+    case TY_CSI_PR('h', 2004) :          setMode      (MODE_BracketedPaste); break; //XTERM
+    case TY_CSI_PR('l', 2004) :        resetMode      (MODE_BracketedPaste); break; //XTERM
+    case TY_CSI_PR('s', 2004) :         saveMode      (MODE_BracketedPaste); break; //XTERM
+    case TY_CSI_PR('r', 2004) :      restoreMode      (MODE_BracketedPaste); break; //XTERM
+
     //FIXME: weird DEC reset sequence
     case TY_CSI_PE('p'      ) : /* IGNORED: reset         (        ) */ break;
 
@@ -1137,6 +1142,7 @@
   resetMode(MODE_Mouse1001); saveMode(MODE_Mouse1001);
   resetMode(MODE_Mouse1002); saveMode(MODE_Mouse1002);
   resetMode(MODE_Mouse1003); saveMode(MODE_Mouse1003);
+  resetMode(MODE_BracketedPaste);  saveMode(MODE_BracketedPaste);
 
   resetMode(MODE_AppScreen); saveMode(MODE_AppScreen);
   // here come obsolete modes
@@ -1157,6 +1163,10 @@
         emit programUsesMouseChanged(false);
     break;
 
+    case MODE_BracketedPaste:
+        emit programBracketedPasteModeChanged(true);
+    break;
+
     case MODE_AppScreen : _screen[1]->clearSelection();
                           setScreen(1);
     break;
@@ -1180,6 +1190,10 @@
         emit programUsesMouseChanged(true);
     break;
 
+    case MODE_BracketedPaste:
+        emit programBracketedPasteModeChanged(false);
+    break;
+
     case MODE_AppScreen : _screen[0]->clearSelection();
                           setScreen(0);
     break;
--- a/libgui/qterminal/libqterminal/unix/Vt102Emulation.h	Wed Jan 27 06:42:38 2021 -0500
+++ b/libgui/qterminal/libqterminal/unix/Vt102Emulation.h	Wed Jan 27 08:36:45 2021 -0500
@@ -37,15 +37,16 @@
 #include "unix/Emulation.h"
 #include "unix/Screen.h"
 
-#define MODE_AppScreen (MODES_SCREEN+0)
-#define MODE_AppCuKeys (MODES_SCREEN+1)
-#define MODE_AppKeyPad (MODES_SCREEN+2)
-#define MODE_Mouse1000 (MODES_SCREEN+3)
-#define MODE_Mouse1001 (MODES_SCREEN+4)
-#define MODE_Mouse1002 (MODES_SCREEN+5)
-#define MODE_Mouse1003 (MODES_SCREEN+6)
-#define MODE_Ansi      (MODES_SCREEN+7)
-#define MODE_total     (MODES_SCREEN+8)
+#define MODE_AppScreen      (MODES_SCREEN+0)
+#define MODE_AppCuKeys      (MODES_SCREEN+1)
+#define MODE_AppKeyPad      (MODES_SCREEN+2)
+#define MODE_Mouse1000      (MODES_SCREEN+3)
+#define MODE_Mouse1001      (MODES_SCREEN+4)
+#define MODE_Mouse1002      (MODES_SCREEN+5)
+#define MODE_Mouse1003      (MODES_SCREEN+6)
+#define MODE_Ansi           (MODES_SCREEN+7)
+#define MODE_BracketedPaste (MODES_SCREEN+8)
+#define MODE_total          (MODES_SCREEN+9)
 
 struct DECpar
 {