MODULE Key EXPORTS Main;
IMPORT Trestle, VBT, TextVBT, BorderedVBT, RigidVBT, Font, Rect;
IMPORT Fmt, Wr, Stdio, Latin1Key;
TYPE
KeyVBT = TextVBT.T OBJECT
METHODS
init (t: TEXT; f := Font.BuiltIn): KeyVBT := Init
OVERRIDES
position := Position;
key := Key;
END;
PROCEDURE Init (v: KeyVBT; t: TEXT; f := Font.BuiltIn): KeyVBT =
BEGIN
EVAL TextVBT.T.init(v, t, fnt := f);
RETURN v; (* Return KeyVBT, not TextVBT.T *)
END Init;
PROCEDURE Position (v: KeyVBT; READONLY cd: VBT.PositionRec) =
BEGIN
(* Notify us whenever cursor enters the window. *)
VBT.SetCage(v, VBT.GoneCage);
(* Take keyboard focus if mouse moves in our window. *)
VBT.Acquire(v, VBT.KBFocus, cd.time)
END Position;
PROCEDURE Key (v: KeyVBT; READONLY cd: VBT.KeyRec) =
CONST
(* in [sp .. td], the range of ascii printable characters, the
KeyboardKey.KeySym's coincide *)
sp = Latin1Key.space;
td = Latin1Key.asciitilde;
VAR
wc := cd.whatChanged;
c : CHAR;
BEGIN
IF NOT cd.wentDown OR Rect.IsEmpty(VBT.Domain(v)) THEN RETURN END;
IF sp <= wc AND wc <= td THEN
c := VAL(ORD(wc), CHAR);
TextVBT.Put(v, "character \'" & Fmt.Char(c) & "\'");
END;
END Key;
VAR
times14 := "-*-times-*-r-*-*-14-*-*-*-*-*-*-*";
font := Font.FromName(ARRAY OF TEXT{times14});
key := NEW(KeyVBT).init("[uninitialized]", font);
main := BorderedVBT.New(RigidVBT.FromHV(key, 30.0, 10.0));
BEGIN
Trestle.Install(main);
Trestle.AwaitDelete(main);
END Key.