1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
|
/* Copyright (c) 2010
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Sadrul Habib Chowdhury (sadrul@users.sourceforge.net)
* Copyright (c) 2008, 2009
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
* Micah Cowan (micah@cowan.name)
* Sadrul Habib Chowdhury (sadrul@users.sourceforge.net)
* Copyright (c) 1993-2002, 2003, 2005, 2006, 2007
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
* Copyright (c) 1987 Oliver Laumann
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see the file COPYING); if not, see
* http://www.gnu.org/licenses/, or contact Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*
****************************************************************
* $Id$ GNU
*/
#ifndef SCREEN_WINDOW_H
#define SCREEN_WINDOW_H
/* keep this in sync with the initialisations in window.c */
struct NewWindow
{
int StartAt; /* where to start the search for the slot */
char *aka; /* aka string */
char **args; /* argv vector */
char *dir; /* directory for chdir */
char *term; /* TERM to be set instead of "screen" */
int aflag;
int dynamicaka;
int flowflag;
int lflag;
int histheight;
int monitor;
int wlock; /* default writelock setting */
int silence;
int wrap;
int Lflag; /* logging */
int slow; /* inter character milliseconds */
int gr;
int c1;
int bce;
int encoding;
char *hstatus;
char *charset;
int poll_zombie_timeout;
};
#ifdef PSEUDOS
struct pseudowin
{
int p_fdpat;
int p_pid;
int p_ptyfd;
struct event p_readev;
struct event p_writeev;
char p_cmd[MAXSTR];
char p_tty[MAXSTR];
char p_inbuf[IOSIZE]; /* buffered writing to p_ptyfd */
int p_inlen;
};
/* bits for fdpat: */
#define F_PMASK 0x0003
#define F_PSHIFT 2
#define F_PFRONT 0x0001 /* . */
#define F_PBACK 0x0002 /* ! */
#define F_PBOTH (F_PFRONT | F_PBACK) /* : */
#define F_UWP 0x1000 /* | */
/* The screen process ...)
* ... wants to write to pseudo */
#define W_WP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_PFRONT))
/* ... wants to write to window: user writes to window
* or stdout/stderr of pseudo are duplicated to window */
#define W_WW(w) (!((w)->w_pwin) || \
(((w)->w_pwin->p_fdpat & F_PMASK) == F_PBACK) || \
((((w)->w_pwin->p_fdpat >> F_PSHIFT) & F_PMASK) == F_PBOTH) || \
((((w)->w_pwin->p_fdpat >> (F_PSHIFT * 2)) & F_PMASK) == F_PBOTH))
/* ... wants to read from pseudowin */
#define W_RP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & \
((F_PFRONT << (F_PSHIFT * 2)) | (F_PFRONT << F_PSHIFT)) ))
/* ... wants to read from window */
#define W_RW(w) (!((w)->w_pwin) || ((w)->w_pwin->p_fdpat & F_PFRONT))
/* user input is written to pseudo */
#define W_UWP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_UWP))
/* pseudo output has to be stuffed in window */
#define W_PTOW(w) (\
((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT) == F_PBOTH << F_PSHIFT || \
((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT * 2) == F_PBOTH << F_PSHIFT * 2 )
/* window output has to be stuffed in pseudo */
#define W_WTOP(w) (((w)->w_pwin->p_fdpat & F_PMASK) == F_PBOTH)
#endif /* PSEUDOS */
/* definitions for wlocktype */
#define WLOCK_OFF 0 /* all in w_userbits can write */
#define WLOCK_AUTO 1 /* who selects first, can write */
#define WLOCK_ON 2 /* user writes even if deselected */
#ifdef COPY_PASTE
struct paster
{
char *pa_pastebuf; /* this gets pasted in the window */
char *pa_pasteptr; /* pointer in pastebuf */
int pa_pastelen; /* bytes left to paste */
struct layer *pa_pastelayer; /* layer to paste into */
struct event pa_slowev; /* slowpaste event */
};
#else
struct paster;
#endif
struct win
{
struct win *w_next; /* next window */
int w_type; /* type of window */
void *w_data;
struct layer w_layer; /* our layer */
struct layer *w_savelayer; /* the layer to keep */
int w_blocked; /* block input */
#ifdef PSEUDOS
struct pseudowin *w_pwin; /* ptr to pseudo */
#endif
struct display *w_pdisplay; /* display for printer relay */
struct display *w_lastdisp; /* where the last input was made */
int w_number; /* window number */
struct event w_readev;
struct event w_writeev;
struct event w_silenceev; /* silence event */
struct event w_zombieev; /* event to try to resurrect window */
int w_poll_zombie_timeout;
int w_ptyfd; /* fd of the master pty */
char w_inbuf[IOSIZE];
int w_inlen;
char w_outbuf[IOSIZE];
int w_outlen;
int w_aflag; /* (-a option) */
int w_dynamicaka; /* should we change name */
char *w_title; /* name of the window */
char *w_akachange; /* autoaka hack */
char w_akabuf[MAXSTR]; /* aka buffer */
int w_autoaka; /* autoaka hack */
struct win *w_group; /* window group we belong to */
int w_intermediate; /* char used while parsing ESC-seq */
int w_args[MAXARGS]; /* emulator args */
int w_NumArgs;
#ifdef MULTIUSER
int w_wlock; /* WLOCK_AUTO, WLOCK_OFF, WLOCK_ON */
struct acluser *w_wlockuser; /* NULL when unlocked or user who writes */
AclBits w_userbits[ACL_BITS_PER_WIN];
AclBits w_lio_notify; /* whom to tell when lastio+seconds < time() */
AclBits w_mon_notify; /* whom to tell monitor statis */
#endif
enum state_t w_state; /* parser state */
enum string_t w_StringType;
struct mline *w_mlines;
struct mchar w_rend; /* current rendition */
#ifdef FONT
char w_FontL; /* character font GL */
char w_FontR; /* character font GR */
# ifdef ENCODINGS
char w_FontE; /* character font GR locked */
# endif
int w_Charset; /* charset number GL */
int w_CharsetR; /* charset number GR */
int w_charsets[4]; /* Font = charsets[Charset] */
#endif
int w_ss;
struct cursor {
int on;
int x, y;
struct mchar Rend;
#ifdef FONT
int Charset;
int CharsetR;
int Charsets[4];
#endif
} w_saved;
int w_top, w_bot; /* scrollregion */
int w_wrap; /* autowrap */
int w_origin; /* origin mode */
int w_insert; /* window is in insert mode */
int w_keypad; /* keypad mode */
int w_cursorkeys; /* appl. cursorkeys mode */
int w_revvid; /* reverse video */
int w_curinv; /* cursor invisible */
int w_curvvis; /* cursor very visible */
int w_autolf; /* automatic linefeed */
char *w_hstatus; /* hardstatus line */
int w_gr; /* enable GR flag */
int w_c1; /* enable C1 flag */
int w_bce; /* enable backcol erase */
#if 0
int w_encoding; /* for input and paste */
#endif
int w_decodestate; /* state of our input decoder */
#ifdef DW_CHARS
int w_mbcs; /* saved char for multibytes charset */
#endif
char w_string[MAXSTR];
char *w_stringp;
char *w_tabs; /* line with tabs */
int w_bell; /* bell status of this window */
int w_flow; /* flow flags */
struct logfile *w_log; /* log to file */
int w_logsilence; /* silence in secs */
int w_monitor; /* monitor status */
int w_silencewait; /* wait for silencewait secs */
int w_silence; /* silence status (Lloyd Zusman) */
char w_vbwait;
char w_norefresh; /* dont redisplay when switching to that win */
#ifdef RXVT_OSC
char w_xtermosc[4][MAXSTR]; /* special xterm/rxvt escapes */
#endif
int w_mouse; /* mouse mode 0,9,1000 */
#ifdef HAVE_BRAILLE
int w_bd_x, w_bd_y; /* Braille cursor position */
#endif
#ifdef COPY_PASTE
int w_slowpaste; /* do careful writes to the window */
int w_histheight; /* all histbases are malloced with width * histheight */
int w_histidx; /* 0 <= histidx < histheight; where we insert lines */
int w_scrollback_height; /* number of lines of output stored, to be updated with w_histidx, w_histheight */
struct mline *w_hlines; /* history buffer */
struct paster w_paster; /* paste info */
#else
int w_histheight; /* always 0 */
#endif
int w_pid; /* process at the other end of ptyfd */
int w_deadpid; /* saved w_pid of a process that closed the ptyfd to us */
char *w_cmdargs[MAXARGS]; /* command line argument vector */
char *w_dir; /* directory for chdir */
char *w_term; /* TERM to be set instead of "screen" */
int w_lflag; /* login flag */
slot_t w_slot; /* utmp slot */
#if defined (UTMPOK)
struct utmp w_savut; /* utmp entry of this window */
#endif
char w_tty[MAXSTR];
int w_zauto;
#ifdef ZMODEM
struct display *w_zdisplay;
#endif
#ifdef BUILTIN_TELNET
struct sockaddr_storage w_telsa;
char w_telbuf[IOSIZE];
int w_telbufl;
char w_telmopts[256];
char w_telropts[256];
int w_telstate;
char w_telsubbuf[128];
int w_telsubidx;
struct event w_telconnev;
#endif
struct {
int on; /* Is the alternate buffer currently being used? */
struct mline *mlines;
int width;
int height;
#ifdef COPY_PASTE
int histheight;
struct mline *hlines;
int histidx;
#else
int histheight; /* 0 */
#endif
struct cursor cursor;
} w_alt;
struct event w_destroyev; /* window destroy event */
#ifdef BSDWAIT
union wait w_exitstatus; /* window exit status */
#else
int w_exitstatus;
#endif
};
#define w_encoding w_layer.l_encoding
#define w_width w_layer.l_width
#define w_height w_layer.l_height
#define w_x w_layer.l_x
#define w_y w_layer.l_y
/* definitions for w_type */
#define W_TYPE_PTY 0
#define W_TYPE_PLAIN 1
#define W_TYPE_TELNET 2
#define W_TYPE_GROUP 3
/*
* Definitions for flow
* 000 -(-) flow off, auto would be off
* 001 +(-) flow on , auto would be off
* 010 -(+) flow off, auto would be on
* 011 +(+) flow on , auto would be on
* 100 - flow auto, currently off
* 111 + flow auto, currently on
* Application controls auto_flow via TIOCPKT, if available,
* else via application keypad mode.
*/
#define FLOW_NOW (1<<0)
#define FLOW_AUTO (1<<1)
#define FLOW_AUTOFLAG (1<<2)
/*
* WIN gives us a reference to line y of the *whole* image
* where line 0 is the oldest line in our history.
* y must be in whole image coordinate system, not in display.
*/
#define WIN(y) ((y < fore->w_histheight) ? \
&fore->w_hlines[(fore->w_histidx + y) % fore->w_histheight] \
: &fore->w_mlines[y - fore->w_histheight])
#define Layer2Window(l) ((struct win *)(l)->l_bottom->l_data)
int WindowChangeNumber __P((int, int));
#endif /* SCREEN_WINDOW_H */
|