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>> &currentWindows)
{
-        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>> &currentWindows)
{
+        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.

Reply via email to