3 # Patch managed by http://www.holgerschurig.de/patcher.html
6 --- qt-2.3.10/src/kernel/qkeyboard_qws.cpp~simpad.patch
7 +++ qt-2.3.10/src/kernel/qkeyboard_qws.cpp
9 #include <qapplication.h>
10 #include <qsocketnotifier.h>
11 #include <qnamespace.h>
12 +#include <qdatetime.h>
21 + * SIMpad switches handler
22 + * (C) 2003-2005 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
27 +#include <linux/switches.h>
28 +#define SIMPAD_SWITCHES_DEVICE "/dev/misc/switches"
30 +// switches from left top to right down over the SIMpad surface
32 +#define SIMPAD_SWITCH_POWER 0x02
33 +#define SIMPAD_SWITCH_UPPER 0x10
34 +#define SIMPAD_SWITCH_UP 0x20
35 +#define SIMPAD_SWITCH_DOWN 0x40
36 +#define SIMPAD_SWITCH_LEFT 0x80
37 +#define SIMPAD_SWITCH_RIGHT 0x100
38 +#define SIMPAD_SWITCH_LOWER 0x8
40 +class QWSsimpadButtonsHandler : public QWSKeyboardHandler
45 + QWSsimpadButtonsHandler();
46 + virtual ~QWSsimpadButtonsHandler();
48 + bool isOpen() { return fd > 0; }
51 + void readSwitchesData();
55 + switches_mask_t switches;
61 + int lastCode; // last native code
62 + int lastPress; // last press/release state
64 + int k; // last emitted Qt key code
65 + int shiftKeyPressed; // true if one of the SHIFT keys has been pressed and not yet released
66 + bool shiftUsed; // true if SHIFT has been used
68 + QTime eventTimer; // tracks time between raw events
70 + QSocketNotifier *notifier;
75 #include <asm/sharp_char.h>
81 - void setAutoRepeat(int d, int p) { if ( d > 0 ) repeatdelay=d;
82 + void setAutoRepeat(int d, int p) { if ( d > 0 ) repeatdelay=d;
83 if ( p > 0 ) repeatperiod=p;}
84 - void getAutoRepeat(int *d ,int *p ) { if (d) *d=repeatdelay;
85 + void getAutoRepeat(int *d ,int *p ) { if (d) *d=repeatdelay;
86 if (p) *p=repeatperiod; }
91 void doKey(uchar scancode);
103 #if !defined(QT_QWS_SL5XXX)
105 -#if defined(QT_QWS_IPAQ)
106 +#if defined(QT_QWS_IPAQ)
107 && !ipaq_return_pressed
110 @@ -1775,9 +1830,11 @@
115 if ( type == "Buttons" ) {
116 -#if defined(QT_QWS_YOPY)
117 +#if defined(QT_QWS_SIMPAD)
118 + qDebug( "QWSKeyboardHandler: using SIMpad switches handler..." );
119 + handler = new QWSsimpadButtonsHandler();
120 +#elif defined(QT_QWS_YOPY)
121 handler = new QWSyopyButtonsHandler();
122 #elif defined(QT_QWS_CASSIOPEIA)
123 handler = new QWSVr41xxButtonsHandler();
124 @@ -1812,6 +1869,218 @@
128 -#endif // QT_NO_QWS_KEYBOARD
131 + * SIMpad switches handler
132 + * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
136 +QWSsimpadButtonsHandler::QWSsimpadButtonsHandler()
137 + :QWSKeyboardHandler(), fd( -1 ),
138 + repeatdelay( 700 ), repeatperiod( 80 ),
139 + lastCode( 0 ), lastPress( 0 ),
140 + k( -1 ), shiftKeyPressed( 0 ), shiftUsed( false )
142 + qDebug( "SimpadButtonsHandler() - V4.1" );
143 + fd = ::open( SIMPAD_SWITCHES_DEVICE, O_RDWR | O_NDELAY, 0 );
146 + qWarning( "SimpadButtonsHandler(): can't open %s", SIMPAD_SWITCHES_DEVICE );
150 + notifier = new QSocketNotifier( fd, QSocketNotifier::Read, this );
151 + connect( notifier, SIGNAL( activated(int) ),this, SLOT( readSwitchesData() ) );
153 + repeater = new QTimer(this);
154 + connect(repeater, SIGNAL(timeout()), this, SLOT(autoRepeat()));
159 +QWSsimpadButtonsHandler::~QWSsimpadButtonsHandler()
161 + qDebug( "~SimpadButtonsHandler()" );
170 +void QWSsimpadButtonsHandler::readSwitchesData()
172 + qDebug( "SimpadButtonsHandler() - detected switches action" );
174 + if ( ::read( fd, &switches, sizeof switches ) < 0 )
176 + qWarning( "SimpadButtonsHandler() - switches read error!" );
180 + qDebug( "SimpadButtonsHandler() - Shift: %0x [used: %0x] + Event = %0x | %0x",
181 + shiftKeyPressed, shiftUsed, switches.events[0], switches.states[0] );
183 + bool press = switches.states[0]; // == switches.event[0];
184 + int code = switches.events[0];
186 + //=========================================================================
189 + * Work around a bug in the kernel keyboard driver emitting
190 + * bogus events when pressing multiple switches at once
193 + if ( lastCode == 0 )
195 + // first press ever
196 + eventTimer.start();
202 + int interval = eventTimer.restart();
203 + qDebug( "event interval = %d", interval );
204 + if ( code == lastCode && interval < 10 )
206 + qDebug( "event interval too small - ignoring bogus event" );
207 + qDebug( "did I say i hate buggy kernel drivers? :-D" );
216 + * Actually it may also be a hardware problem, but I really don't like
217 + * to review kernel code for further inquiry. So just being lazy and
218 + * do the workaround in user space :-D
221 + //=====================================================================
223 + if ( shiftKeyPressed )
225 + // a shift key obviously is being held
226 + qDebug( "while shift key is being held..." );
228 + if ( code != shiftKeyPressed )
230 + // another key is being touched - that means shift mode for us!
231 + qDebug( " another key is being touched -> shift use now = true" );
235 + if ( shiftKeyPressed == SIMPAD_SWITCH_LOWER ) // SHIFT 1
237 + qDebug( " shift mode 1" );
240 + case SIMPAD_SWITCH_UP: k = Qt::Key_F9; break; // Shift1-Up = Calendar
241 + case SIMPAD_SWITCH_DOWN: k = Qt::Key_F10; break; // Shift1-Down = Contacts
242 + case SIMPAD_SWITCH_LEFT: k = Qt::Key_F13; break; // Shift1-Left = Mail
243 + case SIMPAD_SWITCH_RIGHT: k = Qt::Key_F11; break; // Shift1-Up = Menu
244 + case SIMPAD_SWITCH_UPPER: k = Qt::Key_F12; break; // Shift1-Upper = Home
245 + default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event for Shift 1 !" ); break;
248 + else if ( shiftKeyPressed == SIMPAD_SWITCH_UPPER ) // SHIFT 2
250 + qDebug( " shift mode 2" );
253 + case SIMPAD_SWITCH_UP: k = Qt::Key_F5; break; // Shift2-Up = F5
254 + case SIMPAD_SWITCH_DOWN: k = Qt::Key_F6; break; // Shift2-Down = F6
255 + case SIMPAD_SWITCH_LEFT: k = Qt::Key_F7; break; // Shift2-Left = F7
256 + case SIMPAD_SWITCH_RIGHT: k = Qt::Key_F8; break; // Shift2-Up = F8
257 + case SIMPAD_SWITCH_LOWER: k = Qt::Key_F9; break; // Shift2-Lower = F9
258 + default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event for Shift 2!" ); break;
264 + qDebug( " shift key has been released. checking if being used..." );
265 + shiftKeyPressed = 0;
269 + qDebug( " ... has _not_ being used -> really emit the key" );
270 + k = ( code == SIMPAD_SWITCH_UPPER ? Qt::Key_Escape : Qt::Key_Return );
271 + qDebug( "Emitting key = %d (pressed)", k );
272 + processKeyEvent( 0, k, 0, true, true );
273 + qDebug( "Emitting key = %d (released)", k );
274 + processKeyEvent( 0, k, 0, false, true );
279 + qDebug( " ... has being used -> doing nothing" );
286 + qDebug( "standard mode - no shift yet..." );
290 + case SIMPAD_SWITCH_UP: k = Qt::Key_Up; break;
291 + case SIMPAD_SWITCH_DOWN: k = Qt::Key_Down; break;
292 + case SIMPAD_SWITCH_LEFT: k = Qt::Key_Left; break;
293 + case SIMPAD_SWITCH_RIGHT: k = Qt::Key_Right; break;
294 + case SIMPAD_SWITCH_POWER: k = Qt::Key_F34; break; // Power Button
296 + case SIMPAD_SWITCH_UPPER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
297 + case SIMPAD_SWITCH_LOWER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
299 + default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event!" ); break;
305 + qDebug( "no key to emit - returning." );
309 + bool repeatable = ( k == Qt::Key_Up || k == Qt::Key_Down ||
310 + k == Qt::Key_Right || k == Qt::Key_Left );
312 + qDebug( "key to emit = %d [%s] [repeat=%s]", k,
313 + press ? "press" : "release",
314 + repeatable ? "true":"false" );
316 + if ( qt_screen->isTransformed() && k >= Qt::Key_Left && k <= Qt::Key_Down )
318 + qDebug( "SimpadButtonsHandler() - We are transformed! Correcting..." );
320 + k = xform_dirkey( k );
321 + qDebug( "SimpadButtonsHandler() - Old Key: %d - New Key %d", oldK, k );
324 + if ( repeatable && press )
325 + repeater->start( repeatdelay, true );
329 + qwsServer->processKeyEvent( 0, k, 0, press, false );
333 +void QWSsimpadButtonsHandler::autoRepeat()
335 + qDebug( "Emitting key = %d (released)", k );
336 + processKeyEvent( 0, k, 0, false, true );
337 + qDebug( "Emitting key = %d (pressed)", k );
338 + processKeyEvent( 0, k, 0, true, true );
339 + repeater->start(repeatperiod);
343 +#endif // QT_NO_QWS_KEYBOARD
344 --- qt-2.3.10/src/kernel/qwsmouse_qws.cpp~simpad.patch
345 +++ qt-2.3.10/src/kernel/qwsmouse_qws.cpp
349 #include <sys/ioctl.h>
350 +#include <sys/time.h>
351 #include <sys/types.h>
352 #include <sys/stat.h>
358 + struct timeval stamp;
360 #elif defined(QT_QWS_SL5XXX)
361 #define QT_QWS_SL5XXX_RAW
362 @@ -1310,6 +1312,11 @@
366 +#elif defined(QT_QWS_SIMPAD )
367 + if ((mouseFD = open( "/dev/touchscreen/ucb1x00", O_RDONLY | O_NONBLOCK )) < 0) {
368 + qWarning( "Cannot open /dev/touchscreen/ucb1x00 (%s)", strerror(errno));
373 QSocketNotifier *mouseNotifier;
374 @@ -1323,7 +1330,7 @@
376 QTPanelHandlerPrivate::~QTPanelHandlerPrivate()
378 -#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700)
379 +#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) || defined(QT_QWS_SIMPAD)
383 @@ -1331,7 +1338,7 @@
385 void QTPanelHandlerPrivate::readMouseData()
387 -#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700)
388 +#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) || defined(QT_QWS_SIMPAD)
392 @@ -2013,7 +2020,7 @@
393 handler = new QTSLibHandlerPrivate();
394 #elif defined(QT_QWS_YOPY)
395 handler = new QYopyTPanelHandlerPrivate(mouseProtocol,mouseDev);
396 -#elif defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700)
397 +#elif defined(QT_QWS_IPAQ) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_K2) || defined(QT_QWS_SLC700) || defined(QT_QWS_SIMPAD)
398 handler = new QTPanelHandlerPrivate(mouseProtocol,mouseDev);
399 #elif defined(QT_QWS_CASSIOPEIA)
400 handler = new QVrTPanelHandlerPrivate( mouseProtocol, mouseDev );