home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / util / misc / ascsend / non-mui / irec-source / irec_rec.c next >
C/C++ Source or Header  |  1995-06-19  |  10KB  |  339 lines

  1. #include "irec.h"
  2.  
  3. #define Q_MASK (IEQUALIFIER_CONTROL | IEQUALIFIER_LALT | \
  4.                 IEQUALIFIER_RALT   | IEQUALIFIER_LCOMMAND | IEQUALIFIER_RCOMMAND | \
  5.                 IEQUALIFIER_NUMERICPAD )
  6.  
  7. #define Q_MASK_2 (IECODE_LBUTTON | IECODE_RBUTTON | IECODE_MBUTTON)
  8.  
  9. #define CA_MASK  (IEQUALIFIER_CONTROL | IEQUALIFIER_LSHIFT)
  10. #define CA_MASK2 (IEQUALIFIER_CONTROL | IEQUALIFIER_RSHIFT)
  11.  
  12.  
  13. struct Interrupt *IHandler;
  14. struct IOStdReq  *HandlerIO;
  15. struct MsgPort   *InputPort;
  16. BYTE              device;
  17. struct InputEvent record_anchor;
  18. struct InputEvent *record;
  19. struct Task       *ourtask;
  20. LONG               SigBit;
  21. BOOL               break_on;
  22.  
  23. static void  free_recordline(void);
  24. static void  write_file(UBYTE *filename);
  25. static ULONG make_control(struct InputEvent *ie,UBYTE *buffer,UBYTE *t);
  26. void * __asm __saveds input_handler(register __a0 struct InputEvent *ev);
  27.  
  28. ULONG numev;
  29.  
  30. void rec_start_f(ULONG n)
  31. {
  32.  if(!recording)
  33.  {
  34.   recording = TRUE;
  35.   numev = n;
  36.   if(n && max_on)break_on = TRUE;
  37.   else break_on = FALSE;
  38.   HandlerIO->io_Data = (APTR)IHandler;
  39.   HandlerIO->io_Command = IND_ADDHANDLER;
  40.   BeginIO((struct IORequest *)HandlerIO);
  41.   record_anchor.ie_NextEvent = NULL;
  42.   record = &record_anchor;
  43.  }
  44. }
  45.  
  46. void rec_stop_f(UBYTE *name)
  47. {
  48.  if(!name)name = rec_file;
  49.  if(recording)
  50.  {
  51.   AbortIO((struct IORequest *)HandlerIO);
  52.   WaitIO((struct IORequest  *)HandlerIO);
  53.   HandlerIO->io_Data = (APTR)IHandler;
  54.   HandlerIO->io_Command = IND_REMHANDLER;
  55.   DoIO((struct IORequest *)HandlerIO);
  56.   recording = FALSE;
  57.   write_file(name);  
  58.   free_recordline();
  59.  }
  60. }
  61.  
  62. LONG init_recorder()
  63. {
  64.  if(InputPort = CreateMsgPort())
  65.  {
  66.   SigBit =  AllocSignal(-1);
  67.   if(SigBit != -1 )
  68.   {
  69.    ourtask = FindTask(0);
  70.    if(IHandler = AllocVec(sizeof(struct Interrupt),MEMF_PUBLIC | MEMF_CLEAR))
  71.    {
  72.     if(HandlerIO = (struct IOStdReq *)CreateExtIO(InputPort,sizeof(struct IOStdReq)))
  73.     {
  74.      if(!(device = OpenDevice("input.device",NULL,(struct IORequest *)HandlerIO,0L)))
  75.      {
  76.       IHandler->is_Code = input_handler;
  77.       /*IHandler->is_Data = mem_pool;*/
  78.       IHandler->is_Node.ln_Pri  = h_priority;
  79.       IHandler->is_Node.ln_Name = "irec.input";
  80.       return(TRUE);
  81.      }
  82.     }
  83.    }
  84.   }  
  85.  }
  86.  return (FALSE);
  87. }
  88.  
  89. void exit_recorder()
  90. {
  91.  if(recording)
  92.  {
  93.   AbortIO((struct IORequest *)HandlerIO);
  94.   WaitIO((struct IORequest  *)HandlerIO);
  95.   HandlerIO->io_Data = (APTR)IHandler;
  96.   HandlerIO->io_Command = IND_REMHANDLER;
  97.   DoIO((struct IORequest *)HandlerIO);
  98.  }
  99.  if(HandlerIO)
  100.  {
  101.   if(!device)CloseDevice((struct IORequest *)HandlerIO);
  102.   DeleteExtIO((struct IORequest *)HandlerIO);
  103.  }
  104.  if(InputPort)DeletePort(InputPort);
  105.  if(SigBit != -1)FreeSignal(SigBit);
  106. }
  107.  
  108. static void free_recordline()
  109. {
  110.  struct InputEvent *x;
  111.  struct InputEvent *t = record_anchor.ie_NextEvent;
  112.  while(t)
  113.  {
  114.   x = t->ie_NextEvent;
  115.   FreeVec(t);
  116.   t = x;
  117.  }
  118.  record_anchor.ie_NextEvent = NULL;
  119. }
  120.  
  121.  
  122. /***********************************************************/
  123.  
  124. void * __asm __saveds input_handler(register __a0 struct InputEvent *ev)
  125. {
  126.  struct InputEvent *t;
  127.  if((ev->ie_Class == IECLASS_RAWKEY)||((ev->ie_Class == IECLASS_RAWMOUSE)&&(ev->ie_Code != IECODE_NOBUTTON)))
  128.  {
  129.   if(t = AllocVec(sizeof(struct InputEvent),MEMF_PUBLIC | MEMF_CLEAR))
  130.   {
  131.    CopyMem(ev,t,sizeof(struct InputEvent));
  132.    t->ie_NextEvent = NULL;
  133.    if((ev->ie_Class == IECLASS_RAWMOUSE)&&(ev->ie_Code & Q_MASK_2))
  134.    {
  135.     t->ie_X = IntuitionBase->ActiveScreen->MouseX;
  136.     t->ie_Y = IntuitionBase->ActiveScreen->MouseY;
  137.    }
  138.    record->ie_NextEvent = t;
  139.    record = t;
  140.    if(break_on)
  141.    {
  142.     if(ev->ie_Code & IECODE_UP_PREFIX)
  143.     {
  144.      --numev;if(!numev) Signal(ourtask, 1L << SigBit);
  145.     }
  146.    }
  147.   }
  148.  }
  149.  return ((void *)ev);
  150. }
  151.  
  152. static void write_file(UBYTE *name)
  153. {
  154.  FILE  *rec;
  155.  struct InputEvent *e  = NULL;
  156.  struct InputEvent  e1;
  157.  struct InputEvent *le = NULL;
  158.  UBYTE buffer[STRMAXLEN]; 
  159.  char t[20];
  160.  if(rec=fopen(name,"w"))
  161.  {
  162.   e = record_anchor.ie_NextEvent;
  163.   while(e)
  164.   {
  165.    BOOL spc = FALSE;
  166.    long bytes;
  167.    UBYTE *dl = NULL;
  168.    *buffer = 0;
  169.    if((i_mb) &&(e->ie_Class == IECLASS_RAWMOUSE))
  170.    {
  171.     char ud = 'd';
  172.     if(le)
  173.     {
  174.      ULONG s = ((((e->ie_TimeStamp.tv_secs) - (le->ie_TimeStamp.tv_secs))-1) * 50) +
  175.                (((e->ie_TimeStamp.tv_micro) + (1000000 - le->ie_TimeStamp.tv_micro)) / 20000);
  176.      if((i_dl) && (s >= min_delay))fprintf(rec,"\\d%04ld",s);
  177.     }
  178.     le = e;
  179.     if(e->ie_Code & IECODE_UP_PREFIX)
  180.     {
  181.      ud = 'u';
  182.      e->ie_Code -= IECODE_UP_PREFIX;
  183.     }
  184.     switch(e->ie_Code)
  185.     {
  186.      case IECODE_LBUTTON : fprintf(rec,"\\(lm%c:%d,%d)",ud,e->ie_X,e->ie_Y);
  187.                            break;
  188.      case IECODE_RBUTTON : fprintf(rec,"\\(rm%c:%d,%d)",ud,e->ie_X,e->ie_Y);
  189.                            break;
  190.      case IECODE_MBUTTON : fprintf(rec,"\\(mm&c:%d,%d)",ud,e->ie_X,e->ie_Y);
  191.                            break;
  192.     }
  193.    }
  194.    else
  195.    {
  196.    BOOL hold = FALSE;
  197.    bytes = MapRawKey(e,buffer,STRMAXLEN,NULL);
  198.    CopyMem(e,&e1,sizeof(struct InputEvent));
  199.    if(e1.ie_Qualifier & IEQUALIFIER_RALT)e1.ie_Qualifier    -= IEQUALIFIER_RALT,hold = TRUE;
  200.    if(e1.ie_Qualifier & IEQUALIFIER_LALT)e1.ie_Qualifier    -= IEQUALIFIER_LALT,hold = TRUE;
  201.    if(e1.ie_Qualifier & IEQUALIFIER_CONTROL)e1.ie_Qualifier -= IEQUALIFIER_CONTROL,hold = TRUE;
  202.    if(hold)bytes = MapRawKey(&e1,buffer,STRMAXLEN,NULL);
  203.    if(bytes)
  204.    {
  205.     *(buffer + bytes) = 0;
  206.     if(bytes == 1)
  207.     {
  208.      /* hier war mal was 8( */
  209.      {
  210.       *t = *buffer;*(t + 1) = 0;
  211.       *buffer = 0;
  212.       if(*t == 0x7f){spc = TRUE; strcpy(t,"del");dl = t;}
  213.       if(*t < ' ')
  214.       {
  215.        spc = TRUE;
  216.        switch(*t)
  217.        {
  218.         case '\r' : strcpy(t,"return");
  219.                     break;
  220.         case '\n' : strcpy(t,"enter");
  221.                     break;
  222.         case '\t' : strcpy(t,"tab");
  223.                     break;
  224.         case 0x1b : strcpy(t,"esc");
  225.                     break;
  226.         case 0x08 : strcpy(t,"backspace");
  227.                     break;
  228.         default   : break;
  229.        }
  230.       }
  231.       if(make_control(e,buffer,dl)){ strcat(buffer,t); strcat(buffer,">");}
  232.       else 
  233.       {
  234.        if(spc){strcat(buffer,"<");strcat(buffer,t);strcat(buffer,">");}
  235.        else strcat(buffer,t);
  236.       }
  237.       if(le)
  238.       {
  239.        ULONG s = ((((e->ie_TimeStamp.tv_secs) - (le->ie_TimeStamp.tv_secs))-1) * 50) +
  240.                  (((e->ie_TimeStamp.tv_micro) + (1000000 - le->ie_TimeStamp.tv_micro)) / 20000);
  241.        if((i_dl) && (s >= min_delay))fprintf(rec,"\\d%04ld",s);
  242.       }
  243.       fputs(buffer,rec);
  244.       le = e;      
  245.      }
  246.     }
  247.     else
  248.     {
  249.      if(*buffer == 0x9b)
  250.      { 
  251.       spc = TRUE;
  252.       switch(*(buffer + 1))
  253.       {
  254.        case '0'     : strcpy(t,"F1"); break;
  255.        case '1'     : switch(*(buffer + 2))
  256.                       {
  257.                        case '0' : strcpy(t,"shift F1"); break;
  258.                        case '1' : strcpy(t,"shift F2"); break;
  259.                        case '2' : strcpy(t,"shift F3"); break;
  260.                        case '3' : strcpy(t,"shift F4"); break;
  261.                        case '4' : strcpy(t,"shift F5"); break;
  262.                        case '5' : strcpy(t,"shift F6"); break;
  263.                        case '6' : strcpy(t,"shift F7"); break;
  264.                        case '7' : strcpy(t,"shift F8"); break;
  265.                        case '8' : strcpy(t,"shift F9"); break;
  266.                        case '9' : strcpy(t,"shift F10"); break;
  267.                        case '~' : strcpy(t,"F2"); break;
  268.                       }
  269.                       break;
  270.        case '2'     : strcpy(t,"F3"); break;
  271.        case '3'     : strcpy(t,"F4"); break;
  272.        case '4'     : strcpy(t,"F5"); break;
  273.        case '5'     : strcpy(t,"F6"); break;
  274.        case '6'     : strcpy(t,"F7"); break;
  275.        case '7'     : strcpy(t,"F8"); break;
  276.        case '8'     : strcpy(t,"F9"); break;
  277.        case '9'     : strcpy(t,"F10"); break;
  278.        case '?'     : strcpy(t,"help"); break;
  279.        case 'A'     : strcpy(t,"up"); break;
  280.        case 'B'     : strcpy(t,"down"); break;
  281.        case 'D'     : strcpy(t,"left"); break;
  282.        case 'C'     : strcpy(t,"right"); break;
  283.        case 'T'     : strcpy(t,"shift up"); break;
  284.        case 'S'     : strcpy(t,"shift down"); break;
  285.        case ' '     : switch(*(buffer + 2))
  286.                       {
  287.                        case 'A' : strcpy(t,"shift left");  break;
  288.                        case '@' : strcpy(t,"shift right"); break;
  289.                       }
  290.                       break;
  291.       }
  292.      }
  293.      *buffer = 0;
  294.      if(make_control(e,buffer,t)){ strcat(buffer,t); strcat(buffer,">");}
  295.      else 
  296.      {
  297.       if(spc){strcat(buffer,"<");strcat(buffer,t);strcat(buffer,">");}
  298.       else strcat(buffer,t);
  299.      }
  300.      if(le)
  301.      {
  302.       ULONG s = ((((e->ie_TimeStamp.tv_secs) - (le->ie_TimeStamp.tv_secs))-1) * 50) +
  303.                 (((e->ie_TimeStamp.tv_micro) + (1000000 - le->ie_TimeStamp.tv_micro)) / 20000);
  304.        if((i_dl) && (s >= min_delay))fprintf(rec,"\\d%04ld",s);
  305.      }
  306.      fputs(buffer,rec);
  307.      le = e;
  308.     }
  309.    }
  310.    } /* RAWMOUSE */
  311.    e = e->ie_NextEvent;
  312.    if(e == record)break;
  313.   }
  314.   fclose(rec); 
  315.  }
  316. }
  317.  
  318. static ULONG make_control(struct InputEvent *ie,UBYTE *buffer,UBYTE *t)
  319. {
  320.  ULONG rc = FALSE;
  321.  if(ie->ie_Qualifier & Q_MASK)
  322.  {
  323.   rc = TRUE;
  324.   strcat(buffer,"<");
  325.   if(ie->ie_Qualifier & IEQUALIFIER_LEFTBUTTON)strcat(buffer,"leftbutton ");
  326.   if(ie->ie_Qualifier & IEQUALIFIER_RBUTTON)strcat(buffer,"rbutton ");
  327.   if(ie->ie_Qualifier & IEQUALIFIER_MIDBUTTON)strcat(buffer,"midbutton ");
  328.   if(ie->ie_Qualifier & IEQUALIFIER_CONTROL)strcat(buffer,"control ");
  329.   if(ie->ie_Qualifier & IEQUALIFIER_RALT)strcat(buffer,"ralt ");
  330.   if(ie->ie_Qualifier & IEQUALIFIER_LALT)strcat(buffer,"lalt ");
  331.   if(ie->ie_Qualifier & IEQUALIFIER_RCOMMAND)strcat(buffer,"rcommand ");
  332.   if(ie->ie_Qualifier & IEQUALIFIER_LCOMMAND)strcat(buffer,"lcommand ");
  333.   if(ie->ie_Qualifier & IEQUALIFIER_NUMERICPAD)strcat(buffer,"numericpad ");
  334.   if(!t)if(ie->ie_Qualifier & IEQUALIFIER_LSHIFT)strcat(buffer,"lshift ");
  335.   if(!t)if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)strcat(buffer,"rshift ");
  336.  }
  337.  return (rc);
  338. }
  339.