DIRECTORY Process USING [Detach], ProcessProps USING [GetPropList], MenuDefs USING [OverWhichItem, HighlightMenuItem, ClearMenuItem, IsOverItem, BugItem, MenuItemHandle], CursorDefs USING [SetCursor], OpDefs USING [CopyObjects, MoveObjects, DeleteControlPoint, PlaceControlPoint, DeselectObjects, SelectObjects], GriffinDefs USING [ShowUserMessage, TypeIn, EndTypeIn, Grid, UserMessage], ViewerClasses USING [Viewer], GriffinViewer USING [GetViewer], PointDefs USING [ScrPt], Rope USING [ROPE], List USING [PutAssoc], GriffinInputDefs; GriffinInput: MONITOR IMPORTS Process, MenuDefs, CursorDefs, GriffinDefs, OpDefs, GriffinViewer, List, ProcessProps EXPORTS GriffinInputDefs = BEGIN OPEN GriffinInputDefs; StartInputHandler: PUBLIC PROC[wd: Rope.ROPE] RETURNS [InputEventProc] = { viewer _ GriffinViewer.GetViewer[]; Process.Detach[FORK WorkingProcess[wd]]; RETURN[NewEventProc]}; InputEventRef: TYPE = REF InputEventRec; InputEventRec: TYPE = RECORD[next: InputEventRef, input: InputEvent]; events: RECORD [first,last: InputEventRef _ NIL]; --incoming events condition: CONDITION; NewEventProc: ENTRY InputEventProc = { new: InputEventRef _ NEW[InputEventRec _ [next: NIL, input: event]]; IF events.last=NIL THEN events.first_ new ELSE events.last.next _ new; events.last _ new; NOTIFY condition; }; WaitAndCopy: ENTRY PROCEDURE RETURNS [InputEvent] = { copy: InputEvent; IF events.first=NIL THEN WAIT condition; copy _ events.first.input; events.first _ events.first.next; IF events.first = NIL THEN events.last _ NIL; RETURN[copy]; }; WorkingProcess: PROCEDURE [wd: Rope.ROPE] = { [] _ List.PutAssoc[key: $WorkingDirectory, val: wd, aList: ProcessProps.GetPropList[]]; DO HandleInputEvent[WaitAndCopy[]]; --WaitAndCopy is monitored ENDLOOP; }; downStroke: GriffinInputDefs.InputEvent; item: MenuDefs.MenuItemHandle _ NIL; mouseDown: BOOLEAN _ FALSE; overSameItem: BOOLEAN _ FALSE; aborted: BOOLEAN _ FALSE; viewer: ViewerClasses.Viewer; HandleInputEvent: InputEventProc = BEGIN ENABLE GriffinDefs.UserMessage => BEGIN GriffinDefs.ShowUserMessage[string]; AbortCleanup; CONTINUE; END; up,down: PointDefs.ScrPt; SELECT event.type FROM red,yellow,blue => BEGIN GriffinDefs.EndTypeIn[]; downStroke _ event; mouseDown _ TRUE; overSameItem _ TRUE; item _ MenuDefs.OverWhichItem[event.pt]; IF item # NIL THEN MenuDefs.HighlightMenuItem[item]; END; abort => BEGIN aborted_TRUE; AbortCleanup; CursorDefs.SetCursor[abortCursor]; END; up=> BEGIN IF aborted THEN BEGIN aborted_FALSE; AbortCleanup; RETURN END; CursorDefs.SetCursor[busyCursor]; mouseDown _ FALSE; overSameItem _ FALSE; down _ downStroke.pt; up _ event.pt; IF item # NIL THEN --downstroke was over menu BEGIN IF MenuDefs.IsOverItem[up, item] THEN MenuDefs.BugItem[item]; MenuDefs.ClearMenuItem[item]; CursorDefs.SetCursor[pointingCursor]; item _ NIL; RETURN END; SELECT downStroke.type FROM red => BEGIN down _ GriffinDefs.Grid[down]; up _ GriffinDefs.Grid[up]; IF event.shifted THEN OpDefs.CopyObjects[down,up] ELSE OpDefs.MoveObjects[down,up]; END; yellow => BEGIN down _ GriffinDefs.Grid[down]; up _ GriffinDefs.Grid[up]; IF item = NIL THEN IF event.shifted THEN OpDefs.DeleteControlPoint[down,up] ELSE OpDefs.PlaceControlPoint[up]; END; blue => IF item = NIL THEN IF event.shifted THEN OpDefs.DeselectObjects[down,up] ELSE OpDefs.SelectObjects[down,up]; ENDCASE; item _ NIL; CursorDefs.SetCursor[pointingCursor]; END; newPosition => IF mouseDown AND item # NIL THEN IF MenuDefs.IsOverItem[event.pt, item] THEN BEGIN IF ~ overSameItem THEN MenuDefs.HighlightMenuItem[item]; overSameItem _ TRUE; END ELSE BEGIN IF overSameItem THEN MenuDefs.ClearMenuItem[item]; overSameItem _ FALSE; END; keyStroke => BEGIN GriffinDefs.TypeIn[event.key]; END; ENDCASE; END; AbortCleanup: PROCEDURE = BEGIN CursorDefs.SetCursor[pointingCursor]; IF item # NIL THEN MenuDefs.ClearMenuItem[item]; item _ NIL; mouseDown _ FALSE; overSameItem _ FALSE; END; END. ÊGriffinInput.mesa Maureen Stone February 2, 1983 5:53 pm Last Edited by: Stone, June 18, 1984 11:11:14 am PDT Does real work InputFocus.SetInputFocus[viewer]; InputFocus.SetInputFocus[viewer]; Ê˘J˜Jšœ™Jšœ&™&Jšœ4™4J˜šÏk ˜ Jšœœ ˜Jšœ œ˜!Jšœ œX˜fJšœ œ ˜Jšœœc˜oJšœ œ9˜JJšœœ ˜Jšœœ ˜ Jšœ œ ˜Jšœœœ˜Jšœœ ˜J˜J˜—šœ˜JšœV˜]Jšœ˜Jšœœ˜J˜—J˜š Ïnœœœ œœ˜JJ˜#Jšœœ˜(Jšœ˜—J˜Jšœ œ˜)Jšœœœ)˜EJšœœœÏcœ˜DJšœ œ˜J˜šÏb œœ˜&Jšœœœ˜DJšœ œœœ˜FJšœ˜Jšœ ˜J˜J˜—šž œœ œœ˜5J˜Jšœœœœ ˜(J˜J˜!Jšœœœœ˜-Jšœ˜ J˜J˜—J˜šžœ œ œ˜-JšœW˜Wš˜Jšœ!Ÿ˜;Jšœ˜—J˜J˜—Jšœ™J˜(Jšœ œ˜$Jšœ œœ˜Jšœœœ˜Jšœ œœ˜J˜J˜šœ#˜(šœ˜'J˜$J˜ Jšœ˜ Jšœ˜J˜——J˜J˜Jšœ ˜˜Jš˜J˜Jšœ!™!J˜Jšœ œ˜Jšœœ˜J˜(Jšœœœ"˜4Jšœ˜—˜Jš˜Jšœœ˜ J˜ J˜"Jšœ˜—˜Jš˜šœ ˜Jš˜Jšœœ˜J˜ Jš˜Jšœ˜—J˜!Jšœ œ˜Jšœœ˜J˜J˜Jšœ!™!šœœœŸ˜.Jš˜šœ˜ Jšœ˜—J˜J˜%Jšœœ˜ Jš˜Jšœ˜—Jšœ˜˜Jš˜J˜J˜šœ˜Jšœ˜ Jšœ˜!—Jšœ˜—˜ Jš˜J˜J˜šœœœœ˜#Jšœ#˜'Jšœ˜"—Jšœ˜—˜šœœœœ˜#Jšœ ˜$Jšœ˜#——Jšœ˜Jšœœ˜ J˜%Jšœ˜—˜šœ œ˜šœœ$˜+šœ˜ Jšœœ"˜8Jšœœ˜Jš˜—šœ˜ Jšœœ˜2Jšœœ˜Jšœ˜J˜————˜ Jš˜J˜Jšœ˜—Jšœ˜Jšœ˜J˜Jšž œ œ˜Jš˜J˜%J˜šœ˜ Jšœ˜"—Jšœœ˜ Jšœ œ˜Jšœœ˜Jšœ˜J˜J˜Jšœ˜J˜—…—Vë