; ; 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 : 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 : Added a new mask bit ; 'kInTSMPopUpMenuSelectCall" for tsmPatchFlag to fix the drawing ; Balloon over floating window bug. ; <27> 6/18/92 KST : 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 : Added one field in TSM global for ; __PopupMenuSelect patch. ; <25> 6/16/92 KST : Added one new patchMask bit constant and a new field in ; TSM document record. ; <24> 6/10/92 KST #1031142,1030881 : Added global tsmUseInputWindowDocID and a ; new bit for our patch flag -- kInTSMEventCallBit. ; <23> 6/2/92 JH : Added global tsmRealSystemMenuID. ; <22> 5/14/92 KST #1025797,: Added one new message selector 'kMsgHelpHELPMgr' ; to InformTSM. ; <21> 5/1/92 KST #1027482,: Added a constant -- kSWMJustSetCursor. ; <20> 5/1/92 KST #1028301,: 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