diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2009-01-27 17:30:08 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2009-01-27 17:30:08 +0000 |
commit | 5ce8d30439463838f845c78bc926cc9b310a8743 (patch) | |
tree | bb1852dc58711c7baee31216a765067dfa49b65b /src/dia_video.inc | |
parent | 10658e71475bd964263d09f1a661f24fadfaf496 (diff) | |
download | bootloader-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/dia_video.inc')
-rw-r--r-- | src/dia_video.inc | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/src/dia_video.inc b/src/dia_video.inc new file mode 100644 index 0000000..84ab80d --- /dev/null +++ b/src/dia_video.inc @@ -0,0 +1,263 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% +% Video mode selection dialog. +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Some global vars. +% +% video mode array fields +/.vm_mode 0 def +/.vm_width 1 def +/.vm_height 2 def + +% We have kernel splash images for at least these sizes. +/video.splashsizes [ + 0 0 % special: for text mode + 1 0 % special: for VESA mode + 800 600 + 1024 600 + 1024 768 + 1280 800 + 1280 1024 + 1400 1050 + 1600 1200 + 1680 1050 + 1920 1200 +] def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Create sort key for video modes. +% +% ( vm_index ) ==> ( sort_index ) +% +/vmsortindex { + video.modes.list exch get + dup + .vm_width get 16 shl + exch .vm_height get add +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Swap video mode entries. +% (Helper for video mode sorting.) +% +% ( vm_index_1 vm_index_2 ) ==> ( ) +% +/vmsortexch { + over video.modes.list exch get + over video.modes.list exch get + video.modes.list + 5 -1 roll rot put + video.modes.list 3 1 roll put +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Check if we have a splash in that resolution. +% +% ( video_mode_list_entry ) ==> ( true|false ) +% +/video.havesplash { + false exch + + 0 2 video.splashsizes length 1 sub { + over over over + .vm_height get rot .vm_width get rot video.splashsizes exch get eq + rot 1 add video.splashsizes exch get rot eq and + { exch pop true exch exit } if + } for + + pop + +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Build video mode list. +% +% ( ) ==> ( ) +% +/video.init { + /xmenu.video .xm_size array def + + /xmenu xmenu.video def + + % build list of video modes + /video.modes.list [ + [ -1 0 0 ] % special: text mode + [ -2 1 0 ] % special: VESA mode (width = 1 to make it sort) + + % first, try 16 bit + /vm_color_bits 16 def + + { + 0 1 videomodes { + videomodeinfo dup .undef eq { + pop pop pop pop + } { + [ + over 0xbfff and 6 2 roll + 0x4000 and % fb support + exch vm_color_bits eq and % color bits + over 600 ge and % height >= 600 + 2 index 800 ge and % width >= 800 + { ] } { pop pop pop pop } ifelse + } ifelse + } for + + % no modes added? -> try 8 bit + dup .vm_mode get -2 eq vm_color_bits 8 ne and { + /vm_color_bits 8 def + } { + exit + } ifelse + } loop + + ] def + + % sort video.modes.list + + video.modes.list length 3 gt { + 0 1 video.modes.list length 2 sub { + dup 1 add 1 video.modes.list length 1 sub { + over vmsortindex over vmsortindex gt { + over over vmsortexch + } if + pop + } for + pop + } for + } if + + % remove duplicates + % (assumes text or vesa entry to be first) + + /video.modes.list + [ + video.modes.list { + dup .vm_mode get 0 gt { % ensure it's not the first entry + over .vm_width get over .vm_width get eq + 2 index .vm_height get 2 index .vm_height get eq and { + free + } if + } if + } forall + ] + video.modes.list free + def + + % create mode strings + + /video.modes.text [ + video.modes.list { + dup .vm_width get + dup 0 eq { + pop pop /txt_text_mode + } { + dup 1 eq { + pop pop "VESA" + } { + exch .vm_height get exch "%d x %d" 32 string dup 5 1 roll sprintf + } ifelse + } ifelse + } forall + ] def + + % add to menu + + xmenu .xm_list video.modes.text put + xmenu .xm_title /txt_video_mode put + + % select largest mode the monitor supports + + boot_failsafe 4 and { 0 0 } { monitorsize } ifelse + exch 800 max exch 600 max % at least 800x600 + + % ATI quirk: avoid 1280x1024, older chips (<= 8MB, max res 1280x1024) use + % interlaced there + + video.modes.list dup length 1 sub get + dup .vm_width get 1280 eq exch .vm_height get 1024 eq and { + video.memory 0x2000 le { + video.oem "ATI " strstr 1 eq { + exch 1024 min exch 768 min % down to 1024x768 + } if + } if + } if + + xmenu .xm_current -1 put + + -1 + video.modes.list { + exch 1 add exch + + dup .vm_width get 4 index le + over .vm_height get 4 index le and + exch video.havesplash and { + xmenu .xm_current 2 index put + } if + + } forall + pop + + pop pop +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Update video mode. +% +% ( ) ==> ( ) +% +/video.update { + /xmenu xmenu.video def + + /window.action actRedrawPanel def +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Show video menu. +% +% ( ) => ( ) +% +/panel.video { + "videomode" help.setcontext + + window.xmenu + dup .xmenu xmenu.video put + dup .xmenu.update /video.update put + dup window.init + window.show +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Return width of video entry. +% +% ( ) => ( width ) +% +/panel.video.width { + /xmenu xmenu.video def + + pmenu.width +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Redraw panel entry. +% +% ( panel ) => ( ) +% +/panel.video.update { + /xmenu xmenu.video def + + pmenu.panel.update +} def + + |