7#include <QSocketNotifier>
10#include <QGuiApplication>
11#include <qpa/qwindowsysteminterface.h>
12#include <private/qguiapplication_p.h>
13#include <private/qinputdevicemanager_p_p.h>
15#include <private/qcore_unix_p.h>
35 setObjectName(QLatin1String(
"BSD Sysmouse Handler"));
38 if (specification.startsWith(
"/dev/"))
39 device = QFile::encodeName(specification);
42 device = QByteArrayLiteral(
"/dev/sysmouse");
44 m_devFd = QT_OPEN(device.constData(), O_RDONLY);
46 qErrnoWarning(errno,
"open(%s) failed", device.constData());
51 if (ioctl(m_devFd, MOUSE_GETLEVEL, &level)) {
52 qErrnoWarning(errno,
"ioctl(%s, MOUSE_GETLEVEL) failed", device.constData());
62 case PsmLevelExtended:
66 qWarning(
"Unsupported mouse device operation level: %d", level);
72 if (fcntl(m_devFd, F_SETFL, O_NONBLOCK)) {
73 qErrnoWarning(errno,
"fcntl(%s, F_SETFL, O_NONBLOCK) failed", device.constData());
79 m_notifier.reset(
new QSocketNotifier(m_devFd, QSocketNotifier::Read,
this));
80 connect(m_notifier.data(), &QSocketNotifier::activated,
this, &QBsdMouseHandler::readMouseData);
81 QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount(
82 QInputDeviceManager::DeviceTypePointer, 1);
96 if (m_packetSize == 0)
100 qint8 packet[MOUSE_SYS_PACKETSIZE];
102 while (read(m_devFd, packet, m_packetSize) == m_packetSize) {
103 const qint16 relx = packet[1] + packet[3];
104 const qint16 rely = -(packet[2] + packet[4]);
109 status = packet[0] & MOUSE_SYS_STDBUTTONS;
113 const QRect g = QGuiApplication::primaryScreen()->virtualGeometry();
114 if (m_x + m_xOffset < g.left())
115 m_x = g.left() - m_xOffset;
116 else if (m_x + m_xOffset > g.right())
117 m_x = g.right() - m_xOffset;
119 if (m_y + m_yOffset < g.top())
120 m_y = g.top() - m_yOffset;
121 else if (m_y + m_yOffset > g.bottom())
122 m_y = g.bottom() - m_yOffset;
124 const QPoint pos(m_x + m_xOffset, m_y + m_yOffset);
125 m_buttons = Qt::NoButton;
126 if (!(status & MOUSE_SYS_BUTTON1UP))
127 m_buttons |= Qt::LeftButton;
128 if (!(status & MOUSE_SYS_BUTTON2UP))
129 m_buttons |= Qt::MiddleButton;
130 if (!(status & MOUSE_SYS_BUTTON3UP))
131 m_buttons |= Qt::RightButton;
133 QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons);
~QBsdMouseHandler() override