/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2002 by Björn Stenberg * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include "config.h" #include "button.h" #include "kernel.h" #include "debug.h" #include "misc.h" #include "X11/keysym.h" /* *Initialize buttons */ void button_init() { } /* * Translate X keys to Recorder keys * * We simulate recorder keys on the numeric keypad: * * 4,6,8,2 = Left, Right, Up, Down * 5 = Play/pause * Div,Mul,Sub = The tree menu keys * +,Enter = On, Off * * Alternative Keys For Laptop or VNC Users * Recorder: * Space=Play Q=On A=Off 1,2,3 = F1,F2,F3 * Player: * Q=On Return=Menu */ extern int screenhack_handle_events(bool *release, bool *repeat); int button_state = 0; static int get_raw_button (void) { int k; bool release=false; /* is this a release event */ bool repeat=false; /* is the key a repeated one */ int ev=screenhack_handle_events(&release, &repeat); switch(ev) { case XK_KP_Left: case XK_Left: case XK_KP_4: k = BUTTON_LEFT; break; case XK_KP_Right: case XK_Right: case XK_KP_6: k = BUTTON_RIGHT; break; case XK_KP_Up: case XK_Up: case XK_KP_8: #ifdef BUTTON_UP k = BUTTON_UP; #elif defined BUTTON_PLAY k = BUTTON_PLAY; #endif break; case XK_KP_Down: case XK_Down: case XK_KP_2: #ifdef BUTTON_DOWN k = BUTTON_DOWN; #elif defined BUTTON_STOP k = BUTTON_STOP; #endif break; #ifdef BUTTON_PLAY case XK_KP_Space: case XK_KP_5: case XK_KP_Begin: case XK_space: k = BUTTON_PLAY; break; #endif #ifdef BUTTON_OFF case XK_KP_Enter: case XK_A: case XK_a: k = BUTTON_OFF; break; #endif #ifdef BUTTON_ON case XK_KP_Add: case XK_Q: case XK_q: k = BUTTON_ON; break; #endif #ifdef BUTTON_F1 case XK_KP_Divide: case XK_1: k = BUTTON_F1; break; case XK_KP_Multiply: case XK_2: k = BUTTON_F2; break; case XK_KP_Subtract: case XK_3: k = BUTTON_F3; break; #endif #ifdef HAVE_LCD_BITMAP case XK_5: if(!release) { screen_dump(); return 0; } break; #endif #ifdef BUTTON_MENU #if CONFIG_KEYPAD == PLAYER_PAD case XK_KP_Enter: case XK_Return: #elif CONFIG_KEYPAD == ONDIO_PAD case XK_KP_Insert: case XK_Control_R: #endif k = BUTTON_MENU; break; #endif default: k = 0; if(ev) DEBUGF("received ev %d\n", ev); break; } if(release) { /* return a release event */ button_state &= ~k; k |= BUTTON_REL; } else { if(k) { button_state |= k; k = button_state; } } if(repeat) k |= BUTTON_REPEAT; return k; } /* * Timeout after TICKS unless a key is pressed. */ int button_get_w_tmo(int ticks) { int bits; int i=0; for(i=0; i< ticks; i++) { bits = get_raw_button(); if(!bits) sim_sleep(1); else break; } return bits; } /* * Get the currently pressed button. * Returns one of BUTTON_xxx codes, with possibly a modifier bit set. * No modifier bits are set when the button is first pressed. * BUTTON_HELD bit is while the button is being held. * BUTTON_REL bit is set when button has been released. */ int button_get(bool block) { int bits; do { bits = get_raw_button(); if(block && !bits) sim_sleep(HZ/10); else break; } while(1); if(!block) /* delay a bit */ sim_sleep(1); return bits; } int button_status(void) { return get_raw_button(); } void button_clear_queue(void) { }