home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
dev
/
obero
/
oberon-a
/
source
/
amigautil
/
wbconsole.mod
< prev
Wrap
Text File
|
1994-09-03
|
3KB
|
117 lines
(*************************************************************************
$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.