diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-20 21:53:47 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-20 21:53:47 +0000 |
commit | 298316d19297eea82869b63235b535e5904fc0dd (patch) | |
tree | 0426e9c8cecac7532a88888e78e5e54ea9bb6145 /apps/plugins/text_viewer/tv_preferences.c | |
parent | 17a2f9d8d2dfddd8d2d81ff638e21302efef1c8e (diff) | |
download | rockbox-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.c | 72 |
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 */ | ||
26 | static struct tv_preferences prefs; | 27 | static struct tv_preferences prefs; |
27 | static bool is_initialized = false; | 28 | struct tv_preferences *preferences = &prefs; |
29 | |||
28 | static int listner_count = 0; | 30 | static int listner_count = 0; |
29 | 31 | ||
30 | #define TV_MAX_LISTNERS 4 | 32 | #define TV_MAX_LISTNERS 4 |
31 | static void (*listners[TV_MAX_LISTNERS])(const struct tv_preferences *oldp); | 33 | static void (*listners[TV_MAX_LISTNERS])(const struct tv_preferences *oldp); |
32 | 34 | ||
33 | static void tv_notify_change_preferences(const struct tv_preferences *oldp, | 35 | static 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 | ||
68 | const struct tv_preferences *tv_get_preferences(void) | 69 | static 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 | ||
73 | void tv_set_preferences(const struct tv_preferences *new_prefs) | 87 | void 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 | ||
89 | void tv_copy_preferences(struct tv_preferences *copy_prefs) | 102 | void 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 | ||
94 | void tv_set_default_preferences(struct tv_preferences *p) | 107 | void 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; |