1
0
Fork 0
forked from len0rd/rockbox

Accept FS#5464 - organise the rocks directory.

If any plugins or "open with" optoins dont work please let me know...


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14214 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jonathan Gordon 2007-08-06 13:42:52 +00:00
parent 5b76936a44
commit fda7d720c0
29 changed files with 266 additions and 72 deletions

View file

@ -119,7 +119,6 @@ void tree_get_filetypes(const struct filetype** types, int* count)
struct file_type {
int icon; /* the icon which shall be used for it, NOICON if unknown */
bool viewer; /* true if the rock is in viewers, false if in rocks */
unsigned char attr; /* FILETYPES_MASK >> 8 */
char* plugin; /* Which plugin to use, NULL if unknown, or builtin */
char* extension; /* NULL for none */
@ -289,7 +288,6 @@ static void read_config(char* config_file)
{
char line[64], *s, *e;
char extension[8], plugin[32];
bool viewer;
int fd = open(config_file, O_RDONLY);
if (fd < 0)
return;
@ -314,24 +312,15 @@ static void read_config(char* config_file)
/* get the plugin */
s = e+1;
e = strchr(s, '/');
if (!e)
continue;
*e = '\0';
if (!strcasecmp("viewers", s))
viewer = true;
else
viewer = false;
s = e+1;
e = strchr(s, ',');
if (!e)
continue;
*e = '\0';
strcpy(plugin, s);
/* ok, store this plugin/extension, check icon after */
filetypes[filetype_count].extension = filetypes_strdup(extension);
filetypes[filetype_count].plugin = filetypes_strdup(plugin);
filetypes[filetype_count].viewer = viewer;
filetypes[filetype_count].attr = heighest_attr +1;
filetypes[filetype_count].icon = Icon_Questionmark;
heighest_attr++;
@ -422,8 +411,7 @@ char* filetype_get_plugin(const struct entry* file)
if (filetypes[index].plugin == NULL)
return NULL;
snprintf(plugin_name, MAX_PATH, "%s/%s.%s",
filetypes[index].viewer? VIEWERS_DIR: PLUGIN_DIR,
filetypes[index].plugin, ROCK_EXTENSION);
PLUGIN_DIR, filetypes[index].plugin, ROCK_EXTENSION);
return plugin_name;
}

View file

@ -10962,4 +10962,45 @@
*: "of"
</voice>
</phrase>
<phrase>
id: LANG_PLUGIN_GAMES
desc: in the main menu
user:
<source>
*: "Games"
</source>
<dest>
*: "Games"
</dest>
<voice>
*: "Games"
</voice>
</phrase>
<phrase>
id: LANG_PLUGIN_APPS
desc: in the main menu
user:
<source>
*: "Applications"
</source>
<dest>
*: "Applications"
</dest>
<voice>
*: "Applications"
</voice>
</phrase>
<phrase>
id: LANG_PLUGIN_DEMOS
desc: in the main menu
user:
<source>
*: "Demos"
</source>
<dest>
*: "Demos"
</dest>
<voice>
*: "Demos"
</voice>
</phrase>

View file

