Thursday, 7 August 2014

Add a 'Change Theme' menu to Easy2Boot

It is fairly easy to add a .mnu file which allows the user to choose a different background wallpaper:

title Change Wallpaper\n Choose a new E2B menu background
call /%grub%/pickafile.g4b /_ISO .gz
if "%CHOSEN%"=="" configfile (md)0xa000+0x50
splashimage /_ISO/%CHOSEN%
configfile (md)0xa000+0x50

The .gz files must contain a bitmap of exactly the correct resolution size - e.g. 800x600  (801x588 will NOT work!). The actual existing menu text and border positions, etc. is not changed however, so the images that you use should work with the same settings used by E2B as the default (or as used in your \_ISO\MyE2B.cfg file). So you will need to pick your images carefully (plain colour ones work best).

Today, devdevadev asked me if he could have a menu to switch between themes. You can use this to demo E2B, e.g. switch backgrounds, language, font, colours, etc.

A menu would prompt you to pick a .cfg file as shown below:

Here is the .mnu file that I came up with:

# Place all MyE2B.cfg and wallpaper files in \_ISO\mythemes and all rename .cfg files (amd any message GFXBoot file if more than one)
# Edit each \_ISO\mythemes\xx.cfg file so background or GFX has correct path
# e.g. set MYWBMPGZ=/_ISO/mythemes/stripedflat.bmp.gz  OR set GFX=mythemes/message  (note: no /_ISO/ for GFX path)
# Rename \_ISO\Sample_MyE2B.cfg to \_ISO\MyE2B.cfg (must be >1KB and larger than largest xxx.cfg file)
# For the default E2B theme, make a \_ISO\mythemes\Default_Theme.cfg file with just !BAT on the first line
# \_ISO\MyE2B.cfg file must be contiguous due to bug in grub4dos!

title Change Theme\n Choose a new E2B Theme

if not exist /_ISO/MyE2B.cfg echo ERROR: Please create a large \_ISO\MyE2B.cfg file && pause && configfile (md)0xa000+0x50
errorcheck on
debug normal
graphicsmode 3
echo Pick a Theme...
call /%grub%/pickafile.g4b /_ISO/mythemes .cfg
if "%CHOSEN%"=="" set DONEMENU= && configfile ()/%grub%/menu.lst
echo Overwriting \_ISO\MyE2B.cfg file with \_ISO\mythemes\%CHOSEN%...
# fill (rd) with 0's , 0x82d0 is rd-base mem address, Fn24 is memset - fill memory  <addr> <string> <size>
map (md)0x300+200 (rd) > nul ;; read 0x82d0 > nul ;; call Fn.24  %@retval% 0x20  102400 > nul  
dd if=(rd)+1 of=()/_ISO/MYE2B.cfg > nul
if exist ()/_ISO/mythemes/%CHOSEN% dd if=()/_ISO/mythemes/%CHOSEN% of=()/_ISO/MyE2B.cfg > nul
if exist ()/_ISO/mythemes/%CHOSEN% chainloader /grldr

I tested this using these files in the E2B \_ISO\mythemes folder :

The 'graphicsmode 3switch is required only if you use GFX Boot menus such as the sample Jolene_GFX.mnu. You can delete it if you don't have any GFXBoot .cfg files. If you do use GFXBoot menus, you will also need to copy all the \_ISO\docs\GFXSubMenu Files .mnu files into \_ISO\MAINMENU or else some menu entries will be missing from the GFXBoot menu when selected (this applies to any GFXBoot menu).

Both .mnu files will be in the Sample mnu Files folder in v1.55 of E2B and I will also put them in the Alternate Download area for a while too.

v1.55 will have the mythemes folder and a selection of .cfg files to choose from. You will just need to copy a $Default E2B Menu.cfg file to \_ISO\MyE2B.cfg and the .mnu file to \_ISO\MAINMENU.

Notes: due to a bug I just discovered in grub4dos, make sure you run WinContig on the E2B drive to make all files contiguous. It seems there is a problem with grub4dos and NTFS volumes if this is not done (if the target file is fragmented, then only the first 8096 bytes are actually copied when using dd on some files!).

And due to another bug, the full path for the bitmap file needs to be kept shorter than approx 64 characters as the splashimage command cannot handle long pathnames!