Blame exp_win.c

Packit a69f91
/* exp_win.c - window support
Packit a69f91
Packit a69f91
Written by: Don Libes, NIST, 10/25/93
Packit a69f91
Packit a69f91
This file is in the public domain.  However, the author and NIST
Packit a69f91
would appreciate credit if you use this file or parts of it.
Packit a69f91
Packit a69f91
*/
Packit a69f91
Packit a69f91
#include "expect_cf.h"
Packit a69f91
#include "tcl.h"
Packit a69f91
Packit a69f91
#ifdef NO_STDLIB_H
Packit a69f91
#include "../compat/stdlib.h"
Packit a69f91
#else
Packit a69f91
#include <stdlib.h>
Packit a69f91
#endif
Packit a69f91
Packit a69f91
/* _IBCS2 required on some Intel platforms to allow the include files */
Packit a69f91
/* to produce a definition for winsize. */
Packit a69f91
#define _IBCS2 1
Packit a69f91
Packit a69f91
/*
Packit a69f91
 * get everyone's window size definitions
Packit a69f91
 *
Packit a69f91
note that this is tricky because (of course) everyone puts them in
Packit a69f91
different places.  Worse, on some systems, some .h files conflict
Packit a69f91
and cannot both be included even though both exist.  This is the
Packit a69f91
case, for example, on SunOS 4.1.3 using gcc where termios.h
Packit a69f91
conflicts with sys/ioctl.h
Packit a69f91
 */
Packit a69f91
Packit a69f91
#ifdef HAVE_TERMIOS
Packit a69f91
#  include <termios.h>
Packit a69f91
#else
Packit a69f91
#  include <sys/ioctl.h>
Packit a69f91
#endif
Packit a69f91
Packit a69f91
/* Sigh.  On AIX 2.3, termios.h exists but does not define TIOCGWINSZ */
Packit a69f91
/* Instead, it has to come from ioctl.h.  However, As I said above, this */
Packit a69f91
/* can't be cavalierly included on all machines, even when it exists. */
Packit a69f91
#if defined(HAVE_TERMIOS) && !defined(HAVE_TIOCGWINSZ_IN_TERMIOS_H)
Packit a69f91
#  include <sys/ioctl.h>
Packit a69f91
#endif
Packit a69f91
Packit a69f91
/* SCO defines window size structure in PTEM and TIOCGWINSZ in termio.h */
Packit a69f91
/* Sigh... */
Packit a69f91
#if defined(HAVE_SYS_PTEM_H)
Packit a69f91
#   include <sys/types.h>   /* for stream.h's caddr_t */
Packit a69f91
#   include <sys/stream.h>  /* for ptem.h's mblk_t */
Packit a69f91
#   include <sys/ptem.h>
Packit a69f91
#endif /* HAVE_SYS_PTEM_H */
Packit a69f91
Packit a69f91
#include "exp_tty_in.h"
Packit a69f91
#include "exp_win.h"
Packit a69f91
Packit a69f91
#ifdef TIOCGWINSZ
Packit a69f91
typedef struct winsize exp_winsize;
Packit a69f91
#define columns ws_col
Packit a69f91
#define rows ws_row
Packit a69f91
#define EXP_WIN
Packit a69f91
#endif
Packit a69f91
Packit a69f91
#if !defined(EXP_WIN) && defined(TIOCGSIZE)
Packit a69f91
typedef struct ttysize exp_winsize;
Packit a69f91
#define columns ts_cols
Packit a69f91
#define rows ts_lines
Packit a69f91
#define EXP_WIN
Packit a69f91
#endif
Packit a69f91
Packit a69f91
#if !defined(EXP_WIN)
Packit a69f91
typedef struct {
Packit a69f91
	int columns;
Packit a69f91
	int rows;
Packit a69f91
} exp_winsize;
Packit a69f91
#endif
Packit a69f91
Packit a69f91
static exp_winsize winsize = {0, 0};
Packit a69f91
static exp_winsize win2size = {0, 0};
Packit a69f91
Packit a69f91
int exp_window_size_set(fd)
Packit a69f91
int fd;
Packit a69f91
{
Packit a69f91
#ifdef TIOCSWINSZ
Packit a69f91
	ioctl(fd,TIOCSWINSZ,&winsize);
Packit a69f91
#endif
Packit a69f91
#if defined(TIOCSSIZE) && !defined(TIOCSWINSZ)
Packit a69f91
	ioctl(fd,TIOCSSIZE,&winsize);
Packit a69f91
#endif
Packit a69f91
}
Packit a69f91
Packit a69f91
int exp_window_size_get(fd)
Packit a69f91
int fd;
Packit a69f91
{
Packit a69f91
#ifdef TIOCGWINSZ
Packit a69f91
	ioctl(fd,TIOCGWINSZ,&winsize);
Packit a69f91
#endif
Packit a69f91
#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
Packit a69f91
	ioctl(fd,TIOCGSIZE,&winsize);
Packit a69f91
#endif
Packit a69f91
#if !defined(EXP_WIN)
Packit a69f91
	winsize.rows = 0;
Packit a69f91
	winsize.columns = 0;
Packit a69f91
#endif
Packit a69f91
}
Packit a69f91
Packit a69f91
void
Packit a69f91
exp_win_rows_set(rows)
Packit a69f91
char *rows;
Packit a69f91
{
Packit a69f91
	winsize.rows = atoi(rows);
Packit a69f91
	exp_window_size_set(exp_dev_tty);
Packit a69f91
}
Packit a69f91
Packit a69f91
char*
Packit a69f91
exp_win_rows_get()
Packit a69f91
{
Packit a69f91
    static char rows [20];
Packit a69f91
	exp_window_size_get(exp_dev_tty);
Packit a69f91
	sprintf(rows,"%d",winsize.rows);
Packit a69f91
    return rows;
Packit a69f91
}
Packit a69f91
Packit a69f91
void
Packit a69f91
exp_win_columns_set(columns)
Packit a69f91
char *columns;
Packit a69f91
{
Packit a69f91
	winsize.columns = atoi(columns);
Packit a69f91
	exp_window_size_set(exp_dev_tty);
Packit a69f91
}
Packit a69f91
Packit a69f91
char*
Packit a69f91
exp_win_columns_get()
Packit a69f91
{
Packit a69f91
    static char columns [20];
Packit a69f91
	exp_window_size_get(exp_dev_tty);
Packit a69f91
	sprintf(columns,"%d",winsize.columns);
Packit a69f91
    return columns;
Packit a69f91
}
Packit a69f91
Packit a69f91
/*
Packit a69f91
 * separate copy of everything above - used for handling user stty requests
Packit a69f91
 */
