diff --git a/apps/screen_access.c b/apps/screen_access.c index f454e0adef..23625ae89c 100644 --- a/apps/screen_access.c +++ b/apps/screen_access.c @@ -25,7 +25,7 @@ #ifdef HAVE_REMOTE_LCD #include #endif -#include +#include "scroll_engine.h" #include #include #include @@ -243,6 +243,7 @@ struct screen screens[NB_SCREENS] = .puts_offset=&lcd_puts_offset, .puts_scroll=&lcd_puts_scroll, .puts_scroll_offset=&lcd_puts_scroll_offset, + .putsxy_scroll_func=&lcd_putsxy_scroll_func, .scroll_speed=&lcd_scroll_speed, .scroll_delay=&lcd_scroll_delay, .clear_display=&lcd_clear_display, @@ -344,6 +345,7 @@ struct screen screens[NB_SCREENS] = .puts_offset=&lcd_remote_puts_offset, .puts_scroll=&lcd_remote_puts_scroll, .puts_scroll_offset=&lcd_remote_puts_scroll_offset, + .putsxy_scroll_func=&lcd_remote_putsxy_scroll_func, .scroll_speed=&lcd_remote_scroll_speed, .scroll_delay=&lcd_remote_scroll_delay, .clear_display=&lcd_remote_clear_display, diff --git a/apps/screen_access.h b/apps/screen_access.h index 90b63ea338..210ad2e990 100644 --- a/apps/screen_access.h +++ b/apps/screen_access.h @@ -24,6 +24,7 @@ #include "lcd.h" #include "buttonbar.h" +#include "scroll_engine.h" #include "backdrop.h" #if defined(HAVE_REMOTE_LCD) && !defined (ROCKBOX_HAS_LOGF) @@ -143,6 +144,9 @@ struct screen void (*puts_scroll)(int x, int y, const unsigned char *string); void (*puts_scroll_offset)(int x, int y, const unsigned char *string, int x_offset); + void (*putsxy_scroll_func)(int x, int y, const unsigned char *string, + void (*scroll_func)(struct scrollinfo *), + void *data, int x_offset); void (*scroll_speed)(int speed); void (*scroll_delay)(int ms); void (*clear_display)(void); diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c index d8417e13e2..5961bba7a5 100644 --- a/firmware/drivers/lcd-bitmap-common.c +++ b/firmware/drivers/lcd-bitmap-common.c @@ -572,6 +572,17 @@ void LCDFN(puts_scroll_style_xyoffset)(int x, int y, const unsigned char *string true, LCDFN(scroll_fn), NULL); } +void LCDFN(putsxy_scroll_func)(int x, int y, const unsigned char *string, + void (*scroll_func)(struct scrollinfo *), + void *data, int x_offset) +{ + if (!scroll_func) + LCDFN(putsxyofs)(x, y, x_offset, string); + else + LCDFN(puts_scroll_worker)(x, y, string, STYLE_NONE, x_offset, 0, + false, scroll_func, data); +} + void LCDFN(puts_scroll)(int x, int y, const unsigned char *string) { LCDFN(puts_scroll_style)(x, y, string, STYLE_DEFAULT); diff --git a/firmware/drivers/lcd-charcell.c b/firmware/drivers/lcd-charcell.c index db867cdb0a..54159519a3 100644 --- a/firmware/drivers/lcd-charcell.c +++ b/firmware/drivers/lcd-charcell.c @@ -563,6 +563,16 @@ void lcd_puts_scroll_worker(int x, int y, const unsigned char *string, lcd_scroll_info.lines++; } +void lcd_putsxy_scroll_func(int x, int y, const unsigned char *string, + void (*scroll_func)(struct scrollinfo *), + void *data, int x_offset) +{ + if (!scroll_func) + lcd_putsxyofs(x, y, x_offset, string); + else + lcd_puts_scroll_worker(x, y, string, x_offset, scroll_func, data); +} + void lcd_scroll_fn(struct scrollinfo* s) { lcd_putsxyofs(s->x, s->y, s->offset, s->line); diff --git a/firmware/export/lcd-remote.h b/firmware/export/lcd-remote.h index be6816cd7e..f209e6b47d 100644 --- a/firmware/export/lcd-remote.h +++ b/firmware/export/lcd-remote.h @@ -196,6 +196,9 @@ extern void lcd_remote_puts_scroll_style_xyoffset(int x, int y, const unsigned char *string, int style, int x_offset, int y_offset); +extern void lcd_remote_putsxy_scroll_func(int x, int y, const unsigned char *string, + void (*scroll_func)(struct scrollinfo *), + void *data, int x_offset); extern void lcd_remote_update(void); extern void lcd_remote_update_rect(int x, int y, int width, int height); diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index 7842ce59f2..745c445dda 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h @@ -108,6 +108,8 @@ enum screen_type { #endif }; +struct scrollinfo; + #if defined(LCD_STRIDEFORMAT) && LCD_STRIDEFORMAT == VERTICAL_STRIDE #define STRIDE_MAIN(w, h) (h) #else @@ -212,6 +214,9 @@ extern void lcd_putc(int x, int y, unsigned long ucs); extern void lcd_puts_scroll(int x, int y, const unsigned char* string); extern void lcd_puts_scroll_style(int x, int y, const unsigned char* string, int style); +extern void lcd_putsxy_scroll_func(int x, int y, const unsigned char *string, + void (*scroll_func)(struct scrollinfo *), + void *data, int x_offset); #ifdef HAVE_LCD_BITMAP