home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / useful / os20 / cdity / devicelock.lha / DeviceLock / Txt / DeviceLock.mod < prev    next >
Text File  |  1993-12-05  |  18KB  |  557 lines

  1. (*---------------------------------------------------------------------------
  2.  :Program.    DeviceLock.mod
  3.  :Author.     Thomas Wagner
  4.  :Address.    Mühlenweg 7, 90602 Pyrbaum, Germany
  5.  :Copyright.  © 1991-93 by Thomas Wagner [tom], see DeviceLock.guide
  6.  :Language.   Oberon
  7.  :Translator. Amiga Oberon Compiler V3.00d
  8.  :Import.     HotKey.mod         V2.0 Thomas Igracki, [tom]  (on this disk)
  9.  :Import.     MoreIntuition.mod  V1.3 [mick]                 (Amok 78)
  10.  :Import.     WBReadArgs.mod     V1.0 [hG]                   (Amok 83)
  11.  :Import.     PrintF.mod         V1.4 Volker Rudolph, [hG]   (Amok 82)
  12.  :Contents.   Lock with Intuition-Interface (2.04 or higher ONLY!)
  13. ---------------------------------------------------------------------------*)
  14.  
  15. MODULE DeviceLock;
  16.  
  17. (*-------------------------------------------------------------------------*)
  18.  
  19. IMPORT c  := Conversions,
  20.        d  := Dos,
  21.        DLd:= DLdrives,
  22.        DLr:= DLrequester,
  23.        DLs:= DLstrings,
  24.        DLp:= DLprefs,
  25.        e  := Exec,
  26.        g  := Graphics,
  27.        gt := GadTools,
  28.        hot:= HotKey,
  29.        I  := Intuition,
  30.        MI := MoreIntuition,
  31.        ol := OberonLib,
  32.        s  := Strings,
  33.        sys:= SYSTEM,
  34.        t  := Timer,
  35.        u  := Utility;
  36.  
  37. (*-------------------------------------------------------------------------*)
  38.  
  39. CONST
  40.  
  41.   comName  *= "DeviceLock\o$VER: DeviceLock 1.0 (31.10.93)";
  42.   comTitle *= "DeviceLock, 1.0 © 1991-93 [tom]";
  43.   comDescr *= "Intuition-Interface for CLI-Lock";
  44.  
  45.   scrtitle = "DeviceLock, 1.0 - © 1991-93 by Thomas Wagner. All Rights reserved.";
  46.  
  47.   about    = "DeviceLock 1.0\n\n"
  48.              "© 1991-93 by Thomas Wagner, Pyrbaum [tom].\n"
  49.               "%s";
  50.  
  51.   topadd = 5 ;
  52.  
  53.   checkscal = 2421;
  54.  
  55. (*-------------------------------------------------------------------------*)
  56.  
  57. TYPE
  58.  
  59.     NewMenus = ARRAY 9 OF gt.NewMenu;
  60.  
  61. (*-------------------------------------------------------------------------*)
  62.  
  63. CONST
  64.  
  65.   menuLock     = 1;
  66.   menuUnlock   = 2;
  67.   menuAbout    = 3;
  68.   menuHide     = 4;
  69.   menuQuit     = 5;
  70.  
  71.  
  72.   myNewMenuConst = NewMenus(
  73.     gt.title, NIL,         NIL,          {}, LONGSET{}, NIL,
  74.     gt.item , NIL,         sys.ADR("L"), {}, LONGSET{}, menuLock,
  75.     gt.item , NIL,         sys.ADR("U"), {}, LONGSET{}, menuUnlock,
  76.     gt.item , gt.barLabel, NIL,          {}, LONGSET{}, NIL,
  77.     gt.item , NIL,         sys.ADR("?"), {}, LONGSET{}, menuAbout,
  78.     gt.item , gt.barLabel, NIL,          {}, LONGSET{}, NIL,
  79.     gt.item , NIL,         sys.ADR("H"), {}, LONGSET{}, menuHide,
  80.     gt.item , NIL,         sys.ADR("Q"), {}, LONGSET{}, menuQuit,
  81.     gt.end  , NIL,         NIL,          {}, LONGSET{}, NIL);
  82. (*-------------------------------------------------------------------------*)
  83.  
  84. VAR
  85.   font          : g.TextFontPtr;
  86.   ng            : gt.NewGadget;
  87.   glist         : I.GadgetPtr;
  88.   gad           : I.GadgetPtr;
  89.   vi            : e.APTR;
  90.   terminated    : BOOLEAN;
  91.   imsg          : I.IntuiMessagePtr;
  92.   imsgClass     : LONGSET;
  93.   imsgCode      : INTEGER;
  94.   count         : INTEGER;
  95.   TimerPort     : e.MsgPortPtr;
  96.   TimeReq       : t.TimeRequestPtr;
  97.   OpenDev       : SHORTINT;
  98.   signals       : LONGSET;
  99.   allock        : BOOLEAN;
  100.   allunlock     : BOOLEAN;
  101.   quickquit     : BOOLEAN;
  102.   gheight       : INTEGER;
  103.   wheight       : INTEGER;
  104.   wwidth        : INTEGER;
  105.   windowopen    : BOOLEAN;
  106.   HotSig        : SHORTINT;
  107.   HotType    : LONGSET;
  108.   HotID         : LONGINT;
  109.   closewin      : BOOLEAN;
  110.   myNewMenu     : NewMenus;
  111.   menu          : I.MenuPtr;
  112.   topborder     : INTEGER;
  113.   zoom          : ARRAY 4 OF INTEGER;
  114.   force         : BOOLEAN;
  115.  
  116.  
  117. (*------ Append one Gadget to Gadget-List ---------------------------------*)
  118.  
  119. PROCEDURE * MakeGad(VAR n: DLp.driveT);
  120. BEGIN
  121.   ng.topEdge := topborder + topadd + 2 + (count)*gheight;
  122.   ng.gadgetText := sys.ADR(n.PrintName);
  123.   ng.gadgetID := count;
  124.   gad := gt.CreateGadget(gt.checkBoxKind, gad, ng,
  125.                          I.gaDisabled, sys.VAL(SHORTINT,n.disabled),
  126.                          gt.cbChecked, sys.VAL(SHORTINT,n.locked),
  127.                          gt.cbScaled, I.LTRUE,
  128.                          u.done);
  129.   n.GadPtr:=gad;
  130. END MakeGad;
  131.  
  132.  
  133. (*------ Prepare and Send IO ----------------------------------------------*)
  134.  
  135. PROCEDURE psIO();
  136. BEGIN
  137.   TimeReq.time.secs  := DLp.Prefs.CheckTime;
  138.   TimeReq.time.micro := 0;
  139.   e.SendIO(TimeReq);
  140. END psIO;
  141.  
  142.  
  143. (*------ Do something on response to a pressed Gadget ---------------------*)
  144.  
  145. PROCEDURE HandleGadgetEvent(gad: I.GadgetPtr; code: INTEGER);
  146. BEGIN
  147.   IF gad.gadgetID =  0 THEN
  148.     DLd.LockAll(FALSE);
  149.   ELSE
  150.     IF gad.gadgetID<=DLp.Prefs.DriveNum THEN
  151.       IF I.selected IN gad.flags THEN
  152.         DLd.LckOne(DLp.drive[gad.gadgetID-1])
  153.       ELSE
  154.         DLd.UnLckOne(DLp.drive[gad.gadgetID-1])
  155.       END;
  156.     END;
  157.     force := FALSE;
  158.   END;
  159. END HandleGadgetEvent;
  160.  
  161. (*------ Response to Menu-select ------------------------------------------*)
  162.  
  163. PROCEDURE HandleMenuEvent(code: INTEGER);
  164.  
  165. VAR
  166.   item: I.MenuItemPtr;
  167.  
  168. BEGIN
  169.   WHILE (code # I.menuNull) AND ~ terminated DO
  170.     item := I.ItemAddress(menu^, code);
  171.     CASE sys.VAL(LONGINT,gt.MenuItemUserData(item)) OF
  172.       menuLock   : DLd.LockAll(FALSE); |
  173.       menuUnlock : DLd.UnlockAll(FALSE); |
  174.       menuAbout  : DLr.RequestNotify(DLs.GetString(DLs.MsgAbout),
  175.                                    sys.ADR(about),
  176.                                    DLs.GetString(DLs.MsgAllRightsReserved)); |
  177.       menuHide   : closewin   := TRUE; |
  178.       menuQuit   : terminated := TRUE; quickquit := FALSE |
  179.     ELSE END;
  180.  
  181.     code := item.nextSelect;
  182.  
  183.   END;
  184.  
  185. END HandleMenuEvent;
  186.  
  187. (*------ Lock all window-specific resources and open window ---------------*)
  188.  
  189. PROCEDURE OpenWindow(hijackfront: BOOLEAN);
  190. VAR    twidth  : INTEGER;
  191.        mysc    : I.ScreenPtr;
  192.        gadwidth: LONGINT;
  193.  
  194.   (*------ Starts Gadget-List and calls MakeGadget --------------------------*)
  195.  
  196.   PROCEDURE CreateAllGadgets(VAR glist: I.GadgetPtr;
  197.                                  vi: e.APTR;
  198.                                  topborder: INTEGER;
  199.                                  mysc: I.ScreenPtr): BOOLEAN;
  200.   BEGIN
  201.     gad := gt.CreateContext(glist);
  202.     ng.textAttr := mysc.font;
  203.     ng.leftEdge := 8;
  204.     ng.topEdge := topadd + topborder;
  205.     ng.width := wwidth-15;
  206.     ng.height := gheight + 2;
  207.     ng.gadgetText := DLs.GetString(DLs.GadLockAll);
  208.     ng.flags := LONGSET{};
  209.     ng.gadgetID := 0;
  210.     ng.visualInfo := vi;
  211.     gad := gt.CreateGadget(gt.buttonKind, gad, ng, u.done);
  212.  
  213.     ng.flags := LONGSET{gt.placeTextRight};
  214.     ng.height := gheight;
  215.     ng.width := SHORT(gadwidth);
  216.     FOR count := 1 TO DLp.Prefs.DriveNum DO
  217.       MakeGad(DLp.drive[count-1]);
  218.     END;
  219.  
  220.     RETURN gad#NIL;
  221.  
  222.   END CreateAllGadgets;
  223.  
  224.   (*---- Check and FailOut if FALSE   +  Unlock PubScreen! ----------------*)
  225.   PROCEDURE CheckAndFail(test: BOOLEAN; error: ARRAY OF CHAR);
  226.   BEGIN
  227.     IF ~test THEN
  228.       (* Save to call with mysc=NIL ! *) I.UnlockPubScreen(NIL,mysc);
  229.       DLr.FailOut(error);
  230.     END;
  231.   END CheckAndFail;
  232.  
  233.   (*---- Swaps two INTEGER's ----------------------------------------------*)
  234.   PROCEDURE SwapInt(VAR x,y: INTEGER);
  235.   VAR s: INTEGER;
  236.   BEGIN
  237.     s := x;
  238.     x := y;
  239.     y := s;
  240.   END SwapInt;
  241.  
  242.   (*---- Max of two INTEGER's ---------------------------------------------*)
  243.   PROCEDURE Max(x,y: INTEGER):INTEGER;
  244.   BEGIN
  245.   IF x > y THEN RETURN(x) ELSE RETURN(y) END;
  246.   END Max;
  247.  
  248.   (*---- Min of two INTEGER's ---------------------------------------------*)
  249.   PROCEDURE Min(x,y: INTEGER):INTEGER;
  250.   BEGIN
  251.   IF x < y THEN RETURN(x) ELSE RETURN(y) END;
  252.   END Min;
  253.  
  254.  
  255. BEGIN
  256.   IF hijackfront THEN
  257.     DLp.Buffer1 := "\o";
  258.     mysc := MI.LockFrontPubScr(DLp.Buffer1);
  259.   ELSE
  260.     mysc := I.LockPubScreen(DLp.Prefs.PubScreen);
  261.   END;
  262.   IF mysc=NIL THEN mysc := I.LockPubScreen(NIL) END;
  263.   CheckAndFail(mysc#NIL,"LockPubScreen()");
  264.  
  265.   font := g.OpenFont(mysc.font^);
  266.   CheckAndFail(font#NIL,"OpenFont()");
  267.  
  268.   zoom[0] := DLp.Prefs.LeftEdgeZoomed;
  269.   zoom[1] := DLp.Prefs.TopEdgeZoomed;
  270.  
  271.   gheight := mysc.font.ySize;
  272.   IF gheight < 11 THEN gheight := 11 END;
  273.  
  274.   wwidth := g.TextLength(sys.ADR(mysc.rastPort),
  275.                          DLs.GetString(DLs.GadLockAll)^,
  276.                          s.Length(DLs.GetString(DLs.GadLockAll)^))+40;
  277.   IF DLp.OSrelease3 THEN
  278.     gadwidth := gheight;
  279.     gadwidth := gadwidth * checkscal DIV 1024; (* Operation LONGINT *)
  280.   ELSE
  281.     gadwidth := 26;
  282.   END;
  283.   FOR count := 0 TO DLp.Prefs.DriveNum-1 DO
  284.     twidth := g.TextLength(sys.ADR(mysc.rastPort),
  285.                            DLp.drive[count].PrintName,
  286.                            s.Length(DLp.drive[count].PrintName))
  287.                            + SHORT(gadwidth) + 30  ;
  288.     IF  twidth > wwidth THEN wwidth := twidth END;
  289.   END; (* FOR *)
  290.  
  291.  
  292.   vi := gt.GetVisualInfo(mysc,u.done);
  293.   CheckAndFail(vi#NIL,"GetVisualInfo()");
  294.  
  295.   topborder := mysc.wBorTop + mysc.font.ySize;
  296.  
  297.   menu := gt.CreateMenus(myNewMenu,u.done);
  298.   IF menu=NIL THEN DLr.FailOut("CreateMenus()") END;
  299.   CheckAndFail(gt.LayoutMenus(menu, vi, gt.mnNewLookMenus, I.LTRUE, u.done),"LayoutMenus()");
  300.  
  301.   CheckAndFail(CreateAllGadgets(glist,vi,topborder,mysc),"CreateAllGadgets()");
  302.   wheight:=(DLp.Prefs.DriveNum+1) * gheight + 2 * topadd + topborder + mysc.wBorBottom;
  303.  
  304.   zoom[2] :=   Min(DLd.maxTitles,DLp.Prefs.DriveNum) 
  305.              * Max(g.TextLength(sys.ADR(mysc.rastPort),"-",1),
  306.                    g.TextLength(sys.ADR(mysc.rastPort),"+",1))
  307.              + 85;
  308.  
  309.   zoom[3] := topborder + 1;
  310.  
  311.   IF DLp.Prefs.OpenZoomed THEN 
  312.     SwapInt(zoom[2],wwidth);
  313.     SwapInt(zoom[3],wheight);
  314.   END;
  315.  
  316.   DLd.mywin := I.OpenWindowTagsA(NIL,
  317.                             I.waLeft, DLp.Prefs.LeftEdge,
  318.                             I.waTop, DLp.Prefs.TopEdge,
  319.                             I.waHeight,wheight,
  320.                             I.waWidth,wwidth,
  321.                             I.waScreenTitle, sys.ADR(scrtitle),
  322.                             I.waPubScreen,  mysc,
  323.                             I.waGadgets, glist,
  324.                             I.waZoom, sys.ADR(zoom),
  325.                             I.waIDCMP, LONGSET{I.mouseButtons,
  326.                                                I.refreshWindow,
  327.                                                I.gadgetUp,
  328.                                                I.menuPick,
  329.                                                I.activeWindow,
  330.                                                I.inactiveWindow,
  331.                                                I.closeWindow,
  332.                                                I.diskInserted,
  333.                                                I.diskRemoved},
  334.                             I.waFlags, LONGSET{I.windowDrag,
  335.                                                I.windowDepth,
  336.                                                I.windowClose,
  337.                                                I.newLookMenus},
  338.                             u.done);
  339.   CheckAndFail(DLd.mywin#NIL,"OpenWindow()");
  340.  
  341.   (* Window is open and all important screen-datas are scanned, so
  342.      it isn't necessary to keep the lock on the PubScreen *)
  343.   I.UnlockPubScreen(NIL,mysc);
  344.   DLr.yourwin := DLd.mywin;
  345.   gt.RefreshWindow(DLd.mywin, NIL);
  346.   IF I.SetMenuStrip(DLd.mywin, menu^) THEN END;
  347.  
  348.   windowopen := TRUE;
  349.   DLd.CheckDrives(TRUE); (* force refresh *)
  350.  
  351. END OpenWindow;
  352.  
  353.  
  354. (*------ Close window and unlock all window-specific resources ------------*)
  355.  
  356. PROCEDURE CloseWindow();
  357. BEGIN
  358.   windowopen := FALSE;
  359.   DLr.yourwin := NIL;
  360.   IF e.CheckIO(TimeReq)= NIL THEN e.AbortIO(TimeReq)                        END;
  361.   IF DLd.mywin             # NIL THEN 
  362.     I.ClearMenuStrip(DLd.mywin);
  363.     I.CloseWindow(DLd.mywin); DLd.mywin := NIL;
  364.   END;
  365.   (* Save to call with NIL ! *)   gt.FreeMenus(menu); menu := NIL;
  366.   (* Save to call with NIL ! *)   gt.FreeVisualInfo(vi); vi := NIL;
  367.   (* Save to call with NIL ! *)   gt.FreeGadgets(glist); glist := NIL;
  368.   IF font              # NIL THEN g.CloseFont(font); font := NIL            END;
  369.   IF e.WaitIO(TimeReq) = 0   THEN                                           END;
  370. END CloseWindow;
  371.  
  372.  
  373. (***************************************************************************
  374.          M A I N
  375.  ***************************************************************************)
  376.  
  377. BEGIN
  378.  
  379. (*------ Open all necessary resources -------------------------------------*)
  380.  
  381.   IF (I.int.libNode.version<37) THEN HALT(20) END;
  382.  
  383.   OpenDev := topadd; (* DUMMY *)
  384.  
  385.   DLp.ReadArgs;
  386.  
  387.   terminated := FALSE;
  388.  
  389.   HotSig := hot.InitX(comName,comTitle,comDescr,{hot.notify,hot.unique},TRUE,SHORT(SHORT(DLp.Argv.pri^)));
  390.   IF HotSig < 0 THEN HALT(0) END;
  391.  
  392.   myNewMenu := myNewMenuConst;
  393.  
  394.   DLs.FillMenu(myNewMenu);
  395.  
  396.   TimerPort := e.CreateMsgPort();
  397.   IF TimerPort = NIL THEN DLr.FailOut("CreateMsgPort()") END;
  398.  
  399.   TimeReq := e.CreateIORequest(TimerPort,SIZE(t.TimeRequest));
  400.   IF TimeReq = NIL THEN DLr.FailOut("CreateIORequest()") END;
  401.  
  402.   OpenDev := e.OpenDevice(t.timerName,t.vBlank,TimeReq,LONGSET{});
  403.   IF OpenDev # 0 THEN
  404.     DLr.FailOut("OpenDevice(Timer)")
  405.   END;
  406.  
  407.   TimeReq.node.command := t.addRequest;
  408.   TimeReq.node.error := 0;
  409.  
  410.   psIO;
  411.   DLp.ReadPrefs;
  412.   DLd.CheckDrivesInit;
  413.   IF DLp.Prefs.OpenWindow THEN OpenWindow(FALSE) END;
  414.   hot.Activate(TRUE);
  415.  
  416.   DLp.FreeArgs; (* everything checked, no longer needed *)
  417.  
  418. (*------ Waiting for Messages (User, Timer) -------------------------------*)
  419.  
  420. WHILE ~ terminated DO
  421.  
  422.   WHILE ~ terminated DO
  423.  
  424.   IF windowopen THEN
  425.     IF e.CheckIO(TimeReq)#NIL THEN
  426.       (* was soll DAS    ^^^^ :Rückgabewert BOOLEAN!!! *)
  427.       psIO;
  428.     END;
  429.     signals := e.Wait (LONGSET{DLd.mywin.userPort.sigBit,TimerPort.sigBit,HotSig,d.ctrlC});
  430.   ELSE
  431.     signals := e.Wait (LONGSET{TimerPort.sigBit,HotSig,d.ctrlC});
  432.   END;
  433.  
  434.     IF windowopen AND (DLd.mywin.userPort.sigBit IN signals) THEN
  435.       LOOP
  436.         imsg := gt.GetIMsg(DLd.mywin.userPort);
  437.         IF imsg=NIL THEN EXIT END;
  438.         imsgClass := imsg.class;
  439.         imsgCode := imsg.code;
  440.         gad := imsg.iAddress;
  441.         gt.ReplyIMsg(imsg);
  442.         force := TRUE;
  443.  
  444.         IF I.activeWindow IN imsgClass THEN
  445.           DLd.winactive := TRUE;
  446.           force := FALSE;
  447.         END;
  448.  
  449.         IF I.inactiveWindow IN imsgClass THEN
  450.           DLd.winactive := FALSE
  451.         END;
  452.  
  453.         IF I.refreshWindow IN imsgClass THEN
  454.           gt.BeginRefresh(DLd.mywin);
  455.           gt.EndRefresh(DLd.mywin, I.LTRUE);
  456.           force := FALSE;
  457.         END;
  458.  
  459.         IF I.gadgetUp IN imsgClass THEN
  460.           HandleGadgetEvent(gad, imsgCode);
  461.         END;
  462.  
  463.         IF I.menuPick IN imsgClass THEN
  464.           HandleMenuEvent(imsgCode);
  465.         END;
  466.  
  467.         IF I.closeWindow IN imsgClass THEN
  468.           closewin := TRUE;
  469.         END; (* IF *)
  470.  
  471.         DLd.CheckDrives(force);
  472.  
  473.       END; (* LOOP *)
  474.     END; (* IF DLd.mywin *)
  475.  
  476.     IF closewin THEN
  477.       closewin := FALSE;
  478.       CloseWindow;
  479.     END;
  480.  
  481.     IF HotSig IN signals THEN
  482.       WHILE hot.GetCMsg(HotType,HotID) DO
  483.         IF hot.hotkey IN HotType THEN
  484.           CASE HotID OF
  485.              DLp.lckallHot    : DLd.LockAll(FALSE);
  486.                                 IF DLp.Prefs.LockAllBeep THEN I.DisplayBeep(NIL) END;
  487.            | DLp.gotofrontHot : IF windowopen THEN CloseWindow END;
  488.                                 OpenWindow(TRUE);
  489.            | DLp.opencloseHot : IF windowopen THEN CloseWindow
  490.                                               ELSE OpenWindow(FALSE)  END;
  491.           ELSE
  492.             IF DLp.Prefs.UnlockBeep THEN I.DisplayBeep(NIL) END;
  493.             DLd.UnLckOne(DLp.drive[HotID-1]);
  494.           END; (* CASE *)
  495.           DLd.CheckDrives(TRUE);
  496.         ELSIF hot.command IN HotType THEN
  497.           CASE HotID OF
  498.             hot.cAppear,hot.cUnique :
  499.                             IF windowopen THEN DLd.CheckDrives(TRUE)
  500.                                           ELSE OpenWindow(FALSE)      END;
  501.                             I.WindowToFront(DLd.mywin);
  502.                             I.ScreenToFront(DLd.mywin.wScreen);
  503.                             IF DLd.mywin.height = (topborder + 1)
  504.                               THEN I.ZipWindow(DLd.mywin) END;
  505.            |hot.cDisappear: IF windowopen THEN CloseWindow END;|
  506.            |hot.cKill     : terminated := TRUE; quickquit := TRUE;
  507.           ELSE
  508.           END; (* CASE *)
  509.         END; (* IF *)
  510.       END; (* WHILE *)
  511.     END; (* IF *)
  512.  
  513.     IF d.ctrlC IN signals THEN terminated := TRUE; quickquit := TRUE END;
  514.  
  515.     (* None of the above -> Msg by TIMER, mouseButtons *)
  516.     DLd.CheckDrives(FALSE);
  517.  
  518.   END; (* WHILE *)
  519.  
  520.   IF (~ quickquit) AND DLd.OneLocked() THEN
  521.     count := SHORT(DLr.RequestResponseNum(
  522.                 sys.ADR("DeviceLock"),
  523.                 DLs.GetString(DLs.MsgKeepUnlock),
  524.                 DLs.GetString(DLs.GadKeepUnlock),
  525.                 NIL));
  526.     IF (count = 0) THEN
  527.        terminated := FALSE;
  528.     ELSIF (count = 1) THEN   
  529.        DLd.UnlockAll(TRUE);
  530.     END;
  531.   END;
  532.  
  533. END; (* WHILE *)
  534.  
  535. (***************************************************************************
  536.          C L O S E
  537.  ***************************************************************************)
  538.  
  539. CLOSE
  540.   IF (I.int.libNode.version>=37) THEN
  541.     IF windowopen THEN
  542.       CloseWindow
  543.     ELSIF (TimeReq # NIL) THEN
  544.       IF e.CheckIO(TimeReq)= NIL THEN e.AbortIO(TimeReq) END;
  545.       IF e.WaitIO(TimeReq) = 0   THEN END;
  546.     END;
  547.     IF quickquit OR (ol.Result > 0) THEN
  548.       IF DLp.drive # NIL THEN DLd.UnlockAll(TRUE); END
  549.     END;
  550.     IF OpenDev = 0             THEN e.CloseDevice(TimeReq)        END;
  551.     (* Save to call with NIL ! *)   e.DeleteIORequest(TimeReq);
  552.     (* Save to call with NIL ! *)   e.DeleteMsgPort(TimerPort);
  553.   END;
  554.   IF (ol.Result > 0) THEN I.DisplayBeep(NIL) END;
  555.  
  556. END DeviceLock.
  557.