mac-rom/Toolbox/ScriptMgr/ScriptMgrMisc.a

549 lines
20 KiB
Plaintext
Raw Normal View History

;
; File: ScriptMgrMisc.a (formerly SMgrMisc.a)
;
; Contains: Miscellaneous Script Manager routines.
;
; Written by: JDT Joe Ternasky
; MED Mark Davis
; LDC Lee Collins
; PKE Peter Edberg
;
; Copyright: <09> 1986-1993 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM5> 5/21/93 CSS Delete body of SMgrCalRect as it is obsolete per P. Edberg's
; review. Leave an RTS so that the vector here still works.
; <SM4> 10/22/92 CSS Change some branch short instructions to word branches.
; <10> 6/12/92 FM Broke out the SMgrpostMunging routine into its own proc, and put
; it here. It used to be in ScriptMgrPatch.a. This way it can be
; used in the rom build without all the unecessary patch code for
; the GetOSEvent patch.
; <9> 5/31/92 FM Remove rom only version of PrintAction. It is in
; ScriptMgrExtensions now. I left in the forROM conditionals that
; cause the ScriptMgr to jump through vectors.
; <8> 4/29/92 JSM Get rid of conditionals: Don<6F>t use smgrSysVers, smgrUseStdExit
; and ScriptMgrKeyboardMenu are always true. Leave forROM
; conditionals in for now until we fix the ROM build.
; <7> 12/10/91 PKE #1017754: Script Mgr Print Action dispatcher should leave
; ScriptRecord ptr in a0. For non-ROM builds, move PrintAction to
; ptch 27 for all CPUs. Delete some obsolete conditionalized code.
; <6> 12/15/90 PKE (gbm) Move <20>itlk<6C> loading from KeyScript into SwapKybd. Fixes
; bugs with some European keyboards when using Keyboard menu, etc.
; <5> 12/14/90 PKE (DC) Force SwapKybd to load 'KCHR' resources from System file.
; <4> 5/13/90 SMB Just <20>rts<74> if SwapIcon is called. No one should still be calling
; it in 7.0, but just in case.... (better safe than sorry..)
; <3> 4/10/90 PKE Use smgrSysVers, smgrROMVers, forRom, doScriptMgrUseKscn, and
; doScriptMgrRstKCHRFix symbols instead of buildLevel. Deleted
; conditionalized def<65>n of forRom and SysVers. Fixed up header and
; tabs.
; <2> 3/20/90 EMT Removed unnecessary ROM85 references and oldMacTweek code.
; <1> 12/18/89 CCH Adding for the first time into BBS. Changed include 'inc.sum.a'
; to load 'StandardEqu.d'. Updated file name references.
;
; (BBS versions above, EASE versions below)
; <1.9> 11/17/89 PKE In ResetKCHR, clear KybdDriverData.deadKey as long, not word.
; <1.8> 9/18/89 PKE For 7.0, SwapIcon uses new type 'kscn' instead of 'SICN'.
; <1.7> 8/26/89 PKE Cleaned up conditionals.
; <1.6> 8/22/89 SES Removed references to nFiles.
; <1.5> 6/30/89 PKE NEEDED FOR AURORA: For ROM, SwapIcon & SwapKybd now dispatch
; through an internal vector.
; <1.4> 6/23/89 PKE Skip definition of buildLevel (done in ScriptPriv.a).
; <1.3> 2/21/89 PKE Replaced with RomProj version, which already had system and Rom
; sources merged.
; (EASE ROMproj versions below)
; <1.5> 2/21/89 PKE Fix up includes: always use include 'inc.sum.a'.
; <1.4> 2/14/89 PKE Updated to use MPW 3.0 final ScriptEqu.a equate names
; <1.3> 2/3/89 PKE Merged with current system sources (CCH's 01/16/1989 merge of
; 6.0.3 and 7.0 sources, done in RES.sys:smgr)
; <1.2> 11/14/88 PKE Synchronize EASE and Projector
; <1.1> 11/11/88 CCH Fixed Header.
; <1.0> 11/9/88 CCH Adding to EASE.
; (old EASE ROMproj versions below)
; <1.8> 10/31/88 CCH Added inside of ScriptPriv.a
; (EASE SYSproj versions below)
; <1.2> 2/14/89 PKE Updated to use MPW 3.0 final ScriptEqu.a equates
; <1.1> 1/16/89 CCH Merged 6.0.3 final sources into 7.0.
; <1.0> 11/16/88 CCH Added to EASE.
; (preEASE versions below)
; 10/13/88 ldc Added include of 'AppleDeskBusPriv.a'
; 10/10/88 ldc use inc.sum.a for rom
; 5/19/88 ldc standardized exit via StdUnlink
; ** changes above for ROM or sys $700 **
; 2/22/88 med Zap Ed<45>s keyboard if it is left around
; 8/21/87 med Used smgrGenFlags (field) as offset, not verb.
; 7/24/87 med SwapKybd was not saving D4
; 7/7/87 med Cleaned up adb equate usage
; 7/7/87 med Test for MBarHeight before drawing icon, test for smfShowIcon
; for showing icon always
; 5/21/87 med Was swapping keyboard using icon number
; 5/21/87 med Made fix to use adb.origADBAddr to test keyboard
; 3/9/87 med Minor equate change
; 2/28/87 med Expand keycache ptr if possible. Reset emKeyCache between copies.
; 2/27/87 med Changed test of ADB machine to be more robust, Used ExpandMem
; fields instead of SMgr fields
; 12/31/86 jdt Moved check on smgrEnabled <= 1 into SwapIcon.
; 12/28/86 jdt Fixed SwapIcon to save and restore the current GrafPort and the
; clipping region of the Window Manager port. Removed checks on
; ResErr after GetResources calls. Replaced resource constants
; with literals.
; 12/22/86 jdt Changed stack frames to include argument sizes. Removed WMgrPort
; clipping region stuff in SwapIcon. Replace event mask with
; constant.
; 12/9/86 jdt Created from initialization code..
;___________________________________________________________________________________________________
; To Do:
;
;___________________________________________________________________________________________________
load 'standardequ.d'
include 'ApplDeskBus.a'
include 'ScriptPriv.a'
hwCbADB EQU 10 ; Apple Desktop Bus present.
proc
blanks on
string asis
export SwapKybd ; swaps KCHR resource.
export SwapIcon ; swaps kscn resource.
import StdUnlink
export xSwapKybd,xSwapIcon ; <06/30/89 pke>
; ----------------------------------------------------------------------------
; function: SwapIcon
; warning: This routine follows Pascal register conventions.
;
; SwapIcon blits the key script icon in the upper right corner of the screen,
; opposite the apple symbol in the menu bar. It only draws the icon if the
; menuList is not nil.
; ----------------------------------------------------------------------------
siRecord record {a6link},decr
return ds.l 1 ; return address.
a6link ds.l 1 ; old a6 register.
oldPort ds.l 1 ; saved GrafPtr.
oldClip ds.l 1 ; save region handle.
siLocals equ * ; size of local variables.
endr
SwapIconRegs reg a2-a3 ; swap regs
; Save the registers and link the stack. If the MenuBar handle is nil,
; the script manager is disabled, or there is only one script system, bail
; out without drawing the icon.
SwapIcon
IF forRom THEN ; <06/30/89 pke>
GetSMgrCore a0
move.l SmgrRecord.sVectSwapIcon(a0),a0 ; load address of routine
jmp (a0) ; jmp to it & return through it
ENDIF
xSwapIcon ; <06/30/89 pke>
rts
; ----------------------------------------------------------------------------
; function: SwapKybd;
; warning: This routine follows Pascal register conventions.
;
; Loads the keyboard character table for the key script into the key cache.
; The keyboard is disabled while the swap is occurring, and all pending
; keyboard events are flushed from the queue before the keyboard is enabled
; again.
; ----------------------------------------------------------------------------
flushMask equ $0038 ; keyDwn, keyUp, and autoKey.
; Save the registers and load the script manager globals pointer.
;
; a3.l old Key Cache Pointer
; a2.l New KCHR handle.
; d4.l cache size ; <7/25/87med>
SwapKybdRegs reg a2/a3/d4 ; added d4 <7/25/87med>
SwapKybd
IF forRom THEN ; <06/30/89 pke>
GetSMgrCore a0
move.l SmgrRecord.sVectSwapKybd(a0),a0 ; load address of routine
jmp (a0) ; jmp to it & return through it
ENDIF
xSwapKybd ; <06/30/89 pke>
with smgrRecord,scriptRecord,ExpandMemRec
link a6,#0 ; link the stack.
movem.l SwapKybdRegs,-(sp) ; save the registers.
move.l expandMem,a3 ; load expandMemPtr
move.l emKeyCache(a3),a3 ; get pointer to key cache
; Load the new keyboard character resource from the system file. If we
; cannot find it, continue using the old keyboard character table.
@LoadKybd
move.w CurMap,-(sp) ; leave cur resfile refnum on stack <5>
clr.w -(sp) ; specify system file <5>
_UseResFile ; <5>
sub.l #4,sp ; make room for handle.
move.l #'KCHR',-(sp) ; push KCHR type.
GetSMgrCore a0 ; load smgrCore pointer.
move.w smgrKeyScript(a0),d0 ; get key script code.
lsl.w #2,d0 ; convert to long offset.
move.l smgrEntry(a0,d0.w),a0 ; get key script entry.
move.w scriptBundle.itlbKeys(a0),d4 ; save KCHR id number in d4<64> <6>
move.w d4,-(sp) ; and push it <6>
move.w #-1,RomMapInsert ; look for KCHR in ROM and load.
_GetResource ; get the KCHR resource.
move.l (sp)+,a2 ; load handle
move.l a2,d0 ; handle = nil?
bne.s @loadItlk ; no - go load itlk. Otherwise<73>
_UseResFile ; restore old resfile (refnum on stack) <5><6>
bra DoneKybd ; bail, keep old KCHR & itlk. <SM4> CSS
@loadItlk
; if we already have an itlk, dispose of it <6>
GetSMgrCore a0 ;
move.l smgrCurITLK(a0),d0 ; have old handle?
beq.s @noOld ; no -> skip dispose
clr.l smgrCurITLK(a0) ; clear the handle storage
move.l d0,a0 ; copy itlk handle
_DisposHandle ; dispose of the itlk
@noOld
; load the itlk resource, detach it, and store its handle <6>
subq #4,sp ; make room for handle
move.l #'itlk',-(sp) ; push resource type
move.w d4,-(sp) ; push resource ID number
_GetResource ; load the resource
move.l (sp)+,d0 ; found the itlk resource?
beq.s @noNew ; no -> skip installation
GetSMgrCore a0 ;
move.l d0,smgrCurITLK(a0) ; save new itlk handle
move.l d0,-(sp) ; push itlk handle
_DetachResource ; detach from system file
@noNew
; restore previous resource file
_UseResFile ; restore old resfile (refnum on stack) <5><6>
; Lock the KCHR down and reset all ADB keyboard devices to use it.
move.l a2,a0 ; load KCHR handle.
_HLock ; lock it down.
move.l (a2),-(sp) ; push pointer.
jsr ResetKCHR ; let ADB devices use it.
; Copy the new keyboard character table into the cache area. Then flush
; all pending keyboard events from the event queue. This can lead to a
; mysterious dropping of key presses, which has been known to upset Dave
; Kleinberg.
CopyKybd
move.l a2,a0 ; load resource handle.
_GetHandleSize ; find resource size.
; Check that we have enough room to copy.
move.l d0,d4 ; save size
move.l a3,a0 ; get the cache ptr
_GetPtrSize ; find size
cmp.l d0,d4 ; big enough?
blt.s @SkipResize ; yep, keep going
; cache too small: try getting enough room in the system heap
move.l d4,d0 ; pass new size
_NewHandle sys ; try to get it
bne.s @ResetKybd ; just not there, reset
_DisposHandle ; get rid of test handle
move.l a3,a0 ; get the cache ptr
_DisposPtr ; get rid of it
move.l d4,d0 ; get new size
_NewPtr sys,clear ; have to get it, since test succeeded
move.l a0,a3 ; set the cache ptr
@SkipResize
move.l (a2),a0 ; load resource pointer.
move.l a3,a1 ; load cache pointer.
move.l d4,d0 ; load size
_BlockMove ; copy keyboard table.
; Unlock the KCHR and tell the ADB keyboard devices to use the standard
; keyboard cache area.
@ResetKybd
move.l a3,-(sp) ; load cache pointer.
jsr ResetKCHR ; let ADB devices use it.
move.l a2,a0 ; load KCHR handle.
_HUnlock ; unlock it.
move.l #flushMask,d0 ; flush all keyboard events.
_FlushEvents ; die you wretched events.
; Restore the registers and return to the caller.
DoneKybd
movem.l (sp)+,SwapKybdRegs ; restore the registers.
unlk a6 ; unlink the stack.
rts ; return to the caller.
endWith ;
; ----------------------------------------------------------------------------
; function: ResetKCHR(kchr: Ptr);
; input: (sp).l New KCHR pointer.
; warning: This routine follows Pascal register conventions.
;
; Steps through the ADB data structures and resets the KCHR pointer for all
; keyboard devices. This is only done if the current ROM supports the ADB.
; This code was ruthlessly stolen from Mark Davis.
; ----------------------------------------------------------------------------
rkRecord record {a6link},decr
rkArgs equ *-8 ; size of arguments.
pointer ds.l 1 ; new KCHR pointer.
return ds.l 1 ; return address.
a6link ds.l 1 ; old a6 register.
adb ds ADBDataBlock ; ADB data structure.
oldKeyboard ds.l 1 ; old keyboard pointer <2/22/88med>
rkLocals equ * ; size of local variables.
endr
ResetKCHRRegs reg d3
ResetKCHR
with rkRecord,expandMemRec
link a6,#rkLocals ; link the stack.
movem.l ResetKCHRRegs,-(sp) ; save the registers.
move.l ExpandMem,a0 ; get expanded memory
clr.l ExpandMemRec.emKeyDeadState(a0) ; clear dead key state. <7/7/87med>
move.l pointer(a6),ExpandMemRec.emKeyCache(a0) ; reset the pointer <7/7/87med>
move.l RomBase,a0 ; get rombase
tst.b 8(a0) ; possible ADB machine (>= 1)?
beq.s ResetDone ; no, bail
move.w HwCfgFlags,d0 ; hardware configuration
btst #HwCbADB,d0 ; is ADB present?
beq.s ResetDone ; no, bail
;; move.l ROMBase,a0 ; load ROM pointer.
;; cmp.w #$75,8(a0) ; newer than ROM75?
;; ble.s ResetDone ; no -> skip KCHR resetting.
; Loop through the ADB records, changing the KCHR pointer in all records
; belonging to keyboard devices.
_CountADBs ; load ADB count.
move.w d0,d3 ; copy count for loop.
bra.s @1 ; enter loop at bottom.
@0 move.w d3,d0 ; pass number.
add.w #1,d0 ; increment for 1 based number.
lea adb(a6),a0 ; pass record address.
_GetIndADB ; load device record.
cmp.b #kybdADBAddr,adb.origADBAddr(a6) ; is it a keyboard? Changed from D0 <5/14/87med>
bne.s @1 ; no -> skip it.
move.l adb.dbDataAreaAddr(a6),a0 ; load data area pointer. (adb+6) <7/7/87med>
clr.l KybdDriverData.deadKey(a0) ; clear dead state - long! <7/7/87med><1.9>
lea KybdDriverData.KCHRPtr(a0),a0 ; get pointer location <2/22/88med>
move.l (a0),oldKeyboard(a6) ; save old pointer <2/22/88med>
move.l pointer(a6),(a0) ; reset KCHR pointer. (20) <2/22/88med>
@1 dbra d3,@0 ; do the next ADB device.
; zap Tecot<6F>s keyboard first time through <2/22/88med>
move.l expandMem,a1 ; globals
lea emFirstKeyboard(a1),a1 ; get location of byte
tst.b (a1) ; first time?
bne.s @FirstDone ; no, exit
st (a1) ; flag for posterity
move.l oldKeyboard(a6),a0 ; release
_RecoverHandle ; get back handle
tst.w MemErr ; any error?
bne.s @FirstDone ; if so, bail.
_DisposHandle ; get rid of it
@FirstDone
; Restore the registers, unlink the stack and return to the caller.
ResetDone
movem.l (sp)+,ResetKCHRRegs ; restore the registers.
;<5/19/88ldc> standardized exit
move.w #rkArgs, d0
bra StdUnlink
endProc
; ----------------------------------------------------------------------------
; SMgrPostMunging
;
; This routine is called by both the xGetOSEvent patch in ptch 4 and from GetOSEvent in the
; ROM source.
;
; It expectes and EventPtr in A0
;
;
; This routine screens all events and determines when to change the key
; script. If it does change the key script, region symbol in the menu bar
; is redrawn.
; ----------------------------------------------------------------------------
modMask equ $fffb ; mask off capsLock key.
SMgrPostMunging proc export
with SMgrRecord
movem.l a0-a4/d0-d2,-(sp) ; save the registers.
GetSMgrCore a4 ; load SMgr globals. <4/26/88ldc>
move.l a0,a2 ; save the event pointer.
; If this is a keyDown event, check to see if the keyboard code and
; modifiers match any of the combinations in the keyboard swapping table.
FilterKey
cmp.w #keyDwnEvt,evtNum(a2) ; evtNum = keyDown?
beq.s @1 ; yes -> check message.
cmp.w #autoKeyEvt,evtNum(a2) ; evtNum = autoKey?
bne.s DoneEvent ; no -> bail out.
@1
move.l smgrKeySwap(a4),d0 ; swap table = nil?
beq.s DoneEvent ; yes -> skip key swapping.
move.l d0,a0 ; load swap table handle.
move.l (a0),a0 ; load swap table pointer.
move.l evtMessage(a2),d1 ; get event message
move.b evtMeta(a2),d1 ; get modifier keys.
and.w #modMask,d1 ; mask off alpha modifier.
@2
move.l (a0)+,d0 ; tuple = 0?
beq.s DoneEvent ; yes -> bail out.
cmp.w d0,d1 ; tuple = message?
bne.s @2 ; no -> try next tuple.
swap d0 ; get KeyScript verb.
; Change the current keyboard. Call KeyScript to load the new keyboard
; and to draw the keyboard icon in the menu bar. Remember to null out
; the event type and return that no events were available.
;
; Beginning with System 7, we only strip the event if it meaningful <12>
; in the current system - i.e., the KeyScript return code is true.
ScriptEvent
move.w d0,-(sp) ; push script code.
_KeyScript ; invoke the trap.
tst.b smgrKeyScriptResult(a4) ; Did KeyScript do something useful? <12>
beq.s DoneEvent ; if not, don't strip event <12>
move.w #nullEvt,evtNum(a2) ; null event type.
move.l MinusOne,(sp) ; return no event in d0. <was #MinusOne,
; fixed <02/28/89 pke>
; Restore the registers and return to the caller.
DoneEvent
movem.l (sp)+,a0-a4/d0-d2 ; restore the registers.
rts ; return to the caller.
endwith
endproc
; ----------------------------------------------------------------------------
; routine: SMgrCalcRect
; input: none
; output: none
; trashes: a0 (in 7.0)
; warning: This routine is a trap patch for InitMenus.
; This routine saves all registers.
;
; This routine is obsolete.
; ----------------------------------------------------------------------------
SMgrCalcRect Proc Export
rts
endproc
; ----------------------------------------------------------------------------
; routine: SMgrFont
; input: none
; output: none
; warning: This routine is a trap patch for InitFonts.
; trashes none.
;
; This routine ensures that the system and application fonts are set to
; the fonts chosen by the system script.
; ----------------------------------------------------------------------------
fiSaveRegs reg a0/a2-a3/d0/d3
sGlb equ a2 ; register for Script Globals
disabCacheReq equ -2 ; disable cache request in CurFMInput
SMgrInitFonts proc export ; called from rom _InitFont
with smgrRecord,scriptRecord
movem.l fiSaveRegs,-(sp) ; save the registers.
GetSMgrCore sGlb ; get SM globals
IF forRom THEN
cmpa.l #-1,sGlb ; SMgr installed? <11/14/88 pke>
beq @skipInitFonts ; bail if not <11/14/88 pke>
ENDIF
; Set the system and application fonts from the script entry record of the system script.
; This is not done on original Macintosh ROMs.
move.b smgrFontForce(sGlb),-(sp) ; save the old value <3/4/87med>
sf smgrFontForce(sGlb) ; turn it off <3/4/87med>
tst.b smgrEnabled(sGlb) ; script manager disabled?
beq.s @noFonts ; yes -> bail out.
move.w smgrSysScript(sGlb),d3 ; get system script code.
move.w d3,d0 ; copy system script code.
lsl.w #2,d0 ; script code is long index.
move.l smgrEntry(sGlb,d0.w),a3 ; load system script entry.
clr.w -(sp) ; make room for script code.
move.w SysFontFam,-(sp) ; push system font number.
_Font2Script ; convert font to script.
cmp.w (sp)+,d3 ; code = system script?
bne.s @remapSysFont ; <06/05/89 pke, per med>
tst.b smgrDefault(sGlb) ; <06/05/89 pke, per med>
beq.s @noSysFont ; yes -> skip resetting.
@remapSysFont ; <06/05/89 pke>
move.w scriptSysFond(a3),SysFontFam ; set system font.
move.w #disabCacheReq,CurFMInput ; disable cache request <3/5/87med>
@noSysFont
clr.w -(sp) ; make room for script code.
move.w ApFontID,-(sp) ; push application font number.
_Font2Script ; convert font to script.
cmp.w (sp)+,d3 ; code = system script?
bne.s @remapAppFont ; <06/05/89 pke, per med>
tst.b smgrDefault(sGlb) ; <06/05/89 pke, per med>
beq.s @noAppFont ; yes -> skip resetting.
@remapAppFont ; <06/05/89 pke>
move.w scriptAppFond(a3),ApFontID ; set application font.
move.w #disabCacheReq,CurFMInput ; disable cache request <3/5/87med>
@noAppFont
@noFonts
move.b (sp)+,smgrFontForce(sGlb) ; restore the old value <3/4/87med>
@skipInitFonts ; <11/14/88 pke>
movem.l (sp)+,fiSaveRegs ; restore the registers.
rts ; return to the caller.
endWith
endProc
end