• Aurélien Gâteau's avatar
    Fix crash on close · dd1b2b4d
    Aurélien Gâteau authored
    Move code responsible for 'forgetting' a view outside of code responding to the
    TerminalDisplay deletion.
    
    This avoids a loop like this:
    
    ~MainWindow
    => ~QStackedWidget
    => ~TerminalDisplay
    => QObject::destroyed
    => ViewContainer::viewDestroyed
    => ViewContainer::removeViewWidget
       - internal cleanup
       - try to remove TerminalDisplay from QStackedWidget which is being deleted and
    crash
    
    Instead the code now does:
    
    ~MainWindow
    => ~QStackedWidget
    => ~TerminalDisplay
    => QObject::destroyed
    => ViewContainer::viewDestroyed
    => ViewContainer::forgetView (does the internal clean up)
    
    And if one tries to explicitly remove a view, sequence is:
    
    ViewContainer::removeView
    => ViewContainer::forgetView
    => ViewContainer::removeViewWidget
    
    The patch also removes ViewManager::focusActiveView() because it causes a crash
    when closing a TerminalDisplay as it tries to put the focus on the deleted
    TerminalDisplay. I initially called it through a queued connection, but realized
    it is actually not needed for focus to be passed to the correct view, so just
    removed it.
    
    BUG: 331724
    REVIEW: 118839
    dd1b2b4d
ViewSplitter.cpp 7.13 KB