home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga Shareware Floppies / ma81.dms / ma81.adf / Listingi / C_6_97.txt < prev    next >
Encoding:
Text File  |  1997-01-02  |  3.6 KB  |  308 lines

  1. /* Listing #22 */
  2. #include <proto/commodities.h>
  3.  
  4. #include <proto/dos.h>
  5.  
  6. #include <proto/exec.h>
  7.  
  8. #include <proto/intuition.h>
  9.  
  10. #include <stdio.h>
  11.  
  12. #include <stdlib.h>
  13.  
  14. #include <string.h>
  15.  
  16. struct NewBroker nb=
  17.  
  18. {
  19.     NB_VERSION,
  20.  
  21.     "CLMod",
  22.  
  23.     "Modyfikator Caps Locka",
  24.  
  25.     "Modyfikuje CapsLock+Shift",
  26.  
  27.     NBU_UNIQUE | NBU_NOTIFY,
  28.  
  29.     COF_SHOW_HIDE
  30.  
  31. };
  32.  
  33. long pri=127, param[]={(long)&pri, (long)"alt control m", (long)"yes"};
  34.  
  35. struct RDArgs *rda=0;
  36.  
  37. CxObj *broker=0;
  38.  
  39. struct MsgPort *broker_port=0;
  40.  
  41. ULONG broker_mask;
  42.  
  43. struct Window *okno=0;
  44.  
  45. ULONG okno_mask=0;
  46.  
  47. void wyjscie(int retkod)
  48.  
  49. {
  50.  
  51.     if (okno)
  52.  
  53.         CloseWindow(okno);
  54.  
  55.     if (broker)
  56.  
  57.         DeleteCxObjAll(broker);
  58.  
  59.     if (broker_port)
  60.  
  61.     {
  62.  
  63.         struct Message *msg;
  64.  
  65.         while (msg=GetMsg(broker_port))
  66.  
  67.             ReplyMsg(msg);
  68.  
  69.         DeleteMsgPort(broker_port);
  70.  
  71.     }
  72.  
  73.     if (rda)
  74.  
  75.         FreeArgs(rda);
  76.  
  77.     exit(retkod);
  78.  
  79. }
  80.  
  81. void __interrupt __saveds __stdargs zmiana_caps(CxMsg* msg, CxObj* obj)
  82.  
  83. {
  84.  
  85.     struct InputEvent *ie;
  86.  
  87.     for (ie=CxMsgData(msg); ie; ie=ie->ie_NextEvent)
  88.  
  89.         if (ie->ie_Class==IECLASS_RAWKEY && (ie->ie_Qualifier & IEQUALIFIER_CAPSLOCK) && (ie->ie_Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)))
  90.  
  91.             ie->ie_Qualifier &= ~(IEQUALIFIER_CAPSLOCK | IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT);
  92.  
  93. }
  94.  
  95. void otworz_okno(void)
  96.  
  97. {
  98.  
  99.     if (okno)
  100.  
  101.     {
  102.  
  103.         WindowToFront(okno);
  104.  
  105.         ActivateWindow(okno);
  106.  
  107.     }
  108.  
  109.     else
  110.  
  111.     {
  112.  
  113.         static char buf[128];
  114.  
  115.         sprintf(buf, "CLMod: Wywoîanie = <%s>", param[1]);
  116.  
  117.         if (!(okno=OpenWindowTags(0,
  118.  
  119.                 WA_Width, 400,
  120.  
  121.                 WA_Height, 100,
  122.  
  123.                 WA_IDCMP, IDCMP_CLOSEWINDOW,
  124.  
  125.                 WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_RMBTRAP,
  126.  
  127.                 WA_Title, buf,
  128.  
  129.                 TAG_DONE)))
  130.  
  131.             wyjscie(10);
  132.  
  133.         okno_mask=1 << okno->UserPort->mp_SigBit;
  134.  
  135.     }
  136.  
  137. }
  138.  
  139. void zamknij_okno(void)
  140.  
  141. {
  142.  
  143.     if (okno)
  144.  
  145.         CloseWindow(okno);
  146.  
  147.     okno=0;
  148.  
  149.     okno_mask=0;
  150.  
  151. }
  152.  
  153. int main(int argc, char* argv[])
  154.  
  155. {
  156.  
  157.     CxObj *filter;
  158.  
  159.     LONG blad;
  160.  
  161.     char koniec=0;
  162.  
  163.     if (!(rda=ReadArgs("CX_PRIORITY/N/K,CX_POPKEY/K,CX_POPUP/K", param, 0)))
  164.  
  165.     {
  166.  
  167.         PrintFault(IoErr(), argv[0]);
  168.  
  169.         wyjscie(10);
  170.  
  171.     }
  172.  
  173.     if (!(broker_port=CreateMsgPort()))
  174.  
  175.         wyjscie(10);
  176.  
  177.     broker_mask=1 << broker_port->mp_SigBit;
  178.  
  179.     nb.nb_Port=broker_port;
  180.  
  181.     nb.nb_Pri=*(long*)param[0];
  182.  
  183.     if (!(broker=CxBroker(&nb, &blad)))
  184.  
  185.         wyjscie(blad==CBERR_DUP ? 0 : 10);
  186.  
  187.     AttachCxObj(broker, CxCustom(zmiana_caps, 0));
  188.  
  189.     AttachCxObj(broker, filter=CxFilter(param[1]));
  190.  
  191.     AttachCxObj(filter, CxSender(broker_port, 0));
  192.  
  193.     AttachCxObj(filter, CxTranslate(NULL));
  194.  
  195.     if (blad=CxObjError(filter))
  196.  
  197.     {
  198.  
  199.         if (blad & COERR_BADFILTER)
  200.  
  201.             Printf("%s: nieprawidîowy filtr '%s'\n", argv[0], param[1]);
  202.  
  203.         wyjscie(10);
  204.  
  205.     }
  206.  
  207.     ActivateCxObj(broker, TRUE);
  208.  
  209.     if (stricmp((char*)param[2], "yes")==0)
  210.  
  211.         otworz_okno();
  212.  
  213.     for (; !koniec;)
  214.  
  215.     {
  216.  
  217.         ULONG sig=Wait(broker_mask | okno_mask | SIGBREAKF_CTRL_C);
  218.  
  219.         if (sig & broker_mask)
  220.  
  221.         {
  222.  
  223.             CxMsg *msg;
  224.  
  225.             while (msg=(CxMsg*)GetMsg(broker_port))
  226.  
  227.             {
  228.  
  229.                 LONG id=CxMsgID(msg);
  230.  
  231.                 ULONG type=CxMsgType(msg);
  232.  
  233.                 ReplyMsg((struct Message*)msg);
  234.  
  235.                 switch (type)
  236.  
  237.                 {
  238.  
  239.                     case CXM_IEVENT:
  240.  
  241.                         otworz_okno();
  242.  
  243.                         break;
  244.  
  245.                     case CXM_COMMAND:
  246.  
  247.                         switch (id)
  248.  
  249.                         {
  250.  
  251.                             case CXCMD_DISABLE:
  252.  
  253.                             case CXCMD_ENABLE:
  254.  
  255.                                 ActivateCxObj(broker, id==CXCMD_ENABLE);
  256.  
  257.                                 break;
  258.  
  259.                             case CXCMD_KILL:
  260.  
  261.                                 koniec=1;
  262.  
  263.                                 break;
  264.  
  265.                             case CXCMD_UNIQUE:
  266.  
  267.                             case CXCMD_APPEAR:
  268.  
  269.                                 otworz_okno();
  270.  
  271.                                 break;
  272.  
  273.                             case CXCMD_DISAPPEAR:
  274.  
  275.                                 zamknij_okno();
  276.  
  277.                         }
  278.  
  279.                 }
  280.  
  281.             }
  282.  
  283.         }
  284.  
  285.         if (sig & okno_mask)
  286.  
  287.             /* Jedynâ moûliwâ wiadomoôciâ jest IDCMP_CLOSEWINDOW. */
  288.  
  289.             zamknij_okno();
  290.  
  291.         if (sig & SIGBREAKF_CTRL_C)
  292.  
  293.             koniec=1;
  294.  
  295.     }
  296.  
  297.     wyjscie(0);
  298.  
  299.  
  300. }
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.