home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / archivers / mpackppc-wos / src / macninit.c < prev    next >
C/C++ Source or Header  |  1998-04-27  |  8KB  |  265 lines

  1. /* macninit.c -- general mac nifty application library initialization
  2.  */
  3. /* (C) Copyright 1995 by Carnegie Mellon University
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software
  7.  * and its documentation for any purpose is hereby granted without
  8.  * fee, provided that the above copyright notice appear in all copies
  9.  * and that both that copyright notice and this permission notice
  10.  * appear in supporting documentation, and that the name of Carnegie
  11.  * Mellon University not be used in advertising or publicity
  12.  * pertaining to distribution of the software without specific,
  13.  * written prior permission.  Carnegie Mellon University makes no
  14.  * representations about the suitability of this software for any
  15.  * purpose.  It is provided "as is" without express or implied
  16.  * warranty.
  17.  *
  18.  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
  19.  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  20.  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
  21.  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  22.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
  23.  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
  24.  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  25.  * SOFTWARE.
  26.  */
  27. /* (C) Copyright 1990-1994 by Christopher J. Newman
  28.  * All Rights Reserved.
  29.  *
  30.  * Permission to use, copy, modify, distribute, and sell this software and its
  31.  * documentation for any purpose is hereby granted without fee, provided that
  32.  * the above copyright notice appear in all copies and that both that
  33.  * copyright notice and this permission notice appear in supporting
  34.  * documentation, and that the name of Christopher J. Newman not be used in
  35.  * advertising or publicity pertaining to distribution of the software without
  36.  * specific, written prior permission.  Christopher J. Newman makes no
  37.  * representations about the suitability of this software for any purpose.  It
  38.  * is provided "as is" without express or implied warranty.
  39.  *
  40.  * CHRISTOPHER J. NEWMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  41.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
  42.  * SHALL CHRISTOPHER J. NEWMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  43.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  44.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  45.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  46.  * OF THIS SOFTWARE.
  47.  *
  48.  * Author:    Christopher J. Newman
  49.  * Message:    This is a nifty program.
  50.  */
  51.  
  52. #ifndef THINK_C
  53. #include <Fonts.h>
  54. #include <SegLoad.h>
  55. #include <OSEvents.h>
  56.  
  57. extern void _DataInit();            /* MPW initialize routine */
  58. #endif
  59. #include <string.h>
  60. #include <Traps.h>
  61. #include <AppleEvents.h>
  62. #include <GestaltEqu.h>
  63. #include <Balloons.h>
  64. #include "macnapp.h"
  65.  
  66. extern pascal OSErr NArequiredAE(AppleEvent *, AppleEvent *, long);
  67.  
  68. #ifndef _Unimplemented
  69. #define _Unimplemented                    0xA89F
  70. #endif
  71. #ifndef _WaitNextEvent
  72. #define _WaitNextEvent                    0xA860
  73. #endif
  74. #ifndef _Gestalt
  75. #define _Gestalt                        0xA1AD
  76. #endif
  77.  
  78. /* global to hold the application heap zone */
  79. extern THz NAappzone;
  80.  
  81. static Boolean TrapAvailable(short);
  82.  
  83. /* this checks if a given trap is available on the system
  84.  */
  85. static Boolean TrapAvailable(short tNumber)
  86. {
  87.     short numtraps = 0x400;
  88.     TrapType tType;
  89.     
  90.     tType = tNumber & 0x800 ? ToolTrap : OSTrap;
  91.     if (tType == ToolTrap) {
  92.         if (NGetTrapAddress(_InitGraf, ToolTrap)
  93.             == NGetTrapAddress(0xAA6E, ToolTrap)) {
  94.             numtraps = 0x200;
  95.         }
  96.         tNumber = tNumber & 0x07FF;
  97.         if (tNumber >= numtraps)
  98.             tNumber = _Unimplemented;
  99.     }
  100.     
  101.     return (NGetTrapAddress(tNumber, tType)
  102.             != NGetTrapAddress(_Unimplemented, ToolTrap));
  103. }
  104.  
  105. /* initialize the Macintosh managers and niftyapp internal variables.
  106.  * call this first.
  107.  */
  108. short NAinit(short minK, short masters, na_openp openp, na_menup menup,
  109.     short nummenu, short numapple, short newitem, short closeitem)
  110.  {
  111.     long         total, contig, response, procid;
  112.     EventRecord  event;
  113.     short         count;
  114.     Handle         menuBar;
  115.     short         message, i, aeflag = 0;
  116.     AppFile         afile;
  117.     FSSpec         fspec;
  118.     Str255         str;
  119.     MenuHandle   mh, helpmh;
  120.     CInfoPBRec   catinfo;
  121.  
  122. #ifndef THINK_C
  123.     UnloadSeg((Ptr) _DataInit);        /* unload MPW init routine */
  124. #endif
  125.     MaxApplZone();                    /* expand heap so code loads at top */
  126.     
  127.     /* initialize all the managers */
  128.     InitGraf((Ptr) &QD(thePort));
  129.     InitFonts();
  130.     InitWindows();
  131.     InitMenus();
  132.     TEInit();
  133.     InitDialogs(NULL);
  134.     InitCursor();
  135.     
  136.     /* allocate enough master pointers */
  137.     for (count = 1; count <= masters; count++) {
  138.         MoreMasters();
  139.         if (MemError() != noErr) return (-1);
  140.     }
  141.     
  142.     /* hack to bring to front in MultiFinder */
  143.     for (count = 1; count <= 3; count++) EventAvail(everyEvent, &event);
  144.         
  145.     /* get the system environment */
  146.     (void) SysEnvirons(1, &NAsysenv);
  147.     
  148.     /* verify we have 128K ROMS, WaitNextEvent is available, and we have enough memory */
  149.     if (NAsysenv.machineType < 0
  150.             || !TrapAvailable(_WaitNextEvent)
  151.             || (long) GetApplLimit() - (long) ApplicZone() < minK) {
  152.         return (-1);
  153.     }
  154.     
  155.     /* check for some Gestalt things and set up Apple Event Handler
  156.      * We assume that the Gestalt compatibility glue is used
  157.      */
  158.     NAgestaltBits = 0;
  159.     if (Gestalt(gestaltAppleEventsAttr, &response) == noErr) {
  160.         NAgestaltBits |= NA_HASAEVENTS;
  161.         if (AEInstallEventHandler(kCoreEventClass, typeWildCard,
  162.                 NArequiredAE, (long) openp, FALSE) == noErr) {
  163.             aeflag = 1;
  164.         }
  165.     }
  166.     if (Gestalt(gestaltFSAttr, &response) == noErr
  167.         && (response & gestaltHasFSSpecCalls)) {
  168.         NAgestaltBits |= NA_HASFSSPEC;
  169.     }
  170.     if (Gestalt(gestaltStandardFileAttr, &response) == noErr) {
  171.         NAgestaltBits |= NA_HASSTDFILE;
  172.     }
  173.     
  174.     /* clean up and check available free memory */
  175.     PurgeSpace(&total, &contig);
  176.     if (total < minK) return (-1);
  177.     
  178.     /* store our application heap zone */
  179.     NAappzone = ApplicZone();
  180.     
  181.     /* if the user wants automatic menu handling, do it now */
  182.     NAmenus = NULL;
  183.     if (menup != (na_menup) NULL) {
  184.         NAmenus = (MenuHandle **) NewHandle(sizeof (MenuHandle) * (nummenu + 1));
  185.         if (NAmenus == (MenuHandle **) NULL) return (-1);
  186.         HLock((Handle) NAmenus);
  187.         for (i = 0; i < nummenu; ++i) {
  188.             InsertMenu((*NAmenus)[i] = GetMenu(mApple + i), 0);
  189.         }
  190.         (*NAmenus)[i] = NULL;
  191.         HUnlock((Handle) NAmenus);
  192.         mh = **NAmenus; /* Apple menu */
  193.         *str = 0;
  194.         GetIndString(str, NA_HELPSTR, 1);
  195.         if (*str) {
  196.             if (Gestalt(gestaltHelpMgrAttr, &response) != noErr
  197.                 || HMGetHelpMenuHandle(&helpmh) != noErr) {
  198.                 helpmh = mh;
  199.             } else {
  200.                 NAhelpcount = CountMItems(helpmh);
  201.             }
  202.             for (i = 2; *str; ++i) {
  203.                 ++NAhelpitems;
  204.                 AppendMenu(helpmh, str);
  205.                 GetIndString(str, NA_HELPSTR, i);
  206.             }
  207.         }
  208.         AppendMenu(mh, "\p-");
  209.         AddResMenu(mh, 'DRVR');
  210.         DrawMenuBar();
  211.         NAcloseitem = closeitem;
  212.         NAnewitem = newitem;
  213.         NAappleitems = numapple;
  214.         if (nummenu > 2) NAhasedit = true;
  215.         NAmenup = menup;
  216.     }
  217.     
  218.     /* create full & empty regions */
  219.     NAfullRgn = NewRgn();
  220.     NAnullRgn = NewRgn();
  221.     if (!NAfullRgn || !NAnullRgn) return (-1);
  222.     SetRectRgn(NAfullRgn, -32767, -32767, 32767, 32767);
  223.     
  224.     /* save ibeam cursor */
  225.     NAibeam = **GetCursor(iBeamCursor);
  226.     
  227.     /* handle startup files (prior to system 7) */
  228.     if (!aeflag) {
  229.         count = 0;
  230.         if (openp != (na_openp) NULL) {
  231.             CountAppFiles(&message, &count);
  232.             if (count) {
  233.                 for (i = 1; i <= count; i++) {
  234.                     GetAppFiles(i, &afile);
  235.                     procid = 0;
  236.                     catinfo.hFileInfo.ioNamePtr = (StringPtr) &afile.fName;
  237.                     catinfo.hFileInfo.ioVRefNum = afile.vRefNum;
  238.                     catinfo.hFileInfo.ioFDirIndex = 0;
  239.                     catinfo.hFileInfo.ioDirID = 0;
  240.                     GetWDInfo(afile.vRefNum, &catinfo.hFileInfo.ioVRefNum,
  241.                         &catinfo.hFileInfo.ioDirID, &procid);
  242.                     if (PBGetCatInfoSync(&catinfo) == noErr) {
  243.                         fspec.vRefNum = catinfo.hFileInfo.ioVRefNum;
  244.                         fspec.parID = catinfo.hFileInfo.ioFlParID;
  245.                         memcpy(fspec.name, afile.fName, *afile.fName + 1);
  246.                         if ((*openp)(message, &fspec, &catinfo.hFileInfo.ioFlFndrInfo) < 0) {
  247.                             break;
  248.                         }
  249.                     }
  250.                 }
  251.                 ClrAppFiles(count);
  252.                 if (message == appPrint
  253.                         && NAcloseWindows(NAhead, NA_REQCLOSEALL) == NA_ALLCLOSED) {
  254.                     return (1);
  255.                 }
  256.             }
  257.         }
  258.         if (newitem && !count && menup != (na_menup) NULL) {
  259.             (*menup)(NULL, mFile, newitem);
  260.         }
  261.     }
  262.  
  263.     return (0);
  264. }
  265.