diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2006-02-03 15:19:58 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2006-02-03 15:19:58 +0000 |
commit | fc72c5375813a6bbc0845aca984147a944a7e62a (patch) | |
tree | 347a6a9297f9f4d3131c8268f450d6ba227d0246 /uisimulator/sdl/button.c | |
parent | 347992e9d93ed0f91cde7e2d580cfdc8d5eb95f4 (diff) |
Patch #1417462 by Dan Everton - Improved SDL simulator
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8546 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator/sdl/button.c')
-rw-r--r-- | uisimulator/sdl/button.c | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/uisimulator/sdl/button.c b/uisimulator/sdl/button.c new file mode 100644 index 0000000000..5def88b9af --- /dev/null +++ b/uisimulator/sdl/button.c @@ -0,0 +1,275 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Felix Arends + * + * 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 "uisdl.h" +#include "config.h" +#include "button.h" +#include "kernel.h" +#include "backlight.h" +#include "misc.h" + +/* how long until repeat kicks in */ +#define REPEAT_START 6 + +/* the speed repeat starts at */ +#define REPEAT_INTERVAL_START 4 + +/* speed repeat finishes at */ +#define REPEAT_INTERVAL_FINISH 2 + +struct event_queue button_queue; + +static int btn = 0; /* Hopefully keeps track of currently pressed keys... */ + +void button_event(int key, bool pressed) +{ + bool post = false; + int new_btn = 0; + int diff = 0; + static int count = 0; + static int lastbtn; + static int repeat_speed = REPEAT_INTERVAL_START; + static int repeat_count = 0; + static bool repeat = false; + + switch (key) + { + case SDLK_KP4: + case SDLK_LEFT: + new_btn = BUTTON_LEFT; + break; + case SDLK_KP6: + case SDLK_RIGHT: + new_btn = BUTTON_RIGHT; + break; + + case SDLK_KP8: + case SDLK_UP: +#ifdef BUTTON_UP + new_btn = BUTTON_UP; +#elif defined BUTTON_SCROLL_FWD + new_btn = BUTTON_SCROLL_FWD; +#elif defined BUTTON_PLAY + new_btn = BUTTON_PLAY; +#endif + break; + + case SDLK_KP2: + case SDLK_DOWN: +#ifdef BUTTON_DOWN + new_btn = BUTTON_DOWN; +#elif defined BUTTON_SCROLL_BACK + new_btn = BUTTON_SCROLL_BACK; +#elif defined BUTTON_STOP + new_btn = BUTTON_STOP; +#endif + break; + + case SDLK_KP_PLUS: +#ifdef BUTTON_ON + new_btn = BUTTON_ON; +#elif defined(BUTTON_SELECT) && defined(BUTTON_PLAY) + new_btn = BUTTON_PLAY; +#endif + break; + +#ifdef BUTTON_OFF + case SDLK_RETURN: + new_btn = BUTTON_OFF; + break; +#endif + +#ifdef BUTTON_F1 + case SDLK_KP_DIVIDE: + case SDLK_F1: + new_btn = BUTTON_F1; + break; + case SDLK_KP_MULTIPLY: + case SDLK_F2: + new_btn = BUTTON_F2; + break; + case SDLK_KP_MINUS: + case SDLK_F3: + new_btn = BUTTON_F3; + break; +#elif defined(BUTTON_REC) + case SDLK_KP_DIVIDE: + case SDLK_F1: + new_btn = BUTTON_REC; + break; +#endif + + case SDLK_KP5: + case SDLK_SPACE: +#if defined(BUTTON_PLAY) && !defined(BUTTON_SELECT) + new_btn = BUTTON_PLAY; +#elif defined(BUTTON_SELECT) + new_btn = BUTTON_SELECT; +#endif + break; + +#ifdef HAVE_LCD_BITMAP + case SDLK_KP0: + case SDLK_F5: + if(pressed) + { + screen_dump(); + return; + } + break; +#endif + + case SDLK_PERIOD: + case SDLK_INSERT: +#ifdef BUTTON_MENU + new_btn = BUTTON_MENU; +#elif defined(BUTTON_MODE) + new_btn = BUTTON_MODE; +#endif + break; + } + + if (pressed) + btn |= new_btn; + else + btn &= ~new_btn; + + /* Lots of stuff copied from real button.c. Not good, I think... */ + + /* Find out if a key has been released */ + diff = btn ^ lastbtn; + + if(diff && (btn & diff) == 0) + { + queue_post(&button_queue, BUTTON_REL | diff, NULL); + } + else + { + if ( btn ) + { + /* normal keypress */ + if ( btn != lastbtn ) + { + post = true; + repeat = false; + repeat_speed = REPEAT_INTERVAL_START; + + } + else /* repeat? */ + { + if ( repeat ) + { + count--; + if (count == 0) + { + post = true; + /* yes we have repeat */ + repeat_speed--; + if (repeat_speed < REPEAT_INTERVAL_FINISH) + repeat_speed = REPEAT_INTERVAL_FINISH; + count = repeat_speed; + + repeat_count++; + } + } + else + { + if (count++ > REPEAT_START) + { + post = true; + repeat = true; + repeat_count = 0; + /* initial repeat */ + count = REPEAT_INTERVAL_START; + } + } + } + if ( post ) + { + if(repeat) + queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + else + queue_post(&button_queue, btn, NULL); + +#ifdef HAVE_REMOTE_LCD + if(btn & BUTTON_REMOTE) + remote_backlight_on(); + else +#endif + backlight_on(); + + } + } + else + { + repeat = false; + count = 0; + } + } + lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); +} + +/* Again copied from real button.c... */ + +long button_get(bool block) +{ + struct event ev; + + if ( block || !queue_empty(&button_queue) ) { + queue_wait(&button_queue, &ev); + return ev.id; + } + return BUTTON_NONE; +} + +long button_get_w_tmo(int ticks) +{ + struct event ev; + queue_wait_w_tmo(&button_queue, &ev, ticks); + return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE; +} + +void button_init(void) +{ +} + +int button_status(void) +{ + return btn; +} + +void button_clear_queue(void) +{ + queue_clear(&button_queue); +} + +#ifdef HAS_BUTTON_HOLD +bool button_hold(void) { + /* temp fix for hold button on irivers */ + return false; +} +#endif + +#ifdef HAS_REMOTE_BUTTON_HOLD +bool remote_button_hold(void) { + /* temp fix for hold button on irivers */ + return false; +} +#endif + |