home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD1.bin / useful / dev / obero / oberon-a / source / projectoberon / amigasupport.mod < prev    next >
Encoding:
Text File  |  1995-02-07  |  5.4 KB  |  203 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: AmigaSupport.mod $
  4.   Description: Amiga-specific support for Project Oberon modules.
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.1 $
  8.       $Author: fjc $
  9.         $Date: 1995/02/07 20:22:47 $
  10.  
  11.   Copyright © 1995, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15. *************************************************************************)
  16.  
  17. <*STANDARD-*> <* MAIN-*>
  18.  
  19. MODULE AmigaSupport;
  20.  
  21. IMPORT
  22.   SYS := SYSTEM, Kernel, Errors, s := Sets, e := Exec, es := ExecSupport,
  23.   u := Utility, gfx := Graphics, i := Intuition, gt := GadTools,
  24.   ASL, rt := ReqTools, iu := IntuiUtil;
  25.  
  26. (*------------------------------------*)
  27. VAR
  28.   scr -: i.ScreenPtr;
  29.   win -: i.WindowPtr;
  30.   W -, H -: INTEGER;
  31.  
  32.   KeyProc*,
  33.   MouseProc*,
  34.   TickProc*
  35.     : PROCEDURE (msg : i.IntuiMessagePtr);
  36.  
  37.   oldRegion : gfx.RegionPtr; (* for clipping *)
  38.  
  39.  
  40. (*------------------------------------*)
  41. CONST
  42.   pubScreenName = "";
  43.   scrTitle = "Display inactive";
  44.   winTitle = "Display for Project Oberon modules";
  45.   idcmp = {i.vanillaKey, i.mouseButtons, i.intuiTicks};
  46.  
  47.  
  48. (*------------------------------------*)
  49. PROCEDURE OpenScreen ();
  50.  
  51.   VAR
  52.     screenModeID : LONGINT;
  53.     pubScreen : i.ScreenPtr;
  54.     screenDrawInfo : i.DrawInfoPtr;
  55.  
  56. BEGIN (* OpenScreen *)
  57.   pubScreen := i.LockPubScreen (pubScreenName);
  58.   IF pubScreen # NIL THEN
  59.     (*
  60.     ** Get the DrawInfo structure from the locked screen
  61.     ** This returns pen, depth and font info.
  62.     *)
  63.     screenDrawInfo := i.GetScreenDrawInfo (pubScreen);
  64.     IF screenDrawInfo # NIL THEN
  65.       screenModeID := gfx.GetVPModeID (SYS.ADR (pubScreen.viewPort));
  66.       IF screenModeID # gfx.invalidID THEN
  67.         (*
  68.         ** screenModeID may now be used in a call to
  69.         ** OpenScreenTags () with the tag saDisplayID
  70.         *)
  71.         scr := i.OpenScreenTagsA ( NIL,
  72.             i.saWidth,       pubScreen.width,
  73.             i.saHeight,      pubScreen.height,
  74.             i.saDepth,       screenDrawInfo.depth,
  75.             i.saOverscan,    i.oScanText,
  76.             i.saAutoScroll,  i.LTRUE,
  77.             i.saFullPalette, i.LTRUE,
  78.             i.saPens,        screenDrawInfo.pens,
  79.             i.saSysFont,     1,
  80.             i.saDisplayID,   screenModeID,
  81.             i.saTitle,       SYS.ADR (scrTitle),
  82.             u.end );
  83.         IF scr # NIL THEN (*
  84.                           ** Free the drawinfo an public screen as we don't
  85.                           ** need them any more. We now have our own screen.
  86.                           *)
  87.           i.FreeScreenDrawInfo (pubScreen, screenDrawInfo);
  88.           screenDrawInfo := NIL;
  89.           i.UnlockPubScreen (pubScreenName, pubScreen);
  90.           pubScreen := NIL;
  91.         END
  92.       END
  93.     END
  94.   END;
  95.   ASSERT (scr # NIL, Errors.postCondition)
  96. END OpenScreen;
  97.  
  98.  
  99. (*------------------------------------*)
  100. PROCEDURE CloseScreen ();
  101. BEGIN (* CloseScreen *)
  102.   IF scr # NIL THEN i.OldCloseScreen (scr); scr := NIL END;
  103. END CloseScreen;
  104.  
  105.  
  106. (*------------------------------------*)
  107. PROCEDURE OpenWindow ();
  108. BEGIN (* OpenWindow *)
  109.   win := i.OpenWindowTagsA ( NIL,
  110.       i.waCustomScreen, scr,
  111.       i.waTop,          scr.barHeight + scr.barVBorder,
  112.       i.waHeight,       scr.height - scr.barHeight - scr.barVBorder,
  113.       i.waActivate,     i.LTRUE,
  114.       i.waBorderless,   i.LTRUE,
  115.       i.waBackdrop,     i.LTRUE,
  116.       i.waRMBTrap,      i.LTRUE,
  117.       i.waScreenTitle,  SYS.ADR (winTitle),
  118.       i.waIDCMP,        idcmp,
  119.       u.end );
  120.   ASSERT (win # NIL, Errors.postCondition);
  121.   ASSERT (iu.ClipWindowToBorders (win, oldRegion), Errors.postCondition)
  122. END OpenWindow;
  123.  
  124.  
  125. (*------------------------------------*)
  126. PROCEDURE CloseWindow ();
  127. BEGIN (* CloseWindow *)
  128.   IF win # NIL THEN
  129.     iu.UnclipWindow (win, oldRegion); oldRegion := NIL;
  130.     i.CloseWindow (win); win := NIL
  131.   END;
  132. END CloseWindow;
  133.  
  134.  
  135. (*------------------------------------*)
  136. PROCEDURE OpenDisplay *;
  137. BEGIN (* OpenDisplay *)
  138.   IF scr = NIL THEN
  139.     OpenScreen();
  140.     OpenWindow();
  141.     W := win.width - win.borderLeft - win.borderRight;
  142.     H := win.height - win.borderTop - win.borderBottom;
  143.   END
  144. END OpenDisplay;
  145.  
  146.  
  147. (*------------------------------------*)
  148. PROCEDURE GetNextEvent*;
  149.  
  150.   VAR
  151.     msg : i.IntuiMessagePtr;
  152.     signals : s.SET32;
  153.     sigBit : SHORTINT;
  154.  
  155. BEGIN (* GetNextEvent *)
  156.   (* We only have one signal bit, so we do not have to check which
  157.   ** bit broke the Wait().
  158.   *)
  159.   signals := e.Wait ({win.userPort.sigBit});
  160.   LOOP
  161.     msg := SYS.VAL (i.IntuiMessagePtr, e.GetMsg (win.userPort));
  162.     IF msg = NIL THEN EXIT END;
  163.     IF (msg.class = {i.vanillaKey})
  164.        OR (msg.class = {i.rawKey})
  165.     THEN
  166.       IF KeyProc # NIL THEN KeyProc (msg) END;
  167.     ELSIF msg.class = {i.mouseButtons} THEN
  168.       IF MouseProc # NIL THEN MouseProc (msg) END;
  169.     ELSIF msg.class = {i.intuiTicks} THEN
  170.       IF TickProc # NIL THEN TickProc (msg) END;
  171.     END;
  172.     e.ReplyMsg (msg)
  173.   END;
  174. END GetNextEvent;
  175.  
  176.  
  177. (*------------------------------------*)
  178. PROCEDURE BeginUpdate*;
  179. BEGIN (* BeginUpdate *)
  180. END BeginUpdate;
  181.  
  182.  
  183. (*------------------------------------*)
  184. PROCEDURE EndUpdate*;
  185. BEGIN (* EndUpdate *)
  186. END EndUpdate;
  187.  
  188.  
  189. (*------------------------------------*)
  190. PROCEDURE* Close ( VAR rc : LONGINT );
  191. BEGIN (* Close *)
  192.   CloseWindow();
  193.   CloseScreen();
  194. END Close;
  195.  
  196. (*------------------------------------*)
  197. <*$ClearVars+*>
  198. BEGIN
  199.   Errors.Init;
  200.   ASSERT (gt.base # NIL, 100);
  201.   Kernel.SetCleanup (Close)
  202. END AmigaSupport.
  203.