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 @@ -397,16 +397,22 @@ return; #endif auto splitter = container->activeViewSplitter()->getToplevelSplitter(); - emit tabDetached(splitter); + splitter->setParent(nullptr); auto terminals = splitter->getTerminalDisplays(); - foreach(TerminalDisplay* terminal, terminals) { - auto session = _sessionMap[terminal]; + QHash detachedSessions; + foreach(TerminalDisplay *terminal, terminals) { + 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(); + _terminalDisplayHistory.removeAll(terminal); } + + emit tabDetached(splitter, detachedSessions); removeContainer(container); } @@ -427,15 +433,15 @@ if (sessionToDetach == nullptr) { return; } - disconnect(sessionToDetach, &Konsole::Session::finished, this, &Konsole::ViewManager::sessionFinished); emit viewDetached(sessionToDetach); - + _terminalDisplayHistory.removeAll(viewToDetach); _sessionMap.remove(viewToDetach); // remove the view from this window container->removeView(viewToDetach); + viewToDetach->setScreenWindow(nullptr); viewToDetach->deleteLater(); // if the container from which the view was removed is now empty then it can be deleted, @@ -617,16 +623,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)