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.
216 lines
4.2 KiB
216 lines
4.2 KiB
19 years ago
|
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
|
%
|
||
|
% 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
|
||
|
|
||
|
|