home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / MM1 / SOUNDUTILS / mm1_tracker.lzh / TRACKER4.6 / Amiga / events.c < prev    next >
Text File  |  1994-11-24  |  3KB  |  151 lines

  1. /* events.c 
  2.     vi:ts=3 sw=3:
  3.  */
  4. /* global events handler mechanism */
  5.  
  6. /* $Id: events.c,v 1.4 1994/06/22 21:54:12 Espie Exp Espie $
  7.  * $Log: events.c,v $
  8.  * Revision 1.2  1994/01/09  04:49:18  Espie
  9.  * File requester !
  10.  */
  11.  
  12. #include <proto/exec.h>
  13. #include <dos/dos.h>
  14. #include "defs.h"
  15. #include "extern.h"
  16. #include "amiga/amiga.h"
  17.  
  18. ID("$Id: events.c,v 1.4 1994/06/22 21:54:12 Espie Exp Espie $")
  19.  
  20. LOCAL void init_events(void);
  21. LOCAL void (*INIT)(void) = init_events;
  22.  
  23. #define NUMBER_SIGNALS 32
  24.  
  25. LOCAL struct event_manager
  26.    {
  27.    ULONG    mask;       /* mask of signals we might wait for */
  28.    ULONG    req_mask;   /* special requester handler */
  29.    void     (*req_f)P((ULONG received));
  30.  
  31.    struct hook
  32.       {
  33.       void (*f)P((GENERIC data));
  34.       GENERIC data;
  35.       } hook[NUMBER_SIGNALS];
  36.    } manager;
  37.  
  38.  
  39. void install_signal_handler(int signal, void (*f)P((GENERIC data)), GENERIC data)
  40.    {
  41.    ULONG sigmask = 1 << signal;
  42.    
  43.    INIT_ONCE;
  44.    
  45.    if (f)
  46.       {
  47.       manager.mask |= sigmask;
  48.       manager.hook[signal].f = f;
  49.       manager.hook[signal].data = data;
  50.       }
  51.    else
  52.       {
  53.       manager.mask &= ~signal;
  54.       manager.hook[signal].f = 0;
  55.       }
  56.    }
  57.  
  58. void remove_signal_handler(int signal)
  59.    {
  60.    install_signal_handler(signal, 0, 0);
  61.    }
  62.  
  63. /* special case for reqtools.library ! */
  64. void install_req_handler(ULONG mask, void (*req_f)P((ULONG received)))
  65.    {
  66.    INIT_ONCE;
  67.  
  68.    if (req_f)
  69.       {
  70.       manager.req_mask = mask;
  71.       manager.req_f = req_f;
  72.       }
  73.    else
  74.       {
  75.       manager.req_mask = 0;
  76.       manager.req_f = 0;
  77.       }
  78.    }
  79.  
  80. void remove_req_handler(void)
  81.    {
  82.    install_req_handler(0, 0);
  83.    }
  84.  
  85. LOCAL void handle_events(ULONG received)
  86.    {
  87.    int i; 
  88.    ULONG mask;
  89.  
  90.    if ((received & manager.req_mask) && manager.req_f)
  91.       (*manager.req_f)(received & manager.req_mask);
  92.     for (i = 0, mask = 1; i < NUMBER_SIGNALS; i++, mask <<= 1)
  93.         if ((received & mask) && manager.hook[i].f)
  94.            (*manager.hook[i].f)(manager.hook[i].data);
  95.    }
  96.  
  97. void await_events()
  98.    {
  99.    ULONG received;
  100.    
  101.    INIT_ONCE;
  102.    received = Wait(manager.mask | manager.req_mask);
  103.    handle_events(received);
  104.    }
  105.  
  106. void check_events()
  107.    {
  108.    ULONG received;
  109.  
  110.    INIT_ONCE;
  111.    received = SetSignal(0, 0) & (manager.mask | manager.req_mask);
  112.       /* Clear signals received */
  113.    SetSignal(0, received);
  114.    handle_events(received);
  115.    }
  116.  
  117.  
  118. LOCAL int ask_break = FALSE;
  119.  
  120. void set_break()
  121.    {
  122.    ask_break = TRUE;
  123.    }
  124.  
  125. LOCAL void handle_ctrl_c(GENERIC nothing)
  126.    {
  127.    set_break();
  128.    }
  129.  
  130. LOCAL void init_events()
  131.    {
  132.    int i;
  133.  
  134.    manager.mask = 0;
  135.    manager.req_mask = 0;
  136.    manager.req_f = 0;
  137.    for (i = 0; i < NUMBER_SIGNALS; i++)
  138.       manager.hook[i].f = 0;
  139.       
  140.    install_signal_handler(SIGBREAKB_CTRL_C, handle_ctrl_c, 0);
  141.    }
  142.    
  143. int checkbrk()
  144.    {
  145.    INIT_ONCE;
  146.  
  147.    check_events();
  148.    return ask_break;
  149.    }
  150.  
  151.