% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % % 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 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % % 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.kernel_option { kernel_option.list xmenu.kernel_option .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 { 32+64bit_source not { 64bit { 64bit_source not { notimeout 32bit_popup } if } { 64bit_source { notimeout 64bit_popup } if } ifelse } if } 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 txt_linux 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 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 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % 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