diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index 7295216e162..247f8d8f16c 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -5,11 +5,13 @@ #include "shellmodel.h" #include "terminalcommands.h" +#include "terminalsettings.h" #include "terminaltr.h" #include "terminalwidget.h" #include #include +#include #include #include @@ -127,6 +129,30 @@ TerminalPane::TerminalPane(QObject *parent) connect(m_openSettingsButton, &QToolButton::clicked, m_openSettingsButton, []() { TerminalCommands::openSettingsAction()->trigger(); }); + + auto updateEscButton = [this] { + m_escSettingButton->setChecked(TerminalSettings::instance().sendEscapeToTerminal.value()); + if (TerminalSettings::instance().sendEscapeToTerminal.value()) { + m_escSettingButton->setText("⎋"); + m_escSettingButton->setToolTip(Tr::tr("Sending ESC to terminal instead of Qt Creator")); + } else { + m_escSettingButton->setText("⇧+⎋"); + m_escSettingButton->setToolTip(Tr::tr("Press ⇧+⎋ to send ESC to terminal")); + } + }; + + m_escSettingButton = new QToolButton(); + m_escSettingButton->setCheckable(true); + + updateEscButton(); + + connect(m_escSettingButton, &QToolButton::toggled, this, [this] { + TerminalSettings::instance().sendEscapeToTerminal.setValue(m_escSettingButton->isChecked()); + TerminalSettings::instance().apply(); + TerminalSettings::instance().writeSettings(Core::ICore::settings()); + }); + + connect(&TerminalSettings::instance(), &TerminalSettings::applied, this, updateEscButton); } TerminalPane::~TerminalPane() @@ -252,15 +278,15 @@ void TerminalPane::setupTerminalWidget(TerminalWidget *terminal) m_tabWidget->setTabText(index, exe + " - " + cwd.fileName()); }; - connect(terminal, &TerminalWidget::started, [setTabText, terminal](qint64 /*pid*/) { + connect(terminal, &TerminalWidget::started, this, [setTabText, terminal](qint64 /*pid*/) { setTabText(terminal); }); - connect(terminal, &TerminalWidget::cwdChanged, [setTabText, terminal]() { + connect(terminal, &TerminalWidget::cwdChanged, this, [setTabText, terminal]() { setTabText(terminal); }); - connect(terminal, &TerminalWidget::commandChanged, [setTabText, terminal]() { + connect(terminal, &TerminalWidget::commandChanged, this, [setTabText, terminal]() { setTabText(terminal); }); @@ -274,7 +300,7 @@ QList TerminalPane::toolBarWidgets() const widgets.prepend(m_newTerminalButton); widgets.prepend(m_closeTerminalButton); - return widgets << m_openSettingsButton; + return widgets << m_openSettingsButton << m_escSettingButton; } QString TerminalPane::displayName() const diff --git a/src/plugins/terminal/terminalpane.h b/src/plugins/terminal/terminalpane.h index 952f863e27c..5d93dcb4d9a 100644 --- a/src/plugins/terminal/terminalpane.h +++ b/src/plugins/terminal/terminalpane.h @@ -53,6 +53,7 @@ private: QToolButton *m_newTerminalButton{nullptr}; QToolButton *m_closeTerminalButton{nullptr}; QToolButton *m_openSettingsButton{nullptr}; + QToolButton *m_escSettingButton{nullptr}; bool m_widgetInitialized{false}; }; diff --git a/src/plugins/terminal/terminalsettings.cpp b/src/plugins/terminal/terminalsettings.cpp index b813ee246c6..86e88fc72fc 100644 --- a/src/plugins/terminal/terminalsettings.cpp +++ b/src/plugins/terminal/terminalsettings.cpp @@ -97,6 +97,20 @@ TerminalSettings::TerminalSettings() shell.setToolTip(Tr::tr("The shell executable to be started as terminal")); shell.setDefaultValue(defaultShell()); + sendEscapeToTerminal.setSettingsKey("SendEscapeToTerminal"); + sendEscapeToTerminal.setLabelText(Tr::tr("Send escape key to terminal")); + sendEscapeToTerminal.setToolTip( + Tr::tr("If enabled, pressing the escape key will send it to the terminal " + "instead of closing the terminal.")); + sendEscapeToTerminal.setDefaultValue(false); + + registerAspect(&font); + registerAspect(&fontSize); + registerAspect(&shell); + registerAspect(&allowBlinkingCursor); + registerAspect(&enableTerminal); + registerAspect(&sendEscapeToTerminal); + setupColor(this, foregroundColor, "Foreground", @@ -138,12 +152,6 @@ TerminalSettings::TerminalSettings() setupColor(this, colors[7], "7", Utils::creatorTheme()->color(Theme::TerminalAnsi7)); setupColor(this, colors[15], "15", Utils::creatorTheme()->color(Theme::TerminalAnsi15)); - - registerAspect(&font); - registerAspect(&fontSize); - registerAspect(&shell); - registerAspect(&allowBlinkingCursor); - registerAspect(&enableTerminal); } } // namespace Terminal diff --git a/src/plugins/terminal/terminalsettings.h b/src/plugins/terminal/terminalsettings.h index 35f40031737..d57c411c233 100644 --- a/src/plugins/terminal/terminalsettings.h +++ b/src/plugins/terminal/terminalsettings.h @@ -27,6 +27,8 @@ public: Utils::ColorAspect colors[16]; Utils::BoolAspect allowBlinkingCursor; + + Utils::BoolAspect sendEscapeToTerminal; }; } // namespace Terminal diff --git a/src/plugins/terminal/terminalsettingspage.cpp b/src/plugins/terminal/terminalsettingspage.cpp index 86fb2edda38..12ca9f26d86 100644 --- a/src/plugins/terminal/terminalsettingspage.cpp +++ b/src/plugins/terminal/terminalsettingspage.cpp @@ -376,8 +376,12 @@ QWidget *TerminalSettingsPage::widget() // clang-format off Column { - Row { - settings.enableTerminal, st, + Group { + title(Tr::tr("General")), + Row { + settings.enableTerminal, st, + settings.sendEscapeToTerminal, st + }, }, Group { title(Tr::tr("Font")), diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index bb2f5e210ac..cc1b3b9f269 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -808,6 +808,7 @@ bool TerminalWidget::paintFindMatches(QPainter &p, } break; } + if (it == m_search->hits().constEnd()) return false; @@ -821,13 +822,11 @@ bool TerminalWidget::paintSelection(QPainter &p, const QRectF &cellRect, const Q bool isInSelection = false; const int pos = m_surface->gridToPos(gridPos); - if (m_selection) { + if (m_selection) isInSelection = pos >= m_selection->start && pos < m_selection->end; - } - if (isInSelection) { + if (isInSelection) p.fillRect(cellRect, m_currentColors[ColorIndex::Selection]); - } return isInSelection; } @@ -1049,6 +1048,19 @@ void TerminalWidget::keyPressEvent(QKeyEvent *event) } if (event->key() == Qt::Key_Escape) { + bool sendToTerminal = TerminalSettings::instance().sendEscapeToTerminal.value(); + bool send = false; + if (sendToTerminal && event->modifiers() == Qt::NoModifier) + send = true; + else if (!sendToTerminal && event->modifiers() == Qt::ShiftModifier) + send = true; + + if (send) { + event->setModifiers(Qt::NoModifier); + m_surface->sendKey(event); + return; + } + if (m_selection) TerminalCommands::widgetActions().clearSelection.trigger(); else {