diff --git a/src/duckstation-qt/qtdisplaywidget.cpp b/src/duckstation-qt/qtdisplaywidget.cpp index c02a39172..1899f055b 100644 --- a/src/duckstation-qt/qtdisplaywidget.cpp +++ b/src/duckstation-qt/qtdisplaywidget.cpp @@ -177,6 +177,13 @@ bool QtDisplayWidget::event(QEvent* event) return true; } + case QEvent::Wheel: + { + const QWheelEvent* wheel_event = static_cast(event); + emit windowMouseWheelEvent(wheel_event->angleDelta()); + return true; + } + case QEvent::Resize: { QWidget::event(event); diff --git a/src/duckstation-qt/qtdisplaywidget.h b/src/duckstation-qt/qtdisplaywidget.h index 9056c803b..840058053 100644 --- a/src/duckstation-qt/qtdisplaywidget.h +++ b/src/duckstation-qt/qtdisplaywidget.h @@ -30,6 +30,7 @@ Q_SIGNALS: void windowKeyEvent(int key_code, bool pressed); void windowMouseMoveEvent(int x, int y); void windowMouseButtonEvent(int button, bool pressed); + void windowMouseWheelEvent(const QPoint& angle_delta); protected: bool event(QEvent* event) override; diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index 892794073..a9cc2e822 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -413,7 +413,35 @@ void QtHostInterface::onDisplayWindowMouseButtonEvent(int button, bool pressed) HandleHostMouseEvent(button, pressed); } -void QtHostInterface::onHostDisplayWindowResized(int width, int height) +void QtHostInterface::onDisplayWindowMouseWheelEvent(const QPoint& delta_angle) +{ + DebugAssert(isOnWorkerThread()); + + if (ImGui::GetCurrentContext()) + { + ImGuiIO& io = ImGui::GetIO(); + + if (delta_angle.x() > 0) + io.MouseWheelH += 1.0f; + else if (delta_angle.x() < 0) + io.MouseWheelH -= 1.0f; + + if (delta_angle.y() > 0) + io.MouseWheel += 1.0f; + else if (delta_angle.y() < 0) + io.MouseWheel -= 1.0f; + + if (io.WantCaptureMouse) + { + // don't consume input events if it's hitting the UI instead + return; + } + } + + // HandleHostMouseWheelEvent(delta_angle.x(), delta_angle.y()); +} + +void QtHostInterface::onDisplayWindowResized(int width, int height) { Log_WarningPrintf("resize %dx%d", width, height); // this can be null if it was destroyed and the main thread is late catching up @@ -441,7 +469,7 @@ void QtHostInterface::onHostDisplayWindowResized(int width, int height) } } -void QtHostInterface::onHostDisplayWindowFocused() +void QtHostInterface::onDisplayWindowFocused() { if (!m_display || !m_lost_exclusive_fullscreen) return; @@ -539,14 +567,15 @@ void QtHostInterface::connectDisplaySignals(QtDisplayWidget* widget) { widget->disconnect(this); - connect(widget, &QtDisplayWidget::windowFocusEvent, this, &QtHostInterface::onHostDisplayWindowFocused); - connect(widget, &QtDisplayWidget::windowResizedEvent, this, &QtHostInterface::onHostDisplayWindowResized); + connect(widget, &QtDisplayWidget::windowFocusEvent, this, &QtHostInterface::onDisplayWindowFocused); + connect(widget, &QtDisplayWidget::windowResizedEvent, this, &QtHostInterface::onDisplayWindowResized); connect(widget, &QtDisplayWidget::windowRestoredEvent, this, &QtHostInterface::redrawDisplayWindow); connect(widget, &QtDisplayWidget::windowClosedEvent, this, &QtHostInterface::powerOffSystem, Qt::BlockingQueuedConnection); connect(widget, &QtDisplayWidget::windowKeyEvent, this, &QtHostInterface::onDisplayWindowKeyEvent); connect(widget, &QtDisplayWidget::windowMouseMoveEvent, this, &QtHostInterface::onDisplayWindowMouseMoveEvent); connect(widget, &QtDisplayWidget::windowMouseButtonEvent, this, &QtHostInterface::onDisplayWindowMouseButtonEvent); + connect(widget, &QtDisplayWidget::windowMouseWheelEvent, this, &QtHostInterface::onDisplayWindowMouseWheelEvent); } void QtHostInterface::updateDisplayState() diff --git a/src/duckstation-qt/qthostinterface.h b/src/duckstation-qt/qthostinterface.h index 5d3b9705a..9b757f207 100644 --- a/src/duckstation-qt/qthostinterface.h +++ b/src/duckstation-qt/qthostinterface.h @@ -143,9 +143,6 @@ public Q_SLOTS: void applySettings(bool display_osd_messages = false); void updateInputMap(); void applyInputProfile(const QString& profile_path); - void onDisplayWindowKeyEvent(int key, bool pressed); - void onDisplayWindowMouseMoveEvent(int x, int y); - void onDisplayWindowMouseButtonEvent(int button, bool pressed); void bootSystem(std::shared_ptr params); void resumeSystemFromState(const QString& filename, bool boot_on_failure); void resumeSystemFromMostRecentState(); @@ -179,8 +176,12 @@ public Q_SLOTS: private Q_SLOTS: void doStopThread(); - void onHostDisplayWindowResized(int width, int height); - void onHostDisplayWindowFocused(); + void onDisplayWindowMouseMoveEvent(int x, int y); + void onDisplayWindowMouseButtonEvent(int button, bool pressed); + void onDisplayWindowMouseWheelEvent(const QPoint& delta_angle); + void onDisplayWindowResized(int width, int height); + void onDisplayWindowFocused(); + void onDisplayWindowKeyEvent(int key, bool pressed); void doBackgroundControllerPoll(); void doSaveSettings();