119304Speter/*-
219304Speter * Copyright (c) 1993, 1994
319304Speter *	The Regents of the University of California.  All rights reserved.
419304Speter * Copyright (c) 1993, 1994, 1995, 1996
519304Speter *	Keith Bostic.  All rights reserved.
619304Speter *
719304Speter * See the LICENSE file for redistribution information.
819304Speter *
9254225Speter *	$Id: gs.h,v 11.0 2012/10/17 06:34:37 zy Exp $
1019304Speter */
1119304Speter
1219304Speter#define	TEMPORARY_FILE_STRING	"/tmp"	/* Default temporary file name. */
1319304Speter
14254225Speter#include <nl_types.h>
15254225Speter
1619304Speter/*
1719304Speter * File reference structure (FREF).  The structure contains the name of the
1819304Speter * file, along with the information that follows the name.
1919304Speter *
2019304Speter * !!!
2119304Speter * The read-only bit follows the file name, not the file itself.
2219304Speter */
2319304Speterstruct _fref {
24254225Speter	TAILQ_ENTRY(_fref) q;		/* Linked list of file references. */
2519304Speter	char	*name;			/* File name. */
2619304Speter	char	*tname;			/* Backing temporary file name. */
2719304Speter
2819304Speter	recno_t	 lno;			/* 1-N: file cursor line. */
2919304Speter	size_t	 cno;			/* 0-N: file cursor column. */
3019304Speter
3119304Speter#define	FR_CURSORSET	0x0001		/* If lno/cno values valid. */
3219304Speter#define	FR_DONTDELETE	0x0002		/* Don't delete the temporary file. */
3319304Speter#define	FR_EXNAMED	0x0004		/* Read/write renamed the file. */
3419304Speter#define	FR_NAMECHANGE	0x0008		/* If the name changed. */
3519304Speter#define	FR_NEWFILE	0x0010		/* File doesn't really exist yet. */
3619304Speter#define	FR_RECOVER	0x0020		/* File is being recovered. */
3719304Speter#define	FR_TMPEXIT	0x0040		/* Modified temporary file, no exit. */
3819304Speter#define	FR_TMPFILE	0x0080		/* If file has no name. */
3919304Speter#define	FR_UNLOCKED	0x0100		/* File couldn't be locked. */
4019304Speter	u_int16_t flags;
4119304Speter};
4219304Speter
4319304Speter/* Action arguments to scr_exadjust(). */
4419304Spetertypedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t;
4519304Speter
4619304Speter/* Screen attribute arguments to scr_attr(). */
4719304Spetertypedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t;
4819304Speter
4919304Speter/* Key type arguments to scr_keyval(). */
5019304Spetertypedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t;
5119304Speter
5219304Speter/*
5319304Speter * GS:
5419304Speter *
5519304Speter * Structure that describes global state of the running program.
5619304Speter */
5719304Speterstruct _gs {
5819304Speter	char	*progname;		/* Programe name. */
5919304Speter
6019304Speter	int	 id;			/* Last allocated screen id. */
61254225Speter	TAILQ_HEAD(_dqh, _scr) dq[1];	/* Displayed screens. */
62254225Speter	TAILQ_HEAD(_hqh, _scr) hq[1];	/* Hidden screens. */
6319304Speter
6419304Speter	SCR	*ccl_sp;		/* Colon command-line screen. */
6519304Speter
6619304Speter	void	*cl_private;		/* Curses support private area. */
6719304Speter
6819304Speter					/* File references. */
69254225Speter	TAILQ_HEAD(_frefh, _fref) frefq[1];
7019304Speter
7119304Speter#define	GO_COLUMNS	0		/* Global options: columns. */
7219304Speter#define	GO_LINES	1		/* Global options: lines. */
7319304Speter#define	GO_SECURE	2		/* Global options: secure. */
7419304Speter#define	GO_TERM		3		/* Global options: terminal type. */
7519304Speter	OPTION	 opts[GO_TERM + 1];
7619304Speter
77254225Speter	nl_catd	 catd;			/* Message catalog descriptor. */
78254225Speter	MSGH	 msgq[1];		/* User message list. */
7919304Speter#define	DEFAULT_NOPRINT	'\1'		/* Emergency non-printable character. */
80254225Speter	int	 noprint;		/* Cached, unprintable character. */
8119304Speter
8219304Speter	char	*tmp_bp;		/* Temporary buffer. */
8319304Speter	size_t	 tmp_blen;		/* Temporary buffer size. */
8419304Speter
8519304Speter	/*
8619304Speter	 * Ex command structures (EXCMD).  Defined here because ex commands
8719304Speter	 * exist outside of any particular screen or file.
8819304Speter	 */
89254225Speter#define	EXCMD_RUNNING(gp)	(SLIST_FIRST((gp)->ecq)->clen != 0)
90254225Speter					/* Ex command linked list. */
91254225Speter	SLIST_HEAD(_excmdh, _excmd) ecq[1];
9219304Speter	EXCMD	 excmd;			/* Default ex command structure. */
9319304Speter	char	 *if_name;		/* Current associated file. */
9419304Speter	recno_t	  if_lno;		/* Current associated line number. */
9519304Speter
9619304Speter	char	*c_option;		/* Ex initial, command-line command. */
9719304Speter
9819304Speter#ifdef DEBUG
9919304Speter	FILE	*tracefp;		/* Trace file pointer. */
10019304Speter#endif
10119304Speter
10219304Speter	EVENT	*i_event;		/* Array of input events. */
10319304Speter	size_t	 i_nelem;		/* Number of array elements. */
10419304Speter	size_t	 i_cnt;			/* Count of events. */
10519304Speter	size_t	 i_next;		/* Offset of next event. */
10619304Speter
10719304Speter	CB	*dcbp;			/* Default cut buffer pointer. */
10819304Speter	CB	 dcb_store;		/* Default cut buffer storage. */
109254225Speter	SLIST_HEAD(_cuth, _cb) cutq[1];	/* Linked list of cut buffers. */
11019304Speter
111254225Speter#define	MAX_BIT_SEQ	0x7f		/* Max + 1 fast check character. */
112254225Speter	SLIST_HEAD(_seqh, _seq) seqq[1];/* Linked list of maps, abbrevs. */
113254225Speter	bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1);
11419304Speter
115254225Speter#define	MAX_FAST_KEY	0xff		/* Max fast check character.*/
11619304Speter#define	KEY_LEN(sp, ch)							\
117254225Speter	(((ch) & ~MAX_FAST_KEY) == 0 ?					\
11819304Speter	    sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
11919304Speter#define	KEY_NAME(sp, ch)						\
120254225Speter	(((ch) & ~MAX_FAST_KEY) == 0 ?					\
12119304Speter	    sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
12219304Speter	struct {
123254225Speter		char	 name[MAX_CHARACTER_COLUMNS + 1];
12419304Speter		u_int8_t len;
12519304Speter	} cname[MAX_FAST_KEY + 1];	/* Fast lookup table. */
12619304Speter
12719304Speter#define	KEY_VAL(sp, ch)							\
128254225Speter	(((ch) & ~MAX_FAST_KEY) == 0 ? 					\
129254225Speter	    sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch))
130254225Speter	e_key_t				/* Fast lookup table. */
13119304Speter	    special_key[MAX_FAST_KEY + 1];
13219304Speter
13319304Speter/* Flags. */
13419304Speter#define	G_ABBREV	0x0001		/* If have abbreviations. */
13519304Speter#define	G_BELLSCHED	0x0002		/* Bell scheduled. */
13619304Speter#define	G_INTERRUPTED	0x0004		/* Interrupted. */
13719304Speter#define	G_RECOVER_SET	0x0008		/* Recover system initialized. */
13819304Speter#define	G_SCRIPTED	0x0010		/* Ex script session. */
13919304Speter#define	G_SCRWIN	0x0020		/* Scripting windows running. */
14019304Speter#define	G_SNAPSHOT	0x0040		/* Always snapshot files. */
14119304Speter#define	G_SRESTART	0x0080		/* Screen restarted. */
14219304Speter#define	G_TMP_INUSE	0x0100		/* Temporary buffer in use. */
14319304Speter	u_int32_t flags;
14419304Speter
14519304Speter	/* Screen interface functions. */
14619304Speter					/* Add a string to the screen. */
147281373Sbapt	int	(*scr_addstr)(SCR *, const char *, size_t);
148254225Speter					/* Add a string to the screen. */
149281373Sbapt	int	(*scr_waddstr)(SCR *, const CHAR_T *, size_t);
15019304Speter					/* Toggle a screen attribute. */
151281373Sbapt	int	(*scr_attr)(SCR *, scr_attr_t, int);
15219304Speter					/* Terminal baud rate. */
153281373Sbapt	int	(*scr_baud)(SCR *, u_long *);
15419304Speter					/* Beep/bell/flash the terminal. */
155281373Sbapt	int	(*scr_bell)(SCR *);
15619304Speter					/* Display a busy message. */
157281373Sbapt	void	(*scr_busy)(SCR *, const char *, busy_t);
158254225Speter					/* Prepare child. */
159281373Sbapt	int	(*scr_child)(SCR *);
16019304Speter					/* Clear to the end of the line. */
161281373Sbapt	int	(*scr_clrtoeol)(SCR *);
16219304Speter					/* Return the cursor location. */
163281373Sbapt	int	(*scr_cursor)(SCR *, size_t *, size_t *);
16419304Speter					/* Delete a line. */
165281373Sbapt	int	(*scr_deleteln)(SCR *);
166254225Speter					/* Discard a screen. */
167281373Sbapt	int	(*scr_discard)(SCR *, SCR **);
16819304Speter					/* Get a keyboard event. */
169281373Sbapt	int	(*scr_event)(SCR *, EVENT *, u_int32_t, int);
17019304Speter					/* Ex: screen adjustment routine. */
171281373Sbapt	int	(*scr_ex_adjust)(SCR *, exadj_t);
17219304Speter	int	(*scr_fmap)		/* Set a function key. */
173281373Sbapt	   (SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t);
17419304Speter					/* Get terminal key value. */
175281373Sbapt	int	(*scr_keyval)(SCR *, scr_keyval_t, CHAR_T *, int *);
17619304Speter					/* Insert a line. */
177281373Sbapt	int	(*scr_insertln)(SCR *);
17819304Speter					/* Handle an option change. */
179281373Sbapt	int	(*scr_optchange)(SCR *, int, char *, u_long *);
18019304Speter					/* Move the cursor. */
181281373Sbapt	int	(*scr_move)(SCR *, size_t, size_t);
18219304Speter					/* Message or ex output. */
183281373Sbapt	void	(*scr_msg)(SCR *, mtype_t, char *, size_t);
18419304Speter					/* Refresh the screen. */
185281373Sbapt	int	(*scr_refresh)(SCR *, int);
18619304Speter					/* Rename the file. */
187281373Sbapt	int	(*scr_rename)(SCR *, char *, int);
188254225Speter					/* Reply to an event. */
189281373Sbapt	int	(*scr_reply)(SCR *, int, char *);
19019304Speter					/* Set the screen type. */
191281373Sbapt	int	(*scr_screen)(SCR *, u_int32_t);
192254225Speter					/* Split the screen. */
193281373Sbapt	int	(*scr_split)(SCR *, SCR *);
19419304Speter					/* Suspend the editor. */
195281373Sbapt	int	(*scr_suspend)(SCR *, int *);
19619304Speter					/* Print usage message. */
197281373Sbapt	void	(*scr_usage)(void);
19819304Speter};
199