From 546f73e36a6937f8ebcd1f51cca4745c0da856c8 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 16 Sep 2023 22:30:20 +1000 Subject: [PATCH] Qt: Fix returning from fullscreen on MacOS --- src/duckstation-qt/displaywidget.cpp | 23 +++++++++++++++++++++-- src/duckstation-qt/displaywidget.h | 2 ++ src/duckstation-qt/mainwindow.cpp | 5 +---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/duckstation-qt/displaywidget.cpp b/src/duckstation-qt/displaywidget.cpp index 318c5b3de..10b8ce714 100644 --- a/src/duckstation-qt/displaywidget.cpp +++ b/src/duckstation-qt/displaywidget.cpp @@ -5,10 +5,10 @@ #include "common/assert.h" #include "common/bitutils.h" #include "common/log.h" -#include "util/imgui_manager.h" #include "mainwindow.h" #include "qthost.h" #include "qtutils.h" +#include "util/imgui_manager.h" #include #include #include @@ -148,6 +148,20 @@ void DisplayWidget::handleCloseEvent(QCloseEvent* event) event->ignore(); } +void DisplayWidget::destroy() +{ + m_destroying = true; + +#ifdef __APPLE__ + // See Qt documentation, entire application is in full screen state, and the main + // window will get reopened fullscreen instead of windowed if we don't close the + // fullscreen window first. + if (isFullScreen()) + close(); +#endif + deleteLater(); +} + void DisplayWidget::updateCenterPos() { #ifdef _WIN32 @@ -339,6 +353,9 @@ bool DisplayWidget::event(QEvent* event) case QEvent::Close: { + if (m_destroying) + return QWidget::event(event); + handleCloseEvent(static_cast(event)); return true; } @@ -358,7 +375,9 @@ bool DisplayWidget::event(QEvent* event) } } -DisplayContainer::DisplayContainer() : QStackedWidget(nullptr) {} +DisplayContainer::DisplayContainer() : QStackedWidget(nullptr) +{ +} DisplayContainer::~DisplayContainer() = default; diff --git a/src/duckstation-qt/displaywidget.h b/src/duckstation-qt/displaywidget.h index 9d461d84e..8f26e6c04 100644 --- a/src/duckstation-qt/displaywidget.h +++ b/src/duckstation-qt/displaywidget.h @@ -32,6 +32,7 @@ public: void updateCursor(bool hidden); void handleCloseEvent(QCloseEvent* event); + void destroy(); Q_SIGNALS: void windowResizedEvent(int width, int height, float scale); @@ -54,6 +55,7 @@ private: bool m_clip_mouse_enabled = false; #endif bool m_cursor_hidden = false; + bool m_destroying = false; std::vector m_keys_pressed_with_modifiers; diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp index 621fb8886..87643e22f 100644 --- a/src/duckstation-qt/mainwindow.cpp +++ b/src/duckstation-qt/mainwindow.cpp @@ -277,9 +277,6 @@ std::optional MainWindow::acquireRenderWindow(bool recreate_window, createDisplayWidget(fullscreen, render_to_main, use_main_window_pos); - // we need the surface visible.. this might be able to be replaced with something else - QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - std::optional wi = m_display_widget->getWindowInfo(); if (!wi.has_value()) { @@ -447,7 +444,7 @@ void MainWindow::destroyDisplayWidget(bool show_game_list) if (m_display_widget) { - m_display_widget->deleteLater(); + m_display_widget->destroy(); m_display_widget = nullptr; }