1 /*        $NetBSD: screen.h,v 1.3 2013/11/25 22:43:46 christos Exp $ */
2 /*-
3  * Copyright (c) 1992, 1993, 1994
4  *        The Regents of the University of California.  All rights reserved.
5  * Copyright (c) 1992, 1993, 1994, 1995, 1996
6  *        Keith Bostic.  All rights reserved.
7  *
8  * See the LICENSE file for redistribution information.
9  *
10  *        Id: screen.h,v 10.49 2002/03/02 23:47:02 skimo Exp  (Berkeley) Date: 2002/03/02 23:47:02
11  */
12 
13 /*
14  * There are minimum values that vi has to have to display a screen.  The row
15  * minimum is fixed at 1 (the svi code can share a line between the text line
16  * and the colon command/message line).  Column calculation is a lot trickier.
17  * For example, you have to have enough columns to display the line number,
18  * not to mention guaranteeing that tabstop and shiftwidth values are smaller
19  * than the current column value.  It's simpler to have a fixed value and not
20  * worry about it.
21  *
22  * XXX
23  * MINIMUM_SCREEN_COLS is almost certainly wrong.
24  */
25 #define   MINIMUM_SCREEN_ROWS  1
26 #define   MINIMUM_SCREEN_COLS 20
27 
28 /*
29  * WIN --
30  *        A list of screens that are displayed as a whole.
31  */
32 struct _win {
33           TAILQ_ENTRY(_win)       q;        /* Windows. */
34 
35           TAILQ_HEAD(_scrh, _scr)   scrq;   /* Screens */
36 
37           GS        *gp;                          /* Pointer to global area. */
38 
39           SCR       *ccl_sp;            /* Colon command-line screen. */
40 
41           void      *perl_private;                /* Perl interpreter. */
42 
43           void      *ip_private;                  /* IP support private area. */
44 
45           void      *th_private;                  /* Threading support private area. */
46 
47           /*
48            * Ex command structures (EXCMD).  Defined here because ex commands
49            * exist outside of any particular screen or file.
50            */
51 #define   EXCMD_RUNNING(wp)   ((wp)->ecq.lh_first->clen != 0)
52           LIST_HEAD(_excmdh, _excmd) ecq;         /* Ex command linked list. */
53           EXCMD               excmd;              /* Default ex command structure. */
54           char             *if_name;    /* Current associated file. */
55           db_recno_t          if_lno;             /* Current associated line number. */
56 
57           EVENT     *i_event;           /* Array of input events. */
58           size_t     i_nelem;           /* Number of array elements. */
59           size_t     i_cnt;                       /* Count of events. */
60           size_t     i_next;            /* Offset of next event. */
61 
62           CB        *dcbp;                        /* Default cut buffer pointer. */
63           CB         dcb_store;                   /* Default cut buffer storage. */
64           LIST_HEAD(_cuth, _cb) cutq;   /* Linked list of cut buffers. */
65 
66           /* For now, can be either char or CHAR_T buffer */
67           char      *tmp_bp;            /* Temporary buffer. */
68           size_t     tmp_blen;                    /* Temporary buffer size. */
69 
70           char      *l_lp;                        /* Log buffer. */
71           size_t     l_len;                       /* Log buffer length. */
72 
73           CONVWIN    cw;
74 
75 /* Flags. */
76 #define   W_TMP_INUSE         0x0001              /* Temporary buffer in use. */
77           u_int32_t flags;
78 
79                                                   /* Message or ex output. */
80           void      (*scr_msg) __P((SCR *, mtype_t, char *, size_t));
81 };
82 
83 /*
84  * SCR --
85  *        The screen structure.  To the extent possible, all screen information
86  *        is stored in the various private areas.  The only information here
87  *        is used by global routines or is shared by too many screens.
88  */
89 struct _scr {
90 /* INITIALIZED AT SCREEN CREATE. */
91           TAILQ_ENTRY(_scr) q;                    /* Screens. */
92           TAILQ_ENTRY(_scr) eq;         /* Screens. */
93 
94           int        id;                          /* Screen id #. */
95           int        refcnt;            /* Reference count. */
96 
97           WIN       *wp;                          /* Pointer to window. */
98           GS        *gp;                          /* Pointer to global area. */
99           SCR       *nextdisp;                    /* Next display screen. */
100           SCR       *ccl_parent;                  /* Colon command-line parent screen. */
101           EXF       *ep;                          /* Screen's current EXF structure. */
102 
103           CHAR_T    *c_lp;                        /* Cached line. */
104           size_t     c_len;                       /* Cached line length. */
105           /* May move out again once we use DB
106            * to cache internal representation
107            */
108           size_t     c_blen;            /* Cached line buffer length. */
109           db_recno_t           c_lno;             /* Cached line number. */
110 
111           FREF      *frp;                         /* FREF being edited. */
112           char      **argv;                       /* NULL terminated file name array. */
113           char      **cargv;            /* Current file name. */
114 
115           u_long     ccnt;                        /* Command count. */
116           u_long     q_ccnt;            /* Quit or ZZ command count. */
117 
118                                                   /* Screen's: */
119           size_t     rows;                        /* 1-N: number of rows. */
120           size_t     cols;                        /* 1-N: number of columns. */
121           size_t     t_rows;            /* 1-N: cur number of text rows. */
122           size_t     t_maxrows;                   /* 1-N: max number of text rows. */
123           size_t     t_minrows;                   /* 1-N: min number of text rows. */
124           size_t     coff;                        /* 0-N: screen col offset in display. */
125           size_t     roff;                        /* 0-N: screen row offset in display. */
126 
127                                                   /* Cursor's: */
128           db_recno_t           lno;                         /* 1-N: file line. */
129           size_t     cno;                         /* 0-N: file character in line. */
130 
131           size_t     rcm;                         /* Vi: 0-N: Most attractive column. */
132 
133 #define   L_ADDED             0                   /* Added lines. */
134 #define   L_CHANGED 1                   /* Changed lines. */
135 #define   L_DELETED 2                   /* Deleted lines. */
136 #define   L_JOINED  3                   /* Joined lines. */
137 #define   L_MOVED             4                   /* Moved lines. */
138 #define   L_SHIFT             5                   /* Shift lines. */
139 #define   L_YANKED  6                   /* Yanked lines. */
140           db_recno_t           rptlchange;                  /* Ex/vi: last L_CHANGED lno. */
141           db_recno_t           rptlines[L_YANKED + 1];/* Ex/vi: lines changed by last op. */
142 
143           TEXTH      tiq;                         /* Ex/vi: text input queue. */
144 
145           SCRIPT    *script;            /* Vi: script mode information .*/
146 
147           db_recno_t           defscroll;         /* Vi: ^D, ^U scroll information. */
148 
149                                                   /* Display character. */
150           u_char     cname[MAX_CHARACTER_COLUMNS + 1];
151           size_t     clen;                        /* Length of display character. */
152 
153           enum {                                  /* Vi editor mode. */
154               SM_APPEND = 0, SM_CHANGE, SM_COMMAND, SM_INSERT,
155               SM_REPLACE } showmode;
156 
157           void      *ex_private;                  /* Ex private area. */
158           void      *vi_private;                  /* Vi private area. */
159           void      *perl_private;                /* Perl private area. */
160           void      *cl_private;                  /* Curses private area. */
161 
162           CONV      conv;
163 
164           struct _log_state  state;     /* State during log traversal. */
165 
166 /* PARTIALLY OR COMPLETELY COPIED FROM PREVIOUS SCREEN. */
167           char      *alt_name;                    /* Ex/vi: alternate file name. */
168 
169           ARG_CHAR_T           at_lbuf; /* Ex/vi: Last executed at buffer. */
170 
171                                                   /* Ex/vi: re_compile flags. */
172 #define   RE_WSTART L("[[:<:]]")        /* Ex/vi: not-in-word search pattern. */
173 #define   RE_WSTOP  L("[[:>:]]")
174 #define RE_WSTART_LEN         (sizeof(RE_WSTART)/sizeof(CHAR_T)-1)
175 #define RE_WSTOP_LEN          (sizeof(RE_WSTOP)/sizeof(CHAR_T)-1)
176                                                   /* Ex/vi: flags to search routines. */
177 #define   SEARCH_CSCOPE       0x000001  /* Search for a cscope pattern. */
178 #define   SEARCH_CSEARCH      0x000002  /* Compile search replacement. */
179 #define   SEARCH_CSUBST       0x000004  /* Compile substitute replacement. */
180 #define   SEARCH_EOL          0x000008  /* Offset past EOL is okay. */
181 #define   SEARCH_EXTEND       0x000010  /* Extended RE. */
182 #define   SEARCH_FIRST        0x000020  /* Search from the first line. */
183 #define   SEARCH_IC 0x000040  /* Ignore case. */
184 #define   SEARCH_ICL          0x000080  /* Ignore case. */
185 #define   SEARCH_INCR         0x000100  /* Search incrementally. */
186 #define   SEARCH_LITERAL      0x000200  /* Literal string. */
187 #define   SEARCH_MSG          0x000400  /* Display search messages. */
188 #define   SEARCH_NOOPT        0x000800  /* Ignore edit options. */
189 #define   SEARCH_PARSE        0x001000  /* Parse the search pattern. */
190 #define   SEARCH_SET          0x002000  /* Set search direction. */
191 #define   SEARCH_TAG          0x004000  /* Search for a tag pattern. */
192 #define   SEARCH_WMSG         0x008000  /* Display search-wrapped messages. */
193 #define   SEARCH_WRAP         0x010000  /* Wrap past sof/eof. */
194 
195                                                   /* Ex/vi: RE information. */
196           dir_t      searchdir;                   /* Last file search direction. */
197           regex_t    re_c;                        /* Search RE: compiled form. */
198           CHAR_T    *re;                          /* Search RE: uncompiled form. */
199           size_t     re_len;            /* Search RE: uncompiled length. */
200           regex_t    subre_c;           /* Substitute RE: compiled form. */
201           CHAR_T    *subre;                       /* Substitute RE: uncompiled form. */
202           size_t     subre_len;                   /* Substitute RE: uncompiled length). */
203           CHAR_T    *repl;                        /* Substitute replacement. */
204           size_t     repl_len;                    /* Substitute replacement length.*/
205           size_t    *newl;                        /* Newline offset array. */
206           size_t     newl_len;                    /* Newline array size. */
207           size_t     newl_cnt;                    /* Newlines in replacement. */
208           u_int8_t c_suffix;            /* Edcompatible 'c' suffix value. */
209           u_int8_t g_suffix;            /* Edcompatible 'g' suffix value. */
210 
211           OPTION     opts[O_OPTIONCOUNT];         /* Ex/vi: Options. */
212 
213 /*
214  * Screen flags.
215  *
216  * Editor screens.
217  */
218 #define   SC_EX               0x00000001          /* Ex editor. */
219 #define   SC_VI               0x00000002          /* Vi editor. */
220 
221 /*
222  * Screen formatting flags, first major, then minor.
223  *
224  * SC_SCR_EX
225  *        Ex screen, i.e. cooked mode.
226  * SC_SCR_VI
227  *        Vi screen, i.e. raw mode.
228  * SC_SCR_EXWROTE
229  *        The editor had to write on the screen behind curses' back, and we can't
230  *        let curses change anything until the user agrees, e.g. entering the
231  *        commands :!utility followed by :set.  We have to switch back into the
232  *        vi "editor" to read the user's command input, but we can't touch the
233  *        rest of the screen because it's known to be wrong.
234  * SC_SCR_REFORMAT
235  *        The expected presentation of the lines on the screen have changed,
236  *        requiring that the intended screen lines be recalculated.  Implies
237  *        SC_SCR_REDRAW.
238  * SC_SCR_REDRAW
239  *        The screen doesn't correctly represent the file; repaint it.  Note,
240  *        setting SC_SCR_REDRAW in the current window causes *all* windows to
241  *        be repainted.
242  * SC_SCR_CENTER
243  *        If the current line isn't already on the screen, center it.
244  * SC_SCR_TOP
245  *        If the current line isn't already on the screen, put it at the to@.
246  */
247 #define   SC_SCR_EX 0x00000004          /* Screen is in ex mode. */
248 #define   SC_SCR_VI 0x00000008          /* Screen is in vi mode. */
249 #define   SC_SCR_EXWROTE      0x00000010          /* Ex overwrite: see comment above. */
250 #define   SC_SCR_REFORMAT     0x00000020          /* Reformat (refresh). */
251 #define   SC_SCR_REDRAW       0x00000040          /* Refresh. */
252 
253 #define   SC_SCR_CENTER       0x00000080          /* Center the line if not visible. */
254 #define   SC_SCR_TOP          0x00000100          /* Top the line if not visible. */
255 
256 /* Screen/file changes. */
257 #define   SC_EXIT             0x00000200          /* Exiting (not forced). */
258 #define   SC_EXIT_FORCE       0x00000400          /* Exiting (forced). */
259 #define   SC_FSWITCH          0x00000800          /* Switch underlying files. */
260 #define   SC_SSWITCH          0x00001000          /* Switch screens. */
261 
262 #define   SC_ARGNOFREE        0x00002000          /* Argument list wasn't allocated. */
263 #define   SC_ARGRECOVER       0x00004000          /* Argument list is recovery files. */
264 #define   SC_AT_SET 0x00008000          /* Last at buffer set. */
265 #define   SC_COMEDIT          0x00010000          /* Colon command-line edit window. */
266 #define   SC_EX_GLOBAL        0x00020000          /* Ex: executing a global command. */
267 #define   SC_EX_SILENT        0x00040000          /* Ex: batch script. */
268 #define   SC_EX_WAIT_NO       0x00080000          /* Ex: don't wait for the user. */
269 #define   SC_EX_WAIT_YES      0x00100000          /* Ex:    do wait for the user. */
270 #define   SC_READONLY         0x00200000          /* Persistent readonly state. */
271 #define   SC_RE_SEARCH        0x00400000          /* Search RE has been compiled. */
272 #define   SC_RE_SUBST         0x00800000          /* Substitute RE has been compiled. */
273 #define   SC_SCRIPT 0x01000000          /* Shell script window. */
274 #define   SC_STATUS 0x02000000          /* Welcome message. */
275 #define   SC_STATUS_CNT       0x04000000          /* Welcome message plus file count. */
276 #define   SC_TINPUT 0x08000000          /* Doing text input. */
277 #define   SC_TINPUT_INFO      0x10000000          /* Doing text input on info line. */
278 #define SC_CONV_ERROR         0x20000000          /* Met with a conversion error. */
279           u_int32_t flags;
280 
281           int           db_error;                 /* Return code from db function. */
282 };
283