summaryrefslogtreecommitdiff
path: root/uisimulator/sdl/button.c
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2006-02-03 15:19:58 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2006-02-03 15:19:58 +0000
commitfc72c5375813a6bbc0845aca984147a944a7e62a (patch)
tree347a6a9297f9f4d3131c8268f450d6ba227d0246 /uisimulator/sdl/button.c
parent347992e9d93ed0f91cde7e2d580cfdc8d5eb95f4 (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.c275
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
+