home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / progut~1 / stdwin.zoo / vtest / vtmain.c < prev   
Encoding:
C/C++ Source or Header  |  1989-10-18  |  4.2 KB  |  257 lines

  1. /* Main program for VT package */
  2. /* $Header: vtmain.c,v 1.5 88/06/03 14:45:28 guido Exp $ */
  3.  
  4. #define DO_RESIZE
  5.  
  6. #include "vtimpl.h"
  7. #include "vtserial.h"
  8.  
  9. main ARGS((int argc, char **argv));
  10. STATIC void eventloop ARGS((VT *vt));
  11. STATIC void sendarrow ARGS((VT *vt, char key));
  12. STATIC void addmenus ARGS((WINDOW *win));
  13. STATIC bool domenu ARGS((VT *vt, int id, int item));
  14. STATIC void stripparity ARGS((char *buf, int len));
  15.  
  16. main(argc, argv)
  17.     int argc;
  18.     char **argv;
  19. {
  20.     VT *vt;
  21.     
  22.     winitnew(&argc, &argv);
  23.     if (!openserial()) {
  24.         wmessage("Can't open serial line");
  25.         wdone();
  26.         return 1;
  27.     }
  28. #ifdef macintosh
  29.     wsetfont("Monaco");
  30.     wsetsize(9);
  31. #endif
  32.     wsetdefwinsize(80*wcharwidth('0'), 24*wlineheight());
  33.     vt= vtopen("VT", 24, 80, 200);
  34.     if (vt != NULL) {
  35.         addmenus(vtwindow(vt));
  36. #ifdef DO_RESIZE
  37.         if (!vtautosize(vt)) {
  38.             vtclose(vt);
  39.             wmessage("Out of memory!");
  40.         }
  41.         else
  42. #endif
  43.             eventloop(vt);
  44.     }
  45.     wdone();
  46.     return 0;
  47. }
  48.  
  49. static void
  50. eventloop(vt)
  51.     VT *vt;
  52. {
  53.     for (;;) {
  54.         EVENT e;
  55.         char buf[2048];
  56.         int len;
  57.         
  58.         wgetevent(&e);
  59.         switch (e.type) {
  60.         
  61.         case WE_MENU:
  62.             if (!domenu(vt, e.u.m.id, e.u.m.item))
  63.                 return;
  64.             break;
  65.         
  66.         case WE_SERIAL_AVAIL:
  67.             len= receiveserial(buf, (int)(sizeof buf) - 1);
  68.             if (len > 0) {
  69.                 stripparity(buf, len);
  70.                 vtansiputs(vt, buf, len);
  71.             }
  72.             break;
  73.         
  74. #ifdef DO_RESIZE
  75.         case WE_SIZE:
  76.             if (!vtautosize(vt)) {
  77.                 vtclose(vt);
  78.                 wmessage("Out of memory!");
  79.                 return;
  80.             }
  81.             break;
  82. #endif
  83.         
  84.         case WE_CHAR:
  85.             if (e.u.character == '`')
  86.                 e.u.character= ESC;
  87.             buf[0]= e.u.character;
  88.             vtsend(vt, buf, 1);
  89.             break;
  90.         
  91.         case WE_MOUSE_DOWN:
  92.         case WE_MOUSE_MOVE:
  93.         case WE_MOUSE_UP:
  94.             vtsetcursor(vt,
  95.                 e.u.where.v / vtcheight(vt),
  96.                 e.u.where.h / vtcwidth(vt));
  97.             break;
  98.         
  99.         case WE_COMMAND:
  100.             switch (e.u.command) {
  101.             case WC_CLOSE:
  102.                 return;
  103.             case WC_RETURN:
  104.                 vtsend(vt, "\r", 1);
  105.                 break;
  106.             case WC_BACKSPACE:
  107.                 vtsend(vt, "\b", 1);
  108.                 break;
  109.             case WC_TAB:
  110.                 vtsend(vt, "\t", 1);
  111.                 break;
  112.             case WC_CANCEL:
  113.                 vtsend(vt, "\003", 1);
  114.                 break;
  115.             case WC_LEFT:
  116.                 sendarrow(vt, 'D');
  117.                 break;
  118.             case WC_RIGHT:
  119.                 sendarrow(vt, 'C');
  120.                 break;
  121.             case WC_UP:
  122.                 sendarrow(vt, 'A');
  123.                 break;
  124.             case WC_DOWN:
  125.                 sendarrow(vt, 'B');
  126.                 break;
  127.             }
  128.             break;
  129.         
  130.         }
  131.     }
  132. }
  133.  
  134. static void
  135. sendarrow(vt, key)
  136.     VT *vt;
  137.     char key;
  138. {
  139.     char buf[3];
  140.     buf[0]= ESC;
  141.     buf[1]= vt->keypadmode ? 'O' : '[';
  142.     buf[2]= key;
  143.     vtsend(vt, buf, 3);
  144. }
  145.  
  146. MENU *speedmenu;
  147.  
  148. static int speedlist[]=
  149.     {300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200};
  150.  
  151. #define NRATES ((int)sizeof speedlist / (int)sizeof speedlist[0])
  152.  
  153. static void
  154. addmenus(win)
  155.     WINDOW *win;
  156. {
  157.     MENU *mp;
  158.     int i;
  159.     
  160.     wmenusetdeflocal(TRUE);
  161.     
  162.     mp= wmenucreate(1, "VT");
  163.     wmenuadditem(mp, "DEL", '\b');
  164.     wmenuadditem(mp, "Backquote", '`');
  165.     wmenuadditem(mp, "", -1);
  166.     wmenuadditem(mp, "Send Break", '/');
  167.     wmenuadditem(mp, "", -1);
  168.     wmenuadditem(mp, "Receive file...", -1);
  169.     wmenuadditem(mp, "", -1);
  170.     wmenuadditem(mp, "Quit", -1);
  171.     wmenuattach(win, mp);
  172.     
  173.     mp= wmenucreate(2, "CC");
  174.     wmenuadditem(mp, "Control-@", ' '); /* 0 */
  175.     for (i= 'A'; i <= ']'; ++i) {
  176.         char buf[256];
  177.         sprintf(buf, "Control-%c", i);
  178.         wmenuadditem(mp, buf, i); /* 1...29 */
  179.     }
  180.     wmenuadditem(mp, "Control-^", '6'); /* 30 */
  181.     wmenuadditem(mp, "Control-_", '-'); /* 31 */
  182.     wmenuattach(win, mp);
  183.     
  184.     speedmenu= mp= wmenucreate(3, "Speed");
  185.     for (i= 0; i < NRATES; ++i) {
  186.         char buf[256];
  187.         sprintf(buf, "%d", speedlist[i]);
  188.         wmenuadditem(mp, buf, -1);
  189.     }
  190.     wmenuattach(win, mp);
  191. }
  192.  
  193. static bool
  194. domenu(vt, id, item)
  195.     VT *vt;
  196.     int id, item;
  197. {
  198.     char cc[2];
  199.     int n= 0;
  200.     
  201.     switch (id) {
  202.     
  203.     case 1:
  204.         switch (item) {
  205.         case 0:
  206.             cc[0]= '\177';
  207.             n= 1;
  208.             break;
  209.         case 1:
  210.             cc[0]= '`';
  211.             n= 1;
  212.             break;
  213.         case 3:
  214.             breakserial();
  215.             break;
  216.         case 5:
  217.             receivefile();
  218.             break;
  219.         case 7:
  220.             return FALSE;
  221.         }
  222.         break;
  223.     
  224.     case 2:
  225.         cc[0]= item;
  226.         n= 1;
  227.         break;
  228.     
  229.     case 3:
  230.         if (item < NRATES) {
  231.             int i;
  232.             if (!speedserial(speedlist[item]))
  233.                 item= -1;
  234.             for (i= 0; i < NRATES; ++i)
  235.                 wmenucheck(speedmenu, i, i==item);
  236.         }
  237.         break;
  238.     
  239.     }
  240.     if (n > 0)
  241.         vtsend(vt, cc, n);
  242.     return TRUE;
  243. }
  244.  
  245. /* Strip parity bits */
  246.  
  247. static void
  248. stripparity(buf, len)
  249.     register char *buf;
  250.     int len;
  251. {
  252.     register char *end= buf+len;
  253.     for (; buf < end; ++buf) {
  254.         *buf &= 0x7f;
  255.     }
  256. }
  257.