summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/screen_access.c4
-rw-r--r--apps/screen_access.h4
-rw-r--r--firmware/drivers/lcd-bitmap-common.c11
-rw-r--r--firmware/drivers/lcd-charcell.c10
-rw-r--r--firmware/export/lcd-remote.h3
-rw-r--r--firmware/export/lcd.h5
6 files changed, 36 insertions, 1 deletions
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 <lcd-remote.h>
#endif
-#include <scroll_engine.h>
+#include "scroll_engine.h"
#include <font.h>
#include <button.h>
#include <settings.h>
@@ -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