Introduce names for header and row color in the tables so that they are the same...
[kugel-rb.git] / uisimulator / sdl / button.c
blob598758442026c97231398f034c8f9f3777de08a6
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"
32 #include "debug.h"
34 static intptr_t button_data; /* data value from last message dequeued */
36 #ifdef HAVE_TOUCHSCREEN
37 #include "touchscreen.h"
38 static int mouse_coords = 0;
39 static int last_touchscreen_touch = 0xffff;
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 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
51 int _remote_type=REMOTETYPE_H100_LCD;
53 int remote_type(void)
55 return _remote_type;
57 #endif
59 struct event_queue button_queue;
61 static int btn = 0; /* Hopefully keeps track of currently pressed keys... */
63 #ifdef HAVE_BACKLIGHT
64 static bool filter_first_keypress;
66 void set_backlight_filter_keypress(bool value)
68 filter_first_keypress = value;
70 #ifdef HAVE_REMOTE_LCD
71 static bool remote_filter_first_keypress;
73 void set_remote_backlight_filter_keypress(bool value)
75 remote_filter_first_keypress = value;
77 #endif
78 #endif
80 #ifdef HAS_BUTTON_HOLD
81 bool hold_button_state = false;
82 bool button_hold(void) {
83 return hold_button_state;
85 #endif
87 #ifdef HAS_REMOTE_BUTTON_HOLD
88 bool remote_hold_button_state = false;
89 bool remote_button_hold(void) {
90 return remote_hold_button_state;
92 #endif
94 static int lastbtn;
95 void button_event(int key, bool pressed)
97 int new_btn = 0;
98 int diff = 0;
99 int data = 0;
100 static int count = 0;
101 static int repeat_speed = REPEAT_INTERVAL_START;
102 static int repeat_count = 0;
103 static bool repeat = false;
104 static bool post = false;
105 #ifdef HAVE_BACKLIGHT
106 static bool skip_release = false;
107 #ifdef HAVE_REMOTE_LCD
108 static bool skip_remote_release = false;
109 #endif
110 #endif
111 static bool usb_connected = false;
112 if (usb_connected && key != SDLK_u)
113 return;
114 switch (key)
117 #ifdef HAVE_TOUCHSCREEN
118 case BUTTON_TOUCHSCREEN:
119 data = mouse_coords;
120 switch (touchscreen_get_mode())
122 case TOUCHSCREEN_POINT:
123 new_btn = BUTTON_TOUCHSCREEN;
124 break;
125 case TOUCHSCREEN_BUTTON:
127 static int touchscreen_buttons[3][3] = {
128 {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT},
129 {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT},
130 {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT},
132 int px_x = ((data&0xffff0000)>>16), px_y = ((data&0x0000ffff));
133 new_btn = touchscreen_buttons[px_y/(LCD_HEIGHT/3)][px_x/(LCD_WIDTH/3)];
134 break;
137 break;
138 case SDLK_KP7:
139 new_btn = BUTTON_TOPLEFT;
140 break;
141 case SDLK_KP8:
142 new_btn = BUTTON_TOPMIDDLE;
143 break;
144 case SDLK_KP9:
145 new_btn = BUTTON_TOPRIGHT;
146 break;
147 case SDLK_KP4:
148 new_btn = BUTTON_MIDLEFT;
149 break;
150 case SDLK_KP5:
151 new_btn = BUTTON_CENTER;
152 break;
153 case SDLK_KP6:
154 new_btn = BUTTON_MIDRIGHT;
155 break;
156 case SDLK_KP1:
157 new_btn = BUTTON_BOTTOMLEFT;
158 break;
159 case SDLK_KP2:
160 new_btn = BUTTON_BOTTOMMIDDLE;
161 break;
162 case SDLK_KP3:
163 new_btn = BUTTON_BOTTOMRIGHT;
164 break;
165 case SDLK_F4:
166 if(pressed)
168 touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT ? TOUCHSCREEN_BUTTON : TOUCHSCREEN_POINT);
169 printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT ? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
171 break;
173 #endif
174 case SDLK_u:
175 if (!pressed)
177 usb_connected = !usb_connected;
178 if (usb_connected)
179 queue_post(&button_queue, SYS_USB_CONNECTED, 0);
180 else
181 queue_post(&button_queue, SYS_USB_DISCONNECTED, 0);
183 return;
185 #ifdef HAS_BUTTON_HOLD
186 case SDLK_h:
187 if(pressed)
189 hold_button_state = !hold_button_state;
190 DEBUGF("Hold button is %s\n", hold_button_state?"ON":"OFF");
192 return;
193 #endif
195 #ifdef HAS_REMOTE_BUTTON_HOLD
196 case SDLK_j:
197 if(pressed)
199 remote_hold_button_state = !remote_hold_button_state;
200 DEBUGF("Remote hold button is %s\n",
201 remote_hold_button_state?"ON":"OFF");
203 return;
204 #endif
206 #if CONFIG_KEYPAD == GIGABEAT_PAD
207 case SDLK_KP4:
208 case SDLK_LEFT:
209 new_btn = BUTTON_LEFT;
210 break;
211 case SDLK_KP6:
212 case SDLK_RIGHT:
213 new_btn = BUTTON_RIGHT;
214 break;
215 case SDLK_KP8:
216 case SDLK_UP:
217 new_btn = BUTTON_UP;
218 break;
219 case SDLK_KP2:
220 case SDLK_DOWN:
221 new_btn = BUTTON_DOWN;
222 break;
223 case SDLK_KP_PLUS:
224 case SDLK_F8:
225 new_btn = BUTTON_POWER;
226 break;
227 case SDLK_ESCAPE:
228 new_btn = BUTTON_POWER;
229 break;
230 case SDLK_KP_ENTER:
231 case SDLK_RETURN:
232 case SDLK_a:
233 new_btn = BUTTON_A;
234 break;
235 case SDLK_KP5:
236 case SDLK_SPACE:
237 new_btn = BUTTON_SELECT;
238 break;
239 case SDLK_KP_PERIOD:
240 case SDLK_INSERT:
241 new_btn = BUTTON_MENU;
242 break;
243 case SDLK_KP9:
244 new_btn = BUTTON_VOL_UP;
245 break;
246 case SDLK_KP3:
247 new_btn = BUTTON_VOL_DOWN;
248 break;
250 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
251 case SDLK_KP4:
252 case SDLK_LEFT:
253 new_btn = BUTTON_LEFT;
254 break;
255 case SDLK_KP6:
256 case SDLK_RIGHT:
257 new_btn = BUTTON_RIGHT;
258 break;
259 case SDLK_KP8:
260 case SDLK_UP:
261 new_btn = BUTTON_UP;
262 break;
263 case SDLK_KP2:
264 case SDLK_DOWN:
265 new_btn = BUTTON_DOWN;
266 break;
267 case SDLK_F8:
268 case SDLK_ESCAPE:
269 new_btn = BUTTON_POWER;
270 break;
271 case SDLK_KP_PLUS:
272 case SDLK_KP_ENTER:
273 case SDLK_RETURN:
274 new_btn = BUTTON_PLAY;
275 break;
276 case SDLK_KP7:
277 new_btn = BUTTON_BACK;
278 break;
279 case SDLK_KP5:
280 case SDLK_SPACE:
281 new_btn = BUTTON_SELECT;
282 break;
283 case SDLK_KP9:
284 case SDLK_KP_PERIOD:
285 case SDLK_INSERT:
286 new_btn = BUTTON_MENU;
287 break;
289 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
290 case SDLK_KP4:
291 case SDLK_LEFT:
292 new_btn = BUTTON_LEFT;
293 break;
294 case SDLK_KP6:
295 case SDLK_RIGHT:
296 new_btn = BUTTON_RIGHT;
297 break;
298 case SDLK_KP8:
299 case SDLK_UP:
300 new_btn = BUTTON_UP;
301 break;
302 case SDLK_KP2:
303 case SDLK_DOWN:
304 new_btn = BUTTON_DOWN;
305 break;
306 case SDLK_KP_PLUS:
307 case SDLK_F8:
308 new_btn = BUTTON_PLAY;
309 break;
310 case SDLK_ESCAPE:
311 new_btn = BUTTON_POWER;
312 break;
313 case SDLK_KP_ENTER:
314 case SDLK_RETURN:
315 case SDLK_a:
316 new_btn = BUTTON_POWER;
317 break;
318 case SDLK_KP_DIVIDE:
319 case SDLK_F1:
320 new_btn = BUTTON_REC;
321 break;
322 case SDLK_KP5:
323 case SDLK_SPACE:
324 new_btn = BUTTON_SELECT;
325 break;
327 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
328 case SDLK_KP4:
329 case SDLK_LEFT:
330 new_btn = BUTTON_LEFT;
331 break;
332 case SDLK_KP6:
333 case SDLK_RIGHT:
334 new_btn = BUTTON_RIGHT;
335 break;
336 case SDLK_KP8:
337 case SDLK_UP:
338 new_btn = BUTTON_VOL_UP;
339 break;
340 case SDLK_KP2:
341 case SDLK_DOWN:
342 new_btn = BUTTON_VOL_DOWN;
343 break;
344 case SDLK_KP_PERIOD:
345 case SDLK_INSERT:
346 new_btn = BUTTON_MODE;
347 break;
348 case SDLK_KP_DIVIDE:
349 case SDLK_F1:
350 new_btn = BUTTON_REC;
351 break;
352 case SDLK_KP5:
353 case SDLK_SPACE:
354 new_btn = BUTTON_PLAY;
355 break;
357 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
358 || (CONFIG_KEYPAD == IPOD_4G_PAD)
359 case SDLK_KP4:
360 case SDLK_LEFT:
361 new_btn = BUTTON_LEFT;
362 break;
363 case SDLK_KP6:
364 case SDLK_RIGHT:
365 new_btn = BUTTON_RIGHT;
366 break;
367 case SDLK_KP8:
368 case SDLK_UP:
369 new_btn = BUTTON_SCROLL_BACK;
370 break;
371 case SDLK_KP2:
372 case SDLK_DOWN:
373 new_btn = BUTTON_SCROLL_FWD;
374 break;
375 case SDLK_KP_PLUS:
376 case SDLK_F8:
377 new_btn = BUTTON_PLAY;
378 break;
379 case SDLK_KP5:
380 case SDLK_SPACE:
381 new_btn = BUTTON_SELECT;
382 break;
383 case SDLK_KP_PERIOD:
384 case SDLK_INSERT:
385 new_btn = BUTTON_MENU;
386 break;
388 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
389 case SDLK_KP4:
390 case SDLK_LEFT:
391 new_btn = BUTTON_LEFT;
392 break;
393 case SDLK_KP6:
394 case SDLK_RIGHT:
395 new_btn = BUTTON_RIGHT;
396 break;
397 case SDLK_KP8:
398 case SDLK_UP:
399 new_btn = BUTTON_SCROLL_UP;
400 break;
401 case SDLK_KP2:
402 case SDLK_DOWN:
403 new_btn = BUTTON_SCROLL_DOWN;
404 break;
405 case SDLK_KP_PLUS:
406 case SDLK_F8:
407 new_btn = BUTTON_POWER;
408 break;
409 case SDLK_ESCAPE:
410 new_btn = BUTTON_POWER;
411 break;
412 case SDLK_KP_DIVIDE:
413 case SDLK_F1:
414 new_btn = BUTTON_REW;
415 break;
416 case SDLK_KP_MULTIPLY:
417 case SDLK_F2:
418 new_btn = BUTTON_FF;
419 break;
420 case SDLK_KP5:
421 case SDLK_SPACE:
422 new_btn = BUTTON_PLAY;
423 break;
425 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
426 case SDLK_t:
427 if(pressed)
428 switch(_remote_type)
430 case REMOTETYPE_UNPLUGGED:
431 _remote_type=REMOTETYPE_H100_LCD;
432 DEBUGF("Changed remote type to H100\n");
433 break;
434 case REMOTETYPE_H100_LCD:
435 _remote_type=REMOTETYPE_H300_LCD;
436 DEBUGF("Changed remote type to H300\n");
437 break;
438 case REMOTETYPE_H300_LCD:
439 _remote_type=REMOTETYPE_H300_NONLCD;
440 DEBUGF("Changed remote type to H300 NON-LCD\n");
441 break;
442 case REMOTETYPE_H300_NONLCD:
443 _remote_type=REMOTETYPE_UNPLUGGED;
444 DEBUGF("Changed remote type to none\n");
445 break;
447 break;
448 case SDLK_KP4:
449 case SDLK_LEFT:
450 new_btn = BUTTON_LEFT;
451 break;
452 case SDLK_KP6:
453 case SDLK_RIGHT:
454 new_btn = BUTTON_RIGHT;
455 break;
456 case SDLK_KP8:
457 case SDLK_UP:
458 new_btn = BUTTON_UP;
459 break;
460 case SDLK_KP2:
461 case SDLK_DOWN:
462 new_btn = BUTTON_DOWN;
463 break;
464 case SDLK_KP_PLUS:
465 case SDLK_F8:
466 new_btn = BUTTON_ON;
467 break;
468 case SDLK_KP_ENTER:
469 case SDLK_RETURN:
470 case SDLK_a:
471 new_btn = BUTTON_OFF;
472 break;
473 case SDLK_KP_DIVIDE:
474 case SDLK_F1:
475 new_btn = BUTTON_REC;
476 break;
477 case SDLK_KP5:
478 case SDLK_SPACE:
479 new_btn = BUTTON_SELECT;
480 break;
481 case SDLK_KP_PERIOD:
482 case SDLK_INSERT:
483 new_btn = BUTTON_MODE;
484 break;
486 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
487 case SDLK_KP4:
488 case SDLK_LEFT:
489 new_btn = BUTTON_LEFT;
490 break;
491 case SDLK_KP6:
492 case SDLK_RIGHT:
493 new_btn = BUTTON_RIGHT;
494 break;
495 case SDLK_KP8:
496 case SDLK_UP:
497 new_btn = BUTTON_UP;
498 break;
499 case SDLK_KP2:
500 case SDLK_DOWN:
501 new_btn = BUTTON_DOWN;
502 break;
503 case SDLK_KP_PLUS:
504 case SDLK_F8:
505 new_btn = BUTTON_PLAY;
506 break;
507 case SDLK_KP_ENTER:
508 case SDLK_RETURN:
509 case SDLK_a:
510 new_btn = BUTTON_EQ;
511 break;
512 case SDLK_KP5:
513 case SDLK_SPACE:
514 new_btn = BUTTON_SELECT;
515 break;
516 case SDLK_KP_PERIOD:
517 case SDLK_INSERT:
518 new_btn = BUTTON_MODE;
519 break;
521 #elif CONFIG_KEYPAD == ONDIO_PAD
522 case SDLK_KP4:
523 case SDLK_LEFT:
524 new_btn = BUTTON_LEFT;
525 break;
526 case SDLK_KP6:
527 case SDLK_RIGHT:
528 new_btn = BUTTON_RIGHT;
529 break;
530 case SDLK_KP8:
531 case SDLK_UP:
532 new_btn = BUTTON_UP;
533 break;
534 case SDLK_KP2:
535 case SDLK_DOWN:
536 new_btn = BUTTON_DOWN;
537 break;
538 case SDLK_KP_ENTER:
539 case SDLK_RETURN:
540 case SDLK_a:
541 new_btn = BUTTON_OFF;
542 break;
543 case SDLK_KP_PERIOD:
544 case SDLK_INSERT:
545 new_btn = BUTTON_MENU;
546 break;
548 #elif CONFIG_KEYPAD == PLAYER_PAD
549 case SDLK_KP4:
550 case SDLK_LEFT:
551 new_btn = BUTTON_LEFT;
552 break;
553 case SDLK_KP6:
554 case SDLK_RIGHT:
555 new_btn = BUTTON_RIGHT;
556 break;
557 case SDLK_KP8:
558 case SDLK_UP:
559 new_btn = BUTTON_PLAY;
560 break;
561 case SDLK_KP2:
562 case SDLK_DOWN:
563 new_btn = BUTTON_STOP;
564 break;
565 case SDLK_KP_PLUS:
566 case SDLK_F8:
567 new_btn = BUTTON_ON;
568 break;
569 case SDLK_KP_PERIOD:
570 case SDLK_INSERT:
571 new_btn = BUTTON_MENU;
572 break;
574 #elif CONFIG_KEYPAD == RECORDER_PAD
575 case SDLK_KP4:
576 case SDLK_LEFT:
577 new_btn = BUTTON_LEFT;
578 break;
579 case SDLK_KP6:
580 case SDLK_RIGHT:
581 new_btn = BUTTON_RIGHT;
582 break;
583 case SDLK_KP8:
584 case SDLK_UP:
585 new_btn = BUTTON_UP;
586 break;
587 case SDLK_KP2:
588 case SDLK_DOWN:
589 new_btn = BUTTON_DOWN;
590 break;
591 case SDLK_KP_PLUS:
592 case SDLK_F8:
593 new_btn = BUTTON_ON;
594 break;
595 case SDLK_KP_ENTER:
596 case SDLK_RETURN:
597 case SDLK_a:
598 new_btn = BUTTON_OFF;
599 break;
600 case SDLK_KP_DIVIDE:
601 case SDLK_F1:
602 new_btn = BUTTON_F1;
603 break;
604 case SDLK_KP_MULTIPLY:
605 case SDLK_F2:
606 new_btn = BUTTON_F2;
607 break;
608 case SDLK_KP_MINUS:
609 case SDLK_F3:
610 new_btn = BUTTON_F3;
611 break;
612 case SDLK_KP5:
613 case SDLK_SPACE:
614 new_btn = BUTTON_PLAY;
615 break;
617 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
618 case SDLK_KP4:
619 case SDLK_LEFT:
620 new_btn = BUTTON_LEFT;
621 break;
622 case SDLK_KP6:
623 case SDLK_RIGHT:
624 new_btn = BUTTON_RIGHT;
625 break;
626 case SDLK_KP8:
627 case SDLK_UP:
628 new_btn = BUTTON_UP;
629 break;
630 case SDLK_KP2:
631 case SDLK_DOWN:
632 new_btn = BUTTON_DOWN;
633 break;
634 case SDLK_KP_PLUS:
635 case SDLK_F8:
636 new_btn = BUTTON_ON;
637 break;
638 case SDLK_KP_ENTER:
639 case SDLK_RETURN:
640 case SDLK_a:
641 new_btn = BUTTON_OFF;
642 break;
643 case SDLK_KP_DIVIDE:
644 case SDLK_F1:
645 new_btn = BUTTON_F1;
646 break;
647 case SDLK_KP_MULTIPLY:
648 case SDLK_F2:
649 new_btn = BUTTON_F2;
650 break;
651 case SDLK_KP_MINUS:
652 case SDLK_F3:
653 new_btn = BUTTON_F3;
654 break;
655 case SDLK_KP5:
656 case SDLK_SPACE:
657 new_btn = BUTTON_SELECT;
658 break;
660 #elif CONFIG_KEYPAD == SANSA_E200_PAD
661 case SDLK_KP4:
662 case SDLK_LEFT:
663 new_btn = BUTTON_LEFT;
664 break;
665 case SDLK_KP6:
666 case SDLK_RIGHT:
667 new_btn = BUTTON_RIGHT;
668 break;
669 case SDLK_KP8:
670 case SDLK_UP:
671 new_btn = BUTTON_SCROLL_BACK;
672 break;
673 case SDLK_KP2:
674 case SDLK_DOWN:
675 new_btn = BUTTON_SCROLL_FWD;
676 break;
677 case SDLK_KP9:
678 case SDLK_PAGEUP:
679 new_btn = BUTTON_UP;
680 break;
681 case SDLK_KP3:
682 case SDLK_PAGEDOWN:
683 new_btn = BUTTON_DOWN;
684 break;
685 case SDLK_KP1:
686 case SDLK_HOME:
687 new_btn = BUTTON_POWER;
688 break;
689 case SDLK_KP7:
690 case SDLK_END:
691 new_btn = BUTTON_REC;
692 break;
693 case SDLK_KP5:
694 case SDLK_SPACE:
695 new_btn = BUTTON_SELECT;
696 break;
698 #elif CONFIG_KEYPAD == SANSA_C200_PAD
699 case SDLK_KP4:
700 case SDLK_LEFT:
701 new_btn = BUTTON_LEFT;
702 break;
703 case SDLK_KP6:
704 case SDLK_RIGHT:
705 new_btn = BUTTON_RIGHT;
706 break;
707 case SDLK_KP8:
708 case SDLK_UP:
709 new_btn = BUTTON_UP;
710 break;
711 case SDLK_KP2:
712 case SDLK_DOWN:
713 new_btn = BUTTON_DOWN;
714 break;
715 case SDLK_KP3:
716 new_btn = BUTTON_POWER;
717 break;
718 case SDLK_KP1:
719 new_btn = BUTTON_REC;
720 break;
721 case SDLK_KP5:
722 case SDLK_KP_ENTER:
723 case SDLK_RETURN:
724 new_btn = BUTTON_SELECT;
725 break;
726 case SDLK_KP7:
727 new_btn = BUTTON_VOL_DOWN;
728 break;
729 case SDLK_KP9:
730 new_btn = BUTTON_VOL_UP;
731 break;
733 #elif CONFIG_KEYPAD == MROBE500_PAD
734 case SDLK_F9:
735 new_btn = BUTTON_RC_HEART;
736 break;
737 case SDLK_F10:
738 new_btn = BUTTON_RC_MODE;
739 break;
740 case SDLK_F11:
741 new_btn = BUTTON_RC_VOL_DOWN;
742 break;
743 case SDLK_F12:
744 new_btn = BUTTON_RC_VOL_UP;
745 break;
746 case SDLK_LEFT:
747 new_btn = BUTTON_LEFT;
748 break;
749 case SDLK_RIGHT:
750 new_btn = BUTTON_RIGHT;
751 break;
752 case SDLK_UP:
753 new_btn = BUTTON_RC_PLAY;
754 break;
755 case SDLK_DOWN:
756 new_btn = BUTTON_RC_DOWN;
757 break;
758 case SDLK_F8:
759 case SDLK_ESCAPE:
760 new_btn = BUTTON_POWER;
761 break;
762 #elif CONFIG_KEYPAD == MROBE100_PAD
763 case SDLK_F9:
764 new_btn = BUTTON_RC_HEART;
765 break;
766 case SDLK_F10:
767 new_btn = BUTTON_RC_MODE;
768 break;
769 case SDLK_F11:
770 new_btn = BUTTON_RC_VOL_DOWN;
771 break;
772 case SDLK_F12:
773 new_btn = BUTTON_RC_VOL_UP;
774 break;
775 case SDLK_LEFT:
776 new_btn = BUTTON_RC_FF;
777 break;
778 case SDLK_RIGHT:
779 new_btn = BUTTON_RC_REW;
780 break;
781 case SDLK_UP:
782 new_btn = BUTTON_RC_PLAY;
783 break;
784 case SDLK_DOWN:
785 new_btn = BUTTON_RC_DOWN;
786 break;
787 case SDLK_KP1:
788 new_btn = BUTTON_DISPLAY;
789 break;
790 case SDLK_KP7:
791 new_btn = BUTTON_MENU;
792 break;
793 case SDLK_KP9:
794 new_btn = BUTTON_PLAY;
795 break;
796 case SDLK_KP4:
797 new_btn = BUTTON_LEFT;
798 break;
799 case SDLK_KP6:
800 new_btn = BUTTON_RIGHT;
801 break;
802 case SDLK_KP8:
803 new_btn = BUTTON_UP;
804 break;
805 case SDLK_KP2:
806 new_btn = BUTTON_DOWN;
807 break;
808 case SDLK_KP5:
809 case SDLK_SPACE:
810 new_btn = BUTTON_SELECT;
811 break;
812 case SDLK_KP_MULTIPLY:
813 case SDLK_F8:
814 case SDLK_ESCAPE:
815 new_btn = BUTTON_POWER;
816 break;
818 #elif CONFIG_KEYPAD == COWOND2_PAD
819 case SDLK_ESCAPE:
820 new_btn = BUTTON_POWER;
821 break;
822 case SDLK_KP_PLUS:
823 new_btn = BUTTON_PLUS;
824 break;
825 case SDLK_KP_MINUS:
826 new_btn = BUTTON_MINUS;
827 break;
828 case SDLK_KP_ENTER:
829 new_btn = BUTTON_MENU;
830 break;
831 #elif CONFIG_KEYPAD == IAUDIO67_PAD
832 case SDLK_UP:
833 new_btn = BUTTON_RIGHT;
834 break;
835 case SDLK_DOWN:
836 new_btn = BUTTON_LEFT;
837 break;
838 case SDLK_LEFT:
839 new_btn = BUTTON_STOP;
840 break;
841 case SDLK_RETURN:
842 case SDLK_KP_ENTER:
843 case SDLK_RIGHT:
844 new_btn = BUTTON_PLAY;
845 break;
846 case SDLK_PLUS:
847 new_btn = BUTTON_VOLUP;
848 break;
849 case SDLK_MINUS:
850 new_btn = BUTTON_VOLDOWN;
851 break;
852 case SDLK_SPACE:
853 new_btn = BUTTON_MENU;
854 break;
855 case SDLK_BACKSPACE:
856 new_btn = BUTTON_POWER;
857 break;
858 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
859 case SDLK_KP1:
860 new_btn = BUTTON_BACK;
861 break;
862 case SDLK_KP3:
863 new_btn = BUTTON_MENU;
864 break;
865 case SDLK_KP7:
866 new_btn = BUTTON_CUSTOM;
867 break;
868 case SDLK_KP9:
869 new_btn = BUTTON_PLAY;
870 break;
871 case SDLK_KP4:
872 case SDLK_LEFT:
873 new_btn = BUTTON_LEFT;
874 break;
875 case SDLK_KP6:
876 case SDLK_RIGHT:
877 new_btn = BUTTON_RIGHT;
878 break;
879 case SDLK_KP8:
880 case SDLK_UP:
881 new_btn = BUTTON_UP;
882 break;
883 case SDLK_KP2:
884 case SDLK_DOWN:
885 new_btn = BUTTON_DOWN;
886 break;
887 case SDLK_KP5:
888 case SDLK_SPACE:
889 new_btn = BUTTON_SELECT;
890 break;
891 case SDLK_KP_MULTIPLY:
892 case SDLK_F8:
893 case SDLK_ESCAPE:
894 new_btn = BUTTON_POWER;
895 break;
896 #elif CONFIG_KEYPAD == CREATIVEZV_PAD
897 case SDLK_KP1:
898 new_btn = BUTTON_PREV;
899 break;
900 case SDLK_KP3:
901 new_btn = BUTTON_NEXT;
902 break;
903 case SDLK_KP7:
904 new_btn = BUTTON_BACK;
905 break;
906 case SDLK_p:
907 new_btn = BUTTON_PLAY;
908 break;
909 case SDLK_KP9:
910 new_btn = BUTTON_MENU;
911 break;
912 case SDLK_KP4:
913 case SDLK_LEFT:
914 new_btn = BUTTON_LEFT;
915 break;
916 case SDLK_KP6:
917 case SDLK_RIGHT:
918 new_btn = BUTTON_RIGHT;
919 break;
920 case SDLK_KP8:
921 case SDLK_UP:
922 new_btn = BUTTON_UP;
923 break;
924 case SDLK_KP2:
925 case SDLK_DOWN:
926 new_btn = BUTTON_DOWN;
927 break;
928 case SDLK_KP5:
929 case SDLK_SPACE:
930 new_btn = BUTTON_SELECT;
931 break;
932 case SDLK_KP_MULTIPLY:
933 case SDLK_F8:
934 case SDLK_ESCAPE:
935 new_btn = BUTTON_POWER;
936 break;
937 case SDLK_z:
938 new_btn = BUTTON_VOL_DOWN;
939 break;
940 case SDLK_s:
941 new_btn = BUTTON_VOL_UP;
943 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
944 case SDLK_KP1:
945 new_btn = BUTTON_PREV;
946 break;
947 case SDLK_KP3:
948 new_btn = BUTTON_NEXT;
949 break;
950 case SDLK_KP_ENTER:
951 case SDLK_RETURN:
952 case SDLK_a:
953 new_btn = BUTTON_PLAY;
954 break;
955 case SDLK_KP_PERIOD:
956 case SDLK_INSERT:
957 new_btn = BUTTON_MENU;
958 break;
959 case SDLK_KP8:
960 case SDLK_UP:
961 new_btn = BUTTON_UP;
962 break;
963 case SDLK_KP2:
964 case SDLK_DOWN:
965 new_btn = BUTTON_DOWN;
966 break;
967 case SDLK_KP5:
968 case SDLK_SPACE:
969 new_btn = BUTTON_SELECT;
970 break;
971 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
972 case SDLK_KP4:
973 case SDLK_LEFT:
974 new_btn = BUTTON_LEFT;
975 break;
976 case SDLK_KP6:
977 case SDLK_RIGHT:
978 new_btn = BUTTON_RIGHT;
979 break;
980 case SDLK_KP8:
981 case SDLK_UP:
982 new_btn = BUTTON_SCROLL_BACK;
983 break;
984 case SDLK_KP2:
985 case SDLK_DOWN:
986 new_btn = BUTTON_SCROLL_FWD;
987 break;
988 case SDLK_PAGEUP:
989 case SDLK_KP9:
990 new_btn = BUTTON_UP;
991 break;
992 case SDLK_PAGEDOWN:
993 case SDLK_KP3:
994 new_btn = BUTTON_DOWN;
995 break;
996 case SDLK_KP_MINUS:
997 case SDLK_KP1:
998 new_btn = BUTTON_POWER;
999 break;
1000 case SDLK_KP_MULTIPLY:
1001 new_btn = BUTTON_HOME;
1002 break;
1003 case SDLK_KP5:
1004 case SDLK_SPACE:
1005 case SDLK_KP_ENTER:
1006 case SDLK_RETURN:
1007 new_btn = BUTTON_SELECT;
1008 break;
1009 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
1010 case SDLK_KP4:
1011 case SDLK_LEFT:
1012 new_btn = BUTTON_LEFT;
1013 break;
1014 case SDLK_KP6:
1015 case SDLK_RIGHT:
1016 new_btn = BUTTON_RIGHT;
1017 break;
1018 case SDLK_KP8:
1019 case SDLK_UP:
1020 new_btn = BUTTON_UP;
1021 break;
1022 case SDLK_KP2:
1023 case SDLK_DOWN:
1024 new_btn = BUTTON_DOWN;
1025 break;
1027 case SDLK_INSERT:
1028 case SDLK_KP_MULTIPLY:
1029 new_btn = BUTTON_HOME;
1030 break;
1031 case SDLK_SPACE:
1032 case SDLK_KP5:
1033 new_btn = BUTTON_SELECT;
1034 break;
1035 case SDLK_PAGEDOWN:
1036 case SDLK_KP3:
1037 new_btn = BUTTON_VOL_DOWN;
1038 break;
1039 case SDLK_PAGEUP:
1040 case SDLK_KP9:
1041 new_btn = BUTTON_VOL_UP;
1042 break;
1043 case SDLK_ESCAPE:
1044 case SDLK_KP1:
1045 new_btn = BUTTON_POWER;
1046 break;
1047 #elif CONFIG_KEYPAD == SANSA_M200_PAD
1048 case SDLK_KP4:
1049 case SDLK_LEFT:
1050 new_btn = BUTTON_LEFT;
1051 break;
1052 case SDLK_KP6:
1053 case SDLK_RIGHT:
1054 new_btn = BUTTON_RIGHT;
1055 break;
1056 case SDLK_KP8:
1057 case SDLK_UP:
1058 new_btn = BUTTON_UP;
1059 break;
1060 case SDLK_KP2:
1061 case SDLK_DOWN:
1062 new_btn = BUTTON_DOWN;
1063 break;
1064 case SDLK_PLUS:
1065 new_btn = BUTTON_POWER;
1066 break;
1067 case SDLK_KP5:
1068 new_btn = BUTTON_SELECT;
1069 break;
1070 case SDLK_KP7:
1071 new_btn = BUTTON_VOL_DOWN;
1072 break;
1073 case SDLK_KP9:
1074 new_btn = BUTTON_VOL_UP;
1075 break;
1076 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
1077 case SDLK_KP4:
1078 case SDLK_LEFT:
1079 new_btn = BUTTON_LEFT;
1080 break;
1081 case SDLK_KP6:
1082 case SDLK_RIGHT:
1083 new_btn = BUTTON_RIGHT;
1084 break;
1085 case SDLK_KP8:
1086 case SDLK_UP:
1087 new_btn = BUTTON_UP;
1088 break;
1089 case SDLK_KP2:
1090 case SDLK_DOWN:
1091 new_btn = BUTTON_DOWN;
1092 break;
1093 case SDLK_KP5:
1094 case SDLK_SPACE:
1095 new_btn = BUTTON_PLAY;
1096 break;
1097 case SDLK_KP7:
1098 new_btn = BUTTON_PREV;
1099 break;
1100 case SDLK_KP9:
1101 new_btn = BUTTON_NEXT;
1102 break;
1103 case SDLK_KP_ENTER:
1104 case SDLK_RETURN:
1105 new_btn = BUTTON_POWER;
1106 break;
1107 case SDLK_PAGEUP:
1108 new_btn = BUTTON_VOL_UP;
1109 break;
1110 case SDLK_PAGEDOWN:
1111 new_btn = BUTTON_VOL_DOWN;
1112 break;
1113 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
1114 case SDLK_KP4:
1115 case SDLK_LEFT:
1116 new_btn = BUTTON_LEFT;
1117 break;
1118 case SDLK_KP6:
1119 case SDLK_RIGHT:
1120 new_btn = BUTTON_RIGHT;
1121 break;
1122 case SDLK_KP8:
1123 case SDLK_UP:
1124 new_btn = BUTTON_UP;
1125 break;
1126 case SDLK_KP2:
1127 case SDLK_DOWN:
1128 new_btn = BUTTON_DOWN;
1129 break;
1130 case SDLK_KP5:
1131 case SDLK_SPACE:
1132 new_btn = BUTTON_SELECT;
1133 break;
1134 case SDLK_KP7:
1135 case SDLK_ESCAPE:
1136 new_btn = BUTTON_POWER;
1137 break;
1138 case SDLK_KP1:
1139 new_btn = BUTTON_PLAYLIST;
1140 break;
1141 case SDLK_KP9:
1142 new_btn = BUTTON_VOL_UP;
1143 break;
1144 case SDLK_KP3:
1145 new_btn = BUTTON_VOL_DOWN;
1146 break;
1147 case SDLK_KP_MINUS:
1148 new_btn = BUTTON_MENU;
1149 break;
1150 case SDLK_KP_PLUS:
1151 new_btn = BUTTON_VIEW;
1152 break;
1153 #elif CONFIG_KEYPAD == ONDAVX747_PAD
1154 case SDLK_ESCAPE:
1155 new_btn = BUTTON_POWER;
1156 break;
1157 case SDLK_KP_PLUS:
1158 case SDLK_RIGHT:
1159 new_btn = BUTTON_VOL_UP;
1160 break;
1161 case SDLK_KP_MINUS:
1162 case SDLK_LEFT:
1163 new_btn = BUTTON_VOL_DOWN;
1164 break;
1165 case SDLK_KP_ENTER:
1166 case SDLK_RETURN:
1167 new_btn = BUTTON_MENU;
1168 break;
1169 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
1170 case SDLK_KP4:
1171 case SDLK_LEFT:
1172 new_btn = BUTTON_LEFT;
1173 break;
1174 case SDLK_KP6:
1175 case SDLK_RIGHT:
1176 new_btn = BUTTON_RIGHT;
1177 break;
1178 case SDLK_KP8:
1179 case SDLK_UP:
1180 new_btn = BUTTON_UP;
1181 break;
1182 case SDLK_KP2:
1183 case SDLK_DOWN:
1184 new_btn = BUTTON_DOWN;
1185 break;
1186 case SDLK_KP5:
1187 case SDLK_KP_ENTER:
1188 new_btn = BUTTON_PLAY;
1189 break;
1190 case SDLK_KP9:
1191 case SDLK_PAGEUP:
1192 new_btn = BUTTON_FFWD;
1193 break;
1194 #ifdef SAMSUNG_YH820
1195 case SDLK_KP7:
1196 #else
1197 case SDLK_KP3:
1198 #endif
1199 case SDLK_PAGEDOWN:
1200 new_btn = BUTTON_REW;
1201 break;
1202 case SDLK_KP_PLUS:
1203 new_btn = BUTTON_REC;
1204 break;
1205 #else
1206 #error No keymap defined!
1207 #endif /* CONFIG_KEYPAD */
1208 case SDLK_KP0:
1209 case SDLK_F5:
1210 if(pressed)
1212 sim_trigger_screendump();
1213 return;
1215 break;
1218 if (pressed)
1219 btn |= new_btn;
1220 else
1221 btn &= ~new_btn;
1223 /* Lots of stuff copied from real button.c. Not good, I think... */
1225 /* Find out if a key has been released */
1226 diff = btn ^ lastbtn;
1227 if(diff && (btn & diff) == 0)
1229 #ifdef HAVE_BACKLIGHT
1230 #ifdef HAVE_REMOTE_LCD
1231 if(diff & BUTTON_REMOTE)
1232 if(!skip_remote_release)
1233 queue_post(&button_queue, BUTTON_REL | diff, data);
1234 else
1235 skip_remote_release = false;
1236 else
1237 #endif
1238 if(!skip_release)
1239 queue_post(&button_queue, BUTTON_REL | diff, data);
1240 else
1241 skip_release = false;
1242 #else
1243 queue_post(&button_queue, BUTTON_REL | diff, data);
1244 #endif
1247 else
1249 if ( btn )
1251 /* normal keypress */
1252 if ( btn != lastbtn )
1254 post = true;
1255 repeat = false;
1256 repeat_speed = REPEAT_INTERVAL_START;
1259 else /* repeat? */
1261 if ( repeat )
1263 if (!post)
1264 count--;
1265 if (count == 0)
1267 post = true;
1268 /* yes we have repeat */
1269 repeat_speed--;
1270 if (repeat_speed < REPEAT_INTERVAL_FINISH)
1271 repeat_speed = REPEAT_INTERVAL_FINISH;
1272 count = repeat_speed;
1274 repeat_count++;
1277 else
1279 if (count++ > REPEAT_START)
1281 post = true;
1282 repeat = true;
1283 repeat_count = 0;
1284 /* initial repeat */
1285 count = REPEAT_INTERVAL_START;
1289 if ( post )
1291 if(repeat)
1293 if (queue_empty(&button_queue))
1295 queue_post(&button_queue, BUTTON_REPEAT | btn, data);
1296 #ifdef HAVE_BACKLIGHT
1297 #ifdef HAVE_REMOTE_LCD
1298 if(btn & BUTTON_REMOTE)
1300 if(skip_remote_release)
1301 skip_remote_release = false;
1303 else
1304 #endif
1305 if(skip_release)
1306 skip_release = false;
1307 #endif
1308 post = false;
1311 else
1313 #ifdef HAVE_BACKLIGHT
1314 #ifdef HAVE_REMOTE_LCD
1315 if (btn & BUTTON_REMOTE) {
1316 if (!remote_filter_first_keypress
1317 || is_remote_backlight_on(false))
1318 queue_post(&button_queue, btn, data);
1319 else
1320 skip_remote_release = true;
1322 else
1323 #endif
1324 if (!filter_first_keypress
1325 || is_backlight_on(false))
1326 queue_post(&button_queue, btn, data);
1327 else
1328 skip_release = true;
1329 #else /* no backlight, nothing to skip */
1330 queue_post(&button_queue, btn, data);
1331 #endif
1332 post = false;
1335 #ifdef HAVE_REMOTE_LCD
1336 if(btn & BUTTON_REMOTE)
1337 remote_backlight_on();
1338 else
1339 #endif
1340 backlight_on();
1344 else
1346 repeat = false;
1347 count = 0;
1350 lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT);
1353 /* Again copied from real button.c... */
1355 int button_queue_count( void )
1357 return queue_count(&button_queue);
1360 long button_get(bool block)
1362 struct queue_event ev;
1364 if ( block || !queue_empty(&button_queue) ) {
1365 queue_wait(&button_queue, &ev);
1366 button_data = ev.data;
1367 return ev.id;
1369 return BUTTON_NONE;
1372 long button_get_w_tmo(int ticks)
1374 struct queue_event ev;
1375 queue_wait_w_tmo(&button_queue, &ev, ticks);
1376 if (ev.id == SYS_TIMEOUT)
1377 ev.id = BUTTON_NONE;
1378 else
1379 button_data = ev.data;
1381 return ev.id;
1384 intptr_t button_get_data(void)
1386 #ifdef HAVE_TOUCHSCREEN
1387 return button_data;
1388 #else
1389 /* Needed by the accelerating wheel driver for Sansa e200 */
1390 return 1 << 24;
1391 #endif
1394 #ifdef HAVE_TOUCHSCREEN
1395 extern bool debug_wps;
1396 void mouse_tick_task(void)
1398 static int last_check = 0;
1399 int x,y;
1400 if (TIME_BEFORE(current_tick, last_check+(HZ/10)))
1401 return;
1402 last_check = current_tick;
1403 if (SDL_GetMouseState(&x, &y) & SDL_BUTTON(SDL_BUTTON_LEFT))
1405 if(background)
1407 x -= UI_LCD_POSX;
1408 y -= UI_LCD_POSY;
1410 if(x<0 || y<0 || x>SIM_LCD_WIDTH || y>SIM_LCD_HEIGHT)
1411 return;
1414 mouse_coords = (x<<16)|y;
1415 last_touchscreen_touch = current_tick;
1416 button_event(BUTTON_TOUCHSCREEN, true);
1417 if (debug_wps)
1418 printf("Mouse at: (%d, %d)\n", x, y);
1421 int touchscreen_last_touch(void)
1423 return last_touchscreen_touch;
1425 #endif
1426 void button_init(void)
1428 #ifdef HAVE_TOUCHSCREEN
1429 tick_add_task(mouse_tick_task);
1430 #endif
1433 int button_status(void)
1435 return btn;
1438 void button_clear_queue(void)
1440 queue_clear(&button_queue);