-- JaMTSInfoImpl.mesa
-- Last changed by Paxton, October 4, 1982 2:34 pm
DIRECTORY
JaMTSInfo,
Atom,
JaMOps USING [MakeName],
JaMInternal USING [Frame],
JaMTypeScript USING [MouseProc];
JaMTSInfoImpl: MONITOR
LOCKS tsi USING tsi:TSInfo
IMPORTS Atom, JaMOps
EXPORTS JaMTSInfo = { OPEN JaMTSInfo;
Create: PUBLIC PROC RETURNS [tsi: TSInfo] = {
RETURN [NEW[TSInfoRec]] };
WaitForSomethingToDo: PUBLIC ENTRY PROC [tsi: TSInfo] = { OPEN tsi;
ENABLE UNWIND => NULL;
WHILE state=idle DO WAIT somethingToDo ENDLOOP };
NotifyReadyForMore: PUBLIC ENTRY PROC [tsi: TSInfo] = { OPEN tsi;
ENABLE UNWIND => NULL;
state ← idle; BROADCAST readyForInput };
Do: PUBLIC ENTRY PROC [obj: Object, tsi: TSInfo] = { OPEN tsi;
ENABLE UNWIND => NULL;
UNTIL state=idle DO WAIT readyForInput ENDLOOP;
objectToDo ← obj; state ← busy; NOTIFY somethingToDo;
UNTIL state=idle DO WAIT readyForInput ENDLOOP;
};
lastAtom: ATOM;
lastName: name Object;
GetName: PROC [atom: ATOM] RETURNS [name: name Object] = {
IF atom = lastAtom THEN RETURN [lastName];
lastName ← name ← JaMOps.MakeName[LOOPHOLE[Atom.GetPName[atom],LONG STRING]];
lastAtom ← atom };
DoButton: PUBLIC ENTRY PROC[
tsi: TSInfo, frame: JaMInternal.Frame,
buttonName: ATOM, x,y: REAL,
mouseProc: JaMTypeScript.MouseProc] = { OPEN tsi;
ENABLE UNWIND => NULL;
IF state#idle THEN RETURN; -- ignore buttons if not idle
mouseProc[frame,x,y]; -- push transformed coordinates
objectToDo ← GetName[buttonName];
state ← busy; NOTIFY somethingToDo;
};
DoAtom: PUBLIC ENTRY PROC[
tsi: TSInfo, frame: JaMInternal.Frame, atom: ATOM] = { OPEN tsi;
ENABLE UNWIND => NULL;
IF state#idle THEN RETURN; -- ignore if not idle
objectToDo ← GetName[atom];
state ← busy; NOTIFY somethingToDo;
};
}...