From ccd266753d2e298cefbd43c463786653485b263a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Sat, 12 Nov 2016 17:10:08 +0200 Subject: [PATCH] Fixed|UI|Client: Closing the window first unloads the game --- .../apps/client/include/ui/clientwindow.h | 6 ++--- doomsday/apps/client/src/ui/clientwindow.cpp | 25 ++++++++++++++----- doomsday/sdk/libgui/include/de/gui/glwindow.h | 1 + doomsday/sdk/libgui/src/glwindow.cpp | 7 ++++++ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/doomsday/apps/client/include/ui/clientwindow.h b/doomsday/apps/client/include/ui/clientwindow.h index 44febf7a2c..85e1910b7a 100644 --- a/doomsday/apps/client/include/ui/clientwindow.h +++ b/doomsday/apps/client/include/ui/clientwindow.h @@ -167,9 +167,6 @@ class ClientWindow : public de::BaseWindow // Notifications. bool isFPSCounterVisible() const; - // Events. - //void closeEvent(QCloseEvent *) override; - // Implements BaseWindow. de::Vector2f windowContentSize() const override; void drawWindowContent() override; @@ -185,6 +182,9 @@ public slots: void showColorAdjustments(); void hideTaskBarBlur(); +protected: + void windowAboutToClose() override; + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/apps/client/src/ui/clientwindow.cpp b/doomsday/apps/client/src/ui/clientwindow.cpp index c350ebc232..35223d9bff 100644 --- a/doomsday/apps/client/src/ui/clientwindow.cpp +++ b/doomsday/apps/client/src/ui/clientwindow.cpp @@ -441,8 +441,6 @@ DENG2_PIMPL(ClientWindow) void windowInit(GLWindow &) { - qDebug() << "Client: windowInit"; - Sys_GLConfigureDefaultState(); GL_Init2DState(); @@ -869,9 +867,23 @@ bool ClientWindow::isGameMinimized() const return d->isGameMini; } -/* -void ClientWindow::closeEvent(QCloseEvent *ev) +void ClientWindow::windowAboutToClose() { + if (BusyMode_Active()) + { + // Oh well, we can't cancel busy mode... + return; + } + + // Unload the game currently loaded. This will ensure it is shut down gracefully. + if (!DoomsdayApp::game().isNull()) + { + glActivate(); + BusyMode_FreezeGameForBusyMode(); + DoomsdayApp::app().changeGame(GameProfiles::null(), DD_ActivateGameWorker); + } + +#if 0 if (!BusyMode_Active()) { LOG_DEBUG("Window is about to close, executing 'quit'"); @@ -882,8 +894,9 @@ void ClientWindow::closeEvent(QCloseEvent *ev) // We are not authorizing immediate closing of the window; // engine shutdown will take care of it later. - ev->ignore(); // don't close -}*/ + return false; +#endif +} void ClientWindow::preDraw() { diff --git a/doomsday/sdk/libgui/include/de/gui/glwindow.h b/doomsday/sdk/libgui/include/de/gui/glwindow.h index 954866422e..8d460fdad3 100644 --- a/doomsday/sdk/libgui/include/de/gui/glwindow.h +++ b/doomsday/sdk/libgui/include/de/gui/glwindow.h @@ -181,6 +181,7 @@ class LIBGUI_PUBLIC GLWindow : public QOpenGLWindow, public Asset protected: void initializeGL() override; void paintGL() override; + virtual void windowAboutToClose(); // Native events. void resizeEvent (QResizeEvent *ev) override; diff --git a/doomsday/sdk/libgui/src/glwindow.cpp b/doomsday/sdk/libgui/src/glwindow.cpp index d61799bf3c..3db9a5a241 100644 --- a/doomsday/sdk/libgui/src/glwindow.cpp +++ b/doomsday/sdk/libgui/src/glwindow.cpp @@ -335,6 +335,10 @@ bool GLWindow::event(QEvent *ev) return QApplication::sendEvent(&canvas(), &keyEvent); } #endif*/ + if (ev->type() == QEvent::Close) + { + windowAboutToClose(); + } return QOpenGLWindow::event(ev); } @@ -449,6 +453,9 @@ void GLWindow::paintGL() } } +void GLWindow::windowAboutToClose() +{} + void GLWindow::resizeEvent(QResizeEvent *ev) { d->pendingSize = Size(ev->size().width(), ev->size().height()) * qApp->devicePixelRatio();