Xform windows are graphic representations of choices for the user. A variety of shapes and options (herein called widgets) are available to the designer in creating an xform window. These include radio buttons, push buttons, check boxes, text edit areas, etc. The size of the finished xform window depends on the size and quantity of the widgets inside and their arrangement within the window.
A par file must be created for each xform window. The par file contains lines explaining the position of each widget within the window as well as the labels and variables necessary to the proper functioning of the window and the programs invoked as a result of the choices selected. The ui routines in the library libui parse the par file and decipher its contents. Action in the form of drawing a window on the screen results.
Xwindows = { dns, , Off, On } # X windows form requested parvarname1 = { , , } # variable parvarname2 = { , , } # parvarname3 = { , , } # declarations : # : # section +main level # +secondary level # statements that +tertiary level # : # define the window : # +invoke... # statement done when # the accept push button is # selected
The statements that define the layout of a form are par file constant definitions (see cfp(4) for more information). By convention all names used to build a form begin with a plus sign (+) and all tertiary level names begin with the secondary level name. That convention is assumed in all the descriptions and examples below. All of the prefixes given in the main and secondary level definitions can be any strings, but it is easier to read a form definition if one follows the conventions.
################################################################### # file: example.par # # HISTORY # # who when what #------------------------------------------------------------------ # xxx 31 Mar 1989 original # yyy 11 Apr 1989 added second file # ################################################################### Xwindows = { dns, , Off, On } file1 = { r, current.fits, current.fits } # file2 = { r, previous.fits, previous.fits } # variable raw = { r, False, False } # base = { r, True, False } # declarations debase = { r, True, True } # bgtype = { r, edge, edge } # section edge = { r, 10, 10 } # +form = 0 0 -1 -1 +f 9 # +f0 = TB 0 0 -1 -1 +f0l # form +f0l = Look at a Reticon Cut # +f1 = ST 1 1.5 -1 0 +f1l -1 # definition +f1l = File1: # +f2 = TE 1 1 1 0 file1 20 # section +f3 = ST 1 1.5 -1 1 +f3l -1 # +f3l = File2: # : +f4 = TE 1 1 1 1 file2 20 +f5 = CB 2 2 -1 4 +f5v +f5l 3 1 +f5v0 = raw +f5v1 = base +f5v2 = debase +f5l0 = Show Rawdata +f5l1 = Show Baseline +f5l2 = Show Debased Rawdata +f6 = RB 2 1 -1 5 bgtype +f6l +f6v 0 3 1 +f6l0 = Edge +f6l1 = First and Last Rows +f6l2 = First and Last Columns +f6v0 = edge +f6v1 = rows +f6v2 = columns +f7 = PB +f8 = SR 7 1 2 7 reticon.bm +invoke = echo %file1 %file2 $raw $base $debase %bgtype %edge
Note: Changing the number of fields to some low value and incrementing it with each iteration makes a good debug tool.
(You might also try gxe, at least for the first pass.)
file1 = { r, updated.fits, current.fits }
In this example, file1 is the variable being declared, possibly for a TE or LT text value. The r within the braces indicates that the value of file1 can be updated by editing its associated text edit area in the window and selecting either the Accept push button or the Save values push button. The final parameter (current.fits) is the default value; upon selection of the Defaults push button, the value of the variable will revert to its default.
For further information on variables see cfp(4) .
+
form=
x y dx dy+
prefix count
+
form +
form.
+
prefix
+form = 0 0 -1 -1 +f 7
This statement would create an xform window with seven contained widgets (secondary levels). The 7 secondary level definitions will all begin with the characters +f, and they will be named +f0, +f1, +f2, ..., +f6.
+
name#
=
type xoff yoff xref yref varies
+
name#
+
prefix specified
in the main level definition and an integer indicating the current level.
Secondary levels are numbered sequentially beginning with 0. If +
prefix
is +f and count from the main level equals 3, then there must be three
secondary levels, and they must be named +f0, +f1, and +f2.
TB = title bar PB = standard push buttons ST = static text PI = push button invocation TE = text edit AB = arrow button invocation LT = labeled text edit DB = drawn button invocation CB = check boxes RB = radio buttons SL = scrolled list RM = radio buttons multiple SP = separator line OP = option menu SR = static raster OM = option menu multiple BP = background pixmap SC = scale
The existence of tertiary level lines depends on the widget being defined. Some widgets require tertiary levels; some do not. See the specific widget for further specifications.
Tertiary levels are traditionally indented to make their relationship with the other lines clearer. See the PAR FILE STRUCTURE diagram for elucidation.
Tertiary levels may reference variables that can be shared (if appropriate) with other tertiary levels.
+
name=TB
xoff yoff xref yref+
namel
+name, xoff, yoff, xref, and yref are as
described above in SECONDARY LEVELS
.
+
namel
+f0 = TB 0 0 -1 -1 +f0l+f0l = Alignment
These statements would create a title bar across the top of the xform window containing the title Alignment centered within the title bar area. The xoff and yoff values of 0 indicate that the title bar should be drawn beginning at the top lefthand corner of the window (-1 -1).
+
name=ST
xoff yoff xref yref+
namel
dx
+name, xoff, yoff, xref, and yref
are as described above in SECONDARY LEVELS
.
+
namel
-1
or 0
means
there is one line, and the area is sized automatically. Any positive value
gives the character width of the area. In this case, use @n in the value
of +
namel
to separate the text lines.
+f3 = ST 10 1.5 -1 0 +f3l -1+f3l = File1:
These statements would create a static text area whose top lefthand corner would be 10 characters from the lefthand edge of the screen and 1.5 characters (lines) down from the bottom edge of the level 0 widget. The string File1: would appear in the static text area which is as large as necessary to accommodate the string shown in the tertiary level.
At CFHT five standard push buttons are used. These are:
+HELP_+
form
definition.
+
name=PB
xoff yoff xref yref+
namea
+
namel
num numcol
+name,
xoff, yoff, xref, and yref are as described above in SECONDARY LEVELS
.
+
namea
+
namea0,
the next button to the right is defined by +
namea1,
etc. The actions are
numeric codes with the following meanings. 0 Defaults
1 Apply
2 Cancel
3 Accept
4 Save Values
+f1a0 =
+
namel
+
namel0,
+
namel1,
etc. For example,
+f1l0 =
Since the five CFHT push buttons are standardized in appearance and format,
the designer has only (optionally) to designate their position within the
window being created. With no parameters following PB
, the five push buttons
will appear in one horizontal row at the bottom of the form. Since the
push buttons are the last interaction with a window, the CFHT convention
is to place them at the bottom area of a window.
+f9 = PB
This definition would make the five standard CFHT push buttons appear at the bottom of the form window.
+f9 = PB 0 0 -1 -1 +f9a +f9l 2 2+f9l0 = Done
+f9a0 = 3
+f9l1 = Help
+f9a1 = 5
These lines would cause two buttons labelled "Done" and "Help"
to appear at the bottom of the window. Clicking the "Done" button will
cause the "Accept" action (3)
to be activated (supply a blank +invoke
definition
for this form), closing the form. Clicking the "Help" button will cause
the "Help" action to be activated.
Note that for a form that does not need to "do anything" when it is closed, use the label "Done" with the action value 3. For a form with an Apply button, use the label "Apply" with the action value 1 and a label "Done" with the action value 2 (yes, for Cancel).
A push button invoke is a outline containing text which briefly describes the action to be invoked upon selecting the button. The actions described by a group of push buttons are mutually exclusive; only one can be done at a time.
Push buttons provide an easy way for the user to choose one of many possible options. Once a push button is selected, the action is immediately taken. With push button invokes, any action can be specified, and the form remains open. There are two types, one intended for buttons that just bring up other forms and the other intended for actions that use the current form values to run a program. The first type does not save the current form values; it just invokes the specified action (in the background). The second type saves the current form values, invokes the specified action (in the foreground) and waits for it to finish while displaying a watch cursor, and updates the current form values before allowing any further interaction with the form. The second type is indicated by the wait parameter.
+
name=PI
xoff yoff xref yref+
namei
+
namel
num numcol largest [wait]
+name, xoff, yoff, xref, and yref are as described above in
SECONDARY LEVELS
.
Say Done
+
namei
- indicates the command to be invoked when the associated push button is clicked is defined by tertiary level lines named
+
namei0,
etc.
+
namel
- (ell) indicates the label associated with each button is defined by tertiary level lines named
+
namel0,
etc. For example,+f2l0 =
+f2l0 =
0
.
w
@ in for
this value.
+f9 = PI 7 2 -1 0 +f9i +f9l 1 1 1+f9i0 = echo done
+f9l0 = Say Done
These lines would create 1 push button of the invoke variety. It would be displayed (in 1 column) 7 characters to the right of the left edge of the window and 2 characters (lines) down from the level 0 widget. The words Say Done would appear in the button. Upon clicking the push button, the word done would appear on the screen if the form is brought up from the command line.
An arrow button invoke is a outline containing a horizontal or vertical arrow and a command to be invoked upon selection of the button.
An arrow button provides a way to execute a command related to horizontal or vertical motion. Once an arrow button is selected, the action is immediately taken. The form remains open.
+
name=AB
xoff yoff xref yref+
namei
directionsize
+name, xoff, yoff, xref, and yref are as described above in
SECONDARY LEVELS
.
+
namei
- indicates the command to be invoked when the associated arrow button is clicked is defined by a tertiary level line named
+
namei.
- direction
- a letter indicating the direction for the arrow. The possible letters are:
u
orU
arrow pointing up
d
orD
arrow pointing down
l
orL
arrow pointing left
r
orR
arrow pointing right
+f6 = AB 3 0 5 5 +f6i l 1+f6i = echo left
These lines would create an arrow button with an arrow pointing left. It would be displayed 3 characters to the right of the level 5 widget. Upon clicking the push button, the word left would appear on the screen if the form is brought up from the command line.
A drawn button invoke is a outline containing a picture and a command to be invoked upon selection of the button.
On the theory that a picture is worth a thousand words, a drawn button provides for a single push button invoke with a picture label. Once a drawn button is selected, the action is immediately taken. The form remains open.
+
name=DB
xoff yoff xref yref+
namei
filename
+name, xoff, yoff, xref, and yref
are as described above in SECONDARY LEVELS
.
+
namei
+
namei.
+f7 = DB 3 4 5 6 +f7i eye.bm+f7i = echo eye
These lines would create a drawn button with the picture defined by eye.bm as its label. It would be displayed 3 characters to the right of the level 5 widget and 4 lines below the level 6 widget. Upon clicking the push button, the word eye would appear on the screen if the form is brought up from the command line.
+
name=CB
xoff yoff xref yref+
namev
+
namel
num numcol
+name, xoff, yoff, xref, and yref are as described above in SECONDARY LEVELS
.
+
namev
+
namev0,
+
namev1, ...,
+
namev
num. +
namev0
corresponds to the upper left check box,
+
namev1
corresponds to the next check box to the right (or if none, to
the leftmost one in the next row), etc. There must be a variable line and
a variable for each of the num check boxes. Thus, if num equals 3, then
tertiary levels +
namev0,
+
namev1,
and +
namev2
must be defined.
+
namel
+
namel0,
etc. The naming is the same as for variable
lines, and there must be a label line for each check box.
ready = { dns, , Off, On } # ready to go?
:
:
+f26 = CB 3 0.5 -1 18 +f26v +f26l 1 1+f26l0 = Move carriage ahead of ZPD?
+f26v0 = ready
These lines would generate 1 check box. The check box would
be located 3 characters to the right of the left edge of the window and
0.5 characters (lines) down from the bottom of the widget created in level
18. The check box would be labeled Move carriage ahead of ZPD?, and the
Boolean
variable ready would hold the True
or False
value indicated by
the check box status. However, because dns is specified for the mode of
ready, this would only make sense for a program form; the resulting value
is never saved to the par file.
raw = { r, False, False } # wants raw
base = { r, True, False } # wants base
debase = { r, True, True } # wants debase
:
:
+f5 = CB 2 6 -1 4 +f5v +f5l 3 1+f5v0 = raw
+f5v1 = base
+f5v2 = debase
+f5l0 = Show Rawdata
+f5l1 = Show Baseline
+f5l2 = Show Debased Rawdata
These lines would generate 1 vertical column
containing 3 check boxes. The boxes would be located 2 characters to the
right of the left edge of the window and 6 characters (lines) below the
bottom of the widget created in level 4. The label Show Rawdata would appear
to the right of the top check box, the label Show Baseline would appear
to the right of the middle check box, and the label Show Debased Rawdata
would appear to the right of the bottom check box. The variable raw would
hold the value indicated in the top check box, the variable base would
hold the value indicated in the middle check box, and the variable debase
would hold the value indicated in the bottom check box. Because the variable
raw has a current value of False
, the top check box will appear empty (not
selected; off). Because the variables base and debase both have current
values of True
, the middle and bottom check boxes will appear filled (selected;
on). If the Defaults button is clicked, raw and base would become False,
and debase would become True.
See option lists (OP) for a menu based way of doing the same thing. See multiple variable radio buttons (RM) for a boolean way of doing a similar thing. See multiple variable option menus (OM) for a pop up menu version of RM.
+
name=RB
xoff yoff xref yref varname+
namel
+
namev
start num numcol
+name,
xoff, yoff, xref, and yref are as described above in SECONDARY LEVELS
.
+
namel
+
namel0,
etc. +
namel0
corresponds to the upper left radio button,
+
namel1
corresponds to the next radio button to the right (or if none,
to the leftmost one in the next row), etc. There must be a label line for
each of the num radio buttons. Thus, if num equals 3, then tertiary levels
+
namel0,
+
namel1,
and +
namel2
must be defined.
+
namev
+
namev0,
etc. The naming is the same as for label lines, and there
must be a value line for each radio button. When a radio button is pushed,
its associated value is copied into the variable varname.
+
namev
levels. Use 0
?
along = { r, x, x } # which axis is selected
:
:
+f5 = RB 7 3 -1 0 along +f5l +f5v -1 2 1+f5l0 = X=1,n
+f5l1 = Y=1,n
+f5v0 = x
+f5v1 = y
These lines would generate 1 column of 2 radio buttons located 7 characters to the right of the left edge of the window and 3 lines below the bottom of the level 0 widget. The top radio button would be labeled X=1,n, and the bottom one would be labeled Y=1,n. Selecting the top radio button would give the variable along the value x, and selecting the bottom button would give the variable along the value y.
type = { rd, bias, object } # exposure type
:
:
+f8 = RB 2 1 4 7 type +f8l +f8v 0 5 3+f8l0 = Object
+f8l1 = Comparison
+f8l2 = Flat (continuum)
+f8l3 = Dark
+f8l4 = Readout
+f8v0 = object
+f8v1 = comparison
+f8v2 = flat
+f8v3 = dark
+f8v4 = readout
These lines create 5 radio buttons in 3 columns. The leftmost column is located 2 characters from the rightmost edge of the widget drawn in level 4 and 1 character (line) below the bottom of the widget drawn in level 7. The value object is stored into type if the upper left button is pushed, the value comparison is stored into type if the upper middle button is pushed, the value flat is stored into type if the upper right button is pushed, the value dark is stored into type if the lower left button is pushed, and the value readout is stored into type if the lower "middle" button is pushed. The button labelled Bias will be selected initially. If the Defaults button is pushed, object will be stored into type and the button labelled Object will be selected.
To make radio buttons line up vertically with text entry or labeled text fields, put the text fields about 2.75 units apart vertically and add a @n at the end of the radio button labels.
To the user
multiple variable radio buttons appear to be similar to regular radio buttons
(RB) as described above. Internally, however, whereas regular radio buttons
put arbitrary values into a single variable, multiple variable radio buttons
have one Boolean
variable for each button and set one True
and the others
False
.
RM radio buttons allow the programmer to select one of a group of mutually exclusive options. See multiple variable option menus (OM) for a pop up menu way of doing the same thing. See check boxes (CB) or scrolled lists (SL) for selecting multiple independent boolean options.
+
name=RM
xoff yoff xref yref+
namev
+
namel
start num numcol
+name,
xoff, yoff, xref, and yref are as described above in SECONDARY LEVELS
.
+
namev
+
namev0,
etc. +
namev0
corresponds
to the upper left radio button, +
namev1
corresponds to the next radio button
to the right (or if none, to the leftmost one in the next row), etc. There
must be a variable line for each of the num radio buttons. Thus, if num
equals 3, then tertiary levels +
namev0,
+
namev1,
and +
namev2
must be defined.
When a radio button is pushed, its associated variable is set to True
and all the other variables associated with the radio button set are set
to False
.
+
namel
+
namel0,
etc. The naming
is the same as for variable lines, and there must be a label line for each
button.
+
namev
level variables
are all False.
Use 0
?
dummy = { r, Off, On } # filler for Normal
Reset = { r, Off, Off } # clear controller
Status = { r, Off, Off } # show status
:
:
+setup7 = RM 4 1 -1 6 +setup7p +setup7l 0 3 1+setup7p0 = dummy
+setup7p1 = Reset
+setup7p2 = Status
+setup7l0 = Normal
+setup7l1 = Reset and Open Path
+setup7l2 = Read All Devices
These lines would generate 1 column of three
radio buttons located 4 characters to the right of the lefthand edge of
the window and 1 character (line) below the bottom of the level 6 widget.
The top radio button would be labeled Normal, the middle one, Reset and
Open Path; and the bottom one, Read All Devices. At start up the Normal
button would be selected because all variables are False
and start is 0
.
Selecting one of the buttons would result in the corresponding variable
(e.g., Reset) being set to True
and the others (e.g., dummy and Status) being
set to False
. If Defaults is clicked, dummy will be set True
and Reset and
Status will be set False
.
+
name=OP
xoff yoff xref yref index varname+
namet
+
namev
+
namel
default num
+name, xoff,
yoff, xref, and yref are as described above in SECONDARY LEVELS
.
+
namet
+
namet.
+
namev
+
namev0,
etc. +
namev0
corresponds to the top menu item, +
namev1
corresponds
to the second menu item, etc. There must be a value line for each of the
num menu items. Thus, if num equals 3, then tertiary levels +
namev0,
+
namev1,
and +
namev2
must be defined. When a menu item is selected, its associated
value is copied into the variable varname. Note that the label and value
fields are switched compared to the radio button definition.
+
namel
+
namel0,
etc. The naming is the same as for value lines, and
there must be a label line for each menu item. Note that the label and
value fields are switched compared to the radio button definition.
along = { r, x } # which axis is selected
index = { r, 0 } # menu index of chosen axis
:
:
+f5 = OP 1 1 -1 4 index along +f5t +f5v +f5l 0 2+f5t = Axis of cut
+f5l0 = X=1,n
+f5l1 = Y=1,n
+f5v0 = x
+f5v1 = y
These lines would generate a pop up menu located 1 character to the right of the left edge of the window and 1 line below the bottom of the level 4 widget. The title to the left of the menu would be Axis of cut. The initial value displayed in the menu window would be X=1,n. Upon clicking on the menu, a two item pop up menu would appear with X=1,n on top and highlighted, and Y=1,n would be the other menu item. If Y=1,n is selected, the current value of along will become y, and the current value of index will become 1. If Defaults is selected, the current value of along will become x, and the current value of index will become 0.
Boolean
variable for each menu item and set one True
and the others
False
.
+
name=OM
xoff yoff xref yref index+
namet
+
namev
+
namel
default num
+name, xoff,
yoff, xref, and yref are as described above in SECONDARY LEVELS
.
+
namet
+
namet.
+
namev
+
namev0,
etc. +
namev0
corresponds to the top menu item, +
namev1
corresponds
to the second menu item, etc. There must be a variable line for each of
the num menu items. Thus, if num equals 3, then tertiary levels +
namev0,
+
namev1,
and +
namev2
must be defined. When a menu item is selected, its
associated variable is set to True
, and the previously selected item’s associated
variable is set to False
.
+
namel
+
namel0,
etc. The naming
is the same as for variable lines, and there must be a label line for each
menu item.
alongx = { r, True } # x axis is selected
alongy = { r, False } # y axis is selected
index = { r, 0 } # menu index of chosen axis
:
:
+f5 = OM 1 1 -1 4 index +f5t +f5v +f5l 0 2+f5t = Axis of cut
+f5l0 = X=1,n
+f5l1 = Y=1,n
+f5v0 = alongx
+f5v1 = alongy
These lines would generate a pop up menu located 1 character
to the right of the left edge of the window and 1 line below the bottom
of the level 4 widget. The title to the left of the menu would be Axis
of cut. The initial value displayed in the menu window would be X=1,n. Upon
clicking on the menu, a two item pop up menu would appear with X=1,n on
top and highlighted, and Y=1,n would be the other menu item. If Y=1,n is
selected, the current value of alongx will become False
, the current value
of alongy will become True
, and the current value of index will become
1. If Defaults is selected, the current value of alongx will become True
,
the current value of alongy will become False
, and the current value of
index will become 0.
+
name=SL
xoff yoff xref yref+
namet
+
namev
+
namel
num visible
+name, xoff, yoff, xref, and yref are
as described above in SECONDARY LEVELS
.
+
namet
+
namet.
+
namev
+
namev0,
+
namev1, ...,
+
namev
num. +
namev0
corresponds to the top list item,
+
namev1
corresponds to the second list item, etc. There must be a variable
line and a variable for each of the num list items. Thus, if num equals
3, then tertiary levels +
namev0,
+
namev1,
and +
namev2
must be defined.
When the Defaults button is punched, the default value for each of these
variables is copied to the current value.
+
namel
+
namel0,
etc. The naming is the same as for variable lines, and there must be a
label line for each list item.
ready = { r, False, True } # variable declarations
willing = { r, False, True }
able = { r, False, True }
:
:
+f10 = SL 3 1.5 -1 9 +f10t +f10v +f10l 3 2+f10t = Status
+f10v0 = ready
+f10l0 = Prepared
+f10v1 = willing
+f10l1 = Interested
+f10v2 = able
+f10l2 = Capable
These lines would generate a scrolled list with 2 of
3 items visible. The list would be located 3 characters to the right of
the left edge of the window and 1.5 characters (lines) down from the bottom
of the widget created in level 9. To the left of the list would be the
title Status. The list would show either Prepared and Interested or Interested
and Capable, depending on the scroll bar. Initially all list items would
be deselected, none would be highlighted, and Prepared and Interested would
be visible. If the item labeled Capable were clicked, it would become highlighted,
and the variable able would be set to True
. If the Defaults button were
hit, all would be selected and highlighted, and the variables ready, willing,
and able would all be set to True
.
+
name=SC
xoff yoff xref yref varname+
namel
min max size direction
+name, xoff, yoff, xref, and yref are as described
above in SECONDARY LEVELS
.
+
namel
hour = { r, 1, 12 } # the time of interest
:
:
+f13 = SC 0 3 -1 -1 hour +f13l 0 23 10 h+f13l = Time Now
These lines would generate a horizontal scale located at the left edge of the window and 3 characters (lines) below the top of the window. The scale would be 20 characters wide. There would be Time Now as a label to the left of the slider. The slider would start at 1 and would be set to 12 whenever the Defaults push button is chosen.
For esthetic purposes, readonly text edit boxes are also available. Use them when there are a number of fields in a column but only some of them are changeable. See the readonly parameter below.
+
name=TE
xoff yoff xref yref varname size readonly
+name, xoff, yoff, xref, and yref are as described above
in SECONDARY LEVELS
.
ro
@
in for this value.
file1 = { r, updated.fits, current.fits } # file name
:
:
+f7 = TE 5 3 1 0 file1 20
These lines would generate a text edit box located 5 characters to the right of the rightmost edge of the level 1 widget and 3 characters (lines) below the bottom edge of the level 0 widget. The text edit box could accommodate a maximum of 20 characters. The initial contents of the box would be updated.fits. The variable file1 has been defined to have a default value of current.fits which would appear in the text edit box whenever the Defaults push button was chosen.
+
name=TL
xoff yoff xref yref varname+
namel
size placement readonly
+name,
xoff, yoff, xref, and yref are as described above in SECONDARY LEVELS
.
+
namel
a
orA
label above the box
b
orB
label below the box
l
orL
label to the left of the box
r
or R
label to the right of the box
ro
@ in for this value.
time = { r, , , , @[0.0, 24.0)@ } # current time
:
:
+f7 = LT 5 3 1 0 time +f7l 20 l+f7l = Time Now
These lines would generate a text edit box located 5 characters to the right of the rightmost edge of the level 1 widget and 3 characters (lines) below the bottom edge of the level 0 widget. The text edit box could accommodate a maximum of 20 characters. There would be Time Now as a label to the left of the box. The variable time has no current value so the box will initially be blank, and there is no default value so the box will be blanked whenever the Defaults push button is chosen. In addition only numerical values that follow the format for times will be accepted (e.g., no letters), and the resulting value must range from 0 up to but not including 24.
+
name=SP
xoff yoff xref yref direction size
+name, xoff, yoff, xref, and yref are
as described above in SECONDARY LEVELS
.
+f7 = SP 0 1 -1 2 h 30
This line would display a line 30 characters wide from the left margin one character below widget number 2.
+
name=SR
xoff yoff xref yref graphicfilename
+name, xoff, yoff, xref, and yref are as described
above in SECONDARY LEVELS
.
+f7 = SR 3 3.5 1 0 align.bm
This line would display the graphic stored in align.bm in the location 3 characters to the right of the leftmost edge of the level 1 widget and 3.5 characters (lines) below the bottom of the level 0 widget. Some of the .bm files are align.bm, reticon.bm, coude.bm, eye.bm, and focus.bm.
+
name=BP
xoff yoff xref yref graphicfilename
+name, xoff, yoff, xref, and
yref are as described above in SECONDARY LEVELS
, but the offset and reference
values are ignored.
+f7 = BP 3 3.5 1 0 cfht.bm
This line would display the graphic stored in cfht.bm as the window background.
cfp(4) , ui_getform.c, cfp_*(3), ui_*(3).
As noted above, the start value in RB (radio buttons), the start value in RM (multiple variable radio buttons), and the largest value in PI (push button invoke) do not function as designed.
The push buttons (PB) are currently limited to the actions as specified above.
The background pixmap (BP) does not work.