mirror of
https://github.com/yuzu-mirror/yuzu
synced 2024-12-19 17:53:08 +00:00
bootmanager: Bypass input focus issues
This commit is contained in:
parent
bbb396d7f1
commit
9ebc27234d
4 changed files with 78 additions and 55 deletions
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue