From 38912859e157e8db19ab2927021cef61c4005695 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 2 Oct 2020 20:31:47 -0400 Subject: [PATCH] Adds F8+F12 as an alternative mouse-release combo for Qt. --- OSBindings/Qt/mainwindow.cpp | 2 +- OSBindings/Qt/scantargetwidget.cpp | 23 ++++++++++++++++++----- OSBindings/Qt/scantargetwidget.h | 2 ++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/OSBindings/Qt/mainwindow.cpp b/OSBindings/Qt/mainwindow.cpp index 2d0882f27..1f23266ff 100644 --- a/OSBindings/Qt/mainwindow.cpp +++ b/OSBindings/Qt/mainwindow.cpp @@ -812,7 +812,7 @@ void MainWindow::setWindowTitle() { break; } - if(mouseIsCaptured) title += " (press control+escape to release mouse)"; + if(mouseIsCaptured) title += " (press control+escape or F8+F12 to release mouse)"; QMainWindow::setWindowTitle(title); } diff --git a/OSBindings/Qt/scantargetwidget.cpp b/OSBindings/Qt/scantargetwidget.cpp index 3fbbc7c53..bdb71e62b 100644 --- a/OSBindings/Qt/scantargetwidget.cpp +++ b/OSBindings/Qt/scantargetwidget.cpp @@ -142,12 +142,25 @@ void ScanTargetWidget::setMouseDelegate(MouseDelegate *delegate) { setMouseTracking(delegate); } +void ScanTargetWidget::keyReleaseEvent(QKeyEvent *event) { + // Releasing F8 or F12 needs to be tracked but doesn't actively do anything, + // so I'm counting that as a Qt ignore. + if(event->key() == Qt::Key_F8) f8State = false; + if(event->key() == Qt::Key_F12) f12State = false; + event->ignore(); +} + void ScanTargetWidget::keyPressEvent(QKeyEvent *event) { - // Use CTRL+Escape to end mouse captured mode, if currently captured; otherwise ignore the event. - // Empirical note: control actually appears to mean command on the Mac. I have no idea what the - // Mac's command key would actually be as a modifier. Fingers crossed control means control - // elsewhere (?). - if(mouseIsCaptured && event->key() == Qt::Key_Escape && event->modifiers()&Qt::ControlModifier) { + // Use either CTRL+Escape or F8+F12 to end mouse captured mode, if currently captured; + // otherwise ignore the event. + + if(event->key() == Qt::Key_F8) f8State = true; + if(event->key() == Qt::Key_F12) f12State = true; + + if(mouseIsCaptured && ( + (event->key() == Qt::Key_Escape && event->modifiers()&Qt::ControlModifier) || + (f8State && f12State) + )) { releaseMouse(); QCursor cursor; diff --git a/OSBindings/Qt/scantargetwidget.h b/OSBindings/Qt/scantargetwidget.h index 85edf8ada..805692fd4 100644 --- a/OSBindings/Qt/scantargetwidget.h +++ b/OSBindings/Qt/scantargetwidget.h @@ -42,6 +42,7 @@ class ScanTargetWidget : public QOpenGLWidget { void mouseReleaseEvent(QMouseEvent *) override; void mouseMoveEvent(QMouseEvent *) override; void keyPressEvent(QKeyEvent *) override; + void keyReleaseEvent(QKeyEvent *) override; void releaseMouse(); void setMouseButtonPressed(Qt::MouseButton, bool); @@ -66,6 +67,7 @@ class ScanTargetWidget : public QOpenGLWidget { MouseDelegate *mouseDelegate = nullptr; bool mouseIsCaptured = false; + bool f8State = false, f12State = false; // To support F8+F12 as a mouse release combination. private slots: void vsync();