DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦52f028fda⟧ Ada Source

    Length: 18432 (0x4800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, procedure Dtia, seg_02597b

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with System;
with Text_Io;
with Unchecked_Conversion;
with Mac_Types;
use Mac_Types;
with Quickdraw;
use Quickdraw;
with Desk, Dialogs, Dtia_Server, Events, Fonts, Memory, Menus,
     Osutils, Resources, Segload, Toolutils, Textedit, Traps, Windows;
procedure Dtia is

    Ksysenvironsversion : constant := 1;
    Kosevent : constant := Events.App4evt;
    Ksuspendresumemessage : constant := 1;
    Kresumemask : constant := 1;
    Kminheap : constant := 256 * 1024;
    Kminspace : constant := 16 * 1024;
    Kextremeneg : constant := -32768;
    Kextremepos : constant := 32767 - 1;
    Rmenubar : constant := 128;
    Raboutalert : constant := 128;
    Ruseralert : constant := 129;
    Rwindow : constant := 128;
    Mapple : constant := 128;
    Iabout : constant := 1;
    Mfile : constant := 129;
    Inew : constant := 1;
    Iclose : constant := 4;
    Iquit : constant := 12;
    Medit : constant := 130;
    Iundo : constant := 1;
    Icut : constant := 3;
    Icopy : constant := 4;
    Ipaste : constant := 5;
    Iclear : constant := 6;

    type Rectptr is access Rect;
    type Recthnd is access Rectptr;

    Gmac : Osutils.Sysenvrec;
    Ghaswaitnextevent : Boolean;
    Ginbackground : Boolean;

    function Windowptr_To_Peek is
       new Unchecked_Conversion (Source => Windowptr,
                                 Target => Windows.Windowpeek);

    function Windowptr_To_Ptr is new Unchecked_Conversion
                                        (Source => Windowptr, Target => Ptr);

    function Windowptr_To_Grafptr is
       new Unchecked_Conversion (Source => Windowptr, Target => Grafptr);

    function Longint_To_Windowptr is
       new Unchecked_Conversion (Source => Longint, Target => Windowptr);

    function Handle_To_Recthnd is new Unchecked_Conversion
                                         (Source => Handle, Target => Recthnd);

    function Address_To_Ptr is new Unchecked_Conversion
                                      (Source => System.Address, Target => Ptr);

    function Address_To_Varwindowptr is
       new Unchecked_Conversion
              (Source => System.Address, Target => Varwindowptr);

    function Ptr_To_Longint is new Unchecked_Conversion
                                      (Source => Ptr, Target => Longint);

    function Ptr_To_Windowptr is new Unchecked_Conversion
                                        (Source => Ptr, Target => Windowptr);

    function Thz_To_Longint is new Unchecked_Conversion
                                      (Source => Memory.Thz, Target => Longint);

    function Array_To_Restype is
       new Unchecked_Conversion (Source => Restypearray, Target => Restype);

    function Array_To_Ostype is
       new Unchecked_Conversion (Source => Ostypearray, Target => Ostype);


    function Trapavailable
                (Tnumber : Mac_Types.Integer; Ttype : Osutils.Traptype)
                return Boolean is
    begin
        return Osutils.Ngettrapaddress (Tnumber, Ttype) /=
                  Osutils.Gettrapaddress (Mac_Types.Integer
                                             (Traps.Unimplemented));
    end Trapavailable;

    procedure Alertuser is
        Itemhit : Mac_Types.Integer;
    begin
        Setcursor (Qd.Arrow);
        Itemhit := Dialogs.Alert (Ruseralert, null);
        Segload.Exittoshell;
    end Alertuser;

    procedure Initialize is
        Menubar : Handle;
        Window : Windowptr;
        Ignoreerror : Oserr;
        Total, Contig : Longint;
        Ignoreresult : Boolean;
        Event : Events.Eventrecord;
        Count : Mac_Types.Integer;
    begin

        Ghaswaitnextevent :=
           Trapavailable (Mac_Types.Integer (Traps.Waitnextevent),
                          Osutils.Tooltrap);
        Ginbackground := False;

        Quickdraw.Initgraf (Address_To_Ptr (Qd.Theport'Address));
        Fonts.Initfonts;
        Windows.Initwindows;
        Menus.Initmenus;
        Textedit.Teinit;
        Dialogs.Initdialogs (null);
        Quickdraw.Initcursor;

        for Count in 1 .. 3 loop
            Ignoreresult := Events.Getnextevent (Events.Everyevent, Event);
        end loop;

        Ignoreerror := Osutils.Sysenvirons (Ksysenvironsversion, Gmac);

        if Gmac.Machinetype < 0 then
            Alertuser;
        end if;

        if Ptr_To_Longint (Memory.Getappllimit) -
           Thz_To_Longint (Memory.Appliczone) < Kminheap then
            Alertuser;
        end if;

        Memory.Purgespace (Total, Contig);
        if Total < Kminspace then
            Alertuser;
        end if;

        Window := Ptr_To_Windowptr (Memory.Newptr
                                       (Windows.Windowrecord'Size / 8));
        if Window = null then
            Alertuser;
        end if;
        Window := Windows.Getnewwindow (Rwindow, Windowptr_To_Ptr (Window),
                                        Longint_To_Windowptr (-1));

        Menubar := Menus.Getnewmbar (Rmenubar);
        if Menubar = null then
            Alertuser;
        end if;
        Menus.Setmenubar (Menubar);
        Memory.Disposhandle (Menubar);
        Menus.Addresmenu (Menus.Getmhandle (Mapple),
                          Array_To_Restype (('D', 'R', 'V', 'R')));
        Menus.Drawmenubar;
    end Initialize;

    function Isdawindow (Window : Windowptr) return Boolean is
    begin
        if Window = null then
            return False;
        else
            return Windowptr_To_Peek (Window).Windowkind < 0;
        end if;
    end Isdawindow;

    function Isappwindow (Window : Windowptr) return Boolean is
    begin
        if Window = null then
            return False;
        else
            return (Windowptr_To_Peek (Window).Windowkind >=
                    Windows.Userkind) or
                   (Windowptr_To_Peek (Window).Windowkind = Windows.Dialogkind);
        end if;
    end Isappwindow;

    function Doclosewindow (Window : Windowptr) return Boolean is
    begin
        if Isdawindow (Window) then
            Desk.Closedeskacc (Windowptr_To_Peek (Window).Windowkind);
        end if;
        if Isappwindow (Window) then
            Windows.Closewindow (Window);
        end if;
        return True;
    end Doclosewindow;

    procedure Macterminate is
        Awindow : Windowptr;
        Closed : Boolean;
    begin
        Closed := True;
        loop
            Awindow := Windows.Frontwindow;
            if Awindow /= null then
                Closed := Doclosewindow (Awindow);
            end if;
            exit when (not Closed) or (Awindow = null);
        end loop;
        if Closed then
            Segload.Exittoshell;
        end if;
    end Macterminate;

    procedure Adjustmenus is
        Window : Windowptr;
        Menu : Menus.Menuhandle;
    begin
        Window := Windows.Frontwindow;

        Menu := Menus.Getmhandle (Mfile);
        if Isdawindow (Window) then
            Menus.Enableitem (Menu, Iclose);
        else
            Menus.Disableitem (Menu, Iclose);
        end if;

        Menu := Menus.Getmhandle (Medit);
        if Isdawindow (Window) then
            Menus.Enableitem (Menu, Iundo);
            Menus.Enableitem (Menu, Icut);
            Menus.Enableitem (Menu, Icopy);
            Menus.Enableitem (Menu, Ipaste);
            Menus.Enableitem (Menu, Iclear);
        else
            Menus.Disableitem (Menu, Iundo);
            Menus.Disableitem (Menu, Icut);
            Menus.Disableitem (Menu, Icopy);
            Menus.Disableitem (Menu, Iclear);
            Menus.Disableitem (Menu, Ipaste);
        end if;
    end Adjustmenus;

    procedure Domenucommand (Menuresult : Longint) is
        Menuid : Mac_Types.Integer;
        Menuitem : Mac_Types.Integer;
        Itemhit : Mac_Types.Integer;
        Daname : Str255;
        Darefnum : Mac_Types.Integer;
        Handledbyda : Boolean;
        Ignore : Boolean;
    begin
        Menuid := Toolutils.Hiword (Menuresult);
        Menuitem := Toolutils.Loword (Menuresult);
        case Menuid is
            when Mapple =>
                case Menuitem is
                    when Iabout =>
                        Itemhit := Dialogs.Alert (Raboutalert, null);
                    when others =>
                        Menus.Getitem (Menus.Getmhandle (Mapple),
                                       Menuitem, Daname);
                        Darefnum := Desk.Opendeskacc (Daname);
                end case;
            when Mfile =>
                case Menuitem is
                    when Iclose =>
                        Ignore := Doclosewindow (Windows.Frontwindow);
                    when Iquit =>
                        Macterminate;
                    when others =>
                        null;
                end case;
            when Medit =>
                Handledbyda := Desk.Systemedit (Menuitem - 1);
            when others =>
                null;
        end case;
        Menus.Hilitemenu (0);
    end Domenucommand;

    procedure Drawwindow (Window : Windowptr) is
    begin
        Setport (Windowptr_To_Grafptr (Window));

        Eraserect (Window.Portrect);
        Forecolor (Blackcolor);
        Forecolor (Blackcolor);
    end Drawwindow;

    procedure Docontentclick (Window : Windowptr; Event : Events.Eventrecord) is
    begin
        null;
    end Docontentclick;

    procedure Doupdate (Window : Windowptr) is
    begin
        if Isappwindow (Window) then
            Windows.Beginupdate (Window);
            if not Emptyrgn (Window.Visrgn) then
                Drawwindow (Window);
            end if;
            Windows.Endupdate (Window);
        end if;
    end Doupdate;

    procedure Doactivate (Window : Windowptr; Becomingactive : Boolean) is
    begin
        if Isappwindow (Window) then
            if Becomingactive then
                null;  --do whatever you need to at activation
            else
                null;  --do whatever you need to at deactivation
            end if;
        end if;
    end Doactivate;

    procedure Adjustcursor (Mouse : Point; Region : Rgnhandle) is
        Window : Windowptr;
        Arrowrgn : Rgnhandle;
        Plusrgn : Rgnhandle;
        Globalportrect : Rect;
    begin
        Window := Windows.Frontwindow;
        if (not Ginbackground) and (not Isdawindow (Window)) then
            Arrowrgn := Newrgn;
            Plusrgn := Newrgn;

            Setrectrgn (Arrowrgn, Kextremeneg, Kextremeneg,
                        Kextremepos, Kextremepos);

            if Isappwindow (Window) then
                Setport (Windowptr_To_Grafptr (Window));
                Setorigin (-Window.Portbits.Bounds.Left,
                           -Window.Portbits.Bounds.Top);
                Globalportrect := Window.Portrect;
                Rectrgn (Plusrgn, Globalportrect);
                Sectrgn (Plusrgn, Window.Visrgn, Plusrgn);
                Setorigin (0, 0);
            end if;

            Diffrgn (Arrowrgn, Plusrgn, Arrowrgn);

            if Ptinrgn (Mouse, Plusrgn) then
                Setcursor (Toolutils.Getcursor (Toolutils.Pluscursor).all.all);
                Copyrgn (Plusrgn, Region);
            else
                Setcursor (Qd.Arrow);
                Copyrgn (Arrowrgn, Region);
            end if;

            Disposergn (Arrowrgn);
            Disposergn (Plusrgn);
        end if;
    end Adjustcursor;

    procedure Doevent (Event : Events.Eventrecord) is
        Part : Mac_Types.Integer;
        Window : Windowptr;
        Hit : Boolean;
        Key : Char;
    begin
        case Event.What is
            when Events.Mousedown =>
                Part := Windows.Findwindow (Event.Where, Address_To_Varwindowptr
                                                            (Window'Address));
                case Part is
                    when Windows.Inmenubar =>
                        Adjustmenus;
                        Domenucommand (Menus.Menuselect (Event.Where));
                    when Windows.Insyswindow =>
                        Desk.Systemclick (Event, Window);
                    when Windows.Incontent =>
                        if Window /= Windows.Frontwindow then
                            Windows.Selectwindow (Window);
                            --DoEvent(event);
                        else
                            Docontentclick (Window, Event);
                        end if;
                    when Windows.Indrag =>
                        Windows.Dragwindow (Window, Event.Where,
                                            Qd.Screenbits.Bounds);
                    when Windows.Ingrow =>
                        null;
                    when Windows.Inzoomin | Windows.Inzoomout =>
                        null;
                    when others =>
                        null;
                end case;
            when Events.Keydown | Events.Autokey =>
                Key := Char'Val (Toolutils.Bitand
                                    (Event.Message, Events.Charcodemask));
                if Toolutils.Bitand
                      (Longint (Event.Modifiers), Events.Cmdkey) /= 0 then
                    if Event.What = Events.Keydown then
                        Adjustmenus;
                        Domenucommand (Menus.Menukey
                                          (Charword (Char'Pos (Key))));
                    end if;
                end if;
            when Events.Activateevt =>  
                Doactivate (Longint_To_Windowptr (Event.Message),
                            Toolutils.Bitand
                               (Mac_Types.Longint (Event.Modifiers),
                                Events.Activeflag) /= 0);
            when Events.Updateevt =>  
                Doupdate (Longint_To_Windowptr (Event.Message));
            when Kosevent =>
                case Toolutils.Bitand
                        (Toolutils.Bitshift (Event.Message, 8), 255) is
                    when Ksuspendresumemessage =>
                        Ginbackground := Toolutils.Bitand
                                            (Event.Message, Kresumemask) = 0;
                        Doactivate (Windows.Frontwindow, not Ginbackground);
                    when others =>
                        null;
                end case;
            when others =>
                null;
        end case;
    end Doevent;

    procedure Eventloop is
        Cursorrgn : Rgnhandle;
        Gotevent : Boolean;
        Event : Events.Eventrecord;
    begin  
        Dtia_Server.Launch_Server;
        Cursorrgn := Newrgn;
        loop  -- forever, or at least until SegLoad.ExitToShell
            delay 0.1;
            if Ghaswaitnextevent then
                Adjustcursor (Event.Where, Cursorrgn);
                Gotevent := Events.Waitnextevent
                               (Events.Everyevent, Event, 30, Cursorrgn);
            else
                Desk.Systemtask;
                Gotevent := Events.Getnextevent (Events.Everyevent, Event);
            end if;
            if Gotevent then
                Adjustcursor (Event.Where, Cursorrgn);
                Doevent (Event);
            end if;
        end loop;
    end Eventloop;

begin  -- dtia
    Memory.Maxapplzone;

    Initialize;

    Eventloop;
end Dtia;

E3 Meta Data

    nblk1=11
    nid=0
    hdr6=22
        [0x00] rec0=21 rec1=00 rec2=01 rec3=012
        [0x01] rec0=00 rec1=00 rec2=11 rec3=01a
        [0x02] rec0=1c rec1=00 rec2=02 rec3=06e
        [0x03] rec0=19 rec1=00 rec2=03 rec3=02e
        [0x04] rec0=1f rec1=00 rec2=04 rec3=024
        [0x05] rec0=20 rec1=00 rec2=05 rec3=07a
        [0x06] rec0=1e rec1=00 rec2=06 rec3=032
        [0x07] rec0=22 rec1=00 rec2=07 rec3=00e
        [0x08] rec0=1d rec1=00 rec2=08 rec3=024
        [0x09] rec0=19 rec1=00 rec2=09 rec3=00e
        [0x0a] rec0=21 rec1=00 rec2=0a rec3=01c
        [0x0b] rec0=1e rec1=00 rec2=0b rec3=008
        [0x0c] rec0=1d rec1=00 rec2=0c rec3=020
        [0x0d] rec0=13 rec1=00 rec2=0d rec3=04e
        [0x0e] rec0=15 rec1=00 rec2=0e rec3=02e
        [0x0f] rec0=19 rec1=00 rec2=0f rec3=004
        [0x10] rec0=1a rec1=00 rec2=10 rec3=001
    tail 0x2172078d883a35cb6547b 0x42a00088462060003