119304Speter/*- 219304Speter * Copyright (c) 1993, 1994 319304Speter * The Regents of the University of California. All rights reserved. 419304Speter * Copyright (c) 1993, 1994, 1995, 1996 519304Speter * Keith Bostic. All rights reserved. 619304Speter * 719304Speter * See the LICENSE file for redistribution information. 819304Speter * 9254225Speter * $Id: gs.h,v 11.0 2012/10/17 06:34:37 zy Exp $ 1019304Speter */ 1119304Speter 1219304Speter#define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */ 1319304Speter 14254225Speter#include <nl_types.h> 15254225Speter 1619304Speter/* 1719304Speter * File reference structure (FREF). The structure contains the name of the 1819304Speter * file, along with the information that follows the name. 1919304Speter * 2019304Speter * !!! 2119304Speter * The read-only bit follows the file name, not the file itself. 2219304Speter */ 2319304Speterstruct _fref { 24254225Speter TAILQ_ENTRY(_fref) q; /* Linked list of file references. */ 2519304Speter char *name; /* File name. */ 2619304Speter char *tname; /* Backing temporary file name. */ 2719304Speter 2819304Speter recno_t lno; /* 1-N: file cursor line. */ 2919304Speter size_t cno; /* 0-N: file cursor column. */ 3019304Speter 3119304Speter#define FR_CURSORSET 0x0001 /* If lno/cno values valid. */ 3219304Speter#define FR_DONTDELETE 0x0002 /* Don't delete the temporary file. */ 3319304Speter#define FR_EXNAMED 0x0004 /* Read/write renamed the file. */ 3419304Speter#define FR_NAMECHANGE 0x0008 /* If the name changed. */ 3519304Speter#define FR_NEWFILE 0x0010 /* File doesn't really exist yet. */ 3619304Speter#define FR_RECOVER 0x0020 /* File is being recovered. */ 3719304Speter#define FR_TMPEXIT 0x0040 /* Modified temporary file, no exit. */ 3819304Speter#define FR_TMPFILE 0x0080 /* If file has no name. */ 3919304Speter#define FR_UNLOCKED 0x0100 /* File couldn't be locked. */ 4019304Speter u_int16_t flags; 4119304Speter}; 4219304Speter 4319304Speter/* Action arguments to scr_exadjust(). */ 4419304Spetertypedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t; 4519304Speter 4619304Speter/* Screen attribute arguments to scr_attr(). */ 4719304Spetertypedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t; 4819304Speter 4919304Speter/* Key type arguments to scr_keyval(). */ 5019304Spetertypedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t; 5119304Speter 5219304Speter/* 5319304Speter * GS: 5419304Speter * 5519304Speter * Structure that describes global state of the running program. 5619304Speter */ 5719304Speterstruct _gs { 5819304Speter char *progname; /* Programe name. */ 5919304Speter 6019304Speter int id; /* Last allocated screen id. */ 61254225Speter TAILQ_HEAD(_dqh, _scr) dq[1]; /* Displayed screens. */ 62254225Speter TAILQ_HEAD(_hqh, _scr) hq[1]; /* Hidden screens. */ 6319304Speter 6419304Speter SCR *ccl_sp; /* Colon command-line screen. */ 6519304Speter 6619304Speter void *cl_private; /* Curses support private area. */ 6719304Speter 6819304Speter /* File references. */ 69254225Speter TAILQ_HEAD(_frefh, _fref) frefq[1]; 7019304Speter 7119304Speter#define GO_COLUMNS 0 /* Global options: columns. */ 7219304Speter#define GO_LINES 1 /* Global options: lines. */ 7319304Speter#define GO_SECURE 2 /* Global options: secure. */ 7419304Speter#define GO_TERM 3 /* Global options: terminal type. */ 7519304Speter OPTION opts[GO_TERM + 1]; 7619304Speter 77254225Speter nl_catd catd; /* Message catalog descriptor. */ 78254225Speter MSGH msgq[1]; /* User message list. */ 7919304Speter#define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */ 80254225Speter int noprint; /* Cached, unprintable character. */ 8119304Speter 8219304Speter char *tmp_bp; /* Temporary buffer. */ 8319304Speter size_t tmp_blen; /* Temporary buffer size. */ 8419304Speter 8519304Speter /* 8619304Speter * Ex command structures (EXCMD). Defined here because ex commands 8719304Speter * exist outside of any particular screen or file. 8819304Speter */ 89254225Speter#define EXCMD_RUNNING(gp) (SLIST_FIRST((gp)->ecq)->clen != 0) 90254225Speter /* Ex command linked list. */ 91254225Speter SLIST_HEAD(_excmdh, _excmd) ecq[1]; 9219304Speter EXCMD excmd; /* Default ex command structure. */ 9319304Speter char *if_name; /* Current associated file. */ 9419304Speter recno_t if_lno; /* Current associated line number. */ 9519304Speter 9619304Speter char *c_option; /* Ex initial, command-line command. */ 9719304Speter 9819304Speter#ifdef DEBUG 9919304Speter FILE *tracefp; /* Trace file pointer. */ 10019304Speter#endif 10119304Speter 10219304Speter EVENT *i_event; /* Array of input events. */ 10319304Speter size_t i_nelem; /* Number of array elements. */ 10419304Speter size_t i_cnt; /* Count of events. */ 10519304Speter size_t i_next; /* Offset of next event. */ 10619304Speter 10719304Speter CB *dcbp; /* Default cut buffer pointer. */ 10819304Speter CB dcb_store; /* Default cut buffer storage. */ 109254225Speter SLIST_HEAD(_cuth, _cb) cutq[1]; /* Linked list of cut buffers. */ 11019304Speter 111254225Speter#define MAX_BIT_SEQ 0x7f /* Max + 1 fast check character. */ 112254225Speter SLIST_HEAD(_seqh, _seq) seqq[1];/* Linked list of maps, abbrevs. */ 113254225Speter bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1); 11419304Speter 115254225Speter#define MAX_FAST_KEY 0xff /* Max fast check character.*/ 11619304Speter#define KEY_LEN(sp, ch) \ 117254225Speter (((ch) & ~MAX_FAST_KEY) == 0 ? \ 11819304Speter sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch)) 11919304Speter#define KEY_NAME(sp, ch) \ 120254225Speter (((ch) & ~MAX_FAST_KEY) == 0 ? \ 12119304Speter sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch)) 12219304Speter struct { 123254225Speter char name[MAX_CHARACTER_COLUMNS + 1]; 12419304Speter u_int8_t len; 12519304Speter } cname[MAX_FAST_KEY + 1]; /* Fast lookup table. */ 12619304Speter 12719304Speter#define KEY_VAL(sp, ch) \ 128254225Speter (((ch) & ~MAX_FAST_KEY) == 0 ? \ 129254225Speter sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch)) 130254225Speter e_key_t /* Fast lookup table. */ 13119304Speter special_key[MAX_FAST_KEY + 1]; 13219304Speter 13319304Speter/* Flags. */ 13419304Speter#define G_ABBREV 0x0001 /* If have abbreviations. */ 13519304Speter#define G_BELLSCHED 0x0002 /* Bell scheduled. */ 13619304Speter#define G_INTERRUPTED 0x0004 /* Interrupted. */ 13719304Speter#define G_RECOVER_SET 0x0008 /* Recover system initialized. */ 13819304Speter#define G_SCRIPTED 0x0010 /* Ex script session. */ 13919304Speter#define G_SCRWIN 0x0020 /* Scripting windows running. */ 14019304Speter#define G_SNAPSHOT 0x0040 /* Always snapshot files. */ 14119304Speter#define G_SRESTART 0x0080 /* Screen restarted. */ 14219304Speter#define G_TMP_INUSE 0x0100 /* Temporary buffer in use. */ 14319304Speter u_int32_t flags; 14419304Speter 14519304Speter /* Screen interface functions. */ 14619304Speter /* Add a string to the screen. */ 147281373Sbapt int (*scr_addstr)(SCR *, const char *, size_t); 148254225Speter /* Add a string to the screen. */ 149281373Sbapt int (*scr_waddstr)(SCR *, const CHAR_T *, size_t); 15019304Speter /* Toggle a screen attribute. */ 151281373Sbapt int (*scr_attr)(SCR *, scr_attr_t, int); 15219304Speter /* Terminal baud rate. */ 153281373Sbapt int (*scr_baud)(SCR *, u_long *); 15419304Speter /* Beep/bell/flash the terminal. */ 155281373Sbapt int (*scr_bell)(SCR *); 15619304Speter /* Display a busy message. */ 157281373Sbapt void (*scr_busy)(SCR *, const char *, busy_t); 158254225Speter /* Prepare child. */ 159281373Sbapt int (*scr_child)(SCR *); 16019304Speter /* Clear to the end of the line. */ 161281373Sbapt int (*scr_clrtoeol)(SCR *); 16219304Speter /* Return the cursor location. */ 163281373Sbapt int (*scr_cursor)(SCR *, size_t *, size_t *); 16419304Speter /* Delete a line. */ 165281373Sbapt int (*scr_deleteln)(SCR *); 166254225Speter /* Discard a screen. */ 167281373Sbapt int (*scr_discard)(SCR *, SCR **); 16819304Speter /* Get a keyboard event. */ 169281373Sbapt int (*scr_event)(SCR *, EVENT *, u_int32_t, int); 17019304Speter /* Ex: screen adjustment routine. */ 171281373Sbapt int (*scr_ex_adjust)(SCR *, exadj_t); 17219304Speter int (*scr_fmap) /* Set a function key. */ 173281373Sbapt (SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t); 17419304Speter /* Get terminal key value. */ 175281373Sbapt int (*scr_keyval)(SCR *, scr_keyval_t, CHAR_T *, int *); 17619304Speter /* Insert a line. */ 177281373Sbapt int (*scr_insertln)(SCR *); 17819304Speter /* Handle an option change. */ 179281373Sbapt int (*scr_optchange)(SCR *, int, char *, u_long *); 18019304Speter /* Move the cursor. */ 181281373Sbapt int (*scr_move)(SCR *, size_t, size_t); 18219304Speter /* Message or ex output. */ 183281373Sbapt void (*scr_msg)(SCR *, mtype_t, char *, size_t); 18419304Speter /* Refresh the screen. */ 185281373Sbapt int (*scr_refresh)(SCR *, int); 18619304Speter /* Rename the file. */ 187281373Sbapt int (*scr_rename)(SCR *, char *, int); 188254225Speter /* Reply to an event. */ 189281373Sbapt int (*scr_reply)(SCR *, int, char *); 19019304Speter /* Set the screen type. */ 191281373Sbapt int (*scr_screen)(SCR *, u_int32_t); 192254225Speter /* Split the screen. */ 193281373Sbapt int (*scr_split)(SCR *, SCR *); 19419304Speter /* Suspend the editor. */ 195281373Sbapt int (*scr_suspend)(SCR *, int *); 19619304Speter /* Print usage message. */ 197281373Sbapt void (*scr_usage)(void); 19819304Speter}; 199