summaryrefslogtreecommitdiff
path: root/apps/plugins/text_viewer/tv_preferences.c
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-06-20 21:53:47 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-06-20 21:53:47 +0000
commit298316d19297eea82869b63235b535e5904fc0dd (patch)
tree0426e9c8cecac7532a88888e78e5e54ea9bb6145 /apps/plugins/text_viewer/tv_preferences.c
parent17a2f9d8d2dfddd8d2d81ff638e21302efef1c8e (diff)
downloadrockbox-298316d19297eea82869b63235b535e5904fc0dd.tar.gz
rockbox-298316d19297eea82869b63235b535e5904fc0dd.zip
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
Diffstat (limited to 'apps/plugins/text_viewer/tv_preferences.c')
-rw-r--r--apps/plugins/text_viewer/tv_preferences.c72
1 files changed, 42 insertions, 30 deletions
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 @@
23#include "plugin.h" 23#include "plugin.h"
24#include "tv_preferences.h" 24#include "tv_preferences.h"
25 25
26/* global preferences */
26static struct tv_preferences prefs; 27static struct tv_preferences prefs;
27static bool is_initialized = false; 28struct tv_preferences *preferences = &prefs;
29
28static int listner_count = 0; 30static int listner_count = 0;
29 31
30#define TV_MAX_LISTNERS 4 32#define TV_MAX_LISTNERS 4
31static void (*listners[TV_MAX_LISTNERS])(const struct tv_preferences *oldp); 33static void (*listners[TV_MAX_LISTNERS])(const struct tv_preferences *oldp);
32 34
33static void tv_notify_change_preferences(const struct tv_preferences *oldp, 35static void tv_notify_change_preferences(const struct tv_preferences *oldp)
34 const struct tv_preferences *newp)
35{ 36{
36 int i; 37 int i;
37 38
@@ -45,50 +46,62 @@ static void tv_notify_change_preferences(const struct tv_preferences *oldp,
45 * - autoscroll_speed 46 * - autoscroll_speed
46 * - narrow_mode 47 * - narrow_mode
47 */ 48 */
48 if ((oldp == NULL) || 49 if ((oldp == NULL) ||
49 (oldp->word_mode != newp->word_mode) || 50 (oldp->word_mode != preferences->word_mode) ||
50 (oldp->line_mode != newp->line_mode) || 51 (oldp->line_mode != preferences->line_mode) ||
51 (oldp->windows != newp->windows) || 52 (oldp->windows != preferences->windows) ||
52 (oldp->horizontal_scrollbar != newp->horizontal_scrollbar) || 53 (oldp->horizontal_scrollbar != preferences->horizontal_scrollbar) ||
53 (oldp->vertical_scrollbar != newp->vertical_scrollbar) || 54 (oldp->vertical_scrollbar != preferences->vertical_scrollbar) ||
54 (oldp->encoding != newp->encoding) || 55 (oldp->encoding != preferences->encoding) ||
55 (oldp->indent_spaces != newp->indent_spaces) || 56 (oldp->indent_spaces != preferences->indent_spaces) ||
56#ifdef HAVE_LCD_BITMAP 57#ifdef HAVE_LCD_BITMAP
57 (oldp->header_mode != newp->header_mode) || 58 (oldp->header_mode != preferences->header_mode) ||
58 (oldp->footer_mode != newp->footer_mode) || 59 (oldp->footer_mode != preferences->footer_mode) ||
59 (rb->strcmp(oldp->font_name, newp->font_name)) || 60 (rb->strcmp(oldp->font_name, preferences->font_name)) ||
60#endif 61#endif
61 (rb->strcmp(oldp->file_name, newp->file_name))) 62 (rb->strcmp(oldp->file_name, preferences->file_name)))
62 { 63 {
63 for (i = listner_count - 1; i >= 0; i--) 64 for (i = 0; i < listner_count; i++)
64 listners[i](oldp); 65 listners[i](oldp);
65 } 66 }
66} 67}
67 68
68const struct tv_preferences *tv_get_preferences(void) 69static void tv_check_header_and_footer(void)
69{ 70{
70 return &prefs; 71 if (rb->global_settings->statusbar != STATUSBAR_TOP)
72 {
73 if (preferences->header_mode == HD_SBAR)
74 preferences->header_mode = HD_NONE;
75 else if (preferences->header_mode == HD_BOTH)
76 preferences->header_mode = HD_PATH;
77 }
78 if (rb->global_settings->statusbar != STATUSBAR_BOTTOM)
79 {
80 if (preferences->footer_mode == FT_SBAR)
81 preferences->footer_mode = FT_NONE;
82 else if (preferences->footer_mode == FT_BOTH)
83 preferences->footer_mode = FT_PAGE;
84 }
71} 85}
72 86
73void tv_set_preferences(const struct tv_preferences *new_prefs) 87void tv_set_preferences(const struct tv_preferences *new_prefs)
74{ 88{
89 static struct tv_preferences old_prefs;
75 struct tv_preferences *oldp = NULL; 90 struct tv_preferences *oldp = NULL;
76 struct tv_preferences old_prefs; 91 static bool is_initialized = false;
77 92
78 if (!is_initialized) 93 if (is_initialized)
79 is_initialized = true; 94 tv_copy_preferences((oldp = &old_prefs));
80 else 95 is_initialized = true;
81 { 96
82 old_prefs = prefs; 97 rb->memcpy(preferences, new_prefs, sizeof(struct tv_preferences));
83 oldp = &old_prefs; 98 tv_check_header_and_footer();
84 } 99 tv_notify_change_preferences(oldp);
85 rb->memcpy(&prefs, new_prefs, sizeof(struct tv_preferences));
86 tv_notify_change_preferences(oldp, &prefs);
87} 100}
88 101
89void tv_copy_preferences(struct tv_preferences *copy_prefs) 102void tv_copy_preferences(struct tv_preferences *copy_prefs)
90{ 103{
91 rb->memcpy(copy_prefs, &prefs, sizeof(struct tv_preferences)); 104 rb->memcpy(copy_prefs, preferences, sizeof(struct tv_preferences));
92} 105}
93 106
94void tv_set_default_preferences(struct tv_preferences *p) 107void tv_set_default_preferences(struct tv_preferences *p)
@@ -102,7 +115,6 @@ void tv_set_default_preferences(struct tv_preferences *p)
102 p->page_mode = NO_OVERLAP; 115 p->page_mode = NO_OVERLAP;
103 p->horizontal_scrollbar = SB_OFF; 116 p->horizontal_scrollbar = SB_OFF;
104 p->vertical_scrollbar = SB_OFF; 117 p->vertical_scrollbar = SB_OFF;
105 rb->memset(p->font_name, 0, MAX_PATH);
106#ifdef HAVE_LCD_BITMAP 118#ifdef HAVE_LCD_BITMAP
107 p->header_mode = HD_BOTH; 119 p->header_mode = HD_BOTH;
108 p->footer_mode = FT_BOTH; 120 p->footer_mode = FT_BOTH;