From 298316d19297eea82869b63235b535e5904fc0dd Mon Sep 17 00:00:00 2001 From: Rafaël Carré Date: Sun, 20 Jun 2010 21:53:47 +0000 Subject: text_viewer: cleanup & bugfix cleanup: - don't use enum in struct / return values - don't use a getter for preferences but a global pointer - explicitely make enums start at 0 - use static tables for header/footer settings - remove unneeded memset before strlcpy - use static buffer allocation, not dynamic - check header/footer preferences before using the callbacks - don't include font filename in archos player preferences (break file format) bugfix: - statically allocate old preferences in tv_set_preferences() Sometimes I can read a file on Clipv2, but it still aborts quite often refs: FS#11399 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26998 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/text_viewer/tv_preferences.c | 72 ++++++++++++++++++------------- 1 file changed, 42 insertions(+), 30 deletions(-) (limited to 'apps/plugins/text_viewer/tv_preferences.c') diff --git a/apps/plugins/text_viewer/tv_preferences.c b/apps/plugins/text_viewer/tv_preferences.c index d317508936..b1045fba7d 100644 --- a/apps/plugins/text_viewer/tv_preferences.c +++ b/apps/plugins/text_viewer/tv_preferences.c @@ -23,15 +23,16 @@ #include "plugin.h" #include "tv_preferences.h" +/* global preferences */ static struct tv_preferences prefs; -static bool is_initialized = false; +struct tv_preferences *preferences = &prefs; + static int listner_count = 0; #define TV_MAX_LISTNERS 4 static void (*listners[TV_MAX_LISTNERS])(const struct tv_preferences *oldp); -static void tv_notify_change_preferences(const struct tv_preferences *oldp, - const struct tv_preferences *newp) +static void tv_notify_change_preferences(const struct tv_preferences *oldp) { int i; @@ -45,50 +46,62 @@ static void tv_notify_change_preferences(const struct tv_preferences *oldp, * - autoscroll_speed * - narrow_mode */ - if ((oldp == NULL) || - (oldp->word_mode != newp->word_mode) || - (oldp->line_mode != newp->line_mode) || - (oldp->windows != newp->windows) || - (oldp->horizontal_scrollbar != newp->horizontal_scrollbar) || - (oldp->vertical_scrollbar != newp->vertical_scrollbar) || - (oldp->encoding != newp->encoding) || - (oldp->indent_spaces != newp->indent_spaces) || + if ((oldp == NULL) || + (oldp->word_mode != preferences->word_mode) || + (oldp->line_mode != preferences->line_mode) || + (oldp->windows != preferences->windows) || + (oldp->horizontal_scrollbar != preferences->horizontal_scrollbar) || + (oldp->vertical_scrollbar != preferences->vertical_scrollbar) || + (oldp->encoding != preferences->encoding) || + (oldp->indent_spaces != preferences->indent_spaces) || #ifdef HAVE_LCD_BITMAP - (oldp->header_mode != newp->header_mode) || - (oldp->footer_mode != newp->footer_mode) || - (rb->strcmp(oldp->font_name, newp->font_name)) || + (oldp->header_mode != preferences->header_mode) || + (oldp->footer_mode != preferences->footer_mode) || + (rb->strcmp(oldp->font_name, preferences->font_name)) || #endif - (rb->strcmp(oldp->file_name, newp->file_name))) + (rb->strcmp(oldp->file_name, preferences->file_name))) { - for (i = listner_count - 1; i >= 0; i--) + for (i = 0; i < listner_count; i++) listners[i](oldp); } } -const struct tv_preferences *tv_get_preferences(void) +static void tv_check_header_and_footer(void) { - return &prefs; + if (rb->global_settings->statusbar != STATUSBAR_TOP) + { + if (preferences->header_mode == HD_SBAR) + preferences->header_mode = HD_NONE; + else if (preferences->header_mode == HD_BOTH) + preferences->header_mode = HD_PATH; + } + if (rb->global_settings->statusbar != STATUSBAR_BOTTOM) + { + if (preferences->footer_mode == FT_SBAR) + preferences->footer_mode = FT_NONE; + else if (preferences->footer_mode == FT_BOTH) + preferences->footer_mode = FT_PAGE; + } } void tv_set_preferences(const struct tv_preferences *new_prefs) { + static struct tv_preferences old_prefs; struct tv_preferences *oldp = NULL; - struct tv_preferences old_prefs; + static bool is_initialized = false; - if (!is_initialized) - is_initialized = true; - else - { - old_prefs = prefs; - oldp = &old_prefs; - } - rb->memcpy(&prefs, new_prefs, sizeof(struct tv_preferences)); - tv_notify_change_preferences(oldp, &prefs); + if (is_initialized) + tv_copy_preferences((oldp = &old_prefs)); + is_initialized = true; + + rb->memcpy(preferences, new_prefs, sizeof(struct tv_preferences)); + tv_check_header_and_footer(); + tv_notify_change_preferences(oldp); } void tv_copy_preferences(struct tv_preferences *copy_prefs) { - rb->memcpy(copy_prefs, &prefs, sizeof(struct tv_preferences)); + rb->memcpy(copy_prefs, preferences, sizeof(struct tv_preferences)); } void tv_set_default_preferences(struct tv_preferences *p) @@ -102,7 +115,6 @@ void tv_set_default_preferences(struct tv_preferences *p) p->page_mode = NO_OVERLAP; p->horizontal_scrollbar = SB_OFF; p->vertical_scrollbar = SB_OFF; - rb->memset(p->font_name, 0, MAX_PATH); #ifdef HAVE_LCD_BITMAP p->header_mode = HD_BOTH; p->footer_mode = FT_BOTH; -- cgit v1.2.3