Files
EJM_Display/PublicFunctions/CursorController.cpp

126 lines
3.9 KiB
C++
Raw Permalink Normal View History

2025-08-20 23:06:28 +08:00
#include "CursorController.h"
#include <QWidget>
#include <QCursor>
#include <QApplication>
#include <QScreen>
#include <QMouseEvent>
#include <QDebug>
CursorController::CursorController(QObject *parent)
: QObject(parent)
{
// 判断能否真正移动系统光标
m_useRealCursor = QGuiApplication::platformName() != "eglfs"
&& QGuiApplication::platformName() != "linuxfb"
&& QGuiApplication::platformName() != "minimal";
if (!m_useRealCursor)
m_pos = QGuiApplication::primaryScreen()->geometry().center();
else
m_pos = QCursor::pos();
2025-09-15 22:28:43 +08:00
m_holdTimer.setSingleShot(true);
connect(&m_holdTimer, &QTimer::timeout, this, [this] {
m_isLongPress = true;
m_curStep = cfg.step * 2; // 切到长步长
});
2025-08-20 23:06:28 +08:00
}
void CursorController::handleKey(int key)
{
QPoint delta;
switch (key) {
case Qt::Key_Up: delta = QPoint(0, -cfg.step); break;
case Qt::Key_Down: delta = QPoint(0, cfg.step); break;
case Qt::Key_Left: delta = QPoint(-cfg.step, 0); break;
case Qt::Key_Right: delta = QPoint( cfg.step, 0); break;
case Qt::Key_Return:
case Qt::Key_Space:
if (cfg.emulate) emulateClick();
return;
default: return;
}
move(delta);
}
2025-09-15 22:28:43 +08:00
void CursorController::handleKey(int key, bool pressed)
{
static QSet<int> pressedKeys; // 记录当前按住的键
switch (key) {
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Left:
case Qt::Key_Right: {
QPoint dir;
switch (key) {
case Qt::Key_Up: dir = QPoint(0, -1); break;
case Qt::Key_Down: dir = QPoint(0, 1); break;
case Qt::Key_Left: dir = QPoint(-1, 0); break;
case Qt::Key_Right: dir = QPoint( 1, 0); break;
}
if (pressed) {
/* ---------- 键按下(含自动重复) ---------- */
if (!pressedKeys.contains(key)) {
// 第一次按下
pressedKeys.insert(key);
m_isLongPress = false;
m_curStep = cfg.step; // 短按步长
m_holdTimer.start(100); // 1 秒后切成长按
}
/* 每次按下(含自动重复)都移动 */
int step = m_isLongPress ? cfg.step * 2 : cfg.step;
move(dir * step);
} else {
/* ---------- 键释放 ---------- */
pressedKeys.remove(key);
m_holdTimer.stop();
m_isLongPress = false;
}
return;
}
case Qt::Key_Return:
case Qt::Key_Space:
if (pressed && cfg.emulate) emulateClick();
return;
default:
return;
}
}
2025-08-20 23:06:28 +08:00
void CursorController::move(const QPoint &delta)
{
QRect desk = QGuiApplication::primaryScreen()->geometry();
2025-09-15 22:28:43 +08:00
//m_pos += delta;
m_pos += delta * m_curStep; // 用 m_curStep 而不是 cfg.step
2025-08-20 23:06:28 +08:00
if (cfg.wrap) {
m_pos.setX(((m_pos.x() - desk.left()) % desk.width() + desk.width()) % desk.width() + desk.left());
m_pos.setY(((m_pos.y() - desk.top()) % desk.height() + desk.height()) % desk.height() + desk.top());
} else {
m_pos.setX(qBound(desk.left() + cfg.edgeGap, m_pos.x(), desk.right() - cfg.edgeGap));
m_pos.setY(qBound(desk.top() + cfg.edgeGap, m_pos.y(), desk.bottom() - cfg.edgeGap));
}
if (m_useRealCursor)
QCursor::setPos(m_pos);
emit cursorMoved(m_pos);
}
void CursorController::emulateClick()
{
QWidget *w = QApplication::widgetAt(m_pos);
if (w) {
QPoint local = w->mapFromGlobal(m_pos);
QMouseEvent press (QEvent::MouseButtonPress, local, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QMouseEvent release(QEvent::MouseButtonRelease, local, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QApplication::sendEvent(w, &press);
QApplication::sendEvent(w, &release);
}
emit clicked(w);
}