diff options
| author | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-23 13:56:08 +0000 |
|---|---|---|
| committer | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-23 13:56:08 +0000 |
| commit | 59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55 (patch) | |
| tree | ab90153c1106641d5973f43b727611d983d7a70f /apps/plugins/text_viewer/tv_window.c | |
| parent | cf9bba710297617f01c37b613b5ab9fcd97733e3 (diff) | |
| download | rockbox-59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55.zip rockbox-59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55.tar.gz rockbox-59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55.tar.bz2 rockbox-59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55.tar.xz | |
FS#11399 by me: fix r26998 for text_viewer
Restore the old behaviour:
- preferences must be read-write for tv_preferences.c , read-only for
all other modules -> use pointer to const struct
- init functions must get the plugin buffer + its size as arguments for
easily adding new functions -> use pointer to buffer pointer and size
to make allocation easier
- preferences meaning is private to each file and must not be known by
tv_preferences.c -> move tv_check_header_and_footer() back in
tv_window.c; also avoid chaining 3 times the callbacks by calling
tv_set_preferences() only once if more than one preference needs
changing
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27089 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/text_viewer/tv_window.c')
| -rw-r--r-- | apps/plugins/text_viewer/tv_window.c | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/apps/plugins/text_viewer/tv_window.c b/apps/plugins/text_viewer/tv_window.c index c733d5a..f1f2033 100644 --- a/apps/plugins/text_viewer/tv_window.c +++ b/apps/plugins/text_viewer/tv_window.c @@ -67,6 +67,40 @@ static bool tv_set_font(const unsigned char *font) return true; } +static bool tv_check_header_and_footer(struct tv_preferences *new_prefs) +{ + bool change_prefs = false; + + if (rb->global_settings->statusbar != STATUSBAR_TOP) + { + if (new_prefs->header_mode == HD_SBAR) + { + new_prefs->header_mode = HD_NONE; + change_prefs = true; + } + else if (new_prefs->header_mode == HD_BOTH) + { + new_prefs->header_mode = HD_PATH; + change_prefs = true; + } + } + if (rb->global_settings->statusbar != STATUSBAR_BOTTOM) + { + if (new_prefs->footer_mode == FT_SBAR) + { + new_prefs->footer_mode = FT_NONE; + change_prefs = true; + } + else if (new_prefs->footer_mode == FT_BOTH) + { + new_prefs->footer_mode = FT_PAGE; + change_prefs = true; + } + } + + return change_prefs; +} + static void tv_show_header(void) { unsigned header_mode = header_mode; @@ -259,6 +293,9 @@ static void tv_change_preferences(const struct tv_preferences *oldp) #ifdef HAVE_LCD_BITMAP static bool font_changing = false; const unsigned char *font_str; + bool change_prefs = false; + struct tv_preferences new_prefs; + tv_copy_preferences(&new_prefs); font_str = (oldp && !font_changing)? oldp->font_name : rb->global_settings->font_file; @@ -268,14 +305,17 @@ static void tv_change_preferences(const struct tv_preferences *oldp) font_changing = true; if (!tv_set_font(preferences->font_name)) { - struct tv_preferences new_prefs; - tv_copy_preferences(&new_prefs); - rb->strlcpy(new_prefs.font_name, font_str, MAX_PATH); - tv_set_preferences(&new_prefs); - return; + change_prefs = true; } } + + if (tv_check_header_and_footer(&new_prefs) || change_prefs) + { + tv_set_preferences(&new_prefs); + return; + } + font_changing = false; /* calculates display lines */ @@ -319,10 +359,10 @@ static void tv_change_preferences(const struct tv_preferences *oldp) tv_set_read_conditions(preferences->windows, window_width); } -bool tv_init_window(void) +bool tv_init_window(unsigned char **buf, size_t *size) { tv_add_preferences_change_listner(tv_change_preferences); - return tv_init_text_reader(); + return tv_init_text_reader(buf, size); } void tv_finalize_window(void) |