summaryrefslogtreecommitdiffstats
path: root/window.h
blob: 2d7e0f5f5321863e8f9676f0d28e41fc293489d1 (plain)
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
356
357
/* 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
 * https://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[5][2560];	/* special xterm/rxvt escapes */
#endif
  int    w_mouse;		/* mouse mode 0,9,1000 */
  int    w_extmouse;		/* extended mouse mode 0,1006 */
#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));
int OpenDevice __P((char **, int, int *, char **));

#endif /* SCREEN_WINDOW_H */