/*
     File:       Processes.h
 
     Contains:   Process Manager Interfaces.
 
     Version:    Technology: Mac OS 8
                 Release:    QuickTime 6.0.2
 
     Copyright:  (c) 1989-2001 by Apple Computer, Inc., all rights reserved
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __PROCESSES__
#define __PROCESSES__

#ifndef __MACTYPES__
#include "MacTypes.h"
#endif

#ifndef __EVENTS__
#include "Events.h"
#endif

#ifndef __FILES__
#include "Files.h"
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

/* type for unique process identifier */

struct ProcessSerialNumber {
    unsigned long                   highLongOfPSN;
    unsigned long                   lowLongOfPSN;
};
typedef struct ProcessSerialNumber      ProcessSerialNumber;
typedef ProcessSerialNumber *           ProcessSerialNumberPtr;
enum {
                                                                /* Process identifier - Various reserved process serial numbers */
    kNoProcess                  = 0,
    kSystemProcess              = 1,
    kCurrentProcess             = 2
};

/* Definition of the parameter block passed to _Launch */
/* Typedef and flags for launchControlFlags field*/

typedef unsigned short                  LaunchFlags;
enum {
    launchContinue              = 0x4000,
    launchNoFileFlags           = 0x0800,
    launchUseMinimum            = 0x0400,
    launchDontSwitch            = 0x0200,
    launchAllow24Bit            = 0x0100,
    launchInhibitDaemon         = 0x0080
};

/* Format for first AppleEvent to pass to new process.  The size of the overall
  buffer variable: the message body immediately follows the messageLength */

struct AppParameters {
    EventRecord                     theMsgEvent;
    unsigned long                   eventRefCon;
    unsigned long                   messageLength;
};
typedef struct AppParameters            AppParameters;
typedef AppParameters *                 AppParametersPtr;
/* Parameter block to _Launch */

struct LaunchParamBlockRec {
    unsigned long                   reserved1;
    unsigned short                  reserved2;
    unsigned short                  launchBlockID;
    unsigned long                   launchEPBLength;
    unsigned short                  launchFileFlags;
    LaunchFlags                     launchControlFlags;
    FSSpecPtr                       launchAppSpec;
    ProcessSerialNumber             launchProcessSN;
    unsigned long                   launchPreferredSize;
    unsigned long                   launchMinimumSize;
    unsigned long                   launchAvailableSize;
    AppParametersPtr                launchAppParameters;
};
typedef struct LaunchParamBlockRec      LaunchParamBlockRec;

typedef LaunchParamBlockRec *           LaunchPBPtr;
/* Set launchBlockID to extendedBlock to specify that extensions exist.
 Set launchEPBLength to extendedBlockLen for compatibility.*/
enum {
    extendedBlock               = 0x4C43,                       /* 'LC' */
    extendedBlockLen            = sizeof(LaunchParamBlockRec) - 12
};

enum {
                                                                /* Definition of the information block returned by GetProcessInformation */
    modeReserved                = 0x01000000,
    modeControlPanel            = 0x00080000,
    modeLaunchDontSwitch        = 0x00040000,
    modeDeskAccessory           = 0x00020000,
    modeMultiLaunch             = 0x00010000,
    modeNeedSuspendResume       = 0x00004000,
    modeCanBackground           = 0x00001000,
    modeDoesActivateOnFGSwitch  = 0x00000800,
    modeOnlyBackground          = 0x00000400,
    modeGetFrontClicks          = 0x00000200,
    modeGetAppDiedMsg           = 0x00000100,
    mode32BitCompatible         = 0x00000080,
    modeHighLevelEventAware     = 0x00000040,
    modeLocalAndRemoteHLEvents  = 0x00000020,
    modeStationeryAware         = 0x00000010,
    modeUseTextEditServices     = 0x00000008,
    modeDisplayManagerAware     = 0x00000004
};

/* Record returned by GetProcessInformation */

struct ProcessInfoRec {
    unsigned long                   processInfoLength;
    StringPtr                       processName;
    ProcessSerialNumber             processNumber;
    unsigned long                   processType;
    OSType                          processSignature;
    unsigned long                   processMode;
    Ptr                             processLocation;
    unsigned long                   processSize;
    unsigned long                   processFreeMem;
    ProcessSerialNumber             processLauncher;
    unsigned long                   processLaunchDate;
    unsigned long                   processActiveTime;
    FSSpecPtr                       processAppSpec;
};
typedef struct ProcessInfoRec           ProcessInfoRec;
typedef ProcessInfoRec *                ProcessInfoRecPtr;
/* Record corresponding to the SIZE resource definition */

