summaryrefslogtreecommitdiff
path: root/apps/viewer.c
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2003-06-29 16:33:04 +0000
committerBjörn Stenberg <bjorn@haxx.se>2003-06-29 16:33:04 +0000
commitba371fb595affd68c823926b85718d1d613dc7d3 (patch)
treecfda303d0603d623cdb12f3928905d3ae02f1d87 /apps/viewer.c
parent9bcbe3fd723d23a709873a0855f27b86bc5c96f1 (diff)
downloadrockbox-ba371fb595affd68c823926b85718d1d613dc7d3.zip
rockbox-ba371fb595affd68c823926b85718d1d613dc7d3.tar.gz
rockbox-ba371fb595affd68c823926b85718d1d613dc7d3.tar.bz2
rockbox-ba371fb595affd68c823926b85718d1d613dc7d3.tar.xz
Added plugin loader. Moved games, demos and the text viewer to loadable plugins. Copy your *.rock files to /.rockbox/rocks/
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3769 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/viewer.c')
-rw-r--r--apps/viewer.c432
1 files changed, 0 insertions, 432 deletions
diff --git a/apps/viewer.c b/apps/viewer.c
deleted file mode 100644
index f653866..0000000
--- a/apps/viewer.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/***************************************************************************
- *
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2002 Gilles Roux
- *
- * All files in this archive are subject to the GNU General Public License.
- * See the file COPYING in the source tree root for full license agreement.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdbool.h>
-
-#include "file.h"
-#include "lcd.h"
-#include "button.h"
-#include "kernel.h"
-#include "font.h"
-#include "settings.h"
-#include "icons.h"
-#include "screens.h"
-#include "status.h"
-
-
-#define BUFFER_SIZE 1024
-
-#define OUTSIDE_BUFFER -10
-#define OUTSIDE_FILE -11
-
-static int fd;
-static int file_size;
-
-static char buffer[BUFFER_SIZE+1];
-static int buffer_pos; /* Position of the buffer in the file */
-
-static char display_lines; /* number of lines on the display */
-static char display_columns; /* number of columns on the display */
-static int begin_line; /* Index of the first line displayed on the lcd */
-static int end_line; /* Index of the last line displayed on the lcd */
-static int begin_line_pos; /* Position of the first_line in the bufffer */
-static int end_line_pos; /* Position of the last_line in the buffer */
-
-/*
- * Known issue: The caching algorithm will fail (display incoherent data) if
- * the total space of the lines that are displayed on the screen exceeds the
- * buffer size (only happens with very long lines).
- */
-
-static void display_line_count(void)
-{
-#ifdef HAVE_LCD_BITMAP
- int w,h;
- lcd_getstringsize("M", &w, &h);
- display_lines = LCD_HEIGHT / h;
- display_columns = LCD_WIDTH / w;
-#else
- display_lines = 2;
- display_columns = 11;
-#endif
-}
-
-static int find_next_line(int pos)
-{
- int i;
-
- if (pos==OUTSIDE_BUFFER || pos==OUTSIDE_FILE)
- return pos;
-
- i = pos;
- if (buffer_pos+i>=file_size) {
- return OUTSIDE_FILE;
- }
- while (1) {
- i++;
- if (buffer_pos+i==file_size) {
- return i;
- }
- if (i>=BUFFER_SIZE) {
- return OUTSIDE_BUFFER;
- }
- if (buffer[i]==0) {
- return i;
- }
- }
-}
-
-static int find_prev_line(int pos)
-{
- int i;
-
- if (pos==OUTSIDE_BUFFER || pos==OUTSIDE_FILE)
- return pos;
-
- i = pos;
- if (buffer_pos+i<0) {
- return OUTSIDE_FILE;
- }
- while (1) {
- i--;
- if (buffer_pos+i<0) {
- return i;
- }
- if (i<0) {
- return OUTSIDE_BUFFER;
- }
- if (buffer[i]==0) {
- return i;
- }
- }
-}
-
-static void viewer_draw(int col)
-{
- int i, j;
- char* str;
- int line_pos;
-
- lcd_clear_display();
-
- line_pos = begin_line_pos;
-
- for (i=0; i <= end_line - begin_line; i++) {
- if (line_pos == OUTSIDE_BUFFER ||
- line_pos == OUTSIDE_FILE)
- break;
- str = buffer + line_pos + 1;
- for (j=0; j<col && *str!=0; ++j)
- str++;
- lcd_puts(0, i, str);
- line_pos = find_next_line(line_pos);
- }
-
- lcd_update();
-}
-
-static void fill_buffer(int pos)
-{
- int i;
- int numread;
-
- if (pos>=file_size-BUFFER_SIZE)
- pos = file_size-BUFFER_SIZE;
- if (pos<0)
- pos = 0;
-
- lseek(fd, pos, SEEK_SET);
- numread = read(fd, buffer, BUFFER_SIZE);
-
- begin_line_pos -= pos - buffer_pos;
- end_line_pos -= pos - buffer_pos;
- buffer_pos = pos;
-
- buffer[numread] = 0;
- for(i=0;i<numread;i++) {
- switch(buffer[i]) {
- case '\r':
- buffer[i] = ' ';
- break;
- case '\n':
- buffer[i] = 0;
- break;
- default:
- break;
- }
- }
-}
-
-static bool viewer_init(char* file)
-{
- int i;
- int ret;
-
- fd = open(file, O_RDONLY);
- if (fd==-1)
- return false;
-
- file_size = lseek(fd, 0, SEEK_END);
-
- buffer_pos = 0;
- begin_line = 0;
- begin_line_pos = -1;
- end_line = -1;
- end_line_pos = -1;
- fill_buffer(0);
- display_line_count();
- for (i=0; i<display_lines; ++i) {
- ret = find_next_line(end_line_pos);
- if (ret!=OUTSIDE_FILE && ret!=OUTSIDE_BUFFER) {
- end_line_pos = ret;
- end_line++;
- }
- }
-
- return true;
-}
-
-static void viewer_exit(void)
-{
- close(fd);
-}
-
-static void viewer_scroll_down(void)
-{
- int ret;
-
- ret = find_next_line(end_line_pos);
- switch ( ret ) {
- case OUTSIDE_BUFFER:
- begin_line_pos = find_next_line(begin_line_pos);
- fill_buffer(begin_line_pos+buffer_pos);
- end_line_pos = find_next_line(end_line_pos);
- break;
-
- case OUTSIDE_FILE:
- return;
-
- default:
- begin_line_pos = find_next_line(begin_line_pos);
- end_line_pos = ret;
- break;
- }
- begin_line++;
- end_line++;
-}
-
-static void viewer_scroll_up(void)
-{
- int ret;
-
- ret = find_prev_line(begin_line_pos);
- switch ( ret ) {
- case OUTSIDE_BUFFER:
- end_line_pos = find_prev_line(end_line_pos);
- fill_buffer(buffer_pos+end_line_pos-BUFFER_SIZE);
- begin_line_pos = find_prev_line(begin_line_pos);
- break;
-
- case OUTSIDE_FILE:
- return;
-
- default:
- end_line_pos = find_prev_line(end_line_pos);
- begin_line_pos = ret;
- break;
- }
- begin_line--;
- end_line--;
-}
-
-static int pagescroll(int col)
-{
- bool exit = false;
- int i;
-
- while (!exit) {
- switch (button_get(true)) {
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_ON | BUTTON_UP:
- case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT:
-#else
- case BUTTON_ON | BUTTON_LEFT:
- case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT:
-#endif
- for (i=0; i<display_lines; i++)
- viewer_scroll_up();
- break;
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_ON | BUTTON_DOWN:
- case BUTTON_ON | BUTTON_DOWN | BUTTON_REPEAT:
-#else
- case BUTTON_ON | BUTTON_RIGHT:
- case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT:
-#endif
- for (i=0; i<display_lines; i++)
- viewer_scroll_down();
- break;
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_ON | BUTTON_LEFT:
- case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT:
-#else
- case BUTTON_ON | BUTTON_MENU | BUTTON_LEFT:
- case BUTTON_ON | BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:
-#endif
- col -= display_columns;
- if (col < 0)
- col = 0;
- break;
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_ON | BUTTON_RIGHT:
- case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT:
-#else
- case BUTTON_ON | BUTTON_MENU | BUTTON_RIGHT:
- case BUTTON_ON | BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:
-#endif
- col += display_columns;
- break;
-
- case BUTTON_ON | BUTTON_REL:
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_ON | BUTTON_DOWN | BUTTON_REL:
- case BUTTON_ON | BUTTON_UP | BUTTON_REL:
-#else
- case BUTTON_ON | BUTTON_RIGHT | BUTTON_REL:
- case BUTTON_ON | BUTTON_LEFT | BUTTON_REL:
- case BUTTON_ON | BUTTON_MENU | BUTTON_RIGHT | BUTTON_REL:
- case BUTTON_ON | BUTTON_MENU | BUTTON_LEFT | BUTTON_REL:
-#endif
- exit = true;
- break;
- }
- if ( !exit )
- viewer_draw(col);
- }
-
- return col;
-}
-bool viewer_run(char* file)
-{
- bool exit=false;
- int button;
- int col = 0;
- int ok;
-
-#ifdef HAVE_LCD_BITMAP
- /* no margins */
- lcd_setmargins(0, 0);
-#endif
-
- ok = viewer_init(file);
- if (!ok) {
- lcd_clear_display();
- lcd_puts(0, 0, "Error");
- lcd_update();
- sleep(HZ);
- viewer_exit();
- return false;
- }
-
- viewer_draw(col);
- while (!exit) {
- button = button_get(true);
-
- switch ( button ) {
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_F1:
- case BUTTON_OFF:
-#else
- case BUTTON_STOP:
-#endif
- viewer_exit();
- exit = true;
- break;
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_UP:
- case BUTTON_UP | BUTTON_REPEAT:
-#else
- case BUTTON_LEFT:
- case BUTTON_LEFT | BUTTON_REPEAT:
-#endif
- viewer_scroll_up();
- viewer_draw(col);
- break;
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_DOWN:
- case BUTTON_DOWN | BUTTON_REPEAT:
-#else
- case BUTTON_RIGHT:
- case BUTTON_RIGHT | BUTTON_REPEAT:
-#endif
- viewer_scroll_down();
- viewer_draw(col);
- break;
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_LEFT:
- case BUTTON_LEFT | BUTTON_REPEAT:
-#else
- case BUTTON_MENU | BUTTON_LEFT:
- case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:
-#endif
- col--;
- if (col < 0)
- col = 0;
- viewer_draw(col);
- break;
-
-#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_RIGHT:
- case BUTTON_RIGHT | BUTTON_REPEAT:
-#else
- case BUTTON_MENU | BUTTON_RIGHT:
- case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:
-#endif
- col++;
- viewer_draw(col);
- break;
-
- case BUTTON_ON:
-#ifdef HAVE_PLAYER_KEYPAD
- case BUTTON_ON | BUTTON_MENU:
-#endif
- col = pagescroll(col);
- break;
-
- case SYS_USB_CONNECTED:
- usb_screen();
-#ifdef HAVE_LCD_CHARCELLS
- status_set_param(false);
-#endif
- viewer_exit();
- return true;
- }
- }
- return false;
-}