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,9 +90,16 @@ #define KBD_MORSE_INPUT #endif +#ifdef HAVE_SCROLLWHEEL +#define KEEP_ROLLIN +#endif + struct keyboard_parameters { const unsigned char* default_kbd; +#ifdef KEEP_ROLLIN + int DEFAULT_WIDTH; +#endif int DEFAULT_LINES; unsigned short kbd_buf[KBD_BUF_SIZE]; int nchars; @@ -292,6 +299,10 @@ int kbd_input(char* text, int buflen) { +#ifdef KEEP_ROLLIN + int prev_button = 0; + char wheel_divider = 0; +#endif bool done = false; #ifdef CPU_ARM /* This seems to keep the sizes for ARM way down */ @@ -315,6 +326,17 @@ FOR_NB_SCREENS(l) { struct keyboard_parameters *pm = ¶m[l]; +#ifdef KEEP_ROLLIN + pm->default_kbd = + " \n" + " abcdefghijklm .,!?'\";:\n" + " nopqrstuvwxyz @#%|~ \n" + " ABCDEFGHIJKLM +-×÷= \n" + " NOPQRSTUVWXYZ $¢£¤¥ \n" + " 0123456789 ()[]{}<>/\\"; + pm->DEFAULT_LINES = 6; + pm->DEFAULT_WIDTH = 24; +#else #if LCD_WIDTH >= 160 && LCD_HEIGHT >= 96 struct screen *sc = &screens[l]; @@ -353,6 +375,7 @@ pm->DEFAULT_LINES = 4; } +#endif /* KEEP_ROLLIN */ } char outline[256]; @@ -430,6 +453,11 @@ int i = 0; pm->max_chars = sc->getwidth() / pm->font_w; +#ifdef KEEP_ROLLIN + /* trim width to what's used */ + if (pm->max_chars > pm->DEFAULT_WIDTH ) + pm->max_chars = pm->DEFAULT_WIDTH; +#endif /* KEEP_ROLLIN */ /* Pad lines with spaces */ while (i < pm->nchars) @@ -755,7 +783,13 @@ #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 ) + sc->fillrect(0, statusbar_size+pm->font_h*pm->y, + pm->font_w*pm->max_chars, pm->font_h); + else +#endif + sc->fillrect(pm->font_w*pm->x, statusbar_size + pm->font_h*pm->y, pm->font_w, pm->font_h); sc->set_drawmode(DRMODE_SOLID); @@ -949,6 +983,8 @@ } break; + + case ACTION_KBD_DONE: /* accepts what was entered and continues */ ret = 0; @@ -1144,6 +1180,102 @@ #endif break; +#ifdef KEEP_ROLLIN + case ACTION_KBD_SCROLL_FWD: + if ( wheel_divider++ & 1 ) + break; + /* 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 ( wheel_divider++ & 1 ) + break; + 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 +1307,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 },