initial Meizu M6SL port
[Rockbox.git] / uisimulator / sdl / button.c
blob78be6700ecba6d8b218b1e684ff99714b8d888f3
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 by Felix Arends
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "uisdl.h"
21 #include "lcd-charcells.h"
22 #include "lcd-remote.h"
23 #include "config.h"
24 #include "button.h"
25 #include "kernel.h"
26 #include "backlight.h"
27 #include "misc.h"
29 #include "debug.h"
31 static intptr_t button_data; /* data value from last message dequeued */
33 #ifdef HAVE_TOUCHPAD
34 static int mouse_coords = 0;
35 #endif
36 /* how long until repeat kicks in */
37 #define REPEAT_START 6
39 /* the speed repeat starts at */
40 #define REPEAT_INTERVAL_START 4
42 /* speed repeat finishes at */
43 #define REPEAT_INTERVAL_FINISH 2
45 #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
46 int _remote_type=REMOTETYPE_H100_LCD;
48 int remote_type(void)
50 return _remote_type;
52 #endif
54 struct event_queue button_queue;
56 static int btn = 0; /* Hopefully keeps track of currently pressed keys... */
58 #ifdef HAVE_BACKLIGHT
59 static bool filter_first_keypress;
61 void set_backlight_filter_keypress(bool value)
63 filter_first_keypress = value;
65 #ifdef HAVE_REMOTE_LCD
66 static bool remote_filter_first_keypress;
68 void set_remote_backlight_filter_keypress(bool value)
70 remote_filter_first_keypress = value;
72 #endif
73 #endif
75 #ifdef HAS_BUTTON_HOLD
76 bool hold_button_state = false;
77 bool button_hold(void) {
78 return hold_button_state;
80 #endif
82 #ifdef HAS_REMOTE_BUTTON_HOLD
83 bool remote_hold_button_state = false;
84 bool remote_button_hold(void) {
85 return remote_hold_button_state;
87 #endif
89 static int lastbtn;
90 void button_event(int key, bool pressed)
92 int new_btn = 0;
93 int diff = 0;
94 int data = 0;
95 static int count = 0;
96 static int repeat_speed = REPEAT_INTERVAL_START;
97 static int repeat_count = 0;
98 static bool repeat = false;
99 static bool post = false;
100 #ifdef HAVE_BACKLIGHT
101 static bool skip_release = false;
102 #ifdef HAVE_REMOTE_LCD
103 static bool skip_remote_release = false;
104 #endif
105 #endif
106 static bool usb_connected = false;
107 if (usb_connected && key != SDLK_u)
108 return;
109 switch (key)
112 #ifdef HAVE_TOUCHPAD
113 case BUTTON_TOUCHPAD:
114 new_btn = BUTTON_TOUCHPAD;
115 data = mouse_coords;
116 break;
117 #endif
118 case SDLK_u:
119 if (!pressed)
121 usb_connected = !usb_connected;
122 if (usb_connected)
123 queue_post(&button_queue, SYS_USB_CONNECTED, 0);
124 else
125 queue_post(&button_queue, SYS_USB_DISCONNECTED, 0);
127 return;
129 #ifdef HAS_BUTTON_HOLD
130 case SDLK_h:
131 if(pressed)
133 hold_button_state = !hold_button_state;
134 DEBUGF("Hold button is %s\n", hold_button_state?"ON":"OFF");
136 return;
137 #endif
139 #ifdef HAS_REMOTE_BUTTON_HOLD
140 case SDLK_j:
141 if(pressed)
143 remote_hold_button_state = !remote_hold_button_state;
144 DEBUGF("Remote hold button is %s\n",
145 remote_hold_button_state?"ON":"OFF");
147 return;
148 #endif
150 #if CONFIG_KEYPAD == GIGABEAT_PAD
151 case SDLK_KP4:
152 case SDLK_LEFT:
153 new_btn = BUTTON_LEFT;
154 break;
155 case SDLK_KP6:
156 case SDLK_RIGHT:
157 new_btn = BUTTON_RIGHT;
158 break;
159 case SDLK_KP8:
160 case SDLK_UP:
161 new_btn = BUTTON_UP;
162 break;
163 case SDLK_KP2:
164 case SDLK_DOWN:
165 new_btn = BUTTON_DOWN;
166 break;
167 case SDLK_KP_PLUS:
168 case SDLK_F8:
169 new_btn = BUTTON_POWER;
170 break;
171 case SDLK_ESCAPE:
172 new_btn = BUTTON_POWER;
173 break;
174 case SDLK_KP_ENTER:
175 case SDLK_RETURN:
176 case SDLK_a:
177 new_btn = BUTTON_A;
178 break;
179 case SDLK_KP5:
180 case SDLK_SPACE:
181 new_btn = BUTTON_SELECT;
182 break;
183 case SDLK_KP_PERIOD:
184 case SDLK_INSERT:
185 new_btn = BUTTON_MENU;
186 break;
188 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
189 case SDLK_KP4:
190 case SDLK_LEFT:
191 new_btn = BUTTON_LEFT;
192 break;
193 case SDLK_KP6:
194 case SDLK_RIGHT:
195 new_btn = BUTTON_RIGHT;
196 break;
197 case SDLK_KP8:
198 case SDLK_UP:
199 new_btn = BUTTON_UP;
200 break;
201 case SDLK_KP2:
202 case SDLK_DOWN:
203 new_btn = BUTTON_DOWN;
204 break;
205 case SDLK_F8:
206 case SDLK_ESCAPE:
207 new_btn = BUTTON_POWER;
208 break;
209 case SDLK_KP_PLUS:
210 case SDLK_KP_ENTER:
211 case SDLK_RETURN:
212 new_btn = BUTTON_PLAY;
213 break;
214 case SDLK_KP7:
215 new_btn = BUTTON_BACK;
216 break;
217 case SDLK_KP5:
218 case SDLK_SPACE:
219 new_btn = BUTTON_SELECT;
220 break;
221 case SDLK_KP9:
222 case SDLK_KP_PERIOD:
223 case SDLK_INSERT:
224 new_btn = BUTTON_MENU;
225 break;
227 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
228 case SDLK_KP4:
229 case SDLK_LEFT:
230 new_btn = BUTTON_LEFT;
231 break;
232 case SDLK_KP6:
233 case SDLK_RIGHT:
234 new_btn = BUTTON_RIGHT;
235 break;
236 case SDLK_KP8:
237 case SDLK_UP:
238 new_btn = BUTTON_UP;
239 break;
240 case SDLK_KP2:
241 case SDLK_DOWN:
242 new_btn = BUTTON_DOWN;
243 break;
244 case SDLK_KP_PLUS:
245 case SDLK_F8:
246 new_btn = BUTTON_PLAY;
247 break;
248 case SDLK_ESCAPE:
249 new_btn = BUTTON_POWER;
250 break;
251 case SDLK_KP_ENTER:
252 case SDLK_RETURN:
253 case SDLK_a:
254 new_btn = BUTTON_POWER;
255 break;
256 case SDLK_KP_DIVIDE:
257 case SDLK_F1:
258 new_btn = BUTTON_REC;
259 break;
260 case SDLK_KP5:
261 case SDLK_SPACE:
262 new_btn = BUTTON_SELECT;
263 break;
265 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
266 case SDLK_KP4:
267 case SDLK_LEFT:
268 new_btn = BUTTON_LEFT;
269 break;
270 case SDLK_KP6:
271 case SDLK_RIGHT:
272 new_btn = BUTTON_RIGHT;
273 break;
274 case SDLK_KP8:
275 case SDLK_UP:
276 new_btn = BUTTON_VOL_UP;
277 break;
278 case SDLK_KP2:
279 case SDLK_DOWN:
280 new_btn = BUTTON_VOL_DOWN;
281 break;
282 case SDLK_KP_PERIOD:
283 case SDLK_INSERT:
284 new_btn = BUTTON_MODE;
285 break;
286 case SDLK_KP_DIVIDE:
287 case SDLK_F1:
288 new_btn = BUTTON_REC;
289 break;
290 case SDLK_KP5:
291 case SDLK_SPACE:
292 new_btn = BUTTON_PLAY;
293 break;
295 #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
296 || (CONFIG_KEYPAD == IPOD_4G_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_SCROLL_BACK;
308 break;
309 case SDLK_KP2:
310 case SDLK_DOWN:
311 new_btn = BUTTON_SCROLL_FWD;
312 break;
313 case SDLK_KP_PLUS:
314 case SDLK_F8:
315 new_btn = BUTTON_PLAY;
316 break;
317 case SDLK_KP5:
318 case SDLK_SPACE:
319 new_btn = BUTTON_SELECT;
320 break;
321 case SDLK_KP_PERIOD:
322 case SDLK_INSERT:
323 new_btn = BUTTON_MENU;
324 break;
326 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
327 case SDLK_KP4:
328 case SDLK_LEFT:
329 new_btn = BUTTON_LEFT;
330 break;
331 case SDLK_KP6:
332 case SDLK_RIGHT:
333 new_btn = BUTTON_RIGHT;
334 break;
335 case SDLK_KP8:
336 case SDLK_UP:
337 new_btn = BUTTON_SCROLL_UP;
338 break;
339 case SDLK_KP2:
340 case SDLK_DOWN:
341 new_btn = BUTTON_SCROLL_DOWN;
342 break;
343 case SDLK_KP_PLUS:
344 case SDLK_F8:
345 new_btn = BUTTON_POWER;
346 break;
347 case SDLK_ESCAPE:
348 new_btn = BUTTON_POWER;
349 break;
350 case SDLK_KP_DIVIDE:
351 case SDLK_F1:
352 new_btn = BUTTON_REW;
353 break;
354 case SDLK_KP_MULTIPLY:
355 case SDLK_F2:
356 new_btn = BUTTON_FF;
357 break;
358 case SDLK_KP5:
359 case SDLK_SPACE:
360 new_btn = BUTTON_PLAY;
361 break;
363 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
364 case SDLK_t:
365 if(pressed)
366 switch(_remote_type)
368 case REMOTETYPE_UNPLUGGED:
369 _remote_type=REMOTETYPE_H100_LCD;
370 DEBUGF("Changed remote type to H100\n");
371 break;
372 case REMOTETYPE_H100_LCD:
373 _remote_type=REMOTETYPE_H300_LCD;
374 DEBUGF("Changed remote type to H300\n");
375 break;
376 case REMOTETYPE_H300_LCD:
377 _remote_type=REMOTETYPE_H300_NONLCD;
378 DEBUGF("Changed remote type to H300 NON-LCD\n");
379 break;
380 case REMOTETYPE_H300_NONLCD:
381 _remote_type=REMOTETYPE_UNPLUGGED;
382 DEBUGF("Changed remote type to none\n");
383 break;
385 break;
386 case SDLK_KP4:
387 case SDLK_LEFT:
388 new_btn = BUTTON_LEFT;
389 break;
390 case SDLK_KP6:
391 case SDLK_RIGHT:
392 new_btn = BUTTON_RIGHT;
393 break;
394 case SDLK_KP8:
395 case SDLK_UP:
396 new_btn = BUTTON_UP;
397 break;
398 case SDLK_KP2:
399 case SDLK_DOWN:
400 new_btn = BUTTON_DOWN;
401 break;
402 case SDLK_KP_PLUS:
403 case SDLK_F8:
404 new_btn = BUTTON_ON;
405 break;
406 case SDLK_KP_ENTER:
407 case SDLK_RETURN:
408 case SDLK_a:
409 new_btn = BUTTON_OFF;
410 break;
411 case SDLK_KP_DIVIDE:
412 case SDLK_F1:
413 new_btn = BUTTON_REC;
414 break;
415 case SDLK_KP5:
416 case SDLK_SPACE:
417 new_btn = BUTTON_SELECT;
418 break;
419 case SDLK_KP_PERIOD:
420 case SDLK_INSERT:
421 new_btn = BUTTON_MODE;
422 break;
424 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
425 case SDLK_KP4:
426 case SDLK_LEFT:
427 new_btn = BUTTON_LEFT;
428 break;
429 case SDLK_KP6:
430 case SDLK_RIGHT:
431 new_btn = BUTTON_RIGHT;
432 break;
433 case SDLK_KP8:
434 case SDLK_UP:
435 new_btn = BUTTON_UP;
436 break;
437 case SDLK_KP2:
438 case SDLK_DOWN:
439 new_btn = BUTTON_DOWN;
440 break;
441 case SDLK_KP_PLUS:
442 case SDLK_F8:
443 new_btn = BUTTON_PLAY;
444 break;
445 case SDLK_KP_ENTER:
446 case SDLK_RETURN:
447 case SDLK_a:
448 new_btn = BUTTON_EQ;
449 break;
450 case SDLK_KP5:
451 case SDLK_SPACE:
452 new_btn = BUTTON_SELECT;
453 break;
454 case SDLK_KP_PERIOD:
455 case SDLK_INSERT:
456 new_btn = BUTTON_MODE;
457 break;
459 #elif CONFIG_KEYPAD == ONDIO_PAD
460 case SDLK_KP4:
461 case SDLK_LEFT:
462 new_btn = BUTTON_LEFT;
463 break;
464 case SDLK_KP6:
465 case SDLK_RIGHT:
466 new_btn = BUTTON_RIGHT;
467 break;
468 case SDLK_KP8:
469 case SDLK_UP:
470 new_btn = BUTTON_UP;
471 break;
472 case SDLK_KP2:
473 case SDLK_DOWN:
474 new_btn = BUTTON_DOWN;
475 break;
476 case SDLK_KP_ENTER:
477 case SDLK_RETURN:
478 case SDLK_a:
479 new_btn = BUTTON_OFF;
480 break;
481 case SDLK_KP_PERIOD:
482 case SDLK_INSERT:
483 new_btn = BUTTON_MENU;
484 break;
486 #elif CONFIG_KEYPAD == PLAYER_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_PLAY;
498 break;
499 case SDLK_KP2:
500 case SDLK_DOWN:
501 new_btn = BUTTON_STOP;
502 break;
503 case SDLK_KP_PLUS:
504 case SDLK_F8:
505 new_btn = BUTTON_ON;
506 break;
507 case SDLK_KP_PERIOD:
508 case SDLK_INSERT:
509 new_btn = BUTTON_MENU;
510 break;
512 #elif CONFIG_KEYPAD == RECORDER_PAD
513 case SDLK_KP4:
514 case SDLK_LEFT:
515 new_btn = BUTTON_LEFT;
516 break;
517 case SDLK_KP6:
518 case SDLK_RIGHT:
519 new_btn = BUTTON_RIGHT;
520 break;
521 case SDLK_KP8:
522 case SDLK_UP:
523 new_btn = BUTTON_UP;
524 break;
525 case SDLK_KP2:
526 case SDLK_DOWN:
527 new_btn = BUTTON_DOWN;
528 break;
529 case SDLK_KP_PLUS:
530 case SDLK_F8:
531 new_btn = BUTTON_ON;
532 break;
533 case SDLK_KP_ENTER:
534 case SDLK_RETURN:
535 case SDLK_a:
536 new_btn = BUTTON_OFF;
537 break;
538 case SDLK_KP_DIVIDE:
539 case SDLK_F1:
540 new_btn = BUTTON_F1;
541 break;
542 case SDLK_KP_MULTIPLY:
543 case SDLK_F2:
544 new_btn = BUTTON_F2;
545 break;
546 case SDLK_KP_MINUS:
547 case SDLK_F3:
548 new_btn = BUTTON_F3;
549 break;
550 case SDLK_KP5:
551 case SDLK_SPACE:
552 new_btn = BUTTON_PLAY;
553 break;
555 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
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_F1;
584 break;
585 case SDLK_KP_MULTIPLY:
586 case SDLK_F2:
587 new_btn = BUTTON_F2;
588 break;
589 case SDLK_KP_MINUS:
590 case SDLK_F3:
591 new_btn = BUTTON_F3;
592 break;
593 case SDLK_KP5:
594 case SDLK_SPACE:
595 new_btn = BUTTON_SELECT;
596 break;
598 #elif CONFIG_KEYPAD == SANSA_E200_PAD
599 case SDLK_KP4:
600 case SDLK_LEFT:
601 new_btn = BUTTON_LEFT;
602 break;
603 case SDLK_KP6:
604 case SDLK_RIGHT:
605 new_btn = BUTTON_RIGHT;
606 break;
607 case SDLK_KP8:
608 case SDLK_UP:
609 new_btn = BUTTON_SCROLL_BACK;
610 break;
611 case SDLK_KP2:
612 case SDLK_DOWN:
613 new_btn = BUTTON_SCROLL_FWD;
614 break;
615 case SDLK_KP9:
616 new_btn = BUTTON_UP;
617 break;
618 case SDLK_KP3:
619 new_btn = BUTTON_DOWN;
620 break;
621 case SDLK_KP1:
622 new_btn = BUTTON_POWER;
623 break;
624 case SDLK_KP7:
625 new_btn = BUTTON_REC;
626 break;
627 case SDLK_KP5:
628 case SDLK_SPACE:
629 new_btn = BUTTON_SELECT;
630 break;
632 #elif CONFIG_KEYPAD == SANSA_C200_PAD
633 case SDLK_KP4:
634 case SDLK_LEFT:
635 new_btn = BUTTON_LEFT;
636 break;
637 case SDLK_KP6:
638 case SDLK_RIGHT:
639 new_btn = BUTTON_RIGHT;
640 break;
641 case SDLK_KP8:
642 case SDLK_UP:
643 new_btn = BUTTON_UP;
644 break;
645 case SDLK_KP2:
646 case SDLK_DOWN:
647 new_btn = BUTTON_DOWN;
648 break;
649 case SDLK_KP3:
650 new_btn = BUTTON_POWER;
651 break;
652 case SDLK_KP1:
653 new_btn = BUTTON_REC;
654 break;
655 case SDLK_KP5:
656 case SDLK_KP_ENTER:
657 case SDLK_RETURN:
658 new_btn = BUTTON_SELECT;
659 break;
660 case SDLK_KP7:
661 new_btn = BUTTON_VOL_DOWN;
662 break;
663 case SDLK_KP9:
664 new_btn = BUTTON_VOL_UP;
665 break;
667 #elif CONFIG_KEYPAD == MROBE500_PAD
668 case SDLK_KP4:
669 case SDLK_LEFT:
670 new_btn = BUTTON_LEFT;
671 break;
672 case SDLK_KP6:
673 case SDLK_RIGHT:
674 new_btn = BUTTON_RIGHT;
675 break;
676 case SDLK_KP8:
677 case SDLK_UP:
678 new_btn = BUTTON_RC_PLAY;
679 break;
680 case SDLK_KP2:
681 case SDLK_DOWN:
682 new_btn = BUTTON_RC_DOWN;
683 break;
684 case SDLK_KP_PLUS:
685 case SDLK_F8:
686 new_btn = BUTTON_POWER;
687 break;
688 case SDLK_ESCAPE:
689 new_btn = BUTTON_POWER;
690 break;
691 case SDLK_KP_ENTER:
692 case SDLK_RETURN:
693 case SDLK_a:
694 new_btn = BUTTON_RC_VOL_UP;
695 break;
696 case SDLK_KP5:
697 case SDLK_SPACE:
698 new_btn = BUTTON_RC_HEART;
699 break;
700 case SDLK_KP_PERIOD:
701 case SDLK_INSERT:
702 new_btn = BUTTON_RC_MODE;
703 break;
705 #elif CONFIG_KEYPAD == MROBE100_PAD
706 case SDLK_KP1:
707 new_btn = BUTTON_DISPLAY;
708 break;
709 case SDLK_KP7:
710 new_btn = BUTTON_MENU;
711 break;
712 case SDLK_KP9:
713 new_btn = BUTTON_PLAY;
714 break;
715 case SDLK_KP4:
716 case SDLK_LEFT:
717 new_btn = BUTTON_LEFT;
718 break;
719 case SDLK_KP6:
720 case SDLK_RIGHT:
721 new_btn = BUTTON_RIGHT;
722 break;
723 case SDLK_KP8:
724 case SDLK_UP:
725 new_btn = BUTTON_UP;
726 break;
727 case SDLK_KP2:
728 case SDLK_DOWN:
729 new_btn = BUTTON_DOWN;
730 break;
731 case SDLK_KP5:
732 case SDLK_SPACE:
733 new_btn = BUTTON_SELECT;
734 break;
735 case SDLK_KP_MULTIPLY:
736 case SDLK_F8:
737 case SDLK_ESCAPE:
738 new_btn = BUTTON_POWER;
739 break;
741 #elif CONFIG_KEYPAD == COWOND2_PAD
742 case SDLK_KP4:
743 case SDLK_LEFT:
744 new_btn = BUTTON_LEFT;
745 break;
746 case SDLK_KP6:
747 case SDLK_RIGHT:
748 new_btn = BUTTON_RIGHT;
749 break;
750 case SDLK_KP8:
751 case SDLK_UP:
752 new_btn = BUTTON_UP;
753 break;
754 case SDLK_KP2:
755 case SDLK_DOWN:
756 new_btn = BUTTON_DOWN;
757 break;
758 case SDLK_KP3:
759 new_btn = BUTTON_POWER;
760 break;
761 case SDLK_KP5:
762 case SDLK_KP_ENTER:
763 case SDLK_RETURN:
764 new_btn = BUTTON_SELECT;
765 break;
766 case SDLK_KP_PLUS:
767 new_btn = BUTTON_PLUS;
768 break;
769 case SDLK_KP_MINUS:
770 new_btn = BUTTON_MINUS;
771 break;
772 case SDLK_KP9:
773 new_btn = BUTTON_MENU;
774 break;
776 #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
777 case SDLK_KP4:
778 case SDLK_LEFT:
779 new_btn = BUTTON_LEFT;
780 break;
781 case SDLK_KP6:
782 case SDLK_RIGHT:
783 new_btn = BUTTON_RIGHT;
784 break;
785 case SDLK_KP8:
786 case SDLK_UP:
787 new_btn = BUTTON_UP;
788 break;
789 case SDLK_KP2:
790 case SDLK_DOWN:
791 new_btn = BUTTON_DOWN;
792 break;
793 case SDLK_KP_ENTER:
794 case SDLK_RETURN:
795 case SDLK_a:
796 new_btn = BUTTON_PLAY;
797 break;
798 case SDLK_KP5:
799 case SDLK_SPACE:
800 new_btn = BUTTON_SELECT;
801 break;
802 case SDLK_KP_PERIOD:
803 case SDLK_INSERT:
804 new_btn = BUTTON_MENU;
805 break;
806 #else
807 #error No keymap defined!
808 #endif /* CONFIG_KEYPAD */
809 case SDLK_KP0:
810 case SDLK_F5:
811 if(pressed)
813 queue_broadcast(SYS_SCREENDUMP, 0);
814 return;
816 break;
819 if (pressed)
820 btn |= new_btn;
821 else
822 btn &= ~new_btn;
824 /* Lots of stuff copied from real button.c. Not good, I think... */
826 /* Find out if a key has been released */
827 diff = btn ^ lastbtn;
828 if(diff && (btn & diff) == 0)
830 #ifdef HAVE_BACKLIGHT
831 #ifdef HAVE_REMOTE_LCD
832 if(diff & BUTTON_REMOTE)
833 if(!skip_remote_release)
834 queue_post(&button_queue, BUTTON_REL | diff, data);
835 else
836 skip_remote_release = false;
837 else
838 #endif
839 if(!skip_release)
840 queue_post(&button_queue, BUTTON_REL | diff, data);
841 else
842 skip_release = false;
843 #else
844 queue_post(&button_queue, BUTTON_REL | diff, data);
845 #endif
848 else
850 if ( btn )
852 /* normal keypress */
853 if ( btn != lastbtn )
855 post = true;
856 repeat = false;
857 repeat_speed = REPEAT_INTERVAL_START;
860 else /* repeat? */
862 if ( repeat )
864 if (!post)
865 count--;
866 if (count == 0)
868 post = true;
869 /* yes we have repeat */
870 repeat_speed--;
871 if (repeat_speed < REPEAT_INTERVAL_FINISH)
872 repeat_speed = REPEAT_INTERVAL_FINISH;
873 count = repeat_speed;
875 repeat_count++;
878 else
880 if (count++ > REPEAT_START)
882 post = true;
883 repeat = true;
884 repeat_count = 0;
885 /* initial repeat */
886 count = REPEAT_INTERVAL_START;
890 if ( post )
892 if(repeat)
894 if (queue_empty(&button_queue))
896 queue_post(&button_queue, BUTTON_REPEAT | btn, data);
897 #ifdef HAVE_BACKLIGHT
898 #ifdef HAVE_REMOTE_LCD
899 if(btn & BUTTON_REMOTE)
901 if(skip_remote_release)
902 skip_remote_release = false;
904 else
905 #endif
906 if(skip_release)
907 skip_release = false;
908 #endif
909 post = false;
912 else
914 #ifdef HAVE_BACKLIGHT
915 #ifdef HAVE_REMOTE_LCD
916 if (btn & BUTTON_REMOTE) {
917 if (!remote_filter_first_keypress || is_remote_backlight_on())
918 queue_post(&button_queue, btn, data);
919 else
920 skip_remote_release = true;
922 else
923 #endif
924 if (!filter_first_keypress || is_backlight_on())
925 queue_post(&button_queue, btn, data);
926 else
927 skip_release = true;
928 #else /* no backlight, nothing to skip */
929 queue_post(&button_queue, btn, data);
930 #endif
931 post = false;
934 #ifdef HAVE_REMOTE_LCD
935 if(btn & BUTTON_REMOTE)
936 remote_backlight_on();
937 else
938 #endif
939 backlight_on();
943 else
945 repeat = false;
946 count = 0;
949 lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT);
952 /* Again copied from real button.c... */
954 int button_queue_count( void )
956 return queue_count(&button_queue);
959 long button_get(bool block)
961 struct queue_event ev;
963 if ( block || !queue_empty(&button_queue) ) {
964 queue_wait(&button_queue, &ev);
965 button_data = ev.data;
966 return ev.id;
968 return BUTTON_NONE;
971 long button_get_w_tmo(int ticks)
973 struct queue_event ev;
974 queue_wait_w_tmo(&button_queue, &ev, ticks);
975 if (ev.id == SYS_TIMEOUT)
976 ev.id = BUTTON_NONE;
977 else
978 button_data = ev.data;
980 return ev.id;
983 intptr_t button_get_data(void)
985 #ifdef HAVE_TOUCHPAD
986 return button_data;
987 #else
988 /* Needed by the accelerating wheel driver for Sansa e200 */
989 return 1 << 24;
990 #endif
993 #ifdef HAVE_TOUCHPAD
994 extern bool debug_wps;
995 void mouse_tick_task(void)
997 static int last_check = 0;
998 int x,y;
999 if (TIME_BEFORE(current_tick, last_check+(HZ/10)))
1000 return;
1001 last_check = current_tick;
1002 if (SDL_GetMouseState(&x, &y) & SDL_BUTTON(SDL_BUTTON_LEFT))
1004 mouse_coords = (x<<16)|y;
1005 button_event(BUTTON_TOUCHPAD, true);
1006 if (debug_wps)
1007 printf("Mouse at: (%d, %d)\n", x, y);
1009 else if (lastbtn == BUTTON_TOUCHPAD)
1011 button_event(BUTTON_TOUCHPAD, false);
1012 mouse_coords = 0;
1015 #endif
1016 void button_init(void)
1018 #ifdef HAVE_TOUCHPAD
1019 tick_add_task(mouse_tick_task);
1020 #endif
1023 int button_status(void)
1025 return btn;
1028 void button_clear_queue(void)
1030 queue_clear(&button_queue);