DIRECTORY Ascii, Atom, Basics, BasicTime, CharDisplays, Commander, CommandTool, Convert, DisplayControllers, EmTermCap, FS, IO, Menus, MessageWindow, Protocols, Rope, TermCaps, ViewerOps, ViewerTools; TermEmCmds: CEDAR PROGRAM IMPORTS CharDisplays, Commander, CommandTool, DisplayControllers, EmTermCap, FS, IO, Menus, MessageWindow, Protocols, Rope, TermCaps, ViewerOps, ViewerTools = {OPEN CharDisplays, DisplayControllers, TermCaps; Protocol: TYPE = Protocols.Protocol; Conversation: TYPE = Protocols.Conversation; AtomList: TYPE = EmTermCap.AtomList; TermDataList: TYPE = LIST OF TermData; TermData: TYPE = REF TermDataRep; TermDataRep: TYPE = RECORD [ term: Term, cp: ControlProgram, det: DisplayDetails, ungrokked: AtomList]; termDatas: TermDataList _ NIL; Em: TYPE = REF EmRep; EmRep: TYPE = RECORD [ tc: TermCap, td: TermData, dc: DisplayController, p: Protocol, c: Conversation]; installationDirectory: ROPE _ CommandTool.CurrentWorkingDirectory[]; lastEm: Em _ NIL; GetTermData: PROC [term: Term] RETURNS [td: TermData] = { tdl: TermDataList; FOR tdl _ termDatas, tdl.rest WHILE tdl # NIL DO IF tdl.first.term = term THEN EXIT; ENDLOOP; IF tdl = NIL THEN { cp: ControlProgram; det: DisplayDetails; ungrokked: AtomList; [cp, det, ungrokked] _ EmTermCap.MakeTermController[term, TRUE]; td _ NEW [TermDataRep _ [term, cp, det, ungrokked]]; termDatas _ CONS[td, termDatas]; } ELSE td _ tdl.first; }; MakeEm: PROC [cmd: Commander.Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL] = { termcapFile: ROPE _ "UnixTermcap"; termName: ROPE _ "vt52"; displayClass: ROPE _ "Tioga"; protocolName: ROPE _ "PupChat"; serverName: ROPE _ NIL; em: Em; termCap: TermCap; term: Term; cdc: CharDisplayClass; cd: CharDisplay _ NIL; dc: DisplayController _ NIL; td: TermData; p: Protocol; i: INT _ 1; argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd]; WHILE i < argv.argc DO IF argv[i].Length[] > 0 AND argv[i].Fetch[0] = '- AND i+1 = argv.argc THEN { cmd.out.PutF["Missing %g --- assuming default\n", IO.rope[argv[i]]]; EXIT}; SELECT TRUE FROM argv[i].Equal["-termcap"] => {termcapFile _ argv[i+1]; i _ i+2}; argv[i].Equal["-term"] => {termName _ argv[i+1]; i _ i+2}; argv[i].Equal["-display"] => {displayClass _ argv[i+1]; i _ i+2}; argv[i].Equal["-protocol"] => {protocolName _ argv[i+1]; i _ i+2}; argv[i].Equal["-host"] => {serverName _ argv[i+1]; i _ i+2}; argv[i].Fetch[0] = '- => RETURN [$Failure, Rope.Cat["Unrecognized switch: %g", argv[i]]] ENDCASE => {serverName _ argv[i]; i _ i+1}; ENDLOOP; termCap _ TermCaps.GetTermCap[termcapFile, installationDirectory]; IF termCap = NIL THEN RETURN [$Failed, IO.PutFR["Couldn't find termcap file %g", IO.rope[termcapFile]]]; term _ TermCaps.GetTerm[termCap, termName]; IF term = NIL THEN RETURN [$Failed, IO.PutFR["Couldn't find terminal %g", IO.rope[termName]]]; td _ GetTermData[term]; cdc _ CharDisplays.GetClass[displayClass]; IF cdc = NIL THEN RETURN [$Failed, IO.PutFR["Couldn't find display class %g", IO.rope[displayClass]]]; p _ Protocols.GetProtocol[protocolName]; IF p = NIL THEN RETURN [$Failed, IO.PutFR["Couldn't find protocol %g", IO.rope[protocolName]]]; cd _ CharDisplays.Create[class: cdc, det: td.det]; dc _ DisplayControllers.Create[cd, td.cp]; em _ NEW [EmRep _ [termCap, td, dc, p]]; IF dc.cd.viewer # NIL THEN { m: Menus.Menu _ em.dc.cd.viewer.menu; oldLines: Menus.MenuLine _ m.GetNumberOfLines[]; m.ChangeNumberOfLines[oldLines+1]; m.AppendMenuEntry[Menus.CreateEntry["Connect", Connect, em], oldLines]; m.AppendMenuEntry[Menus.CreateEntry["Disconnect", Disconnect, em], oldLines]; SetName[em, NIL]; }; lastEm _ em; IF serverName.Length[] > 0 THEN ConnectWork[em, serverName]; }; SetName: PROC [em: Em, serverName: ROPE] = { fullTermcapFile: ROPE; tcp: FS.ComponentPositions; termcapName: ROPE; [fullTermcapFile, tcp, ] _ FS.ExpandName[em.tc.fileID.gName]; termcapName _ fullTermcapFile.Substr[start: tcp.base.start, len: tcp.base.length]; em.dc.cd.viewer.name _ IO.PutFR["%g of %g; %g; %g", IO.rope[em.td.term.bestName], IO.rope[termcapName], IO.rope[em.dc.cd.class.name], IO.rope[em.p.name]]; IF serverName # NIL THEN em.dc.cd.viewer.name _ serverName.Cat["; ", em.dc.cd.viewer.name]; ViewerOps.PaintViewer[em.dc.cd.viewer, all]; }; Connect: PROC [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift, control: BOOL _ FALSE] --Menus.MenusProc-- = { em: Em _ NARROW[clientData]; serverName: ROPE _ ViewerTools.GetSelectionContents[]; ConnectWork[em, serverName]; }; ConnectWork: PROC [em: Em, serverName: ROPE] = { IF em.c # NIL THEN { MessageWindow.Append["Already connected!", TRUE]; } ELSE { em.c _ em.p.Connect[serverName: serverName, fromClient: em.dc.fromDisplay, toClient: em.dc.toDisplay, noteDisconnect: NoteDisconnect, clientData: em]; SetName[em, serverName]; }; }; Disconnect: PROC [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift, control: BOOL _ FALSE] --Menus.MenusProc-- = { em: Em _ NARROW[clientData]; IF em.c # NIL THEN { em.p.Disconnect[em.c]; } ELSE { MessageWindow.Append["Already disconnected!", TRUE]; }; }; NoteDisconnect: PROC [clientData: REF ANY] = { em: Em _ NARROW[clientData]; SetName[em, NIL]; em.c _ NIL; }; Commander.Register[key: "TermEm", proc: MakeEm, doc: "Make a terminal emulator"]; }. PTermEmCmds.Mesa Last Edited by: Spreitzer, March 14, 1985 11:57:16 am PST ΚΪ– "cedar" style˜Icodešœ™K™9K˜KšΟk œoœœJ˜ΘK˜šΠbx œœ˜KšœFœœI˜œK˜Kšœœ,˜4K˜Kšœ œ˜$Kšœœ˜,Kšœ œ˜$K˜Kšœœœœ ˜&Kšœ œœ ˜!šœ œœ˜K˜ K˜K˜K˜—K˜Kšœœ˜K˜Kšœœœ˜šœœœ˜K˜ K˜ K˜K˜ K˜—K˜Kšœœ)˜DK˜Kšœ œ˜K˜šΟn œœœ˜9Kšœ˜šœœœ˜0Kšœœœ˜#Kšœ˜—šœœœ˜K˜K˜K˜Kšœ:œ˜@Kšœœ,˜4Kšœ œ˜ K˜—Kšœ˜K˜—K˜šŸœœœ œœœœ˜UKšœ œ˜"Kšœ œ ˜Kšœœ ˜Kšœœ ˜Kšœ œœ˜Kšœ˜Kšœ˜K˜ K˜Kšœœ˜Kšœœ˜K˜ Kšœ ˜ Kšœœ˜ Kšœ:˜:šœ˜šœœœœ˜LKšœ2œ˜DKšœ˜—šœœ˜K˜@Kšœ:˜:KšœA˜AKšœB˜BKšœ<˜