summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-06-23 13:56:08 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-06-23 13:56:08 +0000
commit59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55 (patch)
treeab90153c1106641d5973f43b727611d983d7a70f
parentcf9bba710297617f01c37b613b5ab9fcd97733e3 (diff)
downloadrockbox-59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55.tar.gz
rockbox-59fd2b24bd7ad8ff0c18f66ffbf83f7ceefa9d55.zip
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
-rw-r--r--apps/plugins/text_viewer/tv_action.c7
-rw-r--r--apps/plugins/text_viewer/tv_pager.c4
-rw-r--r--apps/plugins/text_viewer/tv_pager.h8
-rw-r--r--apps/plugins/text_viewer/tv_preferences.c26
-rw-r--r--apps/plugins/text_viewer/tv_preferences.h4
-rw-r--r--apps/plugins/text_viewer/tv_reader.c16
-rw-r--r--apps/plugins/text_viewer/tv_reader.h8
-rw-r--r--apps/plugins/text_viewer/tv_text_processor.c7
-rw-r--r--apps/plugins/text_viewer/tv_text_processor.h11
-rw-r--r--apps/plugins/text_viewer/tv_text_reader.c6
-rw-r--r--apps/plugins/text_viewer/tv_text_reader.h8
-rw-r--r--apps/plugins/text_viewer/tv_window.c54
-rw-r--r--apps/plugins/text_viewer/tv_window.h8
13 files changed, 115 insertions, 52 deletions
diff --git a/apps/plugins/text_viewer/tv_action.c b/apps/plugins/text_viewer/tv_action.c
index 546ee99842..88338feb1e 100644
--- a/apps/plugins/text_viewer/tv_action.c
+++ b/apps/plugins/text_viewer/tv_action.c
@@ -30,10 +30,15 @@
30 30
31bool tv_init(const unsigned char *file) 31bool tv_init(const unsigned char *file)
32{ 32{
33 size_t size;
34
35 /* get the plugin buffer */
36 unsigned char *buf = rb->plugin_get_buffer(&size);
37
33 tv_init_bookmark(); 38 tv_init_bookmark();
34 39
35 /* initialize modules */ 40 /* initialize modules */
36 if (!tv_init_window()) 41 if (!tv_init_window(&buf, &size))
37 return false; 42 return false;
38 43
39 /* load the preferences and bookmark */ 44 /* load the preferences and bookmark */
diff --git a/apps/plugins/text_viewer/tv_pager.c b/apps/plugins/text_viewer/tv_pager.c
index 0c109530f8..e7016c7fef 100644
--- a/apps/plugins/text_viewer/tv_pager.c
+++ b/apps/plugins/text_viewer/tv_pager.c
@@ -85,7 +85,7 @@ static void tv_change_preferences(const struct tv_preferences *oldp)
85 tv_seek(0, SEEK_SET); 85 tv_seek(0, SEEK_SET);
86} 86}
87 87
88bool tv_init_pager(void) 88bool tv_init_pager(unsigned char **buf, size_t *size)
89{ 89{
90 tv_set_screen_pos(&cur_pos); 90 tv_set_screen_pos(&cur_pos);
91 tv_add_preferences_change_listner(tv_change_preferences); 91 tv_add_preferences_change_listner(tv_change_preferences);
@@ -95,7 +95,7 @@ bool tv_init_pager(void)
95 95
96 line_pos[0] = 0; 96 line_pos[0] = 0;
97 97
98 return tv_init_reader(); 98 return tv_init_reader(buf, size);
99} 99}
100 100
101void tv_finalize_pager(void) 101void tv_finalize_pager(void)
diff --git a/apps/plugins/text_viewer/tv_pager.h b/apps/plugins/text_viewer/tv_pager.h
index ec1de24b5a..27795a1637 100644
--- a/apps/plugins/text_viewer/tv_pager.h
+++ b/apps/plugins/text_viewer/tv_pager.h
@@ -30,11 +30,17 @@
30/* 30/*
31 * initialize the pager module 31 * initialize the pager module
32 * 32 *
33 * [In/Out] buf
34 * the start pointer of the buffer
35 *
36 * [In/Out] size
37 * buffer size
38 *
33 * return 39 * return
34 * true initialize success 40 * true initialize success
35 * false initialize failure 41 * false initialize failure
36 */ 42 */
37bool tv_init_pager(void); 43bool tv_init_pager(unsigned char **buf, size_t *bufsize);
38 44
39/* finalize the pager module */ 45/* finalize the pager module */
40void tv_finalize_pager(void); 46void tv_finalize_pager(void);
diff --git a/apps/plugins/text_viewer/tv_preferences.c b/apps/plugins/text_viewer/tv_preferences.c
index b1045fba7d..ec59dd89a8 100644
--- a/apps/plugins/text_viewer/tv_preferences.c
+++ b/apps/plugins/text_viewer/tv_preferences.c
@@ -23,9 +23,10 @@
23#include "plugin.h" 23#include "plugin.h"
24#include "tv_preferences.h" 24#include "tv_preferences.h"
25 25
26/* global preferences */ 26
27static struct tv_preferences prefs; 27static struct tv_preferences prefs;
28struct tv_preferences *preferences = &prefs; 28/* read-only preferences pointer, for access by other files */
29const struct tv_preferences * const preferences = &prefs;
29 30
30static int listner_count = 0; 31static int listner_count = 0;
31 32
@@ -66,24 +67,6 @@ static void tv_notify_change_preferences(const struct tv_preferences *oldp)
66 } 67 }
67} 68}
68 69
69static void tv_check_header_and_footer(void)
70{
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 }
85}
86
87void tv_set_preferences(const struct tv_preferences *new_prefs) 70void tv_set_preferences(const struct tv_preferences *new_prefs)
88{ 71{
89 static struct tv_preferences old_prefs; 72 static struct tv_preferences old_prefs;
@@ -94,8 +77,7 @@ void tv_set_preferences(const struct tv_preferences *new_prefs)
94 tv_copy_preferences((oldp = &old_prefs)); 77 tv_copy_preferences((oldp = &old_prefs));
95 is_initialized = true; 78 is_initialized = true;
96 79
97 rb->memcpy(preferences, new_prefs, sizeof(struct tv_preferences)); 80 rb->memcpy(&prefs, new_prefs, sizeof(struct tv_preferences));
98 tv_check_header_and_footer();
99 tv_notify_change_preferences(oldp); 81 tv_notify_change_preferences(oldp);
100} 82}
101 83
diff --git a/apps/plugins/text_viewer/tv_preferences.h b/apps/plugins/text_viewer/tv_preferences.h
index 906f5c5f16..7705a1673a 100644
--- a/apps/plugins/text_viewer/tv_preferences.h
+++ b/apps/plugins/text_viewer/tv_preferences.h
@@ -122,9 +122,9 @@ struct tv_preferences {
122}; 122};
123 123
124/* 124/*
125 * global pointer to the preferences 125 * global pointer to the preferences (read-only)
126 */ 126 */
127extern struct tv_preferences *preferences; 127extern const struct tv_preferences * const preferences;
128 128
129/* 129/*
130 * change the preferences 130 * change the preferences
diff --git a/apps/plugins/text_viewer/tv_reader.c b/apps/plugins/text_viewer/tv_reader.c
index 4e91af9f98..8403c305af 100644
--- a/apps/plugins/text_viewer/tv_reader.c
+++ b/apps/plugins/text_viewer/tv_reader.c
@@ -170,18 +170,18 @@ static void tv_change_preferences(const struct tv_preferences *oldp)
170 tv_seek(cur_file_pos + cur_start_file_pos - start_file_pos, SEEK_SET); 170 tv_seek(cur_file_pos + cur_start_file_pos - start_file_pos, SEEK_SET);
171} 171}
172 172
173bool tv_init_reader(void) 173bool tv_init_reader(unsigned char **buf, size_t *size)
174{ 174{
175 size_t size; 175 if (*size < 2 * TV_MIN_BLOCK_SIZE)
176
177 /* get the plugin buffer */
178 reader_buffer = rb->plugin_get_buffer(&size);
179
180 if (size < 2 * TV_MIN_BLOCK_SIZE)
181 return false; 176 return false;
182 177
183 block_size = size / 2; 178 block_size = *size / 2;
184 buffer_size = 2 * block_size; 179 buffer_size = 2 * block_size;
180 reader_buffer = *buf;
181
182 *buf += buffer_size;
183 *size -= buffer_size;
184
185 tv_add_preferences_change_listner(tv_change_preferences); 185 tv_add_preferences_change_listner(tv_change_preferences);
186 186
187 return true; 187 return true;
diff --git a/apps/plugins/text_viewer/tv_reader.h b/apps/plugins/text_viewer/tv_reader.h
index 2ee0b828ab..0b079edddb 100644
--- a/apps/plugins/text_viewer/tv_reader.h
+++ b/apps/plugins/text_viewer/tv_reader.h
@@ -28,11 +28,17 @@
28/* 28/*
29 * initialize the reader module 29 * initialize the reader module
30 * 30 *
31 * [In/Out] buf
32 * the start pointer of the buffer
33 *
34 * [In/Out] size
35 * enabled buffer size
36 *
31 * return 37 * return
32 * true initialize success 38 * true initialize success
33 * false initialize failure 39 * false initialize failure
34 */ 40 */
35bool tv_init_reader(void); 41bool tv_init_reader(unsigned char **buf, size_t *bufsize);
36 42
37/* finalize the reader module */ 43/* finalize the reader module */
38void tv_finalize_reader(void); 44void tv_finalize_reader(void);
diff --git a/apps/plugins/text_viewer/tv_text_processor.c b/apps/plugins/text_viewer/tv_text_processor.c
index f9a2fad1f2..3ad388e6c5 100644
--- a/apps/plugins/text_viewer/tv_text_processor.c
+++ b/apps/plugins/text_viewer/tv_text_processor.c
@@ -544,11 +544,16 @@ int tv_create_formed_text(const unsigned char *src, ssize_t bufsize,
544 return size; 544 return size;
545} 545}
546 546
547void tv_init_text_processor(void) 547bool tv_init_text_processor(unsigned char **buf, size_t *size)
548{ 548{
549 /* unused : no need for dynamic buffer yet */
550 (void)buf;
551 (void)size;
552
549 text_type = TV_TEXT_UNKNOWN; 553 text_type = TV_TEXT_UNKNOWN;
550 expand_extra_line = false; 554 expand_extra_line = false;
551 is_break_line = false; 555 is_break_line = false;
556 return true;
552} 557}
553 558
554void tv_set_creation_conditions(int blocks, int width) 559void tv_set_creation_conditions(int blocks, int width)
diff --git a/apps/plugins/text_viewer/tv_text_processor.h b/apps/plugins/text_viewer/tv_text_processor.h
index 8a9de9075b..33e6a021f9 100644
--- a/apps/plugins/text_viewer/tv_text_processor.h
+++ b/apps/plugins/text_viewer/tv_text_processor.h
@@ -26,8 +26,17 @@
26/* 26/*
27 * initialize the text processor module 27 * initialize the text processor module
28 * 28 *
29 * [In/Out] buf
30 * the start pointer of the buffer
31 *
32 * [In/Out] size
33 * enabled buffer size
34 *
35 * return
36 * true initialize success
37 * false initialize failure
29 */ 38 */
30void tv_init_text_processor(void); 39bool tv_init_text_processor(unsigned char **buf, size_t *bufsize);
31 40
32/* 41/*
33 * set the processing conditions 42 * set the processing conditions
diff --git a/apps/plugins/text_viewer/tv_text_reader.c b/apps/plugins/text_viewer/tv_text_reader.c
index 53c8f6738f..ec1c138df0 100644
--- a/apps/plugins/text_viewer/tv_text_reader.c
+++ b/apps/plugins/text_viewer/tv_text_reader.c
@@ -29,11 +29,9 @@
29static int get_block; 29static int get_block;
30static bool get_double_blocks; 30static bool get_double_blocks;
31 31
32bool tv_init_text_reader(void) 32bool tv_init_text_reader(unsigned char **buf, size_t *size)
33{ 33{
34 tv_init_text_processor(); 34 return tv_init_text_processor(buf, size) && tv_init_pager(buf, size);
35
36 return tv_init_pager();
37} 35}
38 36
39void tv_finalize_text_reader(void) 37void tv_finalize_text_reader(void)
diff --git a/apps/plugins/text_viewer/tv_text_reader.h b/apps/plugins/text_viewer/tv_text_reader.h
index 50059c8b3c..5162892f4b 100644
--- a/apps/plugins/text_viewer/tv_text_reader.h
+++ b/apps/plugins/text_viewer/tv_text_reader.h
@@ -26,11 +26,17 @@
26/* 26/*
27 * initialize the text reader module 27 * initialize the text reader module
28 * 28 *
29 * [In/Out] buf
30 * the start pointer of the buffer
31 *
32 * [In/Out] size
33 * enabled buffer size
34 *
29 * return 35 * return
30 * true initialize success 36 * true initialize success
31 * false initialize failure 37 * false initialize failure
32 */ 38 */
33bool tv_init_text_reader(void); 39bool tv_init_text_reader(unsigned char **buf, size_t *bufsize);
34 40
35/* finalize the text reader module */ 41/* finalize the text reader module */
36void tv_finalize_text_reader(void); 42void tv_finalize_text_reader(void);
diff --git a/apps/plugins/text_viewer/tv_window.c b/apps/plugins/text_viewer/tv_window.c
index c733d5a088..f1f2033ef1 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)
67 return true; 67 return true;
68} 68}
69 69
70static bool tv_check_header_and_footer(struct tv_preferences *new_prefs)
71{
72 bool change_prefs = false;
73
74 if (rb->global_settings->statusbar != STATUSBAR_TOP)
75 {
76 if (new_prefs->header_mode == HD_SBAR)
77 {
78 new_prefs->header_mode = HD_NONE;
79 change_prefs = true;
80 }
81 else if (new_prefs->header_mode == HD_BOTH)
82 {
83 new_prefs->header_mode = HD_PATH;
84 change_prefs = true;
85 }
86 }
87 if (rb->global_settings->statusbar != STATUSBAR_BOTTOM)
88 {
89 if (new_prefs->footer_mode == FT_SBAR)
90 {
91 new_prefs->footer_mode = FT_NONE;
92 change_prefs = true;
93 }
94 else if (new_prefs->footer_mode == FT_BOTH)
95 {
96 new_prefs->footer_mode = FT_PAGE;
97 change_prefs = true;
98 }
99 }
100
101 return change_prefs;
102}
103
70static void tv_show_header(void) 104static void tv_show_header(void)
71{ 105{
72 unsigned header_mode = header_mode; 106 unsigned header_mode = header_mode;
@@ -259,6 +293,9 @@ static void tv_change_preferences(const struct tv_preferences *oldp)
259#ifdef HAVE_LCD_BITMAP 293#ifdef HAVE_LCD_BITMAP
260 static bool font_changing = false; 294 static bool font_changing = false;
261 const unsigned char *font_str; 295 const unsigned char *font_str;
296 bool change_prefs = false;
297 struct tv_preferences new_prefs;
298 tv_copy_preferences(&new_prefs);
262 299
263 font_str = (oldp && !font_changing)? oldp->font_name : rb->global_settings->font_file; 300 font_str = (oldp && !font_changing)? oldp->font_name : rb->global_settings->font_file;
264 301
@@ -268,14 +305,17 @@ static void tv_change_preferences(const struct tv_preferences *oldp)
268 font_changing = true; 305 font_changing = true;
269 if (!tv_set_font(preferences->font_name)) 306 if (!tv_set_font(preferences->font_name))
270 { 307 {
271 struct tv_preferences new_prefs;
272 tv_copy_preferences(&new_prefs);
273
274 rb->strlcpy(new_prefs.font_name, font_str, MAX_PATH); 308 rb->strlcpy(new_prefs.font_name, font_str, MAX_PATH);
275 tv_set_preferences(&new_prefs); 309 change_prefs = true;
276 return;
277 } 310 }
278 } 311 }
312
313 if (tv_check_header_and_footer(&new_prefs) || change_prefs)
314 {
315 tv_set_preferences(&new_prefs);
316 return;
317 }
318
279 font_changing = false; 319 font_changing = false;
280 320
281 /* calculates display lines */ 321 /* calculates display lines */
@@ -319,10 +359,10 @@ static void tv_change_preferences(const struct tv_preferences *oldp)
319 tv_set_read_conditions(preferences->windows, window_width); 359 tv_set_read_conditions(preferences->windows, window_width);
320} 360}
321 361
322bool tv_init_window(void) 362bool tv_init_window(unsigned char **buf, size_t *size)
323{ 363{
324 tv_add_preferences_change_listner(tv_change_preferences); 364 tv_add_preferences_change_listner(tv_change_preferences);
325 return tv_init_text_reader(); 365 return tv_init_text_reader(buf, size);
326} 366}
327 367
328void tv_finalize_window(void) 368void tv_finalize_window(void)
diff --git a/apps/plugins/text_viewer/tv_window.h b/apps/plugins/text_viewer/tv_window.h
index abf475ae2d..14eeb0820d 100644
--- a/apps/plugins/text_viewer/tv_window.h
+++ b/apps/plugins/text_viewer/tv_window.h
@@ -26,11 +26,17 @@
26/* 26/*
27 * initialize the window module 27 * initialize the window module
28 * 28 *
29 * [In/Out] buf
30 * the start pointer of the buffer
31 *
32 * [In/Out] size
33 * enabled buffer size
34 *
29 * return 35 * return
30 * true initialize success 36 * true initialize success
31 * false initialize failure 37 * false initialize failure
32 */ 38 */
33bool tv_init_window(void); 39bool tv_init_window(unsigned char **buf, size_t *bufsize);
34 40
35/* finalize the window module */ 41/* finalize the window module */
36void tv_finalize_window(void); 42void tv_finalize_window(void);