From a35bf8db4303605533bdbb3bed993844a6d9452d Mon Sep 17 00:00:00 2001 From: Chih-Hsuan Yen Date: Thu, 3 Dec 2020 02:02:52 +0800 Subject: [PATCH] Pasting-related features should be in qtermwidget Those were added to qterminal in [1], which makes fixing paste-related issues harder. [1] https://github.com/lxqt/qterminal/pull/309 --- lib/TerminalDisplay.cpp | 39 +++++++++++++++++++++++++++++++++++++++ lib/TerminalDisplay.h | 4 ++++ lib/qtermwidget.cpp | 8 ++++++++ lib/qtermwidget.h | 3 +++ 4 files changed, 54 insertions(+) diff --git a/lib/TerminalDisplay.cpp b/lib/TerminalDisplay.cpp index ce1b3d3..a3a64a6 100644 --- a/lib/TerminalDisplay.cpp +++ b/lib/TerminalDisplay.cpp @@ -24,6 +24,7 @@ #include "TerminalDisplay.h" // Qt +#include #include #include #include @@ -34,8 +35,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -2660,7 +2663,34 @@ void TerminalDisplay::emitSelection(bool useXselection,bool appendReturn) QClipboard::Clipboard); if ( ! text.isEmpty() ) { + text.replace(QLatin1String("\r\n"), QLatin1String("\n")); text.replace(QLatin1Char('\n'), QLatin1Char('\r')); + + if (_trimPastedTrailingNewlines) { + text.replace(QRegularExpression(QStringLiteral("\\r+$")), QString()); + } + + if (_confirmMultilinePaste && text.contains(QLatin1Char('\r'))) { + QMessageBox confirmation(this); + confirmation.setWindowTitle(tr("Paste multiline text")); + confirmation.setText(tr("Are you sure you want to paste this text?")); + confirmation.setDetailedText(text); + confirmation.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + // Click "Show details..." to show those by default + const auto buttons = confirmation.buttons(); + for( QAbstractButton * btn : buttons ) { + if (confirmation.buttonRole(btn) == QMessageBox::ActionRole && btn->text() == QMessageBox::tr("Show Details...")) { + Q_EMIT btn->clicked(); + break; + } + } + confirmation.setDefaultButton(QMessageBox::Yes); + confirmation.exec(); + if (confirmation.standardButton(confirmation.clickedButton()) != QMessageBox::Yes) { + return; + } + } + bracketText(text); // appendReturn is intentionally handled _after_ enclosing texts with brackets as @@ -2732,6 +2762,15 @@ void TerminalDisplay::pasteSelection() emitSelection(true,false); } + +void TerminalDisplay::setConfirmMultilinePaste(bool confirmMultilinePaste) { + _confirmMultilinePaste = confirmMultilinePaste; +} + +void TerminalDisplay::setTrimPastedTrailingNewlines(bool trimPastedTrailingNewlines) { + _trimPastedTrailingNewlines = trimPastedTrailingNewlines; +} + /* ------------------------------------------------------------------------- */ /* */ /* Keyboard */ diff --git a/lib/TerminalDisplay.h b/lib/TerminalDisplay.h index fabf1b1..ca4382d 100644 --- a/lib/TerminalDisplay.h +++ b/lib/TerminalDisplay.h @@ -413,6 +413,8 @@ public: void setMotionAfterPasting(MotionAfterPasting action); int motionAfterPasting(); + void setConfirmMultilinePaste(bool confirmMultilinePaste); + void setTrimPastedTrailingNewlines(bool trimPastedTrailingNewlines); // maps a point on the widget to the position ( ie. line and column ) // of the character at that point. @@ -824,6 +826,8 @@ private: MotionAfterPasting mMotionAfterPasting; + bool _confirmMultilinePaste; + bool _trimPastedTrailingNewlines; struct InputMethodData { diff --git a/lib/qtermwidget.cpp b/lib/qtermwidget.cpp index 9d692ea..9fa600a 100644 --- a/lib/qtermwidget.cpp +++ b/lib/qtermwidget.cpp @@ -788,3 +788,11 @@ void QTermWidget::setBoldIntense(bool boldIntense) { m_impl->m_terminalDisplay->setBoldIntense(boldIntense); } + +void QTermWidget::setConfirmMultilinePaste(bool confirmMultilinePaste) { + m_impl->m_terminalDisplay->setConfirmMultilinePaste(confirmMultilinePaste); +} + +void QTermWidget::setTrimPastedTrailingNewlines(bool trimPastedTrailingNewlines) { + m_impl->m_terminalDisplay->setTrimPastedTrailingNewlines(trimPastedTrailingNewlines); +} diff --git a/lib/qtermwidget.h b/lib/qtermwidget.h index ec12aac..b63787c 100644 --- a/lib/qtermwidget.h +++ b/lib/qtermwidget.h @@ -239,6 +239,9 @@ public: void setDrawLineChars(bool drawLineChars); void setBoldIntense(bool boldIntense); + + void setConfirmMultilinePaste(bool confirmMultilinePaste); + void setTrimPastedTrailingNewlines(bool trimPastedTrailingNewlines); signals: void finished(); void copyAvailable(bool);