diff options
Diffstat (limited to 'apps/plugins')
| -rw-r--r-- | apps/plugins/xworld/sys.c | 74 |
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) |