#include #include #include #include #include "util/CharacterColor.h" #include "Screen.h" #include "ScreenWindow.h" #include "Emulation.h" #include "TerminalDisplay.h" #include "Vt102Emulation.h" #include "util/KeyboardTranslator.h" #include "util/ColorScheme.h" #include "util/SearchBar.h" #include "konsole.h" QTermWidget::QTermWidget(QWidget *messageParentWidget, QWidget *parent) : QWidget(parent) { m_layout = new QVBoxLayout(this); m_layout->setContentsMargins(0, 0, 0, 0); setLayout(m_layout); m_terminalDisplay = new TerminalDisplay(this); m_emulation = new Vt102Emulation(); m_terminalDisplay->setBellMode(TerminalDisplay::SystemBeepBell); m_terminalDisplay->setTerminalSizeHint(true); m_terminalDisplay->setTripleClickMode(TerminalDisplay::SelectWholeLine); m_terminalDisplay->setTerminalSizeStartup(true); connect(m_terminalDisplay, &TerminalDisplay::keyPressedSignal, m_emulation, &Emulation::sendKeyEvent); connect(m_terminalDisplay, &TerminalDisplay::mouseSignal, m_emulation, &Emulation::sendMouseEvent); connect(m_terminalDisplay, &TerminalDisplay::sendStringToEmu, this, [this](const char* s){ m_emulation->sendString(s); }); connect(m_emulation, &Emulation::stateSet, this, &QTermWidget::activityStateSet); m_monitorTimer = new QTimer(this); m_monitorTimer->setSingleShot(true); connect(m_monitorTimer, &QTimer::timeout, this, &QTermWidget::monitorTimerDone); connect(m_emulation, &Emulation::programUsesMouseChanged, m_terminalDisplay, &TerminalDisplay::setUsesMouse); m_terminalDisplay->setUsesMouse(m_emulation->programUsesMouse()); connect(m_emulation, &Emulation::programBracketedPasteModeChanged, m_terminalDisplay, &TerminalDisplay::setBracketedPasteMode); m_terminalDisplay->setBracketedPasteMode(m_emulation->programBracketedPasteMode()); m_terminalDisplay->setScreenWindow(m_emulation->createWindow()); connect(m_emulation, &Emulation::primaryScreenInUse, m_terminalDisplay, &TerminalDisplay::usingPrimaryScreen); connect(m_emulation, &Emulation::imageSizeChanged, this, [this](int /*height*/, int /*width*/){ updateTerminalSize(); }); connect(m_terminalDisplay, &TerminalDisplay::changedContentSizeSignal, this, [this](int /*height*/, int /*width*/){ updateTerminalSize(); }); setFlowControlEnabled(true); m_emulation->setCodec(QStringEncoder{QStringConverter::Encoding::Utf8}); m_emulation->setHistory(HistoryTypeBuffer(1000)); m_emulation->setKeyBindings(QString()); m_layout->addWidget(m_terminalDisplay); m_terminalDisplay->setObjectName("terminalDisplay"); setMessageParentWidget(messageParentWidget?messageParentWidget:this); connect(m_terminalDisplay, &TerminalDisplay::notifyBell, this, &QTermWidget::notifyBell); connect(m_terminalDisplay, &TerminalDisplay::handleCtrlC, this, &QTermWidget::handleCtrlC); connect(m_terminalDisplay, &TerminalDisplay::changedContentCountSignal, this, &QTermWidget::termSizeChange); connect(m_terminalDisplay, &TerminalDisplay::mousePressEventForwarded, this, &QTermWidget::mousePressEventForwarded); connect(m_emulation, &Emulation::profileChangeCommandReceived, this, &QTermWidget::profileChanged); connect(m_emulation, &Emulation::zmodemRecvDetected, this, &QTermWidget::zmodemRecvDetected); connect(m_emulation, &Emulation::zmodemSendDetected, this, &QTermWidget::zmodemSendDetected); connect(m_emulation, &Emulation::titleChanged, this, &QTermWidget::titleChanged); connect(m_emulation, &Emulation::sendData, this, [this](const char *buff, int len) { QByteArray data(buff, len); if (m_echo) { recvData(buff, len); } QByteArray dataCopy(buff, len); Q_EMIT sendData(dataCopy.constData(), dataCopy.length()); }); connect( m_emulation, &Emulation::dupDisplayOutput, this, &QTermWidget::dupDisplayOutput); connect( m_emulation, &Emulation::changeTabTextColorRequest, this, &QTermWidget::changeTabTextColorRequest); connect( m_emulation, &Emulation::cursorChanged, this, &QTermWidget::cursorChanged); m_urlFilter = new UrlFilter(); connect(m_urlFilter, &UrlFilter::activated, this, &QTermWidget::urlActivated); m_terminalDisplay->filterChain()->addFilter(m_urlFilter); m_UrlFilterEnable = true; m_searchBar = new SearchBar(this); m_searchBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum); connect(m_searchBar, &SearchBar::searchCriteriaChanged, this, [this](){ search(true, false); }); connect(m_searchBar, &SearchBar::findNext, this, [this](){ search(true, true); }); connect(m_searchBar, &SearchBar::findPrevious, this, [this](){ search(false, false); }); m_layout->addWidget(m_searchBar); m_searchBar->hide(); QString style_sheet = qApp->styleSheet(); m_searchBar->setStyleSheet(style_sheet); this->setFocus( Qt::OtherFocusReason ); this->setFocusPolicy( Qt::WheelFocus ); m_terminalDisplay->resize(this->size()); this->setFocusProxy(m_terminalDisplay); connect(m_terminalDisplay, &TerminalDisplay::copyAvailable, this, &QTermWidget::copyAvailable); connect(m_terminalDisplay, &TerminalDisplay::termGetFocus, this, &QTermWidget::termGetFocus); connect(m_terminalDisplay, &TerminalDisplay::termLostFocus, this, &QTermWidget::termLostFocus); connect(m_terminalDisplay, &TerminalDisplay::keyPressedSignal, this, [this] (QKeyEvent* e, bool) { Q_EMIT termKeyPressed(e); }); setScrollBarPosition(NoScrollBar); setKeyboardCursorShape(Emulation::KeyboardCursorShape::BlockCursor); connect(m_emulation, &Emulation::imageResizeRequest, this, [this](const QSize& size){ if ((size.width() <= 1) || (size.height() <= 1)) { return; } setSize(size); }); } QTermWidget::~QTermWidget() { setUrlFilterEnabled(false); clearHighLightTexts(); delete m_urlFilter; delete m_searchBar; Q_EMIT destroyed(); delete m_emulation; } void QTermWidget::selectionChanged(bool textSelected) { Q_EMIT copyAvailable(textSelected); } void QTermWidget::search(bool forwards, bool next) { int startColumn, startLine; if (next) { m_terminalDisplay->screenWindow()->screen()->getSelectionEnd(startColumn, startLine); startColumn++; } else { m_terminalDisplay->screenWindow()->screen()->getSelectionStart(startColumn, startLine); } QRegularExpression regExp; if (m_searchBar->useRegularExpression()) { regExp.setPattern(m_searchBar->searchText()); } else { regExp.setPattern(QRegularExpression::escape(m_searchBar->searchText())); } regExp.setPatternOptions(m_searchBar->matchCase() ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption); HistorySearch *historySearch = new HistorySearch(m_emulation, regExp, forwards, startColumn, startLine, this); connect(historySearch, &HistorySearch::matchFound, this, [this](int startColumn, int startLine, int endColumn, int endLine){ ScreenWindow* sw = m_terminalDisplay->screenWindow(); sw->scrollTo(startLine); sw->setTrackOutput(false); sw->notifyOutputChanged(); sw->setSelectionStart(startColumn, startLine - sw->currentLine(), false); sw->setSelectionEnd(endColumn, endLine - sw->currentLine()); }); connect(historySearch, &HistorySearch::noMatchFound, this, [this](){ m_terminalDisplay->screenWindow()->clearSelection(); }); connect(historySearch, &HistorySearch::noMatchFound, m_searchBar, &SearchBar::noMatchFound); historySearch->search(); } QSize QTermWidget::sizeHint() const { QSize size = m_terminalDisplay->sizeHint(); size.rheight() = 150; return size; } void QTermWidget::setTerminalSizeHint(bool enabled) { m_terminalDisplay->setTerminalSizeHint(enabled); } bool QTermWidget::terminalSizeHint() { return m_terminalDisplay->terminalSizeHint(); } void QTermWidget::setTerminalFont(const QFont &font) { m_terminalDisplay->setVTFont(font); } QFont QTermWidget::getTerminalFont() { return m_terminalDisplay->getVTFont(); } void QTermWidget::setTerminalOpacity(qreal level) { m_terminalDisplay->setOpacity(level); } void QTermWidget::setTerminalBackgroundImage(const QString& backgroundImage) { m_terminalDisplay->setBackgroundImage(backgroundImage); } void QTermWidget::setTerminalBackgroundMovie(const QString& backgroundMovie) { m_terminalDisplay->setBackgroundMovie(backgroundMovie); } void QTermWidget::setTerminalBackgroundVideo(const QString& backgroundVideo) { m_terminalDisplay->setBackgroundVideo(backgroundVideo); } void QTermWidget::setTerminalBackgroundMode(int mode) { m_terminalDisplay->setBackgroundMode((BackgroundMode)mode); } void QTermWidget::setTextCodec(QStringEncoder codec) { m_emulation->setCodec(std::move(codec)); } void QTermWidget::setColorScheme(const QString& origName) { const ColorScheme *cs = nullptr; const bool isFile = QFile::exists(origName); const QString& name = isFile ? QFileInfo(origName).baseName() : origName; if (!availableColorSchemes().contains(name)) { if (isFile) { if (ColorSchemeManager::instance()->loadCustomColorScheme(origName)) cs = ColorSchemeManager::instance()->findColorScheme(name); } if (!cs) cs = ColorSchemeManager::instance()->defaultColorScheme(); } else { cs = ColorSchemeManager::instance()->findColorScheme(name); } if (! cs) { QMessageBox::information(messageParentWidget, tr("Color Scheme Error"), tr("Cannot load color scheme: %1").arg(name)); return; } ColorEntry table[TABLE_COLORS]; cs->getColorTable(table); m_terminalDisplay->setColorTable(table); m_hasDarkBackground = cs->hasDarkBackground(); } QStringList QTermWidget::getAvailableColorSchemes() { return QTermWidget::availableColorSchemes(); } QStringList QTermWidget::availableColorSchemes() { QStringList ret; const auto allColorSchemes = ColorSchemeManager::instance()->allColorSchemes(); for (const ColorScheme* cs : allColorSchemes) ret.append(cs->name()); return ret; } void QTermWidget::setBackgroundColor(const QColor &color) { m_terminalDisplay->setBackgroundColor(color); } void QTermWidget::setForegroundColor(const QColor &color) { m_terminalDisplay->setForegroundColor(color); } void QTermWidget::setANSIColor(const int ansiColorId, const QColor &color) { m_terminalDisplay->setColorTableColor(ansiColorId, color); } void QTermWidget::setPreeditColorIndex(int index) { m_terminalDisplay->setPreeditColorIndex(index); } void QTermWidget::setSize(const QSize &size) { m_terminalDisplay->setSize(size.width(), size.height()); } void QTermWidget::setHistorySize(int lines) { if (lines <= 0) m_emulation->setHistory(HistoryTypeNone()); else m_emulation->setHistory(HistoryTypeBuffer(lines)); } int QTermWidget::historySize() const { const HistoryType& currentHistory = m_emulation->history(); if (currentHistory.isEnabled()) { if (currentHistory.isUnlimited()) { return -1; } else { return currentHistory.maximumLineCount(); } } else { return 0; } } void QTermWidget::setScrollBarPosition(ScrollBarPosition pos) { m_terminalDisplay->setScrollBarPosition(pos); } void QTermWidget::scrollToEnd() { m_terminalDisplay->scrollToEnd(); } void QTermWidget::sendText(const QString &text) { m_emulation->sendText(text); } void QTermWidget::sendKeyEvent(QKeyEvent *e) { m_emulation->sendKeyEvent(e, false); } void QTermWidget::resizeEvent(QResizeEvent*) { m_terminalDisplay->resize(this->size()); } void QTermWidget::sessionFinished() { Q_EMIT finished(); } void QTermWidget::updateTerminalSize() { int minLines = -1; int minColumns = -1; const int VIEW_LINES_THRESHOLD = 2; const int VIEW_COLUMNS_THRESHOLD = 2; if ( m_terminalDisplay->isHidden() == false && m_terminalDisplay->lines() >= VIEW_LINES_THRESHOLD && m_terminalDisplay->columns() >= VIEW_COLUMNS_THRESHOLD ) { minLines = (minLines == -1) ? m_terminalDisplay->lines() : qMin( minLines , m_terminalDisplay->lines() ); minColumns = (minColumns == -1) ? m_terminalDisplay->columns() : qMin( minColumns , m_terminalDisplay->columns() ); } if ( minLines > 0 && minColumns > 0 ) { m_emulation->setImageSize( minLines , minColumns ); } } void QTermWidget::monitorTimerDone() { if (m_monitorSilence) { Q_EMIT silence(); Q_EMIT stateChanged(NOTIFYSILENCE); } else { Q_EMIT stateChanged(NOTIFYNORMAL); } m_notifiedActivity=false; } void QTermWidget::activityStateSet(int state) { if (state==NOTIFYBELL) { m_terminalDisplay->bell(); } else if (state==NOTIFYACTIVITY) { if (m_monitorSilence) { m_monitorTimer->start(m_silenceSeconds*1000); } if ( m_monitorActivity ) { if (!m_notifiedActivity) { m_notifiedActivity=true; Q_EMIT activity(); } } } if ( state==NOTIFYACTIVITY && !m_monitorActivity ) { state = NOTIFYNORMAL; } if ( state==NOTIFYSILENCE && !m_monitorSilence ) { state = NOTIFYNORMAL; } Q_EMIT stateChanged(state); } void QTermWidget::setMonitorActivity(bool enabled) { m_monitorActivity=enabled; m_notifiedActivity=false; activityStateSet(NOTIFYNORMAL); } void QTermWidget::setMonitorSilence(bool enabled) { if (m_monitorSilence==enabled) { return; } m_monitorSilence=enabled; if (m_monitorSilence) { m_monitorTimer->start(m_silenceSeconds*1000); } else { m_monitorTimer->stop(); } activityStateSet(NOTIFYNORMAL); } void QTermWidget::setSilenceTimeout(int seconds) { m_silenceSeconds=seconds; if (m_monitorSilence) { m_monitorTimer->start(m_silenceSeconds*1000); } } void QTermWidget::bracketText(QString& text) { m_terminalDisplay->bracketText(text); } void QTermWidget::disableBracketedPasteMode(bool disable) { m_terminalDisplay->disableBracketedPasteMode(disable); } bool QTermWidget::bracketedPasteModeIsDisabled() const { return m_terminalDisplay->bracketedPasteModeIsDisabled(); } void QTermWidget::copyClipboard() { m_terminalDisplay->copyClipboard(QClipboard::Clipboard); } void QTermWidget::copySelection() { m_terminalDisplay->copyClipboard(QClipboard::Selection); } void QTermWidget::pasteClipboard() { m_terminalDisplay->pasteClipboard(); } void QTermWidget::pasteSelection() { m_terminalDisplay->pasteSelection(); } void QTermWidget::selectAll() { m_terminalDisplay->selectAll(); } int QTermWidget::setZoom(int step) { QFont font = m_terminalDisplay->getVTFont(); font.setPointSize(font.pointSize() + step); setTerminalFont(font); return font.pointSize(); } int QTermWidget::zoomIn() { return setZoom(STEP_ZOOM); } int QTermWidget::zoomOut() { return setZoom(-STEP_ZOOM); } void QTermWidget::setKeyBindings(const QString & kb) { m_emulation->setKeyBindings(kb); } void QTermWidget::clear() { clearScreen(); clearScrollback(); } void QTermWidget::clearScrollback() { m_emulation->clearHistory(); } void QTermWidget::clearScreen() { m_emulation->reset(); } void QTermWidget::setFlowControlEnabled(bool enabled) { if (m_flowControl == enabled) return; m_flowControl = enabled; Q_EMIT flowControlEnabledChanged(enabled); } bool QTermWidget::flowControlEnabled(void) { return m_flowControl; } void QTermWidget::setFlowControlWarningEnabled(bool enabled) { if (flowControlEnabled()) m_terminalDisplay->setFlowControlWarningEnabled(enabled); } QStringList QTermWidget::availableKeyBindings() { return KeyboardTranslatorManager::instance()->allTranslators(); } QString QTermWidget::keyBindings() { return m_emulation->keyBindings(); } void QTermWidget::toggleShowSearchBar() { if(m_searchBar->isHidden()) { m_searchBar->setText(selectedText(true)); m_searchBar->show(); } else { m_searchBar->hide(); } } void QTermWidget::setMotionAfterPasting(int action) { m_terminalDisplay->setMotionAfterPasting((MotionAfterPasting) action); } int QTermWidget::historyLinesCount() { return m_terminalDisplay->screenWindow()->screen()->getHistLines(); } int QTermWidget::screenColumnsCount() { return m_terminalDisplay->screenWindow()->screen()->getColumns(); } int QTermWidget::screenLinesCount() { return m_terminalDisplay->screenWindow()->screen()->getLines(); } void QTermWidget::setSelectionStart(int row, int column) { m_terminalDisplay->screenWindow()->screen()->setSelectionStart(column, row, true); } void QTermWidget::setSelectionEnd(int row, int column) { m_terminalDisplay->screenWindow()->screen()->setSelectionEnd(column, row); } void QTermWidget::getSelectionStart(int& row, int& column) { m_terminalDisplay->screenWindow()->screen()->getSelectionStart(column, row); } void QTermWidget::getSelectionEnd(int& row, int& column) { m_terminalDisplay->screenWindow()->screen()->getSelectionEnd(column, row); } QString QTermWidget::selectedText(bool preserveLineBreaks) { return m_terminalDisplay->screenWindow()->screen()->selectedText(preserveLineBreaks); } Filter::HotSpot* QTermWidget::getHotSpotAt(const QPoint &pos) const { int row = 0, column = 0; m_terminalDisplay->getCharacterPosition(pos, row, column); return getHotSpotAt(row, column); } Filter::HotSpot* QTermWidget::getHotSpotAt(int row, int column) const { return m_terminalDisplay->filterChain()->hotSpotAt(row, column); } QList QTermWidget::filterActions(const QPoint& position) { return m_terminalDisplay->filterActions(position); } int QTermWidget::recvData(const char *buff, int len) const { m_emulation->receiveData( buff, len ); return len; } void QTermWidget::setKeyboardCursorShape(KeyboardCursorShape shape) { m_terminalDisplay->setKeyboardCursorShape(shape); } void QTermWidget::setKeyboardCursorShape(uint32_t shape) { m_terminalDisplay->setKeyboardCursorShape((KeyboardCursorShape)shape); } void QTermWidget::setBlinkingCursor(bool blink) { m_terminalDisplay->setBlinkingCursor(blink); } void QTermWidget::setBidiEnabled(bool enabled) { m_terminalDisplay->setBidiEnabled(enabled); } bool QTermWidget::isBidiEnabled() { return m_terminalDisplay->isBidiEnabled(); } void QTermWidget::cursorChanged(Emulation::KeyboardCursorShape cursorShape, bool blinkingCursorEnabled) { setKeyboardCursorShape(cursorShape); setBlinkingCursor(blinkingCursorEnabled); } void QTermWidget::setMargin(int margin) { m_terminalDisplay->setMargin(margin); } int QTermWidget::getMargin() const { return m_terminalDisplay->margin(); } void QTermWidget::saveHistory(QTextStream *stream, int format, int start, int end) { TerminalCharacterDecoder *decoder; if(format == 0) { decoder = new PlainTextDecoder; } else { decoder = new HTMLDecoder; } decoder->begin(stream); if(start < 0) { start = 0; } if(end < 0) { end = m_emulation->lineCount(); } m_emulation->writeToStream(decoder, start, end); delete decoder; } void QTermWidget::saveHistory(QIODevice *device, int format, int start, int end) { QTextStream stream(device); saveHistory(&stream, format, start, end); } void QTermWidget::screenShot(QPixmap *pixmap) { QPixmap currPixmap(m_terminalDisplay->size()); m_terminalDisplay->render(&currPixmap); *pixmap = currPixmap.scaled(pixmap->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); } void QTermWidget::repaintDisplay(void) { m_terminalDisplay->repaintDisplay(); } void QTermWidget::screenShot(const QString &fileName) { qreal deviceratio = m_terminalDisplay->devicePixelRatio(); deviceratio = deviceratio*2; QPixmap pixmap(m_terminalDisplay->size() * deviceratio); pixmap.setDevicePixelRatio(deviceratio); m_terminalDisplay->render(&pixmap); pixmap.save(fileName); } void QTermWidget::setLocked(bool enabled) { this->setEnabled(!enabled); m_terminalDisplay->setLocked(enabled); } void QTermWidget::setDrawLineChars(bool drawLineChars) { m_terminalDisplay->setDrawLineChars(drawLineChars); } void QTermWidget::setBoldIntense(bool boldIntense) { m_terminalDisplay->setBoldIntense(boldIntense); } void QTermWidget::setConfirmMultilinePaste(bool confirmMultilinePaste) { m_terminalDisplay->setConfirmMultilinePaste(confirmMultilinePaste); } void QTermWidget::setTrimPastedTrailingNewlines(bool trimPastedTrailingNewlines) { m_terminalDisplay->setTrimPastedTrailingNewlines(trimPastedTrailingNewlines); } void QTermWidget::setEcho(bool echo) { m_echo = echo; } void QTermWidget::setKeyboardCursorColor(bool useForegroundColor, const QColor& color) { m_terminalDisplay->setKeyboardCursorColor(useForegroundColor, color); } void QTermWidget::addHighLightText(const QString &text, const QColor &color) { for (int i = 0; i < m_highLightTexts.size(); i++) { if (m_highLightTexts.at(i)->text == text) { return; } } HighLightText *highLightText = new HighLightText(text,color); m_highLightTexts.append(highLightText); m_terminalDisplay->filterChain()->addFilter(highLightText->regExpFilter); m_terminalDisplay->updateFilters(); m_terminalDisplay->repaint(); } QMap QTermWidget::getHighLightTexts(void) { QMap highLightTexts; for (int i = 0; i < m_highLightTexts.size(); i++) { highLightTexts.insert(m_highLightTexts.at(i)->text, m_highLightTexts.at(i)->color); } return highLightTexts; } bool QTermWidget::isContainHighLightText(const QString &text) { for (int i = 0; i < m_highLightTexts.size(); i++) { if (m_highLightTexts.at(i)->text == text) { return true; } } return false; } void QTermWidget::removeHighLightText(const QString &text) { for (int i = 0; i < m_highLightTexts.size(); i++) { if (m_highLightTexts.at(i)->text == text) { m_terminalDisplay->filterChain()->removeFilter(m_highLightTexts.at(i)->regExpFilter); delete m_highLightTexts.at(i); m_highLightTexts.removeAt(i); m_terminalDisplay->updateFilters(); break; } } m_terminalDisplay->repaint(); } void QTermWidget::clearHighLightTexts(void) { for (int i = 0; i < m_highLightTexts.size(); i++) { m_terminalDisplay->filterChain()->removeFilter(m_highLightTexts.at(i)->regExpFilter); delete m_highLightTexts.at(i); } m_terminalDisplay->updateFilters(); m_highLightTexts.clear(); m_terminalDisplay->repaint(); } void QTermWidget::setWordCharacters(const QString &wordCharacters) { m_terminalDisplay->setWordCharacters(wordCharacters); } QString QTermWidget::wordCharacters(void) { return m_terminalDisplay->wordCharacters(); } void QTermWidget::autoHideMouseAfter(int delay) { m_terminalDisplay->autoHideMouseAfter(delay); } void QTermWidget::setShowResizeNotificationEnabled(bool enabled) { m_terminalDisplay->setShowResizeNotificationEnabled(enabled); } void QTermWidget::setEnableHandleCtrlC(bool enable) { m_emulation->setEnableHandleCtrlC(enable); } int QTermWidget::lines() { return m_terminalDisplay->lines(); } int QTermWidget::columns() { return m_terminalDisplay->columns(); } int QTermWidget::getCursorX() { return m_terminalDisplay->getCursorX(); } int QTermWidget::getCursorY() { return m_terminalDisplay->getCursorY(); } void QTermWidget::setCursorX(int x) { m_terminalDisplay->setCursorX(x); } void QTermWidget::setCursorY(int y) { m_terminalDisplay->setCursorY(y); } QString QTermWidget::screenGet(int row1, int col1, int row2, int col2, int mode) { return m_terminalDisplay->screenGet(row1, col1, row2, col2, mode); } void QTermWidget::setSelectionOpacity(qreal opacity) { m_terminalDisplay->setSelectionOpacity(opacity); } void QTermWidget::setUrlFilterEnabled(bool enable) { if(m_UrlFilterEnable == enable) { return; } if(enable) { m_terminalDisplay->filterChain()->addFilter(m_urlFilter); } else { m_terminalDisplay->filterChain()->removeFilter(m_urlFilter); } } void QTermWidget::setMessageParentWidget(QWidget *parent) { messageParentWidget = parent; m_terminalDisplay->setMessageParentWidget(messageParentWidget); } void QTermWidget::reTranslateUi(void) { m_searchBar->retranslateUi(); } void QTermWidget::set_fix_quardCRT_issue33(bool fix) { m_terminalDisplay->set_fix_quardCRT_issue33(fix); }