71 lines
2.2 KiB
C++
71 lines
2.2 KiB
C++
|
|
#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();
|
||
|
|
}
|
||
|
|
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
|
||
|
|
void CursorController::move(const QPoint &delta)
|
||
|
|
{
|
||
|
|
QRect desk = QGuiApplication::primaryScreen()->geometry();
|
||
|
|
m_pos += delta;
|
||
|
|
|
||
|
|
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);
|
||
|
|
}
|