version 1.1, 1997/08/14 14:00:24 |
version 1.2, 1997/08/22 07:16:29 |
|
|
* 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; |
|
|
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; |
|
|
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 */ |
|
|
} |
} |
|
|
/* 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) |
{ |
{ |
|
|
} |
} |
|
|
/* 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; |
|
|
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]; |
|
|
/* 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 */ |
|
|
} |
} |
} |
} |
|
|
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" */ |
|
|
/* 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 */ |
|
|
} |
} |
} |
} |
|
|
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) |
{ |
{ |
|
|
} |
} |
} |
} |
|
|
#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; |
|
|
|
|
} |
} |
} |
} |
|
|
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; |
|
|
|
|
return(-1); |
return(-1); |
} |
} |
|
|
go_home() |
void go_home() |
|
|
{ |
{ |
if (smart_terminal) |
if (smart_terminal) |
|
|
|
|
/* 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)); |
} |
} |
|
|