summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2002-10-02 11:37:37 +0000
committerBjörn Stenberg <bjorn@haxx.se>2002-10-02 11:37:37 +0000
commitf97594443d38bb34c63b653886247a64f4a2069f (patch)
treed2df5e3a1b8dc884d6cdade49d27eaa5863d910d
parent3a1d3623c4605f155816af943baf09e0a7db4ff6 (diff)
downloadrockbox-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
-rw-r--r--apps/viewer.c169
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;
42static char buffer[BUFFER_SIZE+1]; 42static char buffer[BUFFER_SIZE+1];
43static int buffer_pos; /* Position of the buffer in the file */ 43static int buffer_pos; /* Position of the buffer in the file */
44 44
45static char display_lines; /* number of lines on the display */
46static char display_columns; /* number of columns on the display */
45static int begin_line; /* Index of the first line displayed on the lcd */ 47static int begin_line; /* Index of the first line displayed on the lcd */
46static int end_line; /* Index of the last line displayed on the lcd */ 48static int end_line; /* Index of the last line displayed on the lcd */
47static int begin_line_pos; /* Position of the first_line in the bufffer */ 49static 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
56static int display_line_count(void) 58static 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
259static 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}
250bool viewer_run(char* file) 329bool 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