28std::unique_ptr<QVxMouseHandler>
QVxMouseHandler::create(
const QString &device,
const QString &specification)
30 qCDebug(qLcVxMouse) <<
"create mouse handler for" << device << specification;
32 bool compression =
true;
37 const auto args = QStringView{specification}.split(u':');
38 for (
const auto &arg : args) {
39 if (arg ==
"nocompress"_L1)
41 else if (arg.startsWith(
"dejitter="_L1))
42 jitterLimit = arg.mid(9).toInt();
43 else if (arg.startsWith(
"grab="_L1))
44 grab = arg.mid(5).toInt();
47 int fd = qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NONBLOCK, 0);
49 return std::unique_ptr<QVxMouseHandler>(
new QVxMouseHandler(device, fd, compression, jitterLimit));
51 qCWarning(qLcVxMouse) <<
"Cannot open mouse input device" << qPrintable(device) <<
":" << strerror(errno);
88 emit handleMouseEvent(x, y, m_buttons, Qt::NoButton, m_eventType);
90 emit handleMouseEvent(x, y, m_buttons, m_button, m_eventType);
98 EV_DEV_EVENT buffer[32];
100 bool posChanged =
false, btnChanged =
false;
101 bool pendingMouseEvent =
false;
103 int result = QT_READ(m_fd,
reinterpret_cast<
char *>(buffer) + n,
sizeof(buffer) - n);
106 qCWarning(qLcVxMouse)<<
"evdevmouse: Got EOF from the input device";
108 }
else if (result < 0) {
109 if (errno != EINTR && errno != EAGAIN) {
110 qCWarning(qLcVxMouse)<<
"evdevmouse: Could not read from input device"<<errno;
113 if (errno == ENODEV) {
123 if (n %
sizeof(buffer[0]) == 0)
128 n /=
sizeof(buffer[0]);
130 for (
int i = 0; i < n; ++i) {
131 EV_DEV_EVENT *data = &buffer[i];
132 if (data->type == EV_DEV_REL) {
133 if (data->code == EV_DEV_PTR_REL_X) {
136 }
else if (data->code == EV_DEV_PTR_REL_Y) {
140 }
else if (data->type == EV_DEV_KEY && data->code >= EV_DEV_PTR_BTN_LEFT) {
141 Qt::MouseButton button = Qt::NoButton;
144 switch (data->code) {
145 case 0x110: button = Qt::LeftButton;
break;
146 case 0x111: button = Qt::RightButton;
break;
147 case 0x112: button = Qt::MiddleButton;
break;
148 case 0x113: button = Qt::ExtraButton1;
break;
149 case 0x114: button = Qt::ExtraButton2;
break;
150 case 0x115: button = Qt::ExtraButton3;
break;
151 case 0x116: button = Qt::ExtraButton4;
break;
152 case 0x117: button = Qt::ExtraButton5;
break;
153 case 0x118: button = Qt::ExtraButton6;
break;
154 case 0x119: button = Qt::ExtraButton7;
break;
155 case 0x11a: button = Qt::ExtraButton8;
break;
156 case 0x11b: button = Qt::ExtraButton9;
break;
157 case 0x11c: button = Qt::ExtraButton10;
break;
158 case 0x11d: button = Qt::ExtraButton11;
break;
159 case 0x11e: button = Qt::ExtraButton12;
break;
160 case 0x11f: button = Qt::ExtraButton13;
break;
162 m_buttons.setFlag(button, data->value);
164 m_eventType = data->value == 0 ? QEvent::MouseButtonRelease : QEvent::MouseButtonPress;
166 }
else if (data->type == EV_DEV_SYN) {
168 btnChanged = posChanged =
false;
170 pendingMouseEvent =
false;
171 }
else if (posChanged) {
172 m_eventType = QEvent::MouseMove;
175 pendingMouseEvent =
true;
182 if (m_compression && pendingMouseEvent) {
183 int distanceSquared = (m_x - m_prevx)*(m_x - m_prevx) + (m_y - m_prevy)*(m_y - m_prevy);
184 if (distanceSquared > m_jitterLimitSquared)