Packit a69f91
Packit a69f91
int exp_win2_size_set(fd)
Packit a69f91
int fd;
Packit a69f91
{
Packit a69f91
#ifdef TIOCSWINSZ
Packit a69f91
			ioctl(fd,TIOCSWINSZ,&win2size);
Packit a69f91
#endif
Packit a69f91
#if defined(TIOCSSIZE) && !defined(TIOCSWINSZ)
Packit a69f91
			ioctl(fd,TIOCSSIZE,&win2size);
Packit a69f91
#endif
Packit a69f91
}
Packit a69f91
Packit a69f91
int exp_win2_size_get(fd)
Packit a69f91
int fd;
Packit a69f91
{
Packit a69f91
#ifdef TIOCGWINSZ
Packit a69f91
	ioctl(fd,TIOCGWINSZ,&win2size);
Packit a69f91
#endif
Packit a69f91
#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
Packit a69f91
	ioctl(fd,TIOCGSIZE,&win2size);
Packit a69f91
#endif
Packit a69f91
}
Packit a69f91
Packit a69f91
void
Packit a69f91
exp_win2_rows_set(fd,rows)
Packit a69f91
int fd;
Packit a69f91
char *rows;
Packit a69f91
{
Packit a69f91
	exp_win2_size_get(fd);
Packit a69f91
	win2size.rows = atoi(rows);
Packit a69f91
	exp_win2_size_set(fd);
Packit a69f91
}
Packit a69f91
Packit a69f91
char*
Packit a69f91
exp_win2_rows_get(fd)
Packit a69f91
int fd;
Packit a69f91
{
Packit a69f91
    static char rows [20];
Packit a69f91
	exp_win2_size_get(fd);
Packit a69f91
	sprintf(rows,"%d",win2size.rows);
Packit a69f91
#if !defined(EXP_WIN)
Packit a69f91
	win2size.rows = 0;
Packit a69f91
	win2size.columns = 0;
Packit a69f91
#endif
Packit a69f91
    return rows;
Packit a69f91
}
Packit a69f91
Packit a69f91
void
Packit a69f91
exp_win2_columns_set(fd,columns)
Packit a69f91
int fd;
Packit a69f91
char *columns;
Packit a69f91
{
Packit a69f91
	exp_win2_size_get(fd);
Packit a69f91
	win2size.columns = atoi(columns);
Packit a69f91
	exp_win2_size_set(fd);
Packit a69f91
}
Packit a69f91
Packit a69f91
char*
Packit a69f91
exp_win2_columns_get(fd)
Packit a69f91
int fd;
Packit a69f91
{
Packit a69f91
    static char columns [20];
Packit a69f91
	exp_win2_size_get(fd);
Packit a69f91
	sprintf(columns,"%d",win2size.columns);
Packit a69f91
    return columns;
Packit a69f91
}
Packit a69f91

Packit a69f91
/*
Packit a69f91
 * Local Variables:
Packit a69f91
 * mode: c
Packit a69f91
 * c-basic-offset: 4
Packit a69f91
 * fill-column: 78
Packit a69f91
 * End:
Packit a69f91
 */