1/*	$NetBSD: gs.h,v 1.4 2018/08/07 08:05:47 rin Exp $ */
2/*-
3 * Copyright (c) 1993, 1994
4 *	The Regents of the University of California.  All rights reserved.
5 * Copyright (c) 1993, 1994, 1995, 1996
6 *	Keith Bostic.  All rights reserved.
7 *
8 * See the LICENSE file for redistribution information.
9 *
10 *	Id: gs.h,v 10.55 2001/11/01 10:28:25 skimo Exp  (Berkeley) Date: 2001/11/01 10:28:25
11 */
12
13#define	TEMPORARY_FILE_STRING	"/tmp"	/* Default temporary file name. */
14
15/*
16 * File reference structure (FREF).  The structure contains the name of the
17 * file, along with the information that follows the name.
18 *
19 * !!!
20 * The read-only bit follows the file name, not the file itself.
21 */
22struct _fref {
23	TAILQ_ENTRY(_fref) q;		/* Linked list of file references. */
24	char	*name;			/* File name. */
25	char	*tname;			/* Backing temporary file name. */
26
27	db_recno_t	 lno;			/* 1-N: file cursor line. */
28	size_t	 cno;			/* 0-N: file cursor column. */
29
30#define	FR_CURSORSET	0x0001		/* If lno/cno values valid. */
31#define	FR_DONTDELETE	0x0002		/* Don't delete the temporary file. */
32#define	FR_EXNAMED	0x0004		/* Read/write renamed the file. */
33#define	FR_NAMECHANGE	0x0008		/* If the name changed. */
34#define	FR_NEWFILE	0x0010		/* File doesn't really exist yet. */
35#define	FR_RECOVER	0x0020		/* File is being recovered. */
36#define	FR_TMPEXIT	0x0040		/* Modified temporary file, no exit. */
37#define	FR_TMPFILE	0x0080		/* If file has no name. */
38#define	FR_UNLOCKED	0x0100		/* File couldn't be locked. */
39	u_int16_t flags;
40};
41
42/* Action arguments to scr_exadjust(). */
43typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t;
44
45/* Screen attribute arguments to scr_attr(). */
46typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t;
47
48#ifdef IMCTRL
49/* Input method control arguments to scr_imctrl(). */
50typedef enum { IMCTRL_INIT, IMCTRL_OFF, IMCTRL_ON } imctrl_t;
51#endif
52
53/* Key type arguments to scr_keyval(). */
54typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t;
55
56/*
57 * GS:
58 *
59 * Structure that describes global state of the running program.
60 */
61struct _gs {
62	char	*progname;		/* Programe name. */
63
64	int	 id;			/* Last allocated screen id. */
65	TAILQ_HEAD(_dqh, _win) dq;	/* Displayed windows. */
66	TAILQ_HEAD(_hqh, _scr) hq;	/* Hidden screens. */
67
68	void	*perl_interp;		/* Perl interpreter. */
69	void	*tcl_interp;		/* Tcl_Interp *: Tcl interpreter. */
70
71	void	*cl_private;		/* Curses support private area. */
72	void	*tk_private;		/* Tk/Tcl support private area. */
73
74					/* File references. */
75	TAILQ_HEAD(_frefh, _fref) frefq;
76 					/* File structures. */
77 	TAILQ_HEAD(_exfh, _exf) exfq;
78
79#define	GO_COLUMNS	0		/* Global options: columns. */
80#define	GO_LINES	1		/* Global options: lines. */
81#define	GO_SECURE	2		/* Global options: secure. */
82#define	GO_TERM		3		/* Global options: terminal type. */
83	OPTION	 opts[GO_TERM + 1];
84
85	DB	*msg;			/* Message catalog DB. */
86	MSGH	 msgq;			/* User message list. */
87#define	DEFAULT_NOPRINT	'\1'		/* Emergency non-printable character. */
88	int	 noprint;		/* Cached, unprintable character. */
89
90	char	*c_option;		/* Ex initial, command-line command. */
91
92#ifdef DEBUG
93	FILE	*tracefp;		/* Trace file pointer. */
94#endif
95
96#define	MAX_BIT_SEQ	0x7f		/* Max + 1 fast check character. */
97	LIST_HEAD(_seqh, _seq) seqq;	/* Linked list of maps, abbrevs. */
98	bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1);
99
100#define	MAX_FAST_KEY	0xff		/* Max fast check character.*/
101#define	KEY_LEN(sp, ch)							\
102	(((ch) & ~MAX_FAST_KEY) == 0 ?					\
103	    sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
104#define	KEY_NAME(sp, ch)						\
105	(((ch) & ~MAX_FAST_KEY) == 0 ?					\
106	    sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
107	struct {
108		u_char	 name[MAX_CHARACTER_COLUMNS + 1];
109		u_int8_t len;
110	} cname[MAX_FAST_KEY + 1];	/* Fast lookup table. */
111
112#define	KEY_VAL(sp, ch)							\
113	(((ch) & ~MAX_FAST_KEY) == 0 ? 					\
114	    sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch))
115	e_key_t				/* Fast lookup table. */
116	    special_key[MAX_FAST_KEY + 1];
117
118/* Flags. */
119#define	G_ABBREV	0x0001		/* If have abbreviations. */
120#define	G_BELLSCHED	0x0002		/* Bell scheduled. */
121#define	G_INTERRUPTED	0x0004		/* Interrupted. */
122#define	G_RECOVER_SET	0x0008		/* Recover system initialized. */
123#define	G_SCRIPTED	0x0010		/* Ex script session. */
124#define	G_SCRWIN	0x0020		/* Scripting windows running. */
125#define	G_SNAPSHOT	0x0040		/* Always snapshot files. */
126#define	G_SRESTART	0x0080		/* Screen restarted. */
127	u_int32_t flags;
128
129	/* Screen interface functions. */
130					/* Add a string to the screen. */
131	int	(*scr_addstr) __P((SCR *, const char *, size_t));
132					/* Add a string to the screen. */
133	int	(*scr_waddstr) __P((SCR *, const CHAR_T *, size_t));
134					/* Toggle a screen attribute. */
135	int	(*scr_attr) __P((SCR *, scr_attr_t, int));
136					/* Terminal baud rate. */
137	int	(*scr_baud) __P((SCR *, u_long *));
138					/* Beep/bell/flash the terminal. */
139	int	(*scr_bell) __P((SCR *));
140					/* Display a busy message. */
141	void	(*scr_busy) __P((SCR *, const char *, busy_t));
142					/* Prepare child. */
143	int	(*scr_child) __P((SCR *));
144					/* Clear to the end of the line. */
145	int	(*scr_clrtoeol) __P((SCR *));
146					/* Return the cursor location. */
147	int	(*scr_cursor) __P((SCR *, size_t *, size_t *));
148					/* Delete a line. */
149	int	(*scr_deleteln) __P((SCR *));
150					/* Discard a screen. */
151	int	(*scr_discard) __P((SCR *, SCR **));
152					/* Get a keyboard event. */
153	int	(*scr_event) __P((SCR *, EVENT *, u_int32_t, int));
154					/* Ex: screen adjustment routine. */
155	int	(*scr_ex_adjust) __P((SCR *, exadj_t));
156	int	(*scr_fmap)		/* Set a function key. */
157	    __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t));
158					/* Get terminal key value. */
159	int	(*scr_keyval) __P((SCR *, scr_keyval_t, CHAR_T *, int *));
160#ifdef IMCTRL
161					/* Control the state of input method. */
162	void	(*scr_imctrl) __P((SCR *, imctrl_t));
163#endif
164					/* Insert a line. */
165	int	(*scr_insertln) __P((SCR *));
166					/* Handle an option change. */
167	int	(*scr_optchange) __P((SCR *, int, const char *, u_long *));
168					/* Move the cursor. */
169	int	(*scr_move) __P((SCR *, size_t, size_t));
170					/* Refresh the screen. */
171	int	(*scr_refresh) __P((SCR *, int));
172					/* Rename the file. */
173	int	(*scr_rename) __P((SCR *, char *, int));
174					/* Reply to an event. */
175	int	(*scr_reply) __P((SCR *, int, char *));
176					/* Set the screen type. */
177	int	(*scr_screen) __P((SCR *, u_int32_t));
178					/* Split the screen. */
179	int	(*scr_split) __P((SCR *, SCR *));
180					/* Suspend the editor. */
181	int	(*scr_suspend) __P((SCR *, int *));
182					/* Print usage message. */
183	void	(*scr_usage) __P((void));
184
185	/* Threading stuff */
186	void	*th_private;
187
188	int	(*run) __P((WIN *, void *(*)(void*), void *));
189
190	int	(*lock_init) __P((WIN *, void **));
191#define LOCK_INIT(wp,s)							    \
192	wp->gp->lock_init(wp, &s->lock)
193	int	(*lock_try) __P((WIN *, void **));
194#define LOCK_TRY(wp,s)							    \
195	wp->gp->lock_try(wp, &s->lock)
196	int	(*lock_unlock) __P((WIN *, void **));
197#define LOCK_UNLOCK(wp,s)						    \
198	wp->gp->lock_unlock(wp, &s->lock)
199	int	(*lock_end) __P((WIN *, void **));
200#define LOCK_END(wp,s)							    \
201	wp->gp->lock_end(wp, &s->lock)
202};
203
204/*
205 * XXX
206 * Block signals if there are asynchronous events.  Used to keep DB system calls
207 * from being interrupted and not restarted, as that will result in consistency
208 * problems.  This should be handled by DB.
209 */
210#ifdef BLOCK_SIGNALS
211#include <signal.h>
212extern sigset_t	__sigblockset;
213#define	SIGBLOCK \
214	(void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL)
215#define	SIGUNBLOCK \
216	(void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL);
217#else
218#define	SIGBLOCK
219#define	SIGUNBLOCK
220#endif
221