From a3e4c61a0bd4994189846ac52ec3018d3aff315d Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Tue, 29 Dec 2020 16:29:14 +1000 Subject: [PATCH] CommonHostInterface: Add a method to get top-level window handle --- src/duckstation-qt/main.cpp | 5 +++-- src/duckstation-qt/mainwindow.cpp | 22 +++++++++++++------ src/duckstation-qt/mainwindow.h | 3 +++ src/duckstation-qt/qthostinterface.cpp | 5 +++++ src/duckstation-qt/qthostinterface.h | 1 + src/frontend-common/common_host_interface.cpp | 5 +++++ src/frontend-common/common_host_interface.h | 3 +++ 7 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/duckstation-qt/main.cpp b/src/duckstation-qt/main.cpp index 023f0502a..b190f80b1 100644 --- a/src/duckstation-qt/main.cpp +++ b/src/duckstation-qt/main.cpp @@ -32,6 +32,8 @@ int main(int argc, char* argv[]) if (!host_interface->ParseCommandLineParameters(argc, argv, &boot_params)) return EXIT_FAILURE; + std::unique_ptr window = std::make_unique(host_interface.get()); + if (!host_interface->Initialize()) { host_interface->Shutdown(); @@ -40,8 +42,7 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - std::unique_ptr window = std::make_unique(host_interface.get()); - window->show(); + window->initializeAndShow(); // if we're in batch mode, don't bother refreshing the game list as it won't be used if (!host_interface->inBatchMode()) diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp index 414069193..693abc27c 100644 --- a/src/duckstation-qt/mainwindow.cpp +++ b/src/duckstation-qt/mainwindow.cpp @@ -47,6 +47,20 @@ MainWindow::MainWindow(QtHostInterface* host_interface) { m_host_interface->setMainWindow(this); + // force creation of native window + winId(); +} + +MainWindow::~MainWindow() +{ + Assert(!m_display_widget); + m_host_interface->setMainWindow(nullptr); + + Assert(!m_debugger_window); +} + +void MainWindow::initializeAndShow() +{ m_ui.setupUi(this); setupAdditionalUi(); connectSignals(); @@ -56,14 +70,8 @@ MainWindow::MainWindow(QtHostInterface* host_interface) restoreStateFromConfig(); switchToGameListView(); -} -MainWindow::~MainWindow() -{ - Assert(!m_display_widget); - m_host_interface->setMainWindow(nullptr); - - Assert(!m_debugger_window); + show(); } void MainWindow::reportError(const QString& message) diff --git a/src/duckstation-qt/mainwindow.h b/src/duckstation-qt/mainwindow.h index 7f80c5deb..813580f5b 100644 --- a/src/duckstation-qt/mainwindow.h +++ b/src/duckstation-qt/mainwindow.h @@ -31,6 +31,9 @@ public: explicit MainWindow(QtHostInterface* host_interface); ~MainWindow(); + /// Initializes the window. Call once at startup. + void initializeAndShow(); + /// Performs update check if enabled in settings. void startupUpdateCheck(); diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index 17ea20ea9..8aee871f4 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -619,6 +619,11 @@ bool QtHostInterface::RequestRenderWindowSize(s32 new_window_width, s32 new_wind return true; } +void* QtHostInterface::GetTopLevelWindowHandle() const +{ + return reinterpret_cast(m_main_window->winId()); +} + void QtHostInterface::PollAndUpdate() { CommonHostInterface::PollAndUpdate(); diff --git a/src/duckstation-qt/qthostinterface.h b/src/duckstation-qt/qthostinterface.h index 349622f43..383bb33f4 100644 --- a/src/duckstation-qt/qthostinterface.h +++ b/src/duckstation-qt/qthostinterface.h @@ -72,6 +72,7 @@ public: std::string TranslateStdString(const char* context, const char* str) const override; bool RequestRenderWindowSize(s32 new_window_width, s32 new_window_height) override; + void* GetTopLevelWindowHandle() const override; ALWAYS_INLINE const GameList* getGameList() const { return m_game_list.get(); } ALWAYS_INLINE GameList* getGameList() { return m_game_list.get(); } diff --git a/src/frontend-common/common_host_interface.cpp b/src/frontend-common/common_host_interface.cpp index 663bc53a1..c14371644 100644 --- a/src/frontend-common/common_host_interface.cpp +++ b/src/frontend-common/common_host_interface.cpp @@ -2672,6 +2672,11 @@ bool CommonHostInterface::RequestRenderWindowScale(float scale) return RequestRenderWindowSize(static_cast(requested_width), static_cast(requested_height)); } +void* CommonHostInterface::GetTopLevelWindowHandle() const +{ + return nullptr; +} + std::unique_ptr CommonHostInterface::OpenPackageFile(const char* path, u32 flags) { const u32 allowed_flags = (BYTESTREAM_OPEN_READ | BYTESTREAM_OPEN_SEEKABLE | BYTESTREAM_OPEN_STREAMED); diff --git a/src/frontend-common/common_host_interface.h b/src/frontend-common/common_host_interface.h index cee7731fe..031085761 100644 --- a/src/frontend-common/common_host_interface.h +++ b/src/frontend-common/common_host_interface.h @@ -192,6 +192,9 @@ public: /// Requests a resize to a multiple of the render window size. bool RequestRenderWindowScale(float scale); + /// Returns a pointer to the top-level window, needed by some controller interfaces. + virtual void* GetTopLevelWindowHandle() const; + /// Opens a file in the DuckStation "package". /// This is the APK for Android builds, or the program directory for standalone builds. virtual std::unique_ptr OpenPackageFile(const char* path, u32 flags) override;