From c733b3aa9787a618a0ce5bb03b3fc731f5663b21 Mon Sep 17 00:00:00 2001 From: Nate Graham Date: Tue, 13 Oct 2020 13:37:11 -0600 Subject: [PATCH] Don't session-restore invalid paths When session restore is populating the main window, it's unconditional; you'll get whatever was there before. This can be a problem if any of those things are now missing. For example, maybe you were browsing files on a removable disk, then quit Dolphin, and finally removed the disk. The next time you launch Dolphin again, it will try to show you the view from the now-missing removable disk. To prevent this, we now look at all the URLs in all of the view containers that were created after session-restore has finished doing its thing; if any of them are invalid local URLs, we change the URL to the home folder instead to avoid showing the user a view with an invalid location in it. BUG: 427619 FIXED-IN: 20.12 --- src/dolphinmainwindow.cpp | 14 ++++++++++++++ src/dolphinmainwindow.h | 6 ++++++ src/main.cpp | 4 ++++ 3 files changed, 24 insertions(+) diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 2c91cd07a7..f7ec5f511f 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -216,6 +216,20 @@ QVector DolphinMainWindow::viewContainers() const return viewContainers; } +void DolphinMainWindow::setViewsWithInvalidPathsToHome() +{ + const QVector theViewContainers = viewContainers(); + for (DolphinViewContainer *viewContainer : theViewContainers) { + + // Only consider local dirs, not remote locations and abstract protocols + if (viewContainer->url().isLocalFile()) { + if (!QFileInfo::exists(viewContainer->url().toLocalFile())) { + viewContainer->setUrl(QUrl::fromLocalFile(QDir::homePath())); + } + } + } +} + void DolphinMainWindow::openDirectories(const QList& dirs, bool splitView) { m_tabWidget->openDirectories(dirs, splitView); diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index 80d0f891a5..faf428c033 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -102,6 +102,12 @@ public: */ void setViewsToHomeIfMountPathOpen(const QString& mountPath); + /** + * Sets any of the window's view containers which are currently displaying + * invalid locations to the home path + */ + void setViewsWithInvalidPathsToHome(); + public slots: /** * Opens each directory in \p dirs in a separate tab. If \a splitView is set, diff --git a/src/main.cpp b/src/main.cpp index 0a252bc775..9191127e52 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -191,6 +191,10 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) if (startedWithURLs) { mainWindow->openDirectories(urls, splitView); } + + // Now handle invalid locations in the set of active views to + // avoid issues like https://bugs.kde.org/show_bug.cgi?id=427619 + mainWindow->setViewsWithInvalidPathsToHome(); } else { qCWarning(DolphinDebug) << "Unknown class " << className << " in session saved data!"; }