forked from len0rd/rockbox
viewer.rock can now remembers the last 46 viewed files and their positions, bookmarks are in a seperate .dat now, so old bookmarks will be lost
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10992 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
fa9dee01bc
commit
09a990c4cf
1 changed files with 75 additions and 70 deletions
|
@ -24,6 +24,7 @@
|
||||||
PLUGIN_HEADER
|
PLUGIN_HEADER
|
||||||
|
|
||||||
#define SETTINGS_FILE "/.rockbox/viewers/viewer.dat" /* binary file, so dont use .cfg */
|
#define SETTINGS_FILE "/.rockbox/viewers/viewer.dat" /* binary file, so dont use .cfg */
|
||||||
|
#define BOOKMARKS_FILE "/.rockbox/viewers/viewer_bookmarks.dat"
|
||||||
|
|
||||||
#define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */
|
#define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */
|
||||||
#define MAX_COLUMNS 64 /* Max displayable string len (over-estimate) */
|
#define MAX_COLUMNS 64 /* Max displayable string len (over-estimate) */
|
||||||
|
@ -37,7 +38,7 @@ PLUGIN_HEADER
|
||||||
#define BOTTOM_SECTOR (buffer + 2*(SMALL_BLOCK_SIZE))
|
#define BOTTOM_SECTOR (buffer + 2*(SMALL_BLOCK_SIZE))
|
||||||
#define SCROLLBAR_WIDTH 6
|
#define SCROLLBAR_WIDTH 6
|
||||||
|
|
||||||
#define MAX_BOOKMARKED_FILES 10/*((signed)BUFFER_SIZE/(signed)sizeof(struct bookmarked_file_info))*/
|
#define MAX_BOOKMARKED_FILES (((signed)BUFFER_SIZE/(signed)sizeof(struct bookmarked_file_info))-1)
|
||||||
|
|
||||||
/* Out-Of-Bounds test for any pointer to data in the buffer */
|
/* Out-Of-Bounds test for any pointer to data in the buffer */
|
||||||
#define BUFFER_OOB(p) ((p) < buffer || (p) >= buffer_end)
|
#define BUFFER_OOB(p) ((p) < buffer || (p) >= buffer_end)
|
||||||
|
@ -168,11 +169,18 @@ PLUGIN_HEADER
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* stuff for the bookmarking */
|
||||||
struct bookmarked_file_info {
|
struct bookmarked_file_info {
|
||||||
long file_position;
|
long file_position;
|
||||||
int top_ptr_pos;
|
int top_ptr_pos;
|
||||||
char filename[MAX_PATH];
|
char filename[MAX_PATH];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct bookmark_file_data {
|
||||||
|
signed int bookmarked_files_count;
|
||||||
|
struct bookmarked_file_info bookmarks[];
|
||||||
|
};
|
||||||
|
|
||||||
struct preferences {
|
struct preferences {
|
||||||
enum {
|
enum {
|
||||||
WRAP=0,
|
WRAP=0,
|
||||||
|
@ -227,9 +235,7 @@ struct preferences {
|
||||||
} scroll_mode;
|
} scroll_mode;
|
||||||
|
|
||||||
int autoscroll_speed;
|
int autoscroll_speed;
|
||||||
/* stuff for the bookmarking */
|
|
||||||
signed int bookmarked_files_count;
|
|
||||||
struct bookmarked_file_info bookmarks[MAX_BOOKMARKED_FILES];
|
|
||||||
} prefs;
|
} prefs;
|
||||||
|
|
||||||
static unsigned char buffer[BUFFER_SIZE + 1];
|
static unsigned char buffer[BUFFER_SIZE + 1];
|
||||||
|
@ -1004,26 +1010,11 @@ static void viewer_reset_settings(void)
|
||||||
prefs.scrollbar_mode = SB_OFF;
|
prefs.scrollbar_mode = SB_OFF;
|
||||||
#endif
|
#endif
|
||||||
prefs.autoscroll_speed = 1;
|
prefs.autoscroll_speed = 1;
|
||||||
prefs.bookmarked_files_count = 0;
|
|
||||||
}
|
|
||||||
static int get_bookmarked_position(char* filename)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
if (prefs.bookmarked_files_count > MAX_BOOKMARKED_FILES)
|
|
||||||
prefs.bookmarked_files_count = MAX_BOOKMARKED_FILES;
|
|
||||||
|
|
||||||
for (i=0; i < prefs.bookmarked_files_count; i++)
|
|
||||||
{
|
|
||||||
if (!rb->strcmp(filename, prefs.bookmarks[i].filename))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void viewer_load_settings(void) /* same name as global, but not the same file.. */
|
static void viewer_load_settings(void) /* same name as global, but not the same file.. */
|
||||||
{
|
{
|
||||||
int settings_fd;
|
int settings_fd;
|
||||||
int bookmarked_pos;
|
|
||||||
|
|
||||||
settings_fd=rb->open(SETTINGS_FILE, O_RDONLY);
|
settings_fd=rb->open(SETTINGS_FILE, O_RDONLY);
|
||||||
if (settings_fd < 0)
|
if (settings_fd < 0)
|
||||||
|
@ -1039,21 +1030,61 @@ static void viewer_load_settings(void) /* same name as global, but not the same
|
||||||
|
|
||||||
rb->read(settings_fd, &prefs, sizeof(struct preferences));
|
rb->read(settings_fd, &prefs, sizeof(struct preferences));
|
||||||
rb->close(settings_fd);
|
rb->close(settings_fd);
|
||||||
|
settings_fd = rb->open(BOOKMARKS_FILE, O_RDONLY);
|
||||||
|
if (settings_fd >= 0)
|
||||||
|
{
|
||||||
|
struct bookmark_file_data *data = (struct bookmark_file_data*)buffer; /* grab the text buffer */
|
||||||
|
struct bookmark_file_data dummy;
|
||||||
|
int i;
|
||||||
|
data->bookmarked_files_count = 0;
|
||||||
|
rb->read(settings_fd, &data->bookmarked_files_count, sizeof(signed int)); /* figure out how many items to read */
|
||||||
|
if (data->bookmarked_files_count > MAX_BOOKMARKED_FILES)
|
||||||
|
data->bookmarked_files_count = MAX_BOOKMARKED_FILES; /* dump the older files */
|
||||||
|
rb->read(settings_fd, data->bookmarks,
|
||||||
|
sizeof(struct bookmarked_file_info) * data->bookmarked_files_count);
|
||||||
|
rb->close(settings_fd);
|
||||||
|
for (i=0; i < data->bookmarked_files_count; i++)
|
||||||
|
{
|
||||||
|
if (!rb->strcmp(file_name, data->bookmarks[i].filename))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i < data->bookmarked_files_count)
|
||||||
|
{
|
||||||
|
/* it is in the list, write everything back in the correct order, and reload the file correctly */
|
||||||
|
settings_fd = rb->creat(BOOKMARKS_FILE, O_WRONLY);
|
||||||
|
if (settings_fd >=0 )
|
||||||
|
{
|
||||||
|
if (data->bookmarked_files_count > MAX_BOOKMARKED_FILES)
|
||||||
|
data->bookmarked_files_count = MAX_BOOKMARKED_FILES; /* dump the older files */
|
||||||
|
rb->write (settings_fd, &data->bookmarked_files_count, sizeof(signed int));
|
||||||
|
/* write this item, then all up to it, then all after it */
|
||||||
|
rb->write (settings_fd, &data->bookmarks[i], sizeof(struct bookmarked_file_info));
|
||||||
|
rb->write (settings_fd, data->bookmarks, sizeof(struct bookmarked_file_info)*i);
|
||||||
|
rb->write (settings_fd, &data->bookmarks[i+1],
|
||||||
|
sizeof(struct bookmarked_file_info)*(data->bookmarked_files_count-i-1));
|
||||||
|
rb->close(settings_fd);
|
||||||
|
}
|
||||||
|
file_pos = data->bookmarks[i].file_position;
|
||||||
|
screen_top_ptr = buffer + data->bookmarks[i].top_ptr_pos;
|
||||||
|
}
|
||||||
|
else /* not in list, write the list to the file */
|
||||||
|
{
|
||||||
|
settings_fd = rb->creat(BOOKMARKS_FILE, O_WRONLY);
|
||||||
|
if (settings_fd >=0 )
|
||||||
|
{
|
||||||
|
if (++(data->bookmarked_files_count) > MAX_BOOKMARKED_FILES)
|
||||||
|
data->bookmarked_files_count = MAX_BOOKMARKED_FILES; /* dump the older files */
|
||||||
|
rb->write (settings_fd, &data->bookmarked_files_count, sizeof(signed int));
|
||||||
|
rb->PREFIX(lseek)(settings_fd,sizeof(struct bookmarked_file_info),SEEK_CUR);
|
||||||
|
// rb->memset(&dummy,0,sizeof(struct bookmarked_file_info)); /* the actual info will be written on exit */
|
||||||
|
//rb->write (settings_fd, &dummy, sizeof(struct bookmarked_file_info));
|
||||||
|
rb->write (settings_fd, data->bookmarks, sizeof(struct bookmarked_file_info)*(data->bookmarked_files_count-1));
|
||||||
|
rb->close(settings_fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* BOOKMARKS_FILE opened ok */
|
||||||
init_need_scrollbar();
|
init_need_scrollbar();
|
||||||
|
|
||||||
bookmarked_pos = get_bookmarked_position(file_name);
|
|
||||||
|
|
||||||
if (bookmarked_pos < 0)
|
|
||||||
{
|
|
||||||
file_pos = 0;
|
|
||||||
screen_top_ptr = buffer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
file_pos = prefs.bookmarks[bookmarked_pos].file_position;
|
|
||||||
screen_top_ptr = buffer + prefs.bookmarks[bookmarked_pos].top_ptr_pos;
|
|
||||||
}
|
|
||||||
buffer_end = BUFFER_END(); /* Update whenever file_pos changes */
|
buffer_end = BUFFER_END(); /* Update whenever file_pos changes */
|
||||||
|
|
||||||
if (BUFFER_OOB(screen_top_ptr)) {
|
if (BUFFER_OOB(screen_top_ptr)) {
|
||||||
|
@ -1062,52 +1093,26 @@ static void viewer_load_settings(void) /* same name as global, but not the same
|
||||||
|
|
||||||
fill_buffer(file_pos, buffer, BUFFER_SIZE);
|
fill_buffer(file_pos, buffer, BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
void viewer_rearrange_bookmarks(void)
|
|
||||||
{
|
|
||||||
int this_item = -1;
|
|
||||||
struct bookmarked_file_info *buf = (struct bookmarked_file_info*)buffer; /* grab the text buffer */
|
|
||||||
/* copy the bookmakred file list to the text buffer,
|
|
||||||
put this file at the top, then dump the filenames back and write to the fd */
|
|
||||||
rb->memcpy(buf,&prefs.bookmarks, sizeof(struct bookmarked_file_info)*MAX_BOOKMARKED_FILES);
|
|
||||||
this_item = get_bookmarked_position(file_name);
|
|
||||||
|
|
||||||
/* regardless of its position in the list, put it on top */
|
|
||||||
rb->strcpy(prefs.bookmarks[0].filename, file_name);
|
|
||||||
prefs.bookmarks[0].file_position = file_pos;
|
|
||||||
prefs.bookmarks[0].top_ptr_pos = screen_top_ptr - buffer;
|
|
||||||
|
|
||||||
if (this_item < 0)
|
|
||||||
{
|
|
||||||
/* not in the list yet, so put it first then dump the list back */
|
|
||||||
if (prefs.bookmarked_files_count == MAX_BOOKMARKED_FILES)
|
|
||||||
{
|
|
||||||
/* bookmark list is full! dump the lru file*/
|
|
||||||
rb->memcpy(&prefs.bookmarks[1],buf, sizeof(struct bookmarked_file_info)*(MAX_BOOKMARKED_FILES-1));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rb->memcpy(&prefs.bookmarks[1],buf, sizeof(struct bookmarked_file_info)*(prefs.bookmarked_files_count));
|
|
||||||
prefs.bookmarked_files_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* dump up to this item, skip 1 then dummp the rest */
|
|
||||||
rb->memcpy(&prefs.bookmarks[1],buf, sizeof(struct bookmarked_file_info)*(this_item));
|
|
||||||
rb->memcpy(&prefs.bookmarks[this_item+1],&buf[this_item+1],
|
|
||||||
sizeof(struct bookmarked_file_info)*(MAX_BOOKMARKED_FILES-this_item-1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void viewer_save_settings(void)/* same name as global, but not the same file.. */
|
static void viewer_save_settings(void)/* same name as global, but not the same file.. */
|
||||||
{
|
{
|
||||||
int settings_fd;
|
int settings_fd;
|
||||||
settings_fd = rb->creat(SETTINGS_FILE, O_WRONLY); /* create the settings file */
|
settings_fd = rb->creat(SETTINGS_FILE, O_WRONLY); /* create the settings file */
|
||||||
|
|
||||||
viewer_rearrange_bookmarks();
|
|
||||||
|
|
||||||
rb->write (settings_fd, &prefs, sizeof(struct preferences));
|
rb->write (settings_fd, &prefs, sizeof(struct preferences));
|
||||||
rb->close(settings_fd);
|
rb->close(settings_fd);
|
||||||
|
|
||||||
|
settings_fd = rb->open(BOOKMARKS_FILE, O_WRONLY|O_CREAT);
|
||||||
|
if (settings_fd >= 0 )
|
||||||
|
{
|
||||||
|
struct bookmarked_file_info b = {0,0,""};
|
||||||
|
b.file_position = file_pos;
|
||||||
|
b.top_ptr_pos = screen_top_ptr - buffer;
|
||||||
|
rb->strcpy(b.filename,file_name);
|
||||||
|
rb->PREFIX(lseek)(settings_fd,sizeof(signed int),SEEK_SET);
|
||||||
|
rb->write (settings_fd, &b, sizeof(struct bookmarked_file_info));
|
||||||
|
rb->close(settings_fd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void viewer_exit(void *parameter)
|
static void viewer_exit(void *parameter)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue