From 1c9add2acb5f9b548a19332d3ecfdaf47f3f183b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Sat, 19 Jun 2021 17:14:30 +0200 Subject: [PATCH] TerminalDisplay: Extract copying related functions --- src/CMakeLists.txt | 2 +- ...minalPasting.cpp => TerminalClipboard.cpp} | 26 ++++++++++++-- ...{TerminalPasting.h => TerminalClipboard.h} | 6 ++-- src/terminalDisplay/TerminalDisplay.cpp | 35 ++++++------------- 4 files changed, 37 insertions(+), 32 deletions(-) rename src/terminalDisplay/{TerminalPasting.cpp => TerminalClipboard.cpp} (88%) rename src/terminalDisplay/{TerminalPasting.h => TerminalClipboard.h} (90%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3e830f309..ae3d372be 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -181,7 +181,7 @@ set(konsoleprivate_SRCS ${windowadaptors_SRCS} terminalDisplay/TerminalScrollBar.cpp terminalDisplay/TerminalColor.cpp terminalDisplay/TerminalFonts.cpp - terminalDisplay/TerminalPasting.cpp + terminalDisplay/TerminalClipboard.cpp widgets/TerminalDisplayAccessible.cpp widgets/TerminalHeaderBar.cpp diff --git a/src/terminalDisplay/TerminalPasting.cpp b/src/terminalDisplay/TerminalClipboard.cpp similarity index 88% rename from src/terminalDisplay/TerminalPasting.cpp rename to src/terminalDisplay/TerminalClipboard.cpp index d6bbb5d9a..15608f7ed 100644 --- a/src/terminalDisplay/TerminalPasting.cpp +++ b/src/terminalDisplay/TerminalClipboard.cpp @@ -17,10 +17,9 @@ #include #include -#include "TerminalPasting.h" +#include "TerminalClipboard.h" -namespace Konsole { -namespace terminalPasting { +namespace Konsole::terminalClipboard { // Most code in Konsole uses UTF-32. We're filtering // UTF-16 here, as all control characters can be represented @@ -142,5 +141,26 @@ bool isUnsafe(const QChar c) { return (c.category() == QChar::Category::Other_Control && std::find(ALLOWLIST.begin(), ALLOWLIST.end(), c.unicode()) != ALLOWLIST.end()); } +void copyToX11Selection(const QString &textToCopy, bool isHtml, bool autoCopySelectedText) +{ + if (textToCopy.isEmpty()) { + return; + } + + auto mimeData = new QMimeData; + mimeData->setText(textToCopy); + + if (isHtml) { + mimeData->setHtml(textToCopy); + } + + if (QApplication::clipboard()->supportsSelection()) { + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Selection); + } + + if (autoCopySelectedText) { + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); + } } + } diff --git a/src/terminalDisplay/TerminalPasting.h b/src/terminalDisplay/TerminalClipboard.h similarity index 90% rename from src/terminalDisplay/TerminalPasting.h rename to src/terminalDisplay/TerminalClipboard.h index 02fad3cfc..74c3db09f 100644 --- a/src/terminalDisplay/TerminalPasting.h +++ b/src/terminalDisplay/TerminalClipboard.h @@ -15,8 +15,7 @@ class QStringList; #include -namespace Konsole { -namespace terminalPasting { +namespace Konsole::terminalClipboard { /** * Retrieves the content of the clipboard and preprocesses it for pasting @@ -48,5 +47,6 @@ QStringList checkForUnsafeCharacters(const QString &text); */ bool isUnsafe(const QChar c); -} +void copyToX11Selection(const QString &textToCopy, bool copyAsHtml, bool autoCopySelectedText); + } diff --git a/src/terminalDisplay/TerminalDisplay.cpp b/src/terminalDisplay/TerminalDisplay.cpp index fcac6ae6b..931f16022 100644 --- a/src/terminalDisplay/TerminalDisplay.cpp +++ b/src/terminalDisplay/TerminalDisplay.cpp @@ -75,7 +75,7 @@ #include "TerminalScrollBar.h" #include "TerminalColor.h" #include "TerminalFonts.h" -#include "TerminalPasting.h" +#include "TerminalClipboard.h" using namespace Konsole; @@ -1569,7 +1569,7 @@ void TerminalDisplay::processMidButtonClick(QMouseEvent* ev) if (_middleClickPasteMode == Enum::PasteFromX11Selection) { pasteFromX11Selection(appendEnter); } else if (_middleClickPasteMode == Enum::PasteFromClipboard) { - doPaste(terminalPasting::pasteFromClipboard(), appendEnter); + doPaste(terminalClipboard::pasteFromClipboard(), appendEnter); } else { Q_ASSERT(false); } @@ -2121,7 +2121,7 @@ void TerminalDisplay::doPaste(QString text, bool appendReturn) } } - auto unsafeCharacters = terminalPasting::checkForUnsafeCharacters(text); + auto unsafeCharacters = terminalClipboard::checkForUnsafeCharacters(text); if (!unsafeCharacters.isEmpty()) { int result = KMessageBox::warningYesNoCancelList(window(), @@ -2144,7 +2144,7 @@ void TerminalDisplay::doPaste(QString text, bool appendReturn) case KMessageBox::Cancel: return; case KMessageBox::Yes: { - text = terminalPasting::sanitizeString(text); + text = terminalClipboard::sanitizeString(text); } case KMessageBox::No: break; @@ -2153,7 +2153,7 @@ void TerminalDisplay::doPaste(QString text, bool appendReturn) } } - auto pasteString = terminalPasting::prepareStringForPasting(text, appendReturn, bracketedPasteMode()); + auto pasteString = terminalClipboard::prepareStringForPasting(text, appendReturn, bracketedPasteMode()); if (pasteString.has_value()) { // perform paste by simulating keypress events QKeyEvent e(QEvent::KeyPress, 0, Qt::NoModifier, text); @@ -2182,26 +2182,11 @@ void TerminalDisplay::copyToX11Selection() return; } + const auto &text = _copyTextAsHTML ? + _screenWindow->selectedText(currentDecodingOptions() | Screen::ConvertToHtml) + : _screenWindow->selectedText(currentDecodingOptions()); - const QString &text = _screenWindow->selectedText(currentDecodingOptions()); - if (text.isEmpty()) { - return; - } - - auto mimeData = new QMimeData; - mimeData->setText(text); - - if (_copyTextAsHTML) { - mimeData->setHtml(_screenWindow->selectedText(currentDecodingOptions() | Screen::ConvertToHtml)); - } - - if (QApplication::clipboard()->supportsSelection()) { - QApplication::clipboard()->setMimeData(mimeData, QClipboard::Selection); - } - - if (_autoCopySelectedText) { - QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); - } + terminalClipboard::copyToX11Selection(text, _copyTextAsHTML, _autoCopySelectedText); } void TerminalDisplay::copyToClipboard() @@ -2705,7 +2690,7 @@ void TerminalDisplay::setSessionController(SessionController* controller) { _sessionController = controller; connect(_sessionController, &Konsole::SessionController::pasteFromClipboardRequested, [this] { - doPaste(terminalPasting::pasteFromClipboard(), false); + doPaste(terminalClipboard::pasteFromClipboard(), false); }); _headerBar->finishHeaderSetup(controller); }