Merge branch 'org.openembedded.dev' of git@git.openembedded.net:openembedded into...
[openembedded.git] / recipes / qte / qte-2.3.10 / deprecated / simpad.patch
1
2 #
3 # Patch managed by http://www.holgerschurig.de/patcher.html
4 #
5
6 --- qt-2.3.10/src/kernel/qkeyboard_qws.cpp~simpad.patch
7 +++ qt-2.3.10/src/kernel/qkeyboard_qws.cpp
8 @@ -37,6 +37,7 @@
9  #include <qapplication.h>
10  #include <qsocketnotifier.h>
11  #include <qnamespace.h>
12 +#include <qdatetime.h>
13  #include <qtimer.h>
14  
15  #include <stdlib.h>
16 @@ -80,6 +81,60 @@
17  #include <sys/vt.h>
18  #endif
19  
20 +/*
21 + * SIMpad switches handler
22 + * (C) 2003-2005 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
23 + */
24 +
25 +
26 +
27 +#include <linux/switches.h>
28 +#define SIMPAD_SWITCHES_DEVICE "/dev/misc/switches"
29 +
30 +// switches from left top to right down over the SIMpad surface
31 +
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
39 +
40 +class QWSsimpadButtonsHandler : public QWSKeyboardHandler
41 +{
42 +  Q_OBJECT
43 +
44 +  public:
45 +    QWSsimpadButtonsHandler();
46 +    virtual ~QWSsimpadButtonsHandler();
47 +
48 +    bool isOpen() { return fd > 0; }
49 +
50 +  private slots:
51 +    void readSwitchesData();
52 +    void autoRepeat();
53 +
54 +  private:
55 +    switches_mask_t switches;
56 +
57 +    int fd;
58 +    int repeatdelay;
59 +    int repeatperiod;
60 +
61 +    int lastCode;         // last native code
62 +    int lastPress;        // last press/release state
63 +
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
67 +
68 +    QTime eventTimer;     // tracks time between raw events
69 +    QTimer* repeater;
70 +    QSocketNotifier *notifier;
71 +};
72 +
73 +
74  #ifdef QT_QWS_SL5XXX
75  #include <asm/sharp_char.h>
76  #endif
77 @@ -1775,9 +1830,11 @@
78      } else {
79         type = spec;
80      }
81 -
82      if ( type == "Buttons" ) {
83 -#if defined(QT_QWS_YOPY)
84 +#if defined(QT_QWS_SIMPAD)
85 +       qDebug( "QWSKeyboardHandler: using SIMpad switches handler..." );
86 +       handler = new QWSsimpadButtonsHandler();
87 +#elif defined(QT_QWS_YOPY)
88         handler = new QWSyopyButtonsHandler();
89  #elif defined(QT_QWS_CASSIOPEIA)
90         handler = new QWSVr41xxButtonsHandler();
91 @@ -1812,6 +1869,218 @@
92      return keyM;
93  }
94  
95 -#endif // QT_NO_QWS_KEYBOARD
96  
97 +/*
98 + * SIMpad switches handler
99 + * (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
100 + */
101 +
102 +
103 +QWSsimpadButtonsHandler::QWSsimpadButtonsHandler()
104 +                        :QWSKeyboardHandler(), fd( -1 ),
105 +                        repeatdelay( 700 ), repeatperiod( 80 ),
106 +                        lastCode( 0 ), lastPress( 0 ),
107 +                        k( -1 ), shiftKeyPressed( 0 ), shiftUsed( false )
108 +{
109 +    qDebug( "SimpadButtonsHandler() - V4.1" );
110 +    fd = ::open( SIMPAD_SWITCHES_DEVICE, O_RDWR | O_NDELAY, 0 );
111 +    if ( fd < 0 )
112 +    {
113 +        qWarning( "SimpadButtonsHandler(): can't open %s", SIMPAD_SWITCHES_DEVICE );
114 +        return;
115 +    }
116 +
117 +    notifier = new QSocketNotifier( fd, QSocketNotifier::Read, this );
118 +    connect( notifier, SIGNAL( activated(int) ),this, SLOT( readSwitchesData() ) );
119 +
120 +    repeater = new QTimer(this);
121 +    connect(repeater, SIGNAL(timeout()), this, SLOT(autoRepeat()));
122 +
123 +}
124  
125 +
126 +QWSsimpadButtonsHandler::~QWSsimpadButtonsHandler()
127 +{
128 +    qDebug( "~SimpadButtonsHandler()" );
129 +    if ( fd > 0 )
130 +    {
131 +        ::close( fd );
132 +        fd = -1;
133 +    }
134 +}
135 +
136 +
137 +void QWSsimpadButtonsHandler::readSwitchesData()
138 +{
139 +    qDebug( "SimpadButtonsHandler() - detected switches action" );
140 +
141 +    if ( ::read( fd, &switches, sizeof switches ) < 0 )
142 +    {
143 +        qWarning( "SimpadButtonsHandler() - switches read error!" );
144 +        return;
145 +    }
146 +
147 +    qDebug( "SimpadButtonsHandler() - Shift: %0x [used: %0x] + Event = %0x | %0x",
148 +            shiftKeyPressed, shiftUsed, switches.events[0], switches.states[0] );
149 +
150 +    bool press = switches.states[0]; // == switches.event[0];
151 +    int code = switches.events[0];
152 +
153 +    //=========================================================================
154 +
155 +    /**
156 +     * Work around a bug in the kernel keyboard driver emitting
157 +     * bogus events when pressing multiple switches at once
158 +     **/
159 +
160 +    if ( lastCode == 0 )
161 +    {
162 +        // first press ever
163 +        eventTimer.start();
164 +        lastPress = press;
165 +        lastCode = code;
166 +    }
167 +    else
168 +    {
169 +        int interval = eventTimer.restart();
170 +        qDebug( "event interval = %d", interval );
171 +        if ( code == lastCode && interval < 10 )
172 +        {
173 +            qDebug( "event interval too small - ignoring bogus event" );
174 +            qDebug( "did I say i hate buggy kernel drivers? :-D" );
175 +            return;
176 +        }
177 +
178 +        lastPress = press;
179 +        lastCode = code;
180 +    }
181 +
182 +    /**
183 +     * Actually it may also be a hardware problem, but I really don't like
184 +     * to review kernel code for further inquiry. So just being lazy and
185 +     * do the workaround in user space :-D
186 +     **/
187 +
188 +     //=====================================================================
189 +
190 +    if ( shiftKeyPressed )
191 +    {
192 +        // a shift key obviously is being held
193 +        qDebug( "while shift key is being held..." );
194 +
195 +        if ( code != shiftKeyPressed )
196 +        {
197 +            // another key is being touched - that means shift mode for us!
198 +            qDebug( "       another key is being touched -> shift use now = true" );
199 +
200 +            shiftUsed = true;
201 +
202 +            if ( shiftKeyPressed == SIMPAD_SWITCH_LOWER ) // SHIFT 1
203 +            {
204 +                qDebug( "           shift mode 1" );
205 +                switch(code)
206 +                {
207 +                    case SIMPAD_SWITCH_UP:    k = Qt::Key_F9;  break; // Shift1-Up = Calendar
208 +                    case SIMPAD_SWITCH_DOWN:  k = Qt::Key_F10; break; // Shift1-Down = Contacts
209 +                    case SIMPAD_SWITCH_LEFT:  k = Qt::Key_F13; break; // Shift1-Left = Mail
210 +                    case SIMPAD_SWITCH_RIGHT: k = Qt::Key_F11; break; // Shift1-Up = Menu
211 +                    case SIMPAD_SWITCH_UPPER: k = Qt::Key_F12; break; // Shift1-Upper = Home
212 +                    default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event for Shift 1 !" ); break;
213 +                }
214 +            }
215 +            else if ( shiftKeyPressed == SIMPAD_SWITCH_UPPER ) // SHIFT 2
216 +            {
217 +                qDebug( "           shift mode 2" );
218 +                switch(code)
219 +                {
220 +                    case SIMPAD_SWITCH_UP:    k = Qt::Key_F5; break;  // Shift2-Up = F5
221 +                    case SIMPAD_SWITCH_DOWN:  k = Qt::Key_F6; break;  // Shift2-Down = F6
222 +                    case SIMPAD_SWITCH_LEFT:  k = Qt::Key_F7; break;  // Shift2-Left = F7
223 +                    case SIMPAD_SWITCH_RIGHT: k = Qt::Key_F8; break;  // Shift2-Up = F8
224 +                    case SIMPAD_SWITCH_LOWER: k = Qt::Key_F9; break;  // Shift2-Lower = F9
225 +                    default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event for Shift 2!" ); break;
226 +                }
227 +            }
228 +        }
229 +        else
230 +        {
231 +            qDebug( "       shift key has been released. checking if being used..." );
232 +            shiftKeyPressed = 0;
233 +
234 +            if ( !shiftUsed )
235 +            {
236 +                qDebug( "       ... has _not_ being used -> really emit the key" );
237 +                k = ( code == SIMPAD_SWITCH_UPPER ? Qt::Key_Escape : Qt::Key_Return );
238 +                qDebug( "Emitting key = %d (pressed)", k );
239 +                processKeyEvent( 0, k, 0, true, true );
240 +                qDebug( "Emitting key = %d (released)", k );
241 +                processKeyEvent( 0, k, 0, false, true );
242 +                return;
243 +            }
244 +            else
245 +            {
246 +                qDebug( "       ... has being used -> doing nothing" );
247 +                return;
248 +            }
249 +        }
250 +    }
251 +    else
252 +    {
253 +        qDebug( "standard mode - no shift yet..." );
254 +
255 +        switch(code)
256 +        {
257 +            case SIMPAD_SWITCH_UP:    k = Qt::Key_Up;       break;
258 +            case SIMPAD_SWITCH_DOWN:  k = Qt::Key_Down;     break;
259 +            case SIMPAD_SWITCH_LEFT:  k = Qt::Key_Left;     break;
260 +            case SIMPAD_SWITCH_RIGHT: k = Qt::Key_Right;    break;
261 +            case SIMPAD_SWITCH_POWER: k = Qt::Key_F34;      break; // Power Button
262 +
263 +            case SIMPAD_SWITCH_UPPER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
264 +            case SIMPAD_SWITCH_LOWER: k=-1; shiftKeyPressed = press? code:0; shiftUsed = false; qDebug( "shiftkey pressed now = %d", shiftKeyPressed ); return;
265 +
266 +            default: k=-1; qWarning( "SimpadButtonsHandler() - unhandled event!" ); break;
267 +        }
268 +    }
269 +
270 +    if ( k == -1 )
271 +    {
272 +        qDebug( "no key to emit - returning." );
273 +        return;
274 +    }
275 +
276 +    bool repeatable = ( k == Qt::Key_Up || k == Qt::Key_Down ||
277 +                        k == Qt::Key_Right || k == Qt::Key_Left );
278 +
279 +    qDebug( "key to emit = %d [%s] [repeat=%s]", k,
280 +            press ? "press" : "release",
281 +            repeatable ? "true":"false" );
282 +
283 +    if ( qt_screen->isTransformed() && k >= Qt::Key_Left && k <= Qt::Key_Down )
284 +    {
285 +        qDebug( "SimpadButtonsHandler() - We are transformed! Correcting..." );
286 +        int oldK = k;
287 +        k = xform_dirkey( k );
288 +        qDebug( "SimpadButtonsHandler() - Old Key: %d - New Key %d", oldK, k );
289 +    }
290 +
291 +    if ( repeatable && press )
292 +        repeater->start( repeatdelay, true );
293 +    else
294 +        repeater->stop();
295 +
296 +    qwsServer->processKeyEvent( 0, k, 0, press, false );
297 +}
298 +
299 +
300 +void QWSsimpadButtonsHandler::autoRepeat()
301 +{
302 +    qDebug( "Emitting key = %d (released)", k );
303 +    processKeyEvent( 0, k, 0, false, true );
304 +    qDebug( "Emitting key = %d (pressed)", k );
305 +    processKeyEvent( 0, k, 0, true, true );
306 +    repeater->start(repeatperiod);
307 +}
308 +
309 +
310 +#endif // QT_NO_QWS_KEYBOARD
311 --- qt-2.3.10/src/kernel/qwsmouse_qws.cpp~simpad.patch
312 +++ qt-2.3.10/src/kernel/qwsmouse_qws.cpp
313 @@ -47,6 +47,7 @@
314  #include <stdlib.h>
315  #include <stdio.h>
316  #include <sys/ioctl.h>
317 +#include <sys/time.h>
318  #include <sys/types.h>
319  #include <sys/stat.h>
320  #include <fcntl.h>
321 @@ -73,6 +74,7 @@
322          unsigned short x;
323          unsigned short y;
324          unsigned short pad;
325 +        struct timeval stamp;
326  } TS_EVENT;
327  #elif defined(QT_QWS_SL5XXX)
328  #define QT_QWS_SL5XXX_RAW
329 @@ -1310,6 +1312,11 @@
330          return;
331       }
332  # endif
333 +#elif defined(QT_QWS_SIMPAD )
334 +    if ((mouseFD = open( "/dev/touchscreen/ucb1x00", O_RDONLY | O_NONBLOCK )) < 0) {
335 +         qWarning( "Cannot open /dev/touchscreen/ucb1x00 (%s)", strerror(errno));
336 +         return;
337 +    }
338  #endif
339  
340      QSocketNotifier *mouseNotifier;