# # Patch managed by http://www.holgerschurig.de/patcher.html # --- qt-2.3.7/src/kernel/qwsmouse_qws.cpp~tslib.patch +++ qt-2.3.7/src/kernel/qwsmouse_qws.cpp @@ -7,6 +7,10 @@ ** ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. ** +** Portions Copyright (C) 2003 Texas Instruments, Inc. +** Rights to said portions for use under the GPL and QPL licenses +** are hereby granted to Trolltech AS. +** ** This file is part of the kernel module of the Qt GUI Toolkit. ** ** This file may be distributed and/or modified under the terms of the @@ -59,6 +63,9 @@ #ifdef QT_QWS_CASSIOPEIA #include #endif +#if QWS_TSLIB +#include +#endif #if defined(QT_QWS_IPAQ) #define QT_QWS_IPAQ_RAW @@ -110,7 +117,7 @@ #ifndef QT_QWS_TP_JITTER_LIMIT #define QT_QWS_TP_JITTER_LIMIT 2 -#endif +#endif //#define QWS_CUSTOMTOUCHPANEL @@ -1093,6 +1100,220 @@ return sent; } + +class QTSLibHandler : public QCalibratedMouseHandler +{ + Q_OBJECT +public: + QTSLibHandler(); + ~QTSLibHandler(); + + virtual void clearCalibration(); + virtual void calibrate( QWSPointerCalibrationData * ); + + static int sortByX( const void*, const void* ); + static int sortByY( const void*, const void* ); +private: + void openTs(); + void closeTs(); + void interpolateSample(); + +private: + bool raw; +#ifdef QWS_TSLIB + struct tsdev *ts; +#endif + QSocketNotifier *m_notify; + +private slots: + void readMouseData(); +}; + +QTSLibHandler::QTSLibHandler() + : raw(false), m_notify(0l) +{ + openTs(); +} + +QTSLibHandler::~QTSLibHandler() +{ + closeTs(); +} + +void QTSLibHandler::openTs() +{ +#ifdef QWS_TSLIB + char *tsdevice; + + if( ( tsdevice = getenv( "TSLIB_TSDEVICE" ) ) != NULL ) { + ts = ts_open( tsdevice, 1 ); + } else { + ts = ts_open( "/dev/ts", 1 ); + } + + if (!ts) { + qWarning( "Cannot open touchscreen (%s)", strerror( errno ) ); + return; + } + + if (ts_config( ts )) { + qWarning( "Cannot configure touchscreen (%s)", strerror( errno ) ); + return; + } + + + m_notify = new QSocketNotifier( ts_fd(ts), QSocketNotifier::Read, this ); + connect( m_notify, SIGNAL( activated( int ) ), this, SLOT( readMouseData() ) ); +#endif +} + +void QTSLibHandler::closeTs() +{ +#ifdef QWS_TSLIB + if (ts) + ts_close(ts); + + delete m_notify; + m_notify = 0; ts = 0; +#endif + +} + +void QTSLibHandler::clearCalibration() +{ + raw = true; +} + + +void QTSLibHandler::calibrate( QWSPointerCalibrationData *cd ) +{ + QPoint dev_tl = cd->devPoints[ QWSPointerCalibrationData::TopLeft ]; + QPoint dev_br = cd->devPoints[ QWSPointerCalibrationData::BottomRight ]; + QPoint screen_tl = cd->screenPoints[ QWSPointerCalibrationData::TopLeft ]; + QPoint screen_br = cd->screenPoints[ QWSPointerCalibrationData::BottomRight ]; + int a, b, c, d, e, f, s; + + s = 1 << 16; + + a = s * (screen_tl.x() - screen_br.x() ) / (dev_tl.x() - dev_br.x()); + b = 0; + c = s * screen_tl.x() - a * dev_tl.x(); + + d = 0; + e = s * (screen_tl.y() - screen_br.y() ) / (dev_tl.y() - dev_br.y()); + f = s * screen_tl.y() - e * dev_tl.y(); + + QString calFile = "/etc/pointercal"; +#ifndef QT_NO_TEXTSTREAM + QFile file( calFile ); + if ( file.open( IO_WriteOnly ) ) { + QTextStream t( &file ); + t << a << " " << b << " " << c << " "; + t << d << " " << e << " " << f << " " << s; + file.flush(); closeTs(); + openTs(); + } else +#endif + { + qDebug( "Could not save calibration: %s", calFile.latin1() ); + } + raw = false; +} + +void QTSLibHandler::readMouseData() +{ +#ifdef QWS_TSLIB + if(!qt_screen) + return; + + /* + * After clear Calibration + * we're in raw mode and do some easy median + * search. + */ + if (raw ) + return interpolateSample(); + + static struct ts_sample sample; + static int ret; + + /* + * Ok. We need to see if we can read more than one event + * We do this not to lose an update. + */ + while ( true ) { + if ((ret = ts_read(ts, &sample, 1)) != 1 ) + return; + + + QPoint pos( sample.x, sample.y ); + emit mouseChanged( pos, sample.pressure != 0 ? 1 : 0 ); + } +#endif +} + + +/* + * Lets take all down events and then sort them + * and take the event in the middle. + * + * inspired by testutils.c + */ +void QTSLibHandler::interpolateSample() { + static struct ts_sample samples[25]; + int index = -1; + int ret; + + do { + index++; + /* fill only the last sample again */ + if ( index >= 25 ) + index = 24; + + /* we're opened non-blocking */ + if((ret= ts_read_raw(ts, &samples[index], 1 ) ) != 1 ) { + /* no event yet, so try again */ + if (ret==-1 ) { + index--; + continue; + } + } + }while (samples[index].pressure != 0); + + /* + * index is maximal 25 and we at least one sample + */ + int x, y; + + /* + * now let us use the median value + * even index does not have an item in the middle + * so let us take the average of n/2 and (n/2)-1 as the middle + */ + int m = index/2; + ::qsort(samples, index, sizeof(ts_sample), QTSLibHandler::sortByX); + x = (index % 2 ) ? samples[m].x : + ( samples[m-1].x + samples[m].x )/2; + + ::qsort(samples, index, sizeof(ts_sample), QTSLibHandler::sortByY); + y = (index % 2 ) ? samples[m].y : + ( samples[m-1].y + samples[m].y )/2; + + emit mouseChanged( QPoint(x, y), 1 ); + emit mouseChanged( QPoint(0, 0), 0 ); +} + +int QTSLibHandler::sortByX( const void* one, const void* two) { + return reinterpret_cast(one)->x - + reinterpret_cast(two)->x; +} + +int QTSLibHandler::sortByY( const void* one, const void* two) { + return reinterpret_cast(one)->y - + reinterpret_cast(two)->y; +} + + /* * Handler for /dev/tpanel Linux kernel driver */ @@ -1235,7 +1456,7 @@ QTPanelHandlerPrivate::QTPanelHandlerPrivate( MouseProtocol, QString dev ) - : samples(QT_QWS_TP_SAMPLE_SIZE), currSample(0), lastSample(0), + : samples(QT_QWS_TP_SAMPLE_SIZE), currSample(0), lastSample(0), numSamples(0), skipCount(0) { #if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) @@ -1315,7 +1536,7 @@ mousePos = QPoint( 0, 0 ); QPoint totalMousePos = oldTotalMousePos; totalMousePos += samples[currSample]; - if(numSamples >= samples.count()) + if(numSamples >= samples.count()) totalMousePos -= samples[lastSample]; mousePos = totalMousePos / (sampleCount - 1); @@ -1345,7 +1566,7 @@ // save recuring information currSample++; - if (numSamples >= samples.count()) + if (numSamples >= samples.count()) lastSample++; oldTotalMousePos = totalMousePos; } else { @@ -1658,7 +1879,7 @@ if ( mouseProto == "USB" && mouseDev.isEmpty() ) mouseDev = "/dev/input/mice"; - + MouseProtocol mouseProtocol = Unknown; int idx = 0; @@ -1689,12 +1910,14 @@ break; case TPanel: -#if defined(QWS_CUSTOMTOUCHPANEL) - handler = new QCustomTPanelHandlerPrivate(mouseProtocol,mouseDev); +#if defined(QWS_TSLIB) + handler = new QTSLibHandler( ); +#elif defined(QWS_CUSTOMTOUCHPANEL) + handler = new QCustomTPanelHandlerPrivate( mouseProtocol, mouseDev ); #elif defined(QT_QWS_YOPY) - handler = new QYopyTPanelHandlerPrivate(mouseProtocol,mouseDev); + handler = new QYopyTPanelHandlerPrivate( mouseProtocol, mouseDev ); #elif defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) - handler = new QTPanelHandlerPrivate(mouseProtocol,mouseDev); + handler = new QTPanelHandlerPrivate( mouseProtocol, mouseDev ); #elif defined(QT_QWS_CASSIOPEIA) handler = new QVrTPanelHandlerPrivate( mouseProtocol, mouseDev ); #endif --- qt-2.3.7/configure~tslib.patch +++ qt-2.3.7/configure @@ -399,6 +399,9 @@ -kde) KDE=yes ;; + -tslib) + TSLIB=yes + ;; -no-g++-exceptions) GPLUSPLUS_EXCEPTIONS=no ;; @@ -1255,6 +1258,9 @@ set to point to a KDE 2 installation. See http://www.kde.org + -tslib ............. Use the TSLib (touchscreen access library) mouse handler + by default, instead of the normal device default. + -no-g++-exceptions . Disable exceptions on platforms using the GNU C++ compiler by using the -fno-exceptions flag. @@ -1314,6 +1320,13 @@ [ "x$SM" = "xno" ] && QT_CXX="${QT_CXX} -DQT_NO_SM_SUPPORT" [ "x$XFT" = "xyes" ] && QT_CXX="${QT_CXX} -DQT_XFT" [ "x$XFT" = "xno" ] && QT_CXX="${QT_CXX} -DQT_NO_XKB" + +if [ "x$TSLIB" = "xyes" ] +then + QT_CXX="${QT_CXX} -DQWS_TSLIB" + QT_LIBS="${QT_LIBS} -lts" +fi + if [ "x$THREAD" = "xyes" ] then cat >src-mt.mk <