<> <> <> <> <<>> DIRECTORY Commander, CommanderOps, IO, Rope, Scheme, X11EvalServer; X11SchemeServer: CEDAR PROGRAM IMPORTS Commander, CommanderOps, IO, Rope, Scheme, X11EvalServer ~ BEGIN CreateListenerCommand: Commander.CommandProc ~ { success: BOOL; message: Rope.ROPE; display: Rope.ROPE ¬ NIL; selection: Rope.ROPE ¬ "CedarScheme"; userEnv: Scheme.Environment ¬ Scheme.NewEnvironmentStructure[]; DO arg: Rope.ROPE ¬ CommanderOps.NextArgument[cmd]; IF arg=NIL THEN EXIT; SELECT TRUE FROM Rope.Equal[arg, "-display", FALSE] => display ¬ CommanderOps.NextArgument[cmd]; Rope.Equal[arg, "-selection", FALSE] => selection ¬ CommanderOps.NextArgument[cmd]; ENDCASE => CommanderOps.Failed["unknown argument"]; ENDLOOP; [success, message] ¬ X11EvalServer.Create[server: display, selection: selection, proc: CommandProc, environment: userEnv]; IF success THEN msg ¬ "ok" ELSE { msg ¬ Rope.Concat["selection ownership not established ", message]; result ¬ $Failure }; }; CommandProc: PROC [in: Rope.ROPE, environment: REF] RETURNS [out: Rope.ROPE ¬ NIL, result: REF ¬ NIL] = { inStream, outStream: IO.STREAM; userEnv: Scheme.Environment ¬ NARROW[environment]; inStream ¬ IO.RIS[in]; outStream ¬ IO.ROS[]; Scheme.ReadEvalPrintLoop[inStream, outStream, userEnv]; out ¬ IO.RopeFromROS[outStream]; }; Commander.Register["X11SchemeServer", CreateListenerCommand, "create an interop scheme listener"]; END.