xref: /openbsd/usr.bin/vi/common/screen.h (revision 7b36286a)
1 /*	$OpenBSD: screen.h,v 1.5 2001/01/29 01:58:31 niklas Exp $	*/
2 
3 /*-
4  * Copyright (c) 1992, 1993, 1994
5  *	The Regents of the University of California.  All rights reserved.
6  * Copyright (c) 1992, 1993, 1994, 1995, 1996
7  *	Keith Bostic.  All rights reserved.
8  *
9  * See the LICENSE file for redistribution information.
10  *
11  *	@(#)screen.h	10.24 (Berkeley) 7/19/96
12  */
13 
14 /*
15  * There are minimum values that vi has to have to display a screen.  The row
16  * minimum is fixed at 1 (the svi code can share a line between the text line
17  * and the colon command/message line).  Column calculation is a lot trickier.
18  * For example, you have to have enough columns to display the line number,
19  * not to mention guaranteeing that tabstop and shiftwidth values are smaller
20  * than the current column value.  It's simpler to have a fixed value and not
21  * worry about it.
22  *
23  * XXX
24  * MINIMUM_SCREEN_COLS is almost certainly wrong.
25  */
26 #define	MINIMUM_SCREEN_ROWS	 1
27 #define	MINIMUM_SCREEN_COLS	20
28 
29 /*
30  * SCR --
31  *	The screen structure.  To the extent possible, all screen information
32  *	is stored in the various private areas.  The only information here
33  *	is used by global routines or is shared by too many screens.
34  */
35 struct _scr {
36 /* INITIALIZED AT SCREEN CREATE. */
37 	CIRCLEQ_ENTRY(_scr) q;		/* Screens. */
38 
39 	int	 id;			/* Screen id #. */
40 	int	 refcnt;		/* Reference count. */
41 
42 	GS	*gp;			/* Pointer to global area. */
43 	SCR	*nextdisp;		/* Next display screen. */
44 	SCR	*ccl_parent;		/* Colon command-line parent screen. */
45 	EXF	*ep;			/* Screen's current EXF structure. */
46 
47 	FREF	*frp;			/* FREF being edited. */
48 	char	**argv;			/* NULL terminated file name array. */
49 	char	**cargv;		/* Current file name. */
50 
51 	u_long	 ccnt;			/* Command count. */
52 	u_long	 q_ccnt;		/* Quit or ZZ command count. */
53 
54 					/* Screen's: */
55 	size_t	 rows;			/* 1-N: number of rows. */
56 	size_t	 cols;			/* 1-N: number of columns. */
57 	size_t	 t_rows;		/* 1-N: cur number of text rows. */
58 	size_t	 t_maxrows;		/* 1-N: max number of text rows. */
59 	size_t	 t_minrows;		/* 1-N: min number of text rows. */
60 	size_t	 woff;			/* 0-N: screen offset in frame. */
61 
62 					/* Cursor's: */
63 	recno_t	 lno;			/* 1-N: file line. */
64 	size_t	 cno;			/* 0-N: file character in line. */
65 
66 	size_t	 rcm;			/* Vi: 0-N: Most attractive column. */
67 
68 #define	L_ADDED		0		/* Added lines. */
69 #define	L_CHANGED	1		/* Changed lines. */
70 #define	L_DELETED	2		/* Deleted lines. */
71 #define	L_JOINED	3		/* Joined lines. */
72 #define	L_MOVED		4		/* Moved lines. */
73 #define	L_SHIFT		5		/* Shift lines. */
74 #define	L_YANKED	6		/* Yanked lines. */
75 	recno_t	 rptlchange;		/* Ex/vi: last L_CHANGED lno. */
76 	recno_t	 rptlines[L_YANKED + 1];/* Ex/vi: lines changed by last op. */
77 
78 	TEXTH	 tiq;			/* Ex/vi: text input queue. */
79 
80 	SCRIPT	*script;		/* Vi: script mode information .*/
81 
82 	recno_t	 defscroll;		/* Vi: ^D, ^U scroll information. */
83 
84 					/* Display character. */
85 	CHAR_T	 cname[MAX_CHARACTER_COLUMNS + 1];
86 	size_t	 clen;			/* Length of display character. */
87 
88 	enum {				/* Vi editor mode. */
89 	    SM_APPEND = 0, SM_CHANGE, SM_COMMAND, SM_INSERT,
90 	    SM_REPLACE } showmode;
91 
92 	void	*ex_private;		/* Ex private area. */
93 	void	*vi_private;		/* Vi private area. */
94 	void	*perl_private;		/* Perl private area. */
95 
96 /* PARTIALLY OR COMPLETELY COPIED FROM PREVIOUS SCREEN. */
97 	char	*alt_name;		/* Ex/vi: alternate file name. */
98 
99 	CHAR_T	 at_lbuf;		/* Ex/vi: Last executed at buffer. */
100 
101 					/* Ex/vi: re_compile flags. */
102 #define	RE_C_CSCOPE	0x0001		/* Compile cscope pattern. */
103 #define	RE_C_SEARCH	0x0002		/* Compile search replacement. */
104 #define	RE_C_SILENT	0x0004		/* No error messages. */
105 #define	RE_C_SUBST	0x0008		/* Compile substitute replacement. */
106 #define	RE_C_TAG	0x0010		/* Compile ctag pattern. */
107 
108 #define	RE_WSTART	"[[:<:]]"	/* Ex/vi: not-in-word search pattern. */
109 #define	RE_WSTOP	"[[:>:]]"
110 					/* Ex/vi: flags to search routines. */
111 #define	SEARCH_CSCOPE	0x0001		/* Search for a cscope pattern. */
112 #define	SEARCH_EOL	0x0002		/* Offset past EOL is okay. */
113 #define	SEARCH_FILE	0x0004		/* Search the entire file. */
114 #define	SEARCH_INCR	0x0008		/* Search incrementally. */
115 #define	SEARCH_MSG	0x0010		/* Display search messages. */
116 #define	SEARCH_PARSE	0x0020		/* Parse the search pattern. */
117 #define	SEARCH_SET	0x0040		/* Set search direction. */
118 #define	SEARCH_TAG	0x0080		/* Search for a tag pattern. */
119 #define	SEARCH_WMSG	0x0100		/* Display search-wrapped messages. */
120 
121 					/* Ex/vi: RE information. */
122 	dir_t	 searchdir;		/* Last file search direction. */
123 	regex_t	 re_c;			/* Search RE: compiled form. */
124 	char	*re;			/* Search RE: uncompiled form. */
125 	size_t	 re_len;		/* Search RE: uncompiled length. */
126 	regex_t	 subre_c;		/* Substitute RE: compiled form. */
127 	char	*subre;			/* Substitute RE: uncompiled form. */
128 	size_t	 subre_len;		/* Substitute RE: uncompiled length). */
129 	char	*repl;			/* Substitute replacement. */
130 	size_t	 repl_len;		/* Substitute replacement length.*/
131 	size_t	*newl;			/* Newline offset array. */
132 	size_t	 newl_len;		/* Newline array size. */
133 	size_t	 newl_cnt;		/* Newlines in replacement. */
134 	u_int8_t c_suffix;		/* Edcompatible 'c' suffix value. */
135 	u_int8_t g_suffix;		/* Edcompatible 'g' suffix value. */
136 
137 	OPTION	 opts[O_OPTIONCOUNT];	/* Ex/vi: Options. */
138 
139 /*
140  * Screen flags.
141  *
142  * Editor screens.
143  */
144 #define	SC_EX		0x00000001	/* Ex editor. */
145 #define	SC_VI		0x00000002	/* Vi editor. */
146 
147 /*
148  * Screen formatting flags, first major, then minor.
149  *
150  * SC_SCR_EX
151  *	Ex screen, i.e. cooked mode.
152  * SC_SCR_VI
153  *	Vi screen, i.e. raw mode.
154  * SC_SCR_EXWROTE
155  *	The editor had to write on the screen behind curses' back, and we can't
156  *	let curses change anything until the user agrees, e.g. entering the
157  *	commands :!utility followed by :set.  We have to switch back into the
158  *	vi "editor" to read the user's command input, but we can't touch the
159  *	rest of the screen because it's known to be wrong.
160  * SC_SCR_REFORMAT
161  *	The expected presentation of the lines on the screen have changed,
162  *	requiring that the intended screen lines be recalculated.  Implies
163  *	SC_SCR_REDRAW.
164  * SC_SCR_REDRAW
165  *	The screen doesn't correctly represent the file; repaint it.  Note,
166  *	setting SC_SCR_REDRAW in the current window causes *all* windows to
167  *	be repainted.
168  * SC_SCR_CENTER
169  *	If the current line isn't already on the screen, center it.
170  * SC_SCR_TOP
171  *	If the current line isn't already on the screen, put it at the to@.
172  */
173 #define	SC_SCR_EX	0x00000004	/* Screen is in ex mode. */
174 #define	SC_SCR_VI	0x00000008	/* Screen is in vi mode. */
175 #define	SC_SCR_EXWROTE	0x00000010	/* Ex overwrite: see comment above. */
176 #define	SC_SCR_REFORMAT	0x00000020	/* Reformat (refresh). */
177 #define	SC_SCR_REDRAW	0x00000040	/* Refresh. */
178 
179 #define	SC_SCR_CENTER	0x00000080	/* Center the line if not visible. */
180 #define	SC_SCR_TOP	0x00000100	/* Top the line if not visible. */
181 
182 /* Screen/file changes. */
183 #define	SC_EXIT		0x00000200	/* Exiting (not forced). */
184 #define	SC_EXIT_FORCE	0x00000400	/* Exiting (forced). */
185 #define	SC_FSWITCH	0x00000800	/* Switch underlying files. */
186 #define	SC_SSWITCH	0x00001000	/* Switch screens. */
187 
188 #define	SC_ARGNOFREE	0x00002000	/* Argument list wasn't allocated. */
189 #define	SC_ARGRECOVER	0x00004000	/* Argument list is recovery files. */
190 #define	SC_AT_SET	0x00008000	/* Last at buffer set. */
191 #define	SC_COMEDIT	0x00010000	/* Colon command-line edit window. */
192 #define	SC_EX_GLOBAL	0x00020000	/* Ex: executing a global command. */
193 #define	SC_EX_SILENT	0x00040000	/* Ex: batch script. */
194 #define	SC_EX_WAIT_NO	0x00080000	/* Ex: don't wait for the user. */
195 #define	SC_EX_WAIT_YES	0x00100000	/* Ex:    do wait for the user. */
196 #define	SC_READONLY	0x00200000	/* Persistent readonly state. */
197 #define	SC_RE_SEARCH	0x00400000	/* Search RE has been compiled. */
198 #define	SC_RE_SUBST	0x00800000	/* Substitute RE has been compiled. */
199 #define	SC_SCRIPT	0x01000000	/* Shell script window. */
200 #define	SC_STATUS	0x02000000	/* Welcome message. */
201 #define	SC_STATUS_CNT	0x04000000	/* Welcome message plus file count. */
202 #define	SC_TINPUT	0x08000000	/* Doing text input. */
203 #define	SC_TINPUT_INFO	0x10000000	/* Doing text input on info line. */
204 	u_int32_t flags;
205 };
206