@ -116,7 +116,7 @@ MAKE_MENU(manage_settings, ID2P(LANG_MANAGE_MENU), NULL, Icon_Config,
static bool show_credits(void)
{
if (plugin_load(PLUGIN_DIR "/credits.rock",NULL) != PLUGIN_OK)
if (plugin_load(VIEWERS_DIR "/credits.rock",NULL) != PLUGIN_OK)
{
/* show the rockbox logo and version untill a button is pressed */
show_logo();

View file

@ -64,6 +64,8 @@ static int plugin_size = 0;
static bool (*pfn_tsr_exit)(bool reenter) = NULL; /* TSR exit callback */
static char current_plugin[MAX_PATH];
char *plugin_get_current_filename(void);
extern struct thread_entry threads[MAXTHREADS];
static const struct plugin_api rockbox_api = {
@ -125,6 +127,7 @@ static const struct plugin_api rockbox_api = {
font_get,
font_getstringsize,
font_get_width,
screen_clear_area,
#endif
backlight_on,
backlight_off,
@ -445,6 +448,7 @@ static const struct plugin_api rockbox_api = {
plugin_get_buffer,
plugin_get_audio_buffer,
plugin_tsr,
plugin_get_current_filename,
#ifdef IRAM_STEAL
plugin_iram_init,
#endif
@ -471,6 +475,8 @@ static const struct plugin_api rockbox_api = {
#endif
show_logo,
tree_get_context,
set_current_file,
set_dirfilter,
#ifdef HAVE_WHEEL_POSITION
wheel_status,
@ -494,13 +500,8 @@ static const struct plugin_api rockbox_api = {
codec_load_file,
get_codec_filename,
get_metadata,
#endif
#ifdef HAVE_LCD_BITMAP
screen_clear_area,
#endif
led,
set_current_file,
set_dirfilter,
};
int plugin_load(const char* plugin, void* parameter)
@ -734,3 +735,8 @@ void plugin_tsr(bool (*exit_callback)(bool))
{
pfn_tsr_exit = exit_callback; /* remember the callback for later */
}
char *plugin_get_current_filename(void)
{
return current_plugin;
}

View file

@ -112,12 +112,12 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
#define PLUGIN_API_VERSION 70
#define PLUGIN_API_VERSION 71
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
#define PLUGIN_MIN_API_VERSION 69
#define PLUGIN_MIN_API_VERSION 71
/* plugin return codes */
enum plugin_status {
@ -204,6 +204,8 @@ struct plugin_api {
int (*font_getstringsize)(const unsigned char *str, int *w, int *h,
int fontnumber);
int (*font_get_width)(struct font* pf, unsigned short char_code);
void (*screen_clear_area)(struct screen * display, int xstart, int ystart,
int width, int height);
#endif
void (*backlight_on)(void);
void (*backlight_off)(void);
@ -555,6 +557,7 @@ struct plugin_api {
void* (*plugin_get_buffer)(size_t *buffer_size);
void* (*plugin_get_audio_buffer)(size_t *buffer_size);
void (*plugin_tsr)(bool (*exit_callback)(bool reenter));
char* (*plugin_get_current_filename)(void);
#ifdef IRAM_STEAL
void (*plugin_iram_init)(char *iramstart, char *iramcopy, size_t iram_size,
char *iedata, size_t iedata_size);
@ -590,6 +593,8 @@ struct plugin_api {
#endif
int (*show_logo)(void);
struct tree_context* (*tree_get_context)(void);
void (*set_current_file)(char* path);
void (*set_dirfilter)(int l_dirfilter);
#ifdef HAVE_WHEEL_POSITION
int (*wheel_status)(void);
@ -614,14 +619,8 @@ struct plugin_api {
const char *(*get_codec_filename)(int cod_spec);
bool (*get_metadata)(struct track_info* track, int fd, const char* trackname,
bool v1first);
#endif
#ifdef HAVE_LCD_BITMAP
void (*screen_clear_area)(struct screen * display, int xstart, int ystart,
int width, int height);
#endif
void (*led)(bool on);
void (*set_current_file)(char* path);
void (*set_dirfilter)(int l_dirfilter);
};
/* plugin header */

91
apps/plugins/CATEGORIES Normal file
View file

@ -0,0 +1,91 @@
alpine_cdc,apps
battery_bench,apps
blackjack,games
bounce,demos
brickmania,games
bubbles,games
calculator,apps
calendar,apps
chessbox,games
chessclock,apps
chip8,viewers
chopper,games
clock,apps
credits,viewers
cube,demos
demystify,demos
dice,games
dict,apps
doom,games
disktidy,apps
euroconverter,apps
fire,demos
fireworks,demos
firmware_flash,apps
flipit,games
grayscale,demos
helloworld,demos
invadrox,games
iriver_flash,apps
iriverify,viewers
jackpot,games
jewels,games
jpeg,viewers
logo,demos
mandelbrot,games
maze,games
mazezam,games
mem_mon,apps
metronome,apps
midi2wav,viewers
midiplay,viewers
minesweeper,games
mosaique,demos
mp3_encoder,apps
mpegplayer,viewers
nim,games
oscilloscope,demos
pacbox,games
plasma,demos
pong,games
properties,viewers
random_folder_advance_config,apps
reversi,games
rockblox,games
rockbox_flash,viewers
rockboy,viewers
rocklife,games
rockpaint,apps
search,viewers
searchengine,viewers
shortcuts,viewers
sliding_puzzle,games
snake2,games
snake,games
snow,demos
sokoban,games
solitaire,games
sort,viewers
spacerocks,games
splitedit,apps
star,games
starfield,demos
stats,apps
stopwatch,apps
test_codec,viewers
test_disk,test
test_fps,test
test_sampr,test
test_scanrate,test
text_editor,apps
vbrfix,viewers
video,viewers
viewer,viewers
vu_meter,demos
wav2wv,viewers
wavplay,viewers
wavrecord,apps
wavview,viewers
wormlet,games
xobox,games
zxbox,viewers

View file

@ -24,8 +24,8 @@
PLUGIN_HEADER
/* save files */
#define SCORE_FILE PLUGIN_DIR "/blackjack.score"
#define SAVE_FILE PLUGIN_DIR "/blackjack.save"
#define SCORE_FILE PLUGIN_GAMES_DIR "/blackjack.score"
#define SAVE_FILE PLUGIN_GAMES_DIR "/blackjack.save"
#define NUM_SCORES LCD_HEIGHT/8-2

View file

@ -30,8 +30,8 @@
PLUGIN_HEADER
/* files */
#define SCORE_FILE PLUGIN_DIR "/bubbles.score"
#define SAVE_FILE PLUGIN_DIR "/bubbles.save"
#define SCORE_FILE PLUGIN_GAMES_DIR "/bubbles.score"
#define SAVE_FILE PLUGIN_GAMES_DIR "/bubbles.save"
/* final game return status */
#define BB_NONE 5

View file

@ -29,6 +29,6 @@ PLUGIN_HEADER
/* this is the plugin entry point */
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
return run_overlay(api, parameter, "/.rockbox/rocks/chessbox.ovl", "ChessBox");
return run_overlay(api, parameter, PLUGIN_GAMES_DIR "/chessbox.ovl", "ChessBox");
}
#endif

View file

@ -241,7 +241,7 @@ PLUGIN_HEADER
#define YOFS ((LCD_HEIGHT-8*TILE_HEIGHT)/2)
/* save files */
#define SAVE_FILE PLUGIN_DIR "/chessbox.save"
#define SAVE_FILE PLUGIN_GAMES_DIR "/chessbox.save"
/* commands enum */
#define COMMAND_NOP 0

View file

@ -78,7 +78,7 @@ struct clock_settings{
extern struct clock_settings clock_settings;
/* settings are saved to this location */
#define settings_filename "/.rockbox/rocks/.clock_settings"
#define settings_filename PLUGIN_GAMES_DIR "/.clock_settings"
void clock_settings_skin_next(struct clock_settings* settings);
void clock_settings_skin_previous(struct clock_settings* settings);

View file

@ -559,7 +559,7 @@ unsigned char fire_sprite[FIRE_HEIGHT] = {
#define TARGET_BOTTOM 3
#define TARGET_UFO 4
#define HISCOREFILE "/.rockbox/rocks/invadrox.high"
#define HISCOREFILE PLUGIN_GAMES_DIR "/invadrox.high"
/* The time (in ms) for one iteration through the game loop - decrease this

View file

@ -178,8 +178,8 @@ PLUGIN_HEADER
#endif
/* save files */
#define SCORE_FILE PLUGIN_DIR "/jewels.score"
#define SAVE_FILE PLUGIN_DIR "/jewels.save"
#define SCORE_FILE PLUGIN_GAMES_DIR "/jewels.score"
#define SAVE_FILE PLUGIN_GAMES_DIR "/jewels.save"
/* final game return status */
#define BJ_QUIT_FROM_GAME 4

View file

@ -26,6 +26,23 @@ void configfile_init(struct plugin_api* newrb)
cfg_rb = newrb;
}
void get_cfg_filename(char* buf, int buf_len, const char* filename)
{
char *s;
cfg_rb->strcpy(buf, cfg_rb->plugin_get_current_filename());
s = cfg_rb->strrchr(buf, '/');
if (!s) /* should never happen */
{
cfg_rb->snprintf(buf, buf_len, "/.rockbox/rocks/%s", filename);
}
else
{
s++;
*s = '\0';
cfg_rb->strcat(s, filename);
}
}
int configfile_save(const char *filename, struct configdata *cfg,
int num_items, int version)
{
@ -33,7 +50,7 @@ int configfile_save(const char *filename, struct configdata *cfg,
int i;
char buf[MAX_PATH];
cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename);
get_cfg_filename(buf, MAX_PATH, filename);
fd = cfg_rb->creat(buf);
if(fd < 0)
return fd*10 - 1;
@ -78,7 +95,7 @@ int configfile_load(const char *filename, struct configdata *cfg,
int file_version = -1;
int tmp;
cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename);
get_cfg_filename(buf, MAX_PATH, filename);
fd = cfg_rb->open(buf, O_RDONLY);
if(fd < 0)
return fd*10 - 1;

View file

@ -22,7 +22,7 @@
#include "plugin.h"
#define GAME_FILE PLUGIN_DIR "/reversi.rev"
#define GAME_FILE PLUGIN_GAMES_DIR "/reversi.rev"
/* variable button definitions */
#if CONFIG_KEYPAD == RECORDER_PAD

View file

@ -477,7 +477,7 @@ figures[BLOCKS_NUM] = {
};
/* Rockbox File System only supports full filenames inc dir */
#define HIGH_SCORE "/.rockbox/rocks/rockblox.score"
#define HIGH_SCORE PLUGIN_GAMES_DIR "/rockblox.score"
#define MAX_HIGH_SCORES 5
/* Default High Scores... */
struct highscore Highest[MAX_HIGH_SCORES];

View file

@ -29,6 +29,6 @@ PLUGIN_HEADER
/* this is the plugin entry point */
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
return run_overlay(api, parameter, "/.rockbox/viewers/rockboy.ovl", "RockBoy");
return run_overlay(api, parameter, PLUGIN_GAMES_DIR "/rockboy.ovl", "RockBoy");
}
#endif

View file

@ -130,7 +130,7 @@ PLUGIN_HEADER
#define COLOR_BROWN LCD_RGBPACK(128,64,0)
#define COLOR_LIGHTBROWN LCD_RGBPACK(255,128,64)
#define SPLASH_SCREEN PLUGIN_DIR "/rockpaint/splash.bmp"
#define SPLASH_SCREEN PLUGIN_APPS_DIR "/rockpaint/splash.bmp"
#define ROCKPAINT_TITLE_FONT 2
/***********************************************************************

View file

@ -321,8 +321,8 @@ extern const unsigned char snake2_bottom[];
#define SOUTH_EAST 2048
#define SOUTH_WEST 4096
#define LEVELS_FILE PLUGIN_DIR "/snake2.levels"
#define HISCORE_FILE PLUGIN_DIR "/snake2.hs"
#define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels"
#define HISCORE_FILE PLUGIN_GAMES_DIR "/snake2.hs"
int load_all_levels(void)
{

View file

@ -33,8 +33,8 @@ extern const fb_data sokoban_tiles[];
#define SOKOBAN_TITLE "Sokoban"
#define SOKOBAN_LEVELS_FILE PLUGIN_DIR "/sokoban.levels"
#define SOKOBAN_SAVE_FILE PLUGIN_DIR "/sokoban.save"
#define SOKOBAN_LEVELS_FILE PLUGIN_GAMES_DIR "/sokoban.levels"
#define SOKOBAN_SAVE_FILE PLUGIN_GAMES_DIR "/sokoban.save"
#define SOKOBAN_SAVE_FOLDER "/games"
/* Magnify is the number of pixels for each block.

View file

@ -162,7 +162,7 @@ static struct plugin_api* rb; /* global api struct pointer */
#define WRAP_GAP 12
#define EXPLOSION_LENGTH 20
#define SHOW_COL 0
#define HISCORE_FILE PLUGIN_DIR "/astrorocks.hs"
#define HISCORE_FILE PLUGIN_GAMES_DIR "/astrorocks.hs"
#define POINT_SIZE 2
#define MAX_NUM_ASTEROIDS 25
#define MAX_NUM_MISSILES 6

View file

@ -22,7 +22,7 @@
#include "plugin.h"
#define GAME_FILE PLUGIN_DIR "/sudoku.ss"
#define GAME_FILE PLUGIN_GAMES_DIR "/sudoku.ss"
/* variable button definitions */
#if CONFIG_KEYPAD == RECORDER_PAD

View file

@ -24,8 +24,8 @@
PLUGIN_HEADER
#define SETTINGS_FILE "/.rockbox/viewers/viewer.dat" /* binary file, so dont use .cfg */
#define BOOKMARKS_FILE "/.rockbox/viewers/viewer_bookmarks.dat"
#define SETTINGS_FILE PLUGIN_APPS_DIR "/viewer.dat" /* binary file, so dont use .cfg */
#define BOOKMARKS_FILE PLUGIN_APPS_DIR "/viewer_bookmarks.dat"
#define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */
#define MAX_COLUMNS 64 /* Max displayable string len (over-estimate) */

View file

@ -1,7 +1,7 @@
ch8,viewers/chip8,0
txt,viewers/viewer,1
nfo,viewers/viewer,1
txt,rocks/text_editor,2
txt,apps/text_editor,2
jpg,viewers/jpeg,2
jpe,viewers/jpeg,2
jpeg,viewers/jpeg,2
@ -17,15 +17,15 @@ m3u,viewers/iriverify,-
mid,viewers/midiplay,7
rmi,viewers/midiplay,7
rsp,viewers/searchengine,8
sok,rocks/sokoban,1
pgn,rocks/chessbox,1
ss,rocks/sudoku,1
sok,games/sokoban,1
pgn,games/chessbox,1
ss,games/sudoku,1
wav,viewers/wav2wv,-
wav,viewers/mp3_encoder,-
wav,viewers/wavplay,10
wav,viewers/wavview,10
wav,viewers/test_codec,-
bmp,rocks/rockpaint,11
bmp,apps/rockpaint,11
mpg,viewers/mpegplayer,4
mpeg,viewers/mpegplayer,4
iriver,viewers/iriver_flash,3
@ -34,6 +34,6 @@ sna,viewers/zxbox,12
tzx,viewers/zxbox,12
z80,viewers/zxbox,12
zzz,viewers/properties,-
colours,rocks/text_editor,11
ssg,rocks/superdom,-
link,rocks/shortcuts,-
colours,apps/text_editor,11
ssg,games/superdom,-
link,viewers/shortcuts,-

View file

@ -236,7 +236,7 @@ void calc_scales(void)
}
void load_settings(void) {
int fp = rb->open("/.rockbox/rocks/.vu_meter", O_RDONLY);
int fp = rb->open(PLUGIN_DEMOS_DIR "/.vu_meter", O_RDONLY);
if(fp>=0) {
rb->read(fp, &vumeter_settings, sizeof(struct saved_settings));
rb->close(fp);
@ -252,7 +252,7 @@ void load_settings(void) {
}
void save_settings(void) {
int fp = rb->creat("/.rockbox/rocks/.vu_meter");
int fp = rb->creat(PLUGIN_DEMOS_DIR "/.vu_meter");
if(fp >= 0) {
rb->write (fp, &vumeter_settings, sizeof(struct saved_settings));
rb->close(fp);

View file

@ -26,6 +26,6 @@ PLUGIN_HEADER
/* this is the plugin entry point */
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
return run_overlay(api, parameter, "/.rockbox/viewers/zxbox.ovl", "ZXBox");
return run_overlay(api, parameter, PLUGIN_APPS_DIR "/zxbox.ovl", "ZXBox");
}
#endif

View file

@ -279,6 +279,37 @@ static int load_bmarks(void* param)
bookmark_mrb_load();
return GO_TO_PREVIOUS;
}
static int plugins_menu(void* param)
{
(void)param;
MENUITEM_STRINGLIST(plugins_menu_items, ID2P(LANG_PLUGINS), NULL,
ID2P(LANG_PLUGIN_GAMES),
ID2P(LANG_PLUGIN_APPS), ID2P(LANG_PLUGIN_DEMOS));
char *folder;
int retval = GO_TO_PREVIOUS;
int selection = 0, current = 0;
while (retval == GO_TO_PREVIOUS)
{
selection = do_menu(&plugins_menu_items, &current);
switch (selection)
{
case 0:
folder = PLUGIN_GAMES_DIR;
break;
case 1:
folder = PLUGIN_APPS_DIR;
break;
case 2:
folder = PLUGIN_DEMOS_DIR;
break;
default:
return selection;
}
retval = rockbox_browse(folder, SHOW_PLUGINS);
}
return retval;
}
/* These are all static const'd from apps/menus/ *.c
so little hack so we can use them */
extern struct menu_item_ex
@ -308,7 +339,7 @@ static const struct root_items items[] = {
#endif
[GO_TO_RECENTBMARKS] = { load_bmarks, NULL, &bookmark_settings_menu },
[GO_TO_BROWSEPLUGINS] = { browser, (void*)GO_TO_BROWSEPLUGINS, NULL },
[GO_TO_BROWSEPLUGINS] = { plugins_menu, NULL, NULL },
};
static const int nb_items = sizeof(items)/sizeof(*items);

View file

@ -56,8 +56,13 @@
#define WPS_DIR ROCKBOX_DIR "/wps"
#define THEME_DIR ROCKBOX_DIR "/themes"
#define ICON_DIR ROCKBOX_DIR "/icons"
#define PLUGIN_DIR ROCKBOX_DIR "/rocks"
#define VIEWERS_DIR ROCKBOX_DIR "/viewers"
#define PLUGIN_DIR ROCKBOX_DIR "/rocks"
#define PLUGIN_GAMES_DIR PLUGIN_DIR "/games"
#define PLUGIN_APPS_DIR PLUGIN_DIR "/apps"
#define PLUGIN_DEMOS_DIR PLUGIN_DIR "/demos"
#define VIEWERS_DIR PLUGIN_DIR "/viewers"
#define BACKDROP_DIR ROCKBOX_DIR "/backdrops"
#define REC_BASE_DIR "/"
#define EQS_DIR ROCKBOX_DIR "/eqs"

View file

@ -213,6 +213,11 @@ sub buildzip {
mkdir ".rockbox/langs", 0777;
mkdir ".rockbox/rocks", 0777;
mkdir ".rockbox/rocks/games", 0777;
mkdir ".rockbox/rocks/apps", 0777;
mkdir ".rockbox/rocks/demos", 0777;
mkdir ".rockbox/rocks/viewers", 0777;
if ($recording) {
mkdir ".rockbox/recpresets", 0777;
}
@ -280,7 +285,7 @@ STOP
open VIEWERS, ">.rockbox/viewers.config" or
die "can't create .rockbox/viewers.config";
mkdir ".rockbox/viewers", 0777;
foreach my $line (@viewers) {
if ($line =~ /([^,]*),([^,]*),/) {
my ($ext, $plugin)=($1, $2);
@ -305,7 +310,7 @@ STOP
if($dir ne "rocks") {
# target is not 'rocks' but the plugins are always in that
# dir at first!
`mv .rockbox/rocks/$name .rockbox/$r`;
`mv .rockbox/rocks/$name .rockbox/rocks/$r`;
}
print VIEWERS $line;
}
@ -318,11 +323,22 @@ STOP
if(-e ".rockbox/rocks/$oname") {
# if there's an "overlay" file for the .rock, move that as
# well
`mv .rockbox/rocks/$oname .rockbox/$dir`;
`mv .rockbox/rocks/$oname .rockbox/rocks/$dir`;
}
}
}
close VIEWERS;
open CATEGORIES, "$ROOT/apps/plugins/CATEGORIES" or
die "can't open CATEGORIES";
@rock_targetdirs = <CATEGORIES>;
close CATEGORIES;
foreach my $line (@rock_targetdirs) {
if ($line =~ /([^,]*),(.*)/) {
my ($plugin, $dir)=($1, $2);
`mv .rockbox/rocks/${plugin}.rock .rockbox/rocks/$dir 2> /dev/null`;
}
}
if ($bitmap) {
mkdir ".rockbox/icons", 0777;
@ -335,8 +351,8 @@ STOP
`cp $ROOT/apps/tagnavi.config .rockbox/`;
if($bitmap) {
`cp $ROOT/apps/plugins/sokoban.levels .rockbox/rocks/`; # sokoban levels
`cp $ROOT/apps/plugins/snake2.levels .rockbox/rocks/`; # snake2 levels
`cp $ROOT/apps/plugins/sokoban.levels .rockbox/rocks/games/`; # sokoban levels
`cp $ROOT/apps/plugins/snake2.levels .rockbox/rocks/games/`; # snake2 levels
}
if($image) {