-- JunoKeyboardImpl, coded by Greg Nelson & Donna Auguste,
-- December 7, 1982 11:51 am
DIRECTORY ViewerClasses, TIPUser, JunoKeyboard;
JunoKeyboardImpl: MONITOR
EXPORTS JunoKeyboard =
BEGIN OPEN JunoKeyboard;
x, y, oldx, oldy : PUBLIC INT ← 0;
event : PUBLIC EventType;
button : PUBLIC ButtonType;
char: PUBLIC CHAR;
status : PUBLIC ARRAY ButtonType OF StatusType;
nonFull, nonEmpty: CONDITION;
Quit : PUBLIC SIGNAL = CODE;
ignoredCount: NAT ← 0;
queueMax : INTEGER = 1000;
queue : ARRAY [0..queueMax) OF REF ANY;
queueLeft, queueRight : INT ← 0;
-- the active range of the queue is [queueLeft..queueRight), wrapped
-- entries are added to the right of the queue, and removed from the left.
--ENTERANDNOTIFY
EnterAndNotify : PUBLIC ENTRY PROC
[self : ViewerClasses.Viewer,
input : LIST OF REF ANY] =
{
WHILE input # NIL DO
WHILE (queueRight + 1) MOD queueMax = queueLeft
DO
-- WAIT nonFull
ignoredCount ← ignoredCount + 1;
RETURN
ENDLOOP;
queue[queueRight] ← input.first;
queueRight ← (queueRight + 1) MOD queueMax;
BROADCAST nonEmpty;
input ← input.rest
ENDLOOP;
};
--NEXT (will pop off an entry)
Next : PUBLIC ENTRY PROC =
{
WHILE (queueLeft = queueRight) DO
WAIT nonEmpty
ENDLOOP;
WITH queue[queueLeft] SELECT FROM
coords : TIPUser.TIPScreenCoords
=> { event ← roll;
oldx ← x;
oldy ← y;
-- x ← coords.x; (cedar 3.1)
-- y ← coords.y (cedar 3.1)
x ← coords.mouseX;
y ← coords.mouseY
};
text : REF CHAR
=> { event ← keyDown;
char ← text↑
};
clickAtom: ATOM
=>{
SELECT clickAtom FROM
$Destroy =>
{ event ← keyDown; char ← 33C; SIGNAL Quit[ ]};
-- if the event was $Destroy, act as though is was an ESC, so that JunoTop
-- will treat is as the Select Quit & ESC sequence.
$RedUp =>
{status[red] ← up; event ← clickUp; button ← red};
$RedDown =>
{status[red] ← down; event ← clickDown; button ← red};
$BlueUp =>
{status[blue] ← up; event ← clickUp; button ← blue};
$BlueDown =>
{status[blue] ← down; event ← clickDown; button ← blue};
$YellowUp =>
{status[yellow] ← up; event ← clickUp; button ← yellow};
$YellowDown =>
{status[yellow] ← down; event ← clickDown; button ← yellow}
ENDCASE => ERROR;
}
ENDCASE => ERROR;
queueLeft ← (queueLeft + 1) MOD queueMax;
BROADCAST nonFull
};
END.