summaryrefslogtreecommitdiffstats
path: root/common.inc
diff options
context:
space:
mode:
Diffstat (limited to 'common.inc')
-rw-r--r--common.inc1600
1 files changed, 1600 insertions, 0 deletions
diff --git a/common.inc b/common.inc
new file mode 100644
index 0000000..67ee788
--- /dev/null
+++ b/common.inc
@@ -0,0 +1,1600 @@
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Main part.
+%
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+% max command line length
+/cmdlinelength 512 def
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Install source is 64bit?
+%
+% ( ) ==> ( true|false )
+%
+/64bit_source {
+ % 64 bit dir exists and is != 32 bit dir
+ 64bit_boot_dir 32bit_boot_dir ne
+ 64bit_boot_dir .undef ne and
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Are we a dvd?
+%
+% ( ) ==> ( true|false )
+%
+/is_dvd {
+ % check only once
+ is_dvd.result .undef ne { is_dvd.result return } if
+
+ /is_dvd.result
+ mediatype m_cdrom eq {
+ 0x10 readsector
+ dup 0x50 add getdword exch free
+ 9 shr % iso size in MB
+ 720 gt % assume dvd if > 720 MB
+ } {
+ false
+ } ifelse
+ def
+
+ is_dvd.result return
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Install source is 32 & 64bit?
+%
+% ( ) ==> ( true|false )
+%
+/32+64bit_source {
+ 32bit_boot_dir .undef ne
+ % uncomment next line to automatically warn about 32bit software on 64bit machines, too
+ % 64bit_boot_dir .undef ne and
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Enough memory?
+%
+% ( ) ==> ( true|false )
+%
+/enough_mem {
+ biosmem 4 20 shl lt
+ biosmem livecd.mem.check 20 shl ge or
+ syslinux not or
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Check if there are boot directories for 32 & 64bit.
+%
+% Assumes 32bit to be in *i586* and 64bit in *x86_64*.
+%
+% ( ) ==> ( )
+%
+/check_arch_boot_dir {
+ getcwd dup .undef ne {
+ /64bit.tmp 256 string def
+
+ dup "i586" strstr 0 ne over "x86_64" strstr 0 ne or {
+ dup "i586" strstr {
+ /32bit_boot_dir exch def
+ /64bit_boot_dir 32bit_boot_dir "i586" "x86_64" strreplace
+ } {
+ /64bit_boot_dir exch def
+ /32bit_boot_dir 64bit_boot_dir "x86_64" "i586" strreplace
+ } ifelse
+
+ dup "%s/isolinux.cfg" 64bit.tmp sprintf
+ 64bit.tmp filesize .undef ne { def } { free pop } ifelse
+
+ } {
+ /32bit_boot_dir over def
+ /64bit_boot_dir exch def
+ } ifelse
+
+ 64bit.tmp free
+
+ % font.normal setfont
+ % 0 400 moveto 32bit_boot_dir print
+ % 0 420 moveto 64bit_boot_dir print dtrace
+
+ } {
+ pop
+ } ifelse
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% input event handling
+%
+% ( key ) ==> ( input_buffer menu_entry action )
+%
+% key
+% bit 0-7 ascii
+% bit 8-15 scan code
+% bit 16-32 status bits (ctrl, shift...)
+%
+% action
+% 0: ok, stay in input loop
+% 1: switch to text mode
+% >=2: start linux
+%
+/KeyEvent {
+ % timeout
+
+ dup 0 eq { boot.buf buildcmdline 2 return } if
+
+ debug 4 ge {
+ % print keycode somewhere
+ -1 settransparentcolor
+ black setcolor
+ 500 0 moveto dup print " " print
+ } if
+
+ dup 0xff00 and 16 shl over 0xff and dup 0xe0 eq { pop 0 } if add /key exch def
+ 16 shr 0xffff and /keystat exch def
+
+ key keyTab eq keyStatus statusShift and 0 ne and {
+ /key keyShiftTab def
+ } if
+
+ key
+
+ config.keymap { mapkey } if
+
+ dup 0xffffff and dup { exch } if pop
+
+ debug 4 ge {
+ % print mapped key somewhere
+ -1 settransparentcolor
+ black setcolor
+ 500 20 moveto dup print " " print
+ } if
+
+ % some special keys
+ debug.input
+
+ % put key through normal input queue
+ window.input
+
+ pop
+
+ window.action actExit eq {
+ /window.action actNothing def
+ "" -1 1 return
+ } if
+
+ window.action actCloseInfo eq {
+ /window.action actNothing def
+ % cd change dialog
+ info.type 5 eq info.type 6 eq or {
+ % 'chdir' triggers fs metadata re-read
+ getcwd dup .undef ne { chdir } { pop } ifelse
+ } if
+
+ "" -1 3 return
+ } if
+
+ window.action actPassword eq {
+ /window.action actNothing def
+ password.dialog {
+ password.dialog .ed.buffer.list get 0 get
+ } { "" } ifelse
+ -1 3 return
+ } if
+
+ window.action actStart eq {
+ /window.action actNothing def
+ /load_error false def
+
+ % some tricks to make it possible to review the complete command line
+ debug 3 ge xxx.cmdline .undef eq and {
+ /window.action actNothing def
+
+ boot.buf buildcmdline /xxx.menu exch def /xxx.cmdline exch def
+
+ /dia window.dialog def
+ dia .title "Kernel command line" put
+ dia .text "" put
+ % Must all be of same size!
+ dia .ed.list 1 array put
+ dia .ed.buffer.list [ xxx.cmdline ] put
+ dia .ed.text.list [ "All options\n" ] put
+
+ dia .ed.focus 0 put
+ dia .ed.width 600 put
+ dia .ed.font font.normal put
+ dia .buttons
+ [ button.ok button.default actStart button.setaction ]
+ put
+ dia window.init
+ dia window.show
+
+ boot.buf menu.entry 0
+ } {
+ xxx.cmdline .undef ne {
+ xxx.cmdline xxx.menu
+ /xxx.cmdline .undef def
+ } {
+ boot.buf buildcmdline
+ } ifelse
+ 2 return
+ } ifelse
+ } if
+
+ window.action actRedraw eq {
+ /window.action actNothing def
+ main.redraw
+ } if
+
+ window.action actRedrawPanel eq {
+ /window.action actNothing def
+ panel.show
+ } if
+
+ window.action actInstallOK eq {
+ /window.action actNothing def
+ install.ok
+ } if
+
+ window.action actInstallCancel eq {
+ /window.action actNothing def
+ install.cancel
+ } if
+
+ boot.buf menu.entry 0
+} def
+
+
+/bc.cmd cmdlinelength string def
+
+% ( option_string ) ==> ( cmdline menu_entry )
+%
+% grub:
+% just return
+%
+% syslinux & lilo:
+% check if the commmand line starts with the current kernel name or
+% "linux"; if not, put the kernel name in front of the command line. (This
+% is to keep compatibility with the old scheme requiring the user to write
+% the kernel name explicitly.)
+%
+/buildcmdline {
+ menu.entry 0 lt { -1 return } if
+ menu.entry menu.texts length ge { -1 return } if
+
+ /bc.opts exch def
+ /bc.kernel menu.texts menu.entry get def
+
+ grub {
+
+ /bc.addkernel false def
+
+ } {
+
+ /bc.addkernel true def
+
+ [ bc.kernel "linux" ] 0 over length 1 sub 1 exch {
+ over exch get
+
+ bc.opts over eq {
+ /bc.addkernel false def
+ } {
+ bc.opts over strstr 1 eq {
+ bc.opts over length get ' ' eq {
+ /bc.addkernel false def
+ } if
+ } if
+ } ifelse
+
+ pop
+
+ bc.addkernel not { exit } if
+
+ } for
+
+ pop
+
+ % special case: option is identical to label
+ bc.kernel "apic" eq
+ bc.kernel "noapic" eq or
+ bc.kernel "nolapic" eq or {
+ /bc.addkernel true def
+ } if
+
+ } ifelse
+
+ syslinux {
+ /add_suffix xmenu.bits .xm_current get bits.suffix exch get def
+
+ % set new working directory
+ xmenu.bits .xm_current get 1 eq { 64bit_boot_dir } { 32bit_boot_dir } ifelse
+ dup .undef ne {
+ dup getcwd ne { chdir } { pop } ifelse
+ } {
+ pop
+ } ifelse
+ } if
+
+ % getcwd 0 300 moveto show trace
+
+ bc.addkernel {
+ alt.kernel { alt.kernel } { bc.kernel } ifelse
+ dup "linux" eq add_suffix .undef ne and {
+ add_suffix exch "%s%s "
+ } {
+ "%s "
+ } ifelse
+ bc.cmd sprintf
+ } {
+ bc.cmd 0 0 put
+ } ifelse
+
+ /add_suffix 32 string def
+
+ cmdline.hidden "" ne {
+ add_suffix {
+ /bc.tmp cmdline.hidden length add_suffix length add string def
+ cmdline.hidden "initrd" bootopt.find dup .undef ne {
+ skipnonspaces
+ dup
+ dup 0 get over 0 0 put
+ add_suffix cmdline.hidden "%s%s" bc.tmp sprintf
+ 0 exch put
+ "%s" bc.tmp dup length add sprintf
+ } {
+ pop
+ bc.tmp cmdline.hidden strcpy pop
+ } ifelse
+
+ bc.tmp "%s " bc.cmd dup length add sprintf
+
+ bc.tmp free /bc.tmp .undef def
+ } {
+ cmdline.hidden "%s " bc.cmd dup length add sprintf
+ } ifelse
+
+ syslinux {
+ % find out initrd size for kernel loading progress bar
+ "initrd" filesize dup .undef ne {
+ sectorsize 1 sub add sectorsize div /progress_extra exch progress_extra add def
+ } {
+ pop
+ } ifelse
+ } if
+ } if
+
+ syslinux {
+
+ config.lang {
+ config.lang "en" ne {
+ config.lang "lang=%s " bc.cmd dup length add sprintf
+ } if
+ } if
+
+ } if
+
+ xmenu.dud {
+ dud.options xmenu.dud .xm_current get get dup "" ne {
+ "%s " bc.cmd dup length add sprintf
+ } { pop } ifelse
+ } if
+
+ xmenu.profile {
+ profile.options xmenu.profile .xm_current get get dup "" ne {
+ "%s " bc.cmd dup length add sprintf
+ } { pop } ifelse
+ } if
+
+ % complete cmdline
+ bc.cmd bc.opts strcat " " strcat pop
+
+ xmenu.install {
+ % remove all 'automatic' option
+ bc.cmd "automatic" bootopt.find .undef ne {
+ bc.cmd "automatic" bootopt.remove free
+ } if
+
+ install.option "" ne {
+ install.option "%s " bc.cmd dup length add sprintf
+ } if
+ } if
+
+ syslinux {
+ % remove all 'vga' option
+ bc.cmd "vga" bootopt.find .undef ne {
+ bc.cmd "vga" bootopt.remove free
+ } if
+
+ video.modes.list xmenu.video .xm_current get get
+
+ dup 0 ne {
+ "vga=%d " bc.cmd dup length add sprintf
+ } {
+ pop
+ } ifelse
+ } if
+
+ bc.cmd "driverupdate" bootopt.find dup .undef ne {
+ % exclude 'driverupdate=0 and driverupdate=1'
+ "driverupdate=" length get
+ dup '0' ne exch '1' ne and {
+
+ /bc.tmp bc.cmd "driverupdate" bootopt.remove def
+ bc.tmp .undef ne {
+ /bc.tmp bc.tmp "driverupdate=" length add ',' split bc.tmp free def
+ /bc.tmp2 cmdlinelength string def
+
+ bc.tmp2 "initrd=" strcpy pop
+
+ bc.tmp length 0 gt {
+ % add '+' to first arg unless it starts with '+' or '-'
+ bc.tmp 0 get 0 get
+ dup '-' eq { % remove '-'
+ bc.tmp 0 get dup 1 add strdup exch free
+ bc.tmp exch 0 exch put
+ pop '+'
+ } if
+ '+' ne { % add '+'
+ bc.tmp 0 get length 1 add string "+" strcat bc.tmp 0 get strcat
+ bc.tmp 0 get free bc.tmp exch 0 exch put
+ } if
+
+ bc.tmp length 1 sub -1 0 {
+ bc.tmp exch get
+ bc.tmp2 exch strcat "," strcat pop
+ } for
+ } if
+
+ bc.tmp dup { free } forall free
+
+ % last 'initrd' option
+ /bc.tmp .undef def
+ {
+ bc.cmd "initrd" bootopt.remove dup .undef ne {
+ bc.tmp free /bc.tmp exch def
+ } {
+ pop exit
+ } ifelse
+ } loop
+
+ % re-add new 'initrd' option
+ bc.tmp {
+ bc.tmp2 bc.tmp "initrd=" length add strcat pop
+ bc.tmp free
+ bc.cmd bc.tmp2 strcat " " strcat pop
+ } if
+ } if
+
+ } if
+ } { pop } ifelse
+
+ % remove final space
+ bc.cmd dropspaces
+
+ % getting menu.entry index based on menu.texts.real instead of menu.texts
+ % (cf filter_install_menu_items)
+ /menu.entry.real 0 def
+ 0 1 menu.texts.real length 1 sub {
+ dup menu.texts.real exch get bc.kernel eq { /menu.entry.real exch def exit } { pop } ifelse
+ } for
+
+ bc.cmd menu.entry.real
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% get rid of some entries
+% the resulting arrrays are malloced
+% ( menu_entries_array cmdline_args_array ) == > ( menu_entries_array cmdline_args_array )
+/filter_install_menu_items {
+ /tmp.args exch def
+ /tmp.texts exch def
+
+ /keep_it {
+ syslinux {
+ dup "alt0" eq
+ over "alt1" eq or
+ over "vgalo" eq or
+ over "vgahi" eq or
+ over "text" eq or
+ over "noacpi" eq or
+ } {
+ dup "linux-nonfb" eq
+ } ifelse
+ exch pop not
+ } def
+
+ 0
+ tmp.texts {
+ keep_it { 1 add } if
+ } forall
+ dup
+ array /menu.args exch def
+ array /menu.texts exch def
+
+ /tmp.i 0 def
+ /tmp.dest_i 0 def
+ tmp.texts {
+ keep_it {
+ menu.args tmp.dest_i tmp.args tmp.i get put
+ menu.texts tmp.dest_i tmp.texts tmp.i get put
+ /tmp.dest_i tmp.dest_i 1 add def
+ } if
+ /tmp.i tmp.i 1 add def
+ } forall
+
+ menu.texts menu.args
+} def
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( menu_entries_array cmdline_args_array defaultentry ) == > ( )
+/MenuInit {
+ bsplash.done
+
+ colorbits 8 le {
+ 0 setcolor 0 0 moveto screen.size fillrect loadpalette
+ } if
+
+ init
+
+ /menu.entry -1 def
+
+ /menu.dentry exch def
+ /menu.args.real exch def
+ /menu.texts.real exch def
+
+ menu.texts.real menu.args.real filter_install_menu_items
+ /menu.args exch def
+ /menu.texts exch def
+
+ window.main
+ dup window.init
+ window.show
+
+ syslinux {
+ enough_mem not livecd and {
+
+ notimeout nomem_popup
+
+ } {
+
+ 32+64bit_source not {
+
+ 64bit {
+ 64bit_source not { notimeout 32bit_popup } if
+ } {
+ 64bit_source { notimeout 64bit_popup } if
+ } ifelse
+
+ } if
+
+ } ifelse
+ } if
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Setup boot option input field.
+%
+% ( ) == > ( )
+%
+/bootoptions.init {
+ window.current .color.fg get setcolor
+ window.current .ed.font get setfont
+
+ boot.ed edit.hidecursor
+ menu.args menu.entry get
+ menu.texts menu.entry get
+ bootpromptmap
+
+ boot.show {
+ boot.ed over edit.init
+ "" ne { boot.ed ' ' edit.input } if
+ } {
+ "%s" boot.ed 3 get sprintf
+ } ifelse
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Split command line into hidden and normal part.
+%
+% ( cmdline_args menu_text ) == > ( new_cmdline_args )
+%
+% alt.kernel is set if a different kernel should be used (this feature should
+% no longer be needed).
+%
+/bootpromptmap {
+ /alt.kernel .undef def
+
+ syslinux {
+ dup "failsafe" eq
+ over "noacpi" eq or
+ over "noapic" eq or
+ over "nolapic" eq or
+ over "apic" eq or
+ over "manual" eq or
+ over "rescue" eq or
+ { /alt.kernel "linux" def } if
+ } if
+
+ pop
+
+ /cmdline exch def
+
+ cmdline "showopts" getoption
+ dup "" eq {
+ cmdline.shown 0 0 put
+ pop cmdline "%s" cmdline.shown sprintf
+ cmdline.hidden 0 0 put
+ } {
+ "showopts" length add skipspaces
+ "%s" cmdline.shown sprintf
+ cmdline "%s" cmdline.hidden sprintf
+ cmdline.hidden "showopts" getoption 0 0 put
+ } ifelse
+
+ cmdline.shown dropspaces
+ cmdline.hidden dropspaces
+
+ cmdline.shown
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Get boot option.
+%
+% ( cmdline option_name ) ==> ( option_start )
+%
+/getoption {
+ /go.name exch def
+ /go.cmdline exch def
+ /go.pos 0 def
+ {
+ go.cmdline go.pos add go.name strstr dup {
+ 1 sub /go.pos exch def
+
+ go.cmdline go.pos iswordboundary
+ go.cmdline go.pos go.name length add iswordboundary
+ and {
+ go.cmdline go.pos add exit
+ } {
+ /go.pos go.pos 1 add def
+ } ifelse
+ } {
+ pop "" exit
+ } ifelse
+ } loop
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+/redrawmenu {
+ menu.text.normal setcolor
+
+ /x menu.start.x def
+ /y menu.start.y def
+
+ 0 1 menu.visible.entries 1 sub {
+ x y moveto currentpoint menu.bar.width menu.bar.height image
+ x menu.text.xofs add y menu.text.yofs add moveto
+ menu.texts exch menu.shift add get menuitemmap
+ currentfont exch font.large setfont show setfont
+ /y y menu.item.height add def
+ } for
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( entry status ) ==> ( )
+%
+% status:
+% false not selected
+% true selected
+%
+/MenuSelect {
+ /menu.status exch def
+
+ /menu.idx over def
+
+ menu.shift sub
+ menu.item.height mul menu.start.y add
+ menu.start.x exch
+ moveto
+
+ currentpoint
+ menu.status {
+ menu.bar.color setcolor
+ currenttransparency
+ 70 settransparency
+ menu.bar.width menu.bar.height
+ fillrect
+ settransparency
+ } {
+ currentpoint menu.bar.width menu.bar.height image
+ } ifelse
+ moveto
+
+ menu.text.xofs menu.text.yofs rmoveto
+ menu.status {
+ menu.text.select
+ } {
+ menu.text.normal
+ } ifelse
+ setcolor
+ menu.texts menu.idx get menuitemmap
+ currentfont exch font.large setfont show setfont
+
+ menu.status {
+ % init boot options
+ keepbootoptions .undef eq { bootoptions.init } if
+
+ % set help context
+ "main" help.setcontext
+ menu.texts menu.idx get
+ dup help.findpage "" eq {
+ pop
+ } {
+ help.setcontext
+ } ifelse
+ } if
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( text errorcode ) ==> ( )
+% errorcode:
+% 0 normal info
+% 1 fatal error
+% 2 missing file
+% 3 disk change
+% 4 disk change failed
+% 5 ask for cd change
+% 6 change cd back to original
+%
+
+/info.tmpmsg 256 string def
+
+/InfoBoxInit {
+ /info.type exch def
+ /info.msg exch def
+
+ window.dialog
+
+ info.type 1 eq {
+ dup .title.bg red put
+ dup .title txt_error_title put
+ dup .buttons
+ [
+ button.reboot button.default actCloseInfo button.setaction
+ ] put
+ } {
+ dup .title txt_info_title put
+ dup .buttons
+ [
+ button.ok button.default actCloseInfo button.setaction
+% button.cancel button.notdefault actCloseInfo button.setaction
+ ] put
+ } ifelse
+
+ syslinux info.type 2 eq and {
+ dup .title "I/O Error" put
+ info.msg "File not found: %s" info.tmpmsg sprintf
+ /info.msg info.tmpmsg def
+ /load_error true def
+ } if
+
+ syslinux info.type 3 eq and {
+ dup .title txt_change_disk_title put
+ 0 getinfo 1 add txt_insert_disk info.tmpmsg sprintf
+ /info.msg info.tmpmsg def
+ } if
+
+ syslinux info.type 4 eq and {
+ dup .title txt_change_disk_title put
+ 1 getinfo 15 not and {
+ 0 getinfo 1 add
+ txt_insert_disk3 info.tmpmsg sprintf
+ } {
+ 0 getinfo 1 add 1 getinfo 1 add
+ txt_insert_disk2 info.tmpmsg sprintf
+ } ifelse
+ /info.msg info.tmpmsg def
+ } if
+
+ syslinux info.type 5 eq and {
+ dup .title "Driver Update" put
+ info.msg "Insert driver update CD-ROM for\n\"%s\"." info.tmpmsg sprintf
+ /info.msg info.tmpmsg def
+ } if
+
+ syslinux info.type 6 eq and {
+ dup .title "Driver Update" put
+ /info.msg "Put the Mandriva Linux CD-ROM back into the drive." def
+ } if
+
+ dup .text info.msg put
+
+ dup window.init
+ window.show
+
+} def
+
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+% progress bar code
+
+
+% Show percentage of progress bar.
+%
+% ( percentage ) ==> ( )
+%
+/progress.percent {
+ 0 max 100 min % so people don't ask silly questions...
+ "100%" strsize over neg progress.text.x add progress.text.y moveto
+ window.current .color.bg get setcolor
+ fillrect
+
+ "%3u%%" 8 dup string dup 5 1 roll snprintf
+
+ dup strsize pop neg progress.text.x add progress.text.y moveto
+ window.current .color.fg get setcolor
+ dup show
+ free
+
+} def
+
+
+% Show n-th progress bar symbol.
+%
+% ( n ) ==> ( )
+%
+/progress.sym.show {
+ /progress.sym.current exch def
+
+ progress.bar.x progress.bar.y moveto
+ progress.sym.width progress.sym.current 1 sub mul 1 add 1 rmoveto
+ progress.sym.width 2 sub
+ progress.bar.height 2 sub
+ loading_color setcolor
+ fillrect
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( kernel_name ) ==> ( )
+/ProgressInit {
+ /progress.kname exch def
+
+ boot.ed edit.hidecursor
+
+ /dia window.dialog def
+
+ dia .width.min 330 put
+ dia .position 10 put
+
+ dia .title txt_load_kernel_title put
+ dia .text
+ progress.kname "memtest" eq {
+ txt_load_memtest
+ } {
+ txt_load_kernel
+ } ifelse
+ put
+
+ dia window.init
+ dia window.show
+
+ % now add progress bar
+
+ dia .x get dia .y get moveto
+ dia .text.x get dia .text.y get 28 add rmoveto
+
+ /progress.bar.height 19 def
+ /progress.bar.width dia .width get 60 sub def
+
+ /progress.sym.width 10 def
+ /progress.bar.width
+ progress.bar.width progress.sym.width div
+ /progress.syms over def progress.sym.width mul
+ def
+
+ currentpoint over 1 sub over 2 sub moveto
+ black white progress.bar.width 2 add progress.bar.height 4 add drawborder
+
+ /progress.bar.y exch def
+ /progress.bar.x exch def
+
+ /progress.text.x progress.bar.x progress.bar.width 37 add add def
+ /progress.text.y progress.bar.y progress.bar.height fontheight sub 2 div add def
+
+ /progress.sym.current 0 def
+
+ 0 progress.percent
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( ) ==> ( )
+/ProgressDone {
+ window.done
+
+ load_error {
+ /load_error false def
+ boot.ed edit.showcursor
+ } if
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( max current ) ==> ( )
+%
+% Note: max is just kernel size (in sectors).
+%
+/ProgressUpdate {
+ exch progress_extra add exch
+
+ over over 100 mul exch 1 max div progress.percent
+
+ progress.syms mul progress.syms 2 div add exch 1 max div
+
+ 0 max progress.syms min
+
+ dup progress.sym.current gt {
+ progress.sym.current 1 add over 1 exch {
+ progress.sym.show
+ } for
+ } if
+ pop
+
+} def
+
+% initrd size (in sectors)
+/progress_extra 0 def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( time ) ==> ( )
+% /Timer { pop } def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( label correct_password ) ==> ( )
+%
+/PasswordInit {
+ /password.key exch def pop
+
+ /dia window.dialog def
+
+ /password.dialog dia def
+
+ dia .title txt_password_title put
+ dia .text "" put
+
+ % Must all be of same size!
+ dia .ed.list 1 array put
+ dia .ed.buffer.list [ 31 string ] put
+ dia .ed.text.list [ txt_password ] put
+
+ dia .ed.focus 0 put
+
+ dia .ed.width 200 put
+
+ dia .ed.font font.normal pwmode put
+
+ dia .buttons
+ [ button.ok button.default actPassword button.setaction ]
+ put
+
+ dia window.init
+ dia window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( password ) ==> ( error )
+%
+% error:
+% true password ok
+% false wrong password
+%
+% ****** FIXME: test result seems to be unused
+%
+/PasswordDone {
+
+ password.key eq
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( text ) == > ( new_text )
+/kernel_str 256 string def
+
+/menuitemmap {
+ translate
+ dup "memtest" eq over "memtest86" eq or { pop txt_memtest return } if
+ syslinux {
+ livecd {
+ dup "linux" eq { pop "Mandriva One (english)" return } if
+ dup "failsafe" eq { pop "LiveCD - Safe Settings" return } if
+ } {
+ dup "linux" eq { pop txt_install return } if
+ dup "failsafe" eq { pop txt_safe_install return } if
+ } ifelse
+ dup "live" eq { pop "Mandriva One" return } if
+ dup "noacpi" eq { pop txt_noacpi_install return } if
+ dup "noapic" eq { pop txt_noapic_install return } if
+ dup "nolapic" eq { pop txt_nolapic_install return } if
+ dup "apic" eq { pop txt_apic return } if
+ dup "manual" eq { pop txt_manual_install return } if
+ dup "rescue" eq { pop txt_rescue return } if
+ dup "hwcheck" eq { pop "Hardware Check" return } if
+ dup "harddisk" eq { pop txt_boot_harddisk return } if
+ } {
+ dup "linux" eq { pop txt_linux return } if
+ dup "failsafe" eq { pop txt_safe_linux return } if
+ dup "windows" eq { pop txt_windows return } if
+ dup "2.6" strstr 1 eq { txt_linux_kernel_version kernel_str sprintf
+ kernel_str return } if
+ } ifelse
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( color0 color1 width height ) ==> ( )
+/drawborder {
+ currentpoint /db.y0 exch def /db.x0 exch def
+
+ /db.y1 exch 1 sub db.y0 add def
+ /db.x1 exch 1 sub db.x0 add def
+ /db.col1 exch def
+ /db.col0 exch def
+
+ db.x0 db.y1 moveto
+
+ db.col0 setcolor
+ db.x0 db.y0 lineto db.x1 db.y0 lineto
+
+ db.col1 setcolor
+ db.x1 db.y1 lineto db.x0 db.y1 lineto
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( color0 color1 color2 width height ) ==> ( )
+% draw frame with shadow
+% color0: upper left, color1: lower right, color2: shadow
+/drawborder3 {
+ currentpoint /db.y0 exch def /db.x0 exch def
+
+ /db.y1 exch 1 sub db.y0 add def
+ /db.x1 exch 1 sub db.x0 add def
+ /db.col2 exch def
+ /db.col1 exch def
+ /db.col0 exch def
+
+ db.x0 db.y1 moveto
+
+ db.col0 setcolor
+ db.x0 db.y0 lineto db.x1 db.y0 lineto
+
+ db.col1 setcolor
+ db.x1 db.y1 lineto db.x0 db.y1 lineto
+
+ db.col2 -1 ne {
+ db.col2 setcolor
+ 1 1 rmoveto
+ db.x1 1 add db.y1 1 add lineto
+ db.x1 1 add db.y0 1 add lineto
+ } if
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% ( color0 color1 width height ) ==> ( )
+/drawborder4 {
+ 3 index 4 1 roll rot dup 3 index 3 index
+ currentpoint 6 2 roll
+ 1 1 rmoveto drawborder
+ moveto drawborder
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% center text
+% ( text width height ) ==> ( )
+/centertext {
+ 3 -1 roll strsize
+ 4 2 roll
+ 4 1 roll exch 4 1 roll sub 2 div neg 3 1 roll sub 2 div neg
+} def
+
+
+% Allocate and define a new color.
+%
+% ( palette ) ==> ( color )
+%
+/newcolor {
+ colorbits 8 le {
+ newcolor.count .undef eq { /newcolor.count 0 def } if
+ max_image_colors newcolor.count add
+ dup rot setpalette
+ /newcolor.count newcolor.count 1 add def
+ } if
+ def
+} def
+
+
+% ( img ) => ( width heigh )
+/imgsize {
+ dup .undef eq {
+ pop 0 0
+ } {
+ getdword dup
+ 0xffff and exch 16 shr
+ } ifelse
+} def
+
+
+% ( pic pic_a -- )
+/showlogo {
+ /tmp.sc over imgsize savescreen def
+
+ currentpoint 4 2 roll
+ 0 0 moveto tmp.sc blend
+ moveto tmp.sc restorescreen
+
+ tmp.sc free
+} def
+
+
+% ( file_name ) ==> ( image )
+/readimage {
+ findfile dup .undef ne {
+ dup setimage 0 0 image.size unpackimage exch free
+ } if
+} def
+
+
+/init {
+ 0 0 moveto currentpoint clip.size image
+
+ % set default language
+ "lang" findfile dup {
+ /tmp over length 1 add 2 max string def
+ tmp exch {
+ dup ' ' eq over '\n' eq or { pop pop exit } if
+ over exch 0 exch put
+ 1 add
+ } forall
+ tmp 2 0 put % only short locale name
+ tmp dup setlang pop setkeymap
+ } {
+ pop
+ "en" dup setlang pop setkeymap
+ } ifelse
+
+ font.large setfont
+
+ /menu.text.xofs 10 def
+ /menu.text.yofs 2 def
+ /menu.item.height fontheight dup 2 div add def
+ /menu.bar.height fontheight menu.text.yofs dup add add def
+
+ font.normal setfont
+
+ /menu.text.normal white def
+ /menu.text.select black def
+ /boot.text.options white def
+ /boot.text.normal white def
+ /infobox.bg lightgray def
+ /infobox.text.normal black def
+
+ /menu.bar.color white def
+
+ small_layout {
+ /frame1.pos { 120 110 } def
+ /frame1.width 400 def
+ } {
+ /frame1.pos { 170 250 } def
+ /frame1.width 500 def
+ } ifelse
+
+ /menu.start.x frame1.pos pop 10 add def
+ /menu.start.y frame1.pos exch pop 12 add def
+
+ /menu.bar.width frame1.width 20 sub def
+ /menu.max.entries 7 def
+
+ /boot.label.len 243 def
+
+ /boot.pos { boot.label.len 10 add small_layout { 380 } { 490 } ifelse } def
+
+ /boot.buf.size cmdlinelength def
+ /boot.buf boot.buf.size string def
+
+ % false: no boot options line initially
+ /boot.show false def
+
+ /update.pos {
+ clip.size pop txt_dud_ready strsize pop sub ptheme { 60 } { 20 } ifelse sub
+ clip.size exch pop ptheme { 100 } { 75 } ifelse sub
+ } def
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Some special debug & test keys.
+%
+% ( key_in ) ==> ( key_out )
+%
+/debug.input {
+ dup keyShiftF4 eq debug 3 ge and {
+ currentcolor black setcolor
+ currentpoint 0 0 moveto
+ 64 string biosmem "mem = %u " 2 index sprintf dup show free
+ moveto setcolor
+ pop 0
+ } if
+
+ dup keyShiftF3 eq syslinux and debug 3 ge and {
+ currentcolor black setcolor
+ currentpoint 0 0 moveto
+ "eject " print bootdrive eject print
+ moveto setcolor
+ pop 0
+ } if
+
+ dup keyShiftF5 eq syslinux and debug 3 ge and {
+ currentcolor black setcolor
+ currentpoint 100 0 moveto
+ bootdrive print
+ moveto setcolor
+ pop 0
+ } if
+
+ dup keyShiftF8 eq debug 3 ge and {
+ currentcolor debug 1 and { white } { black } ifelse setcolor
+
+ currentpoint 300 0 moveto
+ 0 memsize print "/" print print " " print
+ moveto
+
+ currentpoint 300 20 moveto
+ 1 memsize print "/" print print " " print
+ moveto
+
+ currentpoint 300 40 moveto
+ 2 memsize print "/" print print " " print
+ moveto
+
+ setcolor
+ pop 0
+ } if
+
+ dup keyShiftF9 eq debug 3 ge and {
+ dumpmem
+ pop 0
+ } if
+
+ dup keyShiftF10 eq {
+ /debug debug 1 add def ""
+ pop 0
+ } if
+
+ dup keyShiftF11 eq {
+ /transp transp 0x10 sub 0 max def
+
+ % /player 0 def
+ % player "hapyMandriva.mod" findfile mod.load
+ % 50 sound.setvolume
+ % player 0 mod.play
+ % /player player 1 add 3 and def
+
+ pop 0
+ } if
+
+ dup keyF11 eq debug 1 ge and {
+
+ 0 1 screen.size exch pop {
+ 0 1 screen.size pop {
+ over moveto
+ currentpoint 8 shl screen.size exch pop div 8 shl exch 8 shl screen.size pop div add
+ screen.size add currentpoint add sub 8 shl screen.size add div 2 div 16 shl add
+ setcolor
+ putpixel
+ } for
+ pop
+ } for
+
+ pop 0
+ } if
+
+ dup keyF12 eq debug 3 ge and {
+ % mouse support testing
+
+ 1 keepmode
+
+ /mouse xxx def
+ red setcolor
+ mouse .undef eq {
+ 700 580 moveto "no mouse" show
+ } {
+ {
+ mouse getdword 16 shl 16 shr screen.size pop 2 div add
+ mouse getdword 16 shr neg screen.size exch pop 2 div add
+ moveto 4 4 fillrect
+
+ mouse 4 add getdword 7 and
+ dup 1 and { red setcolor } if
+ dup 2 and { blue setcolor } if
+ dup 4 and { green setcolor } if
+
+ 3 and 3 eq { exit } if
+
+ } loop
+ } ifelse
+ pop 0
+ } if
+
+ dup keyShiftF12 eq {
+ /transp transp 0x10 add 0x100 min def
+ pop 0
+ } if
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Show exit popup.
+%
+% ( ) ==> ( )
+%
+/exit_popup {
+ window.dialog
+
+ dup .title txt_exit_title put
+ dup .text txt_exit_dialog put
+ dup .buttons [
+ button.ok button.default actExit button.setaction
+ button.cancel button.notdefault actNothing button.setaction
+ ] put
+ dup window.init
+ window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Show help window.
+%
+% ( ) ==> ( )
+%
+/show_help {
+ window.help
+
+ dup window.init
+ window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Show dvd popup.
+%
+% ( ) ==> ( )
+%
+/dvd_popup {
+ window.dialog
+
+ dup .title txt_dvd_warning_title put
+ dup .text txt_dvd_warning2 put
+ dup .buttons [
+% button.eject button.default actEject actNoClose or button.setaction
+ button.continue button.default actNothing button.setaction
+ ] put
+ dup window.init
+ window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Warn that we are about to install 32bit software on a 64bit system.
+%
+% ( ) ==> ( )
+%
+/32bit_popup {
+ window.dialog
+
+ dup .title "Warning" put
+ dup .text "You are about to install 32-bit software on a 64-bit computer." put
+ dup .buttons [
+ button.continue button.default actNothing button.setaction
+ ] put
+ dup window.init
+ window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Warn that we are about to install 64bit software on a 32bit system.
+%
+% ( ) ==> ( )
+%
+/64bit_popup {
+ window.dialog
+
+ dup .title "Wrong architecture" put
+ dup .text "This is a 32-bit computer. You cannot use 64-bit software on it." put
+ dup .buttons [
+ button.reboot button.default actReboot actNoClose or button.setaction
+ ] put
+ dup window.init
+ window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Warn that we don't have enough memory.
+%
+% ( ) ==> ( )
+%
+/nomem_popup {
+ window.dialog
+
+ dup .title "Not enough memory" put
+ dup .text
+ livecd.mem.show
+ "Sorry, but Mandriva needs at least %dMB main memory."
+ dup length 32 add string dup 4 1 roll sprintf
+ put
+ dup .buttons [
+ button.reboot button.default actReboot actNoClose or button.setaction
+ ] put
+ dup window.init
+ window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Show "power off" popup.
+%
+% ( ) ==> ( )
+%
+/power_off {
+ window.dialog
+
+ dup .title txt_power_off_title put
+ dup .text txt_power_off put
+ dup .buttons [
+ button.ok button.notdefault actPowerOff actNoClose or button.setaction
+ button.cancel button.default actNothing button.setaction
+ ] put
+ dup window.init
+ window.show
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Global variables.
+%
+
+/ptheme false def
+
+syslinux {
+ rand pop rand 4 shr 11 div 0xffff and
+ date weekday 5 lt { 15 } { 3 } ifelse
+ date month dup 12 eq exch 1 eq or { 1 add 2 div } if
+ mod 0 eq
+
+ date
+ dup 0x7d50c18 ge over 0x7d60101 le and
+ dup 0x7d50c12 eq or
+ dup 0x7d50c0b eq or
+ dup 0x7d50c06 eq or
+ dup 0x7d50c04 eq or
+ dup 0x7d50b1b eq or
+ exch pop or
+
+ 0x417 cvp getbyte 0x40 and 0 ne or
+ {
+ /ptheme true def
+ } if
+
+} if
+
+/ptheme false def
+
+/transp 0x30 def
+
+/testX { 0x417 cvp getbyte 0x10 and 0 ne } def
+
+testX { /ptheme false def } if
+
+800 600 16 findmode setmode not {
+ 800 600 32 findmode setmode not {
+ 640 480 16 findmode setmode not {
+ 640 480 32 findmode setmode not {
+ false .end
+ } if
+ } if
+ } if
+} if
+
+% /with_transp vscreen.size exch pop screen.size exch pop div 1 gt colorbits 8 gt and def
+
+/clip.size { screen.size } def
+
+/small_layout screen.size pop 640 eq def
+
+ptheme { "pback.jpg" } { "back.jpg" } ifelse findfile
+dup .undef eq { pop "back-low.jpg" findfile } if
+/background.file over def setimage loadpalette
+/max_image_colors image.colors def
+
+% 7 dup 0xffffff setpalette setcolor
+
+% color & font definitions must be global
+
+/black 0x000000 newcolor
+/white 0xffffff newcolor
+/blue 0x0000a0 newcolor
+/red 0xc00000 newcolor
+/green 0x009000 newcolor
+/yellow 0xffff20 newcolor
+/lightgray 0xd8deed newcolor
+/dotcolor 0xa9bbcd newcolor
+/lightdotcolor 0xeff2f6 newcolor
+/somegreen 0x78a424 newcolor
+
+/lightblue 0x7da3d1 def
+
+%% include theme_colors.inc
+
+/font.normal "16x16.fnt" findfile def
+/font.large font.normal def
+
+/cmdline.hidden cmdlinelength string def
+/cmdline.shown cmdlinelength string def
+
+/kroete.dir 0 def
+
+/debug 0 def
+
+ptheme small_layout or CapsLock or {
+ /bsplash.done { } def
+} {
+ bsplash.show
+} ifelse
+
+check_arch_boot_dir
+