Changeset View
Changeset View
Standalone View
Standalone View
contrib/top/screen.c
Property | Old Value | New Value |
---|---|---|
svn:eol-style | null | native \ No newline at end of property |
svn:mime-type | null | text/plain \ No newline at end of property |
/* | /* | ||||
* Top users/processes display for Unix | * Copyright (c) 1984 through 2008, William LeFebvre | ||||
* Version 3 | * All rights reserved. | ||||
* | * | ||||
* This program may be freely redistributed, | * Redistribution and use in source and binary forms, with or without | ||||
* but this entire comment MUST remain intact. | * modification, are permitted provided that the following conditions are met: | ||||
* | * | ||||
* Copyright (c) 1984, 1989, William LeFebvre, Rice University | * * Redistributions of source code must retain the above copyright | ||||
* Copyright (c) 1989, 1990, 1992, William LeFebvre, Northwestern University | * notice, this list of conditions and the following disclaimer. | ||||
* | * | ||||
* * Redistributions in binary form must reproduce the above | |||||
* copyright notice, this list of conditions and the following disclaimer | |||||
* in the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* * Neither the name of William LeFebvre nor the names of other | |||||
* contributors may be used to endorse or promote products derived from | |||||
* this software without specific prior written permission. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
* | |||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
/* | |||||
* Top users/processes display for Unix | |||||
* Version 3 | |||||
*/ | |||||
/* This file contains the routines that interface to termcap and stty/gtty. | /* This file contains the routines that interface to termcap and stty/gtty. | ||||
* | * | ||||
* Paul Vixie, February 1987: converted to use ioctl() instead of stty/gtty. | * Paul Vixie, February 1987: converted to use ioctl() instead of stty/gtty. | ||||
* | * | ||||
* I put in code to turn on the TOSTOP bit while top was running, but I | * I put in code to turn on the TOSTOP bit while top was running, but I | ||||
* didn't really like the results. If you desire it, turn on the | * didn't really like the results. If you desire it, turn on the | ||||
* preprocessor variable "TOStop". --wnl | * preprocessor variable "TOStop". --wnl | ||||
*/ | */ | ||||
#include "os.h" | #include "os.h" | ||||
#include "top.h" | #include "top.h" | ||||
#if HAVE_CURSES_H && HAVE_TERM_H | |||||
#include <curses.h> | |||||
#include <term.h> | |||||
#else | |||||
#if HAVE_TERMCAP_H | |||||
#include <termcap.h> | |||||
#else | |||||
#if HAVE_CURSES_H | |||||
#include <curses.h> | |||||
#endif | |||||
#endif | |||||
#endif | |||||
#if !HAVE_DECL_TPUTS | |||||
int tputs(const char *, int, int (*)(int)); | |||||
#endif | |||||
#if !HAVE_DECL_TGOTO | |||||
char *tgoto(const char *, int, int); | |||||
#endif | |||||
#if !HAVE_DECL_TGETENT | |||||
int tgetent(const char *, char *); | |||||
#endif | |||||
#if !HAVE_DECL_TGETFLAG | |||||
int tgetflag(const char *); | |||||
#endif | |||||
#if !HAVE_DECL_TGETNUM | |||||
int tgetnum(const char *); | |||||
#endif | |||||
#if !HAVE_DECL_TGETSTR | |||||
char *tgetstr(const char *, char **); | |||||
#endif | |||||
#include <sys/ioctl.h> | #include <sys/ioctl.h> | ||||
#ifdef CBREAK | #ifdef CBREAK | ||||
# include <sgtty.h> | # include <sgtty.h> | ||||
# define SGTTY | # define USE_SGTTY | ||||
#else | #else | ||||
# ifdef TCGETA | # ifdef TCGETA | ||||
# define TERMIO | # define USE_TERMIO | ||||
# include <termio.h> | # include <termio.h> | ||||
# else | # else | ||||
# define TERMIOS | # define USE_TERMIOS | ||||
# include <termios.h> | # include <termios.h> | ||||
# endif | # endif | ||||
#endif | #endif | ||||
#if defined(TERMIO) || defined(TERMIOS) | #if defined(USE_TERMIO) || defined(USE_TERMIOS) | ||||
# ifndef TAB3 | # ifndef TAB3 | ||||
# ifdef OXTABS | # ifdef OXTABS | ||||
# define TAB3 OXTABS | # define TAB3 OXTABS | ||||
# else | # else | ||||
# define TAB3 0 | # define TAB3 0 | ||||
# endif | # endif | ||||
# endif | # endif | ||||
#endif | #endif | ||||
#include "screen.h" | #include "screen.h" | ||||
#include "boolean.h" | #include "boolean.h" | ||||
#define putcap(str) (void)((str) != NULL ? tputs(str, 1, putstdout) : 0) | |||||
extern char *myname; | extern char *myname; | ||||
int overstrike; | |||||
int screen_length; | |||||
int screen_width; | |||||
char ch_erase; | char ch_erase; | ||||
char ch_kill; | char ch_kill; | ||||
char ch_werase; | |||||
char smart_terminal; | char smart_terminal; | ||||
int screen_length; | |||||
int screen_width; | |||||
char PC; | char PC; | ||||
char *tgetstr(); | |||||
char *tgoto(); | |||||
char termcap_buf[1024]; | |||||
char string_buffer[1024]; | |||||
char home[15]; | |||||
char lower_left[15]; | |||||
char *clear_line; | |||||
char *clear_screen; | |||||
char *clear_to_end; | |||||
char *cursor_motion; | |||||
char *start_standout; | |||||
char *end_standout; | |||||
char *terminal_init; | |||||
char *terminal_end; | |||||
#ifdef SGTTY | static int tc_overstrike; | ||||
static char termcap_buf[1024]; | |||||
static char string_buffer[1024]; | |||||
static char home[15]; | |||||
static char lower_left[15]; | |||||
static char *tc_clear_line; | |||||
static char *tc_clear_screen; | |||||
static char *tc_clear_to_end; | |||||
static char *tc_cursor_motion; | |||||
static char *tc_start_standout; | |||||
static char *tc_end_standout; | |||||
static char *terminal_init; | |||||
static char *terminal_end; | |||||
#ifdef USE_SGTTY | |||||
static struct sgttyb old_settings; | static struct sgttyb old_settings; | ||||
static struct sgttyb new_settings; | static struct sgttyb new_settings; | ||||
#endif | #endif | ||||
#ifdef TERMIO | #ifdef USE_TERMIO | ||||
static struct termio old_settings; | static struct termio old_settings; | ||||
static struct termio new_settings; | static struct termio new_settings; | ||||
#endif | #endif | ||||
#ifdef TERMIOS | #ifdef USE_TERMIOS | ||||
static struct termios old_settings; | static struct termios old_settings; | ||||
static struct termios new_settings; | static struct termios new_settings; | ||||
#endif | #endif | ||||
static char is_a_terminal = No; | static char is_a_terminal = No; | ||||
#ifdef TOStop | #ifdef TOStop | ||||
static int old_lword; | static int old_lword; | ||||
static int new_lword; | static int new_lword; | ||||
#endif | #endif | ||||
#define STDIN 0 | #define STDIN 0 | ||||
#define STDOUT 1 | #define STDOUT 1 | ||||
#define STDERR 2 | #define STDERR 2 | ||||
/* This has to be defined as a subroutine for tputs (instead of a macro) */ | |||||
static int | |||||
putstdout(TPUTS_PUTC_ARGTYPE ch) | |||||
{ | |||||
return putchar((int)ch); | |||||
} | |||||
void | void | ||||
init_termcap(interactive) | screen_getsize() | ||||
int interactive; | { | ||||
#ifdef TIOCGWINSZ | |||||
struct winsize ws; | |||||
if (ioctl (1, TIOCGWINSZ, &ws) != -1) | |||||
{ | { | ||||
if (ws.ws_row != 0) | |||||
{ | |||||
screen_length = ws.ws_row; | |||||
} | |||||
if (ws.ws_col != 0) | |||||
{ | |||||
screen_width = ws.ws_col - 1; | |||||
} | |||||
} | |||||
#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) strlcpy(lower_left, tgoto(tc_cursor_motion, 0, screen_length - 1), | |||||
sizeof(lower_left)); | |||||
} | |||||
int | |||||
screen_readtermcap(int interactive) | |||||
{ | |||||
char *bufptr; | char *bufptr; | ||||
char *PCptr; | char *PCptr; | ||||
char *term_name; | char *term_name; | ||||
char *getenv(); | char *getenv(); | ||||
int status; | int status; | ||||
/* set defaults in case we aren't smart */ | /* set defaults in case we aren't smart */ | ||||
screen_width = MAX_COLS; | screen_width = MAX_COLS; | ||||
screen_length = 0; | screen_length = 0; | ||||
if (!interactive) | if (interactive == No) | ||||
{ | { | ||||
/* pretend we have a dumb terminal */ | /* pretend we have a dumb terminal */ | ||||
smart_terminal = No; | smart_terminal = No; | ||||
return; | return No; | ||||
} | } | ||||
/* assume we have a smart terminal until proven otherwise */ | /* assume we have a smart terminal until proven otherwise */ | ||||
smart_terminal = Yes; | smart_terminal = Yes; | ||||
/* get the terminal name */ | /* get the terminal name */ | ||||
term_name = getenv("TERM"); | term_name = getenv("TERM"); | ||||
/* if there is no TERM, assume it's a dumb terminal */ | /* if there is no TERM, assume it's a dumb terminal */ | ||||
/* patch courtesy of Sam Horrocks at telegraph.ics.uci.edu */ | /* patch courtesy of Sam Horrocks at telegraph.ics.uci.edu */ | ||||
if (term_name == NULL) | if (term_name == NULL) | ||||
{ | { | ||||
smart_terminal = No; | smart_terminal = No; | ||||
return; | return No; | ||||
} | } | ||||
/* now get the termcap entry */ | /* now get the termcap entry */ | ||||
if ((status = tgetent(termcap_buf, term_name)) != 1) | if ((status = tgetent(termcap_buf, term_name)) != 1) | ||||
{ | { | ||||
if (status == -1) | if (status == -1) | ||||
{ | { | ||||
fprintf(stderr, "%s: can't open termcap file\n", myname); | fprintf(stderr, "%s: can't open termcap file\n", myname); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
fprintf(stderr, "%s: no termcap entry for a `%s' terminal\n", | fprintf(stderr, "%s: no termcap entry for a `%s' terminal\n", | ||||
myname, term_name); | myname, term_name); | ||||
} | } | ||||
/* pretend it's dumb and proceed */ | /* pretend it's dumb and proceed */ | ||||
smart_terminal = No; | smart_terminal = No; | ||||
return; | return No; | ||||
} | } | ||||
/* "hardcopy" immediately indicates a very stupid terminal */ | /* "hardcopy" immediately indicates a very stupid terminal */ | ||||
if (tgetflag("hc")) | if (tgetflag("hc")) | ||||
{ | { | ||||
smart_terminal = No; | smart_terminal = No; | ||||
return; | return No; | ||||
} | } | ||||
/* set up common terminal capabilities */ | /* set up common terminal capabilities */ | ||||
if ((screen_length = tgetnum("li")) <= 0) | if ((screen_length = tgetnum("li")) <= 0) | ||||
{ | { | ||||
screen_length = smart_terminal = 0; | screen_length = smart_terminal = 0; | ||||
return; | return No; | ||||
} | } | ||||
/* screen_width is a little different */ | /* screen_width is a little different */ | ||||
if ((screen_width = tgetnum("co")) == -1) | if ((screen_width = tgetnum("co")) == -1) | ||||
{ | { | ||||
screen_width = 79; | screen_width = 79; | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
screen_width -= 1; | screen_width -= 1; | ||||
} | } | ||||
/* terminals that overstrike need special attention */ | /* terminals that overstrike need special attention */ | ||||
overstrike = tgetflag("os"); | tc_overstrike = tgetflag("os"); | ||||
/* initialize the pointer into the termcap string buffer */ | /* initialize the pointer into the termcap string buffer */ | ||||
bufptr = string_buffer; | bufptr = string_buffer; | ||||
/* get "ce", clear to end */ | /* get "ce", clear to end */ | ||||
if (!overstrike) | if (!tc_overstrike) | ||||
{ | { | ||||
clear_line = tgetstr("ce", &bufptr); | tc_clear_line = tgetstr("ce", &bufptr); | ||||
} | } | ||||
/* get necessary capabilities */ | /* get necessary capabilities */ | ||||
if ((clear_screen = tgetstr("cl", &bufptr)) == NULL || | if ((tc_clear_screen = tgetstr("cl", &bufptr)) == NULL || | ||||
(cursor_motion = tgetstr("cm", &bufptr)) == NULL) | (tc_cursor_motion = tgetstr("cm", &bufptr)) == NULL) | ||||
{ | { | ||||
smart_terminal = No; | smart_terminal = No; | ||||
return; | return No; | ||||
} | } | ||||
/* get some more sophisticated stuff -- these are optional */ | /* get some more sophisticated stuff -- these are optional */ | ||||
clear_to_end = tgetstr("cd", &bufptr); | tc_clear_to_end = tgetstr("cd", &bufptr); | ||||
terminal_init = tgetstr("ti", &bufptr); | terminal_init = tgetstr("ti", &bufptr); | ||||
terminal_end = tgetstr("te", &bufptr); | terminal_end = tgetstr("te", &bufptr); | ||||
start_standout = tgetstr("so", &bufptr); | tc_start_standout = tgetstr("so", &bufptr); | ||||
end_standout = tgetstr("se", &bufptr); | tc_end_standout = tgetstr("se", &bufptr); | ||||
/* pad character */ | /* pad character */ | ||||
PC = (PCptr = tgetstr("pc", &bufptr)) ? *PCptr : 0; | PC = (PCptr = tgetstr("pc", &bufptr)) ? *PCptr : 0; | ||||
/* set convenience strings */ | /* set convenience strings */ | ||||
(void) strncpy(home, tgoto(cursor_motion, 0, 0), sizeof(home) - 1); | (void) strlcpy(home, tgoto(tc_cursor_motion, 0, 0), sizeof(home)); | ||||
home[sizeof(home) - 1] = '\0'; | /* (lower_left is set in screen_getsize) */ | ||||
/* (lower_left is set in get_screensize) */ | |||||
/* get the actual screen size with an ioctl, if needed */ | /* get the actual screen size with an ioctl, if needed */ | ||||
/* This may change screen_width and screen_length, and it always | /* This may change screen_width and screen_length, and it always | ||||
sets lower_left. */ | sets lower_left. */ | ||||
get_screensize(); | screen_getsize(); | ||||
/* 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 | #ifdef USE_SGTTY | ||||
if (ioctl(STDOUT, TIOCGETP, &old_settings) == -1) | if (ioctl(STDOUT, TIOCGETP, &old_settings) == -1) | ||||
{ | { | ||||
smart_terminal = No; | smart_terminal = No; | ||||
} | } | ||||
#endif | #endif | ||||
#ifdef TERMIO | #ifdef USE_TERMIO | ||||
if (ioctl(STDOUT, TCGETA, &old_settings) == -1) | if (ioctl(STDOUT, TCGETA, &old_settings) == -1) | ||||
{ | { | ||||
smart_terminal = No; | smart_terminal = No; | ||||
} | } | ||||
#endif | #endif | ||||
#ifdef TERMIOS | #ifdef USE_TERMIOS | ||||
if (tcgetattr(STDOUT, &old_settings) == -1) | if (tcgetattr(STDOUT, &old_settings) == -1) | ||||
{ | { | ||||
smart_terminal = No; | smart_terminal = No; | ||||
} | } | ||||
#endif | #endif | ||||
return smart_terminal; | |||||
} | } | ||||
void | void | ||||
init_screen() | screen_init() | ||||
{ | { | ||||
/* get the old settings for safe keeping */ | /* get the old settings for safe keeping */ | ||||
#ifdef SGTTY | #ifdef USE_SGTTY | ||||
if (ioctl(STDOUT, TIOCGETP, &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 */ | /* turn on CBREAK and turn off character echo and tab expansion */ | ||||
new_settings.sg_flags |= CBREAK; | new_settings.sg_flags |= CBREAK; | ||||
new_settings.sg_flags &= ~(ECHO|XTABS); | new_settings.sg_flags &= ~(ECHO|XTABS); | ||||
(void) ioctl(STDOUT, TIOCSETP, &new_settings); | (void) ioctl(STDOUT, TIOCSETP, &new_settings); | ||||
/* remember the erase and kill characters */ | /* remember the erase and kill characters */ | ||||
ch_erase = old_settings.sg_erase; | ch_erase = old_settings.sg_erase; | ||||
ch_kill = old_settings.sg_kill; | ch_kill = old_settings.sg_kill; | ||||
ch_werase = old_settings.sg_werase; | |||||
#ifdef TOStop | #ifdef TOStop | ||||
/* get the local mode word */ | /* get the local mode word */ | ||||
(void) ioctl(STDOUT, TIOCLGET, &old_lword); | (void) ioctl(STDOUT, TIOCLGET, &old_lword); | ||||
/* modify it */ | /* modify it */ | ||||
new_lword = old_lword | LTOSTOP; | new_lword = old_lword | LTOSTOP; | ||||
(void) ioctl(STDOUT, TIOCLSET, &new_lword); | (void) ioctl(STDOUT, TIOCLSET, &new_lword); | ||||
#endif | #endif | ||||
/* remember that it really is a terminal */ | /* remember that it really is a terminal */ | ||||
is_a_terminal = Yes; | is_a_terminal = Yes; | ||||
/* send the termcap initialization string */ | /* send the termcap initialization string */ | ||||
putcap(terminal_init); | putcap(terminal_init); | ||||
} | } | ||||
#endif | #endif | ||||
#ifdef TERMIO | #ifdef USE_TERMIO | ||||
if (ioctl(STDOUT, TCGETA, &old_settings) != -1) | if (ioctl(STDOUT, TCGETA, &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 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 &= ~(TAB3); | ||||
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) ioctl(STDOUT, TCSETA, &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]; | ||||
ch_kill = old_settings.c_cc[VKILL]; | ch_kill = old_settings.c_cc[VKILL]; | ||||
ch_werase = old_settings.c_cc[VWERASE]; | |||||
/* remember that it really is a terminal */ | /* remember that it really is a terminal */ | ||||
is_a_terminal = Yes; | is_a_terminal = Yes; | ||||
/* send the termcap initialization string */ | /* send the termcap initialization string */ | ||||
putcap(terminal_init); | putcap(terminal_init); | ||||
} | } | ||||
#endif | #endif | ||||
#ifdef TERMIOS | #ifdef USE_TERMIOS | ||||
if (tcgetattr(STDOUT, &old_settings) != -1) | if (tcgetattr(STDOUT, &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 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 &= ~(TAB3); | ||||
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) tcsetattr(STDOUT, TCSADRAIN, &new_settings); | (void) tcsetattr(STDOUT, 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]; | ||||
ch_kill = old_settings.c_cc[VKILL]; | ch_kill = old_settings.c_cc[VKILL]; | ||||
ch_werase = old_settings.c_cc[VWERASE]; | |||||
/* remember that it really is a terminal */ | /* remember that it really is a terminal */ | ||||
is_a_terminal = Yes; | is_a_terminal = Yes; | ||||
/* send the termcap initialization string */ | /* send the termcap initialization string */ | ||||
putcap(terminal_init); | putcap(terminal_init); | ||||
} | } | ||||
#endif | #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 */ | ||||
smart_terminal = No; | smart_terminal = No; | ||||
} | } | ||||
} | } | ||||
void | void | ||||
end_screen() | screen_end() | ||||
{ | { | ||||
/* move to the lower left, clear the line and send "te" */ | /* move to the lower left, clear the line and send "te" */ | ||||
if (smart_terminal) | if (smart_terminal) | ||||
{ | { | ||||
putcap(lower_left); | putcap(lower_left); | ||||
putcap(clear_line); | putcap(tc_clear_line); | ||||
fflush(stdout); | fflush(stdout); | ||||
putcap(terminal_end); | putcap(terminal_end); | ||||
} | } | ||||
/* 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 | #ifdef USE_SGTTY | ||||
(void) ioctl(STDOUT, TIOCSETP, &old_settings); | (void) ioctl(STDOUT, TIOCSETP, &old_settings); | ||||
#ifdef TOStop | #ifdef TOStop | ||||
(void) ioctl(STDOUT, TIOCLSET, &old_lword); | (void) ioctl(STDOUT, TIOCLSET, &old_lword); | ||||
#endif | #endif | ||||
#endif | #endif | ||||
#ifdef TERMIO | #ifdef USE_TERMIO | ||||
(void) ioctl(STDOUT, TCSETA, &old_settings); | (void) ioctl(STDOUT, TCSETA, &old_settings); | ||||
#endif | #endif | ||||
#ifdef TERMIOS | #ifdef USE_TERMIOS | ||||
(void) tcsetattr(STDOUT, TCSADRAIN, &old_settings); | (void) tcsetattr(STDOUT, TCSADRAIN, &old_settings); | ||||
#endif | #endif | ||||
} | } | ||||
} | } | ||||
void | void | ||||
reinit_screen() | screen_reinit() | ||||
{ | { | ||||
/* 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 | #ifdef USE_SGTTY | ||||
(void) ioctl(STDOUT, TIOCSETP, &new_settings); | (void) ioctl(STDOUT, TIOCSETP, &new_settings); | ||||
#ifdef TOStop | #ifdef TOStop | ||||
(void) ioctl(STDOUT, TIOCLSET, &new_lword); | (void) ioctl(STDOUT, TIOCLSET, &new_lword); | ||||
#endif | #endif | ||||
#endif | #endif | ||||
#ifdef TERMIO | #ifdef USE_TERMIO | ||||
(void) ioctl(STDOUT, TCSETA, &new_settings); | (void) ioctl(STDOUT, TCSETA, &new_settings); | ||||
#endif | #endif | ||||
#ifdef TERMIOS | #ifdef USE_TERMIOS | ||||
(void) tcsetattr(STDOUT, TCSADRAIN, &new_settings); | (void) tcsetattr(STDOUT, TCSADRAIN, &new_settings); | ||||
#endif | #endif | ||||
} | } | ||||
/* send init string */ | /* send init string */ | ||||
if (smart_terminal) | if (smart_terminal) | ||||
{ | { | ||||
putcap(terminal_init); | putcap(terminal_init); | ||||
} | } | ||||
} | } | ||||
void | void | ||||
get_screensize() | screen_move(int x, int y) | ||||
{ | { | ||||
tputs(tgoto(tc_cursor_motion, x, y), 1, putstdout); | |||||
} | |||||
#ifdef TIOCGWINSZ | void | ||||
screen_standout(char *msg) | |||||
struct winsize ws; | |||||
if (ioctl (1, TIOCGWINSZ, &ws) != -1) | |||||
{ | { | ||||
if (ws.ws_row != 0) | if (smart_terminal) | ||||
{ | { | ||||
screen_length = ws.ws_row; | putcap(tc_start_standout); | ||||
fputs(msg, stdout); | |||||
putcap(tc_end_standout); | |||||
} | } | ||||
if (ws.ws_col != 0) | else | ||||
{ | { | ||||
screen_width = ws.ws_col - 1; | fputs(msg, stdout); | ||||
} | } | ||||
} | } | ||||
#else | void | ||||
#ifdef TIOCGSIZE | screen_clear() | ||||
struct ttysize ts; | |||||
if (ioctl (1, TIOCGSIZE, &ts) != -1) | |||||
{ | { | ||||
if (ts.ts_lines != 0) | if (smart_terminal) | ||||
{ | { | ||||
screen_length = ts.ts_lines; | putcap(tc_clear_screen); | ||||
} | } | ||||
if (ts.ts_cols != 0) | |||||
{ | |||||
screen_width = ts.ts_cols - 1; | |||||
} | } | ||||
} | |||||
#endif /* TIOCGSIZE */ | int | ||||
#endif /* TIOCGWINSZ */ | screen_cte() | ||||
(void) strncpy(lower_left, tgoto(cursor_motion, 0, screen_length - 1), | |||||
sizeof(lower_left) - 1); | |||||
lower_left[sizeof(lower_left) - 1] = '\0'; | |||||
} | |||||
void | |||||
standout(msg) | |||||
char *msg; | |||||
{ | { | ||||
if (smart_terminal) | if (smart_terminal) | ||||
{ | { | ||||
putcap(start_standout); | if (tc_clear_to_end) | ||||
fputs(msg, stdout); | |||||
putcap(end_standout); | |||||
} | |||||
else | |||||
{ | { | ||||
fputs(msg, stdout); | putcap(tc_clear_to_end); | ||||
return(Yes); | |||||
} | } | ||||
} | } | ||||
return(No); | |||||
} | |||||
void | void | ||||
clear() | screen_cleareol(int len) | ||||
{ | { | ||||
if (smart_terminal) | int i; | ||||
{ | |||||
putcap(clear_screen); | |||||
} | |||||
} | |||||
int | if (smart_terminal && !tc_overstrike && len > 0) | ||||
clear_eol(len) | |||||
int len; | |||||
{ | { | ||||
if (smart_terminal && !overstrike && len > 0) | if (tc_clear_line) | ||||
{ | { | ||||
if (clear_line) | putcap(tc_clear_line); | ||||
{ | return; | ||||
putcap(clear_line); | |||||
return(0); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
while (len-- > 0) | i = 0; | ||||
while (i++ < 0) | |||||
{ | { | ||||
putchar(' '); | putchar(' '); | ||||
} | } | ||||
return(1); | i = 0; | ||||
while (i++ < 0) | |||||
{ | |||||
putchar('\b'); | |||||
} | } | ||||
return; | |||||
} | } | ||||
return(-1); | |||||
} | } | ||||
return; | |||||
} | |||||
void | void | ||||
go_home() | screen_home() | ||||
{ | { | ||||
if (smart_terminal) | if (smart_terminal) | ||||
{ | { | ||||
putcap(home); | putcap(home); | ||||
} | } | ||||
} | } | ||||
/* This has to be defined as a subroutine for tputs (instead of a macro) */ | |||||
void | |||||
putstdout(ch) | |||||
char ch; | |||||
{ | |||||
putchar(ch); | |||||
} | |||||