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.
204 lines
4.1 KiB
204 lines
4.1 KiB
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
%
|
|
% Video mode selection dialog.
|
|
%
|
|
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
|
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
% Some global vars.
|
|
%
|
|
% video mode array fields
|
|
/.vm_mode 0 def
|
|
/.vm_width 1 def
|
|
/.vm_height 2 def
|
|
/.vm_depth 3 def
|
|
|
|
|
|
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
% Create sort key for video modes.
|
|
% Supports up to 16383x16383x56 in multiples of 8 bits of depth.
|
|
%
|
|
% ( vm_index ) ==> ( sort_index )
|
|
%
|
|
/vmsortindex {
|
|
video.modes.list exch get
|
|
dup
|
|
.vm_width get 14 shl
|
|
over .vm_height get add 3 shl
|
|
exch .vm_depth get 3 shr 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
|
|
|
|
|
|
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
% 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 0 ] % special: default VGA mode
|
|
|
|
0 1 videomodes {
|
|
videomodeinfo dup .undef eq {
|
|
pop pop pop pop
|
|
} {
|
|
[
|
|
over 0xbfff and 6 2 roll
|
|
0x4000 and % fb support
|
|
over 0x10 ge and % >= 16 color bits
|
|
2 index 400 ge and % height >= 400
|
|
3 index 600 ge and % width >= 600
|
|
{ ] } { pop 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
|
|
|
|
% uniquify video.modes.list
|
|
|
|
video.modes.list length 1 gt {
|
|
/video.modes.list [
|
|
video.modes.list 0 get
|
|
1 1 video.modes.list length 1 sub {
|
|
video.modes.list over 1 sub get
|
|
video.modes.list 2 index get
|
|
|
|
over .vm_width get over .vm_width get ne
|
|
2 index .vm_height get 2 index .vm_height get ne or
|
|
rot .vm_depth get rot .vm_depth get ne or {
|
|
video.modes.list exch get
|
|
} {
|
|
pop
|
|
} ifelse
|
|
} for
|
|
] def
|
|
} if
|
|
|
|
% create mode strings
|
|
|
|
/video.modes.text [
|
|
video.modes.list {
|
|
dup .vm_width get
|
|
dup 0 eq {
|
|
pop pop "VGA"
|
|
} {
|
|
over .vm_depth get rot .vm_height get rot
|
|
"%d x %d x %d" 32 string dup 6 1 roll sprintf
|
|
} 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 0 put
|
|
% video.modes.list {
|
|
% dup .vm_width get 3 index le
|
|
% exch .vm_height get 3 index le 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
|
|
|
|
|