mac-rom/ProcessMgr/Puppet.h

225 lines
7.5 KiB
C
Raw Normal View History

/*
File: Puppet.h
Contains: Puppet string interface
Written by: Phillip Y. Goldman, Software Atomic Knee Drop
Copyright: <EFBFBD> 1986-1991 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<0> 11/15/86 PYG New Today.
*/
#ifndef __PUPPET__
#define __PUPPET__
/************************************************************************************
* Basic definitions.
************************************************************************************/
#ifndef FOR_REZ
/* Prototype instruction list */
typedef struct eventList
{
long offset;
short count;
EventRecord events[0];
} EventList, *EventListPtr, **EventListHdl;
/* Size of event list header, and the offset to use when initializing instruction
* list to specify first instruction.
* NOTE: Relies on the fact that we defined the EventRecord array with count == 0.
*/
#define SIZEOF_EVENTLIST_HDR (sizeof(EventList))
#endif FOR_REZ
/************************************************************************************
* Puppet event information.
************************************************************************************/
/* SYS_PUPPET_STRING_RSRC_ID is the ID of the puppet string resources we've added to
* the system file. There is a generic default one, and there is a custom default
* one for each of three (old) apps that required it for compatibility. The value of
* this constant is determined by the MakeFile, since it needs to add the resource.
* APP_PUPPET_STRING_RSRC_ID is the ID of a puppet string resource that developers can
* add to the app file.
* Type of the resource is the signature of the application. The generic default
* uses (DefaultPupStrType) we made up in the MakeFile.
*/
/* #define SYS_PUPPET_STRING_RSRC_ID {SysPupStrID} from MakeFile */
#define APP_PUPPET_STRING_RSRC_ID (127)
/* Puppet String types */
#define pstNormalEvent 0
#define pstNullInstr 1
#define pstUnknownInstr 2
#define pstMenuItem 3
#define pstEventList 4
#define pstEventCode 5
#define pstImplementCode 6
#define pstIllegalInstr 7
#define pstMenuString 8
/* Instruction Types */
#define instrReset 2
#define instrCut 3
#define instrCopy 4
#define instrPaste 5
#define instrSelRect 6
#define instrSelAll 7
#define instrMemCopy 8
#define instrOutlineRect 9
#define instrPrivate1 10 /* For intra-puppet string use only */
#define instrQuit 11
#define instrOpen 12
#define instrCancel 13
/* Instruction/Event Flags */
#define instrMouseLocal 0x8000
#define evtMouseLocal 0x8000
#define evtMouseGlobal 0x0000
#define evtMouseEither 0x4000
#define evtIsImportant 0x0000
#define evtIsUnimportant 0x2000
/* String IDs for type pstMenuString */
#define menuStringListResType 'mst#'
#define menuStringResType 'mstr'
#define strIDQuitMenu 100
#define strIDQuitItem 101
#define strIDOpenMenu 102
#define strIDOpenItem 103
#ifndef FOR_REZ
/* Prototypes for routines imbedded in puppet resources */
typedef pascal short
(*Puppetstringimplcode_ptr)(EventRecord *evtPtr);
typedef pascal EventListHdl
(*Puppetstringevtcode_ptr)(EventRecord *evtPtr);
#endif FOR_REZ
/************************************************************************************
* Trap interface.
************************************************************************************/
#ifndef FOR_REZ
pascal void
RequestScratchSwitchTask(ProcessID taskDescriptor, Handle eventListIn, Handle eventListOut, short timeout)
= {0x3F3C,0x0000,0xA88F};
/* This key (comma) with cmd key causes return to master */
#define SCRATCHPADRETURNKEYCODE (0x2B)
/* Bit of resume event message that signals a scratchpad return */
#define bitResumeScratch 2
/* RequestScratchSwitchTask() return values (stored in bits 24-31 of resume event message) */
#define ResumeFromScratchpad 0
/* #define resumeFlag 1 <09>in {CIncludes}Events.h */
#define ResumeTimeout 2
#define ResumeEventListInErr 3
#define ResumeEventListOutErr 4
#define ResumeFromCancel 5
/* Information record returned by GetActiveTaskInfo */
typedef struct TaskInfoRec {
ProcessID taskDescriptor;
long signature;
long version;
} TaskInfoRec, *TaskInfoPtr, **TaskInfoHdl;
pascal short
GetActiveTaskInfo(TaskInfoRec taskInfo[], short maxSlot)
= {0x3F3C,0x0001,0xA88F};
/* Information record returned by GetSwitchInfo */
typedef struct SwitchInfoRec {
long signature;
long version;
} SwitchInfoRec, *SwitchInfoPtr, **SwitchInfoHdl;
pascal void
GetSwitchInfo(SwitchInfoPtr switchInfoPtr)
= {0x3F3C,0x0002,0xA88F};
pascal void
CancelSwitch(void)
= {0x3F3C,0x0003,0xA88F};
#endif FOR_REZ
/************************************************************************************
* Private information.
************************************************************************************/
#ifndef FOR_REZ
/* List of menu item names for puppet purposes */
typedef struct StrList
{
unsigned short cStrings; /* number of strings in pStrings */
Str255 pStrings[]; /* all strings OK for this menu item */
} StrList, *StrListPtr, **StrListHdl;
extern StrListPtr pStrListCopyNamePrefix;
/* Instruction list queue data and manipulation routines */
typedef struct PuppetInstrElem *PuppetInstrElemPtr, **PuppetInstrElemHdl;
typedef struct PuppetInstrElem {
PuppetInstrElemHdl nextPuppetInstrElem; /* handle to next instruction list */
EventListHdl instrsHdl; /* handle to instruction list proper */
unsigned short instrModBits; /* evtMouseGlobal or evtMouseLocal */
} PuppetInstrElem;
/* Puppet string control information */
typedef struct PuppetVars
{
PEntryPtr puppetMasterProc; /* puppet: PEntry of master process */
unsigned short puppetTimeout; /* puppet: count of GNEs before timeout */
unsigned short puppetModBits; /* puppet: default event mods */
MFmsgBlkPtr puppetEppcMsgBlk; /* puppet: EPPC being translated, or 0 */
PuppetInstrElemHdl puppetInstrQueue; /* puppet: queue of event lists */
PuppetInstrElemHdl puppetOutInstrsHdl; /* puppet: event list for canceled switch */
PEntryPtr masterPuppetProc; /* master: PEntry of puppet process */
char masterResumeMsg; /* master: value for resume_message */
} PuppetVars;
/* Control tuning */
#define TIMEOUT_MASKYIELD 15 /* wait limit for a legal event mask */
#define TIMEOUT_BUTTONDOWN 10 /* wait limit for a mouse up event */
/* Shared data */
extern Point buttonUpPt; /* point where mouse button comes up */
extern long forcedPupStrMenuSelection; /* menu selection we are stuffing */
extern short timeoutMaskYield; /* wait limit for a legal event mask */
extern short timeoutButtonDown; /* wait limit for a mouse up event */
/* Some simple operations as macros, rather than subroutines */
#define SetOutInstrsHdl(pProc, eventListHdl) (pProc->p_puppetvars.puppetOutInstrsHdl = (eventListHdl))
#define InstrsQueueIsEmpty() (pCurrentProcess->p_puppetvars.puppetInstrQueue == nil)
#define ClearInstrsQueue() {while (DumpFirstInstr() != nil) ;}
#define IsOutEventListActive() (pCurrentProcess->p_puppetvars.puppetOutInstrsHdl == (Handle) -1)
/* Function prototypes */
void PuppetStringsInit(void);
OSErr CoreRequestScratchSwitchTask(PEntryPtr, EventListHdl, EventListHdl, short, MFmsgBlkPtr);
EventListHdl GetActiveInstrsHdl(void);
OSErr PushInstrsHdl(PEntryPtr, EventListHdl, short);
OSErr AddInstrsHdl(PEntryPtr, EventListHdl);
PuppetInstrElemHdl DumpFirstInstr(void);
void CancelSwitchWithError(void);
#endif FOR_REZ
#endif __PUPPET__