Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 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 Stenberg | 8b69504 | 2004-09-16 14:36:08 +0000 | [diff] [blame] | 19 | #include "config.h" |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 20 | #include "button.h" |
Daniel Stenberg | 132a09b | 2002-05-28 15:05:16 +0000 | [diff] [blame] | 21 | #include "kernel.h" |
Daniel Stenberg | eae5110 | 2003-04-23 18:49:57 +0000 | [diff] [blame] | 22 | #include "debug.h" |
Linus Nielsen Feltzing | a8dab4c | 2004-06-30 13:31:14 +0000 | [diff] [blame] | 23 | #include "misc.h" |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 24 | |
| 25 | #include "X11/keysym.h" |
| 26 | |
| 27 | /* |
| 28 | *Initialize buttons |
| 29 | */ |
| 30 | void button_init() |
| 31 | { |
| 32 | } |
| 33 | |
| 34 | /* |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 35 | * 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 Stenberg | b3a80fb | 2002-08-05 14:11:40 +0000 | [diff] [blame] | 44 | * 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 Stenberg | 93c1b40 | 2002-08-05 15:40:49 +0000 | [diff] [blame] | 48 | * Q=On Return=Menu |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 49 | */ |
Daniel Stenberg | ed6c7e4 | 2002-06-14 11:00:13 +0000 | [diff] [blame] | 50 | |
Daniel Stenberg | eae5110 | 2003-04-23 18:49:57 +0000 | [diff] [blame] | 51 | extern int screenhack_handle_events(bool *release, bool *repeat); |
Daniel Stenberg | ed6c7e4 | 2002-06-14 11:00:13 +0000 | [diff] [blame] | 52 | |
Linus Nielsen Feltzing | 15d04fd | 2004-07-23 21:38:43 +0000 | [diff] [blame] | 53 | int button_state = 0; |
| 54 | |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 55 | static int get_raw_button (void) |
| 56 | { |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 57 | int k; |
Daniel Stenberg | 5fcce4d | 2002-10-14 08:09:29 +0000 | [diff] [blame] | 58 | bool release=false; /* is this a release event */ |
Daniel Stenberg | eae5110 | 2003-04-23 18:49:57 +0000 | [diff] [blame] | 59 | bool repeat=false; /* is the key a repeated one */ |
| 60 | int ev=screenhack_handle_events(&release, &repeat); |
| 61 | switch(ev) |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 62 | { |
| 63 | case XK_KP_Left: |
| 64 | case XK_Left: |
| 65 | case XK_KP_4: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 66 | k = BUTTON_LEFT; |
| 67 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 68 | |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 69 | case XK_KP_Right: |
| 70 | case XK_Right: |
| 71 | case XK_KP_6: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 72 | k = BUTTON_RIGHT; |
| 73 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 74 | |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 75 | case XK_KP_Up: |
| 76 | case XK_Up: |
| 77 | case XK_KP_8: |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 78 | #ifdef BUTTON_UP |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 79 | k = BUTTON_UP; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 80 | #elif defined BUTTON_PLAY |
| 81 | k = BUTTON_PLAY; |
| 82 | #endif |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 83 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 84 | |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 85 | case XK_KP_Down: |
| 86 | case XK_Down: |
| 87 | case XK_KP_2: |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 88 | #ifdef BUTTON_DOWN |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 89 | k = BUTTON_DOWN; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 90 | #elif defined BUTTON_STOP |
| 91 | k = BUTTON_STOP; |
| 92 | #endif |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 93 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 94 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 95 | #ifdef BUTTON_PLAY |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 96 | case XK_KP_Space: |
| 97 | case XK_KP_5: |
Björn Stenberg | d39904e | 2002-06-25 11:05:30 +0000 | [diff] [blame] | 98 | case XK_KP_Begin: |
Daniel Stenberg | b3a80fb | 2002-08-05 14:11:40 +0000 | [diff] [blame] | 99 | case XK_space: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 100 | k = BUTTON_PLAY; |
| 101 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 102 | #endif |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 103 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 104 | #ifdef BUTTON_OFF |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 105 | case XK_KP_Enter: |
Daniel Stenberg | b3a80fb | 2002-08-05 14:11:40 +0000 | [diff] [blame] | 106 | case XK_A: |
| 107 | case XK_a: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 108 | k = BUTTON_OFF; |
| 109 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 110 | #endif |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 111 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 112 | #ifdef BUTTON_ON |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 113 | case XK_KP_Add: |
Daniel Stenberg | b3a80fb | 2002-08-05 14:11:40 +0000 | [diff] [blame] | 114 | case XK_Q: |
| 115 | case XK_q: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 116 | k = BUTTON_ON; |
| 117 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 118 | #endif |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 119 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 120 | #ifdef BUTTON_F1 |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 121 | case XK_KP_Divide: |
Daniel Stenberg | b3a80fb | 2002-08-05 14:11:40 +0000 | [diff] [blame] | 122 | case XK_1: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 123 | k = BUTTON_F1; |
| 124 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 125 | |
| 126 | case XK_KP_Multiply: |
Daniel Stenberg | b3a80fb | 2002-08-05 14:11:40 +0000 | [diff] [blame] | 127 | case XK_2: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 128 | k = BUTTON_F2; |
| 129 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 130 | |
| 131 | case XK_KP_Subtract: |
Daniel Stenberg | b3a80fb | 2002-08-05 14:11:40 +0000 | [diff] [blame] | 132 | case XK_3: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 133 | k = BUTTON_F3; |
| 134 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 135 | #endif |
Linus Nielsen Feltzing | a8dab4c | 2004-06-30 13:31:14 +0000 | [diff] [blame] | 136 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 137 | #ifdef HAVE_LCD_BITMAP |
Linus Nielsen Feltzing | a8dab4c | 2004-06-30 13:31:14 +0000 | [diff] [blame] | 138 | case XK_5: |
| 139 | if(!release) |
| 140 | { |
| 141 | screen_dump(); |
| 142 | return 0; |
| 143 | } |
| 144 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 145 | #endif |
Linus Nielsen Feltzing | a8dab4c | 2004-06-30 13:31:14 +0000 | [diff] [blame] | 146 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 147 | #ifdef BUTTON_MENU |
Jörg Hohensohn | 593cc00 | 2004-09-28 22:13:26 +0000 | [diff] [blame] | 148 | #if CONFIG_KEYPAD == PLAYER_PAD |
Björn Stenberg | 8cbedc3 | 2002-05-21 15:02:13 +0000 | [diff] [blame] | 149 | case XK_KP_Enter: |
Daniel Stenberg | 93c1b40 | 2002-08-05 15:40:49 +0000 | [diff] [blame] | 150 | case XK_Return: |
Jörg Hohensohn | 593cc00 | 2004-09-28 22:13:26 +0000 | [diff] [blame] | 151 | #elif CONFIG_KEYPAD == ONDIO_PAD |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 152 | case XK_KP_Insert: |
| 153 | case XK_Control_R: |
| 154 | #endif |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 155 | k = BUTTON_MENU; |
| 156 | break; |
Björn Stenberg | 28af55d | 2002-05-16 14:46:58 +0000 | [diff] [blame] | 157 | #endif |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 158 | |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 159 | default: |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 160 | k = 0; |
Daniel Stenberg | eae5110 | 2003-04-23 18:49:57 +0000 | [diff] [blame] | 161 | if(ev) |
| 162 | DEBUGF("received ev %d\n", ev); |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 163 | break; |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 164 | } |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 165 | |
Linus Nielsen Feltzing | 15d04fd | 2004-07-23 21:38:43 +0000 | [diff] [blame] | 166 | if(release) { |
Daniel Stenberg | 5fcce4d | 2002-10-14 08:09:29 +0000 | [diff] [blame] | 167 | /* return a release event */ |
Linus Nielsen Feltzing | 15d04fd | 2004-07-23 21:38:43 +0000 | [diff] [blame] | 168 | button_state &= ~k; |
Daniel Stenberg | 5fcce4d | 2002-10-14 08:09:29 +0000 | [diff] [blame] | 169 | k |= BUTTON_REL; |
Linus Nielsen Feltzing | 15d04fd | 2004-07-23 21:38:43 +0000 | [diff] [blame] | 170 | } else { |
| 171 | if(k) { |
| 172 | button_state |= k; |
| 173 | k = button_state; |
| 174 | } |
| 175 | } |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 176 | |
Daniel Stenberg | eae5110 | 2003-04-23 18:49:57 +0000 | [diff] [blame] | 177 | if(repeat) |
| 178 | k |= BUTTON_REPEAT; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 179 | return k; |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 180 | } |
| 181 | |
| 182 | /* |
Daniel Stenberg | a398aa4 | 2002-08-07 08:43:55 +0000 | [diff] [blame] | 183 | * Timeout after TICKS unless a key is pressed. |
| 184 | */ |
| 185 | int 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 Feltzing | a6142ab | 2004-06-10 13:29:52 +0000 | [diff] [blame] | 193 | sim_sleep(1); |
Daniel Stenberg | a398aa4 | 2002-08-07 08:43:55 +0000 | [diff] [blame] | 194 | else |
| 195 | break; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 196 | } |
Daniel Stenberg | a398aa4 | 2002-08-07 08:43:55 +0000 | [diff] [blame] | 197 | |
| 198 | return bits; |
| 199 | } |
| 200 | |
| 201 | /* |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 202 | * 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 Stenberg | 132a09b | 2002-05-28 15:05:16 +0000 | [diff] [blame] | 208 | int button_get(bool block) |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 209 | { |
Daniel Stenberg | 132a09b | 2002-05-28 15:05:16 +0000 | [diff] [blame] | 210 | int bits; |
| 211 | do { |
| 212 | bits = get_raw_button(); |
| 213 | if(block && !bits) |
Linus Nielsen Feltzing | a6142ab | 2004-06-10 13:29:52 +0000 | [diff] [blame] | 214 | sim_sleep(HZ/10); |
Daniel Stenberg | 132a09b | 2002-05-28 15:05:16 +0000 | [diff] [blame] | 215 | else |
| 216 | break; |
| 217 | } while(1); |
| 218 | |
Daniel Stenberg | ea60436 | 2002-10-13 14:16:44 +0000 | [diff] [blame] | 219 | if(!block) |
| 220 | /* delay a bit */ |
Linus Nielsen Feltzing | a6142ab | 2004-06-10 13:29:52 +0000 | [diff] [blame] | 221 | sim_sleep(1); |
Daniel Stenberg | ea60436 | 2002-10-13 14:16:44 +0000 | [diff] [blame] | 222 | |
Daniel Stenberg | 132a09b | 2002-05-28 15:05:16 +0000 | [diff] [blame] | 223 | return bits; |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 224 | } |
Linus Nielsen Feltzing | a754dd8 | 2004-07-21 08:02:23 +0000 | [diff] [blame] | 225 | |
| 226 | int button_status(void) |
| 227 | { |
| 228 | return get_raw_button(); |
| 229 | } |
| 230 | |
| 231 | void button_clear_queue(void) |
| 232 | { |
| 233 | } |