diff --git a/src/Screen.cpp b/src/Screen.cpp index 669248411..8e052490d 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -1107,23 +1107,35 @@ bool Screen::isSelected(const int x, const int y) const return pos >= _selTopLeft && pos <= _selBottomRight && columnInSelection; } -QString Screen::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces) const +QString Screen::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces, bool html) const { if (!isSelectionValid()) return QString(); - return text(_selTopLeft, _selBottomRight, preserveLineBreaks, trimTrailingSpaces); + return text(_selTopLeft, _selBottomRight, preserveLineBreaks, trimTrailingSpaces, html); } -QString Screen::text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces) const +QString Screen::text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces, bool html) const { QString result; QTextStream stream(&result, QIODevice::ReadWrite); - PlainTextDecoder decoder; - decoder.begin(&stream); - writeToStream(&decoder, startIndex, endIndex, preserveLineBreaks, trimTrailingSpaces); - decoder.end(); + HTMLDecoder htmlDecoder; + PlainTextDecoder plainTextDecoder; + + TerminalCharacterDecoder *decoder; + if(html) + { + decoder = &htmlDecoder; + } + else + { + decoder = &plainTextDecoder; + } + + decoder->begin(&stream); + writeToStream(decoder, startIndex, endIndex, preserveLineBreaks, trimTrailingSpaces); + decoder->end(); return result; } diff --git a/src/Screen.h b/src/Screen.h index 820c7e153..2566fc171 100644 --- a/src/Screen.h +++ b/src/Screen.h @@ -447,7 +447,7 @@ public: * @param trimTrailingSpaces Specifies whether trailing spaces should be * trimmed in the returned text. */ - QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false) const; + QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false, bool html = false) const; /** * Convenience method. Returns the text between two indices. @@ -458,7 +458,7 @@ public: * @param trimTrailingSpaces Specifies whether trailing spaces should be * trimmed in the returned text. */ - QString text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces = false) const; + QString text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces = false, bool html = false) const; /** * Copies part of the output to a stream. diff --git a/src/ScreenWindow.cpp b/src/ScreenWindow.cpp index 0d5e666c1..2a23382af 100644 --- a/src/ScreenWindow.cpp +++ b/src/ScreenWindow.cpp @@ -120,9 +120,9 @@ QVector ScreenWindow::getLineProperties() return result; } -QString ScreenWindow::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces) const +QString ScreenWindow::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces, bool html) const { - return _screen->selectedText(preserveLineBreaks, trimTrailingSpaces); + return _screen->selectedText(preserveLineBreaks, trimTrailingSpaces, html); } void ScreenWindow::getSelectionStart(int& column , int& line) diff --git a/src/ScreenWindow.h b/src/ScreenWindow.h index 11d599b25..5d8514848 100644 --- a/src/ScreenWindow.h +++ b/src/ScreenWindow.h @@ -232,7 +232,7 @@ public: * @param preserveLineBreaks See Screen::selectedText() * @param trimTrailingSpaces See Screen::selectedText() */ - QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false) const; + QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false, bool html = false) const; public slots: /** diff --git a/src/TerminalDisplay.cpp b/src/TerminalDisplay.cpp index 444faecf2..2219b4445 100644 --- a/src/TerminalDisplay.cpp +++ b/src/TerminalDisplay.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -2751,11 +2752,16 @@ void TerminalDisplay::copyToX11Selection() QString text = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces); if (text.isEmpty()) return; + QString html = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces, true); - QApplication::clipboard()->setText(text, QClipboard::Selection); + QMimeData *mimeData = new QMimeData; + mimeData->setText(text); + mimeData->setHtml(html); + + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Selection); if (_autoCopySelectedText) - QApplication::clipboard()->setText(text, QClipboard::Clipboard); + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); } void TerminalDisplay::copyToClipboard() @@ -2766,8 +2772,13 @@ void TerminalDisplay::copyToClipboard() QString text = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces); if (text.isEmpty()) return; + QString html = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces, true); - QApplication::clipboard()->setText(text, QClipboard::Clipboard); + QMimeData *mimeData = new QMimeData; + mimeData->setText(text); + mimeData->setHtml(html); + + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); } void TerminalDisplay::pasteFromClipboard(bool appendEnter) @@ -3222,8 +3233,9 @@ void TerminalDisplay::doDrag() { _dragInfo.state = diDragging; _dragInfo.dragObject = new QDrag(this); - QMimeData* mimeData = new QMimeData; - mimeData->setText(QApplication::clipboard()->text(QClipboard::Selection)); + QMimeData* mimeData = new QMimeData(); + mimeData->setText(QApplication::clipboard()->mimeData(QClipboard::Selection)->text()); + mimeData->setHtml(QApplication::clipboard()->mimeData(QClipboard::Selection)->html()); _dragInfo.dragObject->setMimeData(mimeData); _dragInfo.dragObject->exec(Qt::CopyAction); }