1/* exp_win.c - window support
2
3Written by: Don Libes, NIST, 10/25/93
4
5This file is in the public domain.  However, the author and NIST
6would appreciate credit if you use this file or parts of it.
7
8*/
9
10#include "expect_cf.h"
11#include "tcl.h"
12
13#ifdef NO_STDLIB_H
14#include "../compat/stdlib.h"
15#else
16#include <stdlib.h>
17#endif
18
19/* _IBCS2 required on some Intel platforms to allow the include files */
20/* to produce a definition for winsize. */
21#define _IBCS2 1
22
23/*
24 * get everyone's window size definitions
25 *
26note that this is tricky because (of course) everyone puts them in
27different places.  Worse, on some systems, some .h files conflict
28and cannot both be included even though both exist.  This is the
29case, for example, on SunOS 4.1.3 using gcc where termios.h
30conflicts with sys/ioctl.h
31 */
32
33#ifdef HAVE_TERMIOS
34#  include <termios.h>
35#else
36#  include <sys/ioctl.h>
37#endif
38
39/* Sigh.  On AIX 2.3, termios.h exists but does not define TIOCGWINSZ */
40/* Instead, it has to come from ioctl.h.  However, As I said above, this */
41/* can't be cavalierly included on all machines, even when it exists. */
42#if defined(HAVE_TERMIOS) && !defined(HAVE_TIOCGWINSZ_IN_TERMIOS_H)
43#  include <sys/ioctl.h>
44#endif
45
46/* SCO defines window size structure in PTEM and TIOCGWINSZ in termio.h */
47/* Sigh... */
48#if defined(HAVE_SYS_PTEM_H)
49#   include <sys/types.h>   /* for stream.h's caddr_t */
50#   include <sys/stream.h>  /* for ptem.h's mblk_t */
51#   include <sys/ptem.h>
52#endif /* HAVE_SYS_PTEM_H */
53
54#include "exp_tty_in.h"
55#include "exp_win.h"
56
57#ifdef TIOCGWINSZ
58typedef struct winsize exp_winsize;
59#define columns ws_col
60#define rows ws_row
61#define EXP_WIN
62#endif
63
64#if !defined(EXP_WIN) && defined(TIOCGSIZE)
65typedef struct ttysize exp_winsize;
66#define columns ts_cols
67#define rows ts_lines
68#define EXP_WIN
69#endif
70
71#if !defined(EXP_WIN)
72typedef struct {
73	int columns;
74	int rows;
75} exp_winsize;
76#endif
77
78static exp_winsize winsize = {0, 0};
79static exp_winsize win2size = {0, 0};
80
81int exp_window_size_set(fd)
82int fd;
83{
84#ifdef TIOCSWINSZ
85	ioctl(fd,TIOCSWINSZ,&winsize);
86#endif
87#if defined(TIOCSSIZE) && !defined(TIOCSWINSZ)
88	ioctl(fd,TIOCSSIZE,&winsize);
89#endif
90}
91
92int exp_window_size_get(fd)
93int fd;
94{
95#ifdef TIOCGWINSZ
96	ioctl(fd,TIOCGWINSZ,&winsize);
97#endif
98#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
99	ioctl(fd,TIOCGSIZE,&winsize);
100#endif
101#if !defined(EXP_WIN)
102	winsize.rows = 0;
103	winsize.columns = 0;
104#endif
105}
106
107void
108exp_win_rows_set(rows)
109char *rows;
110{
111	winsize.rows = atoi(rows);
112	exp_window_size_set(exp_dev_tty);
113}
114
115char*
116exp_win_rows_get()
117{
118    static char rows [20];
119	exp_window_size_get(exp_dev_tty);
120	sprintf(rows,"%d",winsize.rows);
121    return rows;
122}
123
124void
125exp_win_columns_set(columns)
126char *columns;
127{
128	winsize.columns = atoi(columns);
129	exp_window_size_set(exp_dev_tty);
130}
131
132char*
133exp_win_columns_get()
134{
135    static char columns [20];
136	exp_window_size_get(exp_dev_tty);
137	sprintf(columns,"%d",winsize.columns);
138    return columns;
139}
140
141/*
142 * separate copy of everything above - used for handling user stty requests
143 */
144
145int exp_win2_size_set(fd)
146int fd;
147{
148#ifdef TIOCSWINSZ
149			ioctl(fd,TIOCSWINSZ,&win2size);
150#endif
151#if defined(TIOCSSIZE) && !defined(TIOCSWINSZ)
152			ioctl(fd,TIOCSSIZE,&win2size);
153#endif
154}
155
156int exp_win2_size_get(fd)
157int fd;
158{
159#ifdef TIOCGWINSZ
160	ioctl(fd,TIOCGWINSZ,&win2size);
161#endif
162#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
163	ioctl(fd,TIOCGSIZE,&win2size);
164#endif
165}
166
167void
168exp_win2_rows_set(fd,rows)
169int fd;
170char *rows;
171{
172	exp_win2_size_get(fd);
173	win2size.rows = atoi(rows);
174	exp_win2_size_set(fd);
175}
176
177char*
178exp_win2_rows_get(fd)
179int fd;
180{
181    static char rows [20];
182	exp_win2_size_get(fd);
183	sprintf(rows,"%d",win2size.rows);
184#if !defined(EXP_WIN)
185	win2size.rows = 0;
186	win2size.columns = 0;
187#endif
188    return rows;
189}
190
191void
192exp_win2_columns_set(fd,columns)
193int fd;
194char *columns;
195{
196	exp_win2_size_get(fd);
197	win2size.columns = atoi(columns);
198	exp_win2_size_set(fd);
199}
200
201char*
202exp_win2_columns_get(fd)
203int fd;
204{
205    static char columns [20];
206	exp_win2_size_get(fd);
207	sprintf(columns,"%d",win2size.columns);
208    return columns;
209}
210
211/*
212 * Local Variables:
213 * mode: c
214 * c-basic-offset: 4
215 * fill-column: 78
216 * End:
217 */
218