summaryrefslogtreecommitdiff
Unidiff
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
@@ -11,49 +11,49 @@
11 unsigned short x; 11 unsigned short x;
12 unsigned short y; 12 unsigned short y;
13 unsigned short pad; 13 unsigned short pad;
14+ struct timeval stamp; 14+ struct timeval stamp;
15 } TS_EVENT; 15 } TS_EVENT;
16 #elif defined(QT_QWS_SL5XXX) 16 #elif defined(QT_QWS_SL5XXX)
17 #define QT_QWS_SL5XXX_RAW 17 #define QT_QWS_SL5XXX_RAW
18@@ -1241,7 +1243,7 @@ 18@@ -1241,7 +1243,7 @@
19 #if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) 19 #if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX)
20 #if defined(QT_QWS_IPAQ) 20 #if defined(QT_QWS_IPAQ)
21 # ifdef QT_QWS_IPAQ_RAW 21 # ifdef QT_QWS_IPAQ_RAW
22- if ((mouseFD = open( "/dev/h3600_tsraw", O_RDONLY | O_NDELAY)) < 0) { 22- if ((mouseFD = open( "/dev/h3600_tsraw", O_RDONLY | O_NDELAY)) < 0) {
23+ if ((mouseFD = open( "/dev/touchscreen/ucb1x00", O_RDONLY | O_NONBLOCK /*O_NDELAY*/)) < 0) { 23+ if ((mouseFD = open( "/dev/touchscreen/ucb1x00", O_RDONLY | O_NONBLOCK /*O_NDELAY*/)) < 0) {
24 # else 24 # else
25 if ((mouseFD = open( "/dev/h3600_ts", O_RDONLY | O_NDELAY)) < 0) { 25 if ((mouseFD = open( "/dev/h3600_ts", O_RDONLY | O_NDELAY)) < 0) {
26 # endif 26 # endif
27 --- src/kernel/qkeyboard_qws.cpp.origFri May 30 16:05:20 2003 27 --- src/kernel/qkeyboard_qws.cpp.origFri May 30 16:05:20 2003
28 +++ src/kernel/qkeyboard_qws.cppFri May 30 16:03:41 2003 28 +++ src/kernel/qkeyboard_qws.cppFri May 30 16:03:41 2003
29@@ -37,6 +37,7 @@ 29@@ -37,6 +37,7 @@
30 #include <qapplication.h> 30 #include <qapplication.h>
31 #include <qsocketnotifier.h> 31 #include <qsocketnotifier.h>
32 #include <qnamespace.h> 32 #include <qnamespace.h>
33+#include <qdatetime.h> 33+#include <qdatetime.h>
34 #include <qtimer.h> 34 #include <qtimer.h>
35 35
36 #include <stdlib.h> 36 #include <stdlib.h>
37@@ -131,6 +132,59 @@ 37@@ -131,6 +132,59 @@
38 38
39 #endif // QNX6 39 #endif // QNX6
40 40
41+/* 41+/*
42+ * SIMpad switches handler 42+ * SIMpad switches handler
43+ * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 43+ * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
44+ */ 44+ */
45+ 45+
46+//TODO: guard this against inclusion with #ifdef QT_QWS_SIMPAD 46+//TODO: guard this against inclusion with #ifdef QT_QWS_SIMPAD
47+ 47+
48+#include <linux/switches.h> 48+#include <linux/switches.h>
49+#define SIMPAD_SWITCHES_DEVICE "/dev/misc/switches" 49+#define SIMPAD_SWITCHES_DEVICE "/dev/misc/switches"
50+ 50+
51+// switches from left top to right down over the SIMpad surface 51+// switches from left top to right down over the SIMpad surface
52+ 52+
53+#define SIMPAD_SWITCH_POWER 0x02 53+#define SIMPAD_SWITCH_POWER 0x02
54+#define SIMPAD_SWITCH_UPPER 0x10 54+#define SIMPAD_SWITCH_UPPER 0x10
55+#define SIMPAD_SWITCH_UP 0x20 55+#define SIMPAD_SWITCH_UP 0x20
56+#define SIMPAD_SWITCH_DOWN 0x40 56+#define SIMPAD_SWITCH_DOWN 0x40
57+#define SIMPAD_SWITCH_LEFT 0x80 57+#define SIMPAD_SWITCH_LEFT 0x80
58+#define SIMPAD_SWITCH_RIGHT 0x100 58+#define SIMPAD_SWITCH_RIGHT 0x100
59+#define SIMPAD_SWITCH_LOWER 0x8 59+#define SIMPAD_SWITCH_LOWER 0x8
@@ -73,96 +73,87 @@
73+ void autoRepeat(); 73+ void autoRepeat();
74+ 74+
75+ private: 75+ private:
76+ switches_mask_t switches; 76+ switches_mask_t switches;
77+ 77+
78+ int fd; 78+ int fd;
79+ int repeatdelay; 79+ int repeatdelay;
80+ int repeatperiod; 80+ int repeatperiod;
81+ 81+
82+ int lastCode; // last native code 82+ int lastCode; // last native code
83+ int lastPress; // last press/release state 83+ int lastPress; // last press/release state
84+ 84+
85+ int k; // last emitted Qt key code 85+ int k; // last emitted Qt key code
86+ int shiftKeyPressed; // true if one of the SHIFT keys has been pressed and not yet released 86+ int shiftKeyPressed; // true if one of the SHIFT keys has been pressed and not yet released
87+ bool shiftUsed; // true if SHIFT has been used 87+ bool shiftUsed; // true if SHIFT has been used
88+ 88+
89+ QTime eventTimer; // tracks time between raw events 89+ QTime eventTimer; // tracks time between raw events
90+ QTimer* repeater; 90+ QTimer* repeater;
91+ QSocketNotifier *notifier; 91+ QSocketNotifier *notifier;
92+}; 92+};
93+ 93+
94 #ifdef QT_QWS_SL5XXX 94 #ifdef QT_QWS_SL5XXX
95 static const QWSServer::KeyMap keyM[] = { 95 static const QWSServer::KeyMap keyM[] = {
96 { Qt::Key_unknown,0xffff , 0xffff , 0xffff }, // 00 96 { Qt::Key_unknown,0xffff , 0xffff , 0xffff }, // 00
97@@ -396,7 +450,7 @@
98 for the list of codes).
99 <li>\a modifiers is the set of modifier keys (see Qt::Modifier).
100 <li>\a isPress says whether this is a press or a release.
101- <li>\a autoRepeat says whether this event was generated by an auto-repeat
102+ <li>\a time says whether this event was generated by an auto-repeat
103 mechanism, or an actual key press.
104 </ul>
105 */
106@@ -1440,7 +1494,11 @@ 97@@ -1440,7 +1494,11 @@
107 } else { 98 } else {
108 type = spec; 99 type = spec;
109 } 100 }
110- 101-
111+ if ( type == "SIMpad" ) 102+ if ( type == "SIMpad" )
112+ { 103+ {
113+ qDebug( "QWSKeyboardHandler: using SIMpad keyboard handler..." ); 104+ qDebug( "QWSKeyboardHandler: using SIMpad keyboard handler..." );
114+ handler = new QWSsimpadButtonsHandler(); 105+ handler = new QWSsimpadButtonsHandler();
115+ } 106+ }
116 if ( type == "Buttons" ) { 107 if ( type == "Buttons" ) {
117 #if defined(QT_QWS_YOPY) 108 #if defined(QT_QWS_YOPY)
118 handler = new QWSyopyButtonsHandler(); 109 handler = new QWSyopyButtonsHandler();
119@@ -1469,6 +1527,217 @@ 110@@ -1469,6 +1527,217 @@
120 return keyM; 111 return keyM;
121 } 112 }
122 113
123-#endif // QT_NO_QWS_KEYBOARD 114-#endif // QT_NO_QWS_KEYBOARD
124 115
125+/* 116+/*
126+ * SIMpad switches handler 117+ * SIMpad switches handler
127+ * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 118+ * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
128+ */ 119+ */
129+ 120+
130+ 121+
131+QWSsimpadButtonsHandler::QWSsimpadButtonsHandler() 122+QWSsimpadButtonsHandler::QWSsimpadButtonsHandler()
132+ :QWSKeyboardHandler(), fd( -1 ), 123+ :QWSKeyboardHandler(), fd( -1 ),
133+ repeatdelay( 700 ), repeatperiod( 80 ), 124+ repeatdelay( 700 ), repeatperiod( 80 ),
134+ lastCode( 0 ), lastPress( 0 ), 125+ lastCode( 0 ), lastPress( 0 ),
135+ k( -1 ), shiftKeyPressed( 0 ), shiftUsed( false ) 126+ k( -1 ), shiftKeyPressed( 0 ), shiftUsed( false )
136+{ 127+{
137+ qDebug( "SimpadButtonsHandler()" ); 128+ qDebug( "SimpadButtonsHandler() - V4.1" );
138+ fd = ::open( SIMPAD_SWITCHES_DEVICE, O_RDWR | O_NDELAY, 0 ); 129+ fd = ::open( SIMPAD_SWITCHES_DEVICE, O_RDWR | O_NDELAY, 0 );
139+ if ( fd < 0 ) 130+ if ( fd < 0 )
140+ { 131+ {
141+ qWarning( "SimpadButtonsHandler(): can't open %s", SIMPAD_SWITCHES_DEVICE ); 132+ qWarning( "SimpadButtonsHandler(): can't open %s", SIMPAD_SWITCHES_DEVICE );
142+ return; 133+ return;
143+ } 134+ }
144 135
145+ notifier = new QSocketNotifier( fd, QSocketNotifier::Read, this ); 136+ notifier = new QSocketNotifier( fd, QSocketNotifier::Read, this );
146+ connect( notifier, SIGNAL( activated(int) ),this, SLOT( readSwitchesData() ) ); 137+ connect( notifier, SIGNAL( activated(int) ),this, SLOT( readSwitchesData() ) );
147+ 138+
148+ repeater = new QTimer(this); 139+ repeater = new QTimer(this);
149+ connect(repeater, SIGNAL(timeout()), this, SLOT(autoRepeat())); 140+ connect(repeater, SIGNAL(timeout()), this, SLOT(autoRepeat()));
150+ 141+
151+} 142+}
152+ 143+
153+ 144+
154+QWSsimpadButtonsHandler::~QWSsimpadButtonsHandler() 145+QWSsimpadButtonsHandler::~QWSsimpadButtonsHandler()
155+{ 146+{
156+ qDebug( "~SimpadButtonsHandler()" ); 147+ qDebug( "~SimpadButtonsHandler()" );
157+ if ( fd > 0 ) 148+ if ( fd > 0 )
158+ { 149+ {
159+ ::close( fd ); 150+ ::close( fd );
160+ fd = -1; 151+ fd = -1;
161+ } 152+ }
162+} 153+}
163+ 154+
164+ 155+
165+void QWSsimpadButtonsHandler::readSwitchesData() 156+void QWSsimpadButtonsHandler::readSwitchesData()
166+{ 157+{
167+ qDebug( "SimpadButtonsHandler() - detected switches action" ); 158+ qDebug( "SimpadButtonsHandler() - detected switches action" );
168+ 159+
@@ -175,49 +166,49 @@
175+ qDebug( "SimpadButtonsHandler() - Shift: %0x [used: %0x] + Event = %0x | %0x", 166+ qDebug( "SimpadButtonsHandler() - Shift: %0x [used: %0x] + Event = %0x | %0x",
176+ shiftKeyPressed, shiftUsed, switches.events[0], switches.states[0] ); 167+ shiftKeyPressed, shiftUsed, switches.events[0], switches.states[0] );
177+ 168+
178+ bool press = switches.states[0]; // == switches.event[0]; 169+ bool press = switches.states[0]; // == switches.event[0];
179+ int code = switches.events[0]; 170+ int code = switches.events[0];
180+ 171+
181+ //========================================================================= 172+ //=========================================================================
182+ 173+
183+ /** 174+ /**
184+ * Work around a bug in the kernel keyboard driver emitting 175+ * Work around a bug in the kernel keyboard driver emitting
185+ * bogus events when pressing multiple switches at once 176+ * bogus events when pressing multiple switches at once
186+ **/ 177+ **/
187+ 178+
188+ if ( lastCode == 0 ) 179+ if ( lastCode == 0 )
189+ { 180+ {
190+ // first press ever 181+ // first press ever
191+ eventTimer.start(); 182+ eventTimer.start();
192+ lastPress = press; 183+ lastPress = press;
193+ lastCode = code; 184+ lastCode = code;
194+ } 185+ }
195+ else 186+ else
196+ { 187+ {
197+ int interval = eventTimer.restart(); 188+ int interval = eventTimer.restart();
198+ qDebug( "event interval = %d", interval ); 189+ qDebug( "event interval = %d", interval );
199+ if ( code == lastCode && interval < 30 ) 190+ if ( code == lastCode && interval < 10 )
200+ { 191+ {
201+ qDebug( "event interval too small - ignoring bogus event" ); 192+ qDebug( "event interval too small - ignoring bogus event" );
202+ qDebug( "did I say i hate buggy kernel drivers? :-D" ); 193+ qDebug( "did I say i hate buggy kernel drivers? :-D" );
203+ return; 194+ return;
204+ } 195+ }
205+ 196+
206+ lastPress = press; 197+ lastPress = press;
207+ lastCode = code; 198+ lastCode = code;
208+ } 199+ }
209+ 200+
210+ /** 201+ /**
211+ * Actually it may also be a hardware problem, but I really don't like 202+ * Actually it may also be a hardware problem, but I really don't like
212+ * to review kernel code for further inquiry. So just being lazy and 203+ * to review kernel code for further inquiry. So just being lazy and
213+ * do the workaround in user space :-D 204+ * do the workaround in user space :-D
214+ **/ 205+ **/
215+ 206+
216+ //===================================================================== 207+ //=====================================================================
217+ 208+
218+ if ( shiftKeyPressed ) 209+ if ( shiftKeyPressed )
219+ { 210+ {
220+ // a shift key obviously is being held 211+ // a shift key obviously is being held
221+ qDebug( "while shift key is being held..." ); 212+ qDebug( "while shift key is being held..." );
222+ 213+
223+ if ( code != shiftKeyPressed ) 214+ if ( code != shiftKeyPressed )
@@ -266,50 +257,50 @@
266+ qDebug( "Emitting key = %d (pressed)", k ); 257+ qDebug( "Emitting key = %d (pressed)", k );
267+ processKeyEvent( 0, k, 0, true, true ); 258+ processKeyEvent( 0, k, 0, true, true );
268+ qDebug( "Emitting key = %d (released)", k ); 259+ qDebug( "Emitting key = %d (released)", k );
269+ processKeyEvent( 0, k, 0, false, true ); 260+ processKeyEvent( 0, k, 0, false, true );
270+ return; 261+ return;
271+ } 262+ }
272+ else 263+ else
273+ { 264+ {
274+ qDebug( " ... has being used -> doing nothing" ); 265+ qDebug( " ... has being used -> doing nothing" );
275+ return; 266+ return;
276+ } 267+ }
277+ } 268+ }
278+ } 269+ }
279+ else 270+ else
280+ { 271+ {
281+ qDebug( "standard mode - no shift yet..." ); 272+ qDebug( "standard mode - no shift yet..." );
282+ 273+
283+ switch(code) 274+ switch(code)
284+ { 275+ {
285+ case SIMPAD_SWITCH_UP: k = Qt::Key_Up; break; 276+ case SIMPAD_SWITCH_UP: k = Qt::Key_Up; break;
286+ case SIMPAD_SWITCH_DOWN: k = Qt::Key_Down; break; 277+ case SIMPAD_SWITCH_DOWN: k = Qt::Key_Down; break;
287+ case SIMPAD_SWITCH_LEFT: k = Qt::Key_Left; break; 278+ case SIMPAD_SWITCH_LEFT: k = Qt::Key_Left; break;
288+ case SIMPAD_SWITCH_RIGHT: k = Qt::Key_Right; break; 279+ case SIMPAD_SWITCH_RIGHT: k = Qt::Key_Right; break;
289+ 280+
290+ case SIMPAD_SWITCH_UPPER: k=-1; shiftKeyPressed = code; shiftUsed = false; return; 281+ case SIMPAD_SWITCH_UPPER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
291+ case SIMPAD_SWITCH_LOWER: k=-1; shiftKeyPressed = code; shiftUsed = false; return; 282+ case SIMPAD_SWITCH_LOWER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
292+ 283+
293+ default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event!" ); break; 284+ default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event!" ); break;
294+ } 285+ }
295+ } 286+ }
296+ 287+
297+ if ( k == -1 ) 288+ if ( k == -1 )
298+ { 289+ {
299+ qDebug( "no key to emit - returning." ); 290+ qDebug( "no key to emit - returning." );
300+ return; 291+ return;
301+ } 292+ }
302+ 293+
303+ bool repeatable = ( k == Qt::Key_Up || k == Qt::Key_Down || 294+ bool repeatable = ( k == Qt::Key_Up || k == Qt::Key_Down ||
304+ k == Qt::Key_Right || k == Qt::Key_Left ); 295+ k == Qt::Key_Right || k == Qt::Key_Left );
305+ 296+
306+ qDebug( "key to emit = %d [%s] [repeat=%s]", k, 297+ qDebug( "key to emit = %d [%s] [repeat=%s]", k,
307+ press ? "press" : "release", 298+ press ? "press" : "release",
308+ repeatable ? "true":"false" ); 299+ repeatable ? "true":"false" );
309+ 300+
310+ if ( qt_screen->isTransformed() && k >= Qt::Key_Left && k <= Qt::Key_Down ) 301+ if ( qt_screen->isTransformed() && k >= Qt::Key_Left && k <= Qt::Key_Down )
311+ { 302+ {
312+ qDebug( "SimpadButtonsHandler() - We are transformed! Correcting..." ); 303+ qDebug( "SimpadButtonsHandler() - We are transformed! Correcting..." );
313+ int oldK = k; 304+ int oldK = k;
314+ k = xform_dirkey( k ); 305+ k = xform_dirkey( k );
315+ qDebug( "SimpadButtonsHandler() - Old Key: %d - New Key %d", oldK, k ); 306+ qDebug( "SimpadButtonsHandler() - Old Key: %d - New Key %d", oldK, k );