You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gfxboot-theme-calculate/dia_video.inc

216 lines
4.2 KiB

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
% 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 768
1280 1024
] 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)
0 1 videomodes {
videomodeinfo dup .undef eq {
pop pop pop pop
} {
[
over 0xbfff and 6 2 roll
0x4000 and % fb support
exch 0x10 eq and % 16 color bits
over 600 ge and % height >= 600
2 index 800 ge and % width >= 800
{ ] } { pop pop pop pop } ifelse
} ifelse
} for
] 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
% create mode strings
/video.modes.text [
video.modes.list {
dup .vm_width get
dup 0 eq {
pop pop "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
% select largest mode the monitor supports
monitorsize exch 800 max exch 600 max % at least 800x600
xmenu .xm_current -1 put
video.modes.list {
dup .vm_width get 3 index le
over .vm_height get 3 index le and
exch video.havesplash and {
xmenu .xm_current over over get 1 add put
} {
exit
} ifelse
} forall
pop pop
pmenu.init
} def
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Update video mode.
%
% ( ) ==> ( )
%
/video.update {
/xmenu xmenu.video def
/window.action actRedrawPanel def
pmenu.update
} 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