sys7.1-doc-wip/Internal/Asm/TSMPrivate.a
2019-07-27 22:37:48 +08:00

394 lines
16 KiB
Plaintext

;
; File: TSMPrivate.a
;
; Contains: TSM private definitions.
;
; Written by: Kenny SC. Tung
;
; Copyright: © 1991-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <32> 8/4/92 DCL Moved InformTSM out of the public eye and into TSMPrivate.
; <31> 7/28/92 DCL Moving applicationFloatKind & systemFloatKind constants out of
; the public eye and into the private Layers header file. At the
; request of TechPubs, and with assistance from Dean, Greg and
; Kenny.
; <30> 7/16/92 KST #1034952 <Kda>: Added one new patchMask bit constant --
; kTSMEventBeenCalled.
; <29> 6/26/92 KST Just added a line of comment.
; <28> 6/26/92 KST #1033450,1033456,1031316 <JH>: Added a new mask bit
; 'kInTSMPopUpMenuSelectCall" for tsmPatchFlag to fix the drawing
; Balloon over floating window bug.
; <27> 6/18/92 KST <JH>: applicationFloatKind and systemFloatKind are defined in
; Windows.h but is not defined in any ainlude files. So I define
; them in here.
; <26> 6/17/92 KST #1030843 <JH>: Added one field in TSM global for
; __PopupMenuSelect patch.
; <25> 6/16/92 KST <JH>: Added one new patchMask bit constant and a new field in
; TSM document record.
; <24> 6/10/92 KST #1031142,1030881 <JH>: Added global tsmUseInputWindowDocID and a
; new bit for our patch flag -- kInTSMEventCallBit.
; <23> 6/2/92 JH <KST>: Added global tsmRealSystemMenuID.
; <22> 5/14/92 KST #1025797,<JH>: Added one new message selector 'kMsgHelpHELPMgr'
; to InformTSM.
; <21> 5/1/92 KST #1027482,<JH>: Added a constant -- kSWMJustSetCursor.
; <20> 5/1/92 KST #1028301,<JH>: JH,#1028301: kMaxTSMSelector has changed because
; SetTSMDialogState, RestoreTSMDialogState.. etc has been removed.
; <19> 5/1/92 JH Added a byte field to globals that is used to set bit flags that
; our SetCursor patch will use. Also a mask for testing the low
; bit.
; <18> 4/9/92 KST KST,Adding a control parameterblock for communicating with the
; swmdrvr. Adding 2 selectors for InformTSM.
; <17> 3/30/92 KST JH, 1025008, 1025009. First attempt to solve the pallete/menu
; bar flickering problem. Also, we synchronize the keyboard menu
; with the script of the TSM document.
; <16> 3/23/92 KST Code changed according to the comments from the code review.
; <15> 3/12/92 KST We store a refcon in each document record. Added refcon mapping
; cache in TSM globals.
; <14> 3/6/92 KST Added a new constant "kLog2PSNEntrySize".
; <13> 3/4/92 KST Added new fields "tsmSetCursorProc", and "tsmSavedCursorState"
; in TSM globals.
; <12> 3/3/92 KST kMaxTSMSelector is now 28.
; <11> 3/2/92 KST Moved kMaxTSMSelector to TSMPrivate.h, and added a new private
; trap selector "NewTSMDocument4SWM".
; <10> 2/28/92 KST Added a new field "tsmSavedLayer" in TSM globals.
; <9> 2/27/92 KST Add a signature in TSM aware PSN table for error detection.
; Added a field tsmKillApplicationP in TSM globals.
; <8> 2/11/92 DCL Changed the name of TSMEqu.[aph] to TextServices.[aph] for
; better read-ability.
; <7> 2/10/92 KST Moved TSM message selectors to TSMPrivate. 'inpm' resource now
; stores FEP ID for the old input method.
; <6> 2/3/92 KST TSM needs a flag to tell if we are using the old Japanese Input
; Method when JIM is changed.
; <5> 2/1/92 KST We don't have a global flag in TSM globals to indicate using
; bottom window. Change the byte to indicate the number of active
; text services for ease of debugging.
; <4> 1/29/92 KST We open one input method for each document. Each document
; contains a table of 4 opened input method instances for CCJK
; scripts.
; <3> 1/11/92 KST TSM globals now has an input method table to store the open
; default input methods for CJK scripts.
; <2> 1/9/92 KST If idocID == 0, it affects only one (•• current ••)
; application.
; <5> 12/31/91 KST Moved TSMPrivate.a from TextServiceMgr to Internal:ASM: folder.
; <4> 12/31/91 KST Added document table in PSN table to record open documents.
; <3> 12/20/91 KST Making progress toward Alpha. Changed "inline" to "TSM", and
; added new calls.
; <2> 12/10/91 KST Check in the first time.
;
;
; **********************************************************************************************
; File: "TSMPrivate.a"
;
; Written by Kenny SC. Tung
;
; Modification History:
; 10Dec91 KSCT New today.
;
; In the TSM globals, we record all the application's process serial number which claims itself
; as TSM aware. For each application, we also keep a table to record the document IDs it creates.
; The document keep track of all the open text services. When application terminates or crashes,
; we can use these tables to clean up the world. Initially, the table contains 10 slots, but will
; grow as needed.
; ***********************************************************************************************
IF &TYPE('__TSMAPrivate__') = 'UNDEFINED' THEN
__TSMAPrivate__ SET 1
INCLUDE 'TextServices.a'
INCLUDE 'Components.a'
TSMVersion EQU 1 ; version 1
swmdrvrRecordMenuIsDown EQU 0 ; from swmdrvr.h
;; messages to TSM ...
kMsgNoOP EQU 0 ; no op
kMsgBkgAppsPSN EQU 1 ; background application's PSN
kMsgKillTSMApp EQU 2 ; kill TSM aware application
kMsgChangeToOldJIM EQU 3 ; change to OLD Japanese Input Method
kMsgSuspendApp EQU 4 ; a non-TSM aware app got suspended
kMsgResumeApp EQU 5 ; RESUME a non-TSM aware app
kMsgHelpHELPMgr EQU 6 ; open Component's resource file for Help Mgr
kMaxMsgNumber EQU kMsgHelpHELPMgr
; (3) parameter for kMsgChangeToOldJIM -- record of 2 words:
sidScript EQU 0 ; script of this old input method
sidFEPID EQU 2 ; FEP ID
; (6) parameter for kMsgHelpHELPMgr -- record of 6 bytes:
tsmHelpRefnum EQU 0 ; > 0 if we opened IM's resource file
tsmHelpWindowPtr EQU 2 ; nil if no floating window
tsmHelpSavedLayer EQU 6 ; saved current layer (temp free storage)
tsmHelpRecSize EQU tsmHelpSavedLayer+4
kTSMSuspend EQU 0 ; suspend the app
kTSMResume EQU $FFFF ; resume the app
;; Private TSM traps ...
;; The last selector is kFindServiceWindow = 23 as defined in TextServices.h ...
kInformTSM equ 22 ; inform TSM with some messages
kNewTSMDocument4SWM equ 24 ; create new TSM aware document but don't activate input method <#11> <#12>
kTSMEventFromSWM equ 25 ; TSM event called by SWM <#24>
kMaxTSMSelector equ kTSMEventFromSWM
macro
_InformTSM
move.w #kInformTSM,d0
_TSMDispatch
endm
;;-------------------------------------------------------------------------;;
kSavedIMCount EQU 4 ; save 4 input methods (CCJK)
; default IM's Component and menu
ComponentMenuRec RECORD 0
gComponent ds.l 1 ;component instance
gMenu ds.l 1 ;input method menu if any
ComponentMenuSize equ * ;size of the beast
ENDR
; TSM globals ... (if you change something in here, be sure to change TSMPrivate.h too !)
; bits constant for tsmPatchFlags field ...
kIMJustSetCursorBit EQU 0 ; bit to test in SetCursor Patch
kSWMJustSetCursorBit EQU 1 ; bit to test in SetCursor Patch
kInTSMEventCallBit EQU 2 ; bit set when inside of TSMEvent call <#24>
kInTSMPopUpMenuSelectCall EQU 3 ; bit set when inside of PopUpMenuSelect call
kTSMEventBeenCalledBit EQU 4 ; set by _ModalDialogPatch in SWM, reset in TSMEvent
TSMVarsRec RECORD 0
tsmRecSize ds.w 1 ; size of this record
tsmIAPSNTablePtr ds.l 1 ; ptr to table of Inline aware application process serial numbers
tsmCurrentSLRec ds.b ScriptLanguageRec ; current text service language
tsmPreviousDocID ds.l 1 ; previous deactivated doc ID, which pallete has not been removed <#17>
tsmPreviousScript ds.w 1 ; the script which is running when we deactivate the ID above <#17>
tsmActiveDocID ds.l 1 ; the current active inline document if non-nil
tsmUseInputWindowDocID ds.l 1 ; the current document which is using the input window <#24>
tsmActiveTSCount ds.b 1 ; number of active text services for ease of debugging. <#5>
tsmPMgrActiveP ds.b 1 ; set if Process Manager is active
tsmUseOldJInputMethodP ds.b 1 ; true if we are using the old Japanese Input Method <#6>
tsmKillApplicationP ds.b 1 ; true if we are killing the TSM aware application (set by InformTSM) <#9>
tsmSWMHighPSN ds.l 1 ; background app's (SWM's) high PSN ID
tsmSWMLowPSN ds.l 1 ; background app's (SWM's) low PSN ID
tsmCurrentAppHighPSN ds.l 1 ; current app's high PSN ID
tsmCurrentAppLowPSN ds.l 1 ; current app's low PSN ID
tsmDefIMInfoTable ds.l kSavedIMCount*2 ; 4 components in SC, J, TC, K order (hard coded based on script code !!!!!!!)
; each one has a Component and a menu handle
tsmCacheInstance ds.l 1 ; this instance map ... <#15>
tsmCacheRefcon ds.l 1 ; ... to this refcon <#15>
tsmSWMDrvrRefNum ds.w 1 ; driver refnum
tsmSendAEProc ds.l 1 ; driver AppleEvent callback
doCloseSWMWindowCallBack ds.l 1 ; driver CloseWindow callback
tsmPatchFlags ds.b 1 ; flags for the helpmgr patch and the setcursor patch
tsmFiller ds.b 1 ; word align this
tsmRealSystemMenuID ds.w 1 ; original inputmethod ID
tsmUserProc ds.l 1 ; user proc for modal dialog patch
tsmPopUpReturnAddr ds.l 1 ; save return address <#26>
;tsmCalledUseInputWindow ds.b 1 ; true if TSM called UseInputWindow when there is no ducument <#26>
;tsmUseInputWindowState ds.b 1 ; the state before TSM called UseInputWindow <#26>
tsmMajorVersion ds.b 1 ; major version number <#24>
tsmMinorVersion ds.b 1 ; minor version number <#24>
tsmDebugSignature ds.l 1 ; signature for debugging
TSMVarsRecSize equ *
ENDR
kDefTableEntryN EQU 8 ; begin with 8 entries and increment by 8 every time
;;-------------------------------------------------------------------------;;
;; The structure of the table to record TSM aware application's
;; process serial numbers, stored in tsmIAPSNTablePtr of TSM globals.
;; Accessed thru Assembler only ....
iaAppCount EQU 0 ; (word) number of Inline aware application registered
iaTotalPSNEntryN EQU 2 ; (word) total number of entries (size) of the table
iaPSNStart EQU 4 ; start of PSN table array
;; Each entry in the array has a PSN, a flag, and a linked list of open documents ...
;; The entry is filled up when application calls InitTSMAwareApplication.
;; 07Jan91 Design changes:
;; If idocID == 0, it affects only one (•• current ••) application.
;; If idocID == valid doc ID, it applies to that document only.
PSNRecord RECORD 0 ; one record for each TSM aware application
psnHighID ds.l 1 ; long (OH! How I hated to use 64 bits PSN)
psnLowID ds.l 1 ; long
;; •• Note: the following 4 bytes has to be contiguous, because it is cleared as CLR.L psnAppUseInputWindowP(A1) in TSMDispatch.a ....
psnAppUseInputWindowP ds.b 1 ; byte, set if app should use floating input window
psnDocUseInputWindowP ds.b 1 ; byte, set if current document is using floating input window
psnTSMCalledUseIWP ds.b 1 ; byte, true if TSM called UseInputWindow when there is no ducument <#26>
psnUseInputWindowState ds.b 1 ; byte, the state before TSM called UseInputWindow <#26>
psnDocsTablePtr ds.l 1 ; long, open documents table pointer (could be nil)
kPSNEntrySize EQU * ; each PSN record is 16 bytes
ENDR
kLog2PSNEntrySize EQU 4 ; log2(PSN record entry size) = 4
psnDoWeReallyUseIW EQU PSNRecord.psnAppUseInputWindowP
; word, test both flags to see if we are using input window
; psnAppUseInputWindowP and psnDocUseInputWindowP
;; the total table size is:
kPSNTableDefSize EQU kDefTableEntryN * PSNRecord.kPSNEntrySize + iaPSNStart
;;-------------------------------------------------------------------------;;
;; The structure of the table to record document IDs, stored in "psnDocsTablePtr".
docIDCount EQU 0 ; (word) number of IDs recorded (excluding input methods)
docTableEntryN EQU 2 ; (word) total number of entries (size) of the table
docIDStart EQU 4 ; (long) start of doc IDs
;; Each entry has a long word for the ID
kDocEntrySize EQU 4 ; each ID is 4 bytes (= document ID)
kLog2DocEntrySize EQU 2 ; log2(document entry size) = 2
kDocTableDefSize EQU kDefTableEntryN * kDocEntrySize + docIDStart ; the table size
;;-------------------------------------------------------------------------;;
CIListRec RECORD 0
ciNextCIListRec ds.l 1 ; next CIListRecord
ciTheComponent; ds.l 1 ; a saved component
ciTS ds.l 1 ; a component instance
ciSLRecord; ds.l 1 ; the primary script.w/language.w
ciTakeActiveInputP ds.b 1 ; takes active input boolean
ciMenuVisibleP ds.b 1 ; true if the menu is visible
ciServiceMenu ds.l 1 ; an associated menu or nil
CIListRec equ * ; size
ENDR
;; TSM document record, this handle is used as TSM document ID
;; If you change something in here, be sure to change TSMPrivate.[hP] too !
TSMDocumentRecord RECORD 0 ; one record for each TSM document
iDocSignature ds.l 1 ; (long) signature for verifying the ID
iDocOpenTextServiceN ds.w 1 ; (word) number of open text services
iDocCIHead ds.l 1 ; (long) list of open text service Component Instances
iDocPSNID1 ds.l 1 ; (long) PSN ID 1
iDocPSNID2 ds.l 1 ; (long) PSN ID 2
iDocActiveP ds.b 1 ; (byte) true if active
iDocUseInputWindowP ds.b 1 ; (byte) true if using Input Window
iDocRefcon ds.l 1 ; (long) refcon <#15>
iDocUseThisScript ds.w 1 ; (word) the script used by this document <#17>
iDocGhostSignature ds.l 1 ; for TSM aware app. that has no document <#25>
iDocDefIMInstanceArray ds.l 16 ; local copy of the IM instances for CCJK scripts
; defined in TSMPrivate.h, each script uses 4 longs
iDocInterfaceN ds.w 1 ; (word) number of supported interface types
iDocOSTypeArray ds.l 1 ; (long) more than 1 record might follow
ENDR
;;-------------------------------------------------------------------------;;
;; default input method information resource ...
;; resource type for default input method saved in System file.
;; (if you change something in here, be sure to change TSMPrivate.a too !)
kTSMDefInputMethodType EQU kInputMethodService
kTSMDefInputMethodID EQU -8192
kINPMresourceSig EQU 'tsmr' ; $74736d72 saved default IM resource signature in "defRsrcSignature"
; one record for each script -- CCJK
IMInfoRecord RECORD 0 ; info about the default input method
imValidP ds.b 1 ; true if record contains valid info
imUseOldInputMethodP ds.b 1 ; true if user wants to use old input method as the default
imOldInputMethodFEPID ds.w 1 ; if imUseOldInputMethodP is true, then this is its FEP ID
imLanguage ds.w 1 ; language
imCDRec ds ComponentDescription; component description (just description, no component saved)
imRecSize EQU *
ENDR
DefIMRecord RECORD 0
defRsrcSignature DS.L 1 ; TSM resource signature
defUseFloatWindow DS.B 1 ; global falg - set if use input window (not used (should be 0))
defReserved DS.B 1 ; not used (should be 0)
defIMCount DS.W 1 ; number of input methods saved = 4
defSChineseIM DS IMInfoRecord ; simplified Chinese
defJapaneseIM DS IMInfoRecord ; Japanese
defTChineseIM DS IMInfoRecord ; traditional Chinese
defKoreanIM DS IMInfoRecord ; Korean
ENDR
kTSMSystemMenuID EQU 16500
;;-------------------------------------------------------------------------;;
WindowRecord RECORD 0
port DS.B $6C ; GrafPort
windowKind DS.W 1
visible DS.B 1
hilited DS.B 1
goAwayFlag DS.B 1
spareFlag DS.B 1
strucRgn DS.L 1
contRgn DS.L 1
updateRgn DS.L 1
windowDefProc DS.L 1
dataHandle DS.L 1
titleHandle DS.L 1
titleWidth DS.W 1
controlList DS.L 1
nextWindow DS.L 1
windowPic DS.L 1
refCon DS.L 1
ENDR
ENDIF ; ...already included