home *** CD-ROM | disk | FTP | other *** search
- (*************************************************************************
-
- $RCSfile: WbConsole.mod $
- Description: Module to open a console window for programs run from the
- Workbench. Ensures that the program has a standard IO
- environment, with valid Input() and Output() filehandles.
-
- Created by: fjc (Frank Copeland)
- $Revision: 3.2 $
- $Author: fjc $
- $Date: 1994/09/03 16:12:04 $
-
- Copyright © 1994, Frank Copeland.
- This file is part of the Oberon-A Library.
- See Oberon-A.doc for conditions of use and distribution.
-
- *************************************************************************)
-
- MODULE WbConsole;
-
- (*
- ** $C= CaseChk $I= IndexChk $L= LongAdr $N- NilChk
- ** $P- PortableCode $R= RangeChk $S= StackChk $T= TypeChk
- ** $V= OvflChk $Z= ZeroVars
- *)
-
- IMPORT
- SYS := SYSTEM,
- Kernel,
- e := Exec,
- d := Dos,
- wb := Workbench,
- i := Icon;
-
- CONST
- DefWbConsole = "CON:40/12/480/150/Oberon-A Console Window";
- maxD = 9;
-
- VAR
- wbConsole : d.FileHandlePtr;
-
- (*------------------------------------*)
- PROCEDURE* CloseWbConsole (VAR rc : LONGINT);
-
- BEGIN (* CloseWbConsole *)
- IF wbConsole # NIL THEN d.base.OldClose (wbConsole) END
- END CloseWbConsole;
-
- (*------------------------------------*)
- PROCEDURE SetupWbConsole ();
-
- VAR
- oldDir : d.FileLockPtr;
- oldFH : d.FileHandlePtr;
- console : e.STRPTR;
- diskObj : wb.DiskObjectPtr;
- toolTypes : wb.ToolTypePtr;
- process : d.ProcessPtr;
- conTask : e.MsgPortPtr;
- wbMsg : wb.WBStartupPtr;
-
- BEGIN (* SetupWbConsole *)
- (* Try to open icon.library *)
- i.OpenLib (FALSE);
-
- IF i.base # NIL THEN (* Check for a WINDOW= tooltype *)
- wbMsg := Kernel.WBenchMsg;
- (* First CD to the app's directory *)
- oldDir := d.base.CurrentDir (wbMsg.argList [0].lock);
- (* Attempt to load the app's icon *)
- diskObj := i.base.GetDiskObject (wbMsg.argList [0].name^);
- IF diskObj # NIL THEN
- console := i.base.FindToolType (diskObj.toolTypes, "WINDOW");
- (* We will free diskObj AFTER we have finished with console. *)
- END;
- (* Back to where we started *)
- oldDir := d.base.CurrentDir (oldDir);
- ELSE
- diskObj := NIL; console := NIL
- END;
-
- (* Open the console window *)
- IF console = NIL THEN console := SYS.ADR (DefWbConsole) END;
- wbConsole := d.base.Open (console^, d.modeNewFile);
- IF diskObj # NIL THEN i.base.FreeDiskObject (diskObj) END;
- ASSERT (wbConsole # NIL);
-
- (* Set the console task and the Input/Output handles. *)
- IF d.base.version >= 37 THEN
- oldFH := d.base.SelectInput (wbConsole);
- IF oldFH # NIL THEN d.base.OldClose (oldFH) END;
- oldFH := d.base.SelectOutput (wbConsole);
- IF oldFH # NIL THEN d.base.OldClose (oldFH) END;
- conTask := wbConsole.type;
- IF conTask # NIL THEN
- conTask := d.base.SetConsoleTask (conTask)
- (* I assume the old one can be ignored. The autodocs are silent
- ** about this.
- *)
- END;
- ELSE
- (* This is from Commodore's startup.asm, for <V37 dos.library. *)
- process := SYS.VAL (d.ProcessPtr, e.base.FindTask (NIL));
- process.cis := wbConsole;
- process.cos := wbConsole;
- conTask := wbConsole.type;
- IF conTask # NIL THEN process.consoleTask := conTask END;
- END;
-
- Kernel.SetCleanup (CloseWbConsole);
- END SetupWbConsole;
-
- BEGIN (* WbConsole *)
- wbConsole := NIL;
- IF Kernel.fromWorkbench THEN SetupWbConsole () END
- END WbConsole.
-