X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/caf49dafa557caa9bd985702a240284348c82b40..e70e12e3bdf3ce4e9cca4c8f003655ea10b21d7e:/src/panels/terminal/terminalpanel.cpp diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 9d30dcd62..d87ae3b1e 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -6,6 +6,7 @@ #include "terminalpanel.h" +#include #include #include #include @@ -17,6 +18,8 @@ #include #include #include +#include +#include #include #include @@ -100,6 +103,21 @@ QString TerminalPanel::runningProgramName() const return m_terminal ? m_terminal->foregroundProcessName() : QString(); } +KActionCollection *TerminalPanel::actionCollection() +{ + // m_terminal is the only reference reset to nullptr in case the terminal is + // closed again + if (m_terminal && m_konsolePart && m_terminalWidget) { + const auto guiClients = m_konsolePart->childClients(); + for (auto *client : guiClients) { + if (client->actionCollection()->associatedWidgets().contains(m_terminalWidget)) { + return client->actionCollection(); + } + } + } + return nullptr; +} + bool TerminalPanel::hasProgramRunning() const { return m_terminal && (m_terminal->foregroundProcessId() != -1); @@ -139,6 +157,23 @@ void TerminalPanel::showEvent(QShowEvent* event) m_layout->removeWidget(m_konsolePartMissingMessage); } m_terminal = qobject_cast(m_konsolePart); + + // needed to collect the correct KonsolePart actionCollection + // namely the one of the single inner terminal and not the outer KonsolePart + if (!m_konsolePart->factory() && m_terminalWidget) { + if (!m_konsolePart->clientBuilder()) { + m_konsolePart->setClientBuilder(new KXMLGUIBuilder(m_terminalWidget)); + } + + auto factory = new KXMLGUIFactory(m_konsolePart->clientBuilder(), this); + factory->addClient(m_konsolePart); + + // Prevents the KXMLGui warning about removing the client + connect(m_terminalWidget, &QObject::destroyed, this, [factory, this] { + factory->removeClient(m_konsolePart); + }); + } + } else if (!m_konsolePartMissingMessage) { const auto konsoleInstallUrl = QUrl("appstream://org.kde.konsole.desktop"); const auto konsoleNotInstalledText = i18n("Terminal cannot be shown because Konsole is not installed. " @@ -199,7 +234,9 @@ void TerminalPanel::changeDir(const QUrl& url) void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHistory) { - if (dir == m_konsolePartCurrentDirectory) { + if (dir == m_konsolePartCurrentDirectory // We are already there + && m_sendCdToTerminalHistory.isEmpty() // …and that is not because the terminal couldn't keep up + ) { m_clearTerminal = false; return; } @@ -217,8 +254,6 @@ void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHist } #endif - m_terminal->sendInput(" cd " + KShell::quoteArg(dir) + '\n'); - // We want to ignore the currentDirectoryChanged(QString) signal, which we will receive after // the directory change, because this directory change is not caused by a "cd" command that the // user entered in the panel. Therefore, we have to remember 'dir'. Note that it could also be @@ -226,6 +261,8 @@ void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHist if (addToHistory == HistoryPolicy::AddToHistory) m_sendCdToTerminalHistory.enqueue(QDir(dir).canonicalPath()); + m_terminal->sendInput(" cd " + KShell::quoteArg(dir) + '\n'); + if (m_clearTerminal) { m_terminal->sendInput(QStringLiteral(" clear\n")); m_clearTerminal = false;