unit Commodities; INTERFACE uses Exec, Input, Keymap; type PFL = pointer; pInputXpression = ^tInputXpression; tInputXpression = record ix_Version: byte; ix_Class: byte; ix_Code: word; ix_CodeMask: word; ix_Qualifier: word; ix_QualMask: word; ix_QualSame: word; end; IX = tInputXpression; CxObj = LongInt; CxMsg = LongInt; pNewBroker = ^tNewBroker; tNewBroker = record nb_Version: shortint; nb_Name: pshortint; nb_Title: pshortint; nb_Descr: pshortint; nb_Unique: integer; nb_Flags: integer; nb_Pri: shortint; nb_Port: pMsgPort; nb_ReservedChannel: integer; end; pCxObj = ^CxObj; pCxMsg = ^CxMsg; pIX = ^IX; var CxBase: pLibrary; const CBD_NAMELEN = $18; CBERR_VERSION = 3; CX_DEBUG = 7; CBERR_OK = 0; COERR_NULLATTACH = 2; CX_TYPEFILTER = 2; CXCMD_DISAPPEAR = $15; COERR_BADFILTER = 4; CX_CUSTOM = 8; IXSYM_ALTMASK = $30; IXSYM_ALT = 4; CXCMD_UNIQUE = $19; CMDE_OK = 0; CX_TRANSLATE = 5; CXM_COMMAND = $40; COERR_ISNULL = 1; CBERR_SYSERR = 1; CX_SEND = 3; CMDE_NOMEM = $FFFFFFFD; CMDE_NOPORT = $FFFFFFFE; CXCMD_DISABLE = $F; CXCMD_KILL = $17; CX_INVALID = 0; CX_ZERO = 9; CXCMD_LIST_CHG = $1B; IXSYM_SHIFTMASK = 3; CXCMD_ENABLE = $11; CMDE_NOBROKER = $FFFFFFFF; CXM_IEVENT = $20; IXSYM_SHIFT = 1; CBD_DESCRLEN = $28; NB_VERSION = 5; NBU_DUPLICATE = 0; COERR_BADTYPE = 8; CBERR_DUP = 2; NBU_UNIQUE = 1; NBU_NOTIFY = 2; CX_SIGNAL = 4; IXSYM_CAPSMASK = 7; CXM_UNIQUE = $10; IXSYM_CAPS = 2; IX_NORMALQUALS = $7FFF; CXCMD_APPEAR = $13; CBD_TITLELEN = $28; CX_BROKER = 6; CX_FILTER = 1; IX_VERSION = 2; COF_SHOW_HIDE = 4; function CreateCxObj (type_: long; arg1: longint; arg2: longint): pCxObj; function CxBroker (nb: pNewBroker; error: plongint): pCxObj; function ActivateCxObj (co: pCxObj; true_: longint): longint; procedure DeleteCxObj (co: pCxObj); procedure DeleteCxObjAll (co: pCxObj); function CxObjType (co: pCxObj): long; function CxObjError (co: pCxObj): longint; procedure ClearCxObjError (co: pCxObj); procedure SetCxObjPri (co: pCxObj; pri: longint); procedure AttachCxObj (headObj: pCxObj; co: pCxObj); procedure EnqueueCxObj (headObj: pCxObj; co: pCxObj); procedure InsertCxObj (headObj: pCxObj; co: pCxObj; pred: pCxObj); procedure RemoveCxObj (co: pCxObj); procedure SetTranslate (translator: pCxObj; events: pInputEvent); procedure SetFilter (filter: pCxObj; text_: STRPTR); procedure SetFilterIX (filter: pCxObj; ix: pIX); function ParseIX (description: STRPTR; ix: pIX): longint; function CxMsgType (cxm: pCxMsg): long; function CxMsgData (cxm: pCxMsg): pointer; function CxMsgID (cxm: pCxMsg): longint; procedure DivertCxMsg (cxm: pCxMsg; headobj: pCxObj; ret: pCxObj); procedure RouteCxMsg (cxm: pCxMsg; co: pCxObj); procedure DisposeCxMsg (cxm: pCxMsg); function InvertKeyMap (ansicode: long; event: pInputEvent; km: pKeyMap): boolean; procedure AddIEvents (events: pInputEvent); (* Amiga.lib Commodities support *) procedure FreeIEvents (events: pInputEvent); function CxCustom (action: pointer; id: longint): pCxObj; function CxDebug (id: long): pCxObj; function CxFilter (d: STRPTR): pCxObj; function CxSender (port: pMsgPort; id: longint): pCxObj; function CxSignal (task: pTask; sig: byte): pCxObj; function CxTranslate (ie: pInputEvent): pCxObj; IMPLEMENTATION procedure FreeIEvents (events: pInputEvent); begin while events <> NIL do begin FreeMem (events, sizeof (tInputEvent)); events := events^.ie_NextEvent end end; function CxCustom; begin CxCustom := CreateCxObj(CX_CUSTOM, longint(action), id) end; function CxDebug; begin CxDebug := CreateCxObj(CX_DEBUG, id, 0) end; function CxFilter; begin CxFilter := CreateCxObj(CX_FILTER, longint(d), 0) end; function CxSender; begin CxSender := CreateCxObj(CX_SEND, longint(port), id) end; function CxSignal; begin CxSignal:= CreateCxObj(CX_SIGNAL, longint(task), sig) end; function CxTranslate; begin CxTranslate := CreateCxObj(CX_TRANSLATE, longint(ie), 0) end; function CreateCxObj; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l (a6)+,d0 move.l CxBase,a6 jsr -$1E(a6) move.l d0,$14(sp) move.l (sp)+,a6 end; function CxBroker; xassembler; asm move.l a6,-(sp) movem.l 8(sp),d0/a0 move.l CxBase,a6 jsr -$24(a6) move.l d0,$10(sp) move.l (sp)+,a6 end; function ActivateCxObj; xassembler; asm move.l a6,-(sp) movem.l 8(sp),d0/a0 move.l CxBase,a6 jsr -$2A(a6) move.l d0,$10(sp) move.l (sp)+,a6 end; procedure DeleteCxObj; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$30(a6) move.l (sp)+,a6 end; procedure DeleteCxObjAll; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$36(a6) move.l (sp)+,a6 end; function CxObjType; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$3C(a6) move.l d0,$C(sp) move.l (sp)+,a6 end; function CxObjError; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$42(a6) move.l d0,$C(sp) move.l (sp)+,a6 end; procedure ClearCxObjError; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$48(a6) move.l (sp)+,a6 end; procedure SetCxObjPri; xassembler; asm move.l a6,-(sp) movem.l 8(sp),d0/a0 move.l CxBase,a6 jsr -$4E(a6) move.l (sp)+,a6 end; procedure AttachCxObj; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$54(a6) move.l (sp)+,a6 end; procedure EnqueueCxObj; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$5A(a6) move.l (sp)+,a6 end; procedure InsertCxObj; xassembler; asm movem.l a2/a6,-(sp) lea $C(sp),a6 move.l (a6)+,a2 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$60(a6) movem.l (sp)+,a2/a6 end; procedure RemoveCxObj; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$66(a6) move.l (sp)+,a6 end; procedure SetTranslate; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$72(a6) move.l (sp)+,a6 end; procedure SetFilter; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$78(a6) move.l (sp)+,a6 end; procedure SetFilterIX; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$7E(a6) move.l (sp)+,a6 end; function ParseIX; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$84(a6) move.l d0,$10(sp) move.l (sp)+,a6 end; function CxMsgType; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$8A(a6) move.l d0,$C(sp) move.l (sp)+,a6 end; function CxMsgData; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$90(a6) move.l d0,$C(sp) move.l (sp)+,a6 end; function CxMsgID; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$96(a6) move.l d0,$C(sp) move.l (sp)+,a6 end; procedure DivertCxMsg; xassembler; asm movem.l a2/a6,-(sp) lea $C(sp),a6 move.l (a6)+,a2 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$9C(a6) movem.l (sp)+,a2/a6 end; procedure RouteCxMsg; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l CxBase,a6 jsr -$A2(a6) move.l (sp)+,a6 end; procedure DisposeCxMsg; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$A8(a6) move.l (sp)+,a6 end; function InvertKeyMap; xassembler; asm move.l a6,-(sp) lea 8(sp),a6 move.l (a6)+,a1 move.l (a6)+,a0 move.l (a6)+,d0 move.l CxBase,a6 jsr -$AE(a6) tst.l d0 sne d0 neg.b d0 move.b d0,$14(sp) move.l (sp)+,a6 end; procedure AddIEvents; xassembler; asm move.l a6,-(sp) move.l 8(sp),a0 move.l CxBase,a6 jsr -$B4(a6) move.l (sp)+,a6 end; end.