summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/xworld/sys.c74
1 files changed, 73 insertions, 1 deletions
diff --git a/apps/plugins/xworld/sys.c b/apps/plugins/xworld/sys.c
index 15fdb46..942ab3a 100644
--- a/apps/plugins/xworld/sys.c
+++ b/apps/plugins/xworld/sys.c
@@ -698,10 +698,13 @@ void sys_processEvents(struct System* sys)
int btn = rb->button_status();
rb->button_clear_queue();
btn &= ~BUTTON_REDRAW;
+
+ static int oldbuttonstate = 0;
+
debug(DBG_SYS, "button is 0x%08x", btn);
/* exit early if we can */
- if(btn == BUTTON_NONE)
+ if(btn == BUTTON_NONE && btn == oldbuttonstate)
{
return;
}
@@ -713,10 +716,12 @@ void sys_processEvents(struct System* sys)
if(btn & 0x80000000)
return;
#endif
+
#if (CONFIG_KEYPAD == SANSA_E200_PAD)
if(btn == (BUTTON_SCROLL_FWD || BUTTON_SCROLL_BACK))
return;
#endif
+
#if (CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD)
if(btn == (BUTTON_SELECT))
return;
@@ -736,6 +741,72 @@ void sys_processEvents(struct System* sys)
break;
}
+ /* copied from doom which was copied from rockboy... */
+ unsigned released = ~btn & oldbuttonstate;
+ unsigned pressed = btn & ~oldbuttonstate;
+ oldbuttonstate = newbuttonstate;
+
+ if(released)
+ {
+ if(btn & BTN_FIRE)
+ sys->input.button = false;
+ if(btn & sys->keymap.up)
+ sys->input.dirMask &= ~DIR_UP;
+ if(btn & sys->keymap.down)
+ sys->input.dirMask &= ~DIR_DOWN;
+ if(btn & sys->keymap.left)
+ sys->input.dirMask &= ~DIR_LEFT;
+ if(btn & sys->keymap.right)
+ sys->input.dirMask &= ~DIR_RIGHT;
+#ifdef BTN_DOWN_LEFT
+ if(btn & sys->keymap.downleft)
+ sys->input.dirMask &= ~(DIR_DOWN | DIR_LEFT);
+#endif
+#ifdef BTN_DOWN_RIGHT
+ if(btn & sys->keymap.downright)
+ sys->input.dirMask &= ~(DIR_DOWN | DIR_RIGHT);
+#endif
+#ifdef BTN_UP_LEFT
+ if(btn & sys->keymap.upleft)
+ sys->input.dirMask &= ~(DIR_UP | DIR_LEFT);
+#endif
+#ifdef BTN_UP_RIGHT
+ if(btn & sys->keymap.upright)
+ sys->input.dirMask &= ~(DIR_UP | DIR_RIGHT);
+#endif
+ }
+
+ if(pressed)
+ {
+ if(btn & BTN_FIRE)
+ sys->input.button = true;
+ if(btn & sys->keymap.up)
+ sys->input.dirMask |= DIR_UP;
+ if(btn & sys->keymap.down)
+ sys->input.dirMask |= DIR_DOWN;
+ if(btn & sys->keymap.left)
+ sys->input.dirMask |= DIR_LEFT;
+ if(btn & sys->keymap.right)
+ sys->input.dirMask |= DIR_RIGHT;
+#ifdef BTN_DOWN_LEFT
+ if(btn & sys->keymap.downleft)
+ sys->input.dirMask |= (DIR_DOWN | DIR_LEFT);
+#endif
+#ifdef BTN_DOWN_RIGHT
+ if(btn & sys->keymap.downright)
+ sys->input.dirMask |= (DIR_DOWN | DIR_RIGHT);
+#endif
+#ifdef BTN_UP_LEFT
+ if(btn & sys->keymap.upleft)
+ sys->input.dirMask |= (DIR_UP | DIR_LEFT);
+#endif
+#ifdef BTN_UP_RIGHT
+ if(btn & sys->keymap.upright)
+ sys->input.dirMask |= (DIR_UP | DIR_RIGHT);
+#endif
+ }
+
+#if 0
/* handle releases */
if(btn & BUTTON_REL)
{
@@ -801,6 +872,7 @@ void sys_processEvents(struct System* sys)
}
debug(DBG_SYS, "dirMask is 0x%02x", sys->input.dirMask);
debug(DBG_SYS, "button is %s", sys->input.button == true ? "true" : "false");
+#endif
}
void sys_sleep(struct System* sys, uint32_t duration)