Index: src/Application.h =================================================================== --- src/Application.h +++ src/Application.h @@ -70,7 +70,7 @@ private Q_SLOTS: void createWindow(const Profile::Ptr &profile, const QString &directory); void detachView(Session *session); - void detachTab(ViewSplitter *splitter); + void detachTab(ViewSplitter *splitter, QHash sessionsMap); void toggleBackgroundInstance(); Index: src/Application.cpp =================================================================== --- src/Application.cpp +++ src/Application.cpp @@ -184,14 +184,14 @@ finalizeNewMainWindow(window); } -void Application::detachTab(ViewSplitter *splitter) +void Application::detachTab(ViewSplitter *splitter, QHash sessionsMap) { MainWindow *currentWindow = qobject_cast(sender()); MainWindow *window = newMainWindow(); ViewManager *manager = window->viewManager(); foreach(TerminalDisplay* terminal, splitter->getTerminalDisplays()) { - manager->attachView(terminal); + manager->attachView(terminal, sessionsMap[terminal]); } manager->activeContainer()->addSplitter(splitter); Index: src/MainWindow.h =================================================================== --- src/MainWindow.h +++ src/MainWindow.h @@ -127,7 +127,7 @@ * Emitted when a view for one session is detached from this window */ void viewDetached(Session *session); - void tabDetached(ViewSplitter *splitter); + void tabDetached(ViewSplitter *splitter, QHash sessionsMap); protected: // Reimplemented for internal reasons. Index: src/SessionController.cpp =================================================================== --- src/SessionController.cpp +++ src/SessionController.cpp @@ -230,10 +230,6 @@ SessionController::~SessionController() { - if (!_view.isNull()) { - _view->setScreenWindow(nullptr); - } - _allControllers.remove(this); if (!_editProfileDialog.isNull()) { Index: src/ViewManager.h =================================================================== --- src/ViewManager.h +++ src/ViewManager.h @@ -191,7 +191,7 @@ */ TabbedViewContainer *activeContainer(); TerminalDisplay *createView(Session *session); - void attachView(TerminalDisplay *terminal); + void attachView(TerminalDisplay *terminal, Session *session); /** Reorder the terminal display history list */ void updateTerminalDisplayHistory(TerminalDisplay *terminalDisplay = nullptr, bool remove = false); @@ -202,7 +202,7 @@ /** Emitted when a session is detached from a view owned by this ViewManager */ void viewDetached(Session *session); - void tabDetached(ViewSplitter *splitter); + void tabDetached(ViewSplitter *splitter, QHash sessionsMap); /** * Emitted when the active view changes. Index: src/ViewManager.cpp =================================================================== --- src/ViewManager.cpp +++ src/ViewManager.cpp @@ -399,17 +399,21 @@ return; #endif auto splitter = container->activeViewSplitter()->getToplevelSplitter(); - emit tabDetached(splitter); + splitter->setParent(nullptr); auto terminals = splitter->getTerminalDisplays(); + QHash detachedSessions; foreach(TerminalDisplay* terminal, terminals) { - auto session = _sessionMap[terminal]; + auto session = _sessionMap.take(terminal); + detachedSessions[terminal] = session; if (session != nullptr) { disconnect(session, &Konsole::Session::finished, this, &Konsole::ViewManager::sessionFinished); container->disconnectTerminalDisplay(terminal); } - _sessionMap.remove(terminal); + auto controller = terminal->sessionController(); + controller->deleteLater(); updateTerminalDisplayHistory(terminal, true); } + emit tabDetached(splitter, detachedSessions); removeContainer(container); focusAnotherTerminal(splitter); } @@ -443,6 +447,7 @@ // remove the view from this window container->removeView(viewToDetach); + viewToDetach->setScreenWindow(nullptr); viewToDetach->deleteLater(); focusAnotherTerminal(container->activeViewSplitter()); @@ -630,16 +635,13 @@ return _pluggedController; } -void ViewManager::attachView(TerminalDisplay *terminal) +void ViewManager::attachView(TerminalDisplay *terminal, Session *session) { - auto session = terminal->sessionController()->session().data(); - connect(session, &Konsole::Session::finished, this, &Konsole::ViewManager::sessionFinished, - Qt::UniqueConnection); + createController(session, terminal); + connect(session, &Konsole::Session::finished, this, &Konsole::ViewManager::sessionFinished, Qt::UniqueConnection); _sessionMap[terminal] = session; updateDetachViewState(); - if (_terminalDisplayHistory.isEmpty()) { - _terminalDisplayHistory.append(terminal); - } + _terminalDisplayHistory.append(terminal); } TerminalDisplay *ViewManager::createView(Session *session) @@ -670,6 +672,7 @@ display->setFocus(Qt::OtherFocusReason); updateDetachViewState(); + _terminalDisplayHistory.append(display); return display; }