sys7.1-doc-wip/Internal/C/DisplaysPriv.h
2019-07-27 22:37:48 +08:00

681 lines
27 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
File: DisplaysPriv.h
Contains: Private Headers for the Display Manager
Written by: Ian Hendry
Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<14> 11/5/93 IH Sync with Excelsior.
<SM13> 10/10/93 IH Sync with Excelsior for ROM build.
<12> 9/10/93 IH Fix cursor bug in horror ROMs and SuperMario.
<11> 8/26/93 IH #1108969 <KON>: Added some more debug defines. Added room for
res-independent QD info into state record.
<10> 8/16/93 IH #1099391 <KON>: Sync w/Reality. Fix apple event notification to
procs ptrs. Update DisplayMgr globals struct to match
DisplaysPriv.h
<SM9> 08-06-93 jmp Updated the timing constants used by the Display Manager for
non-intelligent displays.
<8> 8/4/93 IH #1101633,1098397,1101795,1101636,1102280 <KON>: Fix 1102280.
Propagate DisplayState handles through more calls. Add trap for
getting the decl rom info so it is easy to patch. Add Trap for
animation. Make GetROMMultiModeTable a trap so I can patch it.
<7> 6/25/93 IH Fix DM_AddDisplay to include new parameters. Changed macros to
use "_DisplayDispatch"
<6> 6/22/93 IH Fix multimode tables to have unsigned shorts.
<5> 6/1/93 IH Add private trap selector to get timing mode table.
<4> 5/28/93 IH #1081805,1086363: Reordered call selectors to make Finder calls
private.
<3> 4/8/93 IH Add support for mode switching. Added some prototypes for
DisplayMgrUtils.c
<2> 3/31/93 IH Clean up for SuperMario.
<1> 3/25/93 IH first checked in
<5> 3/24/93 IH Add Prototype for RecalcMenuBar. I may have added
DMSetMainDisplay here too. If so I will move it to Displays.h
next time I check these files in (are not modal checkin windows
great??).
<4> 3/17/93 IH Move private calls from Displays.h
<3> 3/5/93 IH Added more stuff.
<2> 2/25/93 IH Add new for desktop stuff
<1> 2/23/93 IH first checked in
*/
#pragma once
#ifndef __DISPLAYSPRIV__
#define __DISPLAYSPRIV__
//
// If the debug code is not defined to be on, then default to off
//
#ifndef DEBUG_DISPLAY_CODE
#define DEBUG_DISPLAY_CODE 0
#endif
#ifndef ENHANCE_DISPLAY_CODE
#define ENHANCE_DISPLAY_CODE 0
#endif
#ifndef __COMPONENTS__
#include <Components.h>
#endif
#ifndef __DISPLAYS__
#include <Displays.h>
#endif
#ifndef __EVENTS__
#include <Events.h>
#endif
#ifndef __LAYERS__
#include <Layers.h>
#endif
#ifndef __PROCESSES__
#include <Processes.h>
#endif
#ifndef __TRAPS__
#include <Traps.h>
#endif
#ifndef __VIDEO__
#include <Video.h>
#endif
#ifndef __WINDOWS__
#include <Windows.h>
#endif
// Make sure this is keep up with DisplaysPriv.a
enum {
gestaltDMLatestVersion = 0x00000002,
kDMConfigLatestVersion = 0x00000000
};
// At the moment, the mirroring code can only support two displays.
//
#define kDMNumDisplaysSupportedByMirroring 2
#if DEBUG_DISPLAY_CODE
#define AevtDebugPrint(x) { Str31 dbMsg; BuildMessage( dbMsg, "\p; aevt ~", (long)(x) ); DebugStr( dbMsg ); }
#define AedescDebugPrint(x) { Str31 dbMsg; BuildMessage( dbMsg, "\p; aedesc ~", (long)(x) ); DebugStr( dbMsg ); }
void BuildMessage( Str255 msg, Str255 pstr, long number, ... );
#define DMDebugStr(x) DebugStr(x)
#define DebugCntlDownNow() (0 != (*((char *)0x17b) & 0x08))
#define DebugCapsDownNow() (0 != (*((char *)0x17b) & 0x02))
#define Debug() if (*((short *)0x17A) & 0x0002) Debugger()
#else
#define AevtDebugPrint(x)
#define AedescDebugPrint(x)
#define DMDebugStr(x)
#define DebugCntlDownNow() (false)
#define DebugCapsDownNow() (false)
#define Debug()
#endif
#define FixCloseView 1 // Closeview breaks if menubar display size changes
#define FixFalseDMAwareBits 1 // Some applications set formerly reserved size bits
#define STOP_HERE Debugger
// Desktop Components definitions
#define kTableclothComponentType 'UDtc'
#define kPlacematComponentType 'UDpm'
#define kDrawProcComponentType 'UDdr' // knows how to draw a proc
#define stacksizeof(a) ((sizeof(a)+1) & (-2) )
enum TableclothMessagesType
{
kTableclothInit,
kGetDrawComponentSubtype,
kCountTableclothThumbnails,
kGetIndexedDrawComponent,
// kGetDrawObject, // The Draw component gets
kTableclothPostMessage // Figure the real messages end at (kTableclothPostMessage - 1)
};
typedef short TableclothMessagesType;
enum DrawComponentMessagesType
{
kDrawComponentInit,
kDrawComponentRender,
kDrawComponentGetRestoreData, // Tablecloth should return a handle that can be used to re-init it after restart
kDrawComponentRestoreComponent, // Tablecloth should return a handle that can be used to re-init it after restart
kDrawComponentPostMessage // Figure the real messages end at (kTableclothPostMessage - 1)
};
typedef short DrawComponentMessagesType;
struct DrawParamBlockRec {
RgnHandle fullRgn;
RgnHandle drawRgn;
Boolean isThumbNail;
Boolean isAnimate;
short drawFlags; // Future expansion (zeroed now)
CGrafPtr drawPort; // grafport in which to draw
};
typedef struct DrawParamBlockRec DrawParamBlockRec, *DrawParamBlockPtr, **DrawParamBlockHdl;
pascal ComponentResult GetDrawComponentSubtype(ComponentInstance theTablecloth,OSType *drawComponentSubtype)
= ComponentCallNow(kGetDrawComponentSubtype, stacksizeof(OSType *));
pascal ComponentResult CountThumbnails(ComponentInstance theTablecloth,short *thumbnailCount)
= ComponentCallNow(kCountTableclothThumbnails, stacksizeof(short *));
pascal ComponentResult GetIndexedDrawComponent(ComponentInstance theTablecloth,short componentIndex,Boolean isThumbnail,Rect *intendedRect,ComponentInstance *theDrawComponent)
= ComponentCallNow(kGetIndexedDrawComponent, stacksizeof(short )+stacksizeof(Boolean )+stacksizeof(Rect *)+stacksizeof(ComponentInstance *));
// Draw Component Calls
// This one call is known between the picker and the draw component.
// I could roll this call together with the RestoreTableCloth -- we should check this at a code review
//
// pascal ComponentResult InitTableCloth(ComponentInstance theTablecloth,long restoreVersion, Handle restoreInfo)
// = ComponentCallNow(kDrawComponentInit, stacksizeof(long)+stacksizeof(Handle ));
pascal ComponentResult RenderTablecloth(ComponentInstance theTablecloth,DrawParamBlockPtr drawParams)
= ComponentCallNow(kDrawComponentRender, stacksizeof(DrawParamBlockPtr));
pascal ComponentResult GetTableClothRestoreData(ComponentInstance theTablecloth,long* restoreVersion, Handle *restoreInfo)
= ComponentCallNow(kDrawComponentGetRestoreData, stacksizeof(long*)+stacksizeof(Handle *));
pascal ComponentResult RestoreTableCloth(ComponentInstance theTablecloth,ComponentDescription *savedByInfo,long restoreVersion, Handle restoreInfo)
= ComponentCallNow(kDrawComponentRestoreComponent, stacksizeof(ComponentDescription *)+stacksizeof(long)+stacksizeof(Handle));
enum {
// Display Communications
// Messages for displays components.
kDMComponentSelectorCheckMode = 1,
kDMComponentSelectorGetTag,
kDMComponentSelectorSetTag,
kDMComponentSelectorAssociateID
};
enum {
// Notification Messages for extended call back routines
kDMNotifyInstalled = 1, // At install time
kDMNotifyEvent = 2, // Post change time
kDMNotifyRemoved = 3, // At remove time
kDMNotifyPrep = 4, // Pre change time
// Notification Flags
kExtendedNotificationProc = (1<<16)
};
// Misc constants
enum {
kDefaultTitleBarHeight = 0x14,
kNever = -1L,
kFirstDisplayID = 0x100
};
#pragma procname DMExtendedNotification
typedef pascal void (*DMExtendedNotificationProcPtr)(void* userData,short theMessage,void* notifyData);
struct GDInfoRec {
unsigned long tickStamp;
unsigned long nextCall;
ComponentInstance tableclothInstance;
};
typedef struct GDInfoRec GDInfoRec, **GDInfoHdl;
struct DisplayInfoRec {
DisplayIDType displayID;
ComponentInstance displayComponent; // For smart displays
GDHandle displayDevice;
unsigned long displayFlags;
unsigned long displayReserved;
GDHandle mirroredDevice; // Link to device THIS one is mirroring (nil otherwise).
Rect unMirroredRect; // Original dimensions of THIS device.
Ptr unMirroredBaseAddr; // Original PixMap baseAddress of THIS device.
};
typedef struct DisplayInfoRec DisplayInfoRec, *DisplayInfoPtr, **DisplayInfoHdl;
struct MultiModeTableRec {
unsigned short displayConnection;
short offset;
};
typedef struct MultiModeTableRec MultiModeTableRec,*MultiModeTablePtr;
struct MultiModeNodeRec {
unsigned short timingMode;
unsigned short timingFlags;
};
typedef struct MultiModeNodeRec MultiModeNodeRec,*MultiModeNodePtr;
struct DisplayConfigRec {
unsigned long configVersion; // Set to 0
unsigned long configFlags; // Reserved
unsigned long configReserved; // Reserved
DisplayIDType displayID;
ComponentInstance displayComponent; // For smart displays
GDHandle displayDevice;
unsigned long displayFlags;
unsigned long displayMode; // Functional sResource (for NuBus)
unsigned long displayModeReserved; // Reserved mode info
unsigned long displayReserved;
// Information about the display state
//
unsigned short deviceFlags; // Reserved
unsigned long deviceDepthMode; // Video mode (from InitGDevice)
Rect deviceRect; // Global position (72 dpi)
// Pixmap info
Rect pixMapRect; // Global position (screen dpi)
Fixed pixMapHResolution; // QD resolution
Fixed pixMapVResolution; // QD resolution
long pixMapAlignment; // be ready for res-ind QD
long pixMapResReserved; // be ready for res-ind QD
short pixMapPixelType; // Chunky
short pixMapPixelSize; // QD depth
short pixMapCmpCount; // QD depth
short pixMapCmpSize; // QD depth
short pixMapReserved;
unsigned long pixMapColorTableSeed;
};
typedef struct DisplayConfigRec DisplayConfigRec, *DisplayConfigPtr, **DisplayConfigHdl;
struct DMProcPtrRegistrationRec {
ProcessSerialNumber registrationPSN;
DMNotificationProcPtr registrationProc;
unsigned long registrationFlags;
void* registrationUserData;
};
typedef struct DMProcPtrRegistrationRec DMProcPtrRegRec,*DMProcPtrRegPtr,**DMProcPtrRegHdl;
struct DisplayManagerGlobalsRec {
CGrafPtr fDrawingPort;
CGrafPort fPortStorage;
RgnHandle fWorkingDeskRectRgn;
RgnHandle fWorkingDeskFullRgn;
RgnHandle fWorkingUpdateRgn;
RgnHandle fDeskIconRgn;
RgnHandle fDesktopCacheRgn;
RgnHandle fAnimationCacheRgn;
ProcessSerialNumber fAnimatePSN;
unsigned long fAnimateA5; // Used for debugging when Display Manager is built into an application
Ptr fSavedDMGlobals; // Used for debugging when Display Manager is built into an application
unsigned long fNextAnimateTime;
Boolean fIconRgnInvalid; // T => desktop icon region has changed
unsigned char fDeskDrawNest; // 0 => FillRgn and FillCRgn patches should call Display Manager (otherwise just call through) -- (unused in ROM)
unsigned short fDisplayEntrySize; // Initialized to be sizeof(DisplayInfoRec)
DisplayIDType fDisplayNextID;
unsigned short fDisplayCount; // How many displays in display table
DisplayInfoHdl fDisplayTable; // Table of information about displays (FUTURE: should I sort and binary search?)
unsigned short fNotificationCount; // How many displays in display table
DMProcPtrRegHdl fNotificationTable; //
GDHandle fRemovedDevices; // List of removed devices that point to the device list
// ••• Warning •••
//
// The BlackBird/Yeager mirroring code currently accesses these globals directly. So, dont move them
// without updating that code as well.
//
// •••
//
Boolean fDevicesOverLap, // If true, *some* gDevices are overlapped (partically or fully).
fDevicesMirrored, // If true, all gDevices are fully overlapped, smallest gDevice determines rectangle for all devices.
fMirroringBlocked; // If true, mirroring has been “artifically” blocked (several 3rd-parties asked for this).
unsigned char fUnused1Byte4; //
//
// Back to normal variables
//
Ptr fQDA5World; // Points to fQDGlobals
Ptr fQDGlobals; //
unsigned long fUnused1; //
unsigned long fUnused2; //
unsigned long fUnused3; //
unsigned long fUnused4; //
};
typedef struct DisplayManagerGlobalsRec DisplayManagerGlobalsRec, *DisplayManagerGlobalsPtr, **DisplayManagerGlobalsHdl;
// Since globals contain a port (and there will be a port somewhere) we will have to allocate a pointer
// And given that we will allocate a pointer, we may as well put everything in it.
// Therefore GetExpandMemDisplayManagerGlobals() will contain a pointer to the globals
// #define GetDMGlobalsHdl() ((DisplayManagerGlobalsHdl )(GetExpandMemDisplayManagerGlobals()))
// #define GetDMGlobalsPtr() (*(DisplayManagerGlobalsHdl )(GetExpandMemDisplayManagerGlobals()))
#define GetDMGlobalsPtr() ((DisplayManagerGlobalsPtr )(GetExpandMemDisplayManagerGlobals()))
#define kMaxBlocks 20
#define kMaxDevices 20
#define DM__IsColorPort(GPtr) ((GPtr) && ( 0 > (short )((CGrafPtr )GPtr)->portVersion) )
struct DMDeviceBlockRec {
short deviceCount;
RgnHandle blockRgn;
GDHandle devices[kMaxDevices]; // GHandle
Point deviceOffset[kMaxDevices]; // Amount that this device must be moved
};
typedef struct DMDeviceBlockRec DMDeviceBlockRec,*DMDeviceBlockPtr,**DMDeviceBlockHdl;
struct DMDisplayBlocksRec {
short blockCount;
short unused; // Keep the world long aligned
DMDeviceBlockHdl displayBlocks[kMaxBlocks];
};
typedef struct DMDisplayBlocksRec DMDisplayBlocksRec,*DMDisplayBlocksPtr;
struct MyDeviceLoopRec {
DrawParamBlockPtr drawingParams;
RgnHandle updateRgn;
};
typedef struct MyDeviceLoopRec MyDeviceLoopRec,*MyDeviceLoopPtr;
struct DisplaysStateRec {
unsigned long flags;
short nesting; // Keep track of number of nexting of begin and end update calls
RgnHandle oldGrayRgn; // Not needed?
DisplayIDType oldMainDisplayID; // What was the main device when the call started
short displayCount;
DisplayConfigHdl displayConfigs;
};
typedef struct DisplaysStateRec DisplaysStateRec,*DisplaysStatePtr,**DisplaysStateHdl;
struct AppCompatibilityRec {
DisplaysStateHdl displaysState;
LayerPeek appLayer;
};
typedef struct AppCompatibilityRec AppCompatibilityRec,*AppCompatibilityPtr;
// Timing mode constants for Display Manager MultiMode support
// Corresponding .h equates are in DisplaysPriv.h
// .a equates are in DepVideoEqu.a
// .r equates are in DepVideoEqu.r
enum {
timingInvalid = 0, // Unknown timing… force user to confirm.
timingApple12 = 130, // 512x384 (60 Hz) Rubik timing.
timingApple12x = 135, // 560x384 (60 Hz) Rubik-560 timing.
timingApple13 = 140, // 640x480 (67 Hz) HR timing.
timingApple13x = 145, // 640x400 (67 Hz) HR-400 timing.
timingAppleVGA = 150, // 640x480 (60 Hz) VGA timing.
timingApple15 = 160, // 640x870 (75 Hz) FPD timing.
timingApple15x = 165, // 640x818 (75 Hz) FPD-818 timing.
timingApple16 = 170, // 832x624 (75 Hz) GoldFish timing.
timingAppleSVGA = 180, // 800x600 (56 Hz) SVGA timing.
timingApple1Ka = 190, // 1024x768 (60 Hz) VESA 1K-60Hz timing.
timingApple1Kb = 200, // 1024x768 (70 Hz) VESA 1K-70Hz timing.
timingApple19 = 210, // 1024x768 (75 Hz) Apple 19" RGB.
timingApple21 = 220, // 1152x870 (75 Hz) Apple 21" RGB.
timingAppleNTSC_ST = 230, // 512x384 (60 Hz, interlaced, non-convolved).
timingAppleNTSC_FF = 232, // 640x480 (60 Hz, interlaced, non-convolved).
timingAppleNTSC_STconv = 234, // 512x384 (60 Hz, interlaced, convolved).
timingAppleNTSC_FFconv = 236, // 640x480 (60 Hz, interlaced, convolved).
timingApplePAL_ST = 238, // 640x480 (50 Hz, interlaced, non-convolved).
timingApplePAL_FF = 240, // 768x576 (50 Hz, interlaced, non-convolved).
timingApplePAL_STconv = 242, // 640x480 (50 Hz, interlaced, non-convolved).
timingApplePAL_FFconv = 244 // 768x576 (50 Hz, interlaced, non-convolved).
};
//
// Internal Routines
//
pascal void DrawDeskPattern(RgnHandle deskRgnToFill);
void RecalcMenuBar(void);
pascal void CalcMBHeight(void);
pascal void DrawMBar(void);
pascal void GetMenuRgn(RgnHandle mBarRgn);
pascal void DM_RedrawAll(RgnHandle clobberedRgn);
Boolean DM_HideCursor(void);
void DM_ShowCursor(Boolean cursorHidden);
void FixLowMem(GDHandle oldMainDevice, GDHandle newMainDevice, short deviceOffsetX, short deviceOffsetY);
void FixPorts(GDHandle newMainDevice, Boolean alwaysRestoreColors, Rect* newMainRect, PixMapHandle newMainPixMap,
Rect* oldMainRect, Ptr oldBaseAddress, CTabHandle oldCTable);
void FixWindowMgrPorts(GDHandle newMainDevice);
pascal void DisplayMgrInstall(void);
pascal OSErr DM__GestaltProc(OSType selector, long* response);
// Warning: DM_GetDisplayInfoByGDevice and DM_GetDisplayInfoByDisplayID() return a pointer into an unlocked handle,
// so do not rely on them across call that might move memory.
DisplayInfoPtr DM_GetDisplayInfoByGDevice(GDHandle displayDevice,Boolean failToMain);
DisplayInfoPtr DM_GetDisplayInfoByDisplayID(DisplayIDType displayID,Boolean failToMain);
OSErr DM_DeleteDisplayInfoByDisplayID(DisplayIDType displayID);
OSErr DM_SetDisplayInfoByDisplayID(DisplayInfoPtr newDisplayInfo);
pascal void DM_InitQDWorld(DisplayManagerGlobalsPtr dmGlobals);
OSErr PrepImmediateUpdate(OSErr currentError, DisplaysStateHdl *displayState,THz *savedZone);
OSErr FinishImmediateUpdate(OSErr currentError, DisplaysStateHdl displayState,THz savedZone);
Boolean IsProcessMgrOkay(void);
OSErr CallAllProcesses(ProcPtr theProc,Ptr userData);
pascal void InterProcessChangeMainDevice(GDHandle newMainDevice);
pascal void InterProcessChangedModes(GDHandle changedDevice);
//
// Trap Routines
//
pascal OSErr DM_InitDisplayManager(void);
pascal OSErr DM_InstallDisplayManager(void);
pascal OSErr DM_KillDisplayManager(void);
pascal void DM_DrawDesktopRect(Rect *drawRect);
pascal void DM_DrawDesktopRegion(RgnHandle drawRgn);
pascal OSErr DM_SetDesktopIconRgn(RgnHandle iconRgn);
pascal OSErr DM_GetDesktopIconRgn(RgnHandle *iconRgn);
pascal void DM_ChangedDesktopIconRgn(void);
pascal Boolean DM_DeskClick(EventRecord* theEvent);
pascal OSErr DM_KeepWindowOnscreen(WindowPeek theWindow,RgnHandle oldGrayRgn);
pascal OSErr DM_NotifyAllProcesses(DisplaysStateHdl displayState);
pascal OSErr DM_GetROMMultiModeTable(MultiModeTablePtr* multiModeTable);
pascal OSErr DM_GiveDeskTime(void);
pascal OSErr DM_GetBestDepthModeInfo(GDHandle theDevice,VDSwitchInfoPtr modeInfo,unsigned long depthMode,short* bestDepth, Rect* modeRect);
pascal OSErr DM_PrivateBeginConfigureDisplays(DisplaysStateHdl *displayState,Boolean internalCall);
pascal OSErr DM_RemoveCurrentProcessProcs(void);
pascal GDHandle DM_GetFirstScreenDevice(Boolean activeOnly);
pascal GDHandle DM_GetNextScreenDevice(GDHandle theDevice,Boolean activeOnly);
pascal OSErr DM_NewDisplay(GDHandle* newDevice,short driverRefNum,unsigned long mode,unsigned long reserved,DisplayIDType displayID,ComponentInstance displayComponent,DisplaysStateHdl displayState);
pascal OSErr DM_DisposeDisplay(GDHandle disposeDevice,DisplaysStateHdl displayState);
pascal OSErr DM_AddDisplay(GDHandle newDevice,short driver,unsigned long mode, unsigned long reserved,DisplayIDType displayID,ComponentInstance displayComponent,DisplaysStateHdl displayState);
pascal OSErr DM_MoveDisplay(GDHandle moveDevice,short x,short y,DisplaysStateHdl displayState);
pascal OSErr DM_EnableDisplay(GDHandle addDevice,DisplaysStateHdl displayState);
pascal OSErr DM_DisableDisplay(GDHandle disableDevice,DisplaysStateHdl displayState);
pascal OSErr DM_RemoveDisplay(GDHandle removeDevice,DisplaysStateHdl displayState);
pascal OSErr DM_GetComponentAnimateTicks(ComponentInstance animationComponent,unsigned long *goodDelay,unsigned long *maxDelay);
pascal OSErr DM_SetComponentAnimateTicks(ComponentInstance animationComponent,unsigned long goodDelay,unsigned long maxDelay);
pascal OSErr DM_GetNextAnimateTime(unsigned long *nextAnimateTime);
pascal OSErr DM_SetAnimateProcess(const ProcessSerialNumberPtr animateProcess);
pascal OSErr DM_GetDeskRegion(RgnHandle* desktopRegion);
pascal OSErr DM_GetGDeviceTablecloth(GDHandle displayDevice,ComponentInstance *tableclothInstance);
pascal OSErr DM_SetGDeviceTablecloth(GDHandle displayDevice,ComponentInstance tableclothInstance);
pascal OSErr DM_SetMainDisplay(GDHandle newMainDevice,DisplaysStateHdl displayState);
pascal OSErr DM_SetDisplayMode(GDHandle theDevice,unsigned long mode,unsigned long *depthMode,VDSwitchInfoPtr switchModeInfo,DisplaysStateHdl displayState);
pascal OSErr DM_BeginConfigureDisplays(DisplaysStateHdl *displayState);
pascal OSErr DM_EndConfigureDisplays(DisplaysStateHdl displayState);
pascal OSErr DM_RegisterNotifyProc(DMNotificationProcPtr notifyProc,ProcessSerialNumberPtr animateProcess);
pascal OSErr DM_RegisterExtendedNotifyProc(DMExtendedNotificationProcPtr notifyProc,void* notifyUserData,unsigned short nofifyFlags,ProcessSerialNumberPtr notifyProcess);
pascal OSErr DM_RemoveNotifyProc(DMNotificationProcPtr notifyProc,ProcessSerialNumberPtr animateProcess);
pascal OSErr DM_GetDisplayMgrA5World(unsigned long* dmA5);
pascal OSErr DM_MoveCursor(const Point* newMouse,const long* cursorDev); // cursorDev should be nil for now
pascal OSErr DM_SwapDevices(GDHandle device1, GDHandle device2);
pascal OSErr DM_GetDisplayIDByGDevice(GDHandle displayDevice, DisplayIDType *displayID, Boolean failToMain);
pascal OSErr DM_GetGDeviceByDisplayID(DisplayIDType displayID, GDHandle* displayDevice, Boolean failToMain);
pascal OSErr DM_QDIsMirroringCapable(Boolean *qdIsMirroringCapable);
pascal OSErr DM_CanMirrorNow(Boolean *canMirrorNow);
pascal OSErr DM_IsMirroringOn(Boolean *isMirroringOn);
pascal OSErr DM_MirrorDevices(GDHandle gD1, GDHandle gD2, DisplaysStateHdl displayState);
pascal OSErr DM_UnmirrorDevice(GDHandle gDevice, DisplaysStateHdl displayState);
pascal OSErr DM_GetNextMirroredDevice(GDHandle gDevice, GDHandle *mirroredDevice);
pascal OSErr DM_BlockMirroring(void);
pascal OSErr DM_UnblockMirroring(void);
pascal OSErr DM_SetDisplayComponent(GDHandle theDevice,ComponentInstance displayComponent);
pascal OSErr DM_GetDisplayComponent(GDHandle theDevice,ComponentInstance *displayComponent);
pascal OSErr DM_SetDisplayID(GDHandle theDevice,DisplayIDType displayID);
// Utility Routines
GDHandle FindMaxCoverageDevice(const Rect* windowRect);
GDHandle FindClosestDevice(const Rect* windowRect);
Boolean IsActiveScreenDevice(GDHandle theDevice,Boolean activeOnly);
unsigned short GetActiveScreenDeviceCount(Boolean activeOnly);
void GetWindowGlobalRegion(WindowPeek theWindow,RgnHandle windowRgn,Point *structOffset, Boolean isMovable,Boolean hasStructRgn);
Rect* LocalPinRectToRect(Rect *r,Rect *pinRect);
OSErr CheckExpandMem(Boolean allocateIfNeeded);
Boolean DisplayHasMenu(GDHandle aDevice);
void FindBestDepthMode(short theSlot,VDSwitchInfoPtr modeInfo,short desiredDepth);
pascal void UpdateScreenBits(GDHandle newMainDevice);
OSErr GetDeviceSlotInfo(GDHandle theDevice, unsigned short* theSlot,unsigned short* theID, unsigned short* theExtDev);
OSErr GetTimingFromDecl(GDHandle theDevice,short displayType,VDTimingInfoPtr declTiming);
OSErr DisplayManagerCloseViewCompatibility(GDHandle theGDevice,Rect* newDeviceRect,short newDepth);
OSErr DisplayManagerAwareBitCompatibility(ProcessInfoRec *processInfo);
void GetDisplayConfig(GDHandle displayDevice,DisplayConfigPtr displayConfig);
OSErr BuildNotificationAppleEvent(DisplaysStateHdl displayState,AERecord *notifyRecord);
OSErr BuildDisplayConfigHandle(DisplayConfigHdl *displayConfigs,short *displayCount);
void InitAEDesc(AEDesc* theDesc);
// Boolean TestFlagBit(unsigned long flagLong,short flagBit);
// void SetFlagBit(unsigned long *flagLong,short flagBit);
OSErr GetGDeviceVideoMode(GDHandle theDevice,VDSwitchInfoPtr videoMode,Boolean* driverHasGetCurMode);
OSErr SwitchVideoMode(GDHandle theDevice,VDSwitchInfoPtr newMode);
OSErr GetDisplayConnection(GDHandle theDevice,VDDisplayConnectInfoPtr connectInfo);
OSErr GetTimingMode(GDHandle theDevice,VDTimingInfoPtr timingInfo);
void InitNewDisplayInfo( DisplayIDType displayID, ComponentInstance displayComponent, GDHandle displayDevice, unsigned long displayFlags, unsigned long displayReserved, DisplayInfoPtr newdisplayInfo);
// Display Component Calls
//
pascal ComponentResult DisplayComponentCheckDisplayMode(ComponentInstance displayComponent,GDHandle theDevice, VDDisplayConnectInfoPtr connectInfo,VDTimingInfoPtr modeTiming,unsigned short theDepth,unsigned long* switchFlags,unsigned long reserved,Boolean* modeValid)
= ComponentCallNow(kDMComponentSelectorCheckMode, stacksizeof(VDDisplayConnectInfoPtr )+stacksizeof(VDTimingInfoPtr )+stacksizeof(unsigned short)+stacksizeof(unsigned long *)+ stacksizeof(unsigned long)+stacksizeof(Boolean *));
pascal ComponentResult DisplayComponentGetTagDisplayState(ComponentInstance displayComponent, short* isTagged)
= ComponentCallNow(kDMComponentSelectorGetTag, stacksizeof(short *));
pascal ComponentResult DisplayComponentSetTagDisplayState(ComponentInstance displayComponent, short isTagged)
= ComponentCallNow(kDMComponentSelectorSetTag, stacksizeof(short ));
pascal ComponentResult DisplayComponentSetDisplayID(ComponentInstance displayComponent, DisplayIDType displayID)
= ComponentCallNow(kDMComponentSelectorAssociateID, stacksizeof(DisplayIDType ));
// Trap Interfaces
//
pascal OSErr DMInstallDisplayManager(void)
= {0x70FF,_DisplayDispatch};
pascal OSErr DMInitDisplayManager(void)
= {0x70FE,_DisplayDispatch};
pascal OSErr DMKillDisplayManager(void)
= {0x70FD,_DisplayDispatch};
pascal OSErr DMSetDesktopIconRgn(RgnHandle iconRgn)
= {0x303C,0x02FC,_DisplayDispatch};
pascal OSErr DMGetDesktopIconRgn(RgnHandle* iconRgn)
= {0x303C,0x02FB,_DisplayDispatch};
// DMKeepWindowOnscreen Used in NuMonitors.p -- do not change here without changing there too
pascal OSErr DMKeepWindowOnscreen(WindowPeek theWindow,RgnHandle oldGrayRgn)
= {0x303C,0x04FA,_DisplayDispatch};
pascal OSErr DMNotifyAllProcesses(DisplaysStateHdl displayState)
= {0x303C,0x02F9,_DisplayDispatch};
pascal OSErr DMSetAnimateProcess(const ProcessSerialNumberPtr animateProcess)
= {0x303C,0x02F8,_DisplayDispatch};
// Used in Bungee Finder -- API FROZEN => do not change here without changing there too
pascal OSErr DMChangedDesktopIconRgn(void)
= {0x70F7,_DisplayDispatch};
// Used in Bungee Finder -- API FROZEN => do not change here without changing there too
pascal Boolean DMDeskClick(const EventRecord* theEvent)
= {0x303C,0x02F6,_DisplayDispatch};
pascal OSErr DMGetROMMultiModeTable(MultiModeTablePtr* multiModeTable)
= {0x303C,0x02F5,_DisplayDispatch};
pascal OSErr DMGiveDeskTime(void)
= {0x70F4,_DisplayDispatch};
pascal OSErr DMGetBestDepthModeInfo(GDHandle theDevice,VDSwitchInfoPtr modeInfo,unsigned long depthMode,short* bestDepth,Rect* modeRect)
= {0x303C,0x0AF3,_DisplayDispatch};
pascal OSErr DMPrivateBeginConfigureDisplays(DisplaysStateHdl *displayState,Boolean internalCall)
= {0x303C,0x03F2,_DisplayDispatch};
pascal OSErr DMRemoveCurrentProcessProcs(void)
= {0x70F1,_DisplayDispatch};
pascal OSErr DMMoveCursor(Point* where, long* curDev)
= {0x303C,0x04F0,_DisplayDispatch};
pascal OSErr DMRegisterExtendedNotifyProc(DMExtendedNotificationProcPtr notifyProc,void* notifyUserData,unsigned short nofifyFlags,ProcessSerialNumberPtr whichPSN)
= {0x303C,0x07EF,_DisplayDispatch};
pascal OSErr DMSetDisplayID(GDHandle theDevice,DisplayIDType displayID)
= {0x303C,0x04EE,_DisplayDispatch};
#endif