/*
 	File:		Processes.h
 
 	Contains:	Process Manager Interfaces.
 
 	Version:	Technology:	Mac OS 8
 				Release:	QuickTime 4.1
 
 	Copyright:	(c) 1989-1999 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);

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

#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.
*/
EXTERN_API( OSErr )
LaunchControlPanel				(const FSSpec *			pFileSpec)							THREEWORDINLINE(0x3F3C, 0x007B, 0xA88F);

/* 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
	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);

#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__ */

