home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / most-3.2 / part01 / display.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-13  |  7.6 KB  |  301 lines

  1. #include <stdio.h>
  2. #include "buffer.h"  
  3. #include "display.h"  
  4. #include "sysdep.h"  
  5.  
  6. int SCREEN_WIDTH = 80;
  7. int SCREEN_WIDTH_M1 = 79;
  8. int SCREEN_HEIGHT = 24;
  9. int SCREEN_ROWS = 23; /* height - 1 */
  10.  
  11. extern int MOST_L_OPT;
  12.  
  13. char *INS_MODE_STR = "\033[4h";   /* ins mode (im) */
  14. char *EINS_MODE_STR = "\033[4l";  /* end ins mode (ei) */
  15. char *SCROLL_R_STR = "\033[%d;%dr"; /* scroll region */
  16. char *CLS_STR = "\033[2J\033[H";  /* cl termcap STR  for ansi terminals */
  17. char *CLR_BOS_STR = "\033[1J";   /* erase to beg of screen */
  18. char *REV_INDEX_STR = "\033M";     /* sr termcap string */
  19. char *REV_VID_STR = "\033[7m";    /* mr,so termcap string */
  20. char *BOLD_VID_STR = "\033[1m";    /**/
  21. char *UNDL_VID_STR = "\033[4m";    /**/
  22. char *NORM_VID_STR = "\033[m";   /* me,se termcap string */
  23. char *DEL_BOL_STR = "\033[1K\r";  /* cb termcap entry */
  24. char *DEL_EOL_STR = "\033[K"; 
  25. char *HOME_CURS_STR = "\033[H";   /* ho termcap string */
  26. char *DEL_LINE_STR = "\r\033[K";   /* dl termcap string except cursor at bol */
  27. char *DEL_CHAR_STR = "\033[P";   /* dc */
  28. char *DEL_N_LINES_STR = "\033[%dM";  /* DL */
  29. char *ADD_N_LINES_STR = "\033[%dL";  /* AL */
  30. char *CURS_F_STR = "\033[%dC";    /* RI termcap string */
  31. char *CURS_B_STR = "\033[%dD";    /* RI termcap string */
  32. char *CURS_U_STR = "\033[%dA";    /* RI termcap string */
  33. char *CURS_D_STR = "\033[%dB";    /* RI termcap string */
  34. /* cm string has %i%d since termcap numbers columns from 0 */
  35. /* char *CURS_POS_STR = "\033[%d;%df";  ansi-- hor and vert pos */
  36. char *CURS_POS_STR = "\033[%d;%dH";   /* cm termcap string */
  37.  
  38.  
  39. void set_scroll_region(int r1, int r2)
  40. {
  41.     fprintf(stdout,SCROLL_R_STR,r1,r2);
  42. }
  43.  
  44. void goto_rc(int r, int c)
  45. {
  46.     fprintf(stdout,CURS_POS_STR,r,c);
  47. }
  48. void curs_bol()
  49. {
  50.     fputc('\015',stdout);
  51. }
  52.  
  53. void cursor_forward(int n)
  54. {
  55.     fprintf(stdout,CURS_F_STR,n);
  56. }
  57.  
  58. void cursor_backward(int n)
  59. {
  60.     fprintf(stdout,CURS_B_STR,n);
  61. }
  62.  
  63. void cursor_up(int n)
  64. {
  65.     fprintf(stdout,CURS_U_STR,n);
  66. }
  67.  
  68. void cursor_down(int n)
  69. {
  70.     fprintf(stdout,CURS_D_STR,n);
  71. }
  72.  
  73. void begin_insert()
  74. {
  75.     fputs(INS_MODE_STR,stdout);
  76. }
  77.  
  78. void end_insert()
  79. {
  80.     fputs(EINS_MODE_STR,stdout);
  81. }
  82.  
  83. void delete_char()
  84. {
  85.     fputs(DEL_CHAR_STR,stdout);
  86. }
  87.  
  88. void delete_line(int n)
  89. {
  90.       fprintf(stdout,DEL_LINE_STR);
  91. }
  92.  
  93. void delete_nlines(int n)
  94. {
  95.     if (n) fprintf(stdout,DEL_N_LINES_STR,n);
  96. }
  97.  
  98. void clr_bos()   /* delete to beg of screen */
  99. {
  100.     fputs(CLR_BOS_STR,stdout);
  101. }
  102.  
  103. void set_attribute(int attr)
  104. {
  105.     fprintf(stdout,"\033[%dm",attr);
  106. }
  107.  
  108. void cls()
  109. {
  110.     fputs(CLS_STR,stdout);
  111. }
  112.  
  113. void reverse_index(int n)
  114. {
  115.     while(n--)
  116.       fputs(REV_INDEX_STR,stdout);
  117. }
  118.  
  119. /* assumes both old and new are the same length */
  120. smart_puts(char *new,char *old,FILE *fp)
  121. {
  122.     char out[250], ch, ch1;
  123.     int ii,max_len,i,mark;
  124.  
  125.     i = 0;
  126.     ii = 0;
  127.     while(ch = *new++, ch1 = *old++, (ch == ch1) && (ch != '\0')) i++;
  128.     if (ch == '\0') return;
  129.  
  130.     max_len = strlen(CURS_F_STR);
  131.     if (i) fprintf(fp, CURS_F_STR, i);
  132.  
  133.     while(1)
  134.       {
  135.           i = 1; ii = 0;
  136.           out[ii++] = ch;
  137.           while (ch = *new++, ch1 = *old++, ch != ch1 && ch != '\0') out[ii++] = ch;
  138.           mark = ii;
  139.           out[ii++] = ch;
  140.           while (ch = *new++, ch1 = *old++, ch == ch1 && ch != '\0')
  141.             {
  142.                 i++;
  143.                 out[ii++] = ch;
  144.             }
  145.           out[ii] = '\0';
  146.           if (ii > max_len)
  147.             {
  148.                 out[mark] = '\0';
  149.                 fputs(out,fp);
  150.                 if (ch == '\0') return;
  151.                 if (i) fprintf(fp, CURS_F_STR, i);
  152.             }
  153.           else
  154.             {
  155.                 fputs(out,fp);
  156.                 if (ch == '\0') return;
  157.             }          
  158.       }    
  159. }    
  160.     
  161.  
  162. #ifndef VMS
  163. /*  This routine may be problematic when there are more windows than
  164.     the new screen size can support.  Until I think of what to do,
  165.     I  have not touched this routine. */
  166. void resize_display()
  167. {
  168.     char c;
  169.  
  170.     get_term_dimensions(&SCREEN_WIDTH, &SCREEN_HEIGHT);
  171.     if (SCREEN_WIDTH == 0) SCREEN_WIDTH = 80;
  172.     if (SCREEN_HEIGHT == 0) SCREEN_HEIGHT = 24;
  173.     SCREEN_ROWS = SCREEN_HEIGHT - 1;
  174.     SCREEN_WIDTH_M1 = SCREEN_WIDTH - 1;
  175.     c = 'R';   /* force a redraw of screen */
  176.     ioctl(0,TIOCSTI,&c);
  177. }
  178. #endif
  179.  
  180. void get_terminfo()
  181. {
  182.  
  183. #ifndef VMS
  184.     (void) signal(SIGWINCH,resize_display); 
  185. #endif
  186.     
  187.     get_term_dimensions(&SCREEN_WIDTH, &SCREEN_HEIGHT); 
  188.     if (SCREEN_WIDTH == 0) SCREEN_WIDTH = 80;
  189.     if (SCREEN_HEIGHT == 0) SCREEN_HEIGHT = 24;
  190.     SCREEN_ROWS = SCREEN_HEIGHT - 1;
  191.     SCREEN_WIDTH_M1 = SCREEN_WIDTH - 1;
  192.  
  193.     /* someday I will add something here for non-dec terminals
  194.        perhaps a 'most-cap' terminal entry :^)
  195.  
  196.        For the time being we do it in this rather primitive manner */
  197.  
  198.     if (MOST_L_OPT)   /* dumb terminal */
  199.       {
  200.           CLS_STR = "\014";  /* a formfeed */
  201.           REV_INDEX_STR = "";
  202.           REV_VID_STR = "";
  203.           BOLD_VID_STR = "";    /**/
  204.           UNDL_VID_STR = "";    /**/
  205.           NORM_VID_STR = "";
  206.           HOME_CURS_STR = "";
  207.           DEL_LINE_STR = "";
  208.           DEL_BOL_STR = DEL_LINE_STR;  /* for our purposes */
  209.           CURS_F_STR = "";
  210.           CURS_POS_STR = "";
  211.       }
  212.     
  213. }
  214.  
  215.  
  216.  
  217. void narrow_width()
  218. {
  219.     fputs("\033[?3l",stdout);
  220. }
  221.  
  222. void wide_width()
  223. {
  224.     fputs("\033[?3h",stdout);
  225. }
  226.  
  227.  
  228. void set_width(int width, int redraw)
  229. {
  230. #ifdef VMS
  231.     short fd;
  232.     int status;
  233.     iosb iostatus;
  234.     static termchar tc; /* Terminal characteristics   */
  235.     $DESCRIPTOR( devnam, "SYS$ERROR");
  236. #else
  237.     struct winsize wind_struct;
  238. #endif      
  239.  
  240.     /* Switching physical terminal to narrow/wide mode.*/
  241.           
  242.     if(width<=80)
  243.       {
  244.           width = 80;
  245.           narrow_width();
  246.       }
  247.     else
  248.       {
  249.           width = 132;
  250.           wide_width();
  251.       }
  252.     SCREEN_WIDTH = width;
  253.     SCREEN_WIDTH_M1 = width - 1;
  254.     
  255. #ifdef VMS
  256.     /* Assign input to a channel */
  257.     status = sys$assign(&devnam, &fd, 0, 0);
  258.     if ((status & 1) == 0)
  259.       exit(status);
  260.     /* Get current terminal characteristics */
  261.     status = sys$qiow(          /* Queue and wait   */
  262.                       0,        /* Wait on event flag zero  */
  263.                       fd,       /* Channel to input terminal  */
  264.                       IO$_SENSEMODE, /* Get current characteristic */
  265.                       &iostatus, /* Status after operation */
  266.                       0, 0,     /* No AST service   */
  267.                       &tc,      /* Terminal characteristics buf */
  268.                       sizeof(tc), /* Size of the buffer   */
  269.                       0, 0, 0, 0); /* P3-P6 unused     */
  270.     
  271.     /*set terminal characteristics */
  272.     tc.t_width=width;
  273.     status = sys$qiow(           /* Queue and wait   */
  274.                       0,           /* Wait on event flag zero  */
  275.                       fd,           /* Channel to input terminal  */
  276.                       IO$_SETMODE,   /* Get current characteristic */
  277.                       &iostatus,       /* Status after operation */
  278.                       0, 0,            /* No AST service   */
  279.                       &tc,             /* Terminal characteristics buf */
  280.                       sizeof(tc),      /* Size of the buffer   */
  281.                       0, 0, 0, 0);     /* P3-P6 unused     */
  282.     
  283.     if( (sys$dassgn(fd)  & 1)==0)
  284.       exit(status);
  285.  
  286.     /* here we redraw the screen, on unix, we assume that the terminal
  287.        driver sends the appropriate signal that most catches to redraw so we
  288.        do not redraw because it is likely that screen will be redrawn twice */
  289.  
  290.     if (redraw) redraw_display();
  291. #else
  292.     /* this may need work on other unix-- works for sun4 */
  293.     ioctl(2,TIOCGWINSZ,&wind_struct);
  294.     wind_struct.ws_col = width;
  295.     ioctl(2,TIOCSWINSZ,&wind_struct);
  296.     
  297. #endif /* VMS */
  298. }
  299.  
  300.  
  301.