1/* Copyright (c) 1993-2002
2 *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
3 *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
4 * Copyright (c) 1987 Oliver Laumann
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program (see the file COPYING); if not, write to the
18 * Free Software Foundation, Inc.,
19 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
20 *
21 ****************************************************************
22 * $Id: display.h,v 1.9 1994/05/31 12:31:54 mlschroe Exp $ FAU
23 */
24
25#ifdef MAPKEYS
26
27#define KMAP_KEYS (T_OCAPS-T_CAPS)
28#define KMAP_AKEYS (T_OCAPS-T_CURSOR)
29#define KMAP_EXT 50
30
31#define KMAP_NOTIMEOUT 0x4000
32
33struct kmap_ext
34{
35  char *str;
36  int fl;
37  struct action um;
38  struct action dm;
39  struct action mm;
40};
41
42#endif
43
44struct win;			/* forward declaration */
45
46struct canvas
47{
48  struct canvas   *c_next;	/* next canvas on display */
49  struct display  *c_display;	/* back pointer to display */
50  struct viewport *c_vplist;
51  struct layer    *c_layer;	/* layer on this canvas */
52  struct canvas   *c_lnext;	/* next canvas that displays layer */
53  struct layer     c_blank;	/* bottom layer, always blank */
54  int              c_xoff;	/* canvas x offset on display */
55  int              c_yoff;	/* canvas y offset on display */
56  int              c_xs;
57  int              c_xe;
58  int              c_ys;
59  int              c_ye;
60  struct event     c_captev;	/* caption changed event */
61};
62
63struct viewport
64{
65  struct viewport *v_next;	/* next vp on canvas */
66  struct canvas   *v_canvas;	/* back pointer to canvas */
67  int              v_xoff;	/* layer x offset on display */
68  int              v_yoff;	/* layer y offset on display */
69  int              v_xs;	/* vp upper left */
70  int              v_xe;	/* vp upper right */
71  int              v_ys;	/* vp lower left */
72  int              v_ye;	/* vp lower right */
73};
74
75struct display
76{
77  struct display *d_next;	/* linked list */
78  struct acluser *d_user;		/* user who owns that display */
79  struct canvas *d_cvlist;	/* the canvases of this display */
80  struct canvas *d_forecv;	/* current input focus */
81  void (*d_processinput) __P((char *, int));
82  char *d_processinputdata;	/* data for processinput */
83  int d_vpxmin, d_vpxmax;	/* min/max used position on display */
84  struct win *d_fore;		/* pointer to fore window */
85  struct win *d_other;		/* pointer to other window */
86  int   d_nonblock;		/* -1 don't block if obufmax reached */
87				/* >0: block after nonblock secs */
88  char  d_termname[20 + 1];	/* $TERM */
89  char	*d_tentry;		/* buffer for tgetstr */
90  char	d_tcinited;		/* termcap inited flag */
91  int	d_width, d_height;	/* width/height of the screen */
92  int	d_defwidth, d_defheight;	/* default width/height of windows */
93  int	d_top, d_bot;		/* scrollregion start/end */
94  int	d_x, d_y;		/* cursor position */
95  struct mchar d_rend;		/* current rendition */
96  int   d_col16change;		/* the 16col bits changed in attr */
97  char	d_atyp;			/* current attribute types */
98#ifdef DW_CHARS
99  int   d_mbcs;			/* saved char for multibytes charset */
100#endif
101#ifdef ENCODINGS
102  int   d_encoding;		/* what encoding type the display is */
103  int   d_decodestate;		/* state of our decoder */
104  int   d_realfont;		/* real font of terminal */
105#endif
106  int	d_insert;		/* insert mode flag */
107  int	d_keypad;		/* application keypad flag */
108  int	d_cursorkeys;		/* application cursorkeys flag */
109  int	d_revvid;		/* reverse video */
110  int	d_curvis;		/* cursor visibility */
111  int   d_has_hstatus;		/* display has hardstatus line */
112  int	d_hstatus;		/* hardstatus used */
113  int	d_lp_missing;		/* last character on bot line missing */
114  int   d_mouse;		/* mouse mode */
115#ifdef RXVT_OSC
116  int   d_xtermosc[4];		/* osc used */
117#endif
118  struct mchar d_lpchar;	/* missing char */
119  struct timeval d_status_time;	/* time of status display */
120  int   d_status;		/* is status displayed? */
121  char	d_status_bell;		/* is it only a vbell? */
122  int	d_status_len;		/* length of status line */
123  char *d_status_lastmsg;	/* last displayed message */
124  int   d_status_buflen;	/* last message buffer len */
125  int	d_status_lastx;		/* position of the cursor */
126  int	d_status_lasty;		/*   before status was displayed */
127  int   d_status_obuflen;	/* saved obuflen */
128  int   d_status_obuffree;	/* saved obuffree */
129  struct event d_statusev;	/* timeout event */
130  struct event d_hstatusev;	/* hstatus changed event */
131  int	d_kaablamm;		/* display kaablamm msg */
132  struct action *d_ESCseen;	/* Was the last char an ESC (^a) */
133  int	d_userpid;		/* pid of attacher */
134  char	d_usertty[MAXPATHLEN];	/* tty we are attached to */
135  int	d_userfd;		/* fd of the tty */
136  struct event d_readev;	/* userfd read event */
137  struct event d_writeev;	/* userfd write event */
138  struct event d_blockedev;	/* blocked timeout */
139  struct mode d_OldMode;	/* tty mode when screen was started */
140  struct mode d_NewMode;	/* New tty mode */
141  int	d_flow;			/* tty's flow control on/off flag*/
142  int   d_intrc;		/* current intr when flow is on */
143  char *d_obuf;			/* output buffer */
144  int   d_obuflen;		/* len of buffer */
145  int	d_obufmax;		/* len where we are blocking the pty */
146  int	d_obuflenmax;		/* len - max */
147  char *d_obufp;		/* pointer in buffer */
148  int   d_obuffree;		/* free bytes in buffer */
149#ifdef AUTO_NUKE
150  int	d_auto_nuke;		/* autonuke flag */
151#endif
152#ifdef MAPKEYS
153  int	d_nseqs;		/* number of valid mappings */
154  int	d_aseqs;		/* number of allocated mappings */
155  unsigned char  *d_kmaps;	/* keymaps */
156  unsigned char *d_seqp;	/* pointer into keymap array */
157  int	d_seql;			/* number of parsed chars */
158  unsigned char *d_seqh;	/* last hit */
159  struct event d_mapev;		/* timeout event */
160  int	d_dontmap;		/* do not map next */
161  int	d_mapdefault;		/* do map next to default */
162#endif
163  union	tcu d_tcs[T_N];		/* terminal capabilities */
164  char *d_attrtab[NATTR];	/* attrib emulation table */
165  char  d_attrtyp[NATTR];	/* attrib group table */
166  int   d_hascolor;		/* do we support color */
167  short	d_dospeed;		/* baudrate of tty */
168#ifdef FONT
169  char	d_c0_tab[256];		/* conversion for C0 */
170  char ***d_xtable;		/* char translation table */
171#endif
172  int	d_UPcost, d_DOcost, d_LEcost, d_NDcost;
173  int	d_CRcost, d_IMcost, d_EIcost, d_NLcost;
174  int   d_printfd;		/* fd for vt100 print sequence */
175#ifdef UTMPOK
176  slot_t d_loginslot;		/* offset, where utmp_logintty belongs */
177  struct utmp d_utmp_logintty;	/* here the original utmp structure is stored */
178  int   d_loginttymode;
179# ifdef _SEQUENT_
180  char	d_loginhost[100+1];
181# endif /* _SEQUENT_ */
182#endif
183  int   d_blocked;
184  int   d_blocked_fuzz;
185  struct event d_idleev;	/* screen blanker */
186#ifdef BLANKER_PRG
187  int   d_blankerpid;
188  struct event d_blankerev;
189#endif
190};
191
192#ifdef MULTI
193# define DISPLAY(x) display->x
194#else
195extern struct display TheDisplay;
196# define DISPLAY(x) TheDisplay.x
197#endif
198
199#define D_user		DISPLAY(d_user)
200#define D_username	(DISPLAY(d_user) ? DISPLAY(d_user)->u_name : 0)
201#define D_cvlist	DISPLAY(d_cvlist)
202#define D_forecv	DISPLAY(d_forecv)
203#define D_processinput	DISPLAY(d_processinput)
204#define D_processinputdata	DISPLAY(d_processinputdata)
205#define D_vpxmin	DISPLAY(d_vpxmin)
206#define D_vpxmax	DISPLAY(d_vpxmax)
207#define D_fore		DISPLAY(d_fore)
208#define D_other		DISPLAY(d_other)
209#define D_nonblock      DISPLAY(d_nonblock)
210#define D_termname	DISPLAY(d_termname)
211#define D_tentry	DISPLAY(d_tentry)
212#define D_tcinited	DISPLAY(d_tcinited)
213#define D_width		DISPLAY(d_width)
214#define D_height	DISPLAY(d_height)
215#define D_defwidth	DISPLAY(d_defwidth)
216#define D_defheight	DISPLAY(d_defheight)
217#define D_top		DISPLAY(d_top)
218#define D_bot		DISPLAY(d_bot)
219#define D_x		DISPLAY(d_x)
220#define D_y		DISPLAY(d_y)
221#define D_rend		DISPLAY(d_rend)
222#define D_col16change	DISPLAY(d_col16change)
223#define D_atyp		DISPLAY(d_atyp)
224#define D_mbcs		DISPLAY(d_mbcs)
225#define D_encoding	DISPLAY(d_encoding)
226#define D_decodestate	DISPLAY(d_decodestate)
227#define D_realfont	DISPLAY(d_realfont)
228#define D_insert	DISPLAY(d_insert)
229#define D_keypad	DISPLAY(d_keypad)
230#define D_cursorkeys	DISPLAY(d_cursorkeys)
231#define D_revvid	DISPLAY(d_revvid)
232#define D_curvis	DISPLAY(d_curvis)
233#define D_has_hstatus	DISPLAY(d_has_hstatus)
234#define D_hstatus	DISPLAY(d_hstatus)
235#define D_lp_missing	DISPLAY(d_lp_missing)
236#define D_mouse		DISPLAY(d_mouse)
237#define D_xtermosc	DISPLAY(d_xtermosc)
238#define D_lpchar	DISPLAY(d_lpchar)
239#define D_status	DISPLAY(d_status)
240#define D_status_time	DISPLAY(d_status_time)
241#define D_status_bell	DISPLAY(d_status_bell)
242#define D_status_len	DISPLAY(d_status_len)
243#define D_status_lastmsg	DISPLAY(d_status_lastmsg)
244#define D_status_buflen	DISPLAY(d_status_buflen)
245#define D_status_lastx	DISPLAY(d_status_lastx)
246#define D_status_lasty	DISPLAY(d_status_lasty)
247#define D_status_obuflen	DISPLAY(d_status_obuflen)
248#define D_status_obuffree	DISPLAY(d_status_obuffree)
249#define D_statusev	DISPLAY(d_statusev)
250#define D_hstatusev	DISPLAY(d_hstatusev)
251#define D_kaablamm	DISPLAY(d_kaablamm)
252#define D_ESCseen	DISPLAY(d_ESCseen)
253#define D_userpid	DISPLAY(d_userpid)
254#define D_usertty	DISPLAY(d_usertty)
255#define D_userfd	DISPLAY(d_userfd)
256#define D_OldMode	DISPLAY(d_OldMode)
257#define D_NewMode	DISPLAY(d_NewMode)
258#define D_flow		DISPLAY(d_flow)
259#define D_intr		DISPLAY(d_intr)
260#define D_obuf		DISPLAY(d_obuf)
261#define D_obuflen	DISPLAY(d_obuflen)
262#define D_obufmax	DISPLAY(d_obufmax)
263#define D_obuflenmax	DISPLAY(d_obuflenmax)
264#define D_obufp		DISPLAY(d_obufp)
265#define D_obuffree	DISPLAY(d_obuffree)
266#define D_auto_nuke	DISPLAY(d_auto_nuke)
267#define D_nseqs		DISPLAY(d_nseqs)
268#define D_aseqs		DISPLAY(d_aseqs)
269#define D_seqp		DISPLAY(d_seqp)
270#define D_seql		DISPLAY(d_seql)
271#define D_seqh		DISPLAY(d_seqh)
272#define D_dontmap	DISPLAY(d_dontmap)
273#define D_mapdefault	DISPLAY(d_mapdefault)
274#define D_kmaps		DISPLAY(d_kmaps)
275#define D_tcs		DISPLAY(d_tcs)
276#define D_attrtab	DISPLAY(d_attrtab)
277#define D_attrtyp	DISPLAY(d_attrtyp)
278#define D_hascolor	DISPLAY(d_hascolor)
279#define D_dospeed	DISPLAY(d_dospeed)
280#define D_c0_tab	DISPLAY(d_c0_tab)
281#define D_xtable	DISPLAY(d_xtable)
282#define D_UPcost	DISPLAY(d_UPcost)
283#define D_DOcost	DISPLAY(d_DOcost)
284#define D_LEcost	DISPLAY(d_LEcost)
285#define D_NDcost	DISPLAY(d_NDcost)
286#define D_CRcost	DISPLAY(d_CRcost)
287#define D_IMcost	DISPLAY(d_IMcost)
288#define D_EIcost	DISPLAY(d_EIcost)
289#define D_NLcost	DISPLAY(d_NLcost)
290#define D_printfd	DISPLAY(d_printfd)
291#define D_loginslot	DISPLAY(d_loginslot)
292#define D_utmp_logintty	DISPLAY(d_utmp_logintty)
293#define D_loginttymode	DISPLAY(d_loginttymode)
294#define D_loginhost	DISPLAY(d_loginhost)
295#define D_readev	DISPLAY(d_readev)
296#define D_writeev	DISPLAY(d_writeev)
297#define D_blockedev	DISPLAY(d_blockedev)
298#define D_mapev		DISPLAY(d_mapev)
299#define D_blocked	DISPLAY(d_blocked)
300#define D_blocked_fuzz	DISPLAY(d_blocked_fuzz)
301#define D_idleev	DISPLAY(d_idleev)
302#define D_blankerev	DISPLAY(d_blankerev)
303#define D_blankerpid	DISPLAY(d_blankerpid)
304
305
306#define GRAIN 4096	/* Allocation grain size for output buffer */
307#define OBUF_MAX 256	/* default for obuflimit */
308
309#define OUTPUT_BLOCK_SIZE 256  /* Block size of output to tty */
310
311#define AddChar(c)		\
312do				\
313  {				\
314    if (--D_obuffree <= 0)	\
315      Resize_obuf();		\
316    *D_obufp++ = (c);		\
317  }				\
318while (0)
319
320#define CV_CALL(cv, cmd)			\
321{						\
322  struct display *olddisplay = display;		\
323  struct layer *oldflayer = flayer;		\
324  struct layer *l = cv->c_layer;		\
325  struct canvas *cvlist = l->l_cvlist;		\
326  struct canvas *cvlnext = cv->c_lnext;		\
327  flayer = l;					\
328  l->l_cvlist = cv;				\
329  cv->c_lnext = 0;				\
330  cmd;						\
331  flayer = oldflayer;				\
332  l->l_cvlist = cvlist;				\
333  cv->c_lnext = cvlnext;			\
334  display = olddisplay;				\
335}
336
337#define STATUS_OFF	0
338#define STATUS_ON_WIN	1
339#define STATUS_ON_HS	2
340
341#define HSTATUS_IGNORE		0
342#define HSTATUS_LASTLINE	1
343#define HSTATUS_MESSAGE		2
344#define HSTATUS_HS		3
345#define HSTATUS_ALWAYS		(1<<2)
346