<> <> <> <> DIRECTORY Convert, Commander, IO, KeyNames, Rope, Xl; X11HelpCommands: CEDAR PROGRAM IMPORTS Convert, Commander, IO, KeyNames, Rope, Xl ~ BEGIN FormatAsSetOfEvent: PROC [events: CARD] RETURNS [r: Rope.ROPE] = { r ¬ FormatSetOfEvent[LOOPHOLE[events]]; }; FormatSetOfEvent: PROC [events: Xl.SetOfEvent] RETURNS [r: Rope.ROPE] = { Check: PROC [e: Xl.SetOfEvent, r1: Rope.ROPE] = { IF Xl.ORSetOfEvents[events, e]=events THEN { IF nonEmpty THEN r ¬ Rope.Concat[r, ", "]; r ¬ Rope.Concat[r, r1]; nonEmpty ¬ TRUE; }; }; nonEmpty: BOOL ¬ FALSE; IF events=Xl.disableEvents THEN RETURN ["{disableEvents}"]; r ¬ "{"; Check[[keyPress: TRUE], "keyPress"]; Check[[keyRelease: TRUE], "keyRelease"]; Check[[buttonPress: TRUE], "buttonPress"]; Check[[buttonRelease: TRUE], "buttonRelease"]; Check[[enterWindow: TRUE], "enterWindow"]; Check[[leaveWindow: TRUE], "leaveWindow"]; Check[[pointerMotion: TRUE], "pointerMotion"]; Check[[pointerMotionHint: TRUE], "pointerMotionHint"]; Check[[button1Motion: TRUE], "pointerMotion1"]; Check[[button2Motion: TRUE], "pointerMotion2"]; Check[[button3Motion: TRUE], "pointerMotion3"]; Check[[button4Motion: TRUE], "pointerMotion4"]; Check[[button5Motion: TRUE], "pointerMotion5"]; Check[[buttonMotion: TRUE], "buttonMotion"]; Check[[keymapState: TRUE], "keymapState"]; Check[[exposure: TRUE], "exposure"]; Check[[visibilityChange: TRUE], "visibilityChange"]; Check[[structureNotify: TRUE], "structureNotify"]; Check[[resizeRedirect: TRUE], "resizeRedirect"]; Check[[substructureNotify: TRUE], "substructureNotify"]; Check[[focusChange: TRUE], "focusChange"]; Check[[propertyChange: TRUE], "propertyChange"]; Check[[colormapChange: TRUE], "colorMapChange"]; Check[[ownerGrabButton: TRUE], "ownerGrabButton"]; r ¬ Rope.Flatten[Rope.Concat[r, "}"]]; }; X11PrintSetOfEvent: Commander.CommandProc = { <<--Implements a command which converts the input into a Xl.SetOfEvent>> ENABLE Convert.Error => { msg ¬ "Format is X11PrintSetOfEvent number"; GOTO Oops }; c: CARD ¬ Convert.CardFromRope[cmd.commandLine]; msg ¬ FormatAsSetOfEvent[c]; EXITS Oops => {result ¬ $Failure}; }; PrintNumber: Commander.CommandProc = { c: CARD; p: INT; keyName: Rope.ROPE; r: Rope.ROPE ¬ cmd.commandLine; <<--skip over garbage at beginning>> p _ Rope.SkipOver[r, 0, " \r\l\t"]; IF p>0 AND p> p ¬ Rope.SkipTo[r, 0, "\r\l"]; IF p>0 THEN r ¬ Rope.Substr[r, 0, p]; <<--convert eventual C language syntax for hex to Cedar syntax>> IF Rope.Equal[Rope.Substr[r, 0, 2], "0x", FALSE] THEN { r ¬ Rope.Cat["0", Rope.Substr[r, 2], "H"] }; BEGIN c ¬ Convert.CardFromRope[r ! Convert.Error => { c ¬ KeyNames.KeySymFromName[r].val; IF c=0 THEN {msg ¬ "Format is: number"; GOTO Oops}; GOTO TryAgain; }]; EXITS TryAgain => {}; END; keyName ¬ KeyNames.NameFromKeySym[[c]]; msg ¬ IO.PutFLR[" dec: %g oct: %b hex: %x, keysym: %g\n", LIST[IO.card[c], IO.card[c], IO.card[c], IO.rope[keyName]]]; EXITS Oops => {result ¬ $Failure}; }; Commander.Register["X11PrintSetOfEvent", X11PrintSetOfEvent, "Convert number to Xl.SetOfEvent"]; Commander.Register["PrintKey", PrintNumber, "Print in different ways"]; Commander.Register["X11PrintKey", PrintNumber, "Print in different ways"]; END.