blob: d6837f640ad887a8f8a09ab8e9a1b7eb9b03ace7 [file] [log] [blame]
Björn Stenbergc7dd78e2002-04-19 14:12:31 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 by Björn Stenberg
11 *
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.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
Björn Stenberg8b695042004-09-16 14:36:08 +000019#include "config.h"
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000020#include "button.h"
Daniel Stenberg132a09b2002-05-28 15:05:16 +000021#include "kernel.h"
Daniel Stenbergeae51102003-04-23 18:49:57 +000022#include "debug.h"
Linus Nielsen Feltzinga8dab4c2004-06-30 13:31:14 +000023#include "misc.h"
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000024
25#include "X11/keysym.h"
26
27/*
28 *Initialize buttons
29 */
30void button_init()
31{
32}
33
34/*
Björn Stenberg45e94942002-04-19 14:38:28 +000035 * Translate X keys to Recorder keys
36 *
37 * We simulate recorder keys on the numeric keypad:
38 *
39 * 4,6,8,2 = Left, Right, Up, Down
40 * 5 = Play/pause
41 * Div,Mul,Sub = The tree menu keys
42 * +,Enter = On, Off
43 *
Daniel Stenbergb3a80fb2002-08-05 14:11:40 +000044 * Alternative Keys For Laptop or VNC Users
45 * Recorder:
46 * Space=Play Q=On A=Off 1,2,3 = F1,F2,F3
47 * Player:
Daniel Stenberg93c1b402002-08-05 15:40:49 +000048 * Q=On Return=Menu
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000049 */
Daniel Stenberged6c7e42002-06-14 11:00:13 +000050
Daniel Stenbergeae51102003-04-23 18:49:57 +000051extern int screenhack_handle_events(bool *release, bool *repeat);
Daniel Stenberged6c7e42002-06-14 11:00:13 +000052
Linus Nielsen Feltzing15d04fd2004-07-23 21:38:43 +000053int button_state = 0;
54
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000055static int get_raw_button (void)
56{
Björn Stenberg9af59722002-08-21 14:13:53 +000057 int k;
Daniel Stenberg5fcce4d2002-10-14 08:09:29 +000058 bool release=false; /* is this a release event */
Daniel Stenbergeae51102003-04-23 18:49:57 +000059 bool repeat=false; /* is the key a repeated one */
60 int ev=screenhack_handle_events(&release, &repeat);
61 switch(ev)
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000062 {
63 case XK_KP_Left:
64 case XK_Left:
65 case XK_KP_4:
Björn Stenberg9af59722002-08-21 14:13:53 +000066 k = BUTTON_LEFT;
67 break;
Björn Stenberg45e94942002-04-19 14:38:28 +000068
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000069 case XK_KP_Right:
70 case XK_Right:
71 case XK_KP_6:
Björn Stenberg9af59722002-08-21 14:13:53 +000072 k = BUTTON_RIGHT;
73 break;
Björn Stenberg45e94942002-04-19 14:38:28 +000074
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000075 case XK_KP_Up:
76 case XK_Up:
77 case XK_KP_8:
Björn Stenberg6c33c512004-09-19 21:58:37 +000078#ifdef BUTTON_UP
Björn Stenberg9af59722002-08-21 14:13:53 +000079 k = BUTTON_UP;
Björn Stenberg6c33c512004-09-19 21:58:37 +000080#elif defined BUTTON_PLAY
81 k = BUTTON_PLAY;
82#endif
Björn Stenberg9af59722002-08-21 14:13:53 +000083 break;
Björn Stenberg45e94942002-04-19 14:38:28 +000084
Björn Stenbergc7dd78e2002-04-19 14:12:31 +000085 case XK_KP_Down:
86 case XK_Down:
87 case XK_KP_2:
Björn Stenberg6c33c512004-09-19 21:58:37 +000088#ifdef BUTTON_DOWN
Björn Stenberg9af59722002-08-21 14:13:53 +000089 k = BUTTON_DOWN;
Björn Stenberg6c33c512004-09-19 21:58:37 +000090#elif defined BUTTON_STOP
91 k = BUTTON_STOP;
92#endif
Björn Stenberg9af59722002-08-21 14:13:53 +000093 break;
Björn Stenberg45e94942002-04-19 14:38:28 +000094
Björn Stenberg6c33c512004-09-19 21:58:37 +000095#ifdef BUTTON_PLAY
Björn Stenberg45e94942002-04-19 14:38:28 +000096 case XK_KP_Space:
97 case XK_KP_5:
Björn Stenbergd39904e2002-06-25 11:05:30 +000098 case XK_KP_Begin:
Daniel Stenbergb3a80fb2002-08-05 14:11:40 +000099 case XK_space:
Björn Stenberg9af59722002-08-21 14:13:53 +0000100 k = BUTTON_PLAY;
101 break;
Björn Stenberg6c33c512004-09-19 21:58:37 +0000102#endif
Björn Stenberg45e94942002-04-19 14:38:28 +0000103
Björn Stenberg6c33c512004-09-19 21:58:37 +0000104#ifdef BUTTON_OFF
Björn Stenberg45e94942002-04-19 14:38:28 +0000105 case XK_KP_Enter:
Daniel Stenbergb3a80fb2002-08-05 14:11:40 +0000106 case XK_A:
107 case XK_a:
Björn Stenberg9af59722002-08-21 14:13:53 +0000108 k = BUTTON_OFF;
109 break;
Björn Stenberg6c33c512004-09-19 21:58:37 +0000110#endif
Björn Stenberg45e94942002-04-19 14:38:28 +0000111
Björn Stenberg6c33c512004-09-19 21:58:37 +0000112#ifdef BUTTON_ON
Björn Stenberg45e94942002-04-19 14:38:28 +0000113 case XK_KP_Add:
Daniel Stenbergb3a80fb2002-08-05 14:11:40 +0000114 case XK_Q:
115 case XK_q:
Björn Stenberg9af59722002-08-21 14:13:53 +0000116 k = BUTTON_ON;
117 break;
Björn Stenberg6c33c512004-09-19 21:58:37 +0000118#endif
Björn Stenberg45e94942002-04-19 14:38:28 +0000119
Björn Stenberg6c33c512004-09-19 21:58:37 +0000120#ifdef BUTTON_F1
Björn Stenberg45e94942002-04-19 14:38:28 +0000121 case XK_KP_Divide:
Daniel Stenbergb3a80fb2002-08-05 14:11:40 +0000122 case XK_1:
Björn Stenberg9af59722002-08-21 14:13:53 +0000123 k = BUTTON_F1;
124 break;
Björn Stenberg45e94942002-04-19 14:38:28 +0000125
126 case XK_KP_Multiply:
Daniel Stenbergb3a80fb2002-08-05 14:11:40 +0000127 case XK_2:
Björn Stenberg9af59722002-08-21 14:13:53 +0000128 k = BUTTON_F2;
129 break;
Björn Stenberg45e94942002-04-19 14:38:28 +0000130
131 case XK_KP_Subtract:
Daniel Stenbergb3a80fb2002-08-05 14:11:40 +0000132 case XK_3:
Björn Stenberg9af59722002-08-21 14:13:53 +0000133 k = BUTTON_F3;
134 break;
Björn Stenberg6c33c512004-09-19 21:58:37 +0000135#endif
Linus Nielsen Feltzinga8dab4c2004-06-30 13:31:14 +0000136
Björn Stenberg6c33c512004-09-19 21:58:37 +0000137#ifdef HAVE_LCD_BITMAP
Linus Nielsen Feltzinga8dab4c2004-06-30 13:31:14 +0000138 case XK_5:
139 if(!release)
140 {
141 screen_dump();
142 return 0;
143 }
144 break;
Björn Stenberg6c33c512004-09-19 21:58:37 +0000145#endif
Linus Nielsen Feltzinga8dab4c2004-06-30 13:31:14 +0000146
Björn Stenberg6c33c512004-09-19 21:58:37 +0000147#ifdef BUTTON_MENU
Jörg Hohensohn593cc002004-09-28 22:13:26 +0000148#if CONFIG_KEYPAD == PLAYER_PAD
Björn Stenberg8cbedc32002-05-21 15:02:13 +0000149 case XK_KP_Enter:
Daniel Stenberg93c1b402002-08-05 15:40:49 +0000150 case XK_Return:
Jörg Hohensohn593cc002004-09-28 22:13:26 +0000151#elif CONFIG_KEYPAD == ONDIO_PAD
Björn Stenberg6c33c512004-09-19 21:58:37 +0000152 case XK_KP_Insert:
153 case XK_Control_R:
154#endif
Björn Stenberg9af59722002-08-21 14:13:53 +0000155 k = BUTTON_MENU;
156 break;
Björn Stenberg28af55d2002-05-16 14:46:58 +0000157#endif
Björn Stenberg45e94942002-04-19 14:38:28 +0000158
Björn Stenbergc7dd78e2002-04-19 14:12:31 +0000159 default:
Björn Stenberg9af59722002-08-21 14:13:53 +0000160 k = 0;
Daniel Stenbergeae51102003-04-23 18:49:57 +0000161 if(ev)
162 DEBUGF("received ev %d\n", ev);
Björn Stenberg9af59722002-08-21 14:13:53 +0000163 break;
Björn Stenbergc7dd78e2002-04-19 14:12:31 +0000164 }
Björn Stenberg9af59722002-08-21 14:13:53 +0000165
Linus Nielsen Feltzing15d04fd2004-07-23 21:38:43 +0000166 if(release) {
Daniel Stenberg5fcce4d2002-10-14 08:09:29 +0000167 /* return a release event */
Linus Nielsen Feltzing15d04fd2004-07-23 21:38:43 +0000168 button_state &= ~k;
Daniel Stenberg5fcce4d2002-10-14 08:09:29 +0000169 k |= BUTTON_REL;
Linus Nielsen Feltzing15d04fd2004-07-23 21:38:43 +0000170 } else {
171 if(k) {
172 button_state |= k;
173 k = button_state;
174 }
175 }
Björn Stenberg9af59722002-08-21 14:13:53 +0000176
Daniel Stenbergeae51102003-04-23 18:49:57 +0000177 if(repeat)
178 k |= BUTTON_REPEAT;
Björn Stenberg9af59722002-08-21 14:13:53 +0000179 return k;
Björn Stenbergc7dd78e2002-04-19 14:12:31 +0000180}
181
182/*
Daniel Stenberga398aa42002-08-07 08:43:55 +0000183 * Timeout after TICKS unless a key is pressed.
184 */
185int button_get_w_tmo(int ticks)
186{
187 int bits;
188 int i=0;
189
190 for(i=0; i< ticks; i++) {
191 bits = get_raw_button();
192 if(!bits)
Linus Nielsen Feltzinga6142ab2004-06-10 13:29:52 +0000193 sim_sleep(1);
Daniel Stenberga398aa42002-08-07 08:43:55 +0000194 else
195 break;
Björn Stenberg9af59722002-08-21 14:13:53 +0000196 }
Daniel Stenberga398aa42002-08-07 08:43:55 +0000197
198 return bits;
199}
200
201/*
Björn Stenbergc7dd78e2002-04-19 14:12:31 +0000202 * Get the currently pressed button.
203 * Returns one of BUTTON_xxx codes, with possibly a modifier bit set.
204 * No modifier bits are set when the button is first pressed.
205 * BUTTON_HELD bit is while the button is being held.
206 * BUTTON_REL bit is set when button has been released.
207 */
Daniel Stenberg132a09b2002-05-28 15:05:16 +0000208int button_get(bool block)
Björn Stenbergc7dd78e2002-04-19 14:12:31 +0000209{
Daniel Stenberg132a09b2002-05-28 15:05:16 +0000210 int bits;
211 do {
212 bits = get_raw_button();
213 if(block && !bits)
Linus Nielsen Feltzinga6142ab2004-06-10 13:29:52 +0000214 sim_sleep(HZ/10);
Daniel Stenberg132a09b2002-05-28 15:05:16 +0000215 else
216 break;
217 } while(1);
218
Daniel Stenbergea604362002-10-13 14:16:44 +0000219 if(!block)
220 /* delay a bit */
Linus Nielsen Feltzinga6142ab2004-06-10 13:29:52 +0000221 sim_sleep(1);
Daniel Stenbergea604362002-10-13 14:16:44 +0000222
Daniel Stenberg132a09b2002-05-28 15:05:16 +0000223 return bits;
Björn Stenbergc7dd78e2002-04-19 14:12:31 +0000224}
Linus Nielsen Feltzinga754dd82004-07-21 08:02:23 +0000225
226int button_status(void)
227{
228 return get_raw_button();
229}
230
231void button_clear_queue(void)
232{
233}