2 * Copyright (c) 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 * Copyright (c) 1993, 1994, 1995, 1996
5 * Keith Bostic. All rights reserved.
7 * See the LICENSE file for redistribution information.
9 * $Id: gs.h,v 10.50 2000/07/22 17:31:18 skimo Exp $ (Berkeley) $Date: 2000/07/22 17:31:18 $
12 #define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */
15 * File reference structure (FREF). The structure contains the name of the
16 * file, along with the information that follows the name.
19 * The read-only bit follows the file name, not the file itself.
22 CIRCLEQ_ENTRY(_fref
) q
; /* Linked list of file references. */
23 char *name
; /* File name. */
24 char *tname
; /* Backing temporary file name. */
26 db_recno_t lno
; /* 1-N: file cursor line. */
27 size_t cno
; /* 0-N: file cursor column. */
29 #define FR_CURSORSET 0x0001 /* If lno/cno values valid. */
30 #define FR_DONTDELETE 0x0002 /* Don't delete the temporary file. */
31 #define FR_EXNAMED 0x0004 /* Read/write renamed the file. */
32 #define FR_NAMECHANGE 0x0008 /* If the name changed. */
33 #define FR_NEWFILE 0x0010 /* File doesn't really exist yet. */
34 #define FR_RECOVER 0x0020 /* File is being recovered. */
35 #define FR_TMPEXIT 0x0040 /* Modified temporary file, no exit. */
36 #define FR_TMPFILE 0x0080 /* If file has no name. */
37 #define FR_UNLOCKED 0x0100 /* File couldn't be locked. */
41 /* Action arguments to scr_exadjust(). */
42 typedef enum { EX_TERM_CE
, EX_TERM_SCROLL
} exadj_t
;
44 /* Screen attribute arguments to scr_attr(). */
45 typedef enum { SA_ALTERNATE
, SA_INVERSE
} scr_attr_t
;
47 /* Key type arguments to scr_keyval(). */
48 typedef enum { KEY_VEOF
, KEY_VERASE
, KEY_VKILL
, KEY_VWERASE
} scr_keyval_t
;
53 * Structure that describes global state of the running program.
56 char *progname
; /* Programe name. */
58 int id
; /* Last allocated screen id. */
59 CIRCLEQ_HEAD(_dqh
, _win
) dq
; /* Displayed windows. */
60 CIRCLEQ_HEAD(_hqh
, _scr
) hq
; /* Hidden screens. */
62 SCR
*ccl_sp
; /* Colon command-line screen. */
64 void *perl_interp
; /* Perl interpreter. */
65 void *tcl_interp
; /* Tcl_Interp *: Tcl interpreter. */
67 void *cl_private
; /* Curses support private area. */
68 void *tk_private
; /* Tk/Tcl support private area. */
70 /* File references. */
71 CIRCLEQ_HEAD(_frefh
, _fref
) frefq
;
72 /* File structures. */
73 CIRCLEQ_HEAD(_exfh
, _exf
) exfq
;
75 #define GO_COLUMNS 0 /* Global options: columns. */
76 #define GO_LINES 1 /* Global options: lines. */
77 #define GO_SECURE 2 /* Global options: secure. */
78 #define GO_TERM 3 /* Global options: terminal type. */
79 OPTION opts
[GO_TERM
+ 1];
81 DB_ENV
*env
; /* The DB environment. */
83 DB
*msg
; /* Message catalog DB. */
84 MSGH msgq
; /* User message list. */
85 #define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */
86 CHAR_T noprint
; /* Cached, unprintable character. */
88 char *c_option
; /* Ex initial, command-line command. */
91 FILE *tracefp
; /* Trace file pointer. */
94 #define MAX_BIT_SEQ 128 /* Max + 1 fast check character. */
95 LIST_HEAD(_seqh
, _seq
) seqq
; /* Linked list of maps, abbrevs. */
96 bitstr_t
bit_decl(seqb
, MAX_BIT_SEQ
);
98 #define MAX_FAST_KEY 255 /* Max fast check character.*/
99 #define KEY_LEN(sp, ch) \
100 ((UCHAR_T)(ch) <= MAX_FAST_KEY ? \
101 sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
102 #define KEY_NAME(sp, ch) \
103 ((UCHAR_T)(ch) <= MAX_FAST_KEY ? \
104 sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
106 u_char name
[MAX_CHARACTER_COLUMNS
+ 1];
108 } cname
[MAX_FAST_KEY
+ 1]; /* Fast lookup table. */
110 #define KEY_VAL(sp, ch) \
111 ((unsigned char)(ch) <= MAX_FAST_KEY ? \
112 sp->gp->special_key[(unsigned char)ch] : \
113 (unsigned char)(ch) > sp->gp->max_special ? 0 : v_key_val(sp,ch))
114 CHAR_T max_special
; /* Max special character. */
115 u_char
/* Fast lookup table. */
116 special_key
[MAX_FAST_KEY
+ 1];
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. */
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
));
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 *));
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 *));
161 int (*scr_insertln
) __P((SCR
*));
162 /* Handle an option change. */
163 int (*scr_optchange
) __P((SCR
*, int, char *, u_long
*));
164 /* Move the cursor. */
165 int (*scr_move
) __P((SCR
*, size_t, size_t));
166 /* Message or ex output. */
167 void (*scr_msg
) __P((SCR
*, mtype_t
, char *, size_t));
168 /* Refresh the screen. */
169 int (*scr_refresh
) __P((SCR
*, int));
170 /* Rename the file. */
171 int (*scr_rename
) __P((SCR
*, char *, int));
172 /* Reply to an event. */
173 int (*scr_reply
) __P((SCR
*, int, char *));
174 /* Set the screen type. */
175 int (*scr_screen
) __P((SCR
*, u_int32_t
));
176 /* Split the screen. */
177 int (*scr_split
) __P((SCR
*, SCR
*));
178 /* Suspend the editor. */
179 int (*scr_suspend
) __P((SCR
*, int *));
180 /* Print usage message. */
181 void (*scr_usage
) __P((void));
183 /* Threading stuff */
186 int (*run
) __P((WIN
*, void *(*)(void*), void *));
188 int (*lock_init
) __P((WIN
*, void **));
189 #define LOCK_INIT(wp,s) \
190 wp->gp->lock_init(wp, &s->lock)
191 int (*lock_try
) __P((WIN
*, void **));
192 #define LOCK_TRY(wp,s) \
193 wp->gp->lock_try(wp, &s->lock)
194 int (*lock_unlock
) __P((WIN
*, void **));
195 #define LOCK_UNLOCK(wp,s) \
196 wp->gp->lock_unlock(wp, &s->lock)
197 int (*lock_end
) __P((WIN
*, void **));
198 #define LOCK_END(wp,s) \
199 wp->gp->lock_end(wp, &s->lock)
204 * Block signals if there are asynchronous events. Used to keep DB system calls
205 * from being interrupted and not restarted, as that will result in consistency
206 * problems. This should be handled by DB.
210 extern sigset_t __sigblockset
;
212 (void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL)
214 (void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL);