https://bugs.kde.org/show_bug.cgi?id=515839
--- Comment #3 from [email protected] --- Comment on attachment 189530 --> https://bugs.kde.org/attachment.cgi?id=189530 Fix closing windows cause crash diff --git a/libs/ui/KisWindowLayoutResource.cpp b/libs/ui/KisWindowLayoutResource.cpp index 2fcec19221..65ff208bf7 100644 --- a/libs/ui/KisWindowLayoutResource.cpp +++ b/libs/ui/KisWindowLayoutResource.cpp @@ -126,10 +126,8 @@ struct KisWindowLayoutResource::Private mainWindow->show(); } } - } - - void closeUnneededWindows(QList<QPointer<KisMainWindow>> ¤tWindows) { - QVector<QPointer<KisMainWindow>> windowsToClose; + + QVector<QPointer<KisMainWindow>> windowsToMigrate; Q_FOREACH(KisMainWindow *mainWindow, currentWindows) { bool keep = false; @@ -141,8 +139,8 @@ struct KisWindowLayoutResource::Private } if (!keep) { - windowsToClose.append(mainWindow); - + windowsToMigrate.append(mainWindow); + // Set the window hidden to prevent "show image in all windows" feature from opening new views on it // while we migrate views onto the remaining windows if (mainWindow->isVisible()) { @@ -150,11 +148,25 @@ struct KisWindowLayoutResource::Private } } } + + migrateViewsFromClosingWindows(windowsToMigrate); + } - migrateViewsFromClosingWindows(windowsToClose); + void closeUnneededWindows(QList<QPointer<KisMainWindow>> ¤tWindows) { + QVector<QPointer<KisMainWindow>> windowsToClose; + + Q_FOREACH(KisMainWindow *mainWindow, currentWindows) { + bool keep = false; + Q_FOREACH(const Window &window, windows) { + if (window.windowId == mainWindow->id()) { + keep = true; + break; + } + } - Q_FOREACH(QPointer<KisMainWindow> mainWindow, windowsToClose) { - mainWindow->close(); + if (!keep) { + mainWindow->close(); + } } } @@ -248,8 +260,9 @@ void KisWindowLayoutResource::applyLayout() layoutManager->setLastUsedLayout(this); QList<QPointer<KisMainWindow>> currentWindows = kisPart->mainWindows(); + bool createWindows = d->windows.isEmpty(); - if (d->windows.isEmpty()) { + if (createWindows) { // No windows defined (e.g. fresh new session). Leave things as they are, but make sure there's at least one visible main window if (kisPart->mainwindowCount() == 0) { kisPart->createMainWindow(); @@ -258,7 +271,6 @@ void KisWindowLayoutResource::applyLayout() } } else { d->openNecessaryWindows(currentWindows); - d->closeUnneededWindows(currentWindows); } // Wait for the windows to finish opening / closing before applying saved geometry. @@ -300,6 +312,9 @@ void KisWindowLayoutResource::applyLayout() layoutManager->setShowImageInAllWindowsEnabled(d->showImageInAllWindows); layoutManager->setPrimaryWorkspaceFollowsFocus(d->primaryWorkspaceFollowsFocus, d->primaryWindow); + if (!createWindows) { + d->closeUnneededWindows(currentWindows); + } } bool KisWindowLayoutResource::saveToDevice(QIODevice *dev) const -- You are receiving this mail because: You are watching all bug changes.
