Fix FS#10867 and a few more potential issues by imitate target scrollwheel behavior...
[kugel-rb.git] / uisimulator / sdl / button.c
blob0f9770dcacb6c605a66ad918e25de3324cd3cd3a
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 by Felix Arends
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "uisdl.h"
23 #include "lcd-charcells.h"
24 #include "lcd-remote.h"
25 #include "config.h"
26 #include "button.h"
27 #include "kernel.h"
28 #include "backlight.h"
29 #include "misc.h"
30 #include "sim_tasks.h"
31 #include "button-sdl.h"
32 #include "backlight.h"
34 #include "debug.h"
36 #ifdef HAVE_TOUCHSCREEN
37 #include "touchscreen.h"
38 static int mouse_coords = 0;
39 #endif
40 /* how long until repeat kicks in */
41 #define REPEAT_START 6
43 /* the speed repeat starts at */
44 #define REPEAT_INTERVAL_START 4
46 /* speed repeat finishes at */
47 #define REPEAT_INTERVAL_FINISH 2
49 #ifdef HAVE_TOUCHSCREEN
50 #define USB_KEY SDLK_c /* SDLK_u is taken by BUTTON_MIDLEFT */
51 #else
52 #define USB_KEY SDLK_u
53 #endif
55 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
56 int _remote_type=REMOTETYPE_H100_LCD;
58 int remote_type(void)
60 return _remote_type;
62 #endif
64 struct event_queue button_queue;
66 static int btn = 0; /* Hopefully keeps track of currently pressed keys... */
68 #ifdef HAS_BUTTON_HOLD
69 bool hold_button_state = false;
70 bool button_hold(void) {
71 return hold_button_state;
73 #endif
75 #ifdef HAS_REMOTE_BUTTON_HOLD
76 bool remote_hold_button_state = false;
77 bool remote_button_hold(void) {
78 return remote_hold_button_state;
80 #endif
82 void button_event(int key, bool pressed)
84 int new_btn = 0;
85 static bool usb_connected = false;
86 if (usb_connected && key != USB_KEY)
87 return;
88 switch (key)
91 #ifdef HAVE_TOUCHSCREEN
92 case BUTTON_TOUCHSCREEN:
93 switch (touchscreen_get_mode())
95 case TOUCHSCREEN_POINT:
96 new_btn = BUTTON_TOUCHSCREEN;
97 break;
98 case TOUCHSCREEN_BUTTON:
100 static int touchscreen_buttons[3][3] = {
101 {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT},
102 {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT},
103 {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT},
105 int px_x = ((mouse_coords&0xffff0000)>>16);
106 int px_y = ((mouse_coords&0x0000ffff));
107 new_btn = touchscreen_buttons[px_y/(LCD_HEIGHT/3)][px_x/(LCD_WIDTH/3)];
108 break;
111 break;
112 case SDLK_KP7:
113 case SDLK_7:
114 new_btn = BUTTON_TOPLEFT;
115 break;
116 case SDLK_KP8:
117 case SDLK_8:
118 case SDLK_UP:
119 new_btn = BUTTON_TOPMIDDLE;
120 break;
121 case SDLK_KP9:
122 case SDLK_9:
123 new_btn = BUTTON_TOPRIGHT;
124 break;
125 case SDLK_KP4:
126 case SDLK_u:
127 case SDLK_LEFT:
128 new_btn = BUTTON_MIDLEFT;
129 break;
130 case SDLK_KP5:
131 case SDLK_i:
132 new_btn = BUTTON_CENTER;
133 break;
134 case SDLK_KP6:
135 case SDLK_o:
136 case SDLK_RIGHT:
137 new_btn = BUTTON_MIDRIGHT;
138 break;
139 case SDLK_KP1:
140 case SDLK_j:
141 new_btn = BUTTON_BOTTOMLEFT;
142 break;
143 case SDLK_KP2:
144 case SDLK_k:
145 case SDLK_DOWN:
146 new_btn = BUTTON_BOTTOMMIDDLE;
147 break;
148 case SDLK_KP3:
149 case SDLK_l:
150 new_btn = BUTTON_BOTTOMRIGHT;
151 break;
152 case SDLK_F4:
153 if(pressed)
155 touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT ? TOUCHSCREEN_BUTTON : TOUCHSCREEN_POINT);
156 printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT ? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
158 break;
160 #endif
161 case USB_KEY:
162 if (!pressed)
164 usb_connected = !usb_connected;
165 if (usb_connected)
166 queue_post(&button_queue, SYS_USB_CONNECTED, 0);
167 else
168 queue_post(&button_queue, SYS_USB_DISCONNECTED, 0);
170 return;
172 #ifdef HAS_BUTTON_HOLD
173 case SDLK_h:
174 if(pressed)
176 hold_button_state = !hold_button_state;
177 DEBUGF("Hold button is %s\n", hold_button_state?"ON":"OFF");
179 return;
180 #endif
182 #ifdef HAS_REMOTE_BUTTON_HOLD
183 case SDLK_j:
184 if(pressed)
186 remote_hold_button_state = !remote_hold_button_state;
187 DEBUGF("Remote hold button is %s\n",
188 remote_hold_button_state?"ON":"OFF");
190 return;
191 #endif
193 #if CONFIG_KEYPAD == GIGABEAT_PAD
194 case SDLK_KP4:
195 case SDLK_LEFT:
196 new_btn = BUTTON_LEFT;
197 break;
198 case SDLK_KP6:
199 case SDLK_RIGHT:
200 new_btn = BUTTON_RIGHT;
201 break;
202 case SDLK_KP8:
203 case SDLK_UP:
204 new_btn = BUTTON_UP;
205 break;
206 case SDLK_KP2:
207 case SDLK_DOWN:
208 new_btn = BUTTON_DOWN;
209 break;
210 case SDLK_KP_PLUS:
211 case SDLK_F8:
212 new_btn = BUTTON_POWER;
213 break;
214 case SDLK_ESCAPE:
215 new_btn = BUTTON_POWER;
216 break;
217 case SDLK_KP_ENTER:
218 case SDLK_RETURN:
219 case SDLK_a:
220 new_btn = BUTTON_A;
221 break;
222 case SDLK_KP5:
223 case SDLK_SPACE:
224 new_btn = BUTTON_SELECT;
225 break;
226 case SDLK_KP_PERIOD:
227 case SDLK_INSERT:
228 new_btn = BUTTON_MENU;
229 break;
230 case SDLK_KP9:
231 new_btn = BUTTON_VOL_UP;
232 break;
233 case SDLK_KP3:
234 new_btn = BUTTON_VOL_DOWN;
235 break;
237 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
238 case SDLK_KP4:
239 case SDLK_LEFT:
240 new_btn = BUTTON_LEFT;
241 break;
242 case SDLK_KP6:
243 case SDLK_RIGHT:
244 new_btn = BUTTON_RIGHT;
245 break;
246 case SDLK_KP8:
247 case SDLK_UP:
248 new_btn = BUTTON_UP;
249 break;
250 case SDLK_KP2:
251 case SDLK_DOWN:
252 new_btn = BUTTON_DOWN;
253 break;
254 case SDLK_F8:
255 case SDLK_ESCAPE:
256 new_btn = BUTTON_POWER;
257 break;
258 case SDLK_KP_PLUS:
259 case SDLK_KP_ENTER:
260 case SDLK_RETURN:
261 new_btn = BUTTON_PLAY;
262 break;
263 case SDLK_KP7:
264 new_btn = BUTTON_BACK;
265 break;
266 case SDLK_KP5:
267 case SDLK_SPACE:
268 new_btn = BUTTON_SELECT;
269 break;
270 case SDLK_KP9:
271 case SDLK_KP_PERIOD:
272 case SDLK_INSERT:
273 new_btn = BUTTON_MENU;
274 break;
276 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
277 case SDLK_KP4:
278 case SDLK_LEFT:
279 new_btn = BUTTON_LEFT;
280 break;
281 case SDLK_KP6:
282 case SDLK_RIGHT:
283 new_btn = BUTTON_RIGHT;
284 break;
285 case SDLK_KP8:
286 case SDLK_UP:
287 new_btn = BUTTON_UP;
288 break;
289 case SDLK_KP2:
290 case SDLK_DOWN:
291 new_btn = BUTTON_DOWN;
292 break;
293 case SDLK_KP_PLUS:
294 case SDLK_F8:
295 new_btn = BUTTON_PLAY;
296 break;
297 case SDLK_ESCAPE:
298 new_btn = BUTTON_POWER;
299 break;
300 case SDLK_KP_ENTER:
301 case SDLK_RETURN:
302 case SDLK_a:
303 new_btn = BUTTON_POWER;
304 break;
305 case SDLK_KP_DIVIDE:
306 case SDLK_F1:
307 new_btn = BUTTON_REC;
308 break;
309 case SDLK_KP5:
310 case SDLK_SPACE:
311 new_btn = BUTTON_SELECT;
312 break;
314 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
315 case SDLK_KP4:
316 case SDLK_LEFT:
317 new_btn = BUTTON_LEFT;
318 break;
319 case SDLK_KP6:
320 case SDLK_RIGHT:
321 new_btn = BUTTON_RIGHT;
322 break;
323 case SDLK_KP8:
324 case SDLK_UP:
325 new_btn = BUTTON_VOL_UP;
326 break;
327 case SDLK_KP2:
328 case SDLK_DOWN:
329 new_btn = BUTTON_VOL_DOWN;
330 break;
331 case SDLK_KP_PERIOD:
332 case SDLK_INSERT:
333 new_btn = BUTTON_MODE;
334 break;
335 case SDLK_KP_DIVIDE:
336 case SDLK_F1:
337 new_btn = BUTTON_REC;
338 break;
339 case SDLK_KP5:
340 case SDLK_SPACE:
341 new_btn = BUTTON_PLAY;
342 break;
344 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
345 || (CONFIG_KEYPAD == IPOD_4G_PAD)
346 case SDLK_KP4:
347 case SDLK_LEFT:
348 new_btn = BUTTON_LEFT;
349 break;
350 case SDLK_KP6:
351 case SDLK_RIGHT:
352 new_btn = BUTTON_RIGHT;
353 break;
354 case SDLK_KP8:
355 case SDLK_UP:
356 new_btn = BUTTON_SCROLL_BACK;
357 break;
358 case SDLK_KP2:
359 case SDLK_DOWN:
360 new_btn = BUTTON_SCROLL_FWD;
361 break;
362 case SDLK_KP_PLUS:
363 case SDLK_F8:
364 new_btn = BUTTON_PLAY;
365 break;
366 case SDLK_KP5:
367 case SDLK_SPACE:
368 new_btn = BUTTON_SELECT;
369 break;
370 case SDLK_KP_PERIOD:
371 case SDLK_INSERT:
372 new_btn = BUTTON_MENU;
373 break;
375 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
376 case SDLK_KP4:
377 case SDLK_LEFT:
378 new_btn = BUTTON_LEFT;
379 break;
380 case SDLK_KP6:
381 case SDLK_RIGHT:
382 new_btn = BUTTON_RIGHT;
383 break;
384 case SDLK_KP8:
385 case SDLK_UP:
386 new_btn = BUTTON_SCROLL_UP;
387 break;
388 case SDLK_KP2:
389 case SDLK_DOWN:
390 new_btn = BUTTON_SCROLL_DOWN;
391 break;
392 case SDLK_KP_PLUS:
393 case SDLK_F8:
394 new_btn = BUTTON_POWER;
395 break;
396 case SDLK_ESCAPE:
397 new_btn = BUTTON_POWER;
398 break;
399 case SDLK_KP_DIVIDE:
400 case SDLK_F1:
401 new_btn = BUTTON_REW;
402 break;
403 case SDLK_KP_MULTIPLY:
404 case SDLK_F2:
405 new_btn = BUTTON_FF;
406 break;
407 case SDLK_KP5:
408 case SDLK_SPACE:
409 new_btn = BUTTON_PLAY;
410 break;
412 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
413 case SDLK_t:
414 if(pressed)
415 switch(_remote_type)
417 case REMOTETYPE_UNPLUGGED:
418 _remote_type=REMOTETYPE_H100_LCD;
419 DEBUGF("Changed remote type to H100\n");
420 break;
421 case REMOTETYPE_H100_LCD:
422 _remote_type=REMOTETYPE_H300_LCD;
423 DEBUGF("Changed remote type to H300\n");
424 break;
425 case REMOTETYPE_H300_LCD:
426 _remote_type=REMOTETYPE_H300_NONLCD;
427 DEBUGF("Changed remote type to H300 NON-LCD\n");
428 break;
429 case REMOTETYPE_H300_NONLCD:
430 _remote_type=REMOTETYPE_UNPLUGGED;
431 DEBUGF("Changed remote type to none\n");
432 break;
434 break;
435 case SDLK_KP4:
436 case SDLK_LEFT:
437 new_btn = BUTTON_LEFT;
438 break;
439 case SDLK_KP6:
440 case SDLK_RIGHT:
441 new_btn = BUTTON_RIGHT;
442 break;
443 case SDLK_KP8:
444 case SDLK_UP:
445 new_btn = BUTTON_UP;
446 break;
447 case SDLK_KP2:
448 case SDLK_DOWN:
449 new_btn = BUTTON_DOWN;
450 break;
451 case SDLK_KP_PLUS:
452 case SDLK_F8:
453 new_btn = BUTTON_ON;
454 break;
455 case SDLK_KP_ENTER:
456 case SDLK_RETURN:
457 case SDLK_a:
458 new_btn = BUTTON_OFF;
459 break;
460 case SDLK_KP_DIVIDE:
461 case SDLK_F1:
462 new_btn = BUTTON_REC;
463 break;
464 case SDLK_KP5:
465 case SDLK_SPACE:
466 new_btn = BUTTON_SELECT;
467 break;
468 case SDLK_KP_PERIOD:
469 case SDLK_INSERT:
470 new_btn = BUTTON_MODE;
471 break;
473 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
474 case SDLK_KP4:
475 case SDLK_LEFT:
476 new_btn = BUTTON_LEFT;
477 break;
478 case SDLK_KP6:
479 case SDLK_RIGHT:
480 new_btn = BUTTON_RIGHT;
481 break;
482 case SDLK_KP8:
483 case SDLK_UP:
484 new_btn = BUTTON_UP;
485 break;
486 case SDLK_KP2:
487 case SDLK_DOWN:
488 new_btn = BUTTON_DOWN;
489 break;
490 case SDLK_KP_PLUS:
491 case SDLK_F8:
492 new_btn = BUTTON_PLAY;
493 break;
494 case SDLK_KP_ENTER:
495 case SDLK_RETURN:
496 case SDLK_a:
497 new_btn = BUTTON_EQ;
498 break;
499 case SDLK_KP5:
500 case SDLK_SPACE:
501 new_btn = BUTTON_SELECT;
502 break;
503 case SDLK_KP_PERIOD:
504 case SDLK_INSERT:
505 new_btn = BUTTON_MODE;
506 break;
508 #elif CONFIG_KEYPAD == ONDIO_PAD
509 case SDLK_KP4:
510 case SDLK_LEFT:
511 new_btn = BUTTON_LEFT;
512 break;
513 case SDLK_KP6:
514 case SDLK_RIGHT:
515 new_btn = BUTTON_RIGHT;
516 break;
517 case SDLK_KP8:
518 case SDLK_UP:
519 new_btn = BUTTON_UP;
520 break;
521 case SDLK_KP2:
522 case SDLK_DOWN:
523 new_btn = BUTTON_DOWN;
524 break;
525 case SDLK_KP_ENTER:
526 case SDLK_RETURN:
527 case SDLK_a:
528 new_btn = BUTTON_OFF;
529 break;
530 case SDLK_KP_PERIOD:
531 case SDLK_INSERT:
532 new_btn = BUTTON_MENU;
533 break;
535 #elif CONFIG_KEYPAD == PLAYER_PAD
536 case SDLK_KP4:
537 case SDLK_LEFT:
538 new_btn = BUTTON_LEFT;
539 break;
540 case SDLK_KP6:
541 case SDLK_RIGHT:
542 new_btn = BUTTON_RIGHT;
543 break;
544 case SDLK_KP8:
545 case SDLK_UP:
546 new_btn = BUTTON_PLAY;
547 break;
548 case SDLK_KP2:
549 case SDLK_DOWN:
550 new_btn = BUTTON_STOP;
551 break;
552 case SDLK_KP_PLUS:
553 case SDLK_F8:
554 new_btn = BUTTON_ON;
555 break;
556 case SDLK_KP_PERIOD:
557 case SDLK_INSERT:
558 new_btn = BUTTON_MENU;
559 break;
561 #elif CONFIG_KEYPAD == RECORDER_PAD
562 case SDLK_KP4:
563 case SDLK_LEFT:
564 new_btn = BUTTON_LEFT;
565 break;
566 case SDLK_KP6:
567 case SDLK_RIGHT:
568 new_btn = BUTTON_RIGHT;
569 break;
570 case SDLK_KP8:
571 case SDLK_UP:
572 new_btn = BUTTON_UP;
573 break;
574 case SDLK_KP2:
575 case SDLK_DOWN:
576 new_btn = BUTTON_DOWN;
577 break;
578 case SDLK_KP_PLUS:
579 case SDLK_F8:
580 new_btn = BUTTON_ON;
581 break;
582 case SDLK_KP_ENTER:
583 case SDLK_RETURN:
584 case SDLK_a:
585 new_btn = BUTTON_OFF;
586 break;
587 case SDLK_KP_DIVIDE:
588 case SDLK_F1:
589 new_btn = BUTTON_F1;
590 break;
591 case SDLK_KP_MULTIPLY:
592 case SDLK_F2:
593 new_btn = BUTTON_F2;
594 break;
595 case SDLK_KP_MINUS:
596 case SDLK_F3:
597 new_btn = BUTTON_F3;
598 break;
599 case SDLK_KP5:
600 case SDLK_SPACE:
601 new_btn = BUTTON_PLAY;
602 break;
604 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
605 case SDLK_KP4:
606 case SDLK_LEFT:
607 new_btn = BUTTON_LEFT;
608 break;
609 case SDLK_KP6:
610 case SDLK_RIGHT:
611 new_btn = BUTTON_RIGHT;
612 break;
613 case SDLK_KP8:
614 case SDLK_UP:
615 new_btn = BUTTON_UP;
616 break;
617 case SDLK_KP2:
618 case SDLK_DOWN:
619 new_btn = BUTTON_DOWN;
620 break;
621 case SDLK_KP_PLUS:
622 case SDLK_F8:
623 new_btn = BUTTON_ON;
624 break;
625 case SDLK_KP_ENTER:
626 case SDLK_RETURN:
627 case SDLK_a:
628 new_btn = BUTTON_OFF;
629 break;
630 case SDLK_KP_DIVIDE:
631 case SDLK_F1:
632 new_btn = BUTTON_F1;
633 break;
634 case SDLK_KP_MULTIPLY:
635 case SDLK_F2:
636 new_btn = BUTTON_F2;
637 break;
638 case SDLK_KP_MINUS:
639 case SDLK_F3:
640 new_btn = BUTTON_F3;
641 break;
642 case SDLK_KP5:
643 case SDLK_SPACE:
644 new_btn = BUTTON_SELECT;
645 break;
647 #elif CONFIG_KEYPAD == SANSA_E200_PAD
648 case SDLK_KP4:
649 case SDLK_LEFT:
650 new_btn = BUTTON_LEFT;
651 break;
652 case SDLK_KP6:
653 case SDLK_RIGHT:
654 new_btn = BUTTON_RIGHT;
655 break;
656 case SDLK_KP8:
657 case SDLK_UP:
658 new_btn = BUTTON_SCROLL_BACK;
659 break;
660 case SDLK_KP2:
661 case SDLK_DOWN:
662 new_btn = BUTTON_SCROLL_FWD;
663 break;
664 case SDLK_KP9:
665 case SDLK_PAGEUP:
666 new_btn = BUTTON_UP;
667 break;
668 case SDLK_KP3:
669 case SDLK_PAGEDOWN:
670 new_btn = BUTTON_DOWN;
671 break;
672 case SDLK_KP1:
673 case SDLK_HOME:
674 new_btn = BUTTON_POWER;
675 break;
676 case SDLK_KP7:
677 case SDLK_END:
678 new_btn = BUTTON_REC;
679 break;
680 case SDLK_KP5:
681 case SDLK_SPACE:
682 new_btn = BUTTON_SELECT;
683 break;
685 #elif CONFIG_KEYPAD == SANSA_C200_PAD
686 case SDLK_KP4:
687 case SDLK_LEFT:
688 new_btn = BUTTON_LEFT;
689 break;
690 case SDLK_KP6:
691 case SDLK_RIGHT:
692 new_btn = BUTTON_RIGHT;
693 break;
694 case SDLK_KP8:
695 case SDLK_UP:
696 new_btn = BUTTON_UP;
697 break;
698 case SDLK_KP2:
699 case SDLK_DOWN:
700 new_btn = BUTTON_DOWN;
701 break;
702 case SDLK_KP3:
703 new_btn = BUTTON_POWER;
704 break;
705 case SDLK_KP1:
706 new_btn = BUTTON_REC;
707 break;
708 case SDLK_KP5:
709 case SDLK_KP_ENTER:
710 case SDLK_RETURN:
711 new_btn = BUTTON_SELECT;
712 break;
713 case SDLK_KP7:
714 new_btn = BUTTON_VOL_DOWN;
715 break;
716 case SDLK_KP9:
717 new_btn = BUTTON_VOL_UP;
718 break;
720 #elif CONFIG_KEYPAD == MROBE500_PAD
721 case SDLK_F9:
722 new_btn = BUTTON_RC_HEART;
723 break;
724 case SDLK_F10:
725 new_btn = BUTTON_RC_MODE;
726 break;
727 case SDLK_F11:
728 new_btn = BUTTON_RC_VOL_DOWN;
729 break;
730 case SDLK_F12:
731 new_btn = BUTTON_RC_VOL_UP;
732 break;
733 case SDLK_MINUS:
734 case SDLK_LESS:
735 case SDLK_LEFTBRACKET:
736 case SDLK_KP_DIVIDE:
737 new_btn = BUTTON_LEFT;
738 break;
739 case SDLK_PLUS:
740 case SDLK_GREATER:
741 case SDLK_RIGHTBRACKET:
742 case SDLK_KP_MULTIPLY:
743 new_btn = BUTTON_RIGHT;
744 break;
745 case SDLK_PAGEUP:
746 new_btn = BUTTON_RC_PLAY;
747 break;
748 case SDLK_PAGEDOWN:
749 new_btn = BUTTON_RC_DOWN;
750 break;
751 case SDLK_F8:
752 case SDLK_ESCAPE:
753 new_btn = BUTTON_POWER;
754 break;
755 #elif CONFIG_KEYPAD == MROBE100_PAD
756 case SDLK_F9:
757 new_btn = BUTTON_RC_HEART;
758 break;
759 case SDLK_F10:
760 new_btn = BUTTON_RC_MODE;
761 break;
762 case SDLK_F11:
763 new_btn = BUTTON_RC_VOL_DOWN;
764 break;
765 case SDLK_F12:
766 new_btn = BUTTON_RC_VOL_UP;
767 break;
768 case SDLK_LEFT:
769 new_btn = BUTTON_RC_FF;
770 break;
771 case SDLK_RIGHT:
772 new_btn = BUTTON_RC_REW;
773 break;
774 case SDLK_UP:
775 new_btn = BUTTON_RC_PLAY;
776 break;
777 case SDLK_DOWN:
778 new_btn = BUTTON_RC_DOWN;
779 break;
780 case SDLK_KP1:
781 new_btn = BUTTON_DISPLAY;
782 break;
783 case SDLK_KP7:
784 new_btn = BUTTON_MENU;
785 break;
786 case SDLK_KP9:
787 new_btn = BUTTON_PLAY;
788 break;
789 case SDLK_KP4:
790 new_btn = BUTTON_LEFT;
791 break;
792 case SDLK_KP6:
793 new_btn = BUTTON_RIGHT;
794 break;
795 case SDLK_KP8:
796 new_btn = BUTTON_UP;
797 break;
798 case SDLK_KP2:
799 new_btn = BUTTON_DOWN;
800 break;
801 case SDLK_KP5:
802 case SDLK_SPACE:
803 new_btn = BUTTON_SELECT;
804 break;
805 case SDLK_KP_MULTIPLY:
806 case SDLK_F8:
807 case SDLK_ESCAPE:
808 new_btn = BUTTON_POWER;
809 break;
811 #elif CONFIG_KEYPAD == COWON_D2_PAD
812 case SDLK_KP_MULTIPLY:
813 case SDLK_F8:
814 case SDLK_ESCAPE:
815 case SDLK_BACKSPACE:
816 case SDLK_DELETE:
817 new_btn = BUTTON_POWER;
818 break;
819 case SDLK_KP_PLUS:
820 case SDLK_EQUALS:
821 new_btn = BUTTON_PLUS;
822 break;
823 case SDLK_KP_MINUS:
824 case SDLK_MINUS:
825 new_btn = BUTTON_MINUS;
826 break;
827 case SDLK_KP_ENTER:
828 case SDLK_RETURN:
829 case SDLK_SPACE:
830 case SDLK_INSERT:
831 new_btn = BUTTON_MENU;
832 break;
833 #elif CONFIG_KEYPAD == IAUDIO67_PAD
834 case SDLK_UP:
835 new_btn = BUTTON_RIGHT;
836 break;
837 case SDLK_DOWN:
838 new_btn = BUTTON_LEFT;
839 break;
840 case SDLK_LEFT:
841 new_btn = BUTTON_STOP;
842 break;
843 case SDLK_RETURN:
844 case SDLK_KP_ENTER:
845 case SDLK_RIGHT:
846 new_btn = BUTTON_PLAY;
847 break;
848 case SDLK_PLUS:
849 new_btn = BUTTON_VOLUP;
850 break;
851 case SDLK_MINUS:
852 new_btn = BUTTON_VOLDOWN;
853 break;
854 case SDLK_SPACE:
855 new_btn = BUTTON_MENU;
856 break;
857 case SDLK_BACKSPACE:
858 new_btn = BUTTON_POWER;
859 break;
860 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
861 case SDLK_KP1:
862 new_btn = BUTTON_BACK;
863 break;
864 case SDLK_KP3:
865 new_btn = BUTTON_MENU;
866 break;
867 case SDLK_KP7:
868 new_btn = BUTTON_CUSTOM;
869 break;
870 case SDLK_KP9:
871 new_btn = BUTTON_PLAY;
872 break;
873 case SDLK_KP4:
874 case SDLK_LEFT:
875 new_btn = BUTTON_LEFT;
876 break;
877 case SDLK_KP6:
878 case SDLK_RIGHT:
879 new_btn = BUTTON_RIGHT;
880 break;
881 case SDLK_KP8:
882 case SDLK_UP:
883 new_btn = BUTTON_UP;
884 break;
885 case SDLK_KP2:
886 case SDLK_DOWN:
887 new_btn = BUTTON_DOWN;
888 break;
889 case SDLK_KP5:
890 case SDLK_SPACE:
891 new_btn = BUTTON_SELECT;
892 break;
893 case SDLK_KP_MULTIPLY:
894 case SDLK_F8:
895 case SDLK_ESCAPE:
896 new_btn = BUTTON_POWER;
897 break;
898 #elif CONFIG_KEYPAD == CREATIVEZV_PAD
899 case SDLK_KP1:
900 new_btn = BUTTON_PREV;
901 break;
902 case SDLK_KP3:
903 new_btn = BUTTON_NEXT;
904 break;
905 case SDLK_KP7:
906 new_btn = BUTTON_BACK;
907 break;
908 case SDLK_p:
909 new_btn = BUTTON_PLAY;
910 break;
911 case SDLK_KP9:
912 new_btn = BUTTON_MENU;
913 break;
914 case SDLK_KP4:
915 case SDLK_LEFT:
916 new_btn = BUTTON_LEFT;
917 break;
918 case SDLK_KP6:
919 case SDLK_RIGHT:
920 new_btn = BUTTON_RIGHT;
921 break;
922 case SDLK_KP8:
923 case SDLK_UP:
924 new_btn = BUTTON_UP;
925 break;
926 case SDLK_KP2:
927 case SDLK_DOWN:
928 new_btn = BUTTON_DOWN;
929 break;
930 case SDLK_KP5:
931 case SDLK_SPACE:
932 new_btn = BUTTON_SELECT;
933 break;
934 case SDLK_KP_MULTIPLY:
935 case SDLK_F8:
936 case SDLK_ESCAPE:
937 new_btn = BUTTON_POWER;
938 break;
939 case SDLK_z:
940 new_btn = BUTTON_VOL_DOWN;
941 break;
942 case SDLK_s:
943 new_btn = BUTTON_VOL_UP;
945 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
946 case SDLK_KP1:
947 new_btn = BUTTON_PREV;
948 break;
949 case SDLK_KP3:
950 new_btn = BUTTON_NEXT;
951 break;
952 case SDLK_KP_ENTER:
953 case SDLK_RETURN:
954 case SDLK_a:
955 new_btn = BUTTON_PLAY;
956 break;
957 case SDLK_KP_PERIOD:
958 case SDLK_INSERT:
959 new_btn = BUTTON_MENU;
960 break;
961 case SDLK_KP8:
962 case SDLK_UP:
963 new_btn = BUTTON_UP;
964 break;
965 case SDLK_KP2:
966 case SDLK_DOWN:
967 new_btn = BUTTON_DOWN;
968 break;
969 case SDLK_KP5:
970 case SDLK_SPACE:
971 new_btn = BUTTON_SELECT;
972 break;
973 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
974 case SDLK_KP4:
975 case SDLK_LEFT:
976 new_btn = BUTTON_LEFT;
977 break;
978 case SDLK_KP6:
979 case SDLK_RIGHT:
980 new_btn = BUTTON_RIGHT;
981 break;
982 case SDLK_KP8:
983 case SDLK_UP:
984 new_btn = BUTTON_SCROLL_BACK;
985 break;
986 case SDLK_KP2:
987 case SDLK_DOWN:
988 new_btn = BUTTON_SCROLL_FWD;
989 break;
990 case SDLK_PAGEUP:
991 case SDLK_KP9:
992 new_btn = BUTTON_UP;
993 break;
994 case SDLK_PAGEDOWN:
995 case SDLK_KP3:
996 new_btn = BUTTON_DOWN;
997 break;
998 case SDLK_KP_MINUS:
999 case SDLK_KP1:
1000 new_btn = BUTTON_POWER;
1001 break;
1002 case SDLK_KP_MULTIPLY:
1003 new_btn = BUTTON_HOME;
1004 break;
1005 case SDLK_KP5:
1006 case SDLK_SPACE:
1007 case SDLK_KP_ENTER:
1008 case SDLK_RETURN:
1009 new_btn = BUTTON_SELECT;
1010 break;
1011 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
1012 case SDLK_KP4:
1013 case SDLK_LEFT:
1014 new_btn = BUTTON_LEFT;
1015 break;
1016 case SDLK_KP6:
1017 case SDLK_RIGHT:
1018 new_btn = BUTTON_RIGHT;
1019 break;
1020 case SDLK_KP8:
1021 case SDLK_UP:
1022 new_btn = BUTTON_UP;
1023 break;
1024 case SDLK_KP2:
1025 case SDLK_DOWN:
1026 new_btn = BUTTON_DOWN;
1027 break;
1029 case SDLK_INSERT:
1030 case SDLK_KP_MULTIPLY:
1031 new_btn = BUTTON_HOME;
1032 break;
1033 case SDLK_SPACE:
1034 case SDLK_KP5:
1035 new_btn = BUTTON_SELECT;
1036 break;
1037 case SDLK_PAGEDOWN:
1038 case SDLK_KP3:
1039 new_btn = BUTTON_VOL_DOWN;
1040 break;
1041 case SDLK_PAGEUP:
1042 case SDLK_KP9:
1043 new_btn = BUTTON_VOL_UP;
1044 break;
1045 case SDLK_ESCAPE:
1046 case SDLK_KP1:
1047 new_btn = BUTTON_POWER;
1048 break;
1049 #elif CONFIG_KEYPAD == SANSA_M200_PAD
1050 case SDLK_KP4:
1051 case SDLK_LEFT:
1052 new_btn = BUTTON_LEFT;
1053 break;
1054 case SDLK_KP6:
1055 case SDLK_RIGHT:
1056 new_btn = BUTTON_RIGHT;
1057 break;
1058 case SDLK_KP8:
1059 case SDLK_UP:
1060 new_btn = BUTTON_UP;
1061 break;
1062 case SDLK_KP2:
1063 case SDLK_DOWN:
1064 new_btn = BUTTON_DOWN;
1065 break;
1066 case SDLK_PLUS:
1067 new_btn = BUTTON_POWER;
1068 break;
1069 case SDLK_KP5:
1070 new_btn = BUTTON_SELECT;
1071 break;
1072 case SDLK_KP7:
1073 new_btn = BUTTON_VOL_DOWN;
1074 break;
1075 case SDLK_KP9:
1076 new_btn = BUTTON_VOL_UP;
1077 break;
1078 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
1079 case SDLK_KP4:
1080 case SDLK_LEFT:
1081 new_btn = BUTTON_LEFT;
1082 break;
1083 case SDLK_KP6:
1084 case SDLK_RIGHT:
1085 new_btn = BUTTON_RIGHT;
1086 break;
1087 case SDLK_KP8:
1088 case SDLK_UP:
1089 new_btn = BUTTON_UP;
1090 break;
1091 case SDLK_KP2:
1092 case SDLK_DOWN:
1093 new_btn = BUTTON_DOWN;
1094 break;
1095 case SDLK_KP5:
1096 case SDLK_SPACE:
1097 new_btn = BUTTON_PLAY;
1098 break;
1099 case SDLK_KP7:
1100 new_btn = BUTTON_PREV;
1101 break;
1102 case SDLK_KP9:
1103 new_btn = BUTTON_NEXT;
1104 break;
1105 case SDLK_KP_ENTER:
1106 case SDLK_RETURN:
1107 new_btn = BUTTON_POWER;
1108 break;
1109 case SDLK_PAGEUP:
1110 new_btn = BUTTON_VOL_UP;
1111 break;
1112 case SDLK_PAGEDOWN:
1113 new_btn = BUTTON_VOL_DOWN;
1114 break;
1115 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
1116 case SDLK_KP4:
1117 case SDLK_LEFT:
1118 new_btn = BUTTON_LEFT;
1119 break;
1120 case SDLK_KP6:
1121 case SDLK_RIGHT:
1122 new_btn = BUTTON_RIGHT;
1123 break;
1124 case SDLK_KP8:
1125 case SDLK_UP:
1126 new_btn = BUTTON_UP;
1127 break;
1128 case SDLK_KP2:
1129 case SDLK_DOWN:
1130 new_btn = BUTTON_DOWN;
1131 break;
1132 case SDLK_KP5:
1133 case SDLK_SPACE:
1134 new_btn = BUTTON_SELECT;
1135 break;
1136 case SDLK_KP7:
1137 case SDLK_ESCAPE:
1138 new_btn = BUTTON_POWER;
1139 break;
1140 case SDLK_KP1:
1141 new_btn = BUTTON_PLAYLIST;
1142 break;
1143 case SDLK_KP9:
1144 new_btn = BUTTON_VOL_UP;
1145 break;
1146 case SDLK_KP3:
1147 new_btn = BUTTON_VOL_DOWN;
1148 break;
1149 case SDLK_KP_MINUS:
1150 new_btn = BUTTON_MENU;
1151 break;
1152 case SDLK_KP_PLUS:
1153 new_btn = BUTTON_VIEW;
1154 break;
1155 #elif CONFIG_KEYPAD == ONDAVX747_PAD
1156 case SDLK_ESCAPE:
1157 new_btn = BUTTON_POWER;
1158 break;
1159 case SDLK_KP_PLUS:
1160 case SDLK_PLUS:
1161 case SDLK_GREATER:
1162 case SDLK_RIGHTBRACKET:
1163 case SDLK_KP_MULTIPLY:
1164 new_btn = BUTTON_VOL_UP;
1165 break;
1166 case SDLK_KP_MINUS:
1167 case SDLK_MINUS:
1168 case SDLK_LESS:
1169 case SDLK_LEFTBRACKET:
1170 case SDLK_KP_DIVIDE:
1171 new_btn = BUTTON_VOL_DOWN;
1172 break;
1173 case SDLK_KP_ENTER:
1174 case SDLK_RETURN:
1175 new_btn = BUTTON_MENU;
1176 break;
1177 #elif CONFIG_KEYPAD == ONDAVX777_PAD
1178 case SDLK_ESCAPE:
1179 new_btn = BUTTON_POWER;
1180 break;
1181 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
1182 case SDLK_KP4:
1183 case SDLK_LEFT:
1184 new_btn = BUTTON_LEFT;
1185 break;
1186 case SDLK_KP6:
1187 case SDLK_RIGHT:
1188 new_btn = BUTTON_RIGHT;
1189 break;
1190 case SDLK_KP8:
1191 case SDLK_UP:
1192 new_btn = BUTTON_UP;
1193 break;
1194 case SDLK_KP2:
1195 case SDLK_DOWN:
1196 new_btn = BUTTON_DOWN;
1197 break;
1198 case SDLK_KP5:
1199 case SDLK_KP_ENTER:
1200 new_btn = BUTTON_PLAY;
1201 break;
1202 case SDLK_KP9:
1203 case SDLK_PAGEUP:
1204 new_btn = BUTTON_FFWD;
1205 break;
1206 #ifdef SAMSUNG_YH820
1207 case SDLK_KP7:
1208 #else
1209 case SDLK_KP3:
1210 #endif
1211 case SDLK_PAGEDOWN:
1212 new_btn = BUTTON_REW;
1213 break;
1214 case SDLK_KP_PLUS:
1215 new_btn = BUTTON_REC;
1216 break;
1217 #elif CONFIG_KEYPAD == MINI2440_PAD
1218 case SDLK_LEFT:
1219 new_btn = BUTTON_LEFT;
1220 break;
1221 case SDLK_RIGHT:
1222 new_btn = BUTTON_RIGHT;
1223 break;
1224 case SDLK_UP:
1225 new_btn = BUTTON_UP;
1226 break;
1227 case SDLK_DOWN:
1228 new_btn = BUTTON_DOWN;
1229 break;
1230 case SDLK_F8:
1231 case SDLK_ESCAPE:
1232 new_btn = BUTTON_POWER;
1233 break;
1234 case SDLK_KP_ENTER:
1235 case SDLK_RETURN:
1236 case SDLK_a:
1237 new_btn = BUTTON_A;
1238 break;
1239 case SDLK_SPACE:
1240 new_btn = BUTTON_SELECT;
1241 break;
1242 case SDLK_KP_PERIOD:
1243 case SDLK_INSERT:
1244 new_btn = BUTTON_MENU;
1245 break;
1246 case SDLK_KP_PLUS:
1247 new_btn = BUTTON_VOL_UP;
1248 break;
1249 case SDLK_KP_MINUS:
1250 new_btn = BUTTON_VOL_DOWN;
1251 break;
1252 #else
1253 #error No keymap defined!
1254 #endif /* CONFIG_KEYPAD */
1255 case SDLK_KP0:
1256 case SDLK_F5:
1257 if(pressed)
1259 sim_trigger_screendump();
1260 return;
1262 break;
1265 /* Call to make up for scrollwheel target implementation. This is
1266 * not handled in the main button.c driver, but on the target
1267 * implementation (look at button-e200.c for example if you are trying to
1268 * figure out why using button_get_data needed a hack before).
1270 #if defined(BUTTON_SCROLL_FWD) && defined(BUTTON_SCROLL_BACK)
1271 if((new_btn == BUTTON_SCROLL_FWD || new_btn == BUTTON_SCROLL_BACK) &&
1272 pressed)
1274 /* Clear these buttons from the data - adding them to the queue is
1275 * handled in the scrollwheel drivers for the targets. They do not
1276 * store the scroll forward/back buttons in their button data for
1277 * the button_read call.
1279 #ifdef HAVE_BACKLIGHT
1280 backlight_on();
1281 #endif
1282 #ifdef HAVE_BUTTON_LIGHT
1283 buttonlight_on();
1284 #endif
1285 queue_post(&button_queue, new_btn, 1<<24);
1286 new_btn &= ~(BUTTON_SCROLL_FWD | BUTTON_SCROLL_BACK);
1288 #endif
1290 if (pressed)
1291 btn |= new_btn;
1292 else
1293 btn &= ~new_btn;
1295 #if defined(HAVE_BUTTON_DATA) && defined(HAVE_TOUCHSCREEN)
1296 int button_read_device(int* data)
1298 *data = mouse_coords;
1299 #else
1300 int button_read_device(void)
1302 #endif
1304 #ifdef HAS_BUTTON_HOLD
1305 int hold_button = button_hold();
1307 #ifdef HAVE_BACKLIGHT
1308 /* light handling */
1309 static int hold_button_old = false;
1310 if (hold_button != hold_button_old)
1312 hold_button_old = hold_button;
1313 backlight_hold_changed(hold_button);
1315 #endif
1317 if (hold_button)
1318 return BUTTON_NONE;
1319 #endif
1321 return btn;
1325 #ifdef HAVE_TOUCHSCREEN
1326 extern bool debug_wps;
1327 void mouse_tick_task(void)
1329 static int last_check = 0;
1330 int x,y;
1331 if (TIME_BEFORE(current_tick, last_check+(HZ/10)))
1332 return;
1333 last_check = current_tick;
1334 if (SDL_GetMouseState(&x, &y) & SDL_BUTTON(SDL_BUTTON_LEFT))
1336 if(background)
1338 x -= UI_LCD_POSX;
1339 y -= UI_LCD_POSY;
1341 if(x<0 || y<0 || x>SIM_LCD_WIDTH || y>SIM_LCD_HEIGHT)
1342 return;
1345 mouse_coords = (x<<16)|y;
1346 button_event(BUTTON_TOUCHSCREEN, true);
1347 if (debug_wps)
1348 printf("Mouse at: (%d, %d)\n", x, y);
1351 #endif
1353 void button_init_sdl(void)
1355 #ifdef HAVE_TOUCHSCREEN
1356 tick_add_task(mouse_tick_task);
1357 #endif