<* PRAGMA LL *>The
XParam
interface provides utilities for handling X-style
-display
and -geometry
command-line arguments. If your
application installs a single top-level window, the XTrestle
interface may be more appropriate than this interface.
INTERFACEHere are routines for manipulating theXParam ; IMPORT Point, Rect, Trestle, TrestleComm;
-display
argument:
TYPE Display = RECORD hostname: TEXT := ""; display : CARDINAL := 0; screen : CARDINAL := 0; DECnet : BOOLEAN := FALSE END; PROCEDURE ParseDisplay (spec: TEXT): Display RAISES {Error}; <* LL = arbitrary *>
Return a parsed version of the-display
argument inspec
.
For example, if
spec
contains the string
myrtle.pa.dec.com:0.2
, the record returned would be
Display{hostname := "myrtle.pa.dec.com", display := 0, screen := 2, DECnet := FALSE}PROCEDURE UnparseDisplay (READONLY d: Display): TEXT; <* LL = arbitrary *>Return the text-version of the-display
argumentd
.Here are routines for manipulating the-geometry
argument:CONST Missing = Point.T{-1, -1}; TYPE Geometry = RECORD vertex := Rect.Vertex.NW; (* corner for displacement *) dp := Point.Origin; (* displacement *) size := Missing; (* width, height *) END; PROCEDURE ParseGeometry (spec: TEXT): Geometry RAISES {Error}; <* LL = arbitrary *>Return a parsed version of the-geometry
argument inspec
.For example, ifspec
contains the string1024x800-0-10
, the returned record would beGeometry {Rect.Vertex.SE, Point.T {0, 10}, Point.T {1024, 800}}Thesize
field defaults toMissing
. The horizontal and vertical displacements default toPoint.Origin
(no displacement). The displacements are always positive values; use thevertex
field to find out from which corner they are to be offset.PROCEDURE UnparseGeometry (READONLY g: Geometry): TEXT; <* LL = arbitrary *>Return the text-version of the-geometry
argumentg
.PROCEDURE Position ( trsl: Trestle.T; id : Trestle.ScreenID; READONLY g : Geometry ): Point.T RAISES {TrestleComm.Failure}; <* LL.sup = VBT.mu *>Return the position specified byg
in the screen coordinates for the screenIDid
on the window system connected totrsl
(cf.Trestle.GetScreens
). The value ofg.size
must not beMissing
, unlessg.vertex
is the northwest corner.Here is the definition of theError
exception:TYPE Info = OBJECT spec : TEXT; index: CARDINAL END; GeometryInfo = Info BRANDED OBJECT END; DisplayInfo = Info BRANDED OBJECT END; EXCEPTION Error(Info);Parsing errors are reported with the text (spec
) and position (index
) of the first illegal character in the text.END XParam.\subsubsection{An example}Here is an example of how to use this interface to install a VBT
v
as a top level window, obeying the display and geometry arguments given to the application. It relies on theParams
interface, which provides the number of arguments passed to the program,Params.Count
, and a procedure to retrieve the value of then
th argument,Params.Get(n)
.
EXCEPTION Error (TEXT); VAR display, geometry: TEXT := NIL; d: XParam.DisplayRec; g: XParam.Geometry; i: CARDINAL := 1; BEGIN LOOP IF i >= Params.Count - 1 THEN EXIT END; WITH argument = Params.Get (i) DO IF Text.Equal (argument, "-display") THEN display := Params.Get (i + 1); TRY d := XParam.ParseDisplay (display) EXCEPT XParam.Error (info) => RAISE Error ("Illegal -display argument: " & info.spec) END; INC (i, 2) ELSIF Text.Equal (argument, "-geometry") THEN geometry := Params.Get (i + 1); TRY g := XParam.ParseGeometry (geometry); IF g.size = XParam.Missing THEN WITH shapes = VBTClass.GetShapes (v, FALSE) DO g.size.h := shapes [Axis.T.Hor].pref; g.size.v := shapes [Axis.T.Ver].pref END END EXCEPT XParam.Error (info) => RAISE Error ("Illegal -geometry argument: " & info.spec); END; INC (i, 2) ELSE INC (i) END (* IF| END (* WITH *) | END; (* LOOP *) At this point, if "display" is non-"NIL", then "d" contains the information from the "-display" argument. Similarly, if "geometry" is non-"NIL", then "g" contains the information from the "-geometry" argument. If the window-size specificiation was missing, the preferred shape of the window is used. Finally, we now process the "display" and "geometry" information: | VAR | trsl := Trestle.Connect (display); | screen: CARDINAL; | BEGIN | TrestleImpl.SetDefault (trsl); | Trestle.Attach (v, trsl); | Trestle.Decorate (v, ...); | IF geometry = NIL THEN | Trestle.MoveNear (v, NIL) | ELSE | StableVBT.SetShape (v, g.size.h, g.size.v) | IF d = NIL THEN | screen := Trestle.ScreenOf (v, Point.Origin).id | ELSE | screen := d.screen | END; | Trestle.Overlap ( | v, screen, XParam.Position(trsl, screen, g)) | END (* IF *) | END (* BEGIN *) | END; (* BEGIN *) The call to "TrestleImpl.SetDefault" establishes the value of the "-display" argument as the default Trestle connection. The call to "StableVBT.SetShape" is used to control the size of a top-level window. The "TrestleImpl" and "StableVBT" interfaces are part of Trestle.*)