Index: apps/action.h =================================================================== --- apps/action.h (revision 23550) +++ apps/action.h (working copy) @@ -235,6 +235,8 @@ ACTION_KBD_DOWN, ACTION_KBD_MORSE_INPUT, ACTION_KBD_MORSE_SELECT, + ACTION_KBD_SCROLL_FWD, + ACTION_KBD_SCROLL_BACK, #ifdef HAVE_TOUCHSCREEN /* the following are helper actions for touchscreen targets, Index: apps/recorder/keyboard.c =================================================================== --- apps/recorder/keyboard.c (revision 23550) +++ apps/recorder/keyboard.c (working copy) @@ -90,6 +90,10 @@ #define KBD_MORSE_INPUT #endif +#ifdef HAVE_SCROLLWHEEL +#define KEEP_ROLLIN +#endif + struct keyboard_parameters { const unsigned char* default_kbd; @@ -292,6 +296,9 @@ int kbd_input(char* text, int buflen) { +#ifdef KEEP_ROLLIN + int prev_button = 0; +#endif bool done = false; #ifdef CPU_ARM /* This seems to keep the sizes for ARM way down */ @@ -755,9 +762,23 @@ #ifdef KBD_MORSE_INPUT if(!morse_mode) #endif - sc->fillrect(pm->font_w*pm->x, +#ifdef KEEP_ROLLIN + { + if ( prev_button != ACTION_KBD_SCROLL_FWD ) + /* Underline when picking rows */ + sc->hline(pm->font_w, pm->font_w*(pm->max_chars-1), + statusbar_size+pm->font_h*(pm->y+1)); + else + /* Normal cursor when picking char */ + sc->fillrect(pm->font_w*pm->x, + statusbar_size + pm->font_h*pm->y, + pm->font_w, pm->font_h); + } +#else /* KEEP_ROLLIN */ + sc->fillrect(pm->font_w*pm->x, statusbar_size + pm->font_h*pm->y, pm->font_w, pm->font_h); +#endif /* KEEP_ROLLIN */ sc->set_drawmode(DRMODE_SOLID); } @@ -949,6 +970,8 @@ } break; + + case ACTION_KBD_DONE: /* accepts what was entered and continues */ ret = 0; @@ -1144,6 +1167,98 @@ #endif break; +#ifdef KEEP_ROLLIN + case ACTION_KBD_SCROLL_FWD: + /* move cursor right */ + if (++pm->x >= pm->max_chars) { +#ifndef KBD_PAGE_FLIP + /* no dedicated flip key - flip page on wrap */ + if (++pm->page >= pm->pages) + pm->page = 0; +#endif + pm->x = 0; + } + ch = get_kbd_ch(pm); + kbd_spellchar(ch); + prev_button = ACTION_KBD_SCROLL_FWD; + break; + + case ACTION_KBD_SCROLL_BACK: + if ( prev_button != ACTION_KBD_SCROLL_FWD ) { + /* go down */ + if (++pm->y >= pm->lines) { + pm->y=0; + //if (--pm->x < 0 ) + // pm->x = pm->max_chars-1; + + } + say_edit(); + } + else { /* insert current char */ + /* find input char */ + ch = get_kbd_ch(pm); + + /* check for hangul input */ + if (ch >= 0x3131 && ch <= 0x3163) { + unsigned short tmp; + + if (!pm->hangul) { + pm->hlead = pm->hvowel = pm->htail = 0; + pm->hangul = true; + } + + if (!pm->hvowel) { + pm->hvowel = ch; + } + else if (!pm->htail) { + pm->htail = ch; + } + else { + /* previous hangul complete */ + /* check whether tail is actually lead of next char */ + tmp = hangul_join(pm->htail, ch, 0); + + if (tmp != 0xfffd) { + tmp = hangul_join(pm->hlead, pm->hvowel, 0); + kbd_delchar(text, &editpos); + kbd_inschar(text, buflen, &editpos, tmp); + /* insert dummy char */ + kbd_inschar(text, buflen, &editpos, ' '); + pm->hlead = pm->htail; + pm->hvowel = ch; + pm->htail = 0; + } + else { + pm->hvowel = pm->htail = 0; + pm->hlead = ch; + } + } + + /* combine into hangul */ + tmp = hangul_join(pm->hlead, pm->hvowel, pm->htail); + + if (tmp != 0xfffd) { + kbd_delchar(text, &editpos); + ch = tmp; + } + else { + pm->hvowel = pm->htail = 0; + pm->hlead = ch; + } + } + else { + pm->hangul = false; + } + /* insert char */ + kbd_inschar(text, buflen, &editpos, ch); + /* reset position */ + pm->x=0; + pm->y=0; + } + prev_button = ACTION_KBD_SCROLL_BACK; + break; +#endif /* KEEP_ROLLIN */ + case BUTTON_NONE: #ifdef KBD_MORSE_INPUT if (morse_reading) @@ -1175,6 +1290,7 @@ #endif /* KBD_MORSE_INPUT */ break; + default: if (default_event_handler(button) == SYS_USB_CONNECTED) { Index: apps/keymaps/keymap-e200.c =================================================================== --- apps/keymaps/keymap-e200.c (revision 23550) +++ apps/keymaps/keymap-e200.c (working copy) @@ -245,24 +245,24 @@ }; /* button_context_radio */ static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SCROLL_BACK, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_KBD_SCROLL_BACK, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SCROLL_FWD, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_KBD_SCROLL_FWD, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_PAGE_FLIP, BUTTON_REC|BUTTON_SELECT, BUTTON_REC }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN, BUTTON_NONE }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_KBD_BACKSPACE, BUTTON_SELECT, BUTTON_NONE }, { ACTION_KBD_DONE, BUTTON_UP, BUTTON_NONE }, { ACTION_KBD_ABORT, BUTTON_POWER, BUTTON_NONE }, Index: apps/keymaps/keymap-ipod.c =================================================================== --- apps/keymaps/keymap-ipod.c (revision 23550) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -156,17 +156,17 @@ }; /* button_context_pitchscreen */ static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_BACKSPACE, BUTTON_SELECT, BUTTON_NONE }, { ACTION_KBD_DONE, BUTTON_PLAY, BUTTON_NONE }, { ACTION_KBD_ABORT, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SCROLL_BACK, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_KBD_SCROLL_BACK, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SCROLL_FWD, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_KBD_SCROLL_FWD, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_MORSE_INPUT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, { ACTION_KBD_MORSE_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE }, LAST_ITEM_IN_LIST Index: apps/keymaps/keymap-fuze.c =================================================================== --- apps/keymaps/keymap-fuze.c (revision 23550) +++ apps/keymaps/keymap-fuze.c (working copy) @@ -246,24 +246,24 @@ }; /* button_context_radio */ static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_HOME|BUTTON_LEFT, BUTTON_NONE }, { ACTION_KBD_CURSOR_LEFT, BUTTON_HOME|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_CURSOR_RIGHT, BUTTON_HOME|BUTTON_RIGHT, BUTTON_NONE }, { ACTION_KBD_CURSOR_RIGHT, BUTTON_HOME|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SCROLL_BACK, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_KBD_SCROLL_BACK, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SCROLL_FWD, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_KBD_SCROLL_FWD, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_PAGE_FLIP, BUTTON_HOME|BUTTON_SELECT, BUTTON_HOME }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN, BUTTON_NONE }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_KBD_BACKSPACE, BUTTON_SELECT, BUTTON_NONE }, { ACTION_KBD_DONE, BUTTON_UP, BUTTON_NONE }, { ACTION_KBD_ABORT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE },