bootmanager: Bypass input focus issues
This commit is contained in:
		| @@ -122,9 +122,51 @@ public: | |||||||
|         parent->OnFramebufferSizeChanged(); |         parent->OnFramebufferSizeChanged(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void keyPressEvent(QKeyEvent* event) override { | ||||||
|  |         InputCommon::GetKeyboard()->PressKey(event->key()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void keyReleaseEvent(QKeyEvent* event) override { | ||||||
|  |         InputCommon::GetKeyboard()->ReleaseKey(event->key()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void mousePressEvent(QMouseEvent* event) override { | ||||||
|  |         if (event->source() == Qt::MouseEventSynthesizedBySystem) | ||||||
|  |             return; // touch input is handled in TouchBeginEvent | ||||||
|  |  | ||||||
|  |         const auto pos{event->pos()}; | ||||||
|  |         if (event->button() == Qt::LeftButton) { | ||||||
|  |             const auto [x, y] = parent->ScaleTouch(pos); | ||||||
|  |             parent->TouchPressed(x, y); | ||||||
|  |         } else if (event->button() == Qt::RightButton) { | ||||||
|  |             InputCommon::GetMotionEmu()->BeginTilt(pos.x(), pos.y()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void mouseMoveEvent(QMouseEvent* event) override { | ||||||
|  |         if (event->source() == Qt::MouseEventSynthesizedBySystem) | ||||||
|  |             return; // touch input is handled in TouchUpdateEvent | ||||||
|  |  | ||||||
|  |         const auto pos{event->pos()}; | ||||||
|  |         const auto [x, y] = parent->ScaleTouch(pos); | ||||||
|  |         parent->TouchMoved(x, y); | ||||||
|  |         InputCommon::GetMotionEmu()->Tilt(pos.x(), pos.y()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void mouseReleaseEvent(QMouseEvent* event) override { | ||||||
|  |         if (event->source() == Qt::MouseEventSynthesizedBySystem) | ||||||
|  |             return; // touch input is handled in TouchEndEvent | ||||||
|  |  | ||||||
|  |         if (event->button() == Qt::LeftButton) | ||||||
|  |             parent->TouchReleased(); | ||||||
|  |         else if (event->button() == Qt::RightButton) | ||||||
|  |             InputCommon::GetMotionEmu()->EndTilt(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void DisablePainting() { |     void DisablePainting() { | ||||||
|         do_painting = false; |         do_painting = false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void EnablePainting() { |     void EnablePainting() { | ||||||
|         do_painting = true; |         do_painting = true; | ||||||
|     } |     } | ||||||
| @@ -196,12 +238,24 @@ void GRenderWindow::PollEvents() {} | |||||||
| void GRenderWindow::OnFramebufferSizeChanged() { | void GRenderWindow::OnFramebufferSizeChanged() { | ||||||
|     // Screen changes potentially incur a change in screen DPI, hence we should update the |     // Screen changes potentially incur a change in screen DPI, hence we should update the | ||||||
|     // framebuffer size |     // framebuffer size | ||||||
|     qreal pixelRatio = windowPixelRatio(); |     qreal pixelRatio = GetWindowPixelRatio(); | ||||||
|     unsigned width = child->QPaintDevice::width() * pixelRatio; |     unsigned width = child->QPaintDevice::width() * pixelRatio; | ||||||
|     unsigned height = child->QPaintDevice::height() * pixelRatio; |     unsigned height = child->QPaintDevice::height() * pixelRatio; | ||||||
|     UpdateCurrentFramebufferLayout(width, height); |     UpdateCurrentFramebufferLayout(width, height); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void GRenderWindow::ForwardKeyPressEvent(QKeyEvent* event) { | ||||||
|  |     if (child) { | ||||||
|  |         child->keyPressEvent(event); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void GRenderWindow::ForwardKeyReleaseEvent(QKeyEvent* event) { | ||||||
|  |     if (child) { | ||||||
|  |         child->keyReleaseEvent(event); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void GRenderWindow::BackupGeometry() { | void GRenderWindow::BackupGeometry() { | ||||||
|     geometry = ((QWidget*)this)->saveGeometry(); |     geometry = ((QWidget*)this)->saveGeometry(); | ||||||
| } | } | ||||||
| @@ -226,13 +280,13 @@ QByteArray GRenderWindow::saveGeometry() { | |||||||
|         return geometry; |         return geometry; | ||||||
| } | } | ||||||
|  |  | ||||||
| qreal GRenderWindow::windowPixelRatio() const { | qreal GRenderWindow::GetWindowPixelRatio() const { | ||||||
|     // windowHandle() might not be accessible until the window is displayed to screen. |     // windowHandle() might not be accessible until the window is displayed to screen. | ||||||
|     return windowHandle() ? windowHandle()->screen()->devicePixelRatio() : 1.0f; |     return windowHandle() ? windowHandle()->screen()->devicePixelRatio() : 1.0f; | ||||||
| } | } | ||||||
|  |  | ||||||
| std::pair<unsigned, unsigned> GRenderWindow::ScaleTouch(const QPointF pos) const { | std::pair<unsigned, unsigned> GRenderWindow::ScaleTouch(const QPointF pos) const { | ||||||
|     const qreal pixel_ratio = windowPixelRatio(); |     const qreal pixel_ratio = GetWindowPixelRatio(); | ||||||
|     return {static_cast<unsigned>(std::max(std::round(pos.x() * pixel_ratio), qreal{0.0})), |     return {static_cast<unsigned>(std::max(std::round(pos.x() * pixel_ratio), qreal{0.0})), | ||||||
|             static_cast<unsigned>(std::max(std::round(pos.y() * pixel_ratio), qreal{0.0}))}; |             static_cast<unsigned>(std::max(std::round(pos.y() * pixel_ratio), qreal{0.0}))}; | ||||||
| } | } | ||||||
| @@ -242,47 +296,6 @@ void GRenderWindow::closeEvent(QCloseEvent* event) { | |||||||
|     QWidget::closeEvent(event); |     QWidget::closeEvent(event); | ||||||
| } | } | ||||||
|  |  | ||||||
| void GRenderWindow::keyPressEvent(QKeyEvent* event) { |  | ||||||
|     InputCommon::GetKeyboard()->PressKey(event->key()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void GRenderWindow::keyReleaseEvent(QKeyEvent* event) { |  | ||||||
|     InputCommon::GetKeyboard()->ReleaseKey(event->key()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void GRenderWindow::mousePressEvent(QMouseEvent* event) { |  | ||||||
|     if (event->source() == Qt::MouseEventSynthesizedBySystem) |  | ||||||
|         return; // touch input is handled in TouchBeginEvent |  | ||||||
|  |  | ||||||
|     auto pos = event->pos(); |  | ||||||
|     if (event->button() == Qt::LeftButton) { |  | ||||||
|         const auto [x, y] = ScaleTouch(pos); |  | ||||||
|         this->TouchPressed(x, y); |  | ||||||
|     } else if (event->button() == Qt::RightButton) { |  | ||||||
|         InputCommon::GetMotionEmu()->BeginTilt(pos.x(), pos.y()); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void GRenderWindow::mouseMoveEvent(QMouseEvent* event) { |  | ||||||
|     if (event->source() == Qt::MouseEventSynthesizedBySystem) |  | ||||||
|         return; // touch input is handled in TouchUpdateEvent |  | ||||||
|  |  | ||||||
|     auto pos = event->pos(); |  | ||||||
|     const auto [x, y] = ScaleTouch(pos); |  | ||||||
|     this->TouchMoved(x, y); |  | ||||||
|     InputCommon::GetMotionEmu()->Tilt(pos.x(), pos.y()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) { |  | ||||||
|     if (event->source() == Qt::MouseEventSynthesizedBySystem) |  | ||||||
|         return; // touch input is handled in TouchEndEvent |  | ||||||
|  |  | ||||||
|     if (event->button() == Qt::LeftButton) |  | ||||||
|         this->TouchReleased(); |  | ||||||
|     else if (event->button() == Qt::RightButton) |  | ||||||
|         InputCommon::GetMotionEmu()->EndTilt(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void GRenderWindow::TouchBeginEvent(const QTouchEvent* event) { | void GRenderWindow::TouchBeginEvent(const QTouchEvent* event) { | ||||||
|     // TouchBegin always has exactly one touch point, so take the .first() |     // TouchBegin always has exactly one touch point, so take the .first() | ||||||
|     const auto [x, y] = ScaleTouch(event->touchPoints().first().pos()); |     const auto [x, y] = ScaleTouch(event->touchPoints().first().pos()); | ||||||
|   | |||||||
| @@ -119,24 +119,19 @@ public: | |||||||
|     void PollEvents() override; |     void PollEvents() override; | ||||||
|     std::unique_ptr<Core::Frontend::GraphicsContext> CreateSharedContext() const override; |     std::unique_ptr<Core::Frontend::GraphicsContext> CreateSharedContext() const override; | ||||||
|  |  | ||||||
|  |     void ForwardKeyPressEvent(QKeyEvent* event); | ||||||
|  |     void ForwardKeyReleaseEvent(QKeyEvent* event); | ||||||
|  |  | ||||||
|     void BackupGeometry(); |     void BackupGeometry(); | ||||||
|     void RestoreGeometry(); |     void RestoreGeometry(); | ||||||
|     void restoreGeometry(const QByteArray& geometry); // overridden |     void restoreGeometry(const QByteArray& geometry); // overridden | ||||||
|     QByteArray saveGeometry();                        // overridden |     QByteArray saveGeometry();                        // overridden | ||||||
|  |  | ||||||
|     qreal windowPixelRatio() const; |     qreal GetWindowPixelRatio() const; | ||||||
|  |     std::pair<unsigned, unsigned> ScaleTouch(const QPointF pos) const; | ||||||
|  |  | ||||||
|     void closeEvent(QCloseEvent* event) override; |     void closeEvent(QCloseEvent* event) override; | ||||||
|  |  | ||||||
|     void keyPressEvent(QKeyEvent* event) override; |  | ||||||
|     void keyReleaseEvent(QKeyEvent* event) override; |  | ||||||
|  |  | ||||||
|     void mousePressEvent(QMouseEvent* event) override; |  | ||||||
|     void mouseMoveEvent(QMouseEvent* event) override; |  | ||||||
|     void mouseReleaseEvent(QMouseEvent* event) override; |  | ||||||
|  |  | ||||||
|     bool event(QEvent* event) override; |     bool event(QEvent* event) override; | ||||||
|  |  | ||||||
|     void focusOutEvent(QFocusEvent* event) override; |     void focusOutEvent(QFocusEvent* event) override; | ||||||
|  |  | ||||||
|     void OnClientAreaResized(unsigned width, unsigned height); |     void OnClientAreaResized(unsigned width, unsigned height); | ||||||
| @@ -158,7 +153,6 @@ signals: | |||||||
|     void FirstFrameDisplayed(); |     void FirstFrameDisplayed(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     std::pair<unsigned, unsigned> ScaleTouch(const QPointF pos) const; |  | ||||||
|     void TouchBeginEvent(const QTouchEvent* event); |     void TouchBeginEvent(const QTouchEvent* event); | ||||||
|     void TouchUpdateEvent(const QTouchEvent* event); |     void TouchUpdateEvent(const QTouchEvent* event); | ||||||
|     void TouchEndEvent(); |     void TouchEndEvent(); | ||||||
|   | |||||||
| @@ -1965,6 +1965,18 @@ void GMainWindow::dragMoveEvent(QDragMoveEvent* event) { | |||||||
|     event->acceptProposedAction(); |     event->acceptProposedAction(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void GMainWindow::keyPressEvent(QKeyEvent* event) { | ||||||
|  |     if (render_window) { | ||||||
|  |         render_window->ForwardKeyPressEvent(event); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void GMainWindow::keyReleaseEvent(QKeyEvent* event) { | ||||||
|  |     if (render_window) { | ||||||
|  |         render_window->ForwardKeyReleaseEvent(event); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| bool GMainWindow::ConfirmChangeGame() { | bool GMainWindow::ConfirmChangeGame() { | ||||||
|     if (emu_thread == nullptr) |     if (emu_thread == nullptr) | ||||||
|         return true; |         return true; | ||||||
|   | |||||||
| @@ -251,4 +251,8 @@ protected: | |||||||
|     void dropEvent(QDropEvent* event) override; |     void dropEvent(QDropEvent* event) override; | ||||||
|     void dragEnterEvent(QDragEnterEvent* event) override; |     void dragEnterEvent(QDragEnterEvent* event) override; | ||||||
|     void dragMoveEvent(QDragMoveEvent* event) override; |     void dragMoveEvent(QDragMoveEvent* event) override; | ||||||
|  |  | ||||||
|  |     // Overrides used to forward signals to the render window when the focus moves out. | ||||||
|  |     void keyPressEvent(QKeyEvent* event) override; | ||||||
|  |     void keyReleaseEvent(QKeyEvent* event) override; | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
					ReinUsesLisp