[BACK]Return to screen.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / top

Diff for /src/usr.bin/top/screen.c between version 1.1 and 1.2

version 1.1, 1997/08/14 14:00:24 version 1.2, 1997/08/22 07:16:29
Line 20 
Line 20 
  *  preprocessor variable "TOStop".   --wnl   *  preprocessor variable "TOStop".   --wnl
  */   */
   
 #include "os.h"  #include <sys/types.h>
 #include "top.h"  
   
 #include <sys/ioctl.h>  #include <sys/ioctl.h>
 #ifdef CBREAK  #include <stdio.h>
 # include <sgtty.h>  #include <stdlib.h>
 # define SGTTY  #include <term.h>
 #else  #include <termios.h>
 # ifdef TCGETA  #include <unistd.h>
 #  define TERMIO  
 #  include <termio.h>  #include "top.h"
 # else  
 #  define TERMIOS  
 #  include <termios.h>  
 # endif  
 #endif  
 #if defined(TERMIO) || defined(TERMIOS)  
 # ifndef TAB3  
 #  ifdef OXTABS  
 #   define TAB3 OXTABS  
 #  else  
 #   define TAB3 0  
 #  endif  
 # endif  
 #endif  
 #include "screen.h"  #include "screen.h"
 #include "boolean.h"  #include "boolean.h"
   
 extern char *myname;  extern char *myname;
   
 int putstdout();  
   
 int  overstrike;  int  overstrike;
 int  screen_length;  int  screen_length;
 int  screen_width;  int  screen_width;
Line 59 
Line 41 
 char ch_kill;  char ch_kill;
 char smart_terminal;  char smart_terminal;
 char PC;  char PC;
 char *tgetstr();  
 char *tgoto();  
 char termcap_buf[1024];  
 char string_buffer[1024];  char string_buffer[1024];
 char home[15];  char home[15];
 char lower_left[15];  char lower_left[15];
 char *clear_line;  char *clear_line;
 char *clear_screen;  char *clear_scr;
 char *clear_to_end;  char *clear_to_end;
 char *cursor_motion;  char *cursor_motion;
 char *start_standout;  char *start_standout;
