From 3d0b100199802ae28bdb42f47abdc523c257cc75 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Sat, 22 Jan 2022 02:41:02 +0200 Subject: [PATCH] qt: Send dialog status to VM-manager & fix pause - Manager is notified of modal dialogs blocking the main window. - Pause command from manager uses action to prevent desyncing pause status in the menus and toolbar. --- src/qt/qt_main.cpp | 12 ++++++++++-- src/qt/qt_mainwindow.cpp | 5 +++++ src/qt/qt_mainwindow.hpp | 1 + src/qt/qt_winmanagerfilter.cpp | 15 +++++++++++++++ src/qt/qt_winmanagerfilter.hpp | 10 ++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 5dc99afb5..a09b45b6a 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -144,15 +144,23 @@ int main(int argc, char* argv[]) { std::unique_ptr wmfilter; if (source_hwnd) { + HWND main_hwnd = (HWND)main_window->winId(); + wmfilter.reset(new WindowsManagerFilter()); QObject::connect(wmfilter.get(), WindowsManagerFilter::showsettings, main_window, MainWindow::showSettings); - QObject::connect(wmfilter.get(), WindowsManagerFilter::pause, [](){ plat_pause(dopause ^ 1); }); + QObject::connect(wmfilter.get(), WindowsManagerFilter::pause, main_window, MainWindow::togglePause); QObject::connect(wmfilter.get(), WindowsManagerFilter::reset, main_window, MainWindow::hardReset); QObject::connect(wmfilter.get(), WindowsManagerFilter::shutdown, [](){ plat_power_off(); }); QObject::connect(wmfilter.get(), WindowsManagerFilter::ctrlaltdel, [](){ pc_send_cad(); }); + QObject::connect(wmfilter.get(), WindowsManagerFilter::dialogstatus, [main_hwnd](bool open){ + PostMessage((HWND)(uintptr_t)source_hwnd, WM_SENDDLGSTATUS, (WPARAM)(open ? 1 : 0), (LPARAM)main_hwnd); + }); + + /* Native filter to catch VM-managers commands */ app.installNativeEventFilter(wmfilter.get()); - HWND main_hwnd = (HWND)main_window->winId(); + /* Filter to catch main window being blocked (by modal dialog) */ + main_window->installEventFilter(wmfilter.get()); /* Send main window HWND to manager */ PostMessage((HWND)(uintptr_t)source_hwnd, WM_SENDHWND, (WPARAM)unique_id, (LPARAM)main_hwnd); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 81489113c..d82adc421 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1500,4 +1500,9 @@ void MainWindow::showSettings() void MainWindow::hardReset() { ui->actionHard_Reset->trigger(); +} + +void MainWindow::togglePause() +{ + ui->actionPause->trigger(); } \ No newline at end of file diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index c9f22ede2..76effef48 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -50,6 +50,7 @@ signals: public slots: void showSettings(); void hardReset(); + void togglePause(); private slots: void on_actionFullscreen_triggered(); void on_actionSettings_triggered(); diff --git a/src/qt/qt_winmanagerfilter.cpp b/src/qt/qt_winmanagerfilter.cpp index 205d4ea16..cdaa6734e 100644 --- a/src/qt/qt_winmanagerfilter.cpp +++ b/src/qt/qt_winmanagerfilter.cpp @@ -30,6 +30,7 @@ #include "qt_winmanagerfilter.hpp" +#include #include <86box/win.h> bool WindowsManagerFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result) @@ -59,4 +60,18 @@ bool WindowsManagerFilter::nativeEventFilter(const QByteArray &eventType, void * } return false; +} + +bool WindowsManagerFilter::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::WindowBlocked) + { + emit dialogstatus(1); + } + else if (event->type() == QEvent::WindowUnblocked) + { + emit dialogstatus(0); + } + + return QObject::eventFilter(obj, event); } \ No newline at end of file diff --git a/src/qt/qt_winmanagerfilter.hpp b/src/qt/qt_winmanagerfilter.hpp index 9f43e1b5c..405d84aed 100644 --- a/src/qt/qt_winmanagerfilter.hpp +++ b/src/qt/qt_winmanagerfilter.hpp @@ -33,6 +33,8 @@ #include #include +#include +#include #if QT_VERSION_MAJOR >= 6 #define result_t qintptr @@ -40,6 +42,10 @@ #define result_t long #endif +/* + * Filters native events for messages from VM-manager and + * window blocked events to notify about open modal dialogs. + */ class WindowsManagerFilter : public QObject, public QAbstractNativeEventFilter { Q_OBJECT @@ -53,6 +59,10 @@ signals: void showsettings(); void reset(); void shutdown(); + void dialogstatus(bool open); + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; }; #endif