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