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