diff --git a/src/editor/C4ConsoleQt.cpp b/src/editor/C4ConsoleQt.cpp index 7ec68d734..c65a8f009 100644 --- a/src/editor/C4ConsoleQt.cpp +++ b/src/editor/C4ConsoleQt.cpp @@ -94,8 +94,8 @@ void C4ConsoleGUI::DeleteConsoleWindow() { if (Active) { - state->DeleteConsoleWindow(); Active = false; + state->DeleteConsoleWindow(); } } diff --git a/src/editor/C4ConsoleQtState.cpp b/src/editor/C4ConsoleQtState.cpp index 8cdc10052..535513a29 100644 --- a/src/editor/C4ConsoleQtState.cpp +++ b/src/editor/C4ConsoleQtState.cpp @@ -755,8 +755,8 @@ void C4ConsoleGUIState::DeleteConsoleWindow() auto vp = viewports.front(); viewports.erase(viewports.begin()); - vp->deleteLater(); viewport_area->removeDockWidget(vp); + delete vp; } client_actions.clear(); @@ -922,8 +922,15 @@ void C4ConsoleGUIState::RemoveViewport(C4ViewportWindow *cvp) if (vp->GetViewportWindow() == cvp) { viewport_area->removeDockWidget(vp); - vp->deleteLater(); iter = viewports.erase(iter); + + // cannot use deleteLater here because Qt will then + // still select/deselect the viewport's GL context + // behind the scenes, leaving us with an unselected + // GL context. + // Documented at http://doc.qt.io/qt-5/qopenglwidget.html + // Instead, delete the viewport widget directly. + delete vp; } else { diff --git a/src/editor/C4ConsoleQtViewport.cpp b/src/editor/C4ConsoleQtViewport.cpp index 0ad868375..d71bc3f9e 100644 --- a/src/editor/C4ConsoleQtViewport.cpp +++ b/src/editor/C4ConsoleQtViewport.cpp @@ -524,9 +524,15 @@ void C4ConsoleQtViewportDockWidget::closeEvent(QCloseEvent * event) QDockWidget::closeEvent(event); if (event->isAccepted()) { - if (cvp) cvp->Close(); - cvp = NULL; - deleteLater(); + if (cvp) + { + // This causes "this" to be deleted: + cvp->Close(); + } + else + { + deleteLater(); + } } }