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

  1. /* wmacro.c
  2.  *
  3.  *    simple module for keyboard definable macros
  4.  *    uses wpipestr_in & wpipestr_out
  5.  */
  6.  
  7.  
  8. #include "wsys.h"
  9.  
  10.  
  11.  
  12.  
  13. /* array of 8-letter (+1for NULL) names and values of macros
  14.  */
  15. static WMACRO_NAMES name = {0};
  16.  
  17.  
  18. static char installed = 0;
  19. static char active    = 0;
  20. static char recording = 0;
  21. static char playing   = 0;
  22.  
  23.  
  24. static int  (*oldtrap)(int) = NULL;
  25. static int   trap     (int);
  26. static void callwhendone (void);
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33. void wmacro_install (void)
  34.     {
  35.     if ( !installed )
  36.         {
  37.         installed = 1;
  38.         oldtrap   = wkeytrap;
  39.         wkeytrap  = trap;
  40.         }
  41.     return;
  42.     }
  43.  
  44.  
  45. static trap ( int  key )
  46.     {
  47.     int n;
  48.     int response;
  49.  
  50.     char filename[14];
  51.  
  52.     if ( oldtrap )
  53.         {
  54.         /* chain to any previous traps
  55.          */
  56.         key = (*oldtrap)(key);
  57.         }
  58.  
  59.     if ( active )
  60.         {
  61.         /* prevent processing keystrokes that were requested
  62.          * from this routine
  63.          */
  64.         return (key);
  65.         }
  66.  
  67.  
  68.     active = 1;
  69.  
  70.  
  71.     if ( key == ALT_EQ )
  72.         {
  73.         /* request to record a macro
  74.          */
  75.         key = 0;
  76.         if ( recording )
  77.             {
  78.             /* this ALT_EQ has stopped the macro recording
  79.              * wpipestr_out() has seen it and terminated
  80.              */
  81.             recording =0;
  82.             wpromptc ( "MACRO", "MACRO RECORDING TERMINATED",NULL );
  83.             }
  84.         else
  85.             {
  86.             response = wmacro_select ("Pick a macro to define");
  87.  
  88.             if ( response != ESCAPE )
  89.                 {
  90.                 n = response - ALT_1;
  91.  
  92.                 response = wprompts ("MACRO",
  93.                     "Enter a name for the macro\n"
  94.                     "Recording begins after ENTER\n"
  95.                     "Recording ends following ALT =\n"
  96.                     "     ", name[n], 9);
  97.                 }
  98.             if ( response != ESCAPE )
  99.                 {
  100.                 strcpy (filename, name[n] );
  101.                 strcat (filename, ".mcr"  );
  102.  
  103.                 recording =1;
  104.                 wpipefout (  filename, ALT_EQ ) ;
  105.                 }
  106.  
  107.             }
  108.         }
  109.     else
  110.     if ( (!recording)  && (!playing) && key >= ALT_1  && key <= ALT_0 )
  111.         {
  112.         /* request to play a macro
  113.          * NOTE above if statemnt guarantees no nested macro calls.
  114.          */
  115.         n = key - ALT_1;
  116.         key = 0;
  117.  
  118.         if ( *name[n] != 0 )
  119.             {
  120.  
  121.             strcpy (filename, name[n] );
  122.             strcat (filename, ".mcr"  );
  123.  
  124.             if ( 0 == wpipefin ( filename, callwhendone ) )
  125.                 {
  126.                 playing =1;
  127.                 }
  128.  
  129.  
  130.             }
  131.  
  132.         }
  133.  
  134.     active = 0;
  135.  
  136.  
  137.     return (key);    /* trap */
  138.     }
  139.  
  140.  
  141. static void callwhendone (void)
  142.     {
  143.     playing = 0;
  144.     return;
  145.     }
  146.  
  147.  
  148.     /*-----------------------------------*/
  149.  
  150.  
  151.  
  152. /* wmacro_select
  153.  *
  154.  * screen layout is 46x12, 2 columns each: "ALT_n NAMETEXT   "
  155.  * with ESCAPE in bottom center.
  156.  *
  157.  */
  158. static char btxt[10][6] =
  159.     {"ALT_1","ALT_2","ALT_3","ALT_4","ALT_5",
  160.      "ALT_6","ALT_7","ALT_8","ALT_9","ALT_0"};
  161. #define BTN_LEN 6
  162.  
  163. int    wmacro_select (char * msg)
  164.     {
  165.     int     key, n, x, y;
  166.  
  167.     wopen (21,4, 43,13, wmenuattr, SINGLE_BORDER, wmenuattr, WSAVE2RAM);
  168.     wtitle ("\xb4 MACROS \xc3");
  169.  
  170.     wgoto ( 3,1 );
  171.     wputs (msg);
  172.  
  173.  
  174.     for ( n=0, x=3, y=4;     n<10;     n++, y++ )
  175.         {
  176.         wbutton_add ( btxt[n], x, y, BTN_LEN, (ALT_1 + n), 0 );
  177.         wgoto ( x+6, y );
  178.         wputs ( name [n] );
  179.  
  180.  
  181.         if ( n == 4 )
  182.             {
  183.             /* second column
  184.              */
  185.             x = 21;
  186.             y = 3;
  187.             }
  188.         }
  189.  
  190.  
  191.     wbutton_add ( "ESCAPE", 20, 11, 7, ESCAPE, WBTN_BOX );
  192.  
  193.     do    {
  194.         key = wgetc();
  195.  
  196.         /* convert char numbers to ALT_nmubers
  197.          */
  198.         if ( key == '0' )
  199.             {
  200.             key = ALT_0;
  201.             }
  202.         else
  203.         if ( key >= '1' && key <= '9' )
  204.             {
  205.             key += ( ALT_1 - '1' );
  206.             }
  207.  
  208.         }
  209.     while ( ! ( key == ESCAPE || ( key >= ALT_1 && key <= ALT_0 ) ) );
  210.  
  211.     wclose ();
  212.  
  213.     return (key);   /* wmacro_select */
  214.     }
  215.  
  216.  
  217. #ifdef __TURBOC__
  218.     /* TurboC wants the declarations of the function and of the array to
  219.      * match exactly, which is 'strong type checking'
  220.      */
  221. WMACRO_NAMES *(wmacro_names) (void)
  222.     {
  223.     return (&name);
  224.     }
  225. #else
  226.     /* Microsoft C can't seem to handle an & in front of the array name.
  227.      */
  228. WMACRO_NAMES *(wmacro_names) (void)
  229.     {
  230.     return (name);
  231.     }
  232. #endif    /* Microsoft C version */    
  233.  
  234.  
  235.  
  236. void wmacro_assign (char *filename, int key)
  237.     {
  238.     int n;
  239.  
  240.     if ( key < ALT_1  || key > ALT_0 )
  241.         {
  242.         werror ('W', "MACRO assign bad key");
  243.         }
  244.  
  245.     n =  (key == ALT_0) ? 9 : key - ALT_1;
  246.  
  247.  
  248.     memcpy ( name[n], filename, 8 );
  249.     name[n][8] = 0;
  250.  
  251.  
  252.     return;    /* wmacro_assign */
  253.     }
  254.  
  255. /*-------------------- end of WMACRO.C --------------------- */
  256.