diff --git a/src/Application.h b/src/Application.h --- a/src/Application.h +++ b/src/Application.h @@ -30,6 +30,7 @@ namespace Konsole { class MainWindow; class Session; +class TerminalDisplay; /** * The Konsole Application. @@ -69,7 +70,7 @@ private Q_SLOTS: void createWindow(Profile::Ptr profile, const QString &directory); - void detachView(Session *session); + void detachView(Session *session, TerminalDisplay *view); void toggleBackgroundInstance(); diff --git a/src/Application.cpp b/src/Application.cpp --- a/src/Application.cpp +++ b/src/Application.cpp @@ -40,6 +40,7 @@ #include "ShellCommand.h" #include "KonsoleSettings.h" #include "ViewManager.h" +#include "TerminalDisplay.h" #include "SessionController.h" #include "WindowSystemInfo.h" @@ -181,10 +182,10 @@ finalizeNewMainWindow(window); } -void Application::detachView(Session *session) +void Application::detachView(Session *session, TerminalDisplay *view) { MainWindow *window = newMainWindow(); - window->createView(session); + window->createView(session, view); // When detaching a view, the size of the new window should equal the // size of the source window diff --git a/src/MainWindow.h b/src/MainWindow.h --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -40,6 +40,7 @@ class ViewProperties; class Session; class SessionController; +class TerminalDisplay; class ProfileList; class BookmarkHandler; @@ -90,7 +91,7 @@ /** * create view for the specified session */ - void createView(Session *session); + void createView(Session *session, TerminalDisplay *detachedView = nullptr); /** * Helper method to make this window get input focus @@ -127,7 +128,7 @@ /** * Emitted when a view for one session is detached from this window */ - void viewDetached(Session *session); + void viewDetached(Session *session, TerminalDisplay *view); protected: // Reimplemented for internal reasons. diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -50,6 +50,7 @@ #include "ProfileList.h" #include "Session.h" #include "ViewManager.h" +#include "TerminalDisplay.h" #include "SessionManager.h" #include "ProfileManager.h" #include "KonsoleSettings.h" @@ -542,9 +543,9 @@ return session; } -void MainWindow::createView(Session *session) +void MainWindow::createView(Session *session, TerminalDisplay *detachedView) { - _viewManager->createView(session); + _viewManager->createView(session, detachedView); } void MainWindow::setFocus() diff --git a/src/ViewManager.h b/src/ViewManager.h --- a/src/ViewManager.h +++ b/src/ViewManager.h @@ -79,7 +79,7 @@ * Creates a new view to display the output from and deliver input to @p session. * Constructs a new container to hold the views if no container has yet been created. */ - void createView(Session *session); + void createView(Session *session, TerminalDisplay *detachedView = nullptr); /** * Applies the view-specific settings associated with specified @p profile @@ -189,7 +189,7 @@ void empty(); /** Emitted when a session is detached from a view owned by this ViewManager */ - void viewDetached(Session *session); + void viewDetached(Session *session, TerminalDisplay *view); /** * Emitted when the active view changes. @@ -370,7 +370,7 @@ private: Q_DISABLE_COPY(ViewManager) - void createView(Session *session, ViewContainer *container, int index); + void createView(Session *session, ViewContainer *container, int index, TerminalDisplay *detachedView = nullptr); static const ColorScheme *colorSchemeForProfile(const Profile::Ptr profile); void setupActions(); @@ -389,7 +389,7 @@ // creates a new terminal display // the 'session' is used so that the terminal display's random seed // can be set to something which depends uniquely on that session - TerminalDisplay *createTerminalDisplay(Session *session = nullptr); + TerminalDisplay *createTerminalDisplay(Session *session = nullptr, TerminalDisplay *detachedView = nullptr); // creates a new controller for a session/display pair which provides the menu // actions associated with that view, and exposes basic information diff --git a/src/ViewManager.cpp b/src/ViewManager.cpp --- a/src/ViewManager.cpp +++ b/src/ViewManager.cpp @@ -379,7 +379,7 @@ if (sessionToDetach == nullptr) { return; } - emit viewDetached(sessionToDetach); + emit viewDetached(sessionToDetach, viewToDetach); _sessionMap.remove(viewToDetach); @@ -455,7 +455,7 @@ // container and create a new view for that session in a new container foreach (QWidget *view, _viewSplitter->activeContainer()->views()) { Session *session = _sessionMap[qobject_cast(view)]; - TerminalDisplay *display = createTerminalDisplay(session); + TerminalDisplay *display = createTerminalDisplay(session, qobject_cast(view)); const Profile::Ptr profile = SessionManager::instance()->sessionProfile(session); applyProfileToView(display, profile); ViewProperties *properties = createController(session, display); @@ -577,16 +577,16 @@ return _viewSplitter->activeSplitter()->activeContainer()->searchBar(); } -void ViewManager::createView(Session *session, ViewContainer *container, int index) +void ViewManager::createView(Session *session, ViewContainer *container, int index, TerminalDisplay *detachedView) { // notify this view manager when the session finishes so that its view // can be deleted // // Use Qt::UniqueConnection to avoid duplicate connection connect(session, &Konsole::Session::finished, this, &Konsole::ViewManager::sessionFinished, Qt::UniqueConnection); - TerminalDisplay *display = createTerminalDisplay(session); + TerminalDisplay *display = createTerminalDisplay(session, detachedView); const Profile::Ptr profile = SessionManager::instance()->sessionProfile(session); applyProfileToView(display, profile); @@ -622,7 +622,7 @@ updateDetachViewState(); } -void ViewManager::createView(Session *session) +void ViewManager::createView(Session *session, TerminalDisplay *detachedView) { // create the default container if (_viewSplitter->containers().count() == 0) { @@ -646,7 +646,7 @@ // and create a new terminal display for the session in each of them, along with // a controller for the session/display pair foreach (ViewContainer *container, _viewSplitter->containers()) { - createView(session, container, index); + createView(session, container, index, detachedView); } } @@ -845,11 +845,22 @@ // emit unplugController(_pluggedController); } -TerminalDisplay *ViewManager::createTerminalDisplay(Session *session) +TerminalDisplay *ViewManager::createTerminalDisplay(Session *session, TerminalDisplay *detachedView) { auto display = new TerminalDisplay(nullptr); display->setRandomSeed(session->sessionId() * 31); + if (detachedView != nullptr) { + if (detachedView->flowControlWarningEnabled()) { + display->setFlowControlWarningEnabled(true); + + // Without the timer the display becomes really small + QTimer::singleShot(0, this, [display]() { + display->outputSuspended(true); + }); + } + } + return display; }