1/* $NetBSD: gs.h,v 1.4 2018/08/07 08:05:47 rin Exp $ */ 2/*- 3 * Copyright (c) 1993, 1994 4 * The Regents of the University of California. All rights reserved. 5 * Copyright (c) 1993, 1994, 1995, 1996 6 * Keith Bostic. All rights reserved. 7 * 8 * See the LICENSE file for redistribution information. 9 * 10 * Id: gs.h,v 10.55 2001/11/01 10:28:25 skimo Exp (Berkeley) Date: 2001/11/01 10:28:25 11 */ 12 13#define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */ 14 15/* 16 * File reference structure (FREF). The structure contains the name of the 17 * file, along with the information that follows the name. 18 * 19 * !!! 20 * The read-only bit follows the file name, not the file itself. 21 */ 22struct _fref { 23 TAILQ_ENTRY(_fref) q; /* Linked list of file references. */ 24 char *name; /* File name. */ 25 char *tname; /* Backing temporary file name. */ 26 27 db_recno_t lno; /* 1-N: file cursor line. */ 28 size_t cno; /* 0-N: file cursor column. */ 29 30#define FR_CURSORSET 0x0001 /* If lno/cno values valid. */ 31#define FR_DONTDELETE 0x0002 /* Don't delete the temporary file. */ 32#define FR_EXNAMED 0x0004 /* Read/write renamed the file. */ 33#define FR_NAMECHANGE 0x0008 /* If the name changed. */ 34#define FR_NEWFILE 0x0010 /* File doesn't really exist yet. */ 35#define FR_RECOVER 0x0020 /* File is being recovered. */ 36#define FR_TMPEXIT 0x0040 /* Modified temporary file, no exit. */ 37#define FR_TMPFILE 0x0080 /* If file has no name. */ 38#define FR_UNLOCKED 0x0100 /* File couldn't be locked. */ 39 u_int16_t flags; 40}; 41 42/* Action arguments to scr_exadjust(). */ 43typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t; 44 45/* Screen attribute arguments to scr_attr(). */ 46typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t; 47 48#ifdef IMCTRL 49/* Input method control arguments to scr_imctrl(). */ 50typedef enum { IMCTRL_INIT, IMCTRL_OFF, IMCTRL_ON } imctrl_t; 51#endif 52 53/* Key type arguments to scr_keyval(). */ 54typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t; 55 56/* 57 * GS: 58 * 59 * Structure that describes global state of the running program. 60 */ 61struct _gs { 62 char *progname; /* Programe name. */ 63 64 int id; /* Last allocated screen id. */ 65 TAILQ_HEAD(_dqh, _win) dq; /* Displayed windows. */ 66 TAILQ_HEAD(_hqh, _scr) hq; /* Hidden screens. */ 67 68 void *perl_interp; /* Perl interpreter. */ 69 void *tcl_interp; /* Tcl_Interp *: Tcl interpreter. */ 70 71 void *cl_private; /* Curses support private area. */ 72 void *tk_private; /* Tk/Tcl support private area. */ 73 74 /* File references. */ 75 TAILQ_HEAD(_frefh, _fref) frefq; 76 /* File structures. */ 77 TAILQ_HEAD(_exfh, _exf) exfq; 78 79#define GO_COLUMNS 0 /* Global options: columns. */ 80#define GO_LINES 1 /* Global options: lines. */ 81#define GO_SECURE 2 /* Global options: secure. */ 82#define GO_TERM 3 /* Global options: terminal type. */ 83 OPTION opts[GO_TERM + 1]; 84 85 DB *msg; /* Message catalog DB. */ 86 MSGH msgq; /* User message list. */ 87#define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */ 88 int noprint; /* Cached, unprintable character. */ 89 90 char *c_option; /* Ex initial, command-line command. */ 91 92#ifdef DEBUG 93 FILE *tracefp; /* Trace file pointer. */ 94#endif 95 96#define MAX_BIT_SEQ 0x7f /* Max + 1 fast check character. */ 97 LIST_HEAD(_seqh, _seq) seqq; /* Linked list of maps, abbrevs. */ 98 bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1); 99 100#define MAX_FAST_KEY 0xff /* Max fast check character.*/ 101#define KEY_LEN(sp, ch) \ 102 (((ch) & ~MAX_FAST_KEY) == 0 ? \ 103 sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch)) 104#define KEY_NAME(sp, ch) \ 105 (((ch) & ~MAX_FAST_KEY) == 0 ? \ 106 sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch)) 107 struct { 108 u_char name[MAX_CHARACTER_COLUMNS + 1]; 109 u_int8_t len; 110 } cname[MAX_FAST_KEY + 1]; /* Fast lookup table. */ 111 112#define KEY_VAL(sp, ch) \ 113 (((ch) & ~MAX_FAST_KEY) == 0 ? \ 114 sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch)) 115 e_key_t /* Fast lookup table. */ 116 special_key[MAX_FAST_KEY + 1]; 117 118/* Flags. */ 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. */ 127 u_int32_t flags; 128 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)); 142 /* Prepare child. */ 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 *)); 148 /* Delete a line. */ 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 *)); 160#ifdef IMCTRL 161 /* Control the state of input method. */ 162 void (*scr_imctrl) __P((SCR *, imctrl_t)); 163#endif 164 /* Insert a line. */ 165 int (*scr_insertln) __P((SCR *)); 166 /* Handle an option change. */ 167 int (*scr_optchange) __P((SCR *, int, const char *, u_long *)); 168 /* Move the cursor. */ 169 int (*scr_move) __P((SCR *, size_t, size_t)); 170 /* Refresh the screen. */ 171 int (*scr_refresh) __P((SCR *, int)); 172 /* Rename the file. */ 173 int (*scr_rename) __P((SCR *, char *, int)); 174 /* Reply to an event. */ 175 int (*scr_reply) __P((SCR *, int, char *)); 176 /* Set the screen type. */ 177 int (*scr_screen) __P((SCR *, u_int32_t)); 178 /* Split the screen. */ 179 int (*scr_split) __P((SCR *, SCR *)); 180 /* Suspend the editor. */ 181 int (*scr_suspend) __P((SCR *, int *)); 182 /* Print usage message. */ 183 void (*scr_usage) __P((void)); 184 185 /* Threading stuff */ 186 void *th_private; 187 188 int (*run) __P((WIN *, void *(*)(void*), void *)); 189 190 int (*lock_init) __P((WIN *, void **)); 191#define LOCK_INIT(wp,s) \ 192 wp->gp->lock_init(wp, &s->lock) 193 int (*lock_try) __P((WIN *, void **)); 194#define LOCK_TRY(wp,s) \ 195 wp->gp->lock_try(wp, &s->lock) 196 int (*lock_unlock) __P((WIN *, void **)); 197#define LOCK_UNLOCK(wp,s) \ 198 wp->gp->lock_unlock(wp, &s->lock) 199 int (*lock_end) __P((WIN *, void **)); 200#define LOCK_END(wp,s) \ 201 wp->gp->lock_end(wp, &s->lock) 202}; 203 204/* 205 * XXX 206 * Block signals if there are asynchronous events. Used to keep DB system calls 207 * from being interrupted and not restarted, as that will result in consistency 208 * problems. This should be handled by DB. 209 */ 210#ifdef BLOCK_SIGNALS 211#include <signal.h> 212extern sigset_t __sigblockset; 213#define SIGBLOCK \ 214 (void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL) 215#define SIGUNBLOCK \ 216 (void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL); 217#else 218#define SIGBLOCK 219#define SIGUNBLOCK 220#endif 221