Merge pull request #3176 from ts-korhonen/multimonitor-rawinput

Accept raw input from non-primary monitor windows on Qt
This commit is contained in:
Miran Grča
2023-03-04 17:30:57 +01:00
committed by GitHub
2 changed files with 19 additions and 5 deletions

View File

@@ -45,9 +45,11 @@
#include <array> #include <array>
#include <memory> #include <memory>
#include "qt_rendererstack.hpp"
extern "C" void win_joystick_handle(PRAWINPUT); extern "C" void win_joystick_handle(PRAWINPUT);
std::unique_ptr<WindowsRawInputFilter> std::unique_ptr<WindowsRawInputFilter>
WindowsRawInputFilter::Register(QMainWindow *window) WindowsRawInputFilter::Register(MainWindow *window)
{ {
HWND wnd = (HWND) window->winId(); HWND wnd = (HWND) window->winId();
@@ -70,7 +72,7 @@ WindowsRawInputFilter::Register(QMainWindow *window)
return inputfilter; return inputfilter;
} }
WindowsRawInputFilter::WindowsRawInputFilter(QMainWindow *window) WindowsRawInputFilter::WindowsRawInputFilter(MainWindow *window)
{ {
this->window = window; this->window = window;
@@ -108,8 +110,18 @@ WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void *mess
MSG *msg = static_cast<MSG *>(message); MSG *msg = static_cast<MSG *>(message);
if (msg->message == WM_INPUT) { if (msg->message == WM_INPUT) {
if (window->isActiveWindow() && menus_open == 0) if (window->isActiveWindow() && menus_open == 0)
handle_input((HRAWINPUT) msg->lParam); handle_input((HRAWINPUT) msg->lParam);
else
{
for (auto &w : window->renderers) {
if (w && w->isActiveWindow()) {
handle_input((HRAWINPUT) msg->lParam);
break;
}
}
}
return true; return true;
} }

View File

@@ -41,6 +41,8 @@
#include <memory> #include <memory>
#include "qt_mainwindow.hpp"
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
# define result_t qintptr # define result_t qintptr
#else #else
@@ -51,7 +53,7 @@ class WindowsRawInputFilter : public QObject, public QAbstractNativeEventFilter
Q_OBJECT Q_OBJECT
public: public:
static std::unique_ptr<WindowsRawInputFilter> Register(QMainWindow *window); static std::unique_ptr<WindowsRawInputFilter> Register(MainWindow *window);
bool nativeEventFilter(const QByteArray &eventType, void *message, result_t *result) override; bool nativeEventFilter(const QByteArray &eventType, void *message, result_t *result) override;
@@ -61,7 +63,7 @@ public slots:
void mousePoll(); void mousePoll();
private: private:
QMainWindow *window; MainWindow *window;
uint16_t scancode_map[768]; uint16_t scancode_map[768];
int buttons = 0; int buttons = 0;
int dx = 0; int dx = 0;
@@ -69,7 +71,7 @@ private:
int dwheel = 0; int dwheel = 0;
int menus_open = 0; int menus_open = 0;
WindowsRawInputFilter(QMainWindow *window); WindowsRawInputFilter(MainWindow *window);
void handle_input(HRAWINPUT input); void handle_input(HRAWINPUT input);
void keyboard_handle(PRAWINPUT raw); void keyboard_handle(PRAWINPUT raw);