#include <KActionCollection>
#include <KIO/DesktopExecParser>
-#include <KIO/Job>
+#include <KIO/StatJob>
#include <KJobWidgets>
#include <KLocalizedString>
#include <KMessageWidget>
TerminalPanel::~TerminalPanel()
{
+ if (m_konsolePart) {
+ // Avoid when QObject cleanup, which comes after our destructor, deletes the konsolePart
+ // and subsequently calls back into our slot when the destructor has already run.
+ disconnect(m_konsolePart, &KParts::ReadOnlyPart::destroyed, this, &TerminalPanel::terminalExited);
+ }
}
void TerminalPanel::goHome()
void TerminalPanel::terminalExited()
{
m_terminal = nullptr;
+ m_konsolePart = nullptr;
Q_EMIT hideTerminalPanel();
}
{
// Only react when the DockWidget itself (not some parent) is hidden. This way we don't
// respond when e.g. Dolphin is minimized.
- if (isHiddenInVisibleWindow() && m_terminal && !hasProgramRunning()) {
- // Make sure that the following "cd /" command will not affect the view.
- disconnect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)), this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString)));
-
- // Make sure this terminal does not prevent unmounting any removable drives
- changeDir(QUrl::fromLocalFile(QStringLiteral("/")));
-
- // Because we have disconnected from the part's currentDirectoryChanged()
- // signal, we have to update m_konsolePartCurrentDirectory manually. If this
- // was not done, showing the panel again might not set the part's working
- // directory correctly.
- m_konsolePartCurrentDirectory = '/';
+ if (isHiddenInVisibleWindow()) {
+ if (m_konsolePartMissingMessage) {
+ m_konsolePartMissingMessage->hide();
+ } else if (m_terminal && !hasProgramRunning()) {
+ // Make sure that the following "cd /" command will not affect the view.
+ disconnect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)), this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString)));
+
+ // Make sure this terminal does not prevent unmounting any removable drives
+ changeDir(QUrl::fromLocalFile(QStringLiteral("/")));
+
+ // Because we have disconnected from the part's currentDirectoryChanged()
+ // signal, we have to update m_konsolePartCurrentDirectory manually. If this
+ // was not done, showing the panel again might not set the part's working
+ // directory correctly.
+ m_konsolePartCurrentDirectory = '/';
+ }
}
}
});
}
- } 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. "
- "Please install it and then reopen the panel.");
- m_konsolePartMissingMessage = new KMessageWidget(konsoleNotInstalledText, this);
- m_konsolePartMissingMessage->setCloseButtonVisible(false);
- m_konsolePartMissingMessage->hide();
- if (KIO::DesktopExecParser::hasSchemeHandler(konsoleInstallUrl)) {
- auto installKonsoleAction = new QAction(i18n("Install Konsole"), this);
- connect(installKonsoleAction, &QAction::triggered, [konsoleInstallUrl]() {
- QDesktopServices::openUrl(konsoleInstallUrl);
- });
- m_konsolePartMissingMessage->addAction(installKonsoleAction);
- }
- m_layout->addWidget(m_konsolePartMissingMessage);
- m_layout->addStretch();
- QTimer::singleShot(0, m_konsolePartMissingMessage, &KMessageWidget::animatedShow);
} 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. "
+ "Please install it and then reopen the panel.");
+ m_konsolePartMissingMessage = new KMessageWidget(konsoleNotInstalledText, this);
+ m_konsolePartMissingMessage->setPosition(KMessageWidget::Footer);
+ m_konsolePartMissingMessage->setCloseButtonVisible(false);
+ m_konsolePartMissingMessage->hide();
+ if (KIO::DesktopExecParser::hasSchemeHandler(konsoleInstallUrl)) {
+ auto installKonsoleAction = new QAction(i18n("Install Konsole"), this);
+ connect(installKonsoleAction, &QAction::triggered, [konsoleInstallUrl]() {
+ QDesktopServices::openUrl(konsoleInstallUrl);
+ });
+ m_konsolePartMissingMessage->addAction(installKonsoleAction);
+ }
+ m_layout->addWidget(m_konsolePartMissingMessage);
+ m_layout->setSizeConstraint(QLayout::SetMaximumSize);
+ }
+
m_konsolePartMissingMessage->animatedShow();
}
}
delete m_mostLocalUrlJob;
m_mostLocalUrlJob = nullptr;
+ if (url.isEmpty()) {
+ return;
+ }
+
if (url.isLocalFile()) {
sendCdToTerminal(url.toLocalFile());
return;
// If we can't do that for any reason, silently fail.
auto reply = m_kiofuseInterface.mountUrl(url.toString());
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
- QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=](QDBusPendingCallWatcher *watcher) {
+ QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=, this](QDBusPendingCallWatcher *watcher) {
watcher->deleteLater();
if (!reply.isError()) {
// Successfully mounted, point to the KIOFuse equivalent path.
auto reply = m_kiofuseInterface.remoteUrl(m_konsolePartCurrentDirectory);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
- QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=](QDBusPendingCallWatcher *watcher) {
+ QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=, this](QDBusPendingCallWatcher *watcher) {
watcher->deleteLater();
if (reply.isError()) {
// KIOFuse errored out... just show the normal URL