DIRECTORY Atom, CodeTimer, Commander, IO, KeySyms1, KeySymsKB, KeyMapping, KeyTypes, Rope, TIPKeyboards, TIPPrivate, TIPTables, TIPTest, TIPUser, Process, UserInput, UserInputGetActions, UserInputInsertActions, UserInputOps; TIPTestImpl: CEDAR PROGRAM IMPORTS Atom, CodeTimer, Commander, IO, KeyMapping, TIPKeyboards, TIPPrivate, TIPUser, Process, UserInputInsertActions, UserInputOps EXPORTS TIPTest SHARES TIPPrivate = BEGIN KeyTable: TYPE = KeyMapping.KeyTable; KeyTableRep: TYPE = KeyMapping.KeyTableRep; KeySyms: TYPE = KeyMapping.KeySyms; KeySymsRep: TYPE = KeyMapping.KeySymsRep; KeyCode: TYPE = KeyTypes.KeyCode; ROPE: TYPE = Rope.ROPE; TIPClient: TYPE = TIPPrivate.TIPClient; TIPClientRec: TYPE = TIPPrivate.TIPClientRec; secondsToPause: INTEGER ¬ 45; Reset: PROC [cmd: Commander.Handle] RETURNS [result: REF ¬ NIL, msg: ROPE ¬ NIL] = { CodeTimer.ResetTable[CodeTimer.GetTable[$PTIP]]; }; Print: PROC [cmd: Commander.Handle] RETURNS [result: REF ¬ NIL, msg: ROPE ¬ NIL] = { CodeTimer.PrintTable[cmd.out, CodeTimer.GetTable[$PTIP]]; }; ParseTIP: PUBLIC PROC [name: Rope.ROPE] RETURNS [table: REF ANY] = { table ¬ TIPUser.InstantiateNewTIPTable[name]; }; TryTIP: PROC [cmd: Commander.Handle] RETURNS [result: REF ¬ NIL, msg: ROPE ¬ NIL] = { OPEN KeySyms1, KeySymsKB; table: TIPUser.TIPTable; parseInfo: TIPPrivate.TIPParseInfo; downAction: UserInputGetActions.InputActionBody; upAction: UserInputGetActions.InputActionBody; event: LIST OF REF ANY; out: IO.STREAM; nameStream: IO.STREAM ¬ IO.RIS[cmd.commandLine]; name: Rope.ROPE; handle: UserInput.Handle; downAction.kind ¬ $Key; downAction.down ¬ TRUE; upAction.kind ¬ $Key; upAction.down ¬ FALSE; [] ¬ IO.SkipWhitespace[nameStream]; name ¬ IO.GetLineRope[nameStream]; out ¬ cmd.out; table ¬ TIPUser.InstantiateNewTIPTable[name]; parseInfo ¬ TIPPrivate.CreateParseInfo[table]; handle ¬ parseInfo.inCreek; SetUpPrincOpsKeyboard[handle]; FOR keyCode: KeyCode IN [keycode0..VAL[111]] DO downAction.keyCode ¬ keyCode; upAction.keyCode ¬ keyCode; event ¬ TIPPrivate.WideMatchEvent[parseInfo, downAction]; PrintResult[out, event]; event ¬ TIPPrivate.WideMatchEvent[parseInfo, upAction]; PrintResult[out, event]; ENDLOOP; }; TestNotify: TIPPrivate.TIPNotifyProc = { PrintResult[out, results]; }; out: IO.STREAM; SetUpPrincOpsKeyboard: PROC [handle: UserInput.Handle] = { keyTable: KeyMapping.KeyTable; success: BOOL ¬ FALSE; keySym1, keySym2: KeyTypes.KeySym; keyTable ¬ NEW[KeyMapping.KeyTableRep]; FOR keyCode: KeyMapping.KeyCode IN KeyMapping.KeyCode DO [keySym1, keySym2, success] ¬ TIPKeyboards.KeySymsFromKeyCode[keyCode]; IF success THEN { keyTable[keyCode] ¬ NEW[KeyMapping.KeySymsRep[2]]; keyTable[keyCode][0] ¬ keySym1; keyTable[keyCode][1] ¬ keySym2; } ELSE { keyTable[keyCode] ¬ NEW[KeyMapping.KeySymsRep[0]]; }; ENDLOOP; UserInputOps.SetMapping[handle, KeyMapping.NewMapping[keyTable]]; }; Queue: PROC [cmd: Commander.Handle] RETURNS [result: REF ¬ NIL, msg: ROPE ¬ NIL] = { OPEN KeySyms1, KeySymsKB; table: TIPUser.TIPTable; tipClient: TIPClient; handle: UserInput.Handle; downAction: UserInputGetActions.InputActionBody; upAction: UserInputGetActions.InputActionBody; success: BOOL ¬ FALSE; controlCodes, shiftCodes: KeyMapping.KeyCodes; nameStream: IO.STREAM ¬ IO.RIS[cmd.commandLine]; name: Rope.ROPE; [] ¬ IO.SkipWhitespace[nameStream]; name ¬ IO.GetLineRope[nameStream]; out ¬ cmd.out; tipClient ¬ TIPPrivate.CreateTIPClient[TestNotify, NIL, NIL]; handle ¬ tipClient.parseInfo.inCreek; SetUpPrincOpsKeyboard[handle]; table ¬ TIPUser.InstantiateNewTIPTable[name]; TIPPrivate.PushTIPTable[tipClient, table, FALSE]; TIPPrivate.StartTIPClient[tipClient]; -- fork a matcher process FOR keyCode: KeyCode IN [keycode0..VAL[111]] DO downAction.keyCode ¬ keyCode; UserInputInsertActions.InsertKey[handle, 0, TRUE, keyCode]; UserInputInsertActions.InsertKey[handle, 0, FALSE, keyCode]; ENDLOOP; controlCodes ¬ KeyMapping.KeyCodesFromKeySym[UserInputOps.GetMapping[handle], KeySymsKB.LeftControl]; IF controlCodes.n<1 THEN ERROR; UserInputInsertActions.InsertKey[handle, 0, TRUE, controlCodes[0].keyCode]; FOR keyCode: KeyCode IN [keycode0..VAL[111]] DO IF keyCode = controlCodes[0].keyCode THEN LOOP; UserInputInsertActions.InsertKey[handle, 0, TRUE, keyCode]; UserInputInsertActions.InsertKey[handle, 0, FALSE, keyCode]; ENDLOOP; upAction.keyCode ¬ controlCodes[0].keyCode; UserInputInsertActions.InsertKey[handle, 0, FALSE, controlCodes[0].keyCode]; shiftCodes ¬ KeyMapping.KeyCodesFromKeySym[UserInputOps.GetMapping[handle], KeySymsKB.LeftShift]; IF shiftCodes.n<1 THEN ERROR; UserInputInsertActions.InsertKey[handle, 0, TRUE, shiftCodes[0].keyCode]; FOR keyCode: KeyCode IN [keycode0..VAL[111]] DO IF keyCode = shiftCodes[0].keyCode THEN LOOP; UserInputInsertActions.InsertKey[handle, 0, TRUE, keyCode]; UserInputInsertActions.InsertKey[handle, 0, FALSE, keyCode]; ENDLOOP; UserInputInsertActions.InsertKey[handle, 0, TRUE, controlCodes[0].keyCode]; FOR keyCode: KeyCode IN [keycode0..VAL[111]] DO IF keyCode = controlCodes[0].keyCode OR keyCode = shiftCodes[0].keyCode THEN LOOP; UserInputInsertActions.InsertKey[handle, 0, TRUE, keyCode]; UserInputInsertActions.InsertKey[handle, 0, FALSE, keyCode]; ENDLOOP; Process.Pause[ticks: Process.SecondsToTicks[secondsToPause]]; }; PrintResult: PROC [s: IO.STREAM, result: LIST OF REF ANY] = { PrintElement: PROC [s: IO.STREAM, element: REF ANY] = { WITH element SELECT FROM atom: ATOM => s.PutRope[Atom.GetPName[atom]]; coords: TIPUser.TIPScreenCoords => s.PutRope["Coords"]; char: REF CHAR => {s.PutChar['']; s.PutChar[char­];}; time: TIPUser.TIPTime => s.PutRope["Time"]; int: REF INT => s.PutF1["%g", [integer[int­]]]; text: REF TEXT => s.PutBlock[text]; ENDCASE => ERROR; s.PutChar[IO.SP]; }; IF result = NIL THEN s.PutRope["----"] ELSE { FOR list: LIST OF REF ANY ¬ result, list.rest UNTIL list = NIL DO PrintElement[s, list.first]; ENDLOOP; }; s.PutChar[IO.CR]; }; Commander.Register["queue", Queue, "queue , parses a tip table, queues a sequence of keyboard and mouse actions, filters them with the tip table, and prints out the results"]; Commander.Register["trytip", TryTIP, "match , parses a tip table, and filters a set of keyboard actions through the tip table, and prints out the results"]; Commander.Register["resetTIP", Reset, "Clears the CodeTimer table that measures TIP performance"]; Commander.Register["printTIP", Print, "Prints out the CodeTimer table for TIP performance"]; END. ͺ TIPTestImpl.mesa Copyright Σ 1988, 1991, 1992 by Xerox Corporation. All rights reserved. Bier, November 18, 1988 5:07:14 pm PST Michael Plass, November 26, 1991 1:38 pm PST Christian Jacobi, February 24, 1992 4:05 pm PST Contents: Testing TIP. Try keys going down and up Try keys going down and up Do it again with the Control key down. Do it again with the Shift key down. Do it again with Control and Shift Down Κ“–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ Οeœ<™HKšœ&™&K™,K™/K™K™K™—šΟk ˜ KšœžœΈ˜Φ—K˜šΟn œžœž˜Kšžœžœ^˜„Kšžœ˜Kšžœ ˜Kšœ˜—Kšž˜K˜Kšœ žœ˜%Kšœ žœ˜+Kšœ žœ˜#Kšœ žœ˜)K˜Kšœ žœ˜!Kšžœžœžœ˜Kšœ žœ˜'Kšœžœ˜-K˜Kšœžœ˜K˜šŸœžœžœ žœžœžœžœ˜TK˜0K˜K˜—šŸœžœžœ žœžœžœžœ˜TKšœ9˜9K˜—K˜šŸœžœžœ žœžœ žœžœ˜DKšœ-˜-K˜K˜—šŸœžœžœ žœžœžœžœ˜UKšžœ˜Kšœ˜Kšœ#˜#Kšœ0˜0Kšœ.˜.Kš œžœžœžœžœ˜Kšœžœž˜Kšœ žœž œžœ˜0Kšœ ž˜Kšœ˜K˜Kšœžœ˜K˜Kšœžœ˜Kšœžœ˜#Kšœžœ˜"K˜Kšœ˜K˜Kšœ-˜-Kšœ.˜.Kšœ˜Kšœ˜K˜K™šžœžœ žœž˜/Kšœ˜Kšœ˜Kšœ9˜9Kšœ˜Kšœ7˜7Kšœ˜Kšžœ˜—K˜K˜—šŸ œ˜(Kšœ˜K˜—šœžœžœ˜K˜—šŸœžœ˜:Kšœ˜Kšœ žœžœ˜Kšœ"˜"Kšœ žœ˜'šžœžœž˜8KšœG˜Gšžœ žœ˜Kšœžœ˜2Kšœ˜Kšœ˜K˜—šžœ˜Kšœžœ˜2K˜—Kšžœ˜—KšœA˜AK˜K˜—šŸœžœžœ žœžœžœžœ˜TKšžœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ0˜0Kšœ.˜.Kšœ žœžœ˜Kšœ.˜.Kšœ žœž œžœ˜0Kšœ ž˜K˜Kšœžœ˜#Kšœžœ˜"K˜Kšœ˜Kšœ3žœžœ˜=Kšœ%˜%Kšœ˜Kšœ-˜-Kšœ*žœ˜1Kšœ&Οc˜?K˜K™šžœžœž˜/Kšœ˜Kšœ,žœ ˜;Kšœ,žœ ˜