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