diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -1183,6 +1183,21 @@ openTerminal->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal"))); actionCollection()->setDefaultShortcut(openTerminal, Qt::SHIFT + Qt::Key_F4); connect(openTerminal, &QAction::triggered, this, &DolphinMainWindow::openTerminal); + + QAction* focusTerminal = actionCollection()->addAction(QStringLiteral("focus_terminal")); + focusTerminal->setText(i18nc("@action:inmenu Tools", "Focus Terminal")); + focusTerminal->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal"))); + connect(focusTerminal, &QAction::triggered, [this]() { + if (m_terminalPanel->isVisible()) { + if (m_terminalPanel->hasFocus()) { + m_activeViewContainer->view()->setFocus(Qt::FocusReason::ShortcutFocusReason); + } else { + m_terminalPanel->setFocus(Qt::FocusReason::ShortcutFocusReason); + } + } else { + actionCollection()->action(QStringLiteral("show_terminal_panel"))->trigger(); + } + }); } #endif diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -55,10 +55,13 @@ void goHome(); QString currentWorkingDirectory(); bool isHiddenInVisibleWindow(); + void setFocus(Qt::FocusReason reason); + bool hasFocus(); public slots: void terminalExited(); void dockVisibilityChanged(); + void setFocus(); signals: void hideTerminalPanel(); diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -223,3 +223,16 @@ const QUrl url(QUrl::fromLocalFile(dir)); emit changeUrl(url); } + +void TerminalPanel::setFocus(Qt::FocusReason reason) { + QWidget::setFocus(reason); + m_terminalWidget->setFocus(reason); +} + +void TerminalPanel::setFocus() { + setFocus(Qt::FocusReason::OtherFocusReason); +} + +bool TerminalPanel::hasFocus() { + return m_terminalWidget->hasFocus(); +}