summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--qt/qte234-for-opie091-simpad.patch302
1 files changed, 302 insertions, 0 deletions
diff --git a/qt/qte234-for-opie091-simpad.patch b/qt/qte234-for-opie091-simpad.patch
new file mode 100644
index 0000000..5b892d4
--- a/dev/null
+++ b/qt/qte234-for-opie091-simpad.patch
@@ -0,0 +1,302 @@
1 --- src/kernel/qkeyboard_qws.cpp.origFri May 30 16:05:20 2003
2 +++ src/kernel/qkeyboard_qws.cppFri May 30 16:03:41 2003
3@@ -37,6 +37,7 @@
4 #include <qapplication.h>
5 #include <qsocketnotifier.h>
6 #include <qnamespace.h>
7+#include <qdatetime.h>
8 #include <qtimer.h>
9
10 #include <stdlib.h>
11@@ -131,6 +132,59 @@
12
13 #endif // QNX6
14
15+/*
16+ * SIMpad switches handler
17+ * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
18+ */
19+
20+//TODO: guard this against inclusion with #ifdef QT_QWS_SIMPAD
21+
22+#include <linux/switches.h>
23+#define SIMPAD_SWITCHES_DEVICE "/dev/misc/switches"
24+
25+// switches from left top to right down over the SIMpad surface
26+
27+#define SIMPAD_SWITCH_POWER 0x02
28+#define SIMPAD_SWITCH_UPPER 0x10
29+#define SIMPAD_SWITCH_UP 0x20
30+#define SIMPAD_SWITCH_DOWN 0x40
31+#define SIMPAD_SWITCH_LEFT 0x80
32+#define SIMPAD_SWITCH_RIGHT 0x100
33+#define SIMPAD_SWITCH_LOWER 0x8
34+
35+class QWSsimpadButtonsHandler : public QWSKeyboardHandler
36+{
37+ Q_OBJECT
38+
39+ public:
40+ QWSsimpadButtonsHandler();
41+ virtual ~QWSsimpadButtonsHandler();
42+
43+ bool isOpen() { return fd > 0; }
44+
45+ private slots:
46+ void readSwitchesData();
47+ void autoRepeat();
48+
49+ private:
50+ switches_mask_t switches;
51+
52+ int fd;
53+ int repeatdelay;
54+ int repeatperiod;
55+
56+ int lastCode; // last native code
57+ int lastPress; // last press/release state
58+
59+ int k; // last emitted Qt key code
60+ int shiftKeyPressed; // true if one of the SHIFT keys has been pressed and not yet released
61+ bool shiftUsed; // true if SHIFT has been used
62+
63+ QTime eventTimer; // tracks time between raw events
64+ QTimer* repeater;
65+ QSocketNotifier *notifier;
66+};
67+
68 #ifdef QT_QWS_SL5XXX
69 static const QWSServer::KeyMap keyM[] = {
70 { Qt::Key_unknown,0xffff , 0xffff , 0xffff }, // 00
71@@ -1440,7 +1494,11 @@
72 } else {
73 type = spec;
74 }
75-
76+ if ( type == "SIMpad" )
77+ {
78+ qDebug( "QWSKeyboardHandler: using SIMpad keyboard handler..." );
79+ handler = new QWSsimpadButtonsHandler();
80+ }
81 if ( type == "Buttons" ) {
82 #if defined(QT_QWS_YOPY)
83 handler = new QWSyopyButtonsHandler();
84@@ -1469,6 +1527,217 @@
85 return keyM;
86 }
87
88-#endif // QT_NO_QWS_KEYBOARD
89
90+/*
91+ * SIMpad switches handler
92+ * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
93+ */
94+
95+
96+QWSsimpadButtonsHandler::QWSsimpadButtonsHandler()
97+ :QWSKeyboardHandler(), fd( -1 ),
98+ repeatdelay( 700 ), repeatperiod( 80 ),
99+ lastCode( 0 ), lastPress( 0 ),
100+ k( -1 ), shiftKeyPressed( 0 ), shiftUsed( false )
101+{
102+ qDebug( "SimpadButtonsHandler() - V4.1" );
103+ fd = ::open( SIMPAD_SWITCHES_DEVICE, O_RDWR | O_NDELAY, 0 );
104+ if ( fd < 0 )
105+ {
106+ qWarning( "SimpadButtonsHandler(): can't open %s", SIMPAD_SWITCHES_DEVICE );
107+ return;
108+ }
109
110+ notifier = new QSocketNotifier( fd, QSocketNotifier::Read, this );
111+ connect( notifier, SIGNAL( activated(int) ),this, SLOT( readSwitchesData() ) );
112+
113+ repeater = new QTimer(this);
114+ connect(repeater, SIGNAL(timeout()), this, SLOT(autoRepeat()));
115+
116+}
117+
118+
119+QWSsimpadButtonsHandler::~QWSsimpadButtonsHandler()
120+{
121+ qDebug( "~SimpadButtonsHandler()" );
122+ if ( fd > 0 )
123+ {
124+ ::close( fd );
125+ fd = -1;
126+ }
127+}
128+
129+
130+void QWSsimpadButtonsHandler::readSwitchesData()
131+{
132+ qDebug( "SimpadButtonsHandler() - detected switches action" );
133+
134+ if ( ::read( fd, &switches, sizeof switches ) < 0 )
135+ {
136+ qWarning( "SimpadButtonsHandler() - switches read error!" );
137+ return;
138+ }
139+
140+ qDebug( "SimpadButtonsHandler() - Shift: %0x [used: %0x] + Event = %0x | %0x",
141+ shiftKeyPressed, shiftUsed, switches.events[0], switches.states[0] );
142+
143+ bool press = switches.states[0]; // == switches.event[0];
144+ int code = switches.events[0];
145+
146+ //=========================================================================
147+
148+ /**
149+ * Work around a bug in the kernel keyboard driver emitting
150+ * bogus events when pressing multiple switches at once
151+ **/
152+
153+ if ( lastCode == 0 )
154+ {
155+ // first press ever
156+ eventTimer.start();
157+ lastPress = press;
158+ lastCode = code;
159+ }
160+ else
161+ {
162+ int interval = eventTimer.restart();
163+ qDebug( "event interval = %d", interval );
164+ if ( code == lastCode && interval < 10 )
165+ {
166+ qDebug( "event interval too small - ignoring bogus event" );
167+ qDebug( "did I say i hate buggy kernel drivers? :-D" );
168+ return;
169+ }
170+
171+ lastPress = press;
172+ lastCode = code;
173+ }
174+
175+ /**
176+ * Actually it may also be a hardware problem, but I really don't like
177+ * to review kernel code for further inquiry. So just being lazy and
178+ * do the workaround in user space :-D
179+ **/
180+
181+ //=====================================================================
182+
183+ if ( shiftKeyPressed )
184+ {
185+ // a shift key obviously is being held
186+ qDebug( "while shift key is being held..." );
187+
188+ if ( code != shiftKeyPressed )
189+ {
190+ // another key is being touched - that means shift mode for us!
191+ qDebug( " another key is being touched -> shift use now = true" );
192+
193+ shiftUsed = true;
194+
195+ if ( shiftKeyPressed == SIMPAD_SWITCH_LOWER ) // SHIFT 1
196+ {
197+ qDebug( " shift mode 1" );
198+ switch(code)
199+ {
200+ case SIMPAD_SWITCH_UP: k = Qt::Key_F9; break; // Shift1-Up = Calendar
201+ case SIMPAD_SWITCH_DOWN: k = Qt::Key_F10; break; // Shift1-Down = Contacts
202+ case SIMPAD_SWITCH_LEFT: k = Qt::Key_F13; break; // Shift1-Left = Mail
203+ case SIMPAD_SWITCH_RIGHT: k = Qt::Key_F11; break; // Shift1-Up = Menu
204+ case SIMPAD_SWITCH_UPPER: k = Qt::Key_F12; break; // Shift1-Upper = Home
205+ default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event for Shift 1 !" ); break;
206+ }
207+ }
208+ else if ( shiftKeyPressed == SIMPAD_SWITCH_UPPER ) // SHIFT 2
209+ {
210+ qDebug( " shift mode 2" );
211+ switch(code)
212+ {
213+ case SIMPAD_SWITCH_UP: k = Qt::Key_F5; break; // Shift2-Up = F5
214+ case SIMPAD_SWITCH_DOWN: k = Qt::Key_F6; break; // Shift2-Down = F6
215+ case SIMPAD_SWITCH_LEFT: k = Qt::Key_F7; break; // Shift2-Left = F7
216+ case SIMPAD_SWITCH_RIGHT: k = Qt::Key_F8; break; // Shift2-Up = F8
217+ case SIMPAD_SWITCH_LOWER: k = Qt::Key_F9; break; // Shift2-Lower = F9
218+ default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event for Shift 2!" ); break;
219+ }
220+ }
221+ }
222+ else
223+ {
224+ qDebug( " shift key has been released. checking if being used..." );
225+ shiftKeyPressed = 0;
226+
227+ if ( !shiftUsed )
228+ {
229+ qDebug( " ... has _not_ being used -> really emit the key" );
230+ k = ( code == SIMPAD_SWITCH_UPPER ? Qt::Key_Escape : Qt::Key_Return );
231+ qDebug( "Emitting key = %d (pressed)", k );
232+ processKeyEvent( 0, k, 0, true, true );
233+ qDebug( "Emitting key = %d (released)", k );
234+ processKeyEvent( 0, k, 0, false, true );
235+ return;
236+ }
237+ else
238+ {
239+ qDebug( " ... has being used -> doing nothing" );
240+ return;
241+ }
242+ }
243+ }
244+ else
245+ {
246+ qDebug( "standard mode - no shift yet..." );
247+
248+ switch(code)
249+ {
250+ case SIMPAD_SWITCH_UP: k = Qt::Key_Up; break;
251+ case SIMPAD_SWITCH_DOWN: k = Qt::Key_Down; break;
252+ case SIMPAD_SWITCH_LEFT: k = Qt::Key_Left; break;
253+ case SIMPAD_SWITCH_RIGHT: k = Qt::Key_Right; break;
254+
255+ case SIMPAD_SWITCH_UPPER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
256+ case SIMPAD_SWITCH_LOWER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
257+
258+ default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event!" ); break;
259+ }
260+ }
261+
262+ if ( k == -1 )
263+ {
264+ qDebug( "no key to emit - returning." );
265+ return;
266+ }
267+
268+ bool repeatable = ( k == Qt::Key_Up || k == Qt::Key_Down ||
269+ k == Qt::Key_Right || k == Qt::Key_Left );
270+
271+ qDebug( "key to emit = %d [%s] [repeat=%s]", k,
272+ press ? "press" : "release",
273+ repeatable ? "true":"false" );
274+
275+ if ( qt_screen->isTransformed() && k >= Qt::Key_Left && k <= Qt::Key_Down )
276+ {
277+ qDebug( "SimpadButtonsHandler() - We are transformed! Correcting..." );
278+ int oldK = k;
279+ k = xform_dirkey( k );
280+ qDebug( "SimpadButtonsHandler() - Old Key: %d - New Key %d", oldK, k );
281+ }
282+
283+ if ( repeatable && press )
284+ repeater->start( repeatdelay, true );
285+ else
286+ repeater->stop();
287+
288+ qwsServer->processKeyEvent( 0, k, 0, press, false );
289+}
290+
291+
292+void QWSsimpadButtonsHandler::autoRepeat()
293+{
294+ qDebug( "Emitting key = %d (released)", k );
295+ processKeyEvent( 0, k, 0, false, true );
296+ qDebug( "Emitting key = %d (pressed)", k );
297+ processKeyEvent( 0, k, 0, true, true );
298+ repeater->start(repeatperiod);
299+}
300+
301+
302+#endif // QT_NO_QWS_KEYBOARD