struct SizeResourceRec {
    unsigned short                  flags;
    unsigned long                   preferredHeapSize;
    unsigned long                   minimumHeapSize;
};
typedef struct SizeResourceRec          SizeResourceRec;
typedef SizeResourceRec *               SizeResourceRecPtr;
typedef SizeResourceRecPtr *            SizeResourceRecHandle;
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 LaunchApplication(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
LaunchApplication               (LaunchPBPtr            LaunchParams)                       ONEWORDINLINE(0xA9F2);

#if CALL_NOT_IN_CARBON
EXTERN_API( OSErr )
LaunchDeskAccessory             (const FSSpec *         pFileSpec,
                                 ConstStr255Param       pDAName)                            THREEWORDINLINE(0x3F3C, 0x0036, 0xA88F);

#endif  /* CALL_NOT_IN_CARBON */

#if TARGET_OS_MAC
    #define MacGetCurrentProcess GetCurrentProcess
#endif
EXTERN_API( OSErr )
MacGetCurrentProcess            (ProcessSerialNumber *  PSN)                                THREEWORDINLINE(0x3F3C, 0x0037, 0xA88F);

EXTERN_API( OSErr )
GetFrontProcess                 (ProcessSerialNumber *  PSN)                                FIVEWORDINLINE(0x70FF, 0x2F00, 0x3F3C, 0x0039, 0xA88F);

EXTERN_API( OSErr )
GetNextProcess                  (ProcessSerialNumber *  PSN)                                THREEWORDINLINE(0x3F3C, 0x0038, 0xA88F);

EXTERN_API( OSErr )
GetProcessInformation           (const ProcessSerialNumber * PSN,
                                 ProcessInfoRec *       info)                               THREEWORDINLINE(0x3F3C, 0x003A, 0xA88F);

EXTERN_API( OSErr )
SetFrontProcess                 (const ProcessSerialNumber * PSN)                           THREEWORDINLINE(0x3F3C, 0x003B, 0xA88F);

EXTERN_API( OSErr )
WakeUpProcess                   (const ProcessSerialNumber * PSN)                           THREEWORDINLINE(0x3F3C, 0x003C, 0xA88F);

EXTERN_API( OSErr )
SameProcess                     (const ProcessSerialNumber * PSN1,
                                 const ProcessSerialNumber * PSN2,
                                 Boolean *              result)                             THREEWORDINLINE(0x3F3C, 0x003D, 0xA88F);

/*  ExitToShell was previously in SegLoad.h*/
EXTERN_API( void )
ExitToShell                     (void)                                                      ONEWORDINLINE(0xA9F4);

/*
   LaunchControlPanel is similar to LaunchDeskAccessory, but for Control Panel files instead.
   It launches a control panel in an application shell maintained by the Process Manager.
*/
#if CALL_NOT_IN_CARBON
EXTERN_API( OSErr )
LaunchControlPanel              (const FSSpec *         pFileSpec)                          THREEWORDINLINE(0x3F3C, 0x007B, 0xA88F);

#endif  /* CALL_NOT_IN_CARBON */

/* Values of the 'message' parameter to a Control Panel 'cdev' */
enum {
    initDev                     = 0,                            /*Time for cdev to initialize itself*/
    hitDev                      = 1,                            /*Hit on one of my items*/
    closeDev                    = 2,                            /*Close yourself*/
    nulDev                      = 3,                            /*Null event*/
    updateDev                   = 4,                            /*Update event*/
    activDev                    = 5,                            /*Activate event*/
    deactivDev                  = 6,                            /*Deactivate event*/
    keyEvtDev                   = 7,                            /*Key down/auto key*/
    macDev                      = 8,                            /*Decide whether or not to show up*/
    undoDev                     = 9,
    cutDev                      = 10,
    copyDev                     = 11,
    pasteDev                    = 12,
    clearDev                    = 13,
    cursorDev                   = 14
};

/* Special values a Control Panel 'cdev' can return */
enum {
    cdevGenErr                  = -1,                           /*General error; gray cdev w/o alert*/
    cdevMemErr                  = 0,                            /*Memory shortfall; alert user please*/
    cdevResErr                  = 1,                            /*Couldn't get a needed resource; alert*/
    cdevUnset                   = 3                             /* cdevValue is initialized to this*/
};

/* Control Panel Default Proc */
typedef CALLBACK_API( long , ControlPanelDefProcPtr )(short message, short item, short numItems, short cPanelID, EventRecord *theEvent, long cdevValue, DialogPtr cpDialog);
typedef STACK_UPP_TYPE(ControlPanelDefProcPtr)                  ControlPanelDefUPP;
#if OPAQUE_UPP_TYPES
#if CALL_NOT_IN_CARBON
    EXTERN_API(ControlPanelDefUPP)
    NewControlPanelDefUPP          (ControlPanelDefProcPtr  userRoutine);

    EXTERN_API(void)
    DisposeControlPanelDefUPP      (ControlPanelDefUPP      userUPP);

    EXTERN_API(long)
    InvokeControlPanelDefUPP       (short                   message,
                                    short                   item,
                                    short                   numItems,
                                    short                   cPanelID,
                                    EventRecord *           theEvent,
                                    long                    cdevValue,
                                    DialogPtr               cpDialog,
                                    ControlPanelDefUPP      userUPP);

#endif  /* CALL_NOT_IN_CARBON */

#else
    enum { uppControlPanelDefProcInfo = 0x000FEAB0 };               /* pascal 4_bytes Func(2_bytes, 2_bytes, 2_bytes, 2_bytes, 4_bytes, 4_bytes, 4_bytes) */
    #define NewControlPanelDefUPP(userRoutine)                      (ControlPanelDefUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppControlPanelDefProcInfo, GetCurrentArchitecture())
    #define DisposeControlPanelDefUPP(userUPP)                      DisposeRoutineDescriptor(userUPP)
    #define InvokeControlPanelDefUPP(message, item, numItems, cPanelID, theEvent, cdevValue, cpDialog, userUPP)  (long)CALL_SEVEN_PARAMETER_UPP((userUPP), uppControlPanelDefProcInfo, (message), (item), (numItems), (cPanelID), (theEvent), (cdevValue), (cpDialog))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewControlPanelDefProc(userRoutine)                     NewControlPanelDefUPP(userRoutine)
#define CallControlPanelDefProc(userRoutine, message, item, numItems, cPanelID, theEvent, cdevValue, cpDialog) InvokeControlPanelDefUPP(message, item, numItems, cPanelID, theEvent, cdevValue, cpDialog, userRoutine)


#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __PROCESSES__ */

