home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / me34src.zip / me3 / me / tcap.c < prev    next >
C/C++ Source or Header  |  1995-01-14  |  6KB  |  219 lines

  1. /*
  2.  *    TCAP.C: TermCap and TermInfo stuff
  3.  *
  4.  * C Durland    Public Domain
  5.  */
  6.  
  7. /* Notes:
  8.  *   t_nrow:  This is the number of rows on the display MINUS 1.  The minus
  9.  *     1 is to leave a row for the mini buffer.  I don't know if this is a
  10.  *     good idea (because everybody has to remember another little detail)
  11.  *     but it has been that way forever and I don't think it would be worth
  12.  *     the gain to change it.
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include "me2.h"
  17. #include "driver.h"
  18.  
  19. #define BLACK_FG    1    /* black characters on a white background */
  20. #define WHITE_FG    0    /* white characters on a black background */
  21.  
  22. #if ATARI
  23. #define NROW    25    /* Atari default number of row (if not in termcap) */
  24. #else
  25. #define NROW    24    /* default number of row (if not in termcap) */
  26. #endif
  27. #define NCOL    80    /* default number of columns (if not in termcap) */
  28.  
  29. #define BEL    0x07    /* ^G */
  30.  
  31. #define TCAPSLEN 315    /* long enough to hold my copy of the term info */
  32.  
  33. extern char *tgoto();
  34. extern char *strcpy(), *strcat(), *strchr();
  35.  
  36.     /* escape sequence and terminfo pointers */
  37. static char *CM, *CL, *CE, *CD, *SO,*SE, *TI,*TE;
  38. char PC;        /* used by termcap library, initialize to '\0' */
  39.  
  40. int t_nrow = NROW - 1, t_ncol = 0, tcolor = WHITE_FG, mcolor = BLACK_FG;
  41.  
  42. extern void t_putchar();
  43. static void get_term_info(), putpad();
  44.  
  45.     /* Prepare the terminal for io.  Save the old state. */
  46. void t_open()
  47. {
  48.   if (t_ncol == 0)    /* only do this once */
  49.   {
  50.     que_version_info("display-driver", "termcap", (char *)NULL);
  51.     get_term_info();
  52.   }
  53.   ttopen();
  54.   if (TI) putpad(TI);
  55. }
  56.  
  57.     /* Restore the terminal. */
  58. void t_close()
  59. {
  60.   if (TE) putpad(TE);
  61.   ttclose();
  62. }
  63.  
  64.     /* move the cursor to (row,col) (zero relative). */
  65. void t_move(row,col) register int row, col; { putpad(tgoto(CM,col,row)); }
  66.  
  67.     /* Clear from cursor to end of line. */
  68. void t_eeol() { putpad(CE); }
  69.  
  70.     /* Clear from cursor to end of screen or just clear the screen. */
  71. void t_eeop() { putpad(CD); }
  72.  
  73.     /* Honk the horn.  beeper has the volume (0-100%).
  74.      * If the terminal has visable bell set, sending it a BEL will cause
  75.      *   a flash and not a beep.
  76.      */
  77. void t_beep()
  78. {
  79.   extern int beeper;
  80.  
  81.   if (beeper) { t_putchar(BEL); t_flush(); }
  82. }
  83.  
  84. static int hpterm;    /* if strange HP type video attributes */
  85.  
  86.     /* 1: current_color may not be correct - force color.
  87.      * 2: switch color (if not already current_color).
  88.      * 3: same as 2 but at beginning of line.
  89.      */
  90. void setcolor(color,x)
  91. {
  92.   static int current_color = -1;  /* initialize to something != [tm]color */
  93.  
  94.   if (SO == NULL) return;        /* inverse video not available */
  95.   if (hpterm) { if (x != SWITCH_COLOR1) return; }
  96.   else if (current_color == color && x != FORCE_COLOR) return;
  97.   switch (current_color = color)
  98.   {
  99.     case 0: putpad(SE); break;    /* turn off inverse video */
  100.     case 1: putpad(SO); break;    /* turn on inverse video */
  101.   }
  102. }
  103.  
  104.     /* "forground:background"
  105.      *   ":"      => no change
  106.      *   "color"  => only change foreground
  107.      *   "color:" => only change foreground
  108.      *   ":color" => only change background
  109.      */
  110. int do_color(which, color, set) char *color;
  111. {
  112.   int *c;
  113.  
  114.   switch(which)
  115.   {
  116.     case TEXT_COLOR:     c = &tcolor; break;    /* text color */
  117.     case MODELINE_COLOR: c = &mcolor; break;    /* modeline color */
  118.     case CURSOR_COLOR:                /* cursor color */
  119.     case CURSOR_SHAPE:        /* Changing the cursor not supported */
  120.       if (!set) strcpy(color, "unknown");
  121.       return FALSE;
  122.     default: return FALSE;            /* boo boo */
  123.   }
  124.   if (set)
  125.   {
  126.     char buf[100], *ptr;
  127.     int x = *c, z;
  128.  
  129.     strcpy(buf, color); lowercase(buf);
  130.     if (ptr = strchr(buf, ':')) *ptr = '\0';
  131.     if (0 == strcmp(buf,"white"))   z = WHITE_FG;
  132.     else
  133.       if (0 == strcmp(buf,"black")) z = BLACK_FG;
  134.       else
  135.         return FALSE;        /* don't reconize color, no change */
  136.  
  137.     return (x != (*c = z));
  138.   }
  139.   else
  140.     strcpy(color, (*c == WHITE_FG) ? "White:Black" : "Black:White");
  141.  
  142.   return FALSE;
  143. }
  144.  
  145. /* ******************************************************************** */
  146. /* ************* Below: support routines not needed elsewhere ********* */
  147. /* ******************************************************************** */
  148.  
  149. static void putpad(str) char *str; { tputs(str, 1, t_putchar); }
  150.  
  151.     /* Dig terminal info out of the termcap entry.
  152.      * Note:
  153.      *   I call get_size_from_window() because on some systems tgetnum()
  154.      *     doesn't seem to look at the LINES and COLUMNS environment
  155.      *     variables.
  156.      */
  157. static void get_term_info()
  158. {
  159.   extern char *getenv(), *strcpy(), *strcat(), *tgetstr();
  160.  
  161.   static char tcapbuf[TCAPSLEN];
  162.   char *t, *p, tcbuf[1024], *tv_stype, err_str[72];
  163.   int x, y;
  164.  
  165.   if ((tv_stype = getenv("TERM")) == NULL)
  166.   {
  167. #if ATARI
  168.     tv_stype = "atari";
  169. #else
  170.     puts("Environment variable TERM not defined!");
  171.     exit(1);
  172. #endif
  173.   }
  174.   if (tgetent(tcbuf,tv_stype) != 1)
  175.   {
  176.     puts(strcat(strcpy(err_str,"Unknown terminal type: "),tv_stype));
  177.     exit(1);
  178.   }
  179.  
  180.   p = tcapbuf;                /* pointer to local storage */
  181.  
  182.   if (t = tgetstr("pc",&p)) PC = *t;    /* pad_char: ???how used */
  183.  
  184.   CD = tgetstr("cd",&p);    /* clr_eos: clear to end of display */
  185.   CE = tgetstr("ce",&p);    /* clr_eol: clear to end of line */
  186.  
  187.   CM = tgetstr("cm",&p);    /* cursor_address: cursor motion */
  188.   TI = tgetstr("ti",&p);    /* enter_ca_mode:  init CM mode */
  189.   TE = tgetstr("te",&p);    /* exit_ca_mode:   uninit CM mode */
  190.  
  191.   if (get_size_from_window(&x, &y))
  192.   {
  193.     t_nrow = x -1;
  194.     t_ncol = y;
  195.   }
  196.   else        /* dig the info out of the termcap entry */
  197.   {
  198.                 /* lines:   lines on screen */
  199.     if ((x = tgetnum("li")) > 0) t_nrow = x -1;
  200.                 /* columns: screen columns */
  201.     t_ncol = (x = tgetnum("co")) > 0 ? x : NCOL;
  202.   }
  203.  
  204.   SO = tgetstr("so",&p);               /* enter_standout_mode */
  205.   if ((SE = tgetstr("se",&p)) == NULL) SO = NULL;  /* exit_standout_mode */
  206.   hpterm = tgetflag("xs");   /* ceol_standout_glitch: HP type inverse video */
  207.  
  208.   if (CD == NULL || CM == NULL || CE == NULL)
  209.   {
  210.     puts("Incomplete termcap entry.");
  211.     exit(1);
  212.   }
  213.   if (p >= &tcapbuf[TCAPSLEN])
  214.   {
  215.     puts("Terminal description too big!");
  216.     exit(1);
  217.   }
  218. }
  219.