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