Index: apps/action.h =================================================================== --- apps/action.h (revision 24572) +++ apps/action.h (working copy) @@ -236,6 +236,8 @@ ACTION_KBD_DOWN, ACTION_KBD_MORSE_INPUT, ACTION_KBD_MORSE_SELECT, + ACTION_KBD_SCROLL_BACK, + ACTION_KBD_SCROLL_FWD, #ifdef HAVE_TOUCHSCREEN /* the following are helper actions for touchscreen targets, Index: apps/recorder/keyboard.c =================================================================== --- apps/recorder/keyboard.c (revision 24572) +++ apps/recorder/keyboard.c (working copy) @@ -90,6 +90,13 @@ #define KBD_TOGGLE_INPUT #endif +#ifdef HAVE_SCROLLWHEEL +#define KEEP_ROLLIN +#define KBD_CURSOR_KEYS +#undef KBD_MODES +#undef KBD_TOGGLE_INPUT +#endif + struct keyboard_parameters { unsigned short kbd_buf[KBD_BUF_SIZE]; @@ -133,6 +140,9 @@ unsigned char morse_code; int morse_tick; #endif +#ifdef KEEP_ROLLIN + int prev_button; +#endif }; static struct keyboard_parameters kbd_param[NB_SCREENS]; @@ -299,6 +309,9 @@ struct keyboard_parameters * const param = kbd_param; #endif struct edit_state state; +#ifdef KEEP_ROLLIN + state.prev_button = 0; +#endif int l; /* screen loop variable */ unsigned short ch; int ret = 0; /* assume success */ @@ -474,6 +487,27 @@ done = true; break; +#ifdef KEEP_ROLLIN + case ACTION_KBD_SCROLL_FWD: +#ifdef HAVE_MORSE_INPUT + if( state.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); + state.prev_button = ACTION_KBD_SCROLL_FWD; + break; +#endif + case ACTION_KBD_ABORT: ret = -1; done = true; @@ -618,7 +652,22 @@ } break; #endif /* HAVE_MORSE_INPUT */ - +#ifdef KEEP_ROLLIN + case ACTION_KBD_SCROLL_BACK: +#ifdef HAVE_MORSE_INPUT + if( state.morse_mode ) + break; +#endif + /* next line down, wrap to top */ + if ( state.prev_button != ACTION_KBD_SCROLL_FWD ) { + if (++pm->y >= pm->lines) + pm->y=0; + state.prev_button = ACTION_KBD_SCROLL_BACK; + break; + } + /* no break here because we insert the current */ + /* character if scrolling backwards after forwards */ +#endif case ACTION_KBD_SELECT: #ifdef HAVE_MORSE_INPUT if (state.morse_mode) @@ -706,6 +755,10 @@ if (global_settings.talk_menu) /* voice UI? */ talk_spell(state.text, false); /* speak revised text */ } +#ifdef KEEP_ROLLIN + if ( button != ACTION_KBD_SELECT ) + pm->x = pm->y = state.prev_button = 0; +#endif break; case ACTION_KBD_BACKSPACE: @@ -1053,10 +1106,15 @@ if (!pm->line_edit) #endif { + sc->set_drawmode(DRMODE_COMPLEMENT); +#ifdef KEEP_ROLLIN + if ( state->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 /* highlight the key that has focus */ - sc->set_drawmode(DRMODE_COMPLEMENT); - sc->fillrect(pm->font_w*pm->x, pm->font_h*pm->y, - pm->font_w, pm->font_h); + sc->fillrect(pm->font_w*pm->x, pm->font_h*pm->y, pm->font_w, pm->font_h); sc->set_drawmode(DRMODE_SOLID); } } Index: apps/keymaps/keymap-e200.c =================================================================== --- apps/keymaps/keymap-e200.c (revision 24572) +++ apps/keymaps/keymap-e200.c (working copy) @@ -245,20 +245,14 @@ }; /* 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_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_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_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 24572) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -156,19 +156,21 @@ }; /* 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_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_MORSE_SELECT, BUTTON_SELECT|BUTTON_REL, 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_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 24572) +++ apps/keymaps/keymap-fuze.c (working copy) @@ -246,20 +246,15 @@ }; /* 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 }, Index: uisimulator/sdl/button.c =================================================================== --- uisimulator/sdl/button.c (revision 24572) +++ uisimulator/sdl/button.c (working copy) @@ -52,6 +52,8 @@ #define USB_KEY SDLK_u #endif +int xy2button( int x, int y); + #if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES) int _remote_type=REMOTETYPE_H100_LCD; @@ -682,6 +684,7 @@ new_btn = BUTTON_SELECT; break; + #elif CONFIG_KEYPAD == SANSA_C200_PAD case SDLK_KP4: case SDLK_LEFT: @@ -1392,3 +1395,64 @@ #endif } +struct button_map { + int button, x, y; + char *description; +}; + +#ifdef SANSA_FUZE +struct button_map bm[] = { + { SDLK_KP8, 71, 256, "Scroll Back" }, + { SDLK_KP9, 141, 269, "Play" }, + { SDLK_KP_MULTIPLY, 229, 267, "Home" }, + { SDLK_LEFT, 76, 331, "Left" }, + { SDLK_SPACE, 139, 332, "Select" }, + { SDLK_RIGHT, 200, 334, "Right" }, + { SDLK_KP3, 139, 395, "Menu" }, + { SDLK_DOWN, 224, 388, "Scroll Fwd" }, + { SDLK_KP_MINUS, 273, 302, "Power" }, + { SDLK_h, 270, 359, "Hold" }, + { 0, 0, 0 , "None" } +}; +#elif defined (IPOD_VIDEO) +struct button_map bm[] = { + { SDLK_KP8, 121, 373, "Scroll Back" }, + { SDLK_KP_PERIOD, 177, 351, "Menu" }, + { SDLK_KP2, 227, 377, "Scroll Forward" }, + { SDLK_LEFT, 79, 461, "Left" }, + { SDLK_RIGHT, 268, 459, "Right" }, + { SDLK_KP_PLUS, 167, 519, "Play" }, + { SDLK_KP5, 173, 436, "Select" }, + { 0, 0, 0 , "None" } +}; +#elif defined (SANSA_E200V2) +struct button_map bm[] = { + { SDLK_KP7, 5, 89, "Record" }, + { SDLK_KP9, 130, 288, "Play" }, + { SDLK_KP4, 37, 378, "Left" }, + { SDLK_KP5, 131, 381, "Select" }, + { SDLK_KP6, 230, 380, "Right" }, + { SDLK_KP1, 45, 459, "Menu" }, + { SDLK_KP8, 88, 342, "Scroll Back" }, + { SDLK_KP2, 169, 344, "Scroll Fwd" }, + { SDLK_KP3, 130, 474, "Down" }, + { 0, 0, 0 , "None" } +}; +#else +struct button_map bm[] = { + { 0, 0, 0,} +}; +#endif +int xy2button( int x, int y) { + + int i; + + for ( i = 0; bm[i].button; i++ ) + /* check distance from center of button < 20 */ + if ( ( (x-bm[i].x)*(x-bm[i].x) ) + ( ( y-bm[i].y)*(y-bm[i].y) ) < 400 ) { + //printf("%s ",bm[i].description); + return bm[i].button; + } + return 0; +} + \ No newline at end of file Index: uisimulator/sdl/button-sdl.h =================================================================== --- uisimulator/sdl/button-sdl.h (revision 24572) +++ uisimulator/sdl/button-sdl.h (working copy) @@ -24,6 +24,7 @@ #define _BUTTON_SDL_H_ #include +#include "SDL.h" #include "config.h" #include "button-target.h" @@ -32,6 +33,9 @@ #undef button_init_device #define button_init_device() + + +int xy2button( int x, int y); bool button_hold(void); void button_init_sdl(void); #undef button_init_device Index: uisimulator/sdl/uisdl.c =================================================================== --- uisimulator/sdl/uisdl.c (revision 24572) +++ uisimulator/sdl/uisdl.c (working copy) @@ -43,7 +43,7 @@ /* extern functions */ extern void new_key(int key); - +extern int xy2button( int x, int y); void button_event(int key, bool pressed); SDL_Surface *gui_surface; @@ -66,6 +66,7 @@ { SDL_Event event; bool done = false; + int tmp; while(!done && SDL_WaitEvent(&event)) { @@ -83,11 +84,47 @@ 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; + case SDL_BUTTON_LEFT: + case SDL_BUTTON_MIDDLE: + //printf("Mouse at: %d, %d\n", event.button.x, event.button.y); + tmp = xy2button( event.button.x, event.button.y ); + if( tmp ) + button_event( tmp, true ); + break; + default: + break; + } + if (debug_wps && event.button.button == 1) { printf("Mouse at: (%d, %d)\n", event.button.x, event.button.y); } break; + case SDL_MOUSEBUTTONUP: + switch ( event.button.button ) { + case SDL_BUTTON_WHEELUP: + button_event( SDLK_UP, false ); + break; + case SDL_BUTTON_WHEELDOWN: + button_event( SDLK_DOWN, false ); + break; + case SDL_BUTTON_LEFT: + case SDL_BUTTON_MIDDLE: + if( tmp ) + button_event( tmp, false ); + break; + default: + break; + } + break; + #else case SDL_MOUSEBUTTONUP: sim_enter_irq_handler();