summaryrefslogtreecommitdiffstats
path: root/src/menu.inc
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2009-01-27 17:30:08 +0000
committerPascal Rigaux <pixel@mandriva.com>2009-01-27 17:30:08 +0000
commit5ce8d30439463838f845c78bc926cc9b310a8743 (patch)
treebb1852dc58711c7baee31216a765067dfa49b65b /src/menu.inc
parent10658e71475bd964263d09f1a661f24fadfaf496 (diff)
downloadbootloader-theme-5ce8d30439463838f845c78bc926cc9b310a8743.tar
bootloader-theme-5ce8d30439463838f845c78bc926cc9b310a8743.tar.gz
bootloader-theme-5ce8d30439463838f845c78bc926cc9b310a8743.tar.bz2
bootloader-theme-5ce8d30439463838f845c78bc926cc9b310a8743.tar.xz
bootloader-theme-5ce8d30439463838f845c78bc926cc9b310a8743.zip
imported openSUSE.tar.bz2 (from gfxboot-4.1.19-2.1.src.rpm)4.1.19.1
Diffstat (limited to 'src/menu.inc')
-rw-r--r--src/menu.inc488
1 files changed, 488 insertions, 0 deletions
diff --git a/src/menu.inc b/src/menu.inc
new file mode 100644
index 0000000..d473cb8
--- /dev/null
+++ b/src/menu.inc
@@ -0,0 +1,488 @@
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Main menu (boot entry + boot options + panel).
+%
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+% max number of boot option input fields
+/boot.ed.max 2 def
+
+% boot option input line separator
+/boot.splitchar 1 def
+/boot.splitstr 1 string dup 0 boot.splitchar put def
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Create new main window.
+%
+% ( ) ==> ( window )
+%
+/window.main {
+ widget.size array
+ dup .type t_main put
+ dup .font font.normal put
+ dup .ed.font font.normal put
+ dup .color.fg boot.text.normal put
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Initialize main window.
+%
+% ( window ) ==> ( )
+%
+/main.init {
+ pop
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Redraw main window.
+% (E.g. after selecting a new language.)
+%
+% ( window ) ==> ( )
+%
+/main.redraw {
+
+ % boot.drawlabels
+
+ main.drawmenu
+ /keepbootoptions 1 def
+ menu.entry true MenuSelect
+ /keepbootoptions .undef def
+
+ panel.show
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Draw boot option input field labels.
+%
+% ( ) == > ( )
+%
+/boot.drawlabels {
+ boot.show not { return } if
+
+ boot.text.options setcolor
+ window.current .font get setfont
+ boot.ed.list {
+ dup .inp_x get 10 sub over .inp_y get moveto
+ currentpoint
+ currentpoint 0 exch moveto
+ currentpoint rot 1 add fontheight image
+ moveto
+ dup .inp_show get {
+ .inp_label get exec showright
+ } { pop } ifelse
+ } forall
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Setup boot option input field.
+%
+% ( ) == > ( )
+%
+/boot.input.setup {
+ % boot.show not { return } if
+
+ boot.ed.list {
+ dup .inp_x get over .inp_y get boot.ed.height add moveto
+
+ currentpoint boot.ed.width 2 image
+
+ currentcolor
+ currenttransparency
+
+ white setcolor
+ 0xe0 settransparency
+
+ 2 index .inp_show get {
+ boot.ed.width 2 fillrect
+ } if
+
+ settransparency
+ setcolor
+
+ pop
+
+ } forall
+} def
+
+
+/boot.input.preinit {
+
+ boot.ed.list { dup .inp_show false put .inp_buf get 0 0 put } forall
+
+ menu.args menu.entry get boot.splitchar split
+
+ 0 1 boot.ed.list length 1 sub {
+ over over aget dup .undef ne {
+ boot.ed.list rot get dup .inp_show true put .inp_buf get exch strcpy pop
+ } {
+ pop pop exit
+ } ifelse
+ } for
+
+ free
+
+ config.nobootoptions menu.texts menu.entry get iselement {
+ boot.ed.list 0 get .inp_show false put
+ } if
+
+ boot.ed.list { splitcmdline } forall
+
+} def
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Activate boot option input field.
+%
+% ( ) == > ( )
+%
+/bootoptions.init {
+ window.current .color.fg get setcolor
+ window.current .ed.font get setfont
+
+ boot.ed.list boot.window .ed.focus get get edit.hidecursor
+
+ boot.window .ed.focus 0 put
+
+ boot.show {
+ boot.ed.list {
+ dup .inp_show get {
+ dup
+ dup dup .inp_buf get exch over edit.init
+ "" ne { ' ' edit.input } { pop } ifelse
+ edit.hidecursor
+ } {
+ edit.done
+ } ifelse
+ } forall
+ boot.ed.list boot.window .ed.focus get get dup .inp_show get { edit.showcursor } { pop } ifelse
+
+ boot.ed.list {
+ dup .inp_show get .inp_visible exch put
+ } forall
+
+ } if
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Redraw boot option input field.
+%
+% ( ) == > ( )
+%
+/bootoptions.redraw {
+
+ % clear old options
+
+ boot.text.options setcolor
+ window.current .font get setfont
+ boot.ed.list {
+ dup .inp_x get 10 sub over .inp_y get moveto
+ currentpoint
+ currentpoint 0 exch moveto
+ currentpoint rot 1 add fontheight image
+ moveto
+ dup .inp_show get {
+ .inp_label get exec showright
+ } { pop } ifelse
+ } forall
+
+ boot.drawlabels
+ boot.input.setup
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Draw boot menu.
+%
+% No entry is marked as selected.
+%
+% ( ) == > ( )
+%
+/main.drawmenu {
+ menu.text.normal setcolor
+
+ /x menu.start.x def
+ /y menu.start.y def
+
+ /menu.bar.width.old menu.bar.width def
+
+ /menu.bar.width
+ menu.bar.min.width
+ menu.texts { menuitemmap strsize pop menu.text.xofs 2 mul add 2 add max } forall
+ def
+
+ 0 1 menu.visible.entries 1 sub {
+ x y moveto currentpoint menu.bar.width.old menu.bar.height image
+ x config.rtl { menu.bar.width menu.text.xofs sub } { menu.text.xofs } ifelse add
+ y menu.text.yofs add moveto
+ menu.texts exch menu.shift add get menuitemmap
+ currentfont exch font.large setfont show.rtl setfont
+ /y y menu.item.height add def
+ } for
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Select/deselect menu entry.
+%
+% If an entry is selected (status = true), the boot options input field is
+% initialized.
+%
+% ( entry status ) ==> ( )
+%
+% status:
+% false not selected
+% true selected
+%
+% Note: menu.bar.width must be valid even if status = false.
+%
+/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
+ menu.bar.transparency settransparency
+ menu.bar.width menu.bar.height
+ fillrect
+ settransparency
+ } {
+ currentpoint menu.bar.width menu.bar.height image
+ } ifelse
+ moveto
+
+ config.rtl { menu.bar.width menu.text.xofs sub } { menu.text.xofs } ifelse
+ menu.text.yofs rmoveto
+ menu.status {
+ menu.text.select
+ } {
+ menu.text.normal
+ } ifelse
+ setcolor
+ menu.texts menu.idx get menuitemmap
+ menu.status { config.talk { dup speak } if } if
+ currentfont exch font.large setfont show.rtl setfont
+
+ menu.status {
+ % init boot options
+ keepbootoptions .undef eq {
+
+ boot.input.preinit
+
+ false
+ boot.ed.list {
+ dup .inp_show get exch .inp_visible get xor or
+ } forall
+ {
+ boot.input.setup
+ boot.drawlabels
+ } if
+
+ bootoptions.init
+ } {
+ bootoptions.redraw
+ } ifelse
+
+ % set help context
+ "main" help.setcontext
+ menu.texts menu.idx get
+ dup help.findpage "" eq {
+ pop
+ } {
+ help.setcontext
+ } ifelse
+ } if
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Draw main window.
+%
+% ( window ) ==> ( )
+%
+/main.show {
+ window.push
+
+ /menu.shift 0 def
+ /menu.visible.entries menu.texts length menu.max.entries min def
+
+ % get index of default entry
+ /menu.entry 0 def
+ 0 1 menu.texts length 1 sub {
+ dup menu.texts exch get menu.dentry eq { /menu.entry exch def exit } { pop } ifelse
+ } for
+
+ menu.entry menu.visible.entries sub 0 ge {
+ /menu.shift menu.entry menu.texts length menu.visible.entries sub min def
+ } if
+
+ boot.text.options setcolor
+
+ window.current .font get setfont
+
+ /boot.ed.width screen.size pop boot.pos.x boot.pos.y pop sub ptheme { 60 } { 20 } ifelse sub def
+ /boot.ed.height fontheight 2 add def
+
+ /boot.window window.current def
+
+ /boot.ed.list [
+ 0 1 boot.ed.max 1 sub {
+ [
+ boot.pos.x boot.pos.y exch 10 add exch 1 sub 4 -1 roll boot.ed.height 5 add mul add
+ over over moveto boot.ed.width boot.ed.height savescreen
+ cmdlinelength string
+ cmdlinelength
+ .undef
+ cmdlinelength string
+ "More Options"
+ false
+ false
+ ]
+ } for
+ ] def
+
+ boot.ed.list 0 get .inp_label /txt_bootoptions put
+
+ boot.window .ed.list boot.ed.list put
+ boot.window .ed.focus 0 put
+
+ main.drawmenu
+
+ boot.drawlabels
+
+ menu.entry true MenuSelect
+
+ % find default splash mode
+ % 0 1 splash.options length 1 sub {
+ % splash.options over get menu.args menu.entry get exch strstr {
+ % /splash.default exch def
+ % } {
+ % pop
+ % } ifelse
+ % } for
+
+ panel.init
+
+ "main" help.setcontext
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Split command line into hidden and normal part.
+%
+% ( edit_object ) == > ( )
+%
+/splitcmdline {
+ dup length .inp_hidden le { pop return } if
+ dup .inp_hidden get .undef eq { pop return } if
+
+ dup .inp_hidden get over .inp_buf get strcpy pop
+
+ dup .inp_hidden get "showopts" bootopt.find dup {
+ dup "showopts" length add skipspaces
+ 2 index .inp_buf get exch strcpy dropspaces
+ 0 0 put
+ .inp_hidden get dropspaces
+ } {
+ pop dup .inp_hidden get 0 0 put
+ .inp_buf get dropspaces
+ } ifelse
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Handle keyboard input.
+%
+% ( key_in ) ==> ( key_out )
+%
+/main.input {
+ dup 0 eq { return } if
+
+ % handle panel entries
+ panel.input
+
+ dup keyF10 eq {
+ power_off
+ pop 0
+ } if
+
+ dup keyEsc eq { exit_popup pop 0 } if
+
+ dup keyEnter eq {
+ /window.action actStart def
+ pop 0
+ } if
+
+ dup keyUp eq {
+ menu.entry 0 gt {
+ menu.entry false MenuSelect
+ menu.entry menu.shift eq {
+ /menu.shift menu.shift 1 sub def main.drawmenu
+ } if
+ /menu.entry menu.entry 1 sub def
+ menu.entry true MenuSelect
+ } if
+ pop 0
+ } if
+
+ dup keyDown eq {
+ menu.entry menu.texts length 1 sub lt {
+ menu.entry false MenuSelect
+ menu.visible.entries menu.entry menu.shift sub sub 1 eq {
+ /menu.shift menu.shift 1 add def main.drawmenu
+ } if
+ /menu.entry menu.entry 1 add def
+ menu.entry true MenuSelect
+ } if
+ pop 0
+ } if
+
+ dup keyPgUp eq {
+ menu.entry 0 gt {
+ menu.entry false MenuSelect
+ /menu.entry 0 def
+ menu.shift 0 ne {
+ /menu.shift 0 def main.drawmenu
+ } if
+ menu.entry true MenuSelect
+ } if
+ pop 0
+ } if
+
+ dup keyPgDown eq {
+ menu.entry menu.texts length 1 sub lt {
+ menu.entry false MenuSelect
+ /menu.entry menu.texts length 1 sub def
+ menu.texts length menu.visible.entries sub dup menu.shift ne {
+ /menu.shift exch def main.drawmenu
+ } {
+ pop
+ } ifelse
+ menu.entry true MenuSelect
+ } if
+ pop 0
+ } if
+
+ dup 0 ne {
+ "opt" help.setcontext
+ } if
+
+} def
+
+