home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games 1996 October / Amiga_Games_Extra_CD_10-96.bin / userbox / publicdomain / grabkey / source / gk_cx.c < prev    next >
C/C++ Source or Header  |  1996-07-15  |  5KB  |  306 lines

  1. /*
  2. **    GrabKEY
  3. **
  4. **        © 1996 by Timo C. Nentwig
  5. **        All Rights Reserved !
  6. **
  7. **        Tcn@techbase.in-berlin.de
  8. **
  9. **
  10. */
  11.  
  12. /// #include
  13.  
  14. #include "gk_GST.h"
  15. #include "gk_Protos.h"
  16.  
  17. ///
  18. /// proto
  19.  
  20. static BOOL              AttachFilter    (const STRPTR HotKey, const ULONG Event);
  21. proto  BOOL __regargs    HandleCx        (CxMsg *Message);
  22. proto  VOID              QuitCx          (VOID);
  23. proto  BOOL              SetupCx         (VOID);
  24.  
  25. ///
  26.  
  27. struct    MsgPort         *CxPort;
  28. CxObj                     *Broker;
  29.  
  30. /// AttachFilter ()
  31.  
  32.     /*
  33.      *    FUNCTION    Attach a filter.
  34.      *
  35.      *    NOTE
  36.      *
  37.      *    EXAMPLE     AttachFilter ("LALT b", HOTKEY);
  38.      *
  39.      */
  40.  
  41.  
  42. static BOOL
  43. AttachFilter (const STRPTR HotKey, const ULONG Event)
  44. {
  45.  
  46.     CxObj   *Filter;
  47.     CxObj   *Sender;
  48.     CxObj   *Translator;
  49.  
  50.     if (Filter = CxFilter (HotKey))
  51.     {
  52.  
  53.         AttachCxObj (Broker, Filter);
  54.  
  55.        if (Sender = CxSender (CxPort, Event))
  56.        {
  57.  
  58.            AttachCxObj (Filter, Sender);
  59.  
  60.            if (Translator = CxTranslate (NULL))
  61.            {
  62.  
  63.                AttachCxObj (Filter, Translator);
  64.  
  65.                if ( ! (CxObjError (Filter)))
  66.                {
  67.  
  68.                    return (TRUE);
  69.  
  70.                }
  71.  
  72.            }
  73.  
  74.        }
  75.  
  76.     }
  77.  
  78.     return (FALSE);
  79.  
  80. }
  81.  
  82. ///
  83. /// HandleCx ()
  84.  
  85.     /*
  86.      *    FUNCTION    Handle commodity events.
  87.      *
  88.      *    NOTE
  89.      *
  90.      *    EXAMPLE     HandleCx (Msg);
  91.      *
  92.      */
  93.  
  94.  
  95. BOOL __regargs
  96. HandleCx (CxMsg *Message)
  97. {
  98.  
  99.     ULONG    MsgID   = CxMsgID   (Message),
  100.              MsgType = CxMsgType (Message);
  101.  
  102.     ReplyMsg ((struct Message *) Message);
  103.  
  104.     switch (MsgType)
  105.     {
  106.  
  107.             // Program events
  108.  
  109.         case CXM_IEVENT:
  110.  
  111.             switch (MsgID)
  112.             {
  113.  
  114.                 case CX_POPKEY:            CreateGUI();
  115.                                            break;
  116.  
  117.                 case SAVE_WINDOW_KEY:      Grab (WINDOW, TO_FILE);
  118.                                            break;
  119.  
  120.                 case SAVE_SCREEN_KEY:      Grab (SCREEN, TO_FILE);
  121.                                            break;
  122.  
  123.                 case CLIP_WINDOW_KEY:      Grab (WINDOW, TO_CLIPBOARD);
  124.                                            break;
  125.  
  126.                 case CLIP_SCREEN_KEY:      Grab (SCREEN, TO_CLIPBOARD);
  127.                                            break;
  128.  
  129.                 case PRINT_WINDOW_KEY:     Grab (WINDOW, TO_PRINTER);
  130.                                            break;
  131.  
  132.                 case PRINT_SCREEN_KEY:     Grab (SCREEN, TO_PRINTER);
  133.                                            break;
  134.  
  135.             }
  136.  
  137.             break;
  138.  
  139.             // Commodity events
  140.  
  141.         case CXM_COMMAND:
  142.  
  143.             switch (MsgID)
  144.             {
  145.                 case CXCMD_DISABLE:
  146.  
  147.                     ActivateCxObj (Broker, FALSE);
  148.                     break;
  149.  
  150.                 case CXCMD_ENABLE:
  151.  
  152.                     ActivateCxObj (Broker, TRUE);
  153.                     break;
  154.  
  155.                 case CXCMD_APPEAR:
  156.                 case CXCMD_UNIQUE:
  157.  
  158.                     if (Window)
  159.                     {
  160.  
  161.                         LT_ShowWindow (Handle, TRUE);
  162.  
  163.                     }
  164.                     else
  165.                     {
  166.  
  167.  
  168.                         CreateGUI();
  169.  
  170.                     }
  171.                     break;
  172.  
  173.                 case CXCMD_DISAPPEAR:
  174.  
  175.                     RemoveGUI();
  176.                     break;
  177.  
  178.                 case CXCMD_KILL:
  179.  
  180.                     return (TRUE);
  181.                     break;
  182.  
  183.             }
  184.  
  185.     }
  186.  
  187.     return (FALSE);
  188.  
  189. }
  190.  
  191. ///
  192. /// QuitCx ()
  193.  
  194.     /*
  195.      *    FUNCTION    Shut down program.
  196.      *
  197.      *    NOTE
  198.      *
  199.      *    EXAMPLE     QuitCx ();
  200.      *
  201.      */
  202.  
  203.  
  204. VOID
  205. QuitCx (VOID)
  206. {
  207.  
  208.     if (Broker)
  209.     {
  210.  
  211.         DeleteCxObjAll (Broker);
  212.         Broker = NULL;
  213.  
  214.     }
  215.  
  216.     if (CxPort)
  217.     {
  218.  
  219.         struct    Message   *Message;
  220.  
  221.         RemPort (CxPort);
  222.  
  223.         while (Message = GetMsg (CxPort))
  224.         {
  225.  
  226.             ReplyMsg (Message);
  227.  
  228.         }
  229.  
  230.         DeleteMsgPort (CxPort);
  231.  
  232.         CxPort = NULL;
  233.  
  234.     }
  235.  
  236. }
  237.  
  238. ///
  239. /// SetupCx ()
  240.  
  241.     /*
  242.      *    FUNCTION    Setup commoditiy stuff.
  243.      *
  244.      *    NOTE
  245.      *
  246.      *    EXAMPLE     SetupCx ();
  247.      *
  248.      */
  249.  
  250.  
  251. BOOL
  252. SetupCx (VOID)
  253. {
  254.  
  255.     QuitCx();
  256.  
  257.     if (CxPort = CreateMsgPort())
  258.     {
  259.  
  260.         struct    NewBroker    NewBroker;
  261.  
  262.         NewBroker . nb_Version         = NB_VERSION;
  263.         NewBroker . nb_Name            = PRG_TITLE;
  264.         NewBroker . nb_Title           = PRG_TITLE " " PRG_VERSION " © " PRG_YEAR " by " PRG_AUTHOR;
  265.         NewBroker . nb_Descr           = LocaleString (MSG_CX_INFO);
  266.         NewBroker . nb_Unique          = NBU_UNIQUE | NBU_NOTIFY;
  267.         NewBroker . nb_Flags           = COF_SHOW_HIDE;
  268.         NewBroker . nb_Pri             = 0;
  269.         NewBroker . nb_Port            = NULL;
  270.         NewBroker . nb_ReservedChannel = 0;
  271.  
  272.         CxPort -> mp_Node . ln_Name = NewBroker . nb_Name;
  273.  
  274.         AddPort (CxPort);
  275.  
  276.         NewBroker . nb_Port = CxPort;
  277.         NewBroker . nb_Pri  = Set -> Cx . Priority;
  278.  
  279.         if (Broker = CxBroker (&NewBroker, NULL))
  280.         {
  281.  
  282.             if (AttachFilter (Set -> Key . Window . Save,  SAVE_WINDOW_KEY)  &&
  283.                 AttachFilter (Set -> Key . Screen . Save,  SAVE_SCREEN_KEY)  &&
  284.                 AttachFilter (Set -> Key . Window . Clip,  CLIP_WINDOW_KEY)  &&
  285.                 AttachFilter (Set -> Key . Screen . Clip,  CLIP_SCREEN_KEY)  &&
  286.                 AttachFilter (Set -> Key . Window . Print, PRINT_WINDOW_KEY) &&
  287.                 AttachFilter (Set -> Key . Screen . Print, PRINT_SCREEN_KEY) &&
  288.                 AttachFilter (Set -> Cx . PopKey,          CX_POPKEY))
  289.                 {
  290.  
  291.                     ActivateCxObj (Broker,TRUE);
  292.                     return (TRUE);
  293.  
  294.                 }
  295.  
  296.         }
  297.  
  298.     }
  299.  
  300.     return (FALSE);
  301.  
  302. }
  303.  
  304. ///
  305.  
  306.