mac-rom/Toolbox/WindowMgr/WindowList.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

387 lines
11 KiB
Plaintext

;
; File: WindowList.a
;
; Contains: The assembly language glue used to patch layer and window manager to implement
; a layerless windowing environment for applications.
;
; Written by: David Collins
;
; Copyright: © 1992-1993 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM3> 6/17/93 KW (LW2 fau) Changed the clearing of DragFlag to be a word, instead
; of a byte.
; <12> 6/25/92 DC fixed patch on SetTrapAddress to preserve A1 and D1.
; <11> 6/9/92 DC Fixed PointInMenuBar for Non-ColorQD machines.
; <10> 6/8/92 DC Added startup icon. Fixed PtInMenuBar for Plus and SE
; <9> 6/3/92 DC Fixed some crashing bugs with help manager on.
; <8> 5/31/92 DC Patched ShowHide to to call a ShowHideLayer (my routine) which
; does the right thing for a layer shuffled in with other layers.
; <7> 5/15/92 DC Correct all the funky RomBinds
; <6> 5/14/92 DC Remove patch to SendBehind because its being fixed in my version
; of WindowMgrPatches.a. Added a comefrom patch to FrontWindow to
; find the real next window to select if a window is moved
; backwards. We also want to do the global order change here.
; <5> 4/20/92 DC Fixed random silly bugs.
; <4> 4/14/92 DC Made the call to GetNextWindow to be pascal in calling
; convention. Make a reference to BringToFrontGuts.
; <3> 4/10/92 DC I'm going to incorporate a copy of LayerMgr.c and
; WindowMgrPatches.a into my INIT so that I can make changes to
; that code as necessary. All changes to working code will be
; conditionalized with hasLayerlessApps.
; <2> 4/1/92 DC Patched everything. Still not what I want. Checking in just to
; save my state before restructuring.
; <1> 3/20/92 DC first checked in
;
;
load 'StandardEqu.d'
include 'LinkedPatchMacros.a'
IF &TYPE('__INCLUDINGLAYEREQU__') = 'UNDEFINED' THEN
include 'LayerEqu.a'
ENDIF
IF &TYPE('__INCLUDINGTOOLEQU__') = 'UNDEFINED' THEN
include 'ToolEqu.a'
ENDIF
IF &TYPE('hasLayerlessAppsINIT') = 'UNDEFINED' THEN
hasLayerlessAppsINIT SET 0
ENDIF
MBarHitMsg EQU 1 ; no defined constant for this
cacheSize EQU 101
WindowListData RECORD 0
lastWindow ds.l 1 ; windowHolder of the window whose click was detected most recently
oldOSDispatch ds.l 1 ; address of unpatched OSDispatch
bringToFrontProcess ds.l 2 ; PSN being brought to front
windowHolderList ds.l 1 ; the window we are managing
windowHolderListEnd ds.l 1 ; its layer
hashTable ds.l cacheSize ; window in behind this window
ENDR
WindowHolder RECORD 0
whichWindow ds.l 1 ; the window we are managing
LayerPeek ds.l 1 ; its layer
inFrontOf ds.l 1 ; window in behind this window
behind ds.l 1 ; window in front of this window
next ds.l 1 ; the next WindowHolder in the hash bucket
visible ds.b 1 ; stored show/hide state for layer show/hides
ENDR
ROMs Plus,SE,II,Portable,IIci
; The following ROM binds are calculated (only the FX entry is correct). They all need to be run through the ROM listings
AfterPaintBehindInMoveWindow ROMBind (Plus,$119E8),(SE,$C05A),(II,$FE14),(IIci,$18CD6),(Portable,$10BF8)
romDeleteWindow ROMBind (Plus,$11220),(SE,$B868),(II,$F474),(IIci,$182A4),(Portable,$103EA)
AfterDisposeRgnInCloseWindow ROMBind (Plus,$117AA),(SE,$BE10),(II,$FBBC),(IIci,$18A7E),(Portable,$109AE)
AfterSelectWindowInSendBehind ROMBind (Plus,$11CE8),(SE,$C388),(II,$10238),(IIci,$19112),(Portable,$10F42)
AfterFrontWindowInSendBehind ROMBind (Plus,$11CD0),(SE,$C370),(II,$10220),(IIci,$190FA),(Portable,$10F2A)
AfterSaveOldInShowHide ROMBind (Plus,$114B8),(SE,$BB0C),(II,$F75E),(IIci,$18598),(Portable,$1068E)
AfterCalcRgnCallInShowHide ROMBind (Plus,$114C0),(SE,$BB14),(II,$F766),(IIci,$185A0),(Portable,$10696)
romCallWindow ROMBind (Plus,$11A20),(SE,$C092),(II,$0FF48),(Portable,$10C48),(IIci,$18E0E)
romCallMBarProc ROMBind (Plus,$11A20),(SE,$C092),(II,$113A6),(Portable,$11E84),(IIci,$178D6)
wlHiliteWindow PatchProc _HiliteWindow
IMPORT __patchHiliteWindow
JMP __patchHiliteWindow
EXPORT oldHiliteWindow
oldHiliteWindow JMPOLD
ENDPROC
;
; BringToFrontOfCurLayer
;
BringToFrontOfCurLayer PROC EXPORT
MOVE.L A2, -(SP)
MOVE.L 8(SP), A2
MOVE.L A2, -(SP)
JSRROM romDeleteWindow
LEA WindowList, A0
checkForNeverActive MOVE.L (A0), D0
BEQ.S insertTheWindow
MOVE.L D0, A1
CMPI.W #$DEAD, txSize(A1)
BNE.S insertTheWindow
TST.B LayerRecord.neverActive(A1)
BEQ.S insertTheWindow
LEA nextWindow(A1), A0
BRA.S checkForNeverActive
insertTheWindow MOVE.L D0, nextWindow(A2)
MOVE.L A2, (A0)
MOVE.L (SP)+, A2
RTS
ENDPROC
;
; wlFixSendBehind
;
wlFixSendBehind ComeFromPatchProc _FrontWindow,AfterFrontWindowInSendBehind
IMPORT __ActiveWindow
JSR __ActiveWindow
CMP.L (SP)+, A3
BNE.S RunAway
SUBQ.L #4, SP
MOVE.L A3, -(SP)
IMPORT GetNextVisibleWindow
JSR GetNextVisibleWindow
MOVE.L (SP)+, D0
BEQ.S RunAway
MOVE.L D0, -(SP)
_SelectWindow
IMPORT GetWindowHolder
RunAway SUBQ.L #4, SP
MOVE.L A3, -(SP)
JSR GetWindowHolder
SUBQ.L #4, SP
MOVE.L 28(SP), -(SP) ; get the window we're moving behind
JSR GetWindowHolder
IMPORT Rearrange
JSR Rearrange
ADDQ.L #4, SP ; pop return address off stack
jmpRom AfterSelectWindowInSendBehind
ENDPROC
;
; wlFixMoveWindow
;
wlFixMoveWindow ComeFromPatchProc _PaintBehind,AfterPaintBehindInMoveWindow
SUBQ.L #4, SP
MOVE.L A3, -(SP)
IMPORT GetNextWindow
JSR GetNextWindow
MOVE.L (SP)+, 8(SP)
jmpOld
ENDPROC
;
; wlFixCloseWindow
;
wlFixCloseWindow ComeFromPatchProc _DisposRgn,AfterDisposeRgnInCloseWindow
MOVE.L A3, -(SP)
IMPORT DeleteWindowHolders
JSR DeleteWindowHolders
JMPOLD
ENDPROC
;
; GetWLGlobals returns a pointer to the layerless application globals in A1.
; preserves A0.
;
GetWLGlobals PROC EXPORT
MOVE.L ExpandMem, A1
MOVE.L ExpandMemRec.emWindowListGlobals(A1), A1
RTS
ENDPROC
;
; wlPatchOSDispatch
;
wlPatchOSDispatch PROC EXPORT
IMPORT GetWLGlobals
CMPI.W #$3B, 4(SP)
BNE.S doOld
MOVE.L 6(SP), A0
JSR GetWLGlobals
LEA WindowListData.bringToFrontProcess(A1), A1
MOVE.L (A0)+, (A1)+
MOVE.L (A0)+, (A1)+
doOld JSR GetWLGlobals
MOVE.L WindowListData.oldOSDispatch(A1), A1
JMP (A1)
ENDPROC
;
; wlPatchSetTrap
;
OSDispatchTrapNum EQU $8F
wlPatchSetTrap PatchProc _SetTrapAddress
MOVE.L A1, -(SP) ; have to preserve a1
CMPI.B #OSDispatchTrapNum, D0
BNE.S DoOld
IMPORT GetWLGlobals
JSR GetWLGlobals
TST.L WindowListData.oldOSDispatch(A1)
BNE.S DoOld
MOVE.L A0, WindowListData.oldOSDispatch(A1)
IMPORT wlPatchOSDispatch
LEA wlPatchOSDispatch, A0
DoOld MOVE.L (SP)+, A1
JMPOLD
ENDPROC
;
; wlBringToFront
;
wlBringToFront PatchProc _BringToFront
MOVE.L 4(SP), -(SP)
CLR.W DragFlag <LW2>
IMPORT BringToFrontGuts
LEA BringToFrontGuts, A0
IMPORT TwoByFour
JSR TwoByFour
IMPORT BringChildrenToFront
JMP BringChildrenToFront
ENDPROC
;
; wlShowHide
;
wlShowHide PatchProc _ShowHide
MOVE.L 6(SP), D0 ; get the window
BEQ.S runAway ; if its NULL, we fall back on ROM code
MOVE.L D0, A0
CMPI.W #$DEAD, txSize(A0) ; check if its a layer
BNE.S doneChecking ; if its not, we treat it like a normal window
IMPORT ShowHideLayer
JMP ShowHideLayer ; do the special version of this routine for layers
doneChecking SUBQ.L #4, SP ; make room for return value
MOVE.L D0, -(SP) ; push the window
IMPORT GetWindowHolder
JSR GetWindowHolder ; get the window holder for this window
MOVE.L (SP)+, A0 ; make sure the visible field in the WindowHolder is current
MOVE.L (A0), A0
MOVE.B 4(SP), WindowHolder.visible(A0)
runAway JMPOLD
ENDPROC
;
; HitTestWindow
;
HitTestWindow PROC EXPORT
MOVEM.L A3/D3, -(SP) ; Save A3 and D3
MOVEQ.L #WHitMsg,D0 ; D0 = hit message
MOVE.L 12(SP), A3 ; A3 = window pointer
MOVE.L 16(SP), D3 ; D3 = parameter
JSRROM romCallWindow ; Go into ROM
MOVEM.L (SP)+, A3/D3 ; Restore A3 and D3
MOVE.L (SP)+, A0 ; Get the return address
ADDQ.L #8, SP ; Pop off all the parameters
MOVE.W D0, (SP) ; place the return value
JMP (A0) ; return
ENDPROC
;
; PointInMenuBar
;
PointInMenuBar PROC EXPORT
MOVE.L 4(SP), D1 ; get the point to be tested
CMPI.W #$3FFF, ROM85 ; check for Color QuickDraw
BLE.S ColorCheck ; if we have it, we call the MBarDefProc
SWAP D1 ; make it a long equal to the x value of the point
MOVE.W MBarHeight, D0 ; D1 will be less than or equal to zero if in the menubar
SUB.W D1, D0
EXT.L D0
BRA.S RunAway
ColorCheck MOVE.L #MBarHitMsg, D0 ; tell the proc which message we want processed
JSRROM romCallMBarProc ; call the proc
RunAway MOVE.L (SP)+, A0 ; get the return address
ADDQ.L #4, SP ; pop off the point
MOVE.L D0, (SP) ; put the return value back on the stack
JMP (A0)
ENDPROC
;
; initWindowLists
;
iconID EQU 128
offset EQU 40
wListInstall InstallProc
IF hasLayerlessAppsINIT THEN
MOVE.W #iconID, -(SP) ; push the id of the icon suite to use at startup
MOVE.W #offset, -(SP) ; push the offset
IMPORT ShowTheIcon
JSR ShowTheIcon ; display our startup icon
MOVEA.L ExpandMem, A1
MOVE.L ExpandMemRec.emWindowListGlobals(A1), D1
BEQ.S noFixUp ; don't do any fix up if this value is NULL
MOVE.L D1, A0
_GetHandleSize ; get the size of the fix table
ASR.L #3, D0 ; get the number of fix records (each having two 4-byte addresses, thus we divide by 8)
SUBQ.L #1, D0 ; subtract one because we will be using this as an index for a DBRA instruction
MOVE.L D1, A0 ; get the handle to the fix table
MOVE.L (A0), A0 ; get the pointer to the fix table in A0
MOVE.W #$4EF9, D2 ; store the jump instruction in D2
fixPatch MOVE.L (A0)+, A1 ; Get the address of the patch routine
MOVE.W D2, (A1)+ ; put the jump to long address
MOVE.L (A0)+, (A1)+ ; put the put the argument to the jump in
DBF D0, fixPatch ; decrement the size counter and branch
MOVEA.L D1, A0
_DisposHandle
noFixUp
ENDIF
IMPORT __InitWindowLists
JMP __InitWindowLists
ENDPROC
END