Enable compilation of evdev touch handlers on VxWorks
In order to provide support for device detection using evdev on VxWorks, we need to exclude not compiling parts of code for touch handling for this platform. For now, provide necessary headers and defines, remove incompatible code for evdev tablet and touch handlers. Note that this is a preparatory change, as no touch device is being detected for VxWorks yet, nor evdev is enabled for this OS. Task-number: QTBUG-115777 Change-Id: I042d2fd464bbe23516646c02ae10354aefe82403 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
parent
c4dfb8030c
commit
af2cf8a67b
@ -12,6 +12,17 @@
|
|||||||
#include <qpa/qwindowsysteminterface.h>
|
#include <qpa/qwindowsysteminterface.h>
|
||||||
#ifdef Q_OS_FREEBSD
|
#ifdef Q_OS_FREEBSD
|
||||||
#include <dev/evdev/input.h>
|
#include <dev/evdev/input.h>
|
||||||
|
#elif defined(Q_OS_VXWORKS)
|
||||||
|
#include <qpa/qplatformscreen.h>
|
||||||
|
#include <evdevLib.h>
|
||||||
|
#define SYN_REPORT 0
|
||||||
|
#define EV_SYN EV_DEV_SYN
|
||||||
|
#define EV_KEY EV_DEV_KEY
|
||||||
|
#define EV_ABS EV_DEV_ABS
|
||||||
|
#define ABS_X EV_DEV_PTR_ABS_X
|
||||||
|
#define ABS_Y EV_DEV_PTR_ABS_Y
|
||||||
|
#define BTN_TOUCH EV_DEV_PTR_BTN_TOUCH
|
||||||
|
typedef EV_DEV_EVENT input_event;
|
||||||
#else
|
#else
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#endif
|
#endif
|
||||||
@ -62,12 +73,14 @@ void QEvdevTabletData::processInputEvent(input_event *ev)
|
|||||||
case ABS_Y:
|
case ABS_Y:
|
||||||
state.y = ev->value;
|
state.y = ev->value;
|
||||||
break;
|
break;
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
case ABS_PRESSURE:
|
case ABS_PRESSURE:
|
||||||
state.p = ev->value;
|
state.p = ev->value;
|
||||||
break;
|
break;
|
||||||
case ABS_DISTANCE:
|
case ABS_DISTANCE:
|
||||||
state.d = ev->value;
|
state.d = ev->value;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -80,12 +93,14 @@ void QEvdevTabletData::processInputEvent(input_event *ev)
|
|||||||
case BTN_TOUCH:
|
case BTN_TOUCH:
|
||||||
state.down = ev->value != 0;
|
state.down = ev->value != 0;
|
||||||
break;
|
break;
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
case BTN_TOOL_PEN:
|
case BTN_TOOL_PEN:
|
||||||
state.tool = ev->value ? int(QPointingDevice::PointerType::Pen) : 0;
|
state.tool = ev->value ? int(QPointingDevice::PointerType::Pen) : 0;
|
||||||
break;
|
break;
|
||||||
case BTN_TOOL_RUBBER:
|
case BTN_TOOL_RUBBER:
|
||||||
state.tool = ev->value ? int(QPointingDevice::PointerType::Eraser) : 0;
|
state.tool = ev->value ? int(QPointingDevice::PointerType::Eraser) : 0;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -147,6 +162,7 @@ QEvdevTabletHandler::QEvdevTabletHandler(const QString &device, const QString &s
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
bool grabSuccess = !ioctl(m_fd, EVIOCGRAB, (void *) 1);
|
bool grabSuccess = !ioctl(m_fd, EVIOCGRAB, (void *) 1);
|
||||||
if (grabSuccess)
|
if (grabSuccess)
|
||||||
ioctl(m_fd, EVIOCGRAB, (void *) 0);
|
ioctl(m_fd, EVIOCGRAB, (void *) 0);
|
||||||
@ -156,6 +172,7 @@ QEvdevTabletHandler::QEvdevTabletHandler(const QString &device, const QString &s
|
|||||||
d = new QEvdevTabletData(this);
|
d = new QEvdevTabletData(this);
|
||||||
if (!queryLimits())
|
if (!queryLimits())
|
||||||
qWarning("evdevtablet: %ls: Unset or invalid ABS limits. Behavior will be unspecified.", qUtf16Printable(device));
|
qWarning("evdevtablet: %ls: Unset or invalid ABS limits. Behavior will be unspecified.", qUtf16Printable(device));
|
||||||
|
#endif
|
||||||
|
|
||||||
m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
||||||
connect(m_notifier, &QSocketNotifier::activated, this, &QEvdevTabletHandler::readData);
|
connect(m_notifier, &QSocketNotifier::activated, this, &QEvdevTabletHandler::readData);
|
||||||
@ -176,6 +193,7 @@ qint64 QEvdevTabletHandler::deviceId() const
|
|||||||
|
|
||||||
bool QEvdevTabletHandler::queryLimits()
|
bool QEvdevTabletHandler::queryLimits()
|
||||||
{
|
{
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
input_absinfo absInfo;
|
input_absinfo absInfo;
|
||||||
memset(&absInfo, 0, sizeof(input_absinfo));
|
memset(&absInfo, 0, sizeof(input_absinfo));
|
||||||
@ -211,10 +229,14 @@ bool QEvdevTabletHandler::queryLimits()
|
|||||||
qCDebug(qLcEvdevTablet, "evdevtablet: %ls: device name: %s", qUtf16Printable(m_device), name);
|
qCDebug(qLcEvdevTablet, "evdevtablet: %ls: device name: %s", qUtf16Printable(m_device), name);
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void QEvdevTabletHandler::readData()
|
void QEvdevTabletHandler::readData()
|
||||||
{
|
{
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
input_event buffer[32];
|
input_event buffer[32];
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for (; ;) {
|
for (; ;) {
|
||||||
@ -244,6 +266,7 @@ void QEvdevTabletHandler::readData()
|
|||||||
|
|
||||||
for (int i = 0; i < n; ++i)
|
for (int i = 0; i < n; ++i)
|
||||||
d->processInputEvent(&buffer[i]);
|
d->processInputEvent(&buffer[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,6 +21,22 @@
|
|||||||
|
|
||||||
#ifdef Q_OS_FREEBSD
|
#ifdef Q_OS_FREEBSD
|
||||||
#include <dev/evdev/input.h>
|
#include <dev/evdev/input.h>
|
||||||
|
#elif defined(Q_OS_VXWORKS)
|
||||||
|
#include <qpa/qplatformscreen.h>
|
||||||
|
#include <evdevLib.h>
|
||||||
|
#define SYN_REPORT 0
|
||||||
|
#define EV_SYN EV_DEV_SYN
|
||||||
|
#define EV_KEY EV_DEV_KEY
|
||||||
|
#define EV_ABS EV_DEV_ABS
|
||||||
|
#define ABS_X EV_DEV_PTR_ABS_X
|
||||||
|
#define ABS_Y EV_DEV_PTR_ABS_Y
|
||||||
|
#define BTN_TOUCH EV_DEV_PTR_BTN_TOUCH
|
||||||
|
#define ABS_MAX 0x3f
|
||||||
|
#define ABS_MT_SLOT EV_DEV_PTR_ABS_MT_SLOT //0x2F
|
||||||
|
#define ABS_MT_POSITION_X EV_DEV_PTR_ABS_MT_POSITION_X //0x35
|
||||||
|
#define ABS_MT_POSITION_Y EV_DEV_PTR_ABS_MT_POSITION_Y //0x36
|
||||||
|
#define ABS_MT_TRACKING_ID EV_DEV_PTR_ABS_MT_TRACKING_ID //0x39
|
||||||
|
typedef EV_DEV_EVENT input_event;
|
||||||
#else
|
#else
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#endif
|
#endif
|
||||||
@ -164,7 +180,7 @@ QEvdevTouchScreenData::QEvdevTouchScreenData(QEvdevTouchScreenHandler *q_ptr, co
|
|||||||
#define LONG_BITS (sizeof(long) << 3)
|
#define LONG_BITS (sizeof(long) << 3)
|
||||||
#define NUM_LONGS(bits) (((bits) + LONG_BITS - 1) / LONG_BITS)
|
#define NUM_LONGS(bits) (((bits) + LONG_BITS - 1) / LONG_BITS)
|
||||||
|
|
||||||
#if !QT_CONFIG(mtdev)
|
#if !QT_CONFIG(mtdev) && !defined(Q_OS_VXWORKS)
|
||||||
static inline bool testBit(long bit, const long *array)
|
static inline bool testBit(long bit, const long *array)
|
||||||
{
|
{
|
||||||
return (array[bit / LONG_BITS] >> bit % LONG_BITS) & 1;
|
return (array[bit / LONG_BITS] >> bit % LONG_BITS) & 1;
|
||||||
@ -236,13 +252,14 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &device, const
|
|||||||
d->m_typeB = true;
|
d->m_typeB = true;
|
||||||
#else
|
#else
|
||||||
const char *mtdevStr = "";
|
const char *mtdevStr = "";
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
long absbits[NUM_LONGS(ABS_CNT)];
|
long absbits[NUM_LONGS(ABS_CNT)];
|
||||||
if (ioctl(m_fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits) >= 0) {
|
if (ioctl(m_fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits) >= 0) {
|
||||||
d->m_typeB = testBit(ABS_MT_SLOT, absbits);
|
d->m_typeB = testBit(ABS_MT_SLOT, absbits);
|
||||||
d->m_singleTouch = !testBit(ABS_MT_POSITION_X, absbits);
|
d->m_singleTouch = !testBit(ABS_MT_POSITION_X, absbits);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
d->deviceNode = device;
|
d->deviceNode = device;
|
||||||
qCDebug(qLcEvdevTouch,
|
qCDebug(qLcEvdevTouch,
|
||||||
"evdevtouch: %ls: Protocol type %c %s (%s), filtered=%s",
|
"evdevtouch: %ls: Protocol type %c %s (%s), filtered=%s",
|
||||||
@ -253,9 +270,10 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &device, const
|
|||||||
if (d->m_filtered)
|
if (d->m_filtered)
|
||||||
qCDebug(qLcEvdevTouch, " - prediction=%d", d->m_prediction);
|
qCDebug(qLcEvdevTouch, " - prediction=%d", d->m_prediction);
|
||||||
|
|
||||||
|
bool has_x_range = false, has_y_range = false;
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
input_absinfo absInfo;
|
input_absinfo absInfo;
|
||||||
memset(&absInfo, 0, sizeof(input_absinfo));
|
memset(&absInfo, 0, sizeof(input_absinfo));
|
||||||
bool has_x_range = false, has_y_range = false;
|
|
||||||
|
|
||||||
if (ioctl(m_fd, EVIOCGABS((d->m_singleTouch ? ABS_X : ABS_MT_POSITION_X)), &absInfo) >= 0) {
|
if (ioctl(m_fd, EVIOCGABS((d->m_singleTouch ? ABS_X : ABS_MT_POSITION_X)), &absInfo) >= 0) {
|
||||||
qCDebug(qLcEvdevTouch, "evdevtouch: %ls: min X: %d max X: %d", qUtf16Printable(device),
|
qCDebug(qLcEvdevTouch, "evdevtouch: %ls: min X: %d max X: %d", qUtf16Printable(device),
|
||||||
@ -272,10 +290,12 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &device, const
|
|||||||
d->hw_range_y_max = absInfo.maximum;
|
d->hw_range_y_max = absInfo.maximum;
|
||||||
has_y_range = true;
|
has_y_range = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!has_x_range || !has_y_range)
|
if (!has_x_range || !has_y_range)
|
||||||
qWarning("evdevtouch: %ls: Invalid ABS limits, behavior unspecified", qUtf16Printable(device));
|
qWarning("evdevtouch: %ls: Invalid ABS limits, behavior unspecified", qUtf16Printable(device));
|
||||||
|
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
if (ioctl(m_fd, EVIOCGABS(ABS_PRESSURE), &absInfo) >= 0) {
|
if (ioctl(m_fd, EVIOCGABS(ABS_PRESSURE), &absInfo) >= 0) {
|
||||||
qCDebug(qLcEvdevTouch, "evdevtouch: %ls: min pressure: %d max pressure: %d", qUtf16Printable(device),
|
qCDebug(qLcEvdevTouch, "evdevtouch: %ls: min pressure: %d max pressure: %d", qUtf16Printable(device),
|
||||||
absInfo.minimum, absInfo.maximum);
|
absInfo.minimum, absInfo.maximum);
|
||||||
@ -290,6 +310,7 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &device, const
|
|||||||
d->hw_name = QString::fromLocal8Bit(name);
|
d->hw_name = QString::fromLocal8Bit(name);
|
||||||
qCDebug(qLcEvdevTouch, "evdevtouch: %ls: device name: %s", qUtf16Printable(device), name);
|
qCDebug(qLcEvdevTouch, "evdevtouch: %ls: device name: %s", qUtf16Printable(device), name);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Fix up the coordinate ranges for am335x in case the kernel driver does not have them fixed.
|
// Fix up the coordinate ranges for am335x in case the kernel driver does not have them fixed.
|
||||||
if (d->hw_name == "ti-tsc"_L1) {
|
if (d->hw_name == "ti-tsc"_L1) {
|
||||||
@ -305,11 +326,13 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &device, const
|
|||||||
d->hw_range_x_min, d->hw_range_x_max, d->hw_range_y_min, d->hw_range_y_max);
|
d->hw_range_x_min, d->hw_range_x_max, d->hw_range_y_min, d->hw_range_y_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
bool grabSuccess = !ioctl(m_fd, EVIOCGRAB, (void *) 1);
|
bool grabSuccess = !ioctl(m_fd, EVIOCGRAB, (void *) 1);
|
||||||
if (grabSuccess)
|
if (grabSuccess)
|
||||||
ioctl(m_fd, EVIOCGRAB, (void *) 0);
|
ioctl(m_fd, EVIOCGRAB, (void *) 0);
|
||||||
else
|
else
|
||||||
qWarning("evdevtouch: The device is grabbed by another process. No events will be read.");
|
qWarning("evdevtouch: The device is grabbed by another process. No events will be read.");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (rotationAngle)
|
if (rotationAngle)
|
||||||
d->m_rotate = QTransform::fromTranslate(0.5, 0.5).rotate(rotationAngle).translate(-0.5, -0.5);
|
d->m_rotate = QTransform::fromTranslate(0.5, 0.5).rotate(rotationAngle).translate(-0.5, -0.5);
|
||||||
@ -360,9 +383,9 @@ QPointingDevice *QEvdevTouchScreenHandler::touchDevice() const
|
|||||||
|
|
||||||
void QEvdevTouchScreenHandler::readData()
|
void QEvdevTouchScreenHandler::readData()
|
||||||
{
|
{
|
||||||
::input_event buffer[32];
|
|
||||||
int events = 0;
|
int events = 0;
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
|
::input_event buffer[32];
|
||||||
#if QT_CONFIG(mtdev)
|
#if QT_CONFIG(mtdev)
|
||||||
forever {
|
forever {
|
||||||
do {
|
do {
|
||||||
@ -398,6 +421,7 @@ void QEvdevTouchScreenHandler::readData()
|
|||||||
for (int i = 0; i < n; ++i)
|
for (int i = 0; i < n; ++i)
|
||||||
d->processInputEvent(&buffer[i]);
|
d->processInputEvent(&buffer[i]);
|
||||||
#endif
|
#endif
|
||||||
|
#endif // Q_OS_VXWORKS
|
||||||
return;
|
return;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -548,6 +572,7 @@ void QEvdevTouchScreenData::processInputEvent(input_event *data)
|
|||||||
m_currentData.state = QEventPoint::State::Released;
|
m_currentData.state = QEventPoint::State::Released;
|
||||||
if (m_typeB)
|
if (m_typeB)
|
||||||
m_contacts[m_currentSlot].maj = m_currentData.maj;
|
m_contacts[m_currentSlot].maj = m_currentData.maj;
|
||||||
|
#if !defined(Q_OS_VXWORKS)
|
||||||
} else if (data->code == ABS_PRESSURE || data->code == ABS_MT_PRESSURE) {
|
} else if (data->code == ABS_PRESSURE || data->code == ABS_MT_PRESSURE) {
|
||||||
if (Q_UNLIKELY(qLcEvents().isDebugEnabled()))
|
if (Q_UNLIKELY(qLcEvents().isDebugEnabled()))
|
||||||
qCDebug(qLcEvents, "EV_ABS code 0x%x: pressure %d; bounding to [%d,%d]",
|
qCDebug(qLcEvents, "EV_ABS code 0x%x: pressure %d; bounding to [%d,%d]",
|
||||||
@ -555,6 +580,7 @@ void QEvdevTouchScreenData::processInputEvent(input_event *data)
|
|||||||
m_currentData.pressure = qBound(hw_pressure_min, data->value, hw_pressure_max);
|
m_currentData.pressure = qBound(hw_pressure_min, data->value, hw_pressure_max);
|
||||||
if (m_typeB || m_singleTouch)
|
if (m_typeB || m_singleTouch)
|
||||||
m_contacts[m_currentSlot].pressure = m_currentData.pressure;
|
m_contacts[m_currentSlot].pressure = m_currentData.pressure;
|
||||||
|
#endif
|
||||||
} else if (data->code == ABS_MT_SLOT) {
|
} else if (data->code == ABS_MT_SLOT) {
|
||||||
m_currentSlot = data->value;
|
m_currentSlot = data->value;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user