UIsimulator: iAudio M3 remote keys add.
[kugel-rb.git] / uisimulator / sdl / button.c
blob4fd276ac9755e20dea49a20912372571c3b9e54b
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 new_btn = BUTTON_LEFT;
317 break;
318 case SDLK_LEFT:
319 new_btn = BUTTON_RC_REW;
320 break;
321 case SDLK_KP6:
322 new_btn = BUTTON_RIGHT;
323 break;
324 case SDLK_RIGHT:
325 new_btn = BUTTON_RC_FF;
326 break;
327 case SDLK_KP8:
328 new_btn = BUTTON_VOL_UP;
329 break;
330 case SDLK_UP:
331 new_btn = BUTTON_RC_VOL_UP;
332 break;
333 case SDLK_KP2:
334 new_btn = BUTTON_VOL_DOWN;
335 break;
336 case SDLK_DOWN:
337 new_btn = BUTTON_RC_VOL_DOWN;
338 break;
339 case SDLK_KP_PERIOD:
340 new_btn = BUTTON_MODE;
341 break;
342 case SDLK_INSERT:
343 new_btn = BUTTON_RC_MODE;
344 break;
345 case SDLK_KP_DIVIDE:
346 new_btn = BUTTON_REC;
347 break;
348 case SDLK_F1:
349 new_btn = BUTTON_RC_REC;
350 break;
351 case SDLK_KP5:
352 new_btn = BUTTON_PLAY;
353 break;
354 case SDLK_SPACE:
355 new_btn = BUTTON_RC_PLAY;
356 break;
357 case SDLK_KP_ENTER:
358 case SDLK_RETURN:
359 new_btn = BUTTON_RC_MENU;
360 break;
362 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
363 || (CONFIG_KEYPAD == IPOD_4G_PAD)
364 case SDLK_KP4:
365 case SDLK_LEFT:
366 new_btn = BUTTON_LEFT;
367 break;
368 case SDLK_KP6:
369 case SDLK_RIGHT:
370 new_btn = BUTTON_RIGHT;
371 break;
372 case SDLK_KP8:
373 case SDLK_UP:
374 new_btn = BUTTON_SCROLL_BACK;
375 break;
376 case SDLK_KP2:
377 case SDLK_DOWN:
378 new_btn = BUTTON_SCROLL_FWD;
379 break;
380 case SDLK_KP_PLUS:
381 case SDLK_F8:
382 new_btn = BUTTON_PLAY;
383 break;
384 case SDLK_KP5:
385 case SDLK_SPACE:
386 new_btn = BUTTON_SELECT;
387 break;
388 case SDLK_KP_PERIOD:
389 case SDLK_INSERT:
390 new_btn = BUTTON_MENU;
391 break;
393 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
394 case SDLK_KP4:
395 case SDLK_LEFT:
396 new_btn = BUTTON_LEFT;
397 break;
398 case SDLK_KP6:
399 case SDLK_RIGHT:
400 new_btn = BUTTON_RIGHT;
401 break;
402 case SDLK_KP8:
403 case SDLK_UP:
404 new_btn = BUTTON_SCROLL_UP;
405 break;
406 case SDLK_KP2:
407 case SDLK_DOWN:
408 new_btn = BUTTON_SCROLL_DOWN;
409 break;
410 case SDLK_KP_PLUS:
411 case SDLK_F8:
412 new_btn = BUTTON_POWER;
413 break;
414 case SDLK_ESCAPE:
415 new_btn = BUTTON_POWER;
416 break;
417 case SDLK_KP_DIVIDE:
418 case SDLK_F1:
419 new_btn = BUTTON_REW;
420 break;
421 case SDLK_KP_MULTIPLY:
422 case SDLK_F2:
423 new_btn = BUTTON_FF;
424 break;
425 case SDLK_KP5:
426 case SDLK_SPACE:
427 new_btn = BUTTON_PLAY;
428 break;
430 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
431 case SDLK_t:
432 if(pressed)
433 switch(_remote_type)
435 case REMOTETYPE_UNPLUGGED:
436 _remote_type=REMOTETYPE_H100_LCD;
437 DEBUGF("Changed remote type to H100\n");
438 break;
439 case REMOTETYPE_H100_LCD:
440 _remote_type=REMOTETYPE_H300_LCD;
441 DEBUGF("Changed remote type to H300\n");
442 break;
443 case REMOTETYPE_H300_LCD:
444 _remote_type=REMOTETYPE_H300_NONLCD;
445 DEBUGF("Changed remote type to H300 NON-LCD\n");
446 break;
447 case REMOTETYPE_H300_NONLCD:
448 _remote_type=REMOTETYPE_UNPLUGGED;
449 DEBUGF("Changed remote type to none\n");
450 break;
452 break;
453 case SDLK_KP4:
454 case SDLK_LEFT:
455 new_btn = BUTTON_LEFT;
456 break;
457 case SDLK_KP6:
458 case SDLK_RIGHT:
459 new_btn = BUTTON_RIGHT;
460 break;
461 case SDLK_KP8:
462 case SDLK_UP:
463 new_btn = BUTTON_UP;
464 break;
465 case SDLK_KP2:
466 case SDLK_DOWN:
467 new_btn = BUTTON_DOWN;
468 break;
469 case SDLK_KP_PLUS:
470 case SDLK_F8:
471 new_btn = BUTTON_ON;
472 break;
473 case SDLK_KP_ENTER:
474 case SDLK_RETURN:
475 case SDLK_a:
476 new_btn = BUTTON_OFF;
477 break;
478 case SDLK_KP_DIVIDE:
479 case SDLK_F1:
480 new_btn = BUTTON_REC;
481 break;
482 case SDLK_KP5:
483 case SDLK_SPACE:
484 new_btn = BUTTON_SELECT;
485 break;
486 case SDLK_KP_PERIOD:
487 case SDLK_INSERT:
488 new_btn = BUTTON_MODE;
489 break;
491 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
492 case SDLK_KP4:
493 case SDLK_LEFT:
494 new_btn = BUTTON_LEFT;
495 break;
496 case SDLK_KP6:
497 case SDLK_RIGHT:
498 new_btn = BUTTON_RIGHT;
499 break;
500 case SDLK_KP8:
501 case SDLK_UP:
502 new_btn = BUTTON_UP;
503 break;
504 case SDLK_KP2:
505 case SDLK_DOWN:
506 new_btn = BUTTON_DOWN;
507 break;
508 case SDLK_KP_PLUS:
509 case SDLK_F8:
510 new_btn = BUTTON_PLAY;
511 break;
512 case SDLK_KP_ENTER:
513 case SDLK_RETURN:
514 case SDLK_a:
515 new_btn = BUTTON_EQ;
516 break;
517 case SDLK_KP5:
518 case SDLK_SPACE:
519 new_btn = BUTTON_SELECT;
520 break;
521 case SDLK_KP_PERIOD:
522 case SDLK_INSERT:
523 new_btn = BUTTON_MODE;
524 break;
526 #elif CONFIG_KEYPAD == ONDIO_PAD
527 case SDLK_KP4:
528 case SDLK_LEFT:
529 new_btn = BUTTON_LEFT;
530 break;
531 case SDLK_KP6:
532 case SDLK_RIGHT:
533 new_btn = BUTTON_RIGHT;
534 break;
535 case SDLK_KP8:
536 case SDLK_UP:
537 new_btn = BUTTON_UP;
538 break;
539 case SDLK_KP2:
540 case SDLK_DOWN:
541 new_btn = BUTTON_DOWN;
542 break;
543 case SDLK_KP_ENTER:
544 case SDLK_RETURN:
545 case SDLK_a:
546 new_btn = BUTTON_OFF;
547 break;
548 case SDLK_KP_PERIOD:
549 case SDLK_INSERT:
550 new_btn = BUTTON_MENU;
551 break;
553 #elif CONFIG_KEYPAD == PLAYER_PAD
554 case SDLK_KP4:
555 case SDLK_LEFT:
556 new_btn = BUTTON_LEFT;
557 break;
558 case SDLK_KP6:
559 case SDLK_RIGHT:
560 new_btn = BUTTON_RIGHT;
561 break;
562 case SDLK_KP8:
563 case SDLK_UP:
564 new_btn = BUTTON_PLAY;
565 break;
566 case SDLK_KP2:
567 case SDLK_DOWN:
568 new_btn = BUTTON_STOP;
569 break;
570 case SDLK_KP_PLUS:
571 case SDLK_F8:
572 new_btn = BUTTON_ON;
573 break;
574 case SDLK_KP_PERIOD:
575 case SDLK_INSERT:
576 new_btn = BUTTON_MENU;
577 break;
579 #elif CONFIG_KEYPAD == RECORDER_PAD
580 case SDLK_KP4:
581 case SDLK_LEFT:
582 new_btn = BUTTON_LEFT;
583 break;
584 case SDLK_KP6:
585 case SDLK_RIGHT:
586 new_btn = BUTTON_RIGHT;
587 break;
588 case SDLK_KP8:
589 case SDLK_UP:
590 new_btn = BUTTON_UP;
591 break;
592 case SDLK_KP2:
593 case SDLK_DOWN:
594 new_btn = BUTTON_DOWN;
595 break;
596 case SDLK_KP_PLUS:
597 case SDLK_F8:
598 new_btn = BUTTON_ON;
599 break;
600 case SDLK_KP_ENTER:
601 case SDLK_RETURN:
602 case SDLK_a:
603 new_btn = BUTTON_OFF;
604 break;
605 case SDLK_KP_DIVIDE:
606 case SDLK_F1:
607 new_btn = BUTTON_F1;
608 break;
609 case SDLK_KP_MULTIPLY:
610 case SDLK_F2:
611 new_btn = BUTTON_F2;
612 break;
613 case SDLK_KP_MINUS:
614 case SDLK_F3:
615 new_btn = BUTTON_F3;
616 break;
617 case SDLK_KP5:
618 case SDLK_SPACE:
619 new_btn = BUTTON_PLAY;
620 break;
622 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
623 case SDLK_KP4:
624 case SDLK_LEFT:
625 new_btn = BUTTON_LEFT;
626 break;
627 case SDLK_KP6:
628 case SDLK_RIGHT:
629 new_btn = BUTTON_RIGHT;
630 break;
631 case SDLK_KP8:
632 case SDLK_UP:
633 new_btn = BUTTON_UP;
634 break;
635 case SDLK_KP2:
636 case SDLK_DOWN:
637 new_btn = BUTTON_DOWN;
638 break;
639 case SDLK_KP_PLUS:
640 case SDLK_F8:
641 new_btn = BUTTON_ON;
642 break;
643 case SDLK_KP_ENTER:
644 case SDLK_RETURN:
645 case SDLK_a:
646 new_btn = BUTTON_OFF;
647 break;
648 case SDLK_KP_DIVIDE:
649 case SDLK_F1:
650 new_btn = BUTTON_F1;
651 break;
652 case SDLK_KP_MULTIPLY:
653 case SDLK_F2:
654 new_btn = BUTTON_F2;
655 break;
656 case SDLK_KP_MINUS:
657 case SDLK_F3:
658 new_btn = BUTTON_F3;
659 break;
660 case SDLK_KP5:
661 case SDLK_SPACE:
662 new_btn = BUTTON_SELECT;
663 break;
665 #elif CONFIG_KEYPAD == SANSA_E200_PAD
666 case SDLK_KP4:
667 case SDLK_LEFT:
668 new_btn = BUTTON_LEFT;
669 break;
670 case SDLK_KP6:
671 case SDLK_RIGHT:
672 new_btn = BUTTON_RIGHT;
673 break;
674 case SDLK_KP8:
675 case SDLK_UP:
676 new_btn = BUTTON_SCROLL_BACK;
677 break;
678 case SDLK_KP2:
679 case SDLK_DOWN:
680 new_btn = BUTTON_SCROLL_FWD;
681 break;
682 case SDLK_KP9:
683 case SDLK_PAGEUP:
684 new_btn = BUTTON_UP;
685 break;
686 case SDLK_KP3:
687 case SDLK_PAGEDOWN:
688 new_btn = BUTTON_DOWN;
689 break;
690 case SDLK_KP1:
691 case SDLK_HOME:
692 new_btn = BUTTON_POWER;
693 break;
694 case SDLK_KP7:
695 case SDLK_END:
696 new_btn = BUTTON_REC;
697 break;
698 case SDLK_KP5:
699 case SDLK_SPACE:
700 new_btn = BUTTON_SELECT;
701 break;
703 #elif CONFIG_KEYPAD == SANSA_C200_PAD
704 case SDLK_KP4:
705 case SDLK_LEFT:
706 new_btn = BUTTON_LEFT;
707 break;
708 case SDLK_KP6:
709 case SDLK_RIGHT:
710 new_btn = BUTTON_RIGHT;
711 break;
712 case SDLK_KP8:
713 case SDLK_UP:
714 new_btn = BUTTON_UP;
715 break;
716 case SDLK_KP2:
717 case SDLK_DOWN:
718 new_btn = BUTTON_DOWN;
719 break;
720 case SDLK_KP3:
721 new_btn = BUTTON_POWER;
722 break;
723 case SDLK_KP1:
724 new_btn = BUTTON_REC;
725 break;
726 case SDLK_KP5:
727 case SDLK_KP_ENTER:
728 case SDLK_RETURN:
729 new_btn = BUTTON_SELECT;
730 break;
731 case SDLK_KP7:
732 new_btn = BUTTON_VOL_DOWN;
733 break;
734 case SDLK_KP9:
735 new_btn = BUTTON_VOL_UP;
736 break;
738 #elif CONFIG_KEYPAD == MROBE500_PAD
739 case SDLK_F9:
740 new_btn = BUTTON_RC_HEART;
741 break;
742 case SDLK_F10:
743 new_btn = BUTTON_RC_MODE;
744 break;
745 case SDLK_F11:
746 new_btn = BUTTON_RC_VOL_DOWN;
747 break;
748 case SDLK_F12:
749 new_btn = BUTTON_RC_VOL_UP;
750 break;
751 case SDLK_MINUS:
752 case SDLK_LESS:
753 case SDLK_LEFTBRACKET:
754 case SDLK_KP_DIVIDE:
755 new_btn = BUTTON_LEFT;
756 break;
757 case SDLK_PLUS:
758 case SDLK_GREATER:
759 case SDLK_RIGHTBRACKET:
760 case SDLK_KP_MULTIPLY:
761 new_btn = BUTTON_RIGHT;
762 break;
763 case SDLK_PAGEUP:
764 new_btn = BUTTON_RC_PLAY;
765 break;
766 case SDLK_PAGEDOWN:
767 new_btn = BUTTON_RC_DOWN;
768 break;
769 case SDLK_F8:
770 case SDLK_ESCAPE:
771 new_btn = BUTTON_POWER;
772 break;
773 #elif CONFIG_KEYPAD == MROBE100_PAD
774 case SDLK_F9:
775 new_btn = BUTTON_RC_HEART;
776 break;
777 case SDLK_F10:
778 new_btn = BUTTON_RC_MODE;
779 break;
780 case SDLK_F11:
781 new_btn = BUTTON_RC_VOL_DOWN;
782 break;
783 case SDLK_F12:
784 new_btn = BUTTON_RC_VOL_UP;
785 break;
786 case SDLK_LEFT:
787 new_btn = BUTTON_RC_FF;
788 break;
789 case SDLK_RIGHT:
790 new_btn = BUTTON_RC_REW;
791 break;
792 case SDLK_UP:
793 new_btn = BUTTON_RC_PLAY;
794 break;
795 case SDLK_DOWN:
796 new_btn = BUTTON_RC_DOWN;
797 break;
798 case SDLK_KP1:
799 new_btn = BUTTON_DISPLAY;
800 break;
801 case SDLK_KP7:
802 new_btn = BUTTON_MENU;
803 break;
804 case SDLK_KP9:
805 new_btn = BUTTON_PLAY;
806 break;
807 case SDLK_KP4:
808 new_btn = BUTTON_LEFT;
809 break;
810 case SDLK_KP6:
811 new_btn = BUTTON_RIGHT;
812 break;
813 case SDLK_KP8:
814 new_btn = BUTTON_UP;
815 break;
816 case SDLK_KP2:
817 new_btn = BUTTON_DOWN;
818 break;
819 case SDLK_KP5:
820 case SDLK_SPACE:
821 new_btn = BUTTON_SELECT;
822 break;
823 case SDLK_KP_MULTIPLY:
824 case SDLK_F8:
825 case SDLK_ESCAPE:
826 new_btn = BUTTON_POWER;
827 break;
829 #elif CONFIG_KEYPAD == COWON_D2_PAD
830 case SDLK_KP_MULTIPLY:
831 case SDLK_F8:
832 case SDLK_ESCAPE:
833 case SDLK_BACKSPACE:
834 case SDLK_DELETE:
835 new_btn = BUTTON_POWER;
836 break;
837 case SDLK_KP_PLUS:
838 case SDLK_EQUALS:
839 new_btn = BUTTON_PLUS;
840 break;
841 case SDLK_KP_MINUS:
842 case SDLK_MINUS:
843 new_btn = BUTTON_MINUS;
844 break;
845 case SDLK_KP_ENTER:
846 case SDLK_RETURN:
847 case SDLK_SPACE:
848 case SDLK_INSERT:
849 new_btn = BUTTON_MENU;
850 break;
851 #elif CONFIG_KEYPAD == IAUDIO67_PAD
852 case SDLK_UP:
853 new_btn = BUTTON_RIGHT;
854 break;
855 case SDLK_DOWN:
856 new_btn = BUTTON_LEFT;
857 break;
858 case SDLK_LEFT:
859 new_btn = BUTTON_STOP;
860 break;
861 case SDLK_RETURN:
862 case SDLK_KP_ENTER:
863 case SDLK_RIGHT:
864 new_btn = BUTTON_PLAY;
865 break;
866 case SDLK_PLUS:
867 new_btn = BUTTON_VOLUP;
868 break;
869 case SDLK_MINUS:
870 new_btn = BUTTON_VOLDOWN;
871 break;
872 case SDLK_SPACE:
873 new_btn = BUTTON_MENU;
874 break;
875 case SDLK_BACKSPACE:
876 new_btn = BUTTON_POWER;
877 break;
878 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
879 case SDLK_KP1:
880 new_btn = BUTTON_BACK;
881 break;
882 case SDLK_KP3:
883 new_btn = BUTTON_MENU;
884 break;
885 case SDLK_KP7:
886 new_btn = BUTTON_CUSTOM;
887 break;
888 case SDLK_KP9:
889 new_btn = BUTTON_PLAY;
890 break;
891 case SDLK_KP4:
892 case SDLK_LEFT:
893 new_btn = BUTTON_LEFT;
894 break;
895 case SDLK_KP6:
896 case SDLK_RIGHT:
897 new_btn = BUTTON_RIGHT;
898 break;
899 case SDLK_KP8:
900 case SDLK_UP:
901 new_btn = BUTTON_UP;
902 break;
903 case SDLK_KP2:
904 case SDLK_DOWN:
905 new_btn = BUTTON_DOWN;
906 break;
907 case SDLK_KP5:
908 case SDLK_SPACE:
909 new_btn = BUTTON_SELECT;
910 break;
911 case SDLK_KP_MULTIPLY:
912 case SDLK_F8:
913 case SDLK_ESCAPE:
914 new_btn = BUTTON_POWER;
915 break;
916 #elif CONFIG_KEYPAD == CREATIVEZV_PAD
917 case SDLK_KP1:
918 new_btn = BUTTON_PREV;
919 break;
920 case SDLK_KP3:
921 new_btn = BUTTON_NEXT;
922 break;
923 case SDLK_KP7:
924 new_btn = BUTTON_BACK;
925 break;
926 case SDLK_p:
927 new_btn = BUTTON_PLAY;
928 break;
929 case SDLK_KP9:
930 new_btn = BUTTON_MENU;
931 break;
932 case SDLK_KP4:
933 case SDLK_LEFT:
934 new_btn = BUTTON_LEFT;
935 break;
936 case SDLK_KP6:
937 case SDLK_RIGHT:
938 new_btn = BUTTON_RIGHT;
939 break;
940 case SDLK_KP8:
941 case SDLK_UP:
942 new_btn = BUTTON_UP;
943 break;
944 case SDLK_KP2:
945 case SDLK_DOWN:
946 new_btn = BUTTON_DOWN;
947 break;
948 case SDLK_KP5:
949 case SDLK_SPACE:
950 new_btn = BUTTON_SELECT;
951 break;
952 case SDLK_KP_MULTIPLY:
953 case SDLK_F8:
954 case SDLK_ESCAPE:
955 new_btn = BUTTON_POWER;
956 break;
957 case SDLK_z:
958 new_btn = BUTTON_VOL_DOWN;
959 break;
960 case SDLK_s:
961 new_btn = BUTTON_VOL_UP;
963 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
964 case SDLK_KP1:
965 new_btn = BUTTON_PREV;
966 break;
967 case SDLK_KP3:
968 new_btn = BUTTON_NEXT;
969 break;
970 case SDLK_KP_ENTER:
971 case SDLK_RETURN:
972 case SDLK_a:
973 new_btn = BUTTON_PLAY;
974 break;
975 case SDLK_KP_PERIOD:
976 case SDLK_INSERT:
977 new_btn = BUTTON_MENU;
978 break;
979 case SDLK_KP8:
980 case SDLK_UP:
981 new_btn = BUTTON_UP;
982 break;
983 case SDLK_KP2:
984 case SDLK_DOWN:
985 new_btn = BUTTON_DOWN;
986 break;
987 case SDLK_KP5:
988 case SDLK_SPACE:
989 new_btn = BUTTON_SELECT;
990 break;
991 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
992 case SDLK_KP4:
993 case SDLK_LEFT:
994 new_btn = BUTTON_LEFT;
995 break;
996 case SDLK_KP6:
997 case SDLK_RIGHT:
998 new_btn = BUTTON_RIGHT;
999 break;
1000 case SDLK_KP8:
1001 case SDLK_UP:
1002 new_btn = BUTTON_SCROLL_BACK;
1003 break;
1004 case SDLK_KP2:
1005 case SDLK_DOWN:
1006 new_btn = BUTTON_SCROLL_FWD;
1007 break;
1008 case SDLK_PAGEUP:
1009 case SDLK_KP9:
1010 new_btn = BUTTON_UP;
1011 break;
1012 case SDLK_PAGEDOWN:
1013 case SDLK_KP3:
1014 new_btn = BUTTON_DOWN;
1015 break;
1016 case SDLK_KP_MINUS:
1017 case SDLK_KP1:
1018 new_btn = BUTTON_POWER;
1019 break;
1020 case SDLK_KP_MULTIPLY:
1021 new_btn = BUTTON_HOME;
1022 break;
1023 case SDLK_KP5:
1024 case SDLK_SPACE:
1025 case SDLK_KP_ENTER:
1026 case SDLK_RETURN:
1027 new_btn = BUTTON_SELECT;
1028 break;
1029 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
1030 case SDLK_KP4:
1031 case SDLK_LEFT:
1032 new_btn = BUTTON_LEFT;
1033 break;
1034 case SDLK_KP6:
1035 case SDLK_RIGHT:
1036 new_btn = BUTTON_RIGHT;
1037 break;
1038 case SDLK_KP8:
1039 case SDLK_UP:
1040 new_btn = BUTTON_UP;
1041 break;
1042 case SDLK_KP2:
1043 case SDLK_DOWN:
1044 new_btn = BUTTON_DOWN;
1045 break;
1047 case SDLK_INSERT:
1048 case SDLK_KP_MULTIPLY:
1049 new_btn = BUTTON_HOME;
1050 break;
1051 case SDLK_SPACE:
1052 case SDLK_KP5:
1053 new_btn = BUTTON_SELECT;
1054 break;
1055 case SDLK_PAGEDOWN:
1056 case SDLK_KP3:
1057 new_btn = BUTTON_VOL_DOWN;
1058 break;
1059 case SDLK_PAGEUP:
1060 case SDLK_KP9:
1061 new_btn = BUTTON_VOL_UP;
1062 break;
1063 case SDLK_ESCAPE:
1064 case SDLK_KP1:
1065 new_btn = BUTTON_POWER;
1066 break;
1067 #elif CONFIG_KEYPAD == SANSA_M200_PAD
1068 case SDLK_KP4:
1069 case SDLK_LEFT:
1070 new_btn = BUTTON_LEFT;
1071 break;
1072 case SDLK_KP6:
1073 case SDLK_RIGHT:
1074 new_btn = BUTTON_RIGHT;
1075 break;
1076 case SDLK_KP8:
1077 case SDLK_UP:
1078 new_btn = BUTTON_UP;
1079 break;
1080 case SDLK_KP2:
1081 case SDLK_DOWN:
1082 new_btn = BUTTON_DOWN;
1083 break;
1084 case SDLK_PLUS:
1085 new_btn = BUTTON_POWER;
1086 break;
1087 case SDLK_KP5:
1088 new_btn = BUTTON_SELECT;
1089 break;
1090 case SDLK_KP7:
1091 new_btn = BUTTON_VOL_DOWN;
1092 break;
1093 case SDLK_KP9:
1094 new_btn = BUTTON_VOL_UP;
1095 break;
1096 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
1097 case SDLK_KP4:
1098 case SDLK_LEFT:
1099 new_btn = BUTTON_LEFT;
1100 break;
1101 case SDLK_KP6:
1102 case SDLK_RIGHT:
1103 new_btn = BUTTON_RIGHT;
1104 break;
1105 case SDLK_KP8:
1106 case SDLK_UP:
1107 new_btn = BUTTON_UP;
1108 break;
1109 case SDLK_KP2:
1110 case SDLK_DOWN:
1111 new_btn = BUTTON_DOWN;
1112 break;
1113 case SDLK_KP1:
1114 new_btn = BUTTON_MENU;
1115 break;
1116 case SDLK_KP5:
1117 case SDLK_SPACE:
1118 new_btn = BUTTON_PLAY;
1119 break;
1120 case SDLK_KP7:
1121 new_btn = BUTTON_PREV;
1122 break;
1123 case SDLK_KP9:
1124 new_btn = BUTTON_NEXT;
1125 break;
1126 case SDLK_KP_ENTER:
1127 case SDLK_RETURN:
1128 new_btn = BUTTON_POWER;
1129 break;
1130 case SDLK_PAGEUP:
1131 new_btn = BUTTON_VOL_UP;
1132 break;
1133 case SDLK_PAGEDOWN:
1134 new_btn = BUTTON_VOL_DOWN;
1135 break;
1136 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
1137 case SDLK_KP4:
1138 case SDLK_LEFT:
1139 new_btn = BUTTON_LEFT;
1140 break;
1141 case SDLK_KP6:
1142 case SDLK_RIGHT:
1143 new_btn = BUTTON_RIGHT;
1144 break;
1145 case SDLK_KP8:
1146 case SDLK_UP:
1147 new_btn = BUTTON_UP;
1148 break;
1149 case SDLK_KP2:
1150 case SDLK_DOWN:
1151 new_btn = BUTTON_DOWN;
1152 break;
1153 case SDLK_KP5:
1154 case SDLK_SPACE:
1155 new_btn = BUTTON_SELECT;
1156 break;
1157 case SDLK_KP7:
1158 case SDLK_ESCAPE:
1159 new_btn = BUTTON_POWER;
1160 break;
1161 case SDLK_KP1:
1162 new_btn = BUTTON_PLAYLIST;
1163 break;
1164 case SDLK_KP9:
1165 new_btn = BUTTON_VOL_UP;
1166 break;
1167 case SDLK_KP3:
1168 new_btn = BUTTON_VOL_DOWN;
1169 break;
1170 case SDLK_KP_MINUS:
1171 new_btn = BUTTON_MENU;
1172 break;
1173 case SDLK_KP_PLUS:
1174 new_btn = BUTTON_VIEW;
1175 break;
1176 #elif CONFIG_KEYPAD == ONDAVX747_PAD
1177 case SDLK_ESCAPE:
1178 new_btn = BUTTON_POWER;
1179 break;
1180 case SDLK_KP_PLUS:
1181 case SDLK_PLUS:
1182 case SDLK_GREATER:
1183 case SDLK_RIGHTBRACKET:
1184 case SDLK_KP_MULTIPLY:
1185 new_btn = BUTTON_VOL_UP;
1186 break;
1187 case SDLK_KP_MINUS:
1188 case SDLK_MINUS:
1189 case SDLK_LESS:
1190 case SDLK_LEFTBRACKET:
1191 case SDLK_KP_DIVIDE:
1192 new_btn = BUTTON_VOL_DOWN;
1193 break;
1194 case SDLK_KP_ENTER:
1195 case SDLK_RETURN:
1196 new_btn = BUTTON_MENU;
1197 break;
1198 #elif CONFIG_KEYPAD == ONDAVX777_PAD
1199 case SDLK_ESCAPE:
1200 new_btn = BUTTON_POWER;
1201 break;
1202 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
1203 case SDLK_KP4:
1204 case SDLK_LEFT:
1205 new_btn = BUTTON_LEFT;
1206 break;
1207 case SDLK_KP6:
1208 case SDLK_RIGHT:
1209 new_btn = BUTTON_RIGHT;
1210 break;
1211 case SDLK_KP8:
1212 case SDLK_UP:
1213 new_btn = BUTTON_UP;
1214 break;
1215 case SDLK_KP2:
1216 case SDLK_DOWN:
1217 new_btn = BUTTON_DOWN;
1218 break;
1219 case SDLK_KP5:
1220 case SDLK_KP_ENTER:
1221 new_btn = BUTTON_PLAY;
1222 break;
1223 case SDLK_KP9:
1224 case SDLK_PAGEUP:
1225 new_btn = BUTTON_FFWD;
1226 break;
1227 #ifdef SAMSUNG_YH820
1228 case SDLK_KP7:
1229 #else
1230 case SDLK_KP3:
1231 #endif
1232 case SDLK_PAGEDOWN:
1233 new_btn = BUTTON_REW;
1234 break;
1235 case SDLK_KP_PLUS:
1236 new_btn = BUTTON_REC;
1237 break;
1238 #elif CONFIG_KEYPAD == MINI2440_PAD
1239 case SDLK_LEFT:
1240 new_btn = BUTTON_LEFT;
1241 break;
1242 case SDLK_RIGHT:
1243 new_btn = BUTTON_RIGHT;
1244 break;
1245 case SDLK_UP:
1246 new_btn = BUTTON_UP;
1247 break;
1248 case SDLK_DOWN:
1249 new_btn = BUTTON_DOWN;
1250 break;
1251 case SDLK_F8:
1252 case SDLK_ESCAPE:
1253 new_btn = BUTTON_POWER;
1254 break;
1255 case SDLK_KP_ENTER:
1256 case SDLK_RETURN:
1257 case SDLK_a:
1258 new_btn = BUTTON_A;
1259 break;
1260 case SDLK_SPACE:
1261 new_btn = BUTTON_SELECT;
1262 break;
1263 case SDLK_KP_PERIOD:
1264 case SDLK_INSERT:
1265 new_btn = BUTTON_MENU;
1266 break;
1267 case SDLK_KP_PLUS:
1268 new_btn = BUTTON_VOL_UP;
1269 break;
1270 case SDLK_KP_MINUS:
1271 new_btn = BUTTON_VOL_DOWN;
1272 break;
1273 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
1274 case SDLK_KP4:
1275 case SDLK_LEFT:
1276 new_btn = BUTTON_PREV;
1277 break;
1278 case SDLK_KP6:
1279 case SDLK_RIGHT:
1280 new_btn = BUTTON_NEXT;
1281 break;
1282 case SDLK_KP8:
1283 case SDLK_UP:
1284 new_btn = BUTTON_UP;
1285 break;
1286 case SDLK_KP2:
1287 case SDLK_DOWN:
1288 new_btn = BUTTON_DOWN;
1289 break;
1290 case SDLK_KP7:
1291 new_btn = BUTTON_MENU;
1292 break;
1293 case SDLK_KP9:
1294 new_btn = BUTTON_PLAY;
1295 break;
1296 case SDLK_KP5:
1297 new_btn = BUTTON_OK;
1298 break;
1299 case SDLK_KP_DIVIDE:
1300 new_btn = BUTTON_CANCEL;
1301 break;
1302 case SDLK_KP_PLUS:
1303 new_btn = BUTTON_POWER;
1304 break;
1305 case SDLK_KP_MULTIPLY:
1306 new_btn = BUTTON_REC;
1307 break;
1308 #else
1309 #error No keymap defined!
1310 #endif /* CONFIG_KEYPAD */
1311 case SDLK_KP0:
1312 case SDLK_F5:
1313 if(pressed)
1315 sim_trigger_screendump();
1316 return;
1318 break;
1321 /* Call to make up for scrollwheel target implementation. This is
1322 * not handled in the main button.c driver, but on the target
1323 * implementation (look at button-e200.c for example if you are trying to
1324 * figure out why using button_get_data needed a hack before).
1326 #if defined(BUTTON_SCROLL_FWD) && defined(BUTTON_SCROLL_BACK)
1327 if((new_btn == BUTTON_SCROLL_FWD || new_btn == BUTTON_SCROLL_BACK) &&
1328 pressed)
1330 /* Clear these buttons from the data - adding them to the queue is
1331 * handled in the scrollwheel drivers for the targets. They do not
1332 * store the scroll forward/back buttons in their button data for
1333 * the button_read call.
1335 #ifdef HAVE_BACKLIGHT
1336 backlight_on();
1337 #endif
1338 #ifdef HAVE_BUTTON_LIGHT
1339 buttonlight_on();
1340 #endif
1341 queue_post(&button_queue, new_btn, 1<<24);
1342 new_btn &= ~(BUTTON_SCROLL_FWD | BUTTON_SCROLL_BACK);
1344 #endif
1346 if (pressed)
1347 btn |= new_btn;
1348 else
1349 btn &= ~new_btn;
1351 #if defined(HAVE_BUTTON_DATA) && defined(HAVE_TOUCHSCREEN)
1352 int button_read_device(int* data)
1354 *data = mouse_coords;
1355 #else
1356 int button_read_device(void)
1358 #endif
1360 #ifdef HAS_BUTTON_HOLD
1361 int hold_button = button_hold();
1363 #ifdef HAVE_BACKLIGHT
1364 /* light handling */
1365 static int hold_button_old = false;
1366 if (hold_button != hold_button_old)
1368 hold_button_old = hold_button;
1369 backlight_hold_changed(hold_button);
1371 #endif
1373 if (hold_button)
1374 return BUTTON_NONE;
1375 #endif
1377 return btn;
1381 #ifdef HAVE_TOUCHSCREEN
1382 extern bool debug_wps;
1383 void mouse_tick_task(void)
1385 static int last_check = 0;
1386 int x,y;
1387 if (TIME_BEFORE(current_tick, last_check+(HZ/10)))
1388 return;
1389 last_check = current_tick;
1390 if (SDL_GetMouseState(&x, &y) & SDL_BUTTON(SDL_BUTTON_LEFT))
1392 if(background)
1394 x -= UI_LCD_POSX;
1395 y -= UI_LCD_POSY;
1397 if(x<0 || y<0 || x>SIM_LCD_WIDTH || y>SIM_LCD_HEIGHT)
1398 return;
1401 mouse_coords = (x<<16)|y;
1402 button_event(BUTTON_TOUCHSCREEN, true);
1403 if (debug_wps)
1404 printf("Mouse at: (%d, %d)\n", x, y);
1407 #endif
1409 void button_init_sdl(void)
1411 #ifdef HAVE_TOUCHSCREEN
1412 tick_add_task(mouse_tick_task);
1413 #endif
1416 /* Button maps: simulated key, x, y, radius, name */
1417 /* Run sim with --mapping to get coordinates */
1418 /* or --debugbuttons to check */
1419 /* The First matching button is returned */
1421 #ifdef SANSA_FUZE
1422 struct button_map bm[] = {
1423 { SDLK_KP8, 70, 265, 35, "Scroll Back" },
1424 { SDLK_KP9, 141, 255, 31, "Play" },
1425 { SDLK_KP_MULTIPLY, 228, 267, 18, "Home" },
1426 { SDLK_LEFT, 69, 329, 31, "Left" },
1427 { SDLK_SPACE, 141, 330, 20, "Select" },
1428 { SDLK_RIGHT, 214, 331, 23, "Right" },
1429 { SDLK_KP3, 142, 406, 30, "Menu" },
1430 { SDLK_DOWN, 221, 384, 24, "Scroll Fwd" },
1431 { SDLK_KP_MINUS, 270, 299, 25, "Power" },
1432 { SDLK_h, 269, 358, 26, "Hold" },
1433 { 0, 0, 0, 0, "None" }
1435 #elif defined (SANSA_CLIP)
1436 struct button_map bm[] = {
1437 { SDLK_KP_MULTIPLY, 165, 158, 17, "Home" },
1438 { SDLK_KP5, 102, 230, 29, "Select" },
1439 { SDLK_KP8, 100, 179, 25, "Play" },
1440 { SDLK_KP4, 53, 231, 21, "Left" },
1441 { SDLK_KP6, 147, 232, 19, "Right" },
1442 { SDLK_KP2, 105, 275, 22, "Menu" },
1443 { 0, 0, 0, 0, "None" }
1445 #elif defined (SANSA_C200) || defined(SANSA_C200V2)
1446 struct button_map bm[] = {
1448 { SDLK_KP7, 84, 7, 21, "Vol Down" },
1449 { SDLK_KP9, 158, 7, 20, "Vol Up" },
1450 { SDLK_KP1, 173, 130, 27, "Record" },
1451 { SDLK_KP5, 277, 75, 21, "Select" },
1452 { SDLK_KP4, 233, 75, 24, "Left" },
1453 { SDLK_KP6, 313, 74, 18, "Right" },
1454 { SDLK_KP8, 276, 34, 15, "Play" },
1455 { SDLK_KP2, 277, 119, 17, "Down" },
1456 { SDLK_KP3, 314, 113, 19, "Menu" },
1457 { 0, 0, 0, 0, "None" }
1459 #elif defined (SANSA_E200V2) || defined(SANSA_E200)
1460 struct button_map bm[] = {
1461 { SDLK_KP7, 5, 92, 18, "Record" },
1462 { SDLK_KP9, 128, 295, 43, "Play" },
1463 { SDLK_KP4, 42, 380, 33, "Left" },
1464 { SDLK_KP5, 129, 378, 36, "Select" },
1465 { SDLK_KP6, 218, 383, 30, "Right" },
1466 { SDLK_KP3, 129, 461, 29, "Down" },
1467 { SDLK_KP1, 55, 464, 20, "Menu" },
1468 { SDLK_KP8, 92, 338, 17, "Scroll Back" },
1469 { SDLK_KP2, 167, 342, 17, "Scroll Fwd" },
1470 { 0, 0, 0, 0, "None" }
1472 #elif defined (SANSA_M200V4)
1473 struct button_map bm[] = {
1474 { SDLK_KP_PLUS, 54, 14, 16, "Power" },
1475 { SDLK_KP7, 96, 13, 12, "Vol Down" },
1476 { SDLK_KP9, 139, 14, 14, "Vol Up" },
1477 { SDLK_KP5, 260, 82, 20, "Select" },
1478 { SDLK_KP8, 258, 35, 30, "Play" },
1479 { SDLK_KP4, 214, 84, 25, "Left" },
1480 { SDLK_KP6, 300, 83, 24, "Right" },
1481 { SDLK_KP2, 262, 125, 28, "Repeat" },
1482 { SDLK_h, 113, 151, 21, "Hold" },
1483 { 0, 0, 0, 0, "None" }
1485 #elif defined (IPOD_VIDEO)
1486 struct button_map bm[] = {
1487 { SDLK_KP_PERIOD, 174, 350, 35, "Menu" },
1488 { SDLK_KP8, 110, 380, 33, "Scroll Back" },
1489 { SDLK_KP2, 234, 377, 34, "Scroll Fwd" },
1490 { SDLK_KP4, 78, 438, 47, "Left" },
1491 { SDLK_KP5, 172, 435, 43, "Select" },
1492 { SDLK_KP6, 262, 438, 52, "Right" },
1493 { SDLK_KP_PLUS, 172, 519, 43, "Play" },
1494 { 0, 0, 0 , 0, "None" }
1496 #elif defined (IPOD_MINI) || defined(IPOD_MINI2G)
1497 struct button_map bm[] = {
1498 { SDLK_KP5, 92, 267, 29, "Select" },
1499 { SDLK_KP4, 31, 263, 37, "Left" },
1500 { SDLK_KP6, 150, 268, 33, "Right" },
1501 { SDLK_KP_PERIOD, 93, 209, 30, "Menu" },
1502 { SDLK_KP_PLUS, 93, 324, 25, "Play" },
1503 { SDLK_KP8, 53, 220, 29, "Scroll Back" },
1504 { SDLK_KP2, 134, 219, 31, "Scroll Fwd" },
1505 { 0, 0, 0 , 0, "None" }
1507 #elif defined (IPOD_3G)
1508 struct button_map bm[] = {
1509 { SDLK_KP5, 108, 296, 26, "Select" },
1510 { SDLK_KP8, 70, 255, 26, "Scroll Back" },
1511 { SDLK_KP2, 149, 256, 28, "Scroll Fwd" },
1512 { SDLK_KP4, 27, 186, 22, "Left" },
1513 { SDLK_KP_PERIOD, 82, 185, 22, "Menu" },
1514 { SDLK_KP_PERIOD, 133, 185, 21, "Play" },
1515 { SDLK_KP6, 189, 188, 21, "Right" },
1516 { 0, 0, 0 , 0, "None" }
1518 #elif defined (IPOD_4G)
1519 struct button_map bm[] = {
1520 { SDLK_KP5, 96, 269, 27, "Select" },
1521 { SDLK_KP4, 39, 267, 30, "Left" },
1522 { SDLK_KP6, 153, 270, 27, "Right" },
1523 { SDLK_KP_PERIOD, 96, 219, 30, "Menu" },
1524 { SDLK_KP_PLUS, 95, 326, 27, "Play" },
1525 { SDLK_KP8, 57, 233, 29, "Scroll Back" },
1526 { SDLK_KP2, 132, 226, 29, "Scroll Fwd" },
1527 { 0, 0, 0 , 0, "None" }
1529 #elif defined (IPOD_COLOR)
1530 struct button_map bm[] = {
1531 { SDLK_KP5, 128, 362, 35, "Select" },
1532 { SDLK_KP4, 55, 358, 38, "Left" },
1533 { SDLK_KP6, 203, 359, 39, "Right" },
1534 { SDLK_KP_PERIOD, 128, 282, 34, "Menu" },
1535 { SDLK_KP_PLUS, 129, 439, 41, "Play" },
1536 { SDLK_KP8, 76, 309, 34, "Scroll Back" },
1537 { SDLK_KP2, 182, 311, 45, "Scroll Fwd" },
1538 { 0, 0, 0 , 0, "None" }
1540 #elif defined (IPOD_1G2G)
1541 struct button_map bm[] = {
1542 { SDLK_KP5, 112, 265, 31, "Select" },
1543 { SDLK_KP8, 74, 224, 28, "Scroll Back" },
1544 { SDLK_KP2, 146, 228, 28, "Scroll Fwd" },
1545 /* Dummy button to make crescent shape */
1546 { SDLK_y, 112, 265, 76, "None" },
1547 { SDLK_KP8, 74, 224, 28, "Scroll Back" },
1548 { SDLK_KP2, 146, 228, 28, "Scroll Fwd" },
1549 { SDLK_KP6, 159, 268, 64, "Right" },
1550 { SDLK_KP4, 62, 266, 62, "Left" },
1551 { SDLK_KP_PERIOD, 111, 216, 64, "Menu" },
1552 { SDLK_KP_PLUS, 111, 326, 55, "Down" },
1553 { 0, 0, 0 , 0, "None" }
1555 #elif defined (IPOD_NANO)
1556 struct button_map bm[] = {
1557 { SDLK_KP5, 98, 316, 37, "Select" },
1558 { SDLK_KP4, 37, 312, 28, "Left" },
1559 { SDLK_KP6, 160, 313, 25, "Right" },
1560 { SDLK_KP_PERIOD,102, 256, 23, "Menu" },
1561 { SDLK_KP_PLUS, 99, 378, 28, "Play" },
1562 { SDLK_KP8, 58, 272, 24, "Scroll Back" },
1563 { SDLK_KP2, 141, 274, 22, "Scroll Fwd" },
1564 { 0, 0, 0 , 0, "None" }
1566 #elif defined (IPOD_NANO2G)
1567 struct button_map bm[] = {
1568 { SDLK_KP5, 118, 346, 37, "Select" },
1569 { SDLK_KP4, 51, 345, 28, "Left" },
1570 { SDLK_KP6, 180, 346, 26, "Right" },
1571 { SDLK_KP_PERIOD, 114, 286, 23, "Menu" },
1572 { SDLK_KP_PLUS, 115, 412, 27, "Down" },
1573 { SDLK_KP8, 67, 303, 28, "Scroll Back" },
1574 { SDLK_KP2, 163, 303, 27, "Scroll Fwd" },
1575 { 0, 0, 0 , 0, "None" }
1577 #elif defined (COWON_D2)
1578 struct button_map bm[] = {
1579 { SDLK_DELETE, 51, 14, 17, "Power" },
1580 { SDLK_h, 138, 14, 16, "Hold" },
1581 { SDLK_MINUS, 320, 14, 10, "Minus" },
1582 { SDLK_INSERT, 347, 13, 13, "Menu" },
1583 { SDLK_KP_PLUS, 374, 14, 12, "Plus" },
1584 { 0, 0, 0, 0, "None" }
1586 #elif defined (IAUDIO_M3)
1587 struct button_map bm[] = {
1588 { SDLK_KP5, 256, 72, 29, "Play" },
1589 { SDLK_KP6, 255, 137, 28, "Right" },
1590 { SDLK_KP4, 257, 201, 26, "Left" },
1591 { SDLK_KP8, 338, 31, 27, "Up" },
1592 { SDLK_KP2, 339, 92, 23, "Down" },
1593 { SDLK_KP_PERIOD, 336, 50, 23, "Mode" },
1594 { SDLK_KP_DIVIDE, 336, 147, 23, "Rec" },
1595 { SDLK_h, 336, 212, 30, "Hold" },
1596 /* remote */
1597 { SDLK_SPACE, 115, 308, 20, "RC Play" },
1598 { SDLK_RIGHT, 85, 308, 20, "RC Rew" },
1599 { SDLK_LEFT, 143, 308, 20, "RC FF" },
1600 { SDLK_UP, 143, 498, 20, "RC Up" },
1601 { SDLK_DOWN, 85, 498, 20, "RC Down" },
1602 { SDLK_INSERT, 212, 308, 30, "RC Mode" },
1603 { SDLK_F1, 275, 308, 25, "RC Rec" },
1604 { SDLK_KP_ENTER, 115, 498, 20, "RC Menu" },
1605 { 0, 0, 0, 0, "None" }
1607 #elif defined (IAUDIO_M5)
1608 struct button_map bm[] = {
1609 { SDLK_KP_ENTER, 333, 41, 17, "Enter" },
1610 { SDLK_h, 334, 74, 21, "Hold" },
1611 { SDLK_KP_DIVIDE, 333, 142, 24, "Record" },
1612 { SDLK_KP_PLUS, 332, 213, 20, "Play" },
1613 { SDLK_KP5, 250, 291, 19, "Select" },
1614 { SDLK_KP8, 249, 236, 32, "Up" },
1615 { SDLK_KP4, 194, 292, 29, "Left" },
1616 { SDLK_KP6, 297, 290, 27, "Right" },
1617 { SDLK_KP2, 252, 335, 28, "Down" },
1618 { 0, 0, 0, 0, "None" }
1620 #elif defined (IAUDIO_7)
1621 struct button_map bm[] = {
1622 { 0, 0, 0, 0, "None" }
1624 #elif defined (IAUDIO_X5)
1625 struct button_map bm[] = {
1626 { SDLK_KP_ENTER, 275, 38, 17, "Power" },
1627 { SDLK_h, 274, 83, 16, "Hold" },
1628 { SDLK_KP_DIVIDE, 276, 128, 22, "Record" },
1629 { SDLK_KP_PLUS, 274, 186, 22, "Play" },
1630 { SDLK_KP5, 200, 247, 16, "Select" },
1631 { SDLK_KP8, 200, 206, 16, "Up" },
1632 { SDLK_KP4, 163, 248, 19, "Left" },
1633 { SDLK_KP6, 225, 247, 24, "Right" },
1634 { SDLK_KP2, 199, 279, 20, "Down" },
1635 { 0, 0, 0, 0, "None" }
1637 #elif defined (ARCHOS_PLAYER)
1638 struct button_map bm[] = {
1639 { SDLK_KP_PLUS, 79, 252, 23, "On" },
1640 { SDLK_KP_PERIOD, 81, 310, 20, "Menu" },
1641 { SDLK_KP8, 154, 237, 28, "Play" },
1642 { SDLK_KP4, 121, 282, 23, "Left" },
1643 { SDLK_KP6, 187, 282, 22, "Right" },
1644 { SDLK_KP2, 157, 312, 20, "Down" },
1645 { 0, 0, 0, 0, "None" }
1647 #elif defined (ARCHOS_RECORDER)
1648 struct button_map bm[] = {
1649 { SDLK_F1, 94, 205, 22, "F1" },
1650 { SDLK_F2, 136, 204, 21, "F2" },
1651 { SDLK_F3, 174, 204, 24, "F3" },
1652 { SDLK_KP_PLUS, 75, 258, 19, "On" },
1653 { SDLK_KP_ENTER, 76, 307, 15, "Off" },
1654 { SDLK_KP5, 151, 290, 20, "Select" },
1655 { SDLK_KP8, 152, 251, 23, "Up" },
1656 { SDLK_KP4, 113, 288, 26, "Left" },
1657 { SDLK_KP6, 189, 291, 23, "Right" },
1658 { SDLK_KP2, 150, 327, 27, "Down" },
1659 { 0, 0, 0, 0, "None" }
1661 #elif defined (ARCHOS_FMRECORDER) || defined (ARCHOS_RECORDERV2)
1662 struct button_map bm[] = {
1663 { SDLK_F1, 88, 210, 28, "F1" },
1664 { SDLK_F2, 144, 212, 28, "F2" },
1665 { SDLK_F3, 197, 212, 28, "F3" },
1666 { SDLK_KP5, 144, 287, 21, "Select" },
1667 { SDLK_KP_PLUS, 86, 320, 13, "Menu" },
1668 { SDLK_KP_ENTER, 114, 347, 13, "Stop" },
1669 { SDLK_y, 144, 288, 31, "None" },
1670 { SDLK_KP8, 144, 259, 25, "Up" },
1671 { SDLK_KP2, 144, 316, 31, "Down" },
1672 { SDLK_KP6, 171, 287, 32, "Right" },
1673 { SDLK_KP4, 117, 287, 31, "Left" },
1674 { 0, 0, 0, 0, "None" }
1676 #elif defined (ARCHOS_ONDIOSP) || defined (ARCHOS_ONDIOFM)
1677 struct button_map bm[] = {
1678 { SDLK_KP_ENTER, 75, 23, 30, "Enter" },
1679 { SDLK_KP8, 75, 174, 33, "KP8" },
1680 { SDLK_KP4, 26, 186, 48, "KP4" },
1681 { SDLK_KP6, 118, 196, 32, "KP6" },
1682 { SDLK_KP2, 75, 234, 16, "KP2" },
1683 { SDLK_KP_PERIOD, 54, 250, 24, "Period" },
1684 { 0, 0, 0, 0, "None" }
1686 #elif defined (IRIVER_H10)
1687 struct button_map bm[] = {
1688 { SDLK_KP_PLUS, 38, 70, 37, "Power" },
1689 { SDLK_KP4, 123, 194, 26, "Cancel" },
1690 { SDLK_KP6, 257, 195, 34, "Select" },
1691 { SDLK_KP8, 190, 221, 28, "Up" },
1692 { SDLK_KP2, 192, 320, 27, "Down" },
1693 { SDLK_KP_DIVIDE, 349, 49, 20, "Rew" },
1694 { SDLK_KP5, 349, 96, 20, "Play" },
1695 { SDLK_KP_MULTIPLY, 350, 141, 23, "FF" },
1696 { 0, 0, 0, 0, "None" }
1698 #elif defined (IRIVER_H10_5GB)
1699 struct button_map bm[] = {
1700 { SDLK_KP_PLUS, 34, 76, 23, "Power" },
1701 { SDLK_KP4, 106, 222, 28, "Cancel" },
1702 { SDLK_KP6, 243, 220, 31, "Select" },
1703 { SDLK_KP8, 176, 254, 34, "Up" },
1704 { SDLK_KP2, 175, 371, 35, "Down" },
1705 { SDLK_KP_DIVIDE, 319, 63, 26, "Rew" },
1706 { SDLK_KP5, 320, 124, 26, "Play" },
1707 { SDLK_KP_MULTIPLY, 320, 181, 32, "FF" },
1708 { 0, 0, 0, 0, "None" }
1710 #elif defined (IRIVER_H120) || defined (IRIVER_H100)
1711 struct button_map bm[] = {
1712 { SDLK_KP_DIVIDE, 46, 162, 13, "Record" },
1713 { SDLK_KP_PLUS, 327, 36, 16, "Play" },
1714 { SDLK_KP_ENTER, 330, 99, 18, "Stop" },
1715 { SDLK_KP_PERIOD, 330, 163, 18, "AB" },
1716 { SDLK_KP5, 186, 227, 27, "5" },
1717 { SDLK_KP8, 187, 185, 19, "8" },
1718 { SDLK_KP4, 142, 229, 23, "4" },
1719 { SDLK_KP6, 231, 229, 22, "6" },
1720 { SDLK_KP2, 189, 272, 28, "2" },
1721 /* Remote Buttons */
1722 { SDLK_KP_ENTER, 250, 404, 20, "Stop" },
1723 { SDLK_SPACE, 285, 439, 29, "Space" },
1724 { SDLK_h, 336, 291, 24, "Hold" },
1725 { 0, 0, 0, 0, "None" }
1727 #elif defined (IRIVER_H300)
1728 struct button_map bm[] = {
1729 { SDLK_KP_PLUS, 56, 335, 20, "Play" },
1730 { SDLK_KP8, 140, 304, 29, "Up" },
1731 { SDLK_KP_DIVIDE, 233, 331, 23, "Record" },
1732 { SDLK_KP_ENTER, 54, 381, 24, "Stop" },
1733 { SDLK_KP4, 100, 353, 17, "Left" },
1734 { SDLK_KP5, 140, 351, 19, "Navi" },
1735 { SDLK_KP6, 185, 356, 19, "Right" },
1736 { SDLK_KP_PERIOD, 230, 380, 20, "AB" },
1737 { SDLK_KP2, 142, 402, 24, "Down" },
1738 { SDLK_KP_ENTER, 211, 479, 21, "Stop" },
1739 { SDLK_KP_PLUS, 248, 513, 29, "Play" },
1740 { 0, 0, 0, 0, "None" }
1742 #elif defined (MROBE_500)
1743 struct button_map bm[] = {
1744 { SDLK_KP9, 171, 609, 9, "Play" },
1745 { SDLK_KP4, 158, 623, 9, "Left" },
1746 { SDLK_KP6, 184, 622, 9, "Right" },
1747 { SDLK_KP7, 171, 638, 11, "Menu" },
1748 { 0, 0, 0, 0, "None" }
1750 #elif defined (MROBE_100)
1751 struct button_map bm[] = {
1752 { SDLK_KP7, 80, 233, 30, "Menu" },
1753 { SDLK_KP8, 138, 250, 19, "Up" },
1754 { SDLK_KP9, 201, 230, 27, "Play" },
1755 { SDLK_KP4, 63, 305, 25, "Left" },
1756 { SDLK_KP5, 125, 309, 28, "Select" },
1757 { SDLK_KP6, 200, 307, 35, "Right" },
1758 { SDLK_KP1, 52, 380, 32, "Display" },
1759 { SDLK_KP2, 125, 363, 30, "Down" },
1760 { SDLK_KP9, 168, 425, 10, "Play" },
1761 { SDLK_KP4, 156, 440, 11, "Left" },
1762 { SDLK_KP6, 180, 440, 13, "Right" },
1763 { SDLK_KP7, 169, 452, 10, "Menu" },
1764 { SDLK_KP_MULTIPLY, 222, 15, 16, "Power" },
1765 { 0, 0, 0, 0, "None" }
1767 #elif defined (GIGABEAT_F)
1768 struct button_map bm[] = {
1769 { SDLK_KP_PLUS, 361, 187, 22, "Power" },
1770 { SDLK_KP_PERIOD, 361, 270, 17, "Menu" },
1771 { SDLK_KP9, 365, 345, 26, "Vol Up" },
1772 { SDLK_KP3, 363, 433, 25, "Vol Down" },
1773 { SDLK_KP_ENTER, 365, 520, 19, "A" },
1774 { SDLK_KP8, 167, 458, 35, "Up" },
1775 { SDLK_KP4, 86, 537, 29, "Left" },
1776 { SDLK_KP5, 166, 536, 30, "Select" },
1777 { SDLK_KP6, 248, 536, 30, "Right" },
1778 { SDLK_KP2, 169, 617, 28, "Down" },
1779 { 0, 0, 0, 0, "None" }
1781 #elif defined (GIGABEAT_S)
1782 struct button_map bm[] = {
1783 { SDLK_KP_PLUS, 416, 383, 23, "Play" },
1784 { SDLK_KP7, 135, 442, 46, "Back" },
1785 { SDLK_KP9, 288, 447, 35, "Menu" },
1786 { SDLK_KP8, 214, 480, 32, "Up" },
1787 { SDLK_KP4, 128, 558, 33, "Left" },
1788 { SDLK_KP5, 214, 556, 34, "Select" },
1789 { SDLK_KP6, 293, 558, 35, "Right" },
1790 { SDLK_KP2, 214, 637, 38, "Down" },
1791 { 0, 0, 0, 0, "None" }
1793 #elif defined (SAMSUNG_YH820)
1794 struct button_map bm[] = {
1795 { SDLK_KP_PLUS, 330, 53, 23, "Record" },
1796 { SDLK_KP7, 132, 208, 21, "Left" },
1797 { SDLK_KP5, 182, 210, 18, "Play" },
1798 { SDLK_KP9, 234, 211, 22, "Right" },
1799 { SDLK_KP8, 182, 260, 15, "Up" },
1800 { SDLK_KP4, 122, 277, 29, "Menu" },
1801 { SDLK_KP6, 238, 276, 25, "Select" },
1802 { SDLK_KP2, 183, 321, 24, "Down" },
1803 { 0, 0, 0, 0, "None" }
1805 #elif defined (SAMSUNG_YH920) || defined (SAMSUNG_YH925)
1806 struct button_map bm[] = {
1807 { SDLK_KP9, 370, 32, 15, "FF" },
1808 { SDLK_KP5, 369, 84, 25, "Play" },
1809 { SDLK_KP5, 367, 125, 27, "Play" },
1810 { SDLK_KP3, 369, 188, 17, "Rew" },
1811 { SDLK_KP_PLUS, 370, 330, 30, "Record" },
1812 { SDLK_KP4, 146, 252, 32, "Menu" },
1813 { SDLK_KP8, 204, 226, 27, "Up" },
1814 { SDLK_KP6, 257, 250, 34, "Select" },
1815 { SDLK_KP2, 205, 294, 35, "Down" },
1816 { 0, 0, 0, 0, "None" }
1818 #elif defined (ONDA_VX747) || defined (ONDA_VX747P)
1819 struct button_map bm[] = {
1820 { SDLK_MINUS, 113, 583, 28, "Minus" },
1821 { SDLK_PLUS, 227, 580, 28, "Plus" },
1822 { SDLK_RETURN, 171, 583, 34, "Menu" },
1823 { 0, 0, 0, 0, "None" }
1825 #elif defined (PHILIPS_SA9200)
1826 struct button_map bm[] = {
1827 { SDLK_KP_ENTER, 25, 155, 33, "Power" },
1828 { SDLK_PAGEUP, 210, 98, 31, "Vol Up" },
1829 { SDLK_PAGEDOWN, 210, 168, 34, "Vol Down" },
1830 { SDLK_KP7, 40, 249, 26, "Prev" },
1831 { SDLK_KP8, 110, 247, 22, "Up" },
1832 { SDLK_KP9, 183, 249, 31, "Next" },
1833 { SDLK_KP4, 45, 305, 25, "Left" },
1834 { SDLK_KP5, 111, 304, 24, "Play" },
1835 { SDLK_KP6, 183, 304, 21, "Right" },
1836 { SDLK_KP1, 43, 377, 21, "Menu" },
1837 { SDLK_KP2, 112, 371, 24, "Down" },
1838 { 0, 0, 0, 0, "None" }
1840 #elif defined (CREATIVE_ZVM) || defined (CREATIVE_ZVM60GB) || \
1841 defined (CREATIVE_ZV)
1842 struct button_map bm[] = {
1843 { SDLK_KP7, 52, 414, 35, "Custom" },
1844 { SDLK_KP8, 185, 406, 55, "Up" },
1845 { SDLK_KP9, 315, 421, 46, "Play" },
1846 { SDLK_KP4, 122, 500, 41, "Left" },
1847 { SDLK_KP6, 247, 493, 49, "Right" },
1848 { SDLK_KP1, 58, 577, 49, "Back" },
1849 { SDLK_KP2, 186, 585, 46, "Down" },
1850 { SDLK_KP3, 311, 569, 47, "Menu" },
1851 { 0, 0, 0, 0, "None" }
1853 #else
1854 struct button_map bm[] = {
1855 { 0, 0, 0, 0, ""}
1857 #endif
1859 int xy2button( int x, int y) {
1860 int i;
1861 extern bool debug_buttons;
1863 for ( i = 0; bm[i].button; i++ )
1864 /* check distance from center of button < radius */
1865 if ( ( (x-bm[i].x)*(x-bm[i].x) ) + ( ( y-bm[i].y)*(y-bm[i].y) ) < bm[i].radius*bm[i].radius ) {
1866 if (debug_buttons)
1867 printf("Button: %s\n", bm[i].description );
1868 return bm[i].button;
1870 return 0;