diff options
author | Björn Stenberg <bjorn@haxx.se> | 2002-10-02 11:37:37 +0000 |
---|---|---|
committer | Björn Stenberg <bjorn@haxx.se> | 2002-10-02 11:37:37 +0000 |
commit | f97594443d38bb34c63b653886247a64f4a2069f (patch) | |
tree | d2df5e3a1b8dc884d6cdade49d27eaa5863d910d /apps | |
parent | 3a1d3623c4605f155816af943baf09e0a7db4ff6 (diff) | |
download | rockbox-f97594443d38bb34c63b653886247a64f4a2069f.tar.gz rockbox-f97594443d38bb34c63b653886247a64f4a2069f.zip |
ON now acts as page scroll modifier. OFF/STOP exits.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2474 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/viewer.c | 169 |
1 files changed, 131 insertions, 38 deletions
diff --git a/apps/viewer.c b/apps/viewer.c index d986ce2dcf..1572cbef48 100644 --- a/apps/viewer.c +++ b/apps/viewer.c | |||
@@ -42,6 +42,8 @@ static int file_size; | |||
42 | static char buffer[BUFFER_SIZE+1]; | 42 | static char buffer[BUFFER_SIZE+1]; |
43 | static int buffer_pos; /* Position of the buffer in the file */ | 43 | static int buffer_pos; /* Position of the buffer in the file */ |
44 | 44 | ||
45 | static char display_lines; /* number of lines on the display */ | ||
46 | static char display_columns; /* number of columns on the display */ | ||
45 | static int begin_line; /* Index of the first line displayed on the lcd */ | 47 | static int begin_line; /* Index of the first line displayed on the lcd */ |
46 | static int end_line; /* Index of the last line displayed on the lcd */ | 48 | static int end_line; /* Index of the last line displayed on the lcd */ |
47 | static int begin_line_pos; /* Position of the first_line in the bufffer */ | 49 | static int begin_line_pos; /* Position of the first_line in the bufffer */ |
@@ -53,17 +55,16 @@ static int end_line_pos; /* Position of the last_line in the buffer */ | |||
53 | * buffer size (only happens with very long lines). | 55 | * buffer size (only happens with very long lines). |
54 | */ | 56 | */ |
55 | 57 | ||
56 | static int display_line_count(void) | 58 | static void display_line_count(void) |
57 | { | 59 | { |
58 | #ifdef HAVE_LCD_BITMAP | 60 | #ifdef HAVE_LCD_BITMAP |
59 | int fh; | 61 | int w,h; |
60 | fh = font_get(FONT_UI)->height; | 62 | lcd_getstringsize("M", &w, &h); |
61 | if (global_settings.statusbar) | 63 | display_lines = LCD_HEIGHT / h; |
62 | return (LCD_HEIGHT - STATUSBAR_HEIGHT) / fh; | 64 | display_columns = LCD_WIDTH / w; |
63 | else | ||
64 | return LCD_HEIGHT/fh; | ||
65 | #else | 65 | #else |
66 | return 2; | 66 | display_lines = 2; |
67 | display_columns = 11; | ||
67 | #endif | 68 | #endif |
68 | } | 69 | } |
69 | 70 | ||
@@ -127,11 +128,10 @@ static void viewer_draw(int col) | |||
127 | 128 | ||
128 | line_pos = begin_line_pos; | 129 | line_pos = begin_line_pos; |
129 | 130 | ||
130 | for (i=0; | 131 | for (i=0; i <= end_line - begin_line; i++) { |
131 | i<=end_line-begin_line && | 132 | if (line_pos == OUTSIDE_BUFFER || |
132 | line_pos!=OUTSIDE_BUFFER && | 133 | line_pos == OUTSIDE_FILE) |
133 | line_pos!=OUTSIDE_FILE; | 134 | break; |
134 | i++) { | ||
135 | str = buffer + line_pos + 1; | 135 | str = buffer + line_pos + 1; |
136 | for (j=0; j<col && *str!=0; ++j) | 136 | for (j=0; j<col && *str!=0; ++j) |
137 | str++; | 137 | str++; |
@@ -178,7 +178,6 @@ static bool viewer_init(char* file) | |||
178 | { | 178 | { |
179 | int i; | 179 | int i; |
180 | int ret; | 180 | int ret; |
181 | int disp_lines; | ||
182 | 181 | ||
183 | fd = open(file, O_RDONLY); | 182 | fd = open(file, O_RDONLY); |
184 | if (fd==-1) | 183 | if (fd==-1) |
@@ -192,8 +191,8 @@ static bool viewer_init(char* file) | |||
192 | end_line = -1; | 191 | end_line = -1; |
193 | end_line_pos = -1; | 192 | end_line_pos = -1; |
194 | fill_buffer(0); | 193 | fill_buffer(0); |
195 | disp_lines = display_line_count(); | 194 | display_line_count(); |
196 | for (i=0; i<disp_lines; ++i) { | 195 | for (i=0; i<display_lines; ++i) { |
197 | ret = find_next_line(end_line_pos); | 196 | ret = find_next_line(end_line_pos); |
198 | if (ret!=OUTSIDE_FILE && ret!=OUTSIDE_BUFFER) { | 197 | if (ret!=OUTSIDE_FILE && ret!=OUTSIDE_BUFFER) { |
199 | end_line_pos = ret; | 198 | end_line_pos = ret; |
@@ -214,15 +213,20 @@ static void viewer_scroll_down(void) | |||
214 | int ret; | 213 | int ret; |
215 | 214 | ||
216 | ret = find_next_line(end_line_pos); | 215 | ret = find_next_line(end_line_pos); |
217 | if (ret==OUTSIDE_BUFFER) { | 216 | switch ( ret ) { |
218 | begin_line_pos = find_next_line(begin_line_pos); | 217 | case OUTSIDE_BUFFER: |
219 | fill_buffer(begin_line_pos+buffer_pos); | 218 | begin_line_pos = find_next_line(begin_line_pos); |
220 | end_line_pos = find_next_line(end_line_pos); | 219 | fill_buffer(begin_line_pos+buffer_pos); |
221 | } else if (ret==OUTSIDE_FILE) { | 220 | end_line_pos = find_next_line(end_line_pos); |
222 | return; | 221 | break; |
223 | } else { | 222 | |
224 | begin_line_pos = find_next_line(begin_line_pos); | 223 | case OUTSIDE_FILE: |
225 | end_line_pos = ret; | 224 | return; |
225 | |||
226 | default: | ||
227 | begin_line_pos = find_next_line(begin_line_pos); | ||
228 | end_line_pos = ret; | ||
229 | break; | ||
226 | } | 230 | } |
227 | begin_line++; | 231 | begin_line++; |
228 | end_line++; | 232 | end_line++; |
@@ -233,31 +237,110 @@ static void viewer_scroll_up(void) | |||
233 | int ret; | 237 | int ret; |
234 | 238 | ||
235 | ret = find_prev_line(begin_line_pos); | 239 | ret = find_prev_line(begin_line_pos); |
236 | if (ret==OUTSIDE_BUFFER) { | 240 | switch ( ret ) { |
237 | end_line_pos = find_prev_line(end_line_pos); | 241 | case OUTSIDE_BUFFER: |
238 | fill_buffer(buffer_pos+end_line_pos-BUFFER_SIZE); | 242 | end_line_pos = find_prev_line(end_line_pos); |
239 | begin_line_pos = find_prev_line(begin_line_pos); | 243 | fill_buffer(buffer_pos+end_line_pos-BUFFER_SIZE); |
240 | } else if (ret==OUTSIDE_FILE) { | 244 | begin_line_pos = find_prev_line(begin_line_pos); |
241 | return; | 245 | break; |
242 | } else { | 246 | |
243 | end_line_pos = find_prev_line(end_line_pos); | 247 | case OUTSIDE_FILE: |
244 | begin_line_pos = ret; | 248 | return; |
249 | |||
250 | default: | ||
251 | end_line_pos = find_prev_line(end_line_pos); | ||
252 | begin_line_pos = ret; | ||
253 | break; | ||
245 | } | 254 | } |
246 | begin_line--; | 255 | begin_line--; |
247 | end_line--; | 256 | end_line--; |
248 | } | 257 | } |
249 | 258 | ||
259 | static int pagescroll(int col) | ||
260 | { | ||
261 | bool exit = false; | ||
262 | int i; | ||
263 | |||
264 | while (!exit) { | ||
265 | switch (button_get(true)) { | ||
266 | #ifdef HAVE_RECORDER_KEYPAD | ||
267 | case BUTTON_ON | BUTTON_UP: | ||
268 | case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT: | ||
269 | #else | ||
270 | case BUTTON_ON | BUTTON_LEFT: | ||
271 | case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT: | ||
272 | #endif | ||
273 | for (i=0; i<display_lines; i++) | ||
274 | viewer_scroll_up(); | ||
275 | break; | ||
276 | |||
277 | #ifdef HAVE_RECORDER_KEYPAD | ||
278 | case BUTTON_ON | BUTTON_DOWN: | ||
279 | case BUTTON_ON | BUTTON_DOWN | BUTTON_REPEAT: | ||
280 | #else | ||
281 | case BUTTON_ON | BUTTON_RIGHT: | ||
282 | case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT: | ||
283 | #endif | ||
284 | for (i=0; i<display_lines; i++) | ||
285 | viewer_scroll_down(); | ||
286 | break; | ||
287 | |||
288 | #ifdef HAVE_RECORDER_KEYPAD | ||
289 | case BUTTON_ON | BUTTON_LEFT: | ||
290 | case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT: | ||
291 | #else | ||
292 | case BUTTON_ON | BUTTON_MENU | BUTTON_LEFT: | ||
293 | case BUTTON_ON | BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT: | ||
294 | #endif | ||
295 | col -= display_columns; | ||
296 | if (col < 0) | ||
297 | col = 0; | ||
298 | break; | ||
299 | |||
300 | #ifdef HAVE_RECORDER_KEYPAD | ||
301 | case BUTTON_ON | BUTTON_RIGHT: | ||
302 | case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT: | ||
303 | #else | ||
304 | case BUTTON_ON | BUTTON_MENU | BUTTON_RIGHT: | ||
305 | case BUTTON_ON | BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT: | ||
306 | #endif | ||
307 | col += display_columns; | ||
308 | break; | ||
309 | |||
310 | case BUTTON_ON | BUTTON_REL: | ||
311 | #ifdef HAVE_RECORDER_KEYPAD | ||
312 | case BUTTON_ON | BUTTON_DOWN | BUTTON_REL: | ||
313 | case BUTTON_ON | BUTTON_UP | BUTTON_REL: | ||
314 | #else | ||
315 | case BUTTON_ON | BUTTON_RIGHT | BUTTON_REL: | ||
316 | case BUTTON_ON | BUTTON_LEFT | BUTTON_REL: | ||
317 | case BUTTON_ON | BUTTON_MENU | BUTTON_RIGHT | BUTTON_REL: | ||
318 | case BUTTON_ON | BUTTON_MENU | BUTTON_LEFT | BUTTON_REL: | ||
319 | #endif | ||
320 | exit = true; | ||
321 | break; | ||
322 | } | ||
323 | if ( !exit ) | ||
324 | viewer_draw(col); | ||
325 | } | ||
326 | |||
327 | return col; | ||
328 | } | ||
250 | bool viewer_run(char* file) | 329 | bool viewer_run(char* file) |
251 | { | 330 | { |
331 | bool exit=false; | ||
252 | int button; | 332 | int button; |
253 | int col = 0; | 333 | int col = 0; |
254 | int ok; | 334 | int ok; |
335 | int oldmask; | ||
255 | 336 | ||
256 | #ifdef HAVE_LCD_BITMAP | 337 | #ifdef HAVE_LCD_BITMAP |
257 | /* no margins */ | 338 | /* no margins */ |
258 | lcd_setmargins(0, 0); | 339 | lcd_setmargins(0, 0); |
259 | #endif | 340 | #endif |
260 | 341 | ||
342 | oldmask = button_set_release(~0); | ||
343 | |||
261 | ok = viewer_init(file); | 344 | ok = viewer_init(file); |
262 | if (!ok) { | 345 | if (!ok) { |
263 | lcd_clear_display(); | 346 | lcd_clear_display(); |
@@ -269,20 +352,19 @@ bool viewer_run(char* file) | |||
269 | } | 352 | } |
270 | 353 | ||
271 | viewer_draw(col); | 354 | viewer_draw(col); |
272 | while(1) { | 355 | while (!exit) { |
273 | button = button_get(true); | 356 | button = button_get(true); |
274 | 357 | ||
275 | switch ( button ) { | 358 | switch ( button ) { |
276 | 359 | ||
277 | #ifdef HAVE_RECORDER_KEYPAD | 360 | #ifdef HAVE_RECORDER_KEYPAD |
278 | case BUTTON_F1: | 361 | case BUTTON_F1: |
279 | case BUTTON_ON: | 362 | case BUTTON_OFF: |
280 | #else | 363 | #else |
281 | case BUTTON_STOP: | 364 | case BUTTON_STOP: |
282 | case BUTTON_ON: | ||
283 | #endif | 365 | #endif |
284 | viewer_exit(); | 366 | viewer_exit(); |
285 | return true; | 367 | exit = true; |
286 | break; | 368 | break; |
287 | 369 | ||
288 | #ifdef HAVE_RECORDER_KEYPAD | 370 | #ifdef HAVE_RECORDER_KEYPAD |
@@ -315,6 +397,8 @@ bool viewer_run(char* file) | |||
315 | case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT: | 397 | case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT: |
316 | #endif | 398 | #endif |
317 | col--; | 399 | col--; |
400 | if (col < 0) | ||
401 | col = 0; | ||
318 | viewer_draw(col); | 402 | viewer_draw(col); |
319 | break; | 403 | break; |
320 | 404 | ||
@@ -329,6 +413,13 @@ bool viewer_run(char* file) | |||
329 | viewer_draw(col); | 413 | viewer_draw(col); |
330 | break; | 414 | break; |
331 | 415 | ||
416 | case BUTTON_ON: | ||
417 | #ifdef HAVE_PLAYER_KEYPAD | ||
418 | case BUTTON_ON | BUTTON_MENU: | ||
419 | #endif | ||
420 | col = pagescroll(col); | ||
421 | break; | ||
422 | |||
332 | case SYS_USB_CONNECTED: | 423 | case SYS_USB_CONNECTED: |
333 | usb_screen(); | 424 | usb_screen(); |
334 | #ifdef HAVE_LCD_CHARCELLS | 425 | #ifdef HAVE_LCD_CHARCELLS |
@@ -338,5 +429,7 @@ bool viewer_run(char* file) | |||
338 | return true; | 429 | return true; |
339 | } | 430 | } |
340 | } | 431 | } |
432 | button_set_release(oldmask); | ||
433 | return false; | ||
341 | } | 434 | } |
342 | 435 | ||