Index: apps/recorder/keyboard.c =================================================================== --- apps/recorder/keyboard.c (revision 24572) +++ apps/recorder/keyboard.c (working copy) @@ -90,10 +90,19 @@ #define KBD_TOGGLE_INPUT #endif +#ifdef HAVE_SCROLLWHEEL +#define SCROLL_1D +#define ACCEL_SKIP 3 +#define KBD_CURSOR_KEYS +#undef KBD_MODES +#undef KBD_TOGGLE_INPUT +#endif + struct keyboard_parameters { unsigned short kbd_buf[KBD_BUF_SIZE]; int default_lines; + int default_width; int nchars; int font_w; int font_h; @@ -133,6 +142,10 @@ unsigned char morse_code; int morse_tick; #endif +#ifdef SCROLL_1D + bool accel; + int prev_button; +#endif }; static struct keyboard_parameters kbd_param[NB_SCREENS]; @@ -156,6 +169,8 @@ int fd, l; int i = 0; unsigned char buf[4]; + int line_pos = 0; + int longest_line = 0; if (filename == NULL) { @@ -196,6 +211,15 @@ FOR_NB_SCREENS(l) kbd_param[l].kbd_buf[i] = ch; i++; + if ( ch == (unsigned short) '\n' ) + { + if ( line_pos > longest_line ) + longest_line = line_pos; + line_pos = 0; + } + else + line_pos++; + } } @@ -206,6 +230,7 @@ { struct keyboard_parameters *pm = &kbd_param[l]; pm->nchars = i; + pm->default_width = longest_line; /* initialize parameters */ pm->x = pm->y = pm->page = 0; pm->default_lines = 0; @@ -299,6 +324,8 @@ struct keyboard_parameters * const param = kbd_param; #endif struct edit_state state; + state.accel = true; + state.prev_button = BUTTON_NONE; int l; /* screen loop variable */ unsigned short ch; int ret = 0; /* assume success */ @@ -352,6 +379,7 @@ "òóôõöø çðþýÿ ùúûü ¼½¾¬¶¨:;"; pm->default_lines = 8; + pm->default_width = 27; } else #endif /* LCD_WIDTH >= 160 && LCD_HEIGHT >= 96 */ @@ -372,8 +400,8 @@ "òóôõöø çðþýÿ ùúûü"; pm->default_lines = 4; + pm->default_width = 19; } - while (*p) p = utf8decode(p, &pm->kbd_buf[i++]); @@ -507,13 +535,26 @@ #endif /* HAVE_MORSE_INPUT && KBD_TOGGLE_INPUT */ case ACTION_KBD_RIGHT: - if (++pm->x >= pm->max_chars) +#ifdef SCROLL_1D + if ( state.prev_button == ACTION_KBD_LEFT ) + state.accel = false; + state.prev_button = ACTION_KBD_RIGHT; + if ( state.accel ) + pm->x += ACCEL_SKIP; + else +#endif + pm->x++; + 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 +#ifdef SCROLL_1D + if (++pm->y >= pm->lines) /* wrap */ + pm->y = 0; +#endif pm->x = 0; } @@ -522,7 +563,17 @@ break; case ACTION_KBD_LEFT: - if (--pm->x < 0) +#ifdef SCROLL_1D + + if ( state.prev_button == ACTION_KBD_RIGHT ) + state.accel = false; + state.prev_button = ACTION_KBD_LEFT; + if ( state.accel ) + pm->x -= ACCEL_SKIP; + else +#endif + pm->x--; + if (pm->x < 0) { #ifndef KBD_PAGE_FLIP /* no dedicated flip key - flip page on wrap */ @@ -530,6 +581,10 @@ pm->page = pm->pages - 1; #endif pm->x = pm->max_chars - 1; +#ifdef SCROLL_1D + if (--pm->y < 0 ) /* wrap */ + pm->y = pm->lines-1; +#endif } ch = get_kbd_ch(pm); @@ -620,6 +675,10 @@ #endif /* HAVE_MORSE_INPUT */ case ACTION_KBD_SELECT: +#ifdef SCROLL_1D + state.accel = true; + state.prev_button = ACTION_KBD_SELECT; +#endif #ifdef HAVE_MORSE_INPUT if (state.morse_mode) { @@ -709,6 +768,10 @@ break; case ACTION_KBD_BACKSPACE: +#ifdef SCROLL_1D + state.accel = true; + state.prev_button = ACTION_KBD_BACKSPACE; +#endif if (state.hangul) { if (state.htail) @@ -735,6 +798,10 @@ break; case ACTION_KBD_CURSOR_RIGHT: +#ifdef SCROLL_1D + state.accel = true; + state.prev_button = ACTION_KBD_CURSOR_RIGHT; +#endif state.hangul = false; if (state.editpos < state.len_utf8) @@ -749,6 +816,10 @@ break; case ACTION_KBD_CURSOR_LEFT: +#ifdef SCROLL_1D + state.accel = true; + state.prev_button = ACTION_KBD_CURSOR_LEFT; +#endif state.hangul = false; if (state.editpos > 0) @@ -881,6 +952,14 @@ icon_w = get_icon_width(sc->screen_type); sc_w = sc->getwidth(); pm->max_chars = sc_w / pm->font_w; + +#ifdef SCROLL_1D + /* trim off whitespace */ + //printf("pm->max_chars %d\npm->default_with %d\n",pm->max_chars, pm->default_width); + if ( pm->max_chars > pm->default_width ) + pm->max_chars = pm->default_width; +#endif + pm->max_chars_text = (sc_w - icon_w * 2 - 2) / pm->text_w; if (pm->max_chars_text < 3 && icon_w > pm->text_w) pm->max_chars_text = sc_w / pm->text_w - 2; 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_LEFT, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_KBD_RIGHT, 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,23 @@ }; /* 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_LEFT, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_KBD_RIGHT, 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,21 +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_PAGE_FLIP, BUTTON_HOME|BUTTON_SELECT, BUTTON_HOME }, + { ACTION_KBD_LEFT, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN, BUTTON_NONE }, { ACTION_KBD_BACKSPACE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, @@ -268,6 +262,7 @@ { 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/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();