qt(windows): don't process raw input events when in menu or other window

This commit is contained in:
ts-korhonen
2021-12-12 17:52:43 +02:00
parent 8878e44531
commit cc909078c1
3 changed files with 24 additions and 9 deletions

View File

@@ -107,7 +107,7 @@ int main(int argc, char* argv[]) {
app.installEventFilter(main_window); app.installEventFilter(main_window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
auto rawInputFilter = WindowsRawInputFilter::Register(); auto rawInputFilter = WindowsRawInputFilter::Register(main_window);
if (rawInputFilter) if (rawInputFilter)
{ {
app.installNativeEventFilter(rawInputFilter.get()); app.installNativeEventFilter(rawInputFilter.get());

View File

@@ -32,6 +32,8 @@
#include "qt_winrawinputfilter.hpp" #include "qt_winrawinputfilter.hpp"
#include <QMenuBar>
#include <Windows.h> #include <Windows.h>
#include <86box/keyboard.h> #include <86box/keyboard.h>
@@ -42,34 +44,44 @@
#include <array> #include <array>
#include <memory> #include <memory>
std::unique_ptr<WindowsRawInputFilter> WindowsRawInputFilter::Register() std::unique_ptr<WindowsRawInputFilter> WindowsRawInputFilter::Register(QMainWindow *window)
{ {
HWND wnd = (HWND)window->winId();
RAWINPUTDEVICE rid[2] = RAWINPUTDEVICE rid[2] =
{ {
{ {
.usUsagePage = 0x01, .usUsagePage = 0x01,
.usUsage = 0x06, .usUsage = 0x06,
.dwFlags = RIDEV_NOHOTKEYS, .dwFlags = RIDEV_NOHOTKEYS,
.hwndTarget = NULL .hwndTarget = wnd
}, },
{ {
.usUsagePage = 0x01, .usUsagePage = 0x01,
.usUsage = 0x02, .usUsage = 0x02,
.dwFlags = 0, .dwFlags = 0,
.hwndTarget = NULL .hwndTarget = wnd
} }
}; };
if (RegisterRawInputDevices(rid, 2, sizeof(rid[0])) == FALSE) if (RegisterRawInputDevices(rid, 2, sizeof(rid[0])) == FALSE)
return std::unique_ptr<WindowsRawInputFilter>(nullptr); return std::unique_ptr<WindowsRawInputFilter>(nullptr);
std::unique_ptr<WindowsRawInputFilter> inputfilter(new WindowsRawInputFilter()); std::unique_ptr<WindowsRawInputFilter> inputfilter(new WindowsRawInputFilter(window));
return inputfilter; return inputfilter;
} }
WindowsRawInputFilter::WindowsRawInputFilter() WindowsRawInputFilter::WindowsRawInputFilter(QMainWindow *window)
{ {
this->window = window;
for (auto menu : window->findChildren<QMenu*>())
{
connect(menu, &QMenu::aboutToShow, this, [=]() { menus_open++; });
connect(menu, &QMenu::aboutToHide, this, [=]() { menus_open--; });
}
for (size_t i = 0; i < sizeof(scancode_map) / sizeof(scancode_map[0]); i++) for (size_t i = 0; i < sizeof(scancode_map) / sizeof(scancode_map[0]); i++)
scancode_map[i] = i; scancode_map[i] = i;
@@ -105,7 +117,7 @@ bool WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void
if (msg->message == WM_INPUT) if (msg->message == WM_INPUT)
{ {
//if (infocus) /* TODO: Need way to tell if in menu or settings dialog */ if (window->isActiveWindow() && menus_open == 0)
handle_input((HRAWINPUT)msg->lParam); handle_input((HRAWINPUT)msg->lParam);
return true; return true;

View File

@@ -32,6 +32,7 @@
#define QT_WINDOWSRAWINPUTFILTER_HPP #define QT_WINDOWSRAWINPUTFILTER_HPP
#include <QObject> #include <QObject>
#include <QMainWindow>
#include <QAbstractNativeEventFilter> #include <QAbstractNativeEventFilter>
#include <QByteArray> #include <QByteArray>
@@ -44,7 +45,7 @@ class WindowsRawInputFilter : public QObject, public QAbstractNativeEventFilter
Q_OBJECT Q_OBJECT
public: public:
static std::unique_ptr<WindowsRawInputFilter> Register(); static std::unique_ptr<WindowsRawInputFilter> Register(QMainWindow *window);
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
@@ -54,13 +55,15 @@ public slots:
void mousePoll(); void mousePoll();
private: private:
QMainWindow *window;
uint16_t scancode_map[768]; uint16_t scancode_map[768];
int buttons = 0; int buttons = 0;
int dx = 0; int dx = 0;
int dy = 0; int dy = 0;
int dwheel = 0; int dwheel = 0;
int menus_open = 0;
WindowsRawInputFilter(); WindowsRawInputFilter(QMainWindow *window);
void handle_input(HRAWINPUT input); void handle_input(HRAWINPUT input);
void keyboard_handle(PRAWINPUT raw); void keyboard_handle(PRAWINPUT raw);