Index: apps/action.h =================================================================== --- apps/action.h (revision 23621) +++ apps/action.h (working copy) @@ -235,6 +235,9 @@ ACTION_KBD_DOWN, ACTION_KBD_MORSE_INPUT, ACTION_KBD_MORSE_SELECT, + ACTION_KBD_SCROLL_FWD, + ACTION_KBD_SCROLL_BACK, + ACTION_KBD_HOME, #ifdef HAVE_TOUCHSCREEN /* the following are helper actions for touchscreen targets, Index: apps/recorder/keyboard.c =================================================================== --- apps/recorder/keyboard.c (revision 23621) +++ apps/recorder/keyboard.c (working copy) @@ -92,6 +92,10 @@ #define KBD_TOGGLE_INPUT #endif +#ifdef HAVE_SCROLLWHEEL +#define KEEP_ROLLIN +#endif + struct keyboard_parameters { const unsigned char* default_kbd; @@ -272,6 +276,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 */ @@ -295,6 +302,9 @@ FOR_NB_SCREENS(l) { struct keyboard_parameters *pm = ¶m[l]; +#ifdef KEEP_ROLLIN + pm->x = pm->y = 0; /* needs to start top left */ +#endif #if LCD_WIDTH >= 160 && LCD_HEIGHT >= 96 struct screen *sc = &screens[l]; @@ -723,12 +733,21 @@ sc->fillrect(0, pm->main_y - pm->keyboard_margin + 2, sc->getwidth(), pm->font_h + 2); else /* highlight the key that has focus */ -#endif +#endif #ifdef HAVE_MORSE_INPUT if(!morse_mode) #endif - sc->fillrect(pm->font_w*pm->x, pm->font_h*pm->y, + { +#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), + pm->font_h*(pm->y+1)); + else +#endif + sc->fillrect(pm->font_w*pm->x, pm->font_h*pm->y, pm->font_w, pm->font_h); + } sc->set_drawmode(DRMODE_SOLID); } @@ -773,6 +792,107 @@ done = true; break; +#ifdef KEEP_ROLLIN + case ACTION_KBD_SCROLL_FWD: +#ifdef HAVE_MORSE_INPUT + if( morse_mode ) + break; +#endif + /* 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: +#ifdef HAVE_MORSE_INPUT + if( morse_mode ) + break; +#endif + 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 ACTION_KBD_ABORT: ret = -1; done = true; @@ -1006,6 +1126,9 @@ if (global_settings.talk_menu) /* voice UI? */ talk_spell(text, false); /* speak revised text */ +#ifdef KEEP_ROLLIN + pm->x = pm->y = prev_button = 0; +#endif } break; Index: apps/keymaps/keymap-e200.c =================================================================== --- apps/keymaps/keymap-e200.c (revision 23621) +++ apps/keymaps/keymap-e200.c (working copy) @@ -245,20 +245,16 @@ }; /* 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_BUTTON_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_BUTTON_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 }, Index: apps/keymaps/keymap-ipod.c =================================================================== --- apps/keymaps/keymap-ipod.c (revision 23621) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -156,18 +156,19 @@ }; /* 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_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_SELECT, 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_MORSE_INPUT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, + { ACTION_KBD_DONE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE }, + { ACTION_KBD_ABORT, BUTTON_PLAY|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_BACKSPACE, BUTTON_MENU, BUTTON_NONE }, + { ACTION_KBD_BACKSPACE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_MORSE_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE }, LAST_ITEM_IN_LIST }; /* button_context_keyboard */ Index: apps/keymaps/keymap-fuze.c =================================================================== --- apps/keymaps/keymap-fuze.c (revision 23621) +++ apps/keymaps/keymap-fuze.c (working copy) @@ -246,20 +246,16 @@ }; /* 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_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_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_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 }, @@ -267,7 +263,6 @@ { ACTION_KBD_DONE, BUTTON_UP, BUTTON_NONE }, { ACTION_KBD_ABORT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_MORSE_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE }, - LAST_ITEM_IN_LIST }; /* button_context_keyboard */ Index: uisimulator/sdl/uisdl.c =================================================================== --- uisimulator/sdl/uisdl.c (revision 23621) +++ uisimulator/sdl/uisdl.c (working copy) @@ -83,6 +83,17 @@ break; #ifndef HAVE_TOUCHSCREEN case SDL_MOUSEBUTTONDOWN: + switch ( event.button.button ) { + case SDL_BUTTON_WHEELUP: + button_event( SDLK_UP, true ); + break; + case SDL_BUTTON_WHEELDOWN: + button_event( SDLK_DOWN, true ); + break; + default: + break; + } + if (debug_wps && event.button.button == 1) { printf("Mouse at: (%d, %d)\n", event.button.x, event.button.y);