-rw-r--r-- | qt/qte234-for-opie091-simpad.patch | 77 |
1 files changed, 71 insertions, 6 deletions
diff --git a/qt/qte234-for-opie091-simpad.patch b/qt/qte234-for-opie091-simpad.patch index 5b892d4..74a8d83 100644 --- a/qt/qte234-for-opie091-simpad.patch +++ b/qt/qte234-for-opie091-simpad.patch @@ -1,157 +1,157 @@ ---- src/kernel/qkeyboard_qws.cpp.orig Fri May 30 16:05:20 2003 -+++ src/kernel/qkeyboard_qws.cpp Fri May 30 16:03:41 2003 +--- qt-2.3.5/src/kernel/qkeyboard_qws.cpp~qte234-for-opie091-simpad 2003-06-13 16:59:33.000000000 +0200 ++++ qt-2.3.5/src/kernel/qkeyboard_qws.cpp 2003-06-13 16:59:33.000000000 +0200 @@ -37,6 +37,7 @@ #include <qapplication.h> #include <qsocketnotifier.h> #include <qnamespace.h> +#include <qdatetime.h> #include <qtimer.h> #include <stdlib.h> @@ -131,6 +132,59 @@ #endif // QNX6 +/* + * SIMpad switches handler + * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> + */ + +//TODO: guard this against inclusion with #ifdef QT_QWS_SIMPAD + +#include <linux/switches.h> +#define SIMPAD_SWITCHES_DEVICE "/dev/misc/switches" + +// switches from left top to right down over the SIMpad surface + +#define SIMPAD_SWITCH_POWER 0x02 +#define SIMPAD_SWITCH_UPPER 0x10 +#define SIMPAD_SWITCH_UP 0x20 +#define SIMPAD_SWITCH_DOWN 0x40 +#define SIMPAD_SWITCH_LEFT 0x80 +#define SIMPAD_SWITCH_RIGHT 0x100 +#define SIMPAD_SWITCH_LOWER 0x8 + +class QWSsimpadButtonsHandler : public QWSKeyboardHandler +{ + Q_OBJECT + + public: + QWSsimpadButtonsHandler(); + virtual ~QWSsimpadButtonsHandler(); + + bool isOpen() { return fd > 0; } + + private slots: + void readSwitchesData(); + void autoRepeat(); + + private: + switches_mask_t switches; + + int fd; + int repeatdelay; + int repeatperiod; + + int lastCode; // last native code + int lastPress; // last press/release state + + int k; // last emitted Qt key code + int shiftKeyPressed; // true if one of the SHIFT keys has been pressed and not yet released + bool shiftUsed; // true if SHIFT has been used + + QTime eventTimer; // tracks time between raw events + QTimer* repeater; + QSocketNotifier *notifier; +}; + #ifdef QT_QWS_SL5XXX static const QWSServer::KeyMap keyM[] = { { Qt::Key_unknown, 0xffff , 0xffff , 0xffff }, // 00 -@@ -1440,7 +1494,11 @@ +@@ -1444,7 +1498,11 @@ } else { type = spec; } - + if ( type == "SIMpad" ) + { + qDebug( "QWSKeyboardHandler: using SIMpad keyboard handler..." ); + handler = new QWSsimpadButtonsHandler(); + } if ( type == "Buttons" ) { #if defined(QT_QWS_YOPY) handler = new QWSyopyButtonsHandler(); -@@ -1469,6 +1527,217 @@ +@@ -1473,6 +1531,217 @@ return keyM; } -#endif // QT_NO_QWS_KEYBOARD +/* + * SIMpad switches handler + * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> + */ -+ + + +QWSsimpadButtonsHandler::QWSsimpadButtonsHandler() + :QWSKeyboardHandler(), fd( -1 ), + repeatdelay( 700 ), repeatperiod( 80 ), + lastCode( 0 ), lastPress( 0 ), + k( -1 ), shiftKeyPressed( 0 ), shiftUsed( false ) +{ + qDebug( "SimpadButtonsHandler() - V4.1" ); + fd = ::open( SIMPAD_SWITCHES_DEVICE, O_RDWR | O_NDELAY, 0 ); + if ( fd < 0 ) + { + qWarning( "SimpadButtonsHandler(): can't open %s", SIMPAD_SWITCHES_DEVICE ); + return; + } - ++ + notifier = new QSocketNotifier( fd, QSocketNotifier::Read, this ); + connect( notifier, SIGNAL( activated(int) ),this, SLOT( readSwitchesData() ) ); + + repeater = new QTimer(this); + connect(repeater, SIGNAL(timeout()), this, SLOT(autoRepeat())); + +} + + +QWSsimpadButtonsHandler::~QWSsimpadButtonsHandler() +{ + qDebug( "~SimpadButtonsHandler()" ); + if ( fd > 0 ) + { + ::close( fd ); + fd = -1; + } +} + + +void QWSsimpadButtonsHandler::readSwitchesData() +{ + qDebug( "SimpadButtonsHandler() - detected switches action" ); + + if ( ::read( fd, &switches, sizeof switches ) < 0 ) + { + qWarning( "SimpadButtonsHandler() - switches read error!" ); + return; + } + + qDebug( "SimpadButtonsHandler() - Shift: %0x [used: %0x] + Event = %0x | %0x", + shiftKeyPressed, shiftUsed, switches.events[0], switches.states[0] ); + + bool press = switches.states[0]; // == switches.event[0]; + int code = switches.events[0]; + + //========================================================================= + + /** + * Work around a bug in the kernel keyboard driver emitting + * bogus events when pressing multiple switches at once + **/ + + if ( lastCode == 0 ) + { + // first press ever + eventTimer.start(); + lastPress = press; @@ -255,48 +255,113 @@ + case SIMPAD_SWITCH_UPPER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return; + case SIMPAD_SWITCH_LOWER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return; + + default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event!" ); break; + } + } + + if ( k == -1 ) + { + qDebug( "no key to emit - returning." ); + return; + } + + bool repeatable = ( k == Qt::Key_Up || k == Qt::Key_Down || + k == Qt::Key_Right || k == Qt::Key_Left ); + + qDebug( "key to emit = %d [%s] [repeat=%s]", k, + press ? "press" : "release", + repeatable ? "true":"false" ); + + if ( qt_screen->isTransformed() && k >= Qt::Key_Left && k <= Qt::Key_Down ) + { + qDebug( "SimpadButtonsHandler() - We are transformed! Correcting..." ); + int oldK = k; + k = xform_dirkey( k ); + qDebug( "SimpadButtonsHandler() - Old Key: %d - New Key %d", oldK, k ); + } + + if ( repeatable && press ) + repeater->start( repeatdelay, true ); + else + repeater->stop(); + + qwsServer->processKeyEvent( 0, k, 0, press, false ); +} + + +void QWSsimpadButtonsHandler::autoRepeat() +{ + qDebug( "Emitting key = %d (released)", k ); + processKeyEvent( 0, k, 0, false, true ); + qDebug( "Emitting key = %d (pressed)", k ); + processKeyEvent( 0, k, 0, true, true ); + repeater->start(repeatperiod); +} + + +#endif // QT_NO_QWS_KEYBOARD +--- qt-2.3.5/src/kernel/qwsmouse_qws.cpp~qte234-for-opie091-simpad 2003-04-02 03:26:52.000000000 +0200 ++++ qt-2.3.5/src/kernel/qwsmouse_qws.cpp 2003-06-13 16:59:33.000000000 +0200 +@@ -47,6 +47,7 @@ + #include <stdlib.h> + #include <stdio.h> + #include <sys/ioctl.h> ++#include <sys/time.h> + #include <sys/types.h> + #include <sys/stat.h> + #include <fcntl.h> +@@ -67,6 +68,7 @@ + unsigned short x; + unsigned short y; + unsigned short pad; ++ struct timeval stamp; + } TS_EVENT; + #elif defined(QT_QWS_SL5XXX) + #define QT_QWS_SL5XXX_RAW +@@ -1238,29 +1240,11 @@ + : samples(QT_QWS_TP_SAMPLE_SIZE), currSample(0), lastSample(0), + numSamples(0), skipCount(0) + { +-#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) +-#if defined(QT_QWS_IPAQ) +-# ifdef QT_QWS_IPAQ_RAW +- if ((mouseFD = open( "/dev/h3600_tsraw", O_RDONLY | O_NDELAY)) < 0) { +-# else +- if ((mouseFD = open( "/dev/h3600_ts", O_RDONLY | O_NDELAY)) < 0) { +-# endif +- qWarning( "Cannot open /dev/h3600_ts (%s)", strerror(errno)); ++#ifdef QT_QWS_SIMPAD ++ if ((mouseFD = open( "/dev/touchscreen/ucb1x00", O_RDONLY | O_NONBLOCK )) < 0) { ++ qWarning( "Cannot open /dev/touchscreen/ucb1x00 (%s)", strerror(errno)); + return; + } +-#elif defined(QT_QWS_SL5XXX) +-//# ifdef QT_QWS_SL5XXX_TSRAW +-# if 0 +- if ((mouseFD = open( "/dev/tsraw", O_RDONLY | O_NDELAY)) < 0) { +- qWarning( "Cannot open /dev/tsraw (%s)", strerror(errno)); +- return; +- } +-# else +- if ((mouseFD = open( "/dev/ts", O_RDONLY | O_NDELAY)) < 0) { +- qWarning( "Cannot open /dev/ts (%s)", strerror(errno)); +- return; +- } +-# endif + #endif + + QSocketNotifier *mouseNotifier; +@@ -1269,12 +1253,11 @@ + connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData())); + waspressed=FALSE; + mouseIdx = 0; +-#endif + } + + QTPanelHandlerPrivate::~QTPanelHandlerPrivate() + { +-#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) ++#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_SIMPAD) + if (mouseFD >= 0) + close(mouseFD); + #endif |