/* Listing S22 */ #include #include #include #include #include #include ttinclude struct NewBroker nb= ( NB,VERSION, "CLMod". "Modyfikator Caps Locka", "Modyfikuje CapsLock+Shift" , NBU_UNIQUE | NBU_NOTIFY, COF_SHOW_HIDE } ; long pri=127, parani []=[(long)&pri, (long)"alt control m",(long)"yes"} ; struct RDArgs *rda=0; Cx0bj *broker=0; struct MsgPort *broker_port=0; ULONG broker_mask; struct Window *okno=0; ULONG okno_mask=0; void wyjscie(int retkod) { if (okno) CloseWindow(okno) ; if (broker) DeleteCxObjAll(broker) ; if (broker"port) { struct Message *msg; while (msg=GetMsg(broker_port)) ReplyMsg(msg) ; DeleteMsgPort(broker_port) ; } if (rda) FreeArgs(rda) ; exit(retkod) ; void __interrupt __saveds "stdargs zmiana_caps(CxMsg* msg, Cx0bj* obj) { struct lnputEvent * i e; for (ie=CxMsgData(msg); ie; ie=ie->ie_NextEvenfc) i f (ie->ie_Class==IECLASS"RAWKEY && (ie->ie_Qualifier & IEOUALIFIER_CAPSLOCK) && (ie->ie_Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))) ie->ie_Qualifier &= ~(IEQUALIFIER_CAPSLOCK | IEQUALI- FIER_LSHIFT | IEQUALIFIER_RSHIFT) ; ) void otworz_okno(void) ( if (okno) ( WindowToFront(okno) ; ActivateWindow(okno) ; } else { static char buf[128j; sprint f(buf, "CLMod: Wywolanie = <%s>" , param[l]) ; if (!(okno=OpenWindowTags(0, WA"Width, 400, WA_Height, 100, WA_IDCMP, IDCMP_CLOSEWINDOW, WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET [ WFLG_ACTIVATE | WFLG_RMBTRAP, WA_Title, buf, TAG_DONE))) wyjscie(10); okno_mask=l " okno->UserPort->mp_SigBit; void zamknij _okno(void) okno=O; okno_mask=O ; } int main(int argc, char* argv[]) { Cx0bj *filter; LONG bląd; char koniec=O; if (!(rda=ReadArgs("CX_PRIORITY/N/K,CX_POPKEY/K,CX_POPUP/K",param, 0))) { PrintFault(IoErr(), argv[0]); wyjscie(10) ; } if (!(broker_port=CreateMsgPort())) wyjscie(10); broker_mask=l " broker_port->mp_SigBit; nb.nb_Port=broker_port; nb.nb_Pri=*(long*)param[0] ; if (!(broker=CxBroker(&nb, &blad))) wyjscie (blad==CBERR_DUP ? O : 10); AttachCxObj(broker, CxCustom(zmiana_caps, 0)) ; AttachCxObj(broker, filter=CxFilter(param[l])) ; AttachCxObj(filter, CxSender(broker_port, 0)) ; AttachCxObj(filter, CxTranslate(NULL)) ; if (blad=CxObjError(filter)) i if (bląd & COERR_BADFILTER) Printf("%s; nieprawidlowy filtr '%s,\n", argv[0], param [l] ) ; wyjscie (10) ; } ActivateCxObj(broker, TRUE) ; if (stricmp((char*)param[2] , "yes")==0) otworz_okno() ; for (; !koniec;) { ULONG sig=Wait(broker_mask | okno.mask | SIGBREAKF_CTRL_C) ; if (sig & broker_mask) { CxMsg *msg; while (msg=(CxMsg*)GetMsg(broker_port)) { LONG id=CxMsgID(msg) ; ULONG type=CxMsgType(msg) ; ReplyMsg((struct Message*)msg) ; switch (type) { case CXM_IEVENT: otworz_okno() ; break; case CXM_COMMAND: switch (id) { case CXCMD_DISABLE: case CXCMD_ENABLE: ActivateCxObj (broker, id==CXCMD_ENABLE) ; break; case CXCMD_KILL: koniec=1; break; case CXCMD_UNIQUE: case CXCMD_APPEAR: otworz_okno(); break; case CXCMD_DISAPPEAR: zamknij_okno() ; (sig & okno "mask) /* Jedyna mozliwa wiadomościa jest IDCMP_CLOSEWINDOW. */ zamknij_okno() ; (sig & SIGBREAKF_CTRL_C) koniec=1; } wyjscie (0); }