|
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 |
*/
|