1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
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 ****************************************************************************/
23 #include <stdlib.h> /* EXIT_SUCCESS */
24 #include "sim-ui-defines.h"
25 #include "lcd-charcells.h"
26 #include "lcd-remote.h"
30 #include "backlight.h"
32 #include "sim_tasks.h"
33 #include "button-sdl.h"
34 #include "backlight.h"
38 #ifdef HAVE_TOUCHSCREEN
39 #include "touchscreen.h"
40 static int mouse_coords
= 0;
42 /* how long until repeat kicks in */
43 #define REPEAT_START 6
45 /* the speed repeat starts at */
46 #define REPEAT_INTERVAL_START 4
48 /* speed repeat finishes at */
49 #define REPEAT_INTERVAL_FINISH 2
51 #ifdef HAVE_TOUCHSCREEN
52 #define USB_KEY SDLK_c /* SDLK_u is taken by BUTTON_MIDLEFT */
54 #define USB_KEY SDLK_u
57 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
58 int _remote_type
=REMOTETYPE_H100_LCD
;
66 static int xy2button(int x
, int y
);
68 struct event_queue button_queue
;
70 static int btn
= 0; /* Hopefully keeps track of currently pressed keys... */
72 #ifdef HAS_BUTTON_HOLD
73 bool hold_button_state
= false;
74 bool button_hold(void) {
75 return hold_button_state
;
79 #ifdef HAS_REMOTE_BUTTON_HOLD
80 bool remote_hold_button_state
= false;
81 bool remote_button_hold(void) {
82 return remote_hold_button_state
;
85 static void button_event(int key
, bool pressed
);
86 extern bool debug_wps
;
89 bool gui_message_loop(void)
92 static int x
,y
,xybutton
= 0;
94 while (SDL_WaitEvent(&event
))
96 sim_enter_irq_handler();
101 button_event(event
.key
.keysym
.sym
, event
.type
== SDL_KEYDOWN
);
103 case SDL_MOUSEBUTTONDOWN
:
104 switch ( event
.button
.button
) {
105 #ifdef HAVE_SCROLLWHEEL
106 case SDL_BUTTON_WHEELUP
:
107 button_event( SDLK_UP
, true );
109 case SDL_BUTTON_WHEELDOWN
:
110 button_event( SDLK_DOWN
, true );
113 case SDL_BUTTON_LEFT
:
114 case SDL_BUTTON_MIDDLE
:
115 if ( mapping
&& background
) {
120 xybutton
= xy2button( event
.button
.x
, event
.button
.y
);
122 button_event( xybutton
, true );
129 if (debug_wps
&& event
.button
.button
== 1)
133 if ( event
.button
.y
< UI_REMOTE_POSY
) /* Main Screen */
134 printf("Mouse at: (%d, %d)\n", event
.button
.x
- UI_LCD_POSX
-1 , event
.button
.y
- UI_LCD_POSY
- 1 );
136 printf("Mouse at: (%d, %d)\n", event
.button
.x
- UI_REMOTE_POSX
-1 , event
.button
.y
- UI_REMOTE_POSY
- 1 );
138 printf("Mouse at: (%d, %d)\n", event
.button
.x
- UI_LCD_POSX
-1 , event
.button
.y
- UI_LCD_POSY
- 1 );
141 if ( event
.button
.y
/display_zoom
< LCD_HEIGHT
) /* Main Screen */
142 printf("Mouse at: (%d, %d)\n", event
.button
.x
/display_zoom
, event
.button
.y
/display_zoom
);
145 printf("Mouse at: (%d, %d)\n", event
.button
.x
/display_zoom
, event
.button
.y
/display_zoom
- LCD_HEIGHT
);
149 case SDL_MOUSEBUTTONUP
:
150 switch ( event
.button
.button
) {
151 /* The scrollwheel button up events are ignored as they are queued immediately */
152 case SDL_BUTTON_LEFT
:
153 case SDL_BUTTON_MIDDLE
:
154 if ( mapping
&& background
) {
155 printf(" { SDLK_, %d, %d, %d, \"\" },\n", x
,
156 #define SQUARE(x) ((x)*(x))
157 y
, (int)sqrt( SQUARE(x
-(int)event
.button
.x
)
158 + SQUARE(y
-(int)event
.button
.y
)) );
160 if ( background
&& xybutton
) {
161 button_event( xybutton
, false );
164 #ifdef HAVE_TOUCHSCREEN
166 button_event(BUTTON_TOUCHSCREEN
, false);
178 sim_exit_irq_handler();
182 /*printf("Unhandled event\n"); */
185 sim_exit_irq_handler();
191 static void button_event(int key
, bool pressed
)
194 static bool usb_connected
= false;
195 if (usb_connected
&& key
!= USB_KEY
)
200 #ifdef HAVE_TOUCHSCREEN
201 case BUTTON_TOUCHSCREEN
:
202 switch (touchscreen_get_mode())
204 case TOUCHSCREEN_POINT
:
205 new_btn
= BUTTON_TOUCHSCREEN
;
207 case TOUCHSCREEN_BUTTON
:
209 static int touchscreen_buttons
[3][3] = {
210 {BUTTON_TOPLEFT
, BUTTON_TOPMIDDLE
, BUTTON_TOPRIGHT
},
211 {BUTTON_MIDLEFT
, BUTTON_CENTER
, BUTTON_MIDRIGHT
},
212 {BUTTON_BOTTOMLEFT
, BUTTON_BOTTOMMIDDLE
, BUTTON_BOTTOMRIGHT
},
214 int px_x
= ((mouse_coords
&0xffff0000)>>16);
215 int px_y
= ((mouse_coords
&0x0000ffff));
216 new_btn
= touchscreen_buttons
[px_y
/(LCD_HEIGHT
/3)][px_x
/(LCD_WIDTH
/3)];
223 new_btn
= BUTTON_TOPLEFT
;
228 new_btn
= BUTTON_TOPMIDDLE
;
232 new_btn
= BUTTON_TOPRIGHT
;
237 new_btn
= BUTTON_MIDLEFT
;
241 new_btn
= BUTTON_CENTER
;
246 new_btn
= BUTTON_MIDRIGHT
;
250 new_btn
= BUTTON_BOTTOMLEFT
;
255 new_btn
= BUTTON_BOTTOMMIDDLE
;
259 new_btn
= BUTTON_BOTTOMRIGHT
;
264 touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT
? TOUCHSCREEN_BUTTON
: TOUCHSCREEN_POINT
);
265 printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT
? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
273 usb_connected
= !usb_connected
;
275 queue_post(&button_queue
, SYS_USB_CONNECTED
, 0);
277 queue_post(&button_queue
, SYS_USB_DISCONNECTED
, 0);
281 #ifdef HAS_BUTTON_HOLD
285 hold_button_state
= !hold_button_state
;
286 DEBUGF("Hold button is %s\n", hold_button_state
?"ON":"OFF");
291 #ifdef HAS_REMOTE_BUTTON_HOLD
295 remote_hold_button_state
= !remote_hold_button_state
;
296 DEBUGF("Remote hold button is %s\n",
297 remote_hold_button_state
?"ON":"OFF");
302 #if CONFIG_KEYPAD == GIGABEAT_PAD
305 new_btn
= BUTTON_LEFT
;
309 new_btn
= BUTTON_RIGHT
;
317 new_btn
= BUTTON_DOWN
;
321 new_btn
= BUTTON_POWER
;
324 new_btn
= BUTTON_POWER
;
333 new_btn
= BUTTON_SELECT
;
337 new_btn
= BUTTON_MENU
;
340 new_btn
= BUTTON_VOL_UP
;
343 new_btn
= BUTTON_VOL_DOWN
;
346 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
349 new_btn
= BUTTON_LEFT
;
353 new_btn
= BUTTON_RIGHT
;
361 new_btn
= BUTTON_DOWN
;
365 new_btn
= BUTTON_POWER
;
370 new_btn
= BUTTON_PLAY
;
373 new_btn
= BUTTON_BACK
;
377 new_btn
= BUTTON_SELECT
;
382 new_btn
= BUTTON_MENU
;
385 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
388 new_btn
= BUTTON_LEFT
;
392 new_btn
= BUTTON_RIGHT
;
400 new_btn
= BUTTON_DOWN
;
404 new_btn
= BUTTON_PLAY
;
407 new_btn
= BUTTON_POWER
;
412 new_btn
= BUTTON_POWER
;
416 new_btn
= BUTTON_REC
;
420 new_btn
= BUTTON_SELECT
;
423 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
425 new_btn
= BUTTON_LEFT
;
428 new_btn
= BUTTON_RC_REW
;
431 new_btn
= BUTTON_RIGHT
;
434 new_btn
= BUTTON_RC_FF
;
437 new_btn
= BUTTON_VOL_UP
;
440 new_btn
= BUTTON_RC_VOL_UP
;
443 new_btn
= BUTTON_VOL_DOWN
;
446 new_btn
= BUTTON_RC_VOL_DOWN
;
449 new_btn
= BUTTON_MODE
;
452 new_btn
= BUTTON_RC_MODE
;
455 new_btn
= BUTTON_REC
;
458 new_btn
= BUTTON_RC_REC
;
461 new_btn
= BUTTON_PLAY
;
464 new_btn
= BUTTON_RC_PLAY
;
468 new_btn
= BUTTON_RC_MENU
;
471 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
472 || (CONFIG_KEYPAD == IPOD_4G_PAD)
475 new_btn
= BUTTON_LEFT
;
479 new_btn
= BUTTON_RIGHT
;
483 new_btn
= BUTTON_SCROLL_BACK
;
487 new_btn
= BUTTON_SCROLL_FWD
;
491 new_btn
= BUTTON_PLAY
;
495 new_btn
= BUTTON_SELECT
;
499 new_btn
= BUTTON_MENU
;
502 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
505 new_btn
= BUTTON_LEFT
;
509 new_btn
= BUTTON_RIGHT
;
513 new_btn
= BUTTON_SCROLL_UP
;
517 new_btn
= BUTTON_SCROLL_DOWN
;
521 new_btn
= BUTTON_POWER
;
524 new_btn
= BUTTON_POWER
;
528 new_btn
= BUTTON_REW
;
530 case SDLK_KP_MULTIPLY
:
536 new_btn
= BUTTON_PLAY
;
539 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
544 case REMOTETYPE_UNPLUGGED
:
545 _remote_type
=REMOTETYPE_H100_LCD
;
546 DEBUGF("Changed remote type to H100\n");
548 case REMOTETYPE_H100_LCD
:
549 _remote_type
=REMOTETYPE_H300_LCD
;
550 DEBUGF("Changed remote type to H300\n");
552 case REMOTETYPE_H300_LCD
:
553 _remote_type
=REMOTETYPE_H300_NONLCD
;
554 DEBUGF("Changed remote type to H300 NON-LCD\n");
556 case REMOTETYPE_H300_NONLCD
:
557 _remote_type
=REMOTETYPE_UNPLUGGED
;
558 DEBUGF("Changed remote type to none\n");
564 new_btn
= BUTTON_LEFT
;
568 new_btn
= BUTTON_RIGHT
;
576 new_btn
= BUTTON_DOWN
;
585 new_btn
= BUTTON_OFF
;
589 new_btn
= BUTTON_REC
;
593 new_btn
= BUTTON_SELECT
;
597 new_btn
= BUTTON_MODE
;
600 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
603 new_btn
= BUTTON_LEFT
;
607 new_btn
= BUTTON_RIGHT
;
615 new_btn
= BUTTON_DOWN
;
619 new_btn
= BUTTON_PLAY
;
628 new_btn
= BUTTON_SELECT
;
632 new_btn
= BUTTON_MODE
;
635 #elif CONFIG_KEYPAD == ONDIO_PAD
638 new_btn
= BUTTON_LEFT
;
642 new_btn
= BUTTON_RIGHT
;
650 new_btn
= BUTTON_DOWN
;
655 new_btn
= BUTTON_OFF
;
659 new_btn
= BUTTON_MENU
;
662 #elif CONFIG_KEYPAD == PLAYER_PAD
665 new_btn
= BUTTON_LEFT
;
669 new_btn
= BUTTON_RIGHT
;
673 new_btn
= BUTTON_PLAY
;
677 new_btn
= BUTTON_STOP
;
685 new_btn
= BUTTON_MENU
;
688 #elif CONFIG_KEYPAD == RECORDER_PAD
691 new_btn
= BUTTON_LEFT
;
695 new_btn
= BUTTON_RIGHT
;
703 new_btn
= BUTTON_DOWN
;
712 new_btn
= BUTTON_OFF
;
718 case SDLK_KP_MULTIPLY
:
728 new_btn
= BUTTON_PLAY
;
731 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
734 new_btn
= BUTTON_LEFT
;
738 new_btn
= BUTTON_RIGHT
;
746 new_btn
= BUTTON_DOWN
;
755 new_btn
= BUTTON_OFF
;
761 case SDLK_KP_MULTIPLY
:
771 new_btn
= BUTTON_SELECT
;
774 #elif CONFIG_KEYPAD == SANSA_E200_PAD
777 new_btn
= BUTTON_LEFT
;
781 new_btn
= BUTTON_RIGHT
;
785 new_btn
= BUTTON_SCROLL_BACK
;
789 new_btn
= BUTTON_SCROLL_FWD
;
797 new_btn
= BUTTON_DOWN
;
801 new_btn
= BUTTON_POWER
;
805 new_btn
= BUTTON_REC
;
809 new_btn
= BUTTON_SELECT
;
812 #elif CONFIG_KEYPAD == SANSA_C200_PAD
815 new_btn
= BUTTON_LEFT
;
819 new_btn
= BUTTON_RIGHT
;
827 new_btn
= BUTTON_DOWN
;
830 new_btn
= BUTTON_POWER
;
833 new_btn
= BUTTON_REC
;
838 new_btn
= BUTTON_SELECT
;
841 new_btn
= BUTTON_VOL_DOWN
;
844 new_btn
= BUTTON_VOL_UP
;
847 #elif CONFIG_KEYPAD == MROBE500_PAD
849 new_btn
= BUTTON_RC_HEART
;
852 new_btn
= BUTTON_RC_MODE
;
855 new_btn
= BUTTON_RC_VOL_DOWN
;
858 new_btn
= BUTTON_RC_VOL_UP
;
862 case SDLK_LEFTBRACKET
:
864 new_btn
= BUTTON_LEFT
;
868 case SDLK_RIGHTBRACKET
:
869 case SDLK_KP_MULTIPLY
:
870 new_btn
= BUTTON_RIGHT
;
873 new_btn
= BUTTON_RC_PLAY
;
876 new_btn
= BUTTON_RC_DOWN
;
880 new_btn
= BUTTON_POWER
;
882 #elif CONFIG_KEYPAD == MROBE100_PAD
884 new_btn
= BUTTON_RC_HEART
;
887 new_btn
= BUTTON_RC_MODE
;
890 new_btn
= BUTTON_RC_VOL_DOWN
;
893 new_btn
= BUTTON_RC_VOL_UP
;
896 new_btn
= BUTTON_RC_FF
;
899 new_btn
= BUTTON_RC_REW
;
902 new_btn
= BUTTON_RC_PLAY
;
905 new_btn
= BUTTON_RC_DOWN
;
908 new_btn
= BUTTON_DISPLAY
;
911 new_btn
= BUTTON_MENU
;
914 new_btn
= BUTTON_PLAY
;
917 new_btn
= BUTTON_LEFT
;
920 new_btn
= BUTTON_RIGHT
;
926 new_btn
= BUTTON_DOWN
;
930 new_btn
= BUTTON_SELECT
;
932 case SDLK_KP_MULTIPLY
:
935 new_btn
= BUTTON_POWER
;
938 #elif CONFIG_KEYPAD == COWON_D2_PAD
939 case SDLK_KP_MULTIPLY
:
944 new_btn
= BUTTON_POWER
;
948 new_btn
= BUTTON_PLUS
;
952 new_btn
= BUTTON_MINUS
;
958 new_btn
= BUTTON_MENU
;
960 #elif CONFIG_KEYPAD == IAUDIO67_PAD
962 new_btn
= BUTTON_RIGHT
;
965 new_btn
= BUTTON_LEFT
;
968 new_btn
= BUTTON_STOP
;
973 new_btn
= BUTTON_PLAY
;
976 new_btn
= BUTTON_VOLUP
;
979 new_btn
= BUTTON_VOLDOWN
;
982 new_btn
= BUTTON_MENU
;
985 new_btn
= BUTTON_POWER
;
987 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
989 new_btn
= BUTTON_BACK
;
992 new_btn
= BUTTON_MENU
;
995 new_btn
= BUTTON_CUSTOM
;
998 new_btn
= BUTTON_PLAY
;
1002 new_btn
= BUTTON_LEFT
;
1006 new_btn
= BUTTON_RIGHT
;
1010 new_btn
= BUTTON_UP
;
1014 new_btn
= BUTTON_DOWN
;
1018 new_btn
= BUTTON_SELECT
;
1020 case SDLK_KP_MULTIPLY
:
1023 new_btn
= BUTTON_POWER
;
1025 #elif CONFIG_KEYPAD == CREATIVEZV_PAD
1027 new_btn
= BUTTON_PREV
;
1030 new_btn
= BUTTON_NEXT
;
1033 new_btn
= BUTTON_BACK
;
1036 new_btn
= BUTTON_PLAY
;
1039 new_btn
= BUTTON_MENU
;
1043 new_btn
= BUTTON_LEFT
;
1047 new_btn
= BUTTON_RIGHT
;
1051 new_btn
= BUTTON_UP
;
1055 new_btn
= BUTTON_DOWN
;
1059 new_btn
= BUTTON_SELECT
;
1061 case SDLK_KP_MULTIPLY
:
1064 new_btn
= BUTTON_POWER
;
1067 new_btn
= BUTTON_VOL_DOWN
;
1070 new_btn
= BUTTON_VOL_UP
;
1072 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
1074 new_btn
= BUTTON_PREV
;
1077 new_btn
= BUTTON_NEXT
;
1082 new_btn
= BUTTON_PLAY
;
1084 case SDLK_KP_PERIOD
:
1086 new_btn
= BUTTON_MENU
;
1090 new_btn
= BUTTON_UP
;
1094 new_btn
= BUTTON_DOWN
;
1098 new_btn
= BUTTON_SELECT
;
1100 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
1103 new_btn
= BUTTON_LEFT
;
1107 new_btn
= BUTTON_RIGHT
;
1111 new_btn
= BUTTON_SCROLL_BACK
;
1115 new_btn
= BUTTON_SCROLL_FWD
;
1119 new_btn
= BUTTON_UP
;
1123 new_btn
= BUTTON_DOWN
;
1127 new_btn
= BUTTON_POWER
;
1129 case SDLK_KP_MULTIPLY
:
1130 new_btn
= BUTTON_HOME
;
1136 new_btn
= BUTTON_SELECT
;
1138 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
1141 new_btn
= BUTTON_LEFT
;
1145 new_btn
= BUTTON_RIGHT
;
1149 new_btn
= BUTTON_UP
;
1153 new_btn
= BUTTON_DOWN
;
1157 case SDLK_KP_MULTIPLY
:
1158 new_btn
= BUTTON_HOME
;
1162 new_btn
= BUTTON_SELECT
;
1166 new_btn
= BUTTON_VOL_DOWN
;
1170 new_btn
= BUTTON_VOL_UP
;
1174 new_btn
= BUTTON_POWER
;
1176 #elif CONFIG_KEYPAD == SANSA_M200_PAD
1179 new_btn
= BUTTON_LEFT
;
1183 new_btn
= BUTTON_RIGHT
;
1187 new_btn
= BUTTON_UP
;
1191 new_btn
= BUTTON_DOWN
;
1194 new_btn
= BUTTON_POWER
;
1197 new_btn
= BUTTON_SELECT
;
1200 new_btn
= BUTTON_VOL_DOWN
;
1203 new_btn
= BUTTON_VOL_UP
;
1205 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
1208 new_btn
= BUTTON_LEFT
;
1212 new_btn
= BUTTON_RIGHT
;
1216 new_btn
= BUTTON_UP
;
1220 new_btn
= BUTTON_DOWN
;
1223 new_btn
= BUTTON_MENU
;
1227 new_btn
= BUTTON_PLAY
;
1230 new_btn
= BUTTON_PREV
;
1233 new_btn
= BUTTON_NEXT
;
1237 new_btn
= BUTTON_POWER
;
1240 new_btn
= BUTTON_VOL_UP
;
1243 new_btn
= BUTTON_VOL_DOWN
;
1245 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
1248 new_btn
= BUTTON_LEFT
;
1252 new_btn
= BUTTON_RIGHT
;
1256 new_btn
= BUTTON_UP
;
1260 new_btn
= BUTTON_DOWN
;
1264 new_btn
= BUTTON_SELECT
;
1268 new_btn
= BUTTON_POWER
;
1271 new_btn
= BUTTON_PLAYLIST
;
1274 new_btn
= BUTTON_VOL_UP
;
1277 new_btn
= BUTTON_VOL_DOWN
;
1280 new_btn
= BUTTON_MENU
;
1283 new_btn
= BUTTON_VIEW
;
1285 #elif CONFIG_KEYPAD == ONDAVX747_PAD
1287 new_btn
= BUTTON_POWER
;
1292 case SDLK_RIGHTBRACKET
:
1293 case SDLK_KP_MULTIPLY
:
1294 new_btn
= BUTTON_VOL_UP
;
1299 case SDLK_LEFTBRACKET
:
1300 case SDLK_KP_DIVIDE
:
1301 new_btn
= BUTTON_VOL_DOWN
;
1305 new_btn
= BUTTON_MENU
;
1307 #elif CONFIG_KEYPAD == ONDAVX777_PAD
1309 new_btn
= BUTTON_POWER
;
1311 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
1314 new_btn
= BUTTON_LEFT
;
1318 new_btn
= BUTTON_RIGHT
;
1322 new_btn
= BUTTON_UP
;
1326 new_btn
= BUTTON_DOWN
;
1330 new_btn
= BUTTON_PLAY
;
1334 new_btn
= BUTTON_FFWD
;
1336 #ifdef SAMSUNG_YH820
1342 new_btn
= BUTTON_REW
;
1345 new_btn
= BUTTON_REC
;
1347 #elif CONFIG_KEYPAD == MINI2440_PAD
1349 new_btn
= BUTTON_LEFT
;
1352 new_btn
= BUTTON_RIGHT
;
1355 new_btn
= BUTTON_UP
;
1358 new_btn
= BUTTON_DOWN
;
1362 new_btn
= BUTTON_POWER
;
1370 new_btn
= BUTTON_SELECT
;
1372 case SDLK_KP_PERIOD
:
1374 new_btn
= BUTTON_MENU
;
1377 new_btn
= BUTTON_VOL_UP
;
1380 new_btn
= BUTTON_VOL_DOWN
;
1382 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
1385 new_btn
= BUTTON_PREV
;
1389 new_btn
= BUTTON_NEXT
;
1393 new_btn
= BUTTON_UP
;
1397 new_btn
= BUTTON_DOWN
;
1400 new_btn
= BUTTON_MENU
;
1403 new_btn
= BUTTON_PLAY
;
1406 new_btn
= BUTTON_OK
;
1408 case SDLK_KP_DIVIDE
:
1409 new_btn
= BUTTON_CANCEL
;
1412 new_btn
= BUTTON_POWER
;
1414 case SDLK_KP_MULTIPLY
:
1415 new_btn
= BUTTON_REC
;
1418 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
1420 new_btn
= BUTTON_PREV
;
1423 new_btn
= BUTTON_NEXT
;
1426 new_btn
= BUTTON_SELECT
;
1429 new_btn
= BUTTON_PLAY
;
1432 new_btn
= BUTTON_VOL_DOWN
;
1435 new_btn
= BUTTON_VOL_UP
;
1438 new_btn
= BUTTON_REC
;
1442 #error No keymap defined!
1443 #endif /* CONFIG_KEYPAD */
1448 sim_trigger_screendump();
1454 /* Call to make up for scrollwheel target implementation. This is
1455 * not handled in the main button.c driver, but on the target
1456 * implementation (look at button-e200.c for example if you are trying to
1457 * figure out why using button_get_data needed a hack before).
1459 #if defined(BUTTON_SCROLL_FWD) && defined(BUTTON_SCROLL_BACK)
1460 if((new_btn
== BUTTON_SCROLL_FWD
|| new_btn
== BUTTON_SCROLL_BACK
) &&
1463 /* Clear these buttons from the data - adding them to the queue is
1464 * handled in the scrollwheel drivers for the targets. They do not
1465 * store the scroll forward/back buttons in their button data for
1466 * the button_read call.
1468 #ifdef HAVE_BACKLIGHT
1471 #ifdef HAVE_BUTTON_LIGHT
1474 queue_post(&button_queue
, new_btn
, 1<<24);
1475 new_btn
&= ~(BUTTON_SCROLL_FWD
| BUTTON_SCROLL_BACK
);
1484 #if defined(HAVE_BUTTON_DATA) && defined(HAVE_TOUCHSCREEN)
1485 int button_read_device(int* data
)
1487 *data
= mouse_coords
;
1489 int button_read_device(void)
1492 #ifdef HAS_BUTTON_HOLD
1493 int hold_button
= button_hold();
1495 #ifdef HAVE_BACKLIGHT
1496 /* light handling */
1497 static int hold_button_old
= false;
1498 if (hold_button
!= hold_button_old
)
1500 hold_button_old
= hold_button
;
1501 backlight_hold_changed(hold_button
);
1514 #ifdef HAVE_TOUCHSCREEN
1515 extern bool debug_wps
;
1516 void mouse_tick_task(void)
1518 static int last_check
= 0;
1520 if (TIME_BEFORE(current_tick
, last_check
+(HZ
/10)))
1522 last_check
= current_tick
;
1523 if (SDL_GetMouseState(&x
, &y
) & SDL_BUTTON(SDL_BUTTON_LEFT
))
1530 if(x
<0 || y
<0 || x
>SIM_LCD_WIDTH
|| y
>SIM_LCD_HEIGHT
)
1534 mouse_coords
= (x
<<16)|y
;
1535 button_event(BUTTON_TOUCHSCREEN
, true);
1537 printf("Mouse at: (%d, %d)\n", x
, y
);
1542 void button_init_device(void)
1544 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY
, SDL_DEFAULT_REPEAT_INTERVAL
);
1545 #ifdef HAVE_TOUCHSCREEN
1546 tick_add_task(mouse_tick_task
);
1550 /* Button maps: simulated key, x, y, radius, name */
1551 /* Run sim with --mapping to get coordinates */
1552 /* or --debugbuttons to check */
1553 /* The First matching button is returned */
1555 int button
, x
, y
, radius
;
1560 struct button_map bm
[] = {
1561 { SDLK_KP8
, 70, 265, 35, "Scroll Back" },
1562 { SDLK_KP9
, 141, 255, 31, "Play" },
1563 { SDLK_KP_MULTIPLY
, 228, 267, 18, "Home" },
1564 { SDLK_LEFT
, 69, 329, 31, "Left" },
1565 { SDLK_SPACE
, 141, 330, 20, "Select" },
1566 { SDLK_RIGHT
, 214, 331, 23, "Right" },
1567 { SDLK_KP3
, 142, 406, 30, "Menu" },
1568 { SDLK_DOWN
, 221, 384, 24, "Scroll Fwd" },
1569 { SDLK_KP_MINUS
, 270, 299, 25, "Power" },
1570 { SDLK_h
, 269, 358, 26, "Hold" },
1571 { 0, 0, 0, 0, "None" }
1573 #elif defined (SANSA_CLIP)
1574 struct button_map bm
[] = {
1575 { SDLK_KP_MULTIPLY
, 165, 158, 17, "Home" },
1576 { SDLK_KP5
, 102, 230, 29, "Select" },
1577 { SDLK_KP8
, 100, 179, 25, "Play" },
1578 { SDLK_KP4
, 53, 231, 21, "Left" },
1579 { SDLK_KP6
, 147, 232, 19, "Right" },
1580 { SDLK_KP2
, 105, 275, 22, "Menu" },
1581 { 0, 0, 0, 0, "None" }
1583 #elif defined (SANSA_C200) || defined(SANSA_C200V2)
1584 struct button_map bm
[] = {
1586 { SDLK_KP7
, 84, 7, 21, "Vol Down" },
1587 { SDLK_KP9
, 158, 7, 20, "Vol Up" },
1588 { SDLK_KP1
, 173, 130, 27, "Record" },
1589 { SDLK_KP5
, 277, 75, 21, "Select" },
1590 { SDLK_KP4
, 233, 75, 24, "Left" },
1591 { SDLK_KP6
, 313, 74, 18, "Right" },
1592 { SDLK_KP8
, 276, 34, 15, "Play" },
1593 { SDLK_KP2
, 277, 119, 17, "Down" },
1594 { SDLK_KP3
, 314, 113, 19, "Menu" },
1595 { 0, 0, 0, 0, "None" }
1597 #elif defined (SANSA_E200V2) || defined(SANSA_E200)
1598 struct button_map bm
[] = {
1599 { SDLK_KP7
, 5, 92, 18, "Record" },
1600 { SDLK_KP9
, 128, 295, 43, "Play" },
1601 { SDLK_KP4
, 42, 380, 33, "Left" },
1602 { SDLK_KP5
, 129, 378, 36, "Select" },
1603 { SDLK_KP6
, 218, 383, 30, "Right" },
1604 { SDLK_KP3
, 129, 461, 29, "Down" },
1605 { SDLK_KP1
, 55, 464, 20, "Menu" },
1606 { SDLK_KP8
, 92, 338, 17, "Scroll Back" },
1607 { SDLK_KP2
, 167, 342, 17, "Scroll Fwd" },
1608 { 0, 0, 0, 0, "None" }
1610 #elif defined (SANSA_M200V4)
1611 struct button_map bm
[] = {
1612 { SDLK_KP_PLUS
, 54, 14, 16, "Power" },
1613 { SDLK_KP7
, 96, 13, 12, "Vol Down" },
1614 { SDLK_KP9
, 139, 14, 14, "Vol Up" },
1615 { SDLK_KP5
, 260, 82, 20, "Select" },
1616 { SDLK_KP8
, 258, 35, 30, "Play" },
1617 { SDLK_KP4
, 214, 84, 25, "Left" },
1618 { SDLK_KP6
, 300, 83, 24, "Right" },
1619 { SDLK_KP2
, 262, 125, 28, "Repeat" },
1620 { SDLK_h
, 113, 151, 21, "Hold" },
1621 { 0, 0, 0, 0, "None" }
1623 #elif defined (IPOD_VIDEO)
1624 struct button_map bm
[] = {
1625 { SDLK_KP_PERIOD
, 174, 350, 35, "Menu" },
1626 { SDLK_KP8
, 110, 380, 33, "Scroll Back" },
1627 { SDLK_KP2
, 234, 377, 34, "Scroll Fwd" },
1628 { SDLK_KP4
, 78, 438, 47, "Left" },
1629 { SDLK_KP5
, 172, 435, 43, "Select" },
1630 { SDLK_KP6
, 262, 438, 52, "Right" },
1631 { SDLK_KP_PLUS
, 172, 519, 43, "Play" },
1632 { 0, 0, 0 , 0, "None" }
1634 #elif defined (IPOD_MINI) || defined(IPOD_MINI2G)
1635 struct button_map bm
[] = {
1636 { SDLK_KP5
, 92, 267, 29, "Select" },
1637 { SDLK_KP4
, 31, 263, 37, "Left" },
1638 { SDLK_KP6
, 150, 268, 33, "Right" },
1639 { SDLK_KP_PERIOD
, 93, 209, 30, "Menu" },
1640 { SDLK_KP_PLUS
, 93, 324, 25, "Play" },
1641 { SDLK_KP8
, 53, 220, 29, "Scroll Back" },
1642 { SDLK_KP2
, 134, 219, 31, "Scroll Fwd" },
1643 { 0, 0, 0 , 0, "None" }
1645 #elif defined (IPOD_3G)
1646 struct button_map bm
[] = {
1647 { SDLK_KP5
, 108, 296, 26, "Select" },
1648 { SDLK_KP8
, 70, 255, 26, "Scroll Back" },
1649 { SDLK_KP2
, 149, 256, 28, "Scroll Fwd" },
1650 { SDLK_KP4
, 27, 186, 22, "Left" },
1651 { SDLK_KP_PERIOD
, 82, 185, 22, "Menu" },
1652 { SDLK_KP_PERIOD
, 133, 185, 21, "Play" },
1653 { SDLK_KP6
, 189, 188, 21, "Right" },
1654 { 0, 0, 0 , 0, "None" }
1656 #elif defined (IPOD_4G)
1657 struct button_map bm
[] = {
1658 { SDLK_KP5
, 96, 269, 27, "Select" },
1659 { SDLK_KP4
, 39, 267, 30, "Left" },
1660 { SDLK_KP6
, 153, 270, 27, "Right" },
1661 { SDLK_KP_PERIOD
, 96, 219, 30, "Menu" },
1662 { SDLK_KP_PLUS
, 95, 326, 27, "Play" },
1663 { SDLK_KP8
, 57, 233, 29, "Scroll Back" },
1664 { SDLK_KP2
, 132, 226, 29, "Scroll Fwd" },
1665 { 0, 0, 0 , 0, "None" }
1667 #elif defined (IPOD_COLOR)
1668 struct button_map bm
[] = {
1669 { SDLK_KP5
, 128, 362, 35, "Select" },
1670 { SDLK_KP4
, 55, 358, 38, "Left" },
1671 { SDLK_KP6
, 203, 359, 39, "Right" },
1672 { SDLK_KP_PERIOD
, 128, 282, 34, "Menu" },
1673 { SDLK_KP_PLUS
, 129, 439, 41, "Play" },
1674 { SDLK_KP8
, 76, 309, 34, "Scroll Back" },
1675 { SDLK_KP2
, 182, 311, 45, "Scroll Fwd" },
1676 { 0, 0, 0 , 0, "None" }
1678 #elif defined (IPOD_1G2G)
1679 struct button_map bm
[] = {
1680 { SDLK_KP5
, 112, 265, 31, "Select" },
1681 { SDLK_KP8
, 74, 224, 28, "Scroll Back" },
1682 { SDLK_KP2
, 146, 228, 28, "Scroll Fwd" },
1683 /* Dummy button to make crescent shape */
1684 { SDLK_y
, 112, 265, 76, "None" },
1685 { SDLK_KP8
, 74, 224, 28, "Scroll Back" },
1686 { SDLK_KP2
, 146, 228, 28, "Scroll Fwd" },
1687 { SDLK_KP6
, 159, 268, 64, "Right" },
1688 { SDLK_KP4
, 62, 266, 62, "Left" },
1689 { SDLK_KP_PERIOD
, 111, 216, 64, "Menu" },
1690 { SDLK_KP_PLUS
, 111, 326, 55, "Down" },
1691 { 0, 0, 0 , 0, "None" }
1693 #elif defined (IPOD_NANO)
1694 struct button_map bm
[] = {
1695 { SDLK_KP5
, 98, 316, 37, "Select" },
1696 { SDLK_KP4
, 37, 312, 28, "Left" },
1697 { SDLK_KP6
, 160, 313, 25, "Right" },
1698 { SDLK_KP_PERIOD
,102, 256, 23, "Menu" },
1699 { SDLK_KP_PLUS
, 99, 378, 28, "Play" },
1700 { SDLK_KP8
, 58, 272, 24, "Scroll Back" },
1701 { SDLK_KP2
, 141, 274, 22, "Scroll Fwd" },
1702 { 0, 0, 0 , 0, "None" }
1704 #elif defined (IPOD_NANO2G)
1705 struct button_map bm
[] = {
1706 { SDLK_KP5
, 118, 346, 37, "Select" },
1707 { SDLK_KP4
, 51, 345, 28, "Left" },
1708 { SDLK_KP6
, 180, 346, 26, "Right" },
1709 { SDLK_KP_PERIOD
, 114, 286, 23, "Menu" },
1710 { SDLK_KP_PLUS
, 115, 412, 27, "Down" },
1711 { SDLK_KP8
, 67, 303, 28, "Scroll Back" },
1712 { SDLK_KP2
, 163, 303, 27, "Scroll Fwd" },
1713 { 0, 0, 0 , 0, "None" }
1715 #elif defined (COWON_D2)
1716 struct button_map bm
[] = {
1717 { SDLK_DELETE
, 51, 14, 17, "Power" },
1718 { SDLK_h
, 138, 14, 16, "Hold" },
1719 { SDLK_MINUS
, 320, 14, 10, "Minus" },
1720 { SDLK_INSERT
, 347, 13, 13, "Menu" },
1721 { SDLK_KP_PLUS
, 374, 14, 12, "Plus" },
1722 { 0, 0, 0, 0, "None" }
1724 #elif defined (IAUDIO_M3)
1725 struct button_map bm
[] = {
1726 { SDLK_KP5
, 256, 72, 29, "Play" },
1727 { SDLK_KP6
, 255, 137, 28, "Right" },
1728 { SDLK_KP4
, 257, 201, 26, "Left" },
1729 { SDLK_KP8
, 338, 31, 27, "Up" },
1730 { SDLK_KP2
, 339, 92, 23, "Down" },
1731 { SDLK_KP_PERIOD
, 336, 50, 23, "Mode" },
1732 { SDLK_KP_DIVIDE
, 336, 147, 23, "Rec" },
1733 { SDLK_h
, 336, 212, 30, "Hold" },
1735 { SDLK_SPACE
, 115, 308, 20, "RC Play" },
1736 { SDLK_RIGHT
, 85, 308, 20, "RC Rew" },
1737 { SDLK_LEFT
, 143, 308, 20, "RC FF" },
1738 { SDLK_UP
, 143, 498, 20, "RC Up" },
1739 { SDLK_DOWN
, 85, 498, 20, "RC Down" },
1740 { SDLK_INSERT
, 212, 308, 30, "RC Mode" },
1741 { SDLK_F1
, 275, 308, 25, "RC Rec" },
1742 { SDLK_KP_ENTER
, 115, 498, 20, "RC Menu" },
1743 { 0, 0, 0, 0, "None" }
1745 #elif defined (IAUDIO_M5)
1746 struct button_map bm
[] = {
1747 { SDLK_KP_ENTER
, 333, 41, 17, "Enter" },
1748 { SDLK_h
, 334, 74, 21, "Hold" },
1749 { SDLK_KP_DIVIDE
, 333, 142, 24, "Record" },
1750 { SDLK_KP_PLUS
, 332, 213, 20, "Play" },
1751 { SDLK_KP5
, 250, 291, 19, "Select" },
1752 { SDLK_KP8
, 249, 236, 32, "Up" },
1753 { SDLK_KP4
, 194, 292, 29, "Left" },
1754 { SDLK_KP6
, 297, 290, 27, "Right" },
1755 { SDLK_KP2
, 252, 335, 28, "Down" },
1756 { 0, 0, 0, 0, "None" }
1758 #elif defined (IAUDIO_7)
1759 struct button_map bm
[] = {
1760 { 0, 0, 0, 0, "None" }
1762 #elif defined (IAUDIO_X5)
1763 struct button_map bm
[] = {
1764 { SDLK_KP_ENTER
, 275, 38, 17, "Power" },
1765 { SDLK_h
, 274, 83, 16, "Hold" },
1766 { SDLK_KP_DIVIDE
, 276, 128, 22, "Record" },
1767 { SDLK_KP_PLUS
, 274, 186, 22, "Play" },
1768 { SDLK_KP5
, 200, 247, 16, "Select" },
1769 { SDLK_KP8
, 200, 206, 16, "Up" },
1770 { SDLK_KP4
, 163, 248, 19, "Left" },
1771 { SDLK_KP6
, 225, 247, 24, "Right" },
1772 { SDLK_KP2
, 199, 279, 20, "Down" },
1773 { 0, 0, 0, 0, "None" }
1775 #elif defined (ARCHOS_PLAYER)
1776 struct button_map bm
[] = {
1777 { SDLK_KP_PLUS
, 79, 252, 23, "On" },
1778 { SDLK_KP_PERIOD
, 81, 310, 20, "Menu" },
1779 { SDLK_KP8
, 154, 237, 28, "Play" },
1780 { SDLK_KP4
, 121, 282, 23, "Left" },
1781 { SDLK_KP6
, 187, 282, 22, "Right" },
1782 { SDLK_KP2
, 157, 312, 20, "Down" },
1783 { 0, 0, 0, 0, "None" }
1785 #elif defined (ARCHOS_RECORDER)
1786 struct button_map bm
[] = {
1787 { SDLK_F1
, 94, 205, 22, "F1" },
1788 { SDLK_F2
, 136, 204, 21, "F2" },
1789 { SDLK_F3
, 174, 204, 24, "F3" },
1790 { SDLK_KP_PLUS
, 75, 258, 19, "On" },
1791 { SDLK_KP_ENTER
, 76, 307, 15, "Off" },
1792 { SDLK_KP5
, 151, 290, 20, "Select" },
1793 { SDLK_KP8
, 152, 251, 23, "Up" },
1794 { SDLK_KP4
, 113, 288, 26, "Left" },
1795 { SDLK_KP6
, 189, 291, 23, "Right" },
1796 { SDLK_KP2
, 150, 327, 27, "Down" },
1797 { 0, 0, 0, 0, "None" }
1799 #elif defined (ARCHOS_FMRECORDER) || defined (ARCHOS_RECORDERV2)
1800 struct button_map bm
[] = {
1801 { SDLK_F1
, 88, 210, 28, "F1" },
1802 { SDLK_F2
, 144, 212, 28, "F2" },
1803 { SDLK_F3
, 197, 212, 28, "F3" },
1804 { SDLK_KP5
, 144, 287, 21, "Select" },
1805 { SDLK_KP_PLUS
, 86, 320, 13, "Menu" },
1806 { SDLK_KP_ENTER
, 114, 347, 13, "Stop" },
1807 { SDLK_y
, 144, 288, 31, "None" },
1808 { SDLK_KP8
, 144, 259, 25, "Up" },
1809 { SDLK_KP2
, 144, 316, 31, "Down" },
1810 { SDLK_KP6
, 171, 287, 32, "Right" },
1811 { SDLK_KP4
, 117, 287, 31, "Left" },
1812 { 0, 0, 0, 0, "None" }
1814 #elif defined (ARCHOS_ONDIOSP) || defined (ARCHOS_ONDIOFM)
1815 struct button_map bm
[] = {
1816 { SDLK_KP_ENTER
, 75, 23, 30, "Enter" },
1817 { SDLK_KP8
, 75, 174, 33, "KP8" },
1818 { SDLK_KP4
, 26, 186, 48, "KP4" },
1819 { SDLK_KP6
, 118, 196, 32, "KP6" },
1820 { SDLK_KP2
, 75, 234, 16, "KP2" },
1821 { SDLK_KP_PERIOD
, 54, 250, 24, "Period" },
1822 { 0, 0, 0, 0, "None" }
1824 #elif defined (IRIVER_H10)
1825 struct button_map bm
[] = {
1826 { SDLK_KP_PLUS
, 38, 70, 37, "Power" },
1827 { SDLK_KP4
, 123, 194, 26, "Cancel" },
1828 { SDLK_KP6
, 257, 195, 34, "Select" },
1829 { SDLK_KP8
, 190, 221, 28, "Up" },
1830 { SDLK_KP2
, 192, 320, 27, "Down" },
1831 { SDLK_KP_DIVIDE
, 349, 49, 20, "Rew" },
1832 { SDLK_KP5
, 349, 96, 20, "Play" },
1833 { SDLK_KP_MULTIPLY
, 350, 141, 23, "FF" },
1834 { 0, 0, 0, 0, "None" }
1836 #elif defined (IRIVER_H10_5GB)
1837 struct button_map bm
[] = {
1838 { SDLK_KP_PLUS
, 34, 76, 23, "Power" },
1839 { SDLK_KP4
, 106, 222, 28, "Cancel" },
1840 { SDLK_KP6
, 243, 220, 31, "Select" },
1841 { SDLK_KP8
, 176, 254, 34, "Up" },
1842 { SDLK_KP2
, 175, 371, 35, "Down" },
1843 { SDLK_KP_DIVIDE
, 319, 63, 26, "Rew" },
1844 { SDLK_KP5
, 320, 124, 26, "Play" },
1845 { SDLK_KP_MULTIPLY
, 320, 181, 32, "FF" },
1846 { 0, 0, 0, 0, "None" }
1848 #elif defined (IRIVER_H120) || defined (IRIVER_H100)
1849 struct button_map bm
[] = {
1850 { SDLK_KP_DIVIDE
, 46, 162, 13, "Record" },
1851 { SDLK_KP_PLUS
, 327, 36, 16, "Play" },
1852 { SDLK_KP_ENTER
, 330, 99, 18, "Stop" },
1853 { SDLK_KP_PERIOD
, 330, 163, 18, "AB" },
1854 { SDLK_KP5
, 186, 227, 27, "5" },
1855 { SDLK_KP8
, 187, 185, 19, "8" },
1856 { SDLK_KP4
, 142, 229, 23, "4" },
1857 { SDLK_KP6
, 231, 229, 22, "6" },
1858 { SDLK_KP2
, 189, 272, 28, "2" },
1859 /* Remote Buttons */
1860 { SDLK_KP_ENTER
, 250, 404, 20, "Stop" },
1861 { SDLK_SPACE
, 285, 439, 29, "Space" },
1862 { SDLK_h
, 336, 291, 24, "Hold" },
1863 { 0, 0, 0, 0, "None" }
1865 #elif defined (IRIVER_H300)
1866 struct button_map bm
[] = {
1867 { SDLK_KP_PLUS
, 56, 335, 20, "Play" },
1868 { SDLK_KP8
, 140, 304, 29, "Up" },
1869 { SDLK_KP_DIVIDE
, 233, 331, 23, "Record" },
1870 { SDLK_KP_ENTER
, 54, 381, 24, "Stop" },
1871 { SDLK_KP4
, 100, 353, 17, "Left" },
1872 { SDLK_KP5
, 140, 351, 19, "Navi" },
1873 { SDLK_KP6
, 185, 356, 19, "Right" },
1874 { SDLK_KP_PERIOD
, 230, 380, 20, "AB" },
1875 { SDLK_KP2
, 142, 402, 24, "Down" },
1876 { SDLK_KP_ENTER
, 211, 479, 21, "Stop" },
1877 { SDLK_KP_PLUS
, 248, 513, 29, "Play" },
1878 { 0, 0, 0, 0, "None" }
1880 #elif defined (MROBE_500)
1881 struct button_map bm
[] = {
1882 { SDLK_KP9
, 171, 609, 9, "Play" },
1883 { SDLK_KP4
, 158, 623, 9, "Left" },
1884 { SDLK_KP6
, 184, 622, 9, "Right" },
1885 { SDLK_KP7
, 171, 638, 11, "Menu" },
1886 { 0, 0, 0, 0, "None" }
1888 #elif defined (MROBE_100)
1889 struct button_map bm
[] = {
1890 { SDLK_KP7
, 80, 233, 30, "Menu" },
1891 { SDLK_KP8
, 138, 250, 19, "Up" },
1892 { SDLK_KP9
, 201, 230, 27, "Play" },
1893 { SDLK_KP4
, 63, 305, 25, "Left" },
1894 { SDLK_KP5
, 125, 309, 28, "Select" },
1895 { SDLK_KP6
, 200, 307, 35, "Right" },
1896 { SDLK_KP1
, 52, 380, 32, "Display" },
1897 { SDLK_KP2
, 125, 363, 30, "Down" },
1898 { SDLK_KP9
, 168, 425, 10, "Play" },
1899 { SDLK_KP4
, 156, 440, 11, "Left" },
1900 { SDLK_KP6
, 180, 440, 13, "Right" },
1901 { SDLK_KP7
, 169, 452, 10, "Menu" },
1902 { SDLK_KP_MULTIPLY
, 222, 15, 16, "Power" },
1903 { 0, 0, 0, 0, "None" }
1905 #elif defined (GIGABEAT_F)
1906 struct button_map bm
[] = {
1907 { SDLK_KP_PLUS
, 361, 187, 22, "Power" },
1908 { SDLK_KP_PERIOD
, 361, 270, 17, "Menu" },
1909 { SDLK_KP9
, 365, 345, 26, "Vol Up" },
1910 { SDLK_KP3
, 363, 433, 25, "Vol Down" },
1911 { SDLK_KP_ENTER
, 365, 520, 19, "A" },
1912 { SDLK_KP8
, 167, 458, 35, "Up" },
1913 { SDLK_KP4
, 86, 537, 29, "Left" },
1914 { SDLK_KP5
, 166, 536, 30, "Select" },
1915 { SDLK_KP6
, 248, 536, 30, "Right" },
1916 { SDLK_KP2
, 169, 617, 28, "Down" },
1917 { 0, 0, 0, 0, "None" }
1919 #elif defined (GIGABEAT_S)
1920 struct button_map bm
[] = {
1921 { SDLK_KP_PLUS
, 416, 383, 23, "Play" },
1922 { SDLK_KP7
, 135, 442, 46, "Back" },
1923 { SDLK_KP9
, 288, 447, 35, "Menu" },
1924 { SDLK_KP8
, 214, 480, 32, "Up" },
1925 { SDLK_KP4
, 128, 558, 33, "Left" },
1926 { SDLK_KP5
, 214, 556, 34, "Select" },
1927 { SDLK_KP6
, 293, 558, 35, "Right" },
1928 { SDLK_KP2
, 214, 637, 38, "Down" },
1929 { 0, 0, 0, 0, "None" }
1931 #elif defined (SAMSUNG_YH820)
1932 struct button_map bm
[] = {
1933 { SDLK_KP_PLUS
, 330, 53, 23, "Record" },
1934 { SDLK_KP7
, 132, 208, 21, "Left" },
1935 { SDLK_KP5
, 182, 210, 18, "Play" },
1936 { SDLK_KP9
, 234, 211, 22, "Right" },
1937 { SDLK_KP8
, 182, 260, 15, "Up" },
1938 { SDLK_KP4
, 122, 277, 29, "Menu" },
1939 { SDLK_KP6
, 238, 276, 25, "Select" },
1940 { SDLK_KP2
, 183, 321, 24, "Down" },
1941 { 0, 0, 0, 0, "None" }
1943 #elif defined (SAMSUNG_YH920) || defined (SAMSUNG_YH925)
1944 struct button_map bm
[] = {
1945 { SDLK_KP9
, 370, 32, 15, "FF" },
1946 { SDLK_KP5
, 369, 84, 25, "Play" },
1947 { SDLK_KP5
, 367, 125, 27, "Play" },
1948 { SDLK_KP3
, 369, 188, 17, "Rew" },
1949 { SDLK_KP_PLUS
, 370, 330, 30, "Record" },
1950 { SDLK_KP4
, 146, 252, 32, "Menu" },
1951 { SDLK_KP8
, 204, 226, 27, "Up" },
1952 { SDLK_KP6
, 257, 250, 34, "Select" },
1953 { SDLK_KP2
, 205, 294, 35, "Down" },
1954 { 0, 0, 0, 0, "None" }
1956 #elif defined (ONDA_VX747) || defined (ONDA_VX747P)
1957 struct button_map bm
[] = {
1958 { SDLK_MINUS
, 113, 583, 28, "Minus" },
1959 { SDLK_PLUS
, 227, 580, 28, "Plus" },
1960 { SDLK_RETURN
, 171, 583, 34, "Menu" },
1961 { 0, 0, 0, 0, "None" }
1963 #elif defined (PHILIPS_SA9200)
1964 struct button_map bm
[] = {
1965 { SDLK_KP_ENTER
, 25, 155, 33, "Power" },
1966 { SDLK_PAGEUP
, 210, 98, 31, "Vol Up" },
1967 { SDLK_PAGEDOWN
, 210, 168, 34, "Vol Down" },
1968 { SDLK_KP7
, 40, 249, 26, "Prev" },
1969 { SDLK_KP8
, 110, 247, 22, "Up" },
1970 { SDLK_KP9
, 183, 249, 31, "Next" },
1971 { SDLK_KP4
, 45, 305, 25, "Left" },
1972 { SDLK_KP5
, 111, 304, 24, "Play" },
1973 { SDLK_KP6
, 183, 304, 21, "Right" },
1974 { SDLK_KP1
, 43, 377, 21, "Menu" },
1975 { SDLK_KP2
, 112, 371, 24, "Down" },
1976 { 0, 0, 0, 0, "None" }
1978 #elif defined (CREATIVE_ZVM) || defined (CREATIVE_ZVM60GB) || \
1979 defined (CREATIVE_ZV)
1980 struct button_map bm
[] = {
1981 { SDLK_KP7
, 52, 414, 35, "Custom" },
1982 { SDLK_KP8
, 185, 406, 55, "Up" },
1983 { SDLK_KP9
, 315, 421, 46, "Play" },
1984 { SDLK_KP4
, 122, 500, 41, "Left" },
1985 { SDLK_KP6
, 247, 493, 49, "Right" },
1986 { SDLK_KP1
, 58, 577, 49, "Back" },
1987 { SDLK_KP2
, 186, 585, 46, "Down" },
1988 { SDLK_KP3
, 311, 569, 47, "Menu" },
1989 { 0, 0, 0, 0, "None" }
1991 #elif defined (MPIO_HD200)
1992 struct button_map bm
[] = {
1993 { SDLK_ESCAPE
, 369, 257, 20, "Rec" },
1994 { SDLK_RETURN
, 369, 305, 20, "Play/Stop" },
1995 { SDLK_UP
, 353, 168, 10, "Rew" },
1996 { SDLK_DOWN
, 353, 198, 10, "FF" },
1997 { SDLK_SPACE
, 353, 186, 10, "Select" },
1998 { SDLK_LEFT
, 123, 67, 20, "Vol Down" },
1999 { SDLK_RIGHT
, 206, 67, 20, "Vol Up" },
2000 { SDLK_h
, 369, 402, 30, "Hold" },
2001 { 0, 0, 0, 0, "None" }
2004 struct button_map bm
[] = {
2009 static int xy2button( int x
, int y
)
2012 extern bool debug_buttons
;
2014 for ( i
= 0; bm
[i
].button
; i
++ )
2015 /* check distance from center of button < radius */
2016 if ( ( (x
-bm
[i
].x
)*(x
-bm
[i
].x
) ) + ( ( y
-bm
[i
].y
)*(y
-bm
[i
].y
) ) < bm
[i
].radius
*bm
[i
].radius
) {
2018 printf("Button: %s\n", bm
[i
].description
);
2019 return bm
[i
].button
;