Line 75 
Line 54 
 char *terminal_end;  char *terminal_end;
 short ospeed;  short ospeed;
   
 #ifdef SGTTY  
 static struct sgttyb old_settings;  
 static struct sgttyb new_settings;  
 #endif  
 #ifdef TERMIO  
 static struct termio old_settings;  
 static struct termio new_settings;  
 #endif  
 #ifdef TERMIOS  
 static struct termios old_settings;  static struct termios old_settings;
 static struct termios new_settings;  static struct termios new_settings;
 #endif  
 static char is_a_terminal = No;  static char is_a_terminal = No;
 #ifdef TOStop  
 static int old_lword;  
 static int new_lword;  
 #endif  
   
 #define STDIN   0  void init_termcap(interactive)
 #define STDOUT  1  
 #define STDERR  2  
   
 init_termcap(interactive)  
   
 int interactive;  int interactive;
   
 {  {
     char *bufptr;      char *bufptr;
     char *PCptr;      char *PCptr;
     char *term_name;      char *term_name;
     char *getenv();  
     int status;      int status;
   
     /* set defaults in case we aren't smart */      /* set defaults in case we aren't smart */
Line 134 
Line 95 
     }      }
   
     /* now get the termcap entry */      /* now get the termcap entry */
     if ((status = tgetent(termcap_buf, term_name)) != 1)      if ((status = tgetent(NULL, term_name)) != 1)
     {      {
         if (status == -1)          if (status == -1)
         {          {
Line 188 
Line 149 
     }      }
   
     /* get necessary capabilities */      /* get necessary capabilities */
     if ((clear_screen  = tgetstr("cl", &bufptr)) == NULL ||      if ((clear_scr  = tgetstr("cl", &bufptr)) == NULL ||
         (cursor_motion = tgetstr("cm", &bufptr)) == NULL)          (cursor_motion = tgetstr("cm", &bufptr)) == NULL)
     {      {
         smart_terminal = No;          smart_terminal = No;
Line 215 
Line 176 
     get_screensize();      get_screensize();
   
     /* if stdout is not a terminal, pretend we are a dumb terminal */      /* if stdout is not a terminal, pretend we are a dumb terminal */
 #ifdef SGTTY      if (tcgetattr(STDOUT_FILENO, &old_settings) == -1)
     if (ioctl(STDOUT, TIOCGETP, &old_settings) == -1)  
     {      {
         smart_terminal = No;          smart_terminal = No;
     }      }
 #endif  
 #ifdef TERMIO  
     if (ioctl(STDOUT, TCGETA, &old_settings) == -1)  
     {  
         smart_terminal = No;  
     }  
 #endif  
 #ifdef TERMIOS  
     if (tcgetattr(STDOUT, &old_settings) == -1)  
     {  
         smart_terminal = No;  
     }  
 #endif  
 }  }
   
 init_screen()  void init_screen()
   
 {  {
     /* get the old settings for safe keeping */      /* get the old settings for safe keeping */
 #ifdef SGTTY      if (tcgetattr(STDOUT_FILENO, &old_settings) != -1)
     if (ioctl(STDOUT, TIOCGETP, &old_settings) != -1)  
     {      {
         /* copy the settings so we can modify them */          /* copy the settings so we can modify them */
         new_settings = old_settings;          new_settings = old_settings;
   
         /* turn on CBREAK and turn off character echo and tab expansion */  
         new_settings.sg_flags |= CBREAK;  
         new_settings.sg_flags &= ~(ECHO|XTABS);  
         (void) ioctl(STDOUT, TIOCSETP, &new_settings);  
   
         /* remember the erase and kill characters */  
         ch_erase = old_settings.sg_erase;  
         ch_kill  = old_settings.sg_kill;  
   
 #ifdef TOStop  
         /* get the local mode word */  
         (void) ioctl(STDOUT, TIOCLGET, &old_lword);  
   
         /* modify it */  
         new_lword = old_lword | LTOSTOP;  
         (void) ioctl(STDOUT, TIOCLSET, &new_lword);  
 #endif  
         /* remember that it really is a terminal */  
         is_a_terminal = Yes;  
   
         /* send the termcap initialization string */  
         putcap(terminal_init);  
     }  
 #endif  
 #ifdef TERMIO  
     if (ioctl(STDOUT, TCGETA, &old_settings) != -1)  
     {  
         /* copy the settings so we can modify them */  
         new_settings = old_settings;  
   
         /* turn off ICANON, character echo and tab expansion */          /* turn off ICANON, character echo and tab expansion */
         new_settings.c_lflag &= ~(ICANON|ECHO);          new_settings.c_lflag &= ~(ICANON|ECHO);
         new_settings.c_oflag &= ~(TAB3);          new_settings.c_oflag &= ~(OXTABS);
         new_settings.c_cc[VMIN] = 1;          new_settings.c_cc[VMIN] = 1;
         new_settings.c_cc[VTIME] = 0;          new_settings.c_cc[VTIME] = 0;
         (void) ioctl(STDOUT, TCSETA, &new_settings);          (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &new_settings);
   
         /* remember the erase and kill characters */          /* remember the erase and kill characters */
         ch_erase = old_settings.c_cc[VERASE];          ch_erase = old_settings.c_cc[VERASE];
Line 292 
Line 208 
         /* send the termcap initialization string */          /* send the termcap initialization string */
         putcap(terminal_init);          putcap(terminal_init);
     }      }
 #endif  
 #ifdef TERMIOS  
     if (tcgetattr(STDOUT, &old_settings) != -1)  
     {  
         /* copy the settings so we can modify them */  
         new_settings = old_settings;  
   
         /* turn off ICANON, character echo and tab expansion */  
         new_settings.c_lflag &= ~(ICANON|ECHO);  
         new_settings.c_oflag &= ~(TAB3);  
         new_settings.c_cc[VMIN] = 1;  
         new_settings.c_cc[VTIME] = 0;  
         (void) tcsetattr(STDOUT, TCSADRAIN, &new_settings);  
   
         /* remember the erase and kill characters */  
         ch_erase = old_settings.c_cc[VERASE];  
         ch_kill  = old_settings.c_cc[VKILL];  
   
         /* remember that it really is a terminal */  
         is_a_terminal = Yes;  
   
         /* send the termcap initialization string */  
         putcap(terminal_init);  
     }  
 #endif  
   
     if (!is_a_terminal)      if (!is_a_terminal)
     {      {
         /* not a terminal at all---consider it dumb */          /* not a terminal at all---consider it dumb */
Line 325 
Line 216 
     }      }
 }  }
   
 end_screen()  void end_screen()
   
 {  {
     /* move to the lower left, clear the line and send "te" */      /* move to the lower left, clear the line and send "te" */
Line 340 
Line 231 
     /* if we have settings to reset, then do so */      /* if we have settings to reset, then do so */
     if (is_a_terminal)      if (is_a_terminal)
     {      {
 #ifdef SGTTY          (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &old_settings);
         (void) ioctl(STDOUT, TIOCSETP, &old_settings);  
 #ifdef TOStop  
         (void) ioctl(STDOUT, TIOCLSET, &old_lword);  
 #endif  
 #endif  
 #ifdef TERMIO  
         (void) ioctl(STDOUT, TCSETA, &old_settings);  
 #endif  
 #ifdef TERMIOS  
         (void) tcsetattr(STDOUT, TCSADRAIN, &old_settings);  
 #endif  
     }      }
 }  }
   
 reinit_screen()  void reinit_screen()
   
 {  {
     /* install our settings if it is a terminal */      /* install our settings if it is a terminal */
     if (is_a_terminal)      if (is_a_terminal)
     {      {
 #ifdef SGTTY          (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &new_settings);
         (void) ioctl(STDOUT, TIOCSETP, &new_settings);  
 #ifdef TOStop  
         (void) ioctl(STDOUT, TIOCLSET, &new_lword);  
 #endif  
 #endif  
 #ifdef TERMIO  
         (void) ioctl(STDOUT, TCSETA, &new_settings);  
 #endif  
 #ifdef TERMIOS  
         (void) tcsetattr(STDOUT, TCSADRAIN, &new_settings);  
 #endif  
     }      }
   
     /* send init string */      /* send init string */
Line 382 
Line 251 
     }      }
 }  }
   
 get_screensize()  void get_screensize()
   
 {  {
   
 #ifdef TIOCGWINSZ  
   
     struct winsize ws;      struct winsize ws;
   
     if (ioctl (1, TIOCGWINSZ, &ws) != -1)      if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) != -1)
     {      {
         if (ws.ws_row != 0)          if (ws.ws_row != 0)
         {          {
Line 402 
Line 268 
         }          }
     }      }
   
 #else  
 #ifdef TIOCGSIZE  
   
     struct ttysize ts;  
   
     if (ioctl (1, TIOCGSIZE, &ts) != -1)  
     {  
         if (ts.ts_lines != 0)  
         {  
             screen_length = ts.ts_lines;  
         }  
         if (ts.ts_cols != 0)  
         {  
             screen_width = ts.ts_cols - 1;  
         }  
     }  
   
 #endif /* TIOCGSIZE */  
 #endif /* TIOCGWINSZ */  
   
     (void) strcpy(lower_left, tgoto(cursor_motion, 0, screen_length - 1));      (void) strcpy(lower_left, tgoto(cursor_motion, 0, screen_length - 1));
 }  }
   
 standout(msg)  void standout(msg)
   
 char *msg;  char *msg;
   
Line 442 
Line 288 
     }      }
 }  }
   
 clear()  void clear()
   
 {  {
     if (smart_terminal)      if (smart_terminal)
     {      {
         putcap(clear_screen);          putcap(clear_scr);
     }      }
 }  }
   
 clear_eol(len)  int clear_eol(len)
   
 int len;  int len;
   
Line 475 
Line 321 
     return(-1);      return(-1);
 }  }
   
 go_home()  void go_home()
   
 {  {
     if (smart_terminal)      if (smart_terminal)
Line 486 
Line 332 
   
 /* This has to be defined as a subroutine for tputs (instead of a macro) */  /* This has to be defined as a subroutine for tputs (instead of a macro) */
   
 putstdout(ch)  int putstdout(ch)
   
 char ch;  int ch;
   
 {  {
     putchar(ch);      return(putchar(ch));
 }  }
   

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2