summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2003-05-30 23:00:51 (UTC)
committer mickeyl <mickeyl>2003-05-30 23:00:51 (UTC)
commita0e3407973f1383e27375be0b37e0ede46f9bd96 (patch) (side-by-side diff)
treee7bba77b316092a563debdafe493318a7fea91ba
parentb0af03e11acc0680a8ca4825cfe9f73e793a5fe1 (diff)
downloadopie-a0e3407973f1383e27375be0b37e0ede46f9bd96.zip
opie-a0e3407973f1383e27375be0b37e0ede46f9bd96.tar.gz
opie-a0e3407973f1383e27375be0b37e0ede46f9bd96.tar.bz2
minor tweaks to the keyboard driver. i'm still not satisfied though, but
i'll stop now until we have a broader testing audience. eventually that whole stuff must be done in the kernel as part of the new input layer!
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--qt/qte234-for-opie091-simpad.patch25
1 files changed, 8 insertions, 17 deletions
diff --git a/qt/qte234-for-opie091-simpad.patch b/qt/qte234-for-opie091-simpad.patch
index 5959469..e4af4f7 100644
--- a/qt/qte234-for-opie091-simpad.patch
+++ b/qt/qte234-for-opie091-simpad.patch
@@ -19,33 +19,33 @@
#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) {
+ if ((mouseFD = open( "/dev/touchscreen/ucb1x00", O_RDONLY | O_NONBLOCK /*O_NDELAY*/)) < 0) {
# else
if ((mouseFD = open( "/dev/h3600_ts", O_RDONLY | O_NDELAY)) < 0) {
# endif
--- 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
@@ -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
@@ -81,80 +81,71 @@
+
+ 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
-@@ -396,7 +450,7 @@
- for the list of codes).
- <li>\a modifiers is the set of modifier keys (see Qt::Modifier).
- <li>\a isPress says whether this is a press or a release.
-- <li>\a autoRepeat says whether this event was generated by an auto-repeat
-+ <li>\a time says whether this event was generated by an auto-repeat
- mechanism, or an actual key press.
- </ul>
- */
@@ -1440,7 +1494,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 @@
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()" );
++ 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;
@@ -183,33 +174,33 @@
+ /**
+ * 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;
+ lastCode = code;
+ }
+ else
+ {
+ int interval = eventTimer.restart();
+ qDebug( "event interval = %d", interval );
-+ if ( code == lastCode && interval < 30 )
++ if ( code == lastCode && interval < 10 )
+ {
+ qDebug( "event interval too small - ignoring bogus event" );
+ qDebug( "did I say i hate buggy kernel drivers? :-D" );
+ return;
+ }
+
+ lastPress = press;
+ lastCode = code;
+ }
+
+ /**
+ * Actually it may also be a hardware problem, but I really don't like
+ * to review kernel code for further inquiry. So just being lazy and
+ * do the workaround in user space :-D
+ **/
+
@@ -274,34 +265,34 @@
+ qDebug( " ... has being used -> doing nothing" );
+ return;
+ }
+ }
+ }
+ else
+ {
+ qDebug( "standard mode - no shift yet..." );
+
+ switch(code)
+ {
+ case SIMPAD_SWITCH_UP: k = Qt::Key_Up; break;
+ case SIMPAD_SWITCH_DOWN: k = Qt::Key_Down; break;
+ case SIMPAD_SWITCH_LEFT: k = Qt::Key_Left; break;
+ case SIMPAD_SWITCH_RIGHT: k = Qt::Key_Right; break;
+
-+ case SIMPAD_SWITCH_UPPER: k=-1; shiftKeyPressed = code; shiftUsed = false; return;
-+ case SIMPAD_SWITCH_LOWER: k=-1; shiftKeyPressed = code; shiftUsed = false; return;
++ 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",