qevdevtablet.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/platformsupport/input/evdevtablet/qevdevtablet.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4const QLoggingCategory &qLcEvdevTablet() { static const QLoggingCategory category("qt.qpa.input"); return
never executed: return category;
category;
never executed: return category;
}
0
5-
6class QEvdevTabletData-
7{-
8public:-
9 QEvdevTabletData(QEvdevTabletHandler *q_ptr);-
10 bool queryLimits();-
11 void testGrab();-
12 void processInputEvent(input_event *ev);-
13 void reportProximityEnter();-
14 void reportProximityLeave();-
15 void report();-
16-
17 QEvdevTabletHandler *q;-
18 QSocketNotifier *notifier;-
19 int fd;-
20 int lastEventType;-
21 QString devName;-
22 struct {-
23 int x, y, p, d;-
24 } minValues, maxValues;-
25 struct {-
26 int x, y, p, d;-
27 bool down, lastReportDown;-
28 int tool, lastReportTool;-
29 QPointF lastReportPos;-
30 } state;-
31};-
32-
33QEvdevTabletData::QEvdevTabletData(QEvdevTabletHandler *q_ptr)-
34 : q(q_ptr), notifier(0), fd(-1), lastEventType(0)-
35{-
36 memset(&minValues, 0, sizeof(minValues));-
37 memset(&maxValues, 0, sizeof(maxValues));-
38 memset(&state, 0, sizeof(state));-
39}
never executed: end of block
0
40-
41bool QEvdevTabletData::queryLimits()-
42{-
43 bool ok = true;-
44 input_absinfo absInfo;-
45 memset(&absInfo, 0, sizeof(input_absinfo));-
46 ok &= ioctl(fd, (((2U) << (((0 +8)+8)+14)) | ((('E')) << (0 +8)) | (((0x40 + (0x00))) << 0) | ((((sizeof(struct input_absinfo)))) << ((0 +8)+8))), &absInfo) >= 0;-
47 if (ok
okDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
48 minValues.x = absInfo.minimum;-
49 maxValues.x = absInfo.maximum;-
50 for (bool qt_category_enabled = qLcEvdevTablet().isDebugEnabled(); qt_category_enabled
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
; qt_category_enabled = false) QMessageLogger(__FILE__, 92, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min X: %d max X: %d", minValues.x, maxValues.x);
never executed: QMessageLogger(__FILE__, 92, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min X: %d max X: %d", minValues.x, maxValues.x);
0
51 }
never executed: end of block
0
52 ok &= ioctl(fd, (((2U) << (((0 +8)+8)+14)) | ((('E')) << (0 +8)) | (((0x40 + (0x01))) << 0) | ((((sizeof(struct input_absinfo)))) << ((0 +8)+8))), &absInfo) >= 0;-
53 if (ok
okDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
54 minValues.y = absInfo.minimum;-
55 maxValues.y = absInfo.maximum;-
56 for (bool qt_category_enabled = qLcEvdevTablet().isDebugEnabled(); qt_category_enabled
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
; qt_category_enabled = false) QMessageLogger(__FILE__, 98, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min Y: %d max Y: %d", minValues.y, maxValues.y);
never executed: QMessageLogger(__FILE__, 98, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min Y: %d max Y: %d", minValues.y, maxValues.y);
0
57 }
never executed: end of block
0
58 if (ioctl(fd, (((2U) << (((0 +8)+8)+14)) | ((('E')) << (0 +8)) | (((0x40 + (0x18))) << 0) | ((((sizeof(struct input_absinfo)))) << ((0 +8)+8))), &absInfo) >= 0
ioctl(fd, (((2...&absInfo) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
59 minValues.p = absInfo.minimum;-
60 maxValues.p = absInfo.maximum;-
61 for (bool qt_category_enabled = qLcEvdevTablet().isDebugEnabled(); qt_category_enabled
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
; qt_category_enabled = false) QMessageLogger(__FILE__, 103, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min pressure: %d max pressure: %d", minValues.p, maxValues.p);
never executed: QMessageLogger(__FILE__, 103, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min pressure: %d max pressure: %d", minValues.p, maxValues.p);
0
62 }
never executed: end of block
0
63 if (ioctl(fd, (((2U) << (((0 +8)+8)+14)) | ((('E')) << (0 +8)) | (((0x40 + (0x19))) << 0) | ((((sizeof(struct input_absinfo)))) << ((0 +8)+8))), &absInfo) >= 0
ioctl(fd, (((2...&absInfo) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
64 minValues.d = absInfo.minimum;-
65 maxValues.d = absInfo.maximum;-
66 for (bool qt_category_enabled = qLcEvdevTablet().isDebugEnabled(); qt_category_enabled
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
; qt_category_enabled = false) QMessageLogger(__FILE__, 108, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min distance: %d max distance: %d", minValues.d, maxValues.d);
never executed: QMessageLogger(__FILE__, 108, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: min distance: %d max distance: %d", minValues.d, maxValues.d);
0
67 }
never executed: end of block
0
68 char name[128];-
69 if (ioctl(fd, (((2U) << (((0 +8)+8)+14)) | (('E') << (0 +8)) | ((0x06) << 0) | ((sizeof(name) - 1) << ((0 +8)+8))), name) >= 0
ioctl(fd, (((2...)), name) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
70 devName = QString::fromLocal8Bit(name);-
71 for (bool qt_category_enabled = qLcEvdevTablet().isDebugEnabled(); qt_category_enabled
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
; qt_category_enabled = false) QMessageLogger(__FILE__, 113, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: device name: %s", name);
never executed: QMessageLogger(__FILE__, 113, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: device name: %s", name);
0
72 }
never executed: end of block
0
73 return
never executed: return ok;
ok;
never executed: return ok;
0
74}-
75-
76void QEvdevTabletData::testGrab()-
77{-
78 bool grabSuccess = !ioctl(fd, (((1U) << (((0 +8)+8)+14)) | ((('E')) << (0 +8)) | (((0x90)) << 0) | ((((sizeof(int)))) << ((0 +8)+8))), (void *) 1);-
79 if (grabSuccess
grabSuccessDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
80 ioctl(fd, (((1U) << (((0 +8)+8)+14)) | ((('E')) << (0 +8)) | (((0x90)) << 0) | ((((sizeof(int)))) << ((0 +8)+8))), (void *) 0);
never executed: ioctl(fd, (((1U) << (((0 +8)+8)+14)) | ((('E')) << (0 +8)) | (((0x90)) << 0) | ((((sizeof(int)))) << ((0 +8)+8))), (void *) 0);
0
81 else-
82 QMessageLogger(__FILE__, 124, __PRETTY_FUNCTION__).warning("evdevtablet: ERROR: The device is grabbed by another process. No events will be read.");
never executed: QMessageLogger(__FILE__, 124, __PRETTY_FUNCTION__).warning("evdevtablet: ERROR: The device is grabbed by another process. No events will be read.");
0
83}-
84-
85void QEvdevTabletData::processInputEvent(input_event *ev)-
86{-
87 if (ev->type == 0x03
ev->type == 0x03Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
88 switch (ev->code) {-
89 case
never executed: case 0x00:
0x00:
never executed: case 0x00:
0
90 state.x = ev->value;-
91 break;
never executed: break;
0
92 case
never executed: case 0x01:
0x01:
never executed: case 0x01:
0
93 state.y = ev->value;-
94 break;
never executed: break;
0
95 case
never executed: case 0x18:
0x18:
never executed: case 0x18:
0
96 state.p = ev->value;-
97 break;
never executed: break;
0
98 case
never executed: case 0x19:
0x19:
never executed: case 0x19:
0
99 state.d = ev->value;-
100 break;
never executed: break;
0
101 default
never executed: default:
:
never executed: default:
0
102 break;
never executed: break;
0
103 }-
104 } else if (ev->type == 0x01
ev->type == 0x01Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
105-
106-
107-
108-
109 switch (ev->code) {-
110 case
never executed: case 0x14a:
0x14a:
never executed: case 0x14a:
0
111 state.down = ev->value != 0;-
112 break;
never executed: break;
0
113 case
never executed: case 0x140:
0x140:
never executed: case 0x140:
0
114 state.tool = ev->value
ev->valueDescription
TRUEnever evaluated
FALSEnever evaluated
? QTabletEvent::Pen : 0;
0
115 break;
never executed: break;
0
116 case
never executed: case 0x141:
0x141:
never executed: case 0x141:
0
117 state.tool = ev->value
ev->valueDescription
TRUEnever evaluated
FALSEnever evaluated
? QTabletEvent::Eraser : 0;
0
118 break;
never executed: break;
0
119 default
never executed: default:
:
never executed: default:
0
120 break;
never executed: break;
0
121 }-
122 } else if (ev->type == 0x00
ev->type == 0x00Description
TRUEnever evaluated
FALSEnever evaluated
&& ev->code == 0
ev->code == 0Description
TRUEnever evaluated
FALSEnever evaluated
&& lastEventType != ev->type
lastEventType != ev->typeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
123 report();-
124 }
never executed: end of block
0
125 lastEventType = ev->type;-
126}
never executed: end of block
0
127-
128void QEvdevTabletData::reportProximityEnter()-
129{-
130 QWindowSystemInterface::handleTabletEnterProximityEvent(QTabletEvent::Stylus, state.tool, 1);-
131}
never executed: end of block
0
132-
133void QEvdevTabletData::reportProximityLeave()-
134{-
135 QWindowSystemInterface::handleTabletLeaveProximityEvent(QTabletEvent::Stylus, state.tool, 1);-
136}
never executed: end of block
0
137-
138void QEvdevTabletData::report()-
139{-
140 if (!state.lastReportTool
!state.lastReportToolDescription
TRUEnever evaluated
FALSEnever evaluated
&& state.tool
state.toolDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
141 reportProximityEnter();
never executed: reportProximityEnter();
0
142-
143 qreal nx = (state.x - minValues.x) / qreal(maxValues.x - minValues.x);-
144 qreal ny = (state.y - minValues.y) / qreal(maxValues.y - minValues.y);-
145-
146 QRect winRect = QGuiApplication::primaryScreen()->geometry();-
147 QPointF globalPos(nx * winRect.width(), ny * winRect.height());-
148 int pointer = state.tool;-
149-
150 if (!state.down
!state.downDescription
TRUEnever evaluated
FALSEnever evaluated
&& state.lastReportDown
state.lastReportDownDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
151 globalPos = state.lastReportPos;-
152 pointer = state.lastReportTool;-
153 }
never executed: end of block
0
154-
155 qreal pressure = (state.p - minValues.p) / qreal(maxValues.p - minValues.p);-
156-
157 if (state.down
state.downDescription
TRUEnever evaluated
FALSEnever evaluated
|| state.lastReportDown
state.lastReportDownDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
158 QWindowSystemInterface::handleTabletEvent(0, state.down, QPointF(), globalPos,-
159 QTabletEvent::Stylus, pointer,-
160 pressure, 0, 0, 0, 0, 0, 1, (static_cast<QGuiApplication *>(QCoreApplication::instance()))->keyboardModifiers());-
161 }
never executed: end of block
0
162-
163 if (state.lastReportTool
state.lastReportToolDescription
TRUEnever evaluated
FALSEnever evaluated
&& !state.tool
!state.toolDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
164 reportProximityLeave();
never executed: reportProximityLeave();
0
165-
166 state.lastReportDown = state.down;-
167 state.lastReportTool = state.tool;-
168 state.lastReportPos = globalPos;-
169}
never executed: end of block
0
170-
171-
172QEvdevTabletHandler::QEvdevTabletHandler(const QString &spec, QObject *parent)-
173 : QObject(parent), d(0)-
174{-
175 setObjectName(QLatin1String("Evdev Tablet Handler"));-
176 d = new QEvdevTabletData(this);-
177 QString dev;-
178 QStringList args = spec.split(QLatin1Char(':'));-
179 for (int i = 0; i < args.count()
i < args.count()Description
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
180 if (args.at(i).startsWith(QLatin1String("/dev/"))
args.at(i).sta...ring("/dev/"))Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
181 dev = args.at(i);-
182 break;
never executed: break;
0
183 }-
184 }
never executed: end of block
0
185 if (dev.isEmpty()
dev.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
186 QScopedPointer<QDeviceDiscovery> deviceDiscovery(-
187 QDeviceDiscovery::create(QDeviceDiscovery::Device_Tablet, this));-
188 if (deviceDiscovery
deviceDiscoveryDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
189 QStringList devices = deviceDiscovery->scanConnectedDevices();-
190 if (!devices.isEmpty()
!devices.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
191 dev = devices.at(0);
never executed: dev = devices.at(0);
0
192 }
never executed: end of block
0
193 }
never executed: end of block
0
194 if (!dev.isEmpty()
!dev.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
195 for (bool qt_category_enabled = qLcEvdevTablet().isDebugEnabled(); qt_category_enabled
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
; qt_category_enabled = false) QMessageLogger(__FILE__, 237, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: using %s", QString(dev).toLocal8Bit().constData());
never executed: QMessageLogger(__FILE__, 237, __PRETTY_FUNCTION__, qLcEvdevTablet().categoryName()).debug("evdevtablet: using %s", QString(dev).toLocal8Bit().constData());
0
196 d->fd = qt_safe_open(dev.toLocal8Bit().constData(), 00 | 04000, 0);-
197 if (d->fd >= 0
d->fd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
198 d->testGrab();-
199 if (d->queryLimits()
d->queryLimits()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
200 d->notifier = new QSocketNotifier(d->fd, QSocketNotifier::Read, this);-
201 connect(d->notifier, qFlagLocation("2""activated(int)" "\0" __FILE__ ":" "243"), this, qFlagLocation("1""readData()" "\0" __FILE__ ":" "243"));-
202 }
never executed: end of block
0
203 }
never executed: end of block
else {
0
204 qErrnoWarning((*__errno_location ()), "evdevtablet: Cannot open input device");-
205 }
never executed: end of block
0
206 }-
207}
never executed: end of block
0
208-
209QEvdevTabletHandler::~QEvdevTabletHandler()-
210{-
211 delete d->notifier;-
212 if (d->fd >= 0
d->fd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
213 qt_safe_close(d->fd);
never executed: qt_safe_close(d->fd);
0
214-
215 delete d;-
216}
never executed: end of block
0
217-
218void QEvdevTabletHandler::readData()-
219{-
220 static input_event buffer[32];-
221 int n = 0;-
222 for (; ;) {-
223 int result = qt_safe_read(d->fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);-
224 if (!result
!resultDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
225 QMessageLogger(__FILE__, 267, __PRETTY_FUNCTION__).warning("evdevtablet: Got EOF from input device");-
226 return;
never executed: return;
0
227 } else if (result < 0
result < 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
228 if ((*
(*__errno_location ()) != 4Description
TRUEnever evaluated
FALSEnever evaluated
__errno_location ()) != 4
(*__errno_location ()) != 4Description
TRUEnever evaluated
FALSEnever evaluated
&& (*
(*__errno_location ()) != 11Description
TRUEnever evaluated
FALSEnever evaluated
__errno_location ()) != 11
(*__errno_location ()) != 11Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
229 qErrnoWarning((*__errno_location ()), "evdevtablet: Could not read from input device");-
230 if ((*
(*__errno_location ()) == 19Description
TRUEnever evaluated
FALSEnever evaluated
__errno_location ()) == 19
(*__errno_location ()) == 19Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
231 delete d->notifier;-
232 d->notifier = 0;-
233 qt_safe_close(d->fd);-
234 d->fd = -1;-
235 }
never executed: end of block
0
236 return;
never executed: return;
0
237 }-
238 }
never executed: end of block
else {
0
239 n += result;-
240 if (n % sizeof(input_event) == 0
n % sizeof(input_event) == 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
241 break;
never executed: break;
0
242 }
never executed: end of block
0
243 }-
244-
245 n /= sizeof(input_event);-
246-
247 for (int i = 0; i < n
i < nDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i)
0
248 d->processInputEvent(&buffer[i]);
never executed: d->processInputEvent(&buffer[i]);
0
249}
never executed: end of block
0
250-
251-
252QEvdevTabletHandlerThread::QEvdevTabletHandlerThread(const QString &spec, QObject *parent)-
253 : QDaemonThread(parent), m_spec(spec), m_handler(0)-
254{-
255 start();-
256}
never executed: end of block
0
257-
258QEvdevTabletHandlerThread::~QEvdevTabletHandlerThread()-
259{-
260 quit();-
261 wait();-
262}
never executed: end of block
0
263-
264void QEvdevTabletHandlerThread::run()-
265{-
266 m_handler = new QEvdevTabletHandler(m_spec);-
267 exec();-
268 delete m_handler;-
269 m_handler = 0;-
270}
never executed: end of block
0
271-
272-
273-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9