Index: apps/screen_access.c =================================================================== --- apps/screen_access.c.orig +++ apps/screen_access.c @@ -45,7 +45,8 @@ void screen_init(struct screen * screen, screen->height=LCD_REMOTE_HEIGHT; screen->setmargins=&lcd_remote_setmargins; screen->getymargin=&lcd_remote_getymargin; - screen->getxmargin=&lcd_remote_getxmargin; + screen->getleftmargin=&lcd_remote_getleftmargin; + screen->getrightmargin=&lcd_remote_getrightmargin; screen->getstringsize=&lcd_remote_getstringsize; #if 1 /* all remote LCDs are bitmapped so far */ screen->setfont=&lcd_remote_setfont; @@ -122,7 +123,8 @@ void screen_init(struct screen * screen, screen->height=LCD_HEIGHT; screen->setmargins=&lcd_setmargins; screen->getymargin=&lcd_getymargin; - screen->getxmargin=&lcd_getxmargin; + screen->getleftmargin=&lcd_getleftmargin; + screen->getrightmargin=&lcd_getrightmargin; screen->getstringsize=&lcd_getstringsize; #ifdef HAVE_LCD_BITMAP screen->setfont=&lcd_setfont; Index: apps/playlist.c =================================================================== --- apps/playlist.c.orig +++ apps/playlist.c @@ -480,9 +480,9 @@ static int add_indices_to_playlist(struc #ifdef HAVE_LCD_BITMAP if(global_settings.statusbar) - lcd_setmargins(0, STATUSBAR_HEIGHT); + lcd_setmargins(0, LCD_WIDTH, STATUSBAR_HEIGHT); else - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); #endif gui_syncsplash(0, str(LANG_PLAYLIST_LOAD)); @@ -1662,9 +1662,9 @@ static void display_playlist_count(int c #ifdef HAVE_LCD_BITMAP if(global_settings.statusbar) - lcd_setmargins(0, STATUSBAR_HEIGHT); + lcd_setmargins(0, LCD_WIDTH, STATUSBAR_HEIGHT); else - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); #endif gui_syncsplash(0, fmt, count, Index: apps/screens.c =================================================================== --- apps/screens.c.orig +++ apps/screens.c @@ -647,7 +647,7 @@ bool quick_screen_quick(int button_enter struct option_select left_option; struct option_select bottom_option; struct option_select right_option; - int oldrepeat, old_x_margin, old_y_margin; + int oldrepeat, old_left_margin, old_right_margin, old_y_margin; static const struct opt_items left_items[] = { [0]={ STR(LANG_SYSFONT_OFF) }, @@ -670,9 +670,10 @@ bool quick_screen_quick(int button_enter }; struct gui_quickscreen qs; - old_x_margin = lcd_getxmargin(); + old_left_margin = lcd_getleftmargin(); + old_right_margin = lcd_getrightmargin(); old_y_margin = lcd_getymargin(); - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); option_select_init_items(&left_option, (char *)str(LANG_SYSFONT_SHUFFLE), @@ -713,7 +714,7 @@ bool quick_screen_quick(int button_enter } settings_save(); } - lcd_setmargins(old_x_margin, old_y_margin); + lcd_setmargins(old_left_margin, old_right_margin, old_y_margin); return(res); } @@ -736,7 +737,7 @@ bool quick_screen_f3(int button_enter) struct option_select left_option; struct option_select bottom_option; struct option_select right_option; - int old_x_margin, old_y_margin; + int old_left_margin, old_right_margin, old_y_margin; static const struct opt_items onoff_items[] = { [0]={ STR(LANG_SYSFONT_OFF) }, @@ -749,9 +750,10 @@ bool quick_screen_f3(int button_enter) struct gui_quickscreen qs; - old_x_margin = lcd_getxmargin(); + old_left_margin = lcd_getrightmargin(); + old_right_margin = lcd_getleftmargin(); old_y_margin = lcd_getymargin(); - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); option_select_init_items(&left_option, str(LANG_SYSFONT_SCROLL_BAR), @@ -773,7 +775,7 @@ bool quick_screen_f3(int button_enter) res=gui_syncquickscreen_run(&qs, button_enter); if(!res) settings_save(); - lcd_setmargins(old_x_margin, old_y_margin); + lcd_setmargins(old_left_margin, old_right_margin, old_y_margin); return(res); } #endif /* BUTTON_F3 */ @@ -880,9 +882,9 @@ bool set_time_screen(const char* string, #ifdef HAVE_LCD_BITMAP if(global_settings.statusbar) - lcd_setmargins(0, STATUSBAR_HEIGHT); + lcd_setmargins(0, LCD_WIDTH, STATUSBAR_HEIGHT); else - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); #endif lcd_clear_display(); lcd_puts_scroll(0, 0, string); Index: apps/screen_access.h =================================================================== --- apps/screen_access.h.orig +++ apps/screen_access.h @@ -65,8 +65,9 @@ struct screen #ifdef HAS_BUTTONBAR bool has_buttonbar; #endif - void (*setmargins)(int x, int y); - int (*getxmargin)(void); + void (*setmargins)(int x1, int x2, int y); + int (*getleftmargin)(void); + int (*getrightmargin)(void); int (*getymargin)(void); int (*getstringsize)(const unsigned char *str, int *w, int *h); @@ -157,10 +158,10 @@ extern void screen_init(struct screen * /* * Sets the x margin in pixels for the given screen * - screen : the screen structure - * - xmargin : the number of pixels to the left of the screen + * - leftmargin : the number of pixels to the left of the screen */ #define screen_set_xmargin(screen, xmargin) \ - (screen)->setmargins(xmargin, (screen)->getymargin()); + (screen)->setmargins(xmargin, (screen)->width, (screen)->getymargin()); /* * Sets the y margin in pixels for the given screen @@ -168,7 +169,7 @@ extern void screen_init(struct screen * * - xmargin : the number of pixels to the top of the screen */ #define screen_set_ymargin(screen, ymargin) \ - (screen)->setmargins((screen)->getxmargin(), ymargin); + (screen)->setmargins((screen)->getleftmargin(), (screen)->width, ymargin); #if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) /* Index: apps/recorder/recording.c =================================================================== --- apps/recorder/recording.c.orig +++ apps/recorder/recording.c @@ -808,7 +808,7 @@ bool recording_screen(bool no_source) { screens[i].setfont(FONT_SYSFIXED); screens[i].getstringsize("M", &w, &h); - screens[i].setmargins(global_settings.invert_cursor ? 0 : w, 8); + screens[i].setmargins(global_settings.invert_cursor ? 0 : w, screens[i].width, 8); filename_offset[i] = ((screens[i].height >= 80) ? 1 : 0); pm_y[i] = 8 + h * (2 + filename_offset[i]); } @@ -1209,7 +1209,7 @@ bool recording_screen(bool no_source) { screens[i].setfont(FONT_SYSFIXED); screens[i].setmargins( - global_settings.invert_cursor ? 0 : w, 8); + global_settings.invert_cursor ? 0 : w, screens[i].width, 8); } } } Index: apps/plugins/solitaire.c =================================================================== --- apps/plugins/solitaire.c.orig +++ apps/plugins/solitaire.c @@ -649,7 +649,7 @@ int solitaire_menu(bool in_game) break; case 3: - rb->lcd_setmargins(0, 0); + rb->lcd_setmargins(0, LCD_WIDTH, 0); if (solitaire_help() == HELP_USB) result = MENU_USB; break; @@ -664,7 +664,7 @@ int solitaire_menu(bool in_game) } } menu_exit(m); - rb->lcd_setmargins(0, 0); + rb->lcd_setmargins(0, LCD_WIDTH, 0); return result; } Index: apps/plugins/viewer.c =================================================================== --- apps/plugins/viewer.c.orig +++ apps/plugins/viewer.c @@ -1290,7 +1290,7 @@ static bool viewer_options_menu(void) result = menu_run(m); menu_exit(m); #ifdef HAVE_LCD_BITMAP - rb->lcd_setmargins(0,0); + rb->lcd_setmargins(0,LCD_WIDTH,0); /* Show-scrollbar mode for current view-width mode */ if (!ONE_SCREEN_FITS_ALL()) @@ -1332,7 +1332,7 @@ static void viewer_menu(void) } menu_exit(m); #ifdef HAVE_LCD_BITMAP - rb->lcd_setmargins(0,0); + rb->lcd_setmargins(0,LCD_WIDTH,0); #endif viewer_draw(col); } Index: apps/gui/gwps-common.c =================================================================== --- apps/gui/gwps-common.c.orig +++ apps/gui/gwps-common.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "system.h" #include "settings.h" #include "rbunicode.h" @@ -1316,6 +1317,14 @@ static char *get_token_value(struct gui_ return NULL; #endif + case WPS_TOKEN_ALIGN_SCROLLMARGIN_LEFT: + gwps->display->setmargins( token->value.i, gwps->display->getrightmargin(), gwps->display->getymargin() ); + return NULL; + + case WPS_TOKEN_ALIGN_SCROLLMARGIN_RIGHT: + gwps->display->setmargins( gwps->display->getleftmargin(), token->value.i, gwps->display->getymargin() ); + return NULL; + default: return NULL; } @@ -1642,6 +1651,7 @@ static void write_line(struct screen *di int ypos; int space_width; int string_height; + const int scroll_width = display->getrightmargin()-display->getleftmargin(); /* calculate different string sizes and positions */ display->getstringsize((unsigned char *)" ", &space_width, &string_height); @@ -1652,7 +1662,7 @@ static void write_line(struct screen *di else { left_width = 0; } - left_xpos = 0; + left_xpos = display->getleftmargin(); if (format_align->center != 0) { display->getstringsize((unsigned char *)format_align->center, @@ -1661,7 +1671,7 @@ static void write_line(struct screen *di else { center_width = 0; } - center_xpos=(display->width - center_width) / 2; + center_xpos=(display->getrightmargin() + display->getleftmargin() - center_width)/2; if (format_align->right != 0) { display->getstringsize((unsigned char *)format_align->right, @@ -1670,7 +1680,7 @@ static void write_line(struct screen *di else { right_width = 0; } - right_xpos = (display->width - right_width); + right_xpos = (display->getrightmargin() - right_width); /* Checks for overlapping strings. If needed the overlapping strings will be merged, separated by a @@ -1685,7 +1695,7 @@ static void write_line(struct screen *di *(--format_align->center) = ' '; /* calculate the new width and position of the merged string */ left_width = left_width + space_width + center_width; - left_xpos = 0; + /* left_xpos unchanged */ /* there is no centered string anymore */ center_width = 0; } @@ -1696,7 +1706,7 @@ static void write_line(struct screen *di format_align->left = format_align->center; /* calculate the new width and position of the string */ left_width = center_width; - left_xpos = 0; + /* left_xpos unchanged */ /* there is no centered string anymore */ center_width = 0; } @@ -1712,7 +1722,7 @@ static void write_line(struct screen *di format_align->right = format_align->center; /* calculate the new width and position of the merged string */ right_width = center_width + space_width + right_width; - right_xpos = (display->width - right_width); + right_xpos = (display->getrightmargin() - right_width); /* there is no centered string anymore */ center_width = 0; } @@ -1723,7 +1733,7 @@ static void write_line(struct screen *di format_align->right = format_align->center; /* calculate the new width and position of the string */ right_width = center_width; - right_xpos = (display->width - right_width); + right_xpos = (display->getrightmargin() - right_width); /* there is no centered string anymore */ center_width = 0; } @@ -1739,7 +1749,7 @@ static void write_line(struct screen *di *(--format_align->right) = ' '; /* calculate the new width and position of the string */ left_width = left_width + space_width + right_width; - left_xpos = 0; + /* left_xpos unchanged */ /* there is no right string anymore */ right_width = 0; } @@ -1750,7 +1760,7 @@ static void write_line(struct screen *di format_align->left = format_align->right; /* calculate the new width and position of the string */ left_width = right_width; - left_xpos = 0; + /* left_xpos unchanged */ /* there is no right string anymore */ right_width = 0; } @@ -1758,7 +1768,7 @@ static void write_line(struct screen *di ypos = (line * string_height) + display->getymargin(); - if (scroll && left_width > display->width) + if (scroll && ( left_width > scroll_width || center_width > scroll_width || right_width > scroll_width ) ) { display->puts_scroll(0, line, (unsigned char *)format_align->left); Index: apps/gui/list.c =================================================================== --- apps/gui/list.c.orig +++ apps/gui/list.c @@ -143,7 +143,7 @@ static void gui_list_flash(struct gui_li int line_ypos=display->getymargin()+display->char_height*selected_line; if (global_settings.invert_cursor) { - int line_xpos=display->getxmargin(); + int line_xpos=display->getleftmargin(); display->set_drawmode(DRMODE_COMPLEMENT); display->fillrect(line_xpos, line_ypos, display->width, display->char_height); @@ -215,7 +215,7 @@ static void gui_list_draw_smart(struct g static int last_lines[NB_SCREENS] = {0}; #ifdef HAVE_LCD_BITMAP int item_offset; - int old_margin = display->getxmargin(); + int old_margin = display->getleftmargin(); #endif int start, end; bool partial_draw = false; Index: apps/gui/gwps.c =================================================================== --- apps/gui/gwps.c.orig +++ apps/gui/gwps.c @@ -84,11 +84,10 @@ static void gui_wps_set_margin(struct gu { int offset = 0; struct wps_data *data = gwps->data; - if(data->wps_sb_tag && data->show_sb_on_wps) + if((data->wps_sb_tag && data->show_sb_on_wps) || + (global_settings.statusbar && !data->wps_sb_tag)) offset = STATUSBAR_HEIGHT; - else if ( global_settings.statusbar && !data->wps_sb_tag) - offset = STATUSBAR_HEIGHT; - gwps->display->setmargins(0, offset); + gwps->display->setmargins(0, gwps->display->width, offset); } #endif Index: apps/gui/gwps.h =================================================================== --- apps/gui/gwps.h.orig +++ apps/gui/gwps.h @@ -107,6 +107,8 @@ enum wps_token_type { WPS_TOKEN_ALIGN_LEFT, WPS_TOKEN_ALIGN_CENTER, WPS_TOKEN_ALIGN_RIGHT, + WPS_TOKEN_ALIGN_SCROLLMARGIN_LEFT, + WPS_TOKEN_ALIGN_SCROLLMARGIN_RIGHT, /* Sublines */ WPS_TOKEN_SUBLINE_TIMEOUT, Index: apps/gui/wps_parser.c =================================================================== --- apps/gui/wps_parser.c.orig +++ apps/gui/wps_parser.c @@ -113,6 +113,8 @@ static int parse_progressbar(const char struct wps_token *token, struct wps_data *wps_data); static int parse_dir_level(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); +static int parse_scrollmargins(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data); #ifdef HAVE_LCD_BITMAP static int parse_image_special(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); @@ -282,6 +284,7 @@ static const struct wps_tag all_tags[] = #if (LCD_DEPTH > 1) || (defined(HAVE_LCD_REMOTE) && (LCD_REMOTE_DEPTH > 1)) { WPS_TOKEN_IMAGE_BACKDROP, "X", 0, parse_image_special }, #endif + { WPS_NO_TOKEN, "m", 0, parse_scrollmargins }, #endif { WPS_TOKEN_UNKNOWN, "", 0, NULL } @@ -602,6 +605,33 @@ static int parse_progressbar(const char #endif } +static int parse_scrollmargins(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data) +{ + /* valid tag looks like %m|12|34| */ + if(*wps_bufptr == '|') + { + const char * _pleft = wps_bufptr + 1; + const char * _pright = NULL, * _pend = NULL; + if( isdigit(*_pleft) && ( _pright = strchr( _pleft, '|' ) ) ) + { + _pright++; + if( isdigit(*_pright) && ( _pend = strchr( _pright, '|' ) ) ) + { + wps_data->num_tokens += 2; + token->type = WPS_TOKEN_ALIGN_SCROLLMARGIN_LEFT; + token->value.i = atoi(_pleft); + token++; + token->type = WPS_TOKEN_ALIGN_SCROLLMARGIN_RIGHT; + token->value.i = atoi(_pright); + + return( _pend - wps_bufptr + 1 ); + } + } + } + + return(0); +} + /* Parse a generic token from the given string. Return the length read */ static int parse_token(const char *wps_bufptr, struct wps_data *wps_data) { Index: apps/menus/recording_menu.c =================================================================== --- apps/menus/recording_menu.c.orig +++ apps/menus/recording_menu.c @@ -432,7 +432,7 @@ bool rectrigger(void) int exit_request = false; enum trigger_menu_option selected = TRIGGER_MODE; bool retval = false; - int old_x_margin[NB_SCREENS]; + int old_left_margin[NB_SCREENS], old_right_margin[NB_SCREENS]; int old_y_margin[NB_SCREENS]; #define TRIGGER_MODE_COUNT 3 @@ -504,12 +504,13 @@ bool rectrigger(void) { screens[i].clear_display(); - old_x_margin[i] = screens[i].getxmargin(); + old_left_margin[i] = screens[i].getleftmargin(); + old_right_margin[i] = screens[i].getrightmargin(); old_y_margin[i] = screens[i].getymargin(); if(global_settings.statusbar) - screens[i].setmargins(0, STATUSBAR_HEIGHT); + screens[i].setmargins(0, screens[i].width, STATUSBAR_HEIGHT); else - screens[i].setmargins(0, 0); + screens[i].setmargins(0, screens[i].width, 0); screens[i].getstringsize("M", &w, &h); @@ -790,7 +791,7 @@ bool rectrigger(void) FOR_NB_SCREENS(i) { screens[i].setfont(FONT_UI); - screens[i].setmargins(old_x_margin[i], old_y_margin[i]); + screens[i].setmargins(old_left_margin[i], old_right_margin[i], old_y_margin[i]); } action_signalscreenchange(); return retval; Index: apps/menus/main_menu.c =================================================================== --- apps/menus/main_menu.c.orig +++ apps/menus/main_menu.c @@ -161,7 +161,7 @@ static bool show_info(void) }; #if defined(HAVE_LCD_BITMAP) FOR_NB_SCREENS(i) - screens[i].setmargins(0, 0); + screens[i].setmargins(0, screens[i].width, 0); #endif while (!done) { Index: apps/alarm_menu.c =================================================================== --- apps/alarm_menu.c.orig +++ apps/alarm_menu.c @@ -70,7 +70,7 @@ bool alarm_screen(void) { FOR_NB_SCREENS(i) { - screens[i].setmargins(0, 0); + screens[i].setmargins(0, screens[i].width, 0); gui_textarea_clear(&screens[i]); screens[i].puts(0, 3, str(LANG_ALARM_MOD_KEYS)); } Index: apps/plugin.c =================================================================== --- apps/plugin.c.orig +++ apps/plugin.c @@ -594,9 +594,9 @@ int plugin_load(const char* plugin, void plugin_loaded = true; - xm = lcd_getxmargin(); - ym = lcd_getymargin(); - lcd_setmargins(0,0); + xm = lcd_getleftmargin(); + ym = lcd_getrightmargin(); + lcd_setmargins(0,LCD_WIDTH,0); #if defined HAVE_LCD_BITMAP && LCD_DEPTH > 1 old_backdrop = lcd_get_backdrop(); @@ -605,9 +605,9 @@ int plugin_load(const char* plugin, void lcd_update(); #ifdef HAVE_REMOTE_LCD - rxm = lcd_remote_getxmargin(); + rxm = lcd_remote_getleftmargin(); rym = lcd_remote_getymargin(); - lcd_remote_setmargins(0, 0); + lcd_remote_setmargins(0, LCD_REMOTE_WIDTH, 0); lcd_remote_clear_display(); lcd_remote_update(); #endif @@ -635,7 +635,7 @@ int plugin_load(const char* plugin, void #endif /* HAVE_LCD_BITMAP */ /* restore margins */ - lcd_setmargins(xm,ym); + lcd_setmargins(xm, LCD_WIDTH, ym); lcd_clear_display(); lcd_update(); @@ -646,7 +646,7 @@ int plugin_load(const char* plugin, void #else lcd_remote_set_drawmode(DRMODE_SOLID); #endif - lcd_remote_setmargins(rxm, rym); + lcd_remote_setmargins(rxm, LCD_REMOTE_WIDTH, rym); lcd_remote_clear_display(); lcd_remote_update(); #endif Index: apps/plugin.h =================================================================== --- apps/plugin.h.orig +++ apps/plugin.h @@ -141,7 +141,7 @@ struct plugin_api { void (*lcd_set_contrast)(int x); void (*lcd_update)(void); void (*lcd_clear_display)(void); - void (*lcd_setmargins)(int x, int y); + void (*lcd_setmargins)(int leftmargin, int rightmargin, int ymargin); int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h); void (*lcd_putsxy)(int x, int y, const unsigned char *string); void (*lcd_puts)(int x, int y, const unsigned char *string); Index: apps/logfdisp.c =================================================================== --- apps/logfdisp.c.orig +++ apps/logfdisp.c @@ -64,7 +64,7 @@ bool logfdisplay(void) if(!lines) return false; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_clear_display(); do { Index: apps/debug_menu.c =================================================================== --- apps/debug_menu.c.orig +++ apps/debug_menu.c @@ -206,7 +206,7 @@ static bool dbg_audio_thread(void) char buf[32]; struct audio_debug d; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); while(1) @@ -278,7 +278,7 @@ static bool dbg_audio_thread(void) tick_add_task(dbg_audio_task); - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); while(!done) { @@ -435,7 +435,7 @@ static bool dbg_hw_info(void) system_memory_guard(oldmode); /* re-enable memory guard */ - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); lcd_clear_display(); @@ -489,7 +489,7 @@ static bool dbg_hw_info(void) system_memory_guard(oldmode); /* re-enable memory guard */ - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); lcd_clear_display(); @@ -542,7 +542,7 @@ static bool dbg_hw_info(void) (PP_VER1 >> 24) & 0xff, (PP_VER1 >> 16) & 0xff, (PP_VER1 >> 8) & 0xff, (PP_VER1) & 0xff, '\0' }; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); lcd_clear_display(); @@ -695,7 +695,7 @@ static bool dbg_spdif(void) int spdif_source = spdif_get_output_source(&spdif_src_on); spdif_set_output_source(AUDIO_SRC_SPDIF IF_SPDIF_POWER_(, true)); - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_clear_display(); lcd_setfont(FONT_SYSFIXED); @@ -898,7 +898,7 @@ bool dbg_ports(void) int adc_battery_voltage, adc_battery_level; lcd_setfont(FONT_SYSFIXED); - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_clear_display(); while(1) @@ -945,7 +945,7 @@ bool dbg_ports(void) char buf[128]; int line; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH ,0); lcd_clear_display(); lcd_setfont(FONT_SYSFIXED); @@ -1029,7 +1029,7 @@ bool dbg_ports(void) char buf[128]; int line; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_clear_display(); lcd_setfont(FONT_SYSFIXED); @@ -1116,7 +1116,7 @@ bool dbg_ports(void) char buf[128]; int line; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_clear_display(); lcd_setfont(FONT_SYSFIXED); @@ -1280,7 +1280,7 @@ static bool dbg_cpufreq(void) int button; #ifdef HAVE_LCD_BITMAP - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); #endif lcd_clear_display(); @@ -1342,7 +1342,7 @@ static bool view_battery(void) unsigned short maxv, minv; char buf[32]; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); while(1) @@ -1540,7 +1540,7 @@ static bool dbg_mmc_info(void) card_name[6] = '\0'; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); while (!done) @@ -1651,7 +1651,7 @@ static bool dbg_disk_info(void) bool timing_info_present = false; char pio3[2], pio4[2]; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); while(!done) { @@ -1806,7 +1806,7 @@ static bool dbg_dircache_info(void) int line; char buf[32]; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); while (!done) @@ -1861,7 +1861,7 @@ static bool dbg_tagcache_info(void) char buf[32]; struct tagcache_stat *stat; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); while (!done) @@ -1991,7 +1991,7 @@ static bool dbg_fm_radio(void) char buf[32]; bool fm_detected; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); fm_detected = radio_hardware_present(); @@ -2106,7 +2106,7 @@ extern volatile bool lcd_poweroff; static bool dbg_lcd_power_off(void) { - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); while(1) { @@ -2190,7 +2190,7 @@ static bool cpu_boost_log(void) int lines = LCD_HEIGHT/SYSFONT_HEIGHT; char *str; bool done; - lcd_setmargins(0, 0); + lcd_setmargins(0, LCD_WIDTH, 0); lcd_setfont(FONT_SYSFIXED); str = cpu_boost_log_getlog_first(); while (i < count) Index: firmware/export/lcd.h =================================================================== --- firmware/export/lcd.h.orig +++ firmware/export/lcd.h @@ -60,8 +60,9 @@ extern void lcd_init_device(void); extern void lcd_backlight(bool on); extern int lcd_default_contrast(void); extern void lcd_set_contrast(int val); -extern void lcd_setmargins(int xmargin, int ymargin); -extern int lcd_getxmargin(void); +extern void lcd_setmargins(int leftmargin, int rightmargin, int ymargin); +extern int lcd_getleftmargin(void); +extern int lcd_getrightmargin(void); extern int lcd_getymargin(void); extern int lcd_getstringsize(const unsigned char *str, int *w, int *h); @@ -396,6 +397,8 @@ struct scrollinfo { int line_colour; #endif int y_margin; + int left_margin; + int right_margin; }; #endif /* __LCD_H__ */ Index: firmware/export/lcd-remote.h =================================================================== --- firmware/export/lcd-remote.h.orig +++ firmware/export/lcd-remote.h @@ -142,8 +142,9 @@ extern void lcd_remote_set_flip(bool yes extern void lcd_remote_set_drawmode(int mode); extern int lcd_remote_get_drawmode(void); -extern void lcd_remote_setmargins(int xmargin, int ymargin); -extern int lcd_remote_getxmargin(void); +extern void lcd_remote_setmargins(int leftmargin, int rightmargin, int ymargin); +extern int lcd_remote_getleftmargin(void); +extern int lcd_remote_getrightmargin(void); extern int lcd_remote_getymargin(void); extern void lcd_remote_setfont(int font); extern int lcd_remote_getstringsize(const unsigned char *str, int *w, int *h); Index: firmware/logf.c =================================================================== --- firmware/logf.c.orig +++ firmware/logf.c @@ -54,7 +54,7 @@ static void displayremote(void) lcd_remote_getstringsize("A", &w, &h); lines = LCD_REMOTE_HEIGHT/h; columns = LCD_REMOTE_WIDTH/w; - lcd_remote_setmargins(0, 0); + lcd_remote_setmargins(0, LCD_REMOTE_WIDTH, 0); lcd_remote_clear_display(); index = logfindex; Index: firmware/drivers/lcd-remote-2bit-vi.c =================================================================== --- firmware/drivers/lcd-remote-2bit-vi.c.orig +++ firmware/drivers/lcd-remote-2bit-vi.c @@ -50,7 +50,8 @@ static long remote_backdrop_offset IDATA static unsigned fg_pattern IDATA_ATTR = 0xFFFF; /* initially black */ static unsigned bg_pattern IDATA_ATTR = 0x0000; /* initially white */ static int drawmode = DRMODE_SOLID; -static int xmargin = 0; +static int leftmargin = 0; +static int rightmargin = LCD_REMOTE_WIDTH; static int ymargin = 0; static int curfont = FONT_SYSFIXED; @@ -128,17 +129,23 @@ void lcd_remote_set_drawinfo(int mode, u lcd_remote_set_background(bg_brightness); } -void lcd_remote_setmargins(int x, int y) +void lcd_remote_setmargins(int x1, int x2, int y) { - xmargin = x; + leftmargin = x1; + rightmargin = x2; ymargin = y; } -int lcd_remote_getxmargin(void) +int lcd_remote_getleftmargin(void) { - return xmargin; + return leftmargin; } +int lcd_remote_getrightmargin(void) +{ + return rightmargin; +} + int lcd_remote_getymargin(void) { return ymargin; @@ -934,16 +941,18 @@ void lcd_remote_bitmap(const fb_remote_d lcd_remote_bitmap_part(src, 0, 0, width, x, y, width, height); } -/* put a string at a given pixel position, skipping first ofs pixel columns */ -static void lcd_remote_putsxyofs(int x, int y, int ofs, const unsigned char *str) +/* put a string at a given pixel position, skipping first ofs pixel columns + if rmargin==0 the global rightmargin is used */ +static void lcd_remote_putsxyofs(int x, int y, int ofs, const unsigned char *str, int rmargin) { unsigned short ch; unsigned short *ucs; struct font* pf = font_get(curfont); - + int used_rightmargin=rmargin?rmargin:rightmargin; + ucs = bidi_l2v(str, 1); - while ((ch = *ucs++) != 0 && x < LCD_REMOTE_WIDTH) + while ((ch = *ucs++) != 0 && x < used_rightmargin) { int width; const unsigned char *bits; @@ -959,7 +968,7 @@ static void lcd_remote_putsxyofs(int x, bits = font_get_bits(pf, ch); - lcd_remote_mono_bitmap_part(bits, ofs, 0, width, x, y, width - ofs, + lcd_remote_mono_bitmap_part(bits, ofs, 0, width, x, y, (x+width > used_rightmargin?used_rightmargin-x:width) - ofs, pf->height); x += width - ofs; @@ -970,7 +979,7 @@ static void lcd_remote_putsxyofs(int x, /* put a string at a given pixel position */ void lcd_remote_putsxy(int x, int y, const unsigned char *str) { - lcd_remote_putsxyofs(x, y, 0, str); + lcd_remote_putsxyofs(x, y, 0, str, 0); } /*** line oriented text output ***/ @@ -1006,14 +1015,14 @@ void lcd_remote_puts_style_offset(int x, return; lcd_remote_getstringsize(str, &w, &h); - xpos = xmargin + x*w / utf8length((char *)str); + xpos = leftmargin + x*w / utf8length((char *)str); ypos = ymargin + y*h; drawmode = (style & STYLE_INVERT) ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_remote_putsxyofs(xpos, ypos, offset, str); + lcd_remote_putsxyofs(xpos, ypos, offset, str, 0); drawmode ^= DRMODE_INVERSEVID; xrect = xpos + MAX(w - offset, 0); - lcd_remote_fillrect(xrect, ypos, LCD_REMOTE_WIDTH - xrect, h); + lcd_remote_fillrect(xpos + w, ypos, rightmargin - (xpos + w), h); drawmode = lastmode; } @@ -1094,7 +1103,7 @@ void lcd_remote_puts_scroll_style_offset lcd_remote_getstringsize(string, &w, &h); - if (LCD_REMOTE_WIDTH - x * 8 - xmargin < w) { + if (LCD_REMOTE_WIDTH - x * 8 - leftmargin < w) { /* prepare scroll line */ char *end; @@ -1107,7 +1116,7 @@ void lcd_remote_puts_scroll_style_offset /* scroll bidirectional or forward only depending on the string width */ if ( bidir_limit ) { - s->bidir = s->width < (LCD_REMOTE_WIDTH - xmargin) * + s->bidir = s->width < (LCD_REMOTE_WIDTH - leftmargin) * (100 + bidir_limit) / 100; } else @@ -1120,12 +1129,14 @@ void lcd_remote_puts_scroll_style_offset } end = strchr(s->line, '\0'); - strncpy(end, (char *)string, LCD_REMOTE_WIDTH/2); + strncpy(end, (char *)string, rightmargin/2); s->len = utf8length((char *)string); s->offset = offset; - s->startx = xmargin + x * s->width / s->len;; + s->startx = leftmargin + x * s->width / s->len;; s->backward = false; + s->left_margin=leftmargin; + s->right_margin=rightmargin; scrolling_lines |= (1<y_margin=ymargin; } @@ -1204,9 +1215,9 @@ static void scroll_thread(void) s->backward = false; s->start_tick = current_tick + scroll_delay * 2; } - if (s->offset >= s->width - (LCD_REMOTE_WIDTH - xpos)) { + if (s->offset >= s->width - (s->right_margin - xpos)) { /* at end of line */ - s->offset = s->width - (LCD_REMOTE_WIDTH - xpos); + s->offset = s->width - (s->right_margin - xpos); s->backward = true; s->start_tick = current_tick + scroll_delay * 2; } @@ -1220,9 +1231,9 @@ static void scroll_thread(void) lastmode = drawmode; drawmode = s->invert ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_remote_putsxyofs(xpos, ypos, s->offset, s->line); + lcd_remote_putsxyofs(xpos, ypos, s->offset, s->line, s->right_margin); drawmode = lastmode; - lcd_remote_update_rect(xpos, ypos, LCD_REMOTE_WIDTH - xpos, pf->height); + lcd_remote_update_rect(xpos, ypos, s->right_margin - xpos, pf->height); } Index: firmware/drivers/lcd-1bit-vert.c =================================================================== --- firmware/drivers/lcd-1bit-vert.c.orig +++ firmware/drivers/lcd-1bit-vert.c @@ -39,7 +39,8 @@ unsigned char lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH]; static int drawmode = DRMODE_SOLID; -static int xmargin = 0; +static int leftmargin = 0; +static int rightmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; @@ -83,15 +84,21 @@ int lcd_get_drawmode(void) return drawmode; } -void lcd_setmargins(int x, int y) +void lcd_setmargins(int x1, int x2, int y) { - xmargin = x; + leftmargin = x1; + rightmargin = x2; ymargin = y; } -int lcd_getxmargin(void) +int lcd_getleftmargin(void) { - return xmargin; + return leftmargin; +} + +int lcd_getrightmargin(void) +{ + return rightmargin; } int lcd_getymargin(void) @@ -670,14 +677,17 @@ void lcd_puts_style_offset(int x, int y, return; lcd_getstringsize(str, &w, &h); - xpos = xmargin + x*w / utf8length(str); + xpos = leftmargin + x*w / utf8length(str); ypos = ymargin + y*h; drawmode = (style & STYLE_INVERT) ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; lcd_putsxyofs(xpos, ypos, offset, str); drawmode ^= DRMODE_INVERSEVID; xrect = xpos + MAX(w - offset, 0); - lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h); + lcd_fillrect(xpos + w, ypos, rightmargin - (xpos + w), h); + if (LCD_WIDTH>rightmargin) { + lcd_fillrect(rightmargin, ypos, LCD_WIDTH - rightmargin, h); + } drawmode = lastmode; } @@ -759,7 +769,7 @@ void lcd_puts_scroll_style_offset(int x, lcd_getstringsize(string, &w, &h); - if (LCD_WIDTH - x * 8 - xmargin < w) { + if (rightmargin - x * 8 - leftmargin < w) { /* prepare scroll line */ char *end; @@ -772,7 +782,7 @@ void lcd_puts_scroll_style_offset(int x, /* scroll bidirectional or forward only depending on the string width */ if ( bidir_limit ) { - s->bidir = s->width < (LCD_WIDTH - xmargin) * + s->bidir = s->width < (rightmargin - leftmargin) * (100 + bidir_limit) / 100; } else @@ -785,12 +795,14 @@ void lcd_puts_scroll_style_offset(int x, } end = strchr(s->line, '\0'); - strncpy(end, string, LCD_WIDTH/2); + strncpy(end, string, rightmargin/2); s->len = utf8length(string); s->offset = offset; - s->startx = xmargin + x * s->width / s->len;; + s->startx = leftmargin + x * s->width / s->len; s->backward = false; + s->left_margin=leftmargin; + s->right_margin=rightmargin; scrolling_lines |= (1<y_margin=ymargin; } @@ -838,9 +850,9 @@ static void scroll_thread(void) s->backward = false; s->start_tick = current_tick + scroll_delay * 2; } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + if (s->offset >= s->width - (s->right_margin - xpos)) { /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); + s->offset = s->width - (s->right_margin - xpos); s->backward = true; s->start_tick = current_tick + scroll_delay * 2; } @@ -855,8 +867,12 @@ static void scroll_thread(void) drawmode = s->invert ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; lcd_putsxyofs(xpos, ypos, s->offset, s->line); + if (LCD_WIDTH>s->right_margin) { + drawmode ^= DRMODE_INVERSEVID; + lcd_fillrect(s->right_margin, ypos, LCD_WIDTH - s->right_margin, pf->height); + } drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + lcd_update_rect(xpos, ypos, s->right_margin - xpos, pf->height); } sleep(scroll_ticks); Index: firmware/drivers/lcd-2bit-vert.c =================================================================== --- firmware/drivers/lcd-2bit-vert.c.orig +++ firmware/drivers/lcd-2bit-vert.c @@ -54,7 +54,8 @@ static long lcd_backdrop_offset IDATA_AT static unsigned fg_pattern IDATA_ATTR = 0xFF; /* initially black */ static unsigned bg_pattern IDATA_ATTR = 0x00; /* initially white */ static int drawmode = DRMODE_SOLID; -static int xmargin = 0; +static int leftmargin = 0; +static int rightmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; @@ -125,17 +126,25 @@ void lcd_set_drawinfo(int mode, unsigned lcd_set_background(bg_brightness); } -void lcd_setmargins(int x, int y) +void lcd_setmargins(int x1, int x2, int y) { - xmargin = x; + leftmargin = x1; + rightmargin = x2; ymargin = y; + +} + +int lcd_getleftmargin(void) +{ + return leftmargin; } -int lcd_getxmargin(void) +int lcd_getrightmargin(void) { - return xmargin; + return rightmargin; } + int lcd_getymargin(void) { return ymargin; @@ -1004,14 +1013,17 @@ void lcd_puts_style_offset(int x, int y, return; lcd_getstringsize(str, &w, &h); - xpos = xmargin + x*w / utf8length((char *)str); + xpos = leftmargin + x*w / utf8length((char *)str); ypos = ymargin + y*h; drawmode = (style & STYLE_INVERT) ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; lcd_putsxyofs(xpos, ypos, offset, str); drawmode ^= DRMODE_INVERSEVID; xrect = xpos + MAX(w - offset, 0); - lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h); + lcd_fillrect(xpos + w, ypos, rightmargin - (xpos + w), h); + if (LCD_WIDTH>rightmargin) { + lcd_fillrect(rightmargin, ypos, LCD_WIDTH - rightmargin, h); + } drawmode = lastmode; } @@ -1092,7 +1104,7 @@ void lcd_puts_scroll_style_offset(int x, lcd_getstringsize(string, &w, &h); - if (LCD_WIDTH - x * 8 - xmargin < w) { + if (rightmargin - x * 8 - leftmargin < w) { /* prepare scroll line */ char *end; @@ -1105,7 +1117,7 @@ void lcd_puts_scroll_style_offset(int x, /* scroll bidirectional or forward only depending on the string width */ if ( bidir_limit ) { - s->bidir = s->width < (LCD_WIDTH - xmargin) * + s->bidir = s->width < (rightmargin - leftmargin) * (100 + bidir_limit) / 100; } else @@ -1118,12 +1130,14 @@ void lcd_puts_scroll_style_offset(int x, } end = strchr(s->line, '\0'); - strncpy(end, (char *)string, LCD_WIDTH/2); + strncpy(end, (char *)string, rightmargin/2); s->len = utf8length((char *)string); s->offset = offset; - s->startx = xmargin + x * s->width / s->len; + s->startx = leftmargin + x * s->width / s->len; s->backward = false; + s->left_margin=leftmargin; + s->right_margin=rightmargin; scrolling_lines |= (1<y_margin=ymargin; } @@ -1171,9 +1185,9 @@ static void scroll_thread(void) s->backward = false; s->start_tick = current_tick + scroll_delay * 2; } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + if (s->offset >= s->width - (s->right_margin - xpos)) { /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); + s->offset = s->width - (s->right_margin - xpos); s->backward = true; s->start_tick = current_tick + scroll_delay * 2; } @@ -1188,8 +1202,12 @@ static void scroll_thread(void) drawmode = s->invert ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; lcd_putsxyofs(xpos, ypos, s->offset, s->line); + if (LCD_WIDTH>s->right_margin) { + drawmode ^= DRMODE_INVERSEVID; + lcd_fillrect(s->right_margin, ypos, LCD_WIDTH - s->right_margin, pf->height); + } drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + lcd_update_rect(xpos, ypos, s->right_margin - xpos, pf->height); } sleep(scroll_ticks); Index: firmware/drivers/lcd-2bit-horz.c =================================================================== --- firmware/drivers/lcd-2bit-horz.c.orig +++ firmware/drivers/lcd-2bit-horz.c @@ -50,7 +50,8 @@ static long lcd_backdrop_offset IDATA_AT static unsigned fg_pattern IDATA_ATTR = 0xFF; /* initially black */ static unsigned bg_pattern IDATA_ATTR = 0x00; /* initially white */ static int drawmode = DRMODE_SOLID; -static int xmargin = 0; +static int leftmargin = 0; +static int rightmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; @@ -122,15 +123,21 @@ void lcd_set_drawinfo(int mode, unsigned lcd_set_background(bg_brightness); } -void lcd_setmargins(int x, int y) +void lcd_setmargins(int x1, int x2, int y) { - xmargin = x; + leftmargin = x1; + rightmargin = x2; ymargin = y; } -int lcd_getxmargin(void) +int lcd_getleftmargin(void) { - return xmargin; + return leftmargin; +} + +int lcd_getrightmargin(void) +{ + return rightmargin; } int lcd_getymargin(void) @@ -868,7 +875,7 @@ void lcd_puts_style_offset(int x, int y, return; lcd_getstringsize(str, &w, &h); - xpos = xmargin + x*w / utf8length((char *)str); + xpos = leftmargin + x*w / utf8length((char *)str); ypos = ymargin + y*h; drawmode = (style & STYLE_INVERT) ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; @@ -956,7 +963,7 @@ void lcd_puts_scroll_style_offset(int x, lcd_getstringsize(string, &w, &h); - if (LCD_WIDTH - x * 8 - xmargin < w) { + if (LCD_WIDTH - x * 8 - leftmargin < w) { /* prepare scroll line */ char *end; @@ -969,7 +976,7 @@ void lcd_puts_scroll_style_offset(int x, /* scroll bidirectional or forward only depending on the string width */ if ( bidir_limit ) { - s->bidir = s->width < (LCD_WIDTH - xmargin) * + s->bidir = s->width < (LCD_WIDTH - leftmargin) * (100 + bidir_limit) / 100; } else @@ -986,7 +993,7 @@ void lcd_puts_scroll_style_offset(int x, s->len = utf8length((char *)string); s->offset = offset; - s->startx = xmargin + x * s->width / s->len;; + s->startx = leftmargin + x * s->width / s->len;; s->backward = false; scrolling_lines |= (1<y_margin=ymargin; Index: firmware/drivers/lcd-16bit.c =================================================================== --- firmware/drivers/lcd-16bit.c.orig +++ firmware/drivers/lcd-16bit.c @@ -52,7 +52,8 @@ static long lcd_backdrop_offset IDATA_AT static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG; static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG; static int drawmode = DRMODE_SOLID; -static int xmargin = 0; +static int leftmargin = 0; +static int rightmargin = LCD_WIDTH; static int ymargin = 0; static int curfont = FONT_SYSFIXED; @@ -127,15 +128,21 @@ void lcd_set_drawinfo(int mode, unsigned bg_pattern = bg_color; } -void lcd_setmargins(int x, int y) +void lcd_setmargins(int x1, int x2, int y) { - xmargin = x; + leftmargin = x1; + rightmargin = x2; ymargin = y; } -int lcd_getxmargin(void) +int lcd_getleftmargin(void) { - return xmargin; + return leftmargin; +} + +int lcd_getrightmargin(void) +{ + return rightmargin; } int lcd_getymargin(void) @@ -744,16 +751,18 @@ void lcd_bitmap_transparent(const fb_dat lcd_bitmap_transparent_part(src, 0, 0, width, x, y, width, height); } -/* put a string at a given pixel position, skipping first ofs pixel columns */ -static void lcd_putsxyofs(int x, int y, int ofs, const unsigned char *str) +/* put a string at a given pixel position, skipping first ofs pixel columns + if rmargin==0 the global rightmargin is used */ +static void lcd_putsxyofs(int x, int y, int ofs, const unsigned char *str, int rmargin) { unsigned short ch; unsigned short *ucs; struct font* pf = font_get(curfont); - + int used_rightmargin=rmargin?rmargin:rightmargin; + ucs = bidi_l2v(str, 1); - while ((ch = *ucs++) != 0 && x < LCD_WIDTH) + while ((ch = *ucs++) != 0 && x < used_rightmargin) { int width; const unsigned char *bits; @@ -769,7 +778,7 @@ static void lcd_putsxyofs(int x, int y, bits = font_get_bits(pf, ch); - lcd_mono_bitmap_part(bits, ofs, 0, width, x, y, width - ofs, pf->height); + lcd_mono_bitmap_part(bits, ofs, 0, width, x, y, (x+width > used_rightmargin?used_rightmargin-x:width) - ofs, pf->height); x += width - ofs; ofs = 0; @@ -779,7 +788,7 @@ static void lcd_putsxyofs(int x, int y, /* put a string at a given pixel position */ void lcd_putsxy(int x, int y, const unsigned char *str) { - lcd_putsxyofs(x, y, 0, str); + lcd_putsxyofs(x, y, 0, str, 0); } /*** line oriented text output ***/ @@ -817,7 +826,7 @@ void lcd_puts_style_offset(int x, int y, return; lcd_getstringsize(str, &w, &h); - xpos = xmargin + x*w / utf8length(str); + xpos = leftmargin + x*w / utf8length(str); ypos = ymargin + y*h; drawmode = (style & STYLE_INVERT) ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; @@ -827,10 +836,10 @@ void lcd_puts_style_offset(int x, int y, else bg_pattern = style & STYLE_COLOR_MASK; } - lcd_putsxyofs(xpos, ypos, offset, str); + lcd_putsxyofs(xpos, ypos, offset, str, 0); drawmode ^= DRMODE_INVERSEVID; xrect = xpos + MAX(w - offset, 0); - lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h); + lcd_fillrect(xrect, ypos, rightmargin - xrect, h); drawmode = lastmode; fg_pattern = oldfgcolor; bg_pattern = oldbgcolor; @@ -911,7 +920,7 @@ void lcd_puts_scroll_style_offset(int x, lcd_getstringsize(string, &w, &h); - if (LCD_WIDTH - x * 8 - xmargin < w) { + if (rightmargin - x * 8 - leftmargin < w) { /* prepare scroll line */ char *end; @@ -924,7 +933,7 @@ void lcd_puts_scroll_style_offset(int x, /* scroll bidirectional or forward only depending on the string width */ if ( bidir_limit ) { - s->bidir = s->width < (LCD_WIDTH - xmargin) * + s->bidir = s->width < (rightmargin - leftmargin) * (100 + bidir_limit) / 100; } else @@ -937,16 +946,18 @@ void lcd_puts_scroll_style_offset(int x, } end = strchr(s->line, '\0'); - strncpy(end, string, LCD_WIDTH/2); + strncpy(end, string, rightmargin/2); s->len = utf8length(string); s->offset = offset; - s->startx = xmargin + x * s->width / s->len; + s->startx = leftmargin + x * s->width / s->len; s->backward = false; s->line_colour = (style&STYLE_COLORED)? (style&STYLE_COLOR_MASK): -1; scrolling_lines |= (1<y_margin=ymargin; + s->left_margin=leftmargin; + s->right_margin=rightmargin; } else /* force a bit switch-off since it doesn't scroll */ @@ -1011,9 +1022,9 @@ static void scroll_thread(void) s->backward = false; s->start_tick = current_tick + scroll_delay * 2; } - if (s->offset >= s->width - (LCD_WIDTH - xpos)) { + if (s->offset >= s->width - (s->right_margin - xpos)) { /* at end of line */ - s->offset = s->width - (LCD_WIDTH - xpos); + s->offset = s->width - (s->right_margin - xpos); s->backward = true; s->start_tick = current_tick + scroll_delay * 2; } @@ -1027,9 +1038,9 @@ static void scroll_thread(void) lastmode = drawmode; drawmode = s->invert ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; - lcd_putsxyofs(xpos, ypos, s->offset, s->line); + lcd_putsxyofs(xpos, ypos, s->offset, s->line, s->right_margin); drawmode = lastmode; - lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); + lcd_update_rect(xpos, ypos, s->right_margin - xpos, pf->height); } lcd_set_foreground(old_fgcolour); lcd_set_background(old_bgcolour); Index: firmware/drivers/lcd-remote-1bit-v.c =================================================================== --- firmware/drivers/lcd-remote-1bit-v.c.orig +++ firmware/drivers/lcd-remote-1bit-v.c @@ -40,7 +40,8 @@ fb_remote_data lcd_remote_framebuffer[LC IBSS_ATTR; static int drawmode = DRMODE_SOLID; -static int xmargin = 0; +static int leftmargin = 0; +static int rightmargin = 0; static int ymargin = 0; static int curfont = FONT_SYSFIXED; @@ -78,15 +79,21 @@ int lcd_remote_get_drawmode(void) return drawmode; } -void lcd_remote_setmargins(int x, int y) +void lcd_remote_setmargins(int x1, int x2, int y) { - xmargin = x; + leftmargin = x1; + rightmargin = x2; ymargin = y; } -int lcd_remote_getxmargin(void) +int lcd_remote_getleftmargin(void) { - return xmargin; + return leftmargin; +} + +int lcd_remote_getrightmargin(void) +{ + return rightmargin; } int lcd_remote_getymargin(void) @@ -660,7 +667,7 @@ void lcd_remote_puts_offset(int x, int y void lcd_remote_puts_style_offset(int x, int y, const unsigned char *str, int style, int offset) { - int xpos,ypos,w,h,xrect; + int xpos,ypos,w,h; int lastmode = drawmode; /* make sure scrolling is turned off on the line we are updating */ @@ -670,14 +677,16 @@ void lcd_remote_puts_style_offset(int x, return; lcd_remote_getstringsize(str, &w, &h); - xpos = xmargin + x*w / utf8length((char *)str); + xpos = leftmargin + x*w / utf8length((char *)str); ypos = ymargin + y*h; drawmode = (style & STYLE_INVERT) ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; lcd_remote_putsxyofs(xpos, ypos, offset, str); drawmode ^= DRMODE_INVERSEVID; - xrect = xpos + MAX(w - offset, 0); - lcd_remote_fillrect(xrect, ypos, LCD_REMOTE_WIDTH - xrect, h); + lcd_remote_fillrect(xpos + w, ypos, rightmargin - (xpos + w), h); + if (LCD_REMOTE_WIDTH>rightmargin) { + lcd_remote_fillrect(rightmargin, ypos, LCD_WIDTH - rightmargin, h); + } drawmode = lastmode; } @@ -758,7 +767,7 @@ void lcd_remote_puts_scroll_style_offset lcd_remote_getstringsize(string, &w, &h); - if (LCD_REMOTE_WIDTH - x * 8 - xmargin < w) { + if (rightmargin - x * 8 - leftmargin < w) { /* prepare scroll line */ char *end; @@ -771,7 +780,7 @@ void lcd_remote_puts_scroll_style_offset /* scroll bidirectional or forward only depending on the string width */ if ( bidir_limit ) { - s->bidir = s->width < (LCD_REMOTE_WIDTH - xmargin) * + s->bidir = s->width < (rightmargin - leftmargin) * (100 + bidir_limit) / 100; } else @@ -784,12 +793,14 @@ void lcd_remote_puts_scroll_style_offset } end = strchr(s->line, '\0'); - strncpy(end, (char *)string, LCD_REMOTE_WIDTH/2); + strncpy(end, (char *)string, rightmargin/2); s->len = utf8length((char *)string); s->offset = offset; - s->startx = xmargin + x * s->width / s->len;; + s->startx = leftmargin + x * s->width / s->len;; s->backward = false; + s->left_margin=leftmargin; + s->right_margin=rightmargin; scrolling_lines |= (1<y_margin=ymargin; } @@ -867,9 +878,9 @@ static void scroll_thread(void) s->backward = false; s->start_tick = current_tick + scroll_delay * 2; } - if (s->offset >= s->width - (LCD_REMOTE_WIDTH - xpos)) { + if (s->offset >= s->width - (s->right_margin - xpos)) { /* at end of line */ - s->offset = s->width - (LCD_REMOTE_WIDTH - xpos); + s->offset = s->width - (s->right_margin - xpos); s->backward = true; s->start_tick = current_tick + scroll_delay * 2; } @@ -884,8 +895,12 @@ static void scroll_thread(void) drawmode = s->invert ? (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; lcd_remote_putsxyofs(xpos, ypos, s->offset, s->line); + if (LCD_REMOTE_WIDTH > s->right_margin) { + drawmode ^= DRMODE_INVERSEVID; + lcd_remote_fillrect(s->right_margin, ypos, LCD_WIDTH - s->right_margin, pf->height); + } drawmode = lastmode; - lcd_remote_update_rect(xpos, ypos, LCD_REMOTE_WIDTH - xpos, pf->height); + lcd_remote_update_rect(xpos, ypos, s->right_margin - xpos, pf->height); } next_tick += scroll_ticks;