home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 328_02 / whotkey.c < prev    next >
C/C++ Source or Header  |  1991-03-17  |  2KB  |  90 lines

  1. /* whotkey.c
  2.  *         This routine installs HOTKEY event handlers.
  3.  *        Method: for each new hotkey, allocate a structure in a linked list
  4.  *            the list element describes the hotkey, the function and the 
  5.  *                flags to eliminate reentrant calls to the functions.
  6.  *        For each keystroke, run through the list to test for hotkeys.
  7.  *
  8.  */
  9. #include "wsys.h"
  10.  
  11.  
  12. struct WHOTKEY_st
  13.     {
  14.     void (*whk_func)(void);
  15.     int whk_val;
  16.     int whk_reentrant;
  17.     struct WHOTKEY_st *whk_next;    
  18.     };
  19.  
  20. typedef struct WHOTKEY_st WHOTKEY;
  21.  
  22.  
  23.  
  24. /*pointer to hot key traps not installed using this routine, ie, menus.
  25.  */
  26. static int (*prior_handler)(int) = NULL;
  27.  
  28. static char first_call =1;
  29.  
  30. static int handler (int);
  31.  
  32. /*end of chain of WHOTKEYS
  33.  */
  34. static WHOTKEY *anchor = NULL;
  35.  
  36.  
  37.  
  38.  
  39. void whotkey_install ( int key, void (*func)(void) )
  40.     {
  41.     WHOTKEY *hk;
  42.     
  43.     if ( first_call )
  44.         {
  45.         first_call = 0;
  46.         prior_handler = wkeytrap;
  47.         wkeytrap = handler;
  48.         } 
  49.         
  50.     hk = wmalloc ( sizeof (WHOTKEY), "HOTKEY");
  51.         
  52.     /*construct linked list
  53.      */
  54.     hk -> whk_next = anchor;
  55.     anchor = hk;
  56.     
  57.     hk -> whk_reentrant = 0;
  58.     hk -> whk_func       = func;
  59.     hk -> whk_val        = key;
  60.         
  61.     return;        /* end whotkey_install */
  62.         
  63.     }
  64.     
  65.     
  66. static int handler (int key)
  67.     {
  68.     WHOTKEY *hk;
  69.     
  70.     
  71.     for (hk = anchor; hk != NULL; hk = hk->whk_next )
  72.         {
  73.         if ( key == hk->whk_val   &&  ! (hk-> whk_reentrant) )
  74.             {
  75.             hk-> whk_reentrant = 1;
  76.             (*(hk->whk_func))();
  77.             hk-> whk_reentrant = 0;
  78.             key = 0;            /* swallow keystroke (its a hotkey)*/
  79.             break;                /* exit for() loop early */
  80.             }
  81.         }
  82.     
  83.     if ( prior_handler != NULL )
  84.             {
  85.             key = (*prior_handler)(key);    
  86.             }
  87.     
  88.     return (key);
  89.     }
  90.