119304Speter/*- 219304Speter * Copyright (c) 1992, 1993, 1994 319304Speter * The Regents of the University of California. All rights reserved. 419304Speter * Copyright (c) 1992, 1993, 1994, 1995, 1996 519304Speter * Keith Bostic. All rights reserved. 619304Speter * 719304Speter * See the LICENSE file for redistribution information. 819304Speter * 9254225Speter * $Id: screen.h,v 10.26 2011/12/12 22:31:36 zy Exp $ 1019304Speter */ 1119304Speter 1219304Speter/* 1319304Speter * There are minimum values that vi has to have to display a screen. The row 1419304Speter * minimum is fixed at 1 (the svi code can share a line between the text line 1519304Speter * and the colon command/message line). Column calculation is a lot trickier. 1619304Speter * For example, you have to have enough columns to display the line number, 1719304Speter * not to mention guaranteeing that tabstop and shiftwidth values are smaller 1819304Speter * than the current column value. It's simpler to have a fixed value and not 1919304Speter * worry about it. 2019304Speter * 2119304Speter * XXX 2219304Speter * MINIMUM_SCREEN_COLS is almost certainly wrong. 2319304Speter */ 2419304Speter#define MINIMUM_SCREEN_ROWS 1 2519304Speter#define MINIMUM_SCREEN_COLS 20 2619304Speter 2719304Speter/* 2819304Speter * SCR -- 2919304Speter * The screen structure. To the extent possible, all screen information 3019304Speter * is stored in the various private areas. The only information here 3119304Speter * is used by global routines or is shared by too many screens. 3219304Speter */ 3319304Speterstruct _scr { 3419304Speter/* INITIALIZED AT SCREEN CREATE. */ 35254225Speter TAILQ_ENTRY(_scr) q; /* Screens. */ 3619304Speter 3719304Speter int id; /* Screen id #. */ 3819304Speter int refcnt; /* Reference count. */ 3919304Speter 4019304Speter GS *gp; /* Pointer to global area. */ 4119304Speter SCR *nextdisp; /* Next display screen. */ 4219304Speter SCR *ccl_parent; /* Colon command-line parent screen. */ 4319304Speter EXF *ep; /* Screen's current EXF structure. */ 4419304Speter 4519304Speter FREF *frp; /* FREF being edited. */ 4619304Speter char **argv; /* NULL terminated file name array. */ 4719304Speter char **cargv; /* Current file name. */ 4819304Speter 4919304Speter u_long ccnt; /* Command count. */ 5019304Speter u_long q_ccnt; /* Quit or ZZ command count. */ 5119304Speter 5219304Speter /* Screen's: */ 5319304Speter size_t rows; /* 1-N: number of rows. */ 5419304Speter size_t cols; /* 1-N: number of columns. */ 5519304Speter size_t t_rows; /* 1-N: cur number of text rows. */ 5619304Speter size_t t_maxrows; /* 1-N: max number of text rows. */ 5719304Speter size_t t_minrows; /* 1-N: min number of text rows. */ 58254225Speter size_t coff; /* 0-N: screen col offset in display. */ 59254225Speter size_t roff; /* 0-N: screen row offset in display. */ 6019304Speter 6119304Speter /* Cursor's: */ 6219304Speter recno_t lno; /* 1-N: file line. */ 6319304Speter size_t cno; /* 0-N: file character in line. */ 6419304Speter 6519304Speter size_t rcm; /* Vi: 0-N: Most attractive column. */ 6619304Speter 6719304Speter#define L_ADDED 0 /* Added lines. */ 6819304Speter#define L_CHANGED 1 /* Changed lines. */ 6919304Speter#define L_DELETED 2 /* Deleted lines. */ 7019304Speter#define L_JOINED 3 /* Joined lines. */ 7119304Speter#define L_MOVED 4 /* Moved lines. */ 7219304Speter#define L_SHIFT 5 /* Shift lines. */ 7319304Speter#define L_YANKED 6 /* Yanked lines. */ 7419304Speter recno_t rptlchange; /* Ex/vi: last L_CHANGED lno. */ 7519304Speter recno_t rptlines[L_YANKED + 1];/* Ex/vi: lines changed by last op. */ 7619304Speter 77254225Speter TEXTH tiq[1]; /* Ex/vi: text input queue. */ 7819304Speter 7919304Speter SCRIPT *script; /* Vi: script mode information .*/ 8019304Speter 8119304Speter recno_t defscroll; /* Vi: ^D, ^U scroll information. */ 8219304Speter 8319304Speter /* Display character. */ 84254225Speter char cname[MAX_CHARACTER_COLUMNS + 1]; 8519304Speter size_t clen; /* Length of display character. */ 86254225Speter ARG_CHAR_T lastc; /* The last display character. */ 8719304Speter 8819304Speter enum { /* Vi editor mode. */ 8919304Speter SM_APPEND = 0, SM_CHANGE, SM_COMMAND, SM_INSERT, 9019304Speter SM_REPLACE } showmode; 9119304Speter 9219304Speter void *ex_private; /* Ex private area. */ 9319304Speter void *vi_private; /* Vi private area. */ 94254225Speter void *cl_private; /* Curses private area. */ 9519304Speter 96254225Speter CONV conv; /* Conversion functions. */ 97254225Speter CONVWIN cw; /* Conversion buffer. */ 98254225Speter 9919304Speter/* PARTIALLY OR COMPLETELY COPIED FROM PREVIOUS SCREEN. */ 10019304Speter char *alt_name; /* Ex/vi: alternate file name. */ 10119304Speter 10219304Speter CHAR_T at_lbuf; /* Ex/vi: Last executed at buffer. */ 10319304Speter 10419304Speter /* Ex/vi: re_compile flags. */ 10519304Speter#define RE_C_CSCOPE 0x0001 /* Compile cscope pattern. */ 10619304Speter#define RE_C_SEARCH 0x0002 /* Compile search replacement. */ 10719304Speter#define RE_C_SILENT 0x0004 /* No error messages. */ 10819304Speter#define RE_C_SUBST 0x0008 /* Compile substitute replacement. */ 10919304Speter#define RE_C_TAG 0x0010 /* Compile ctag pattern. */ 11019304Speter 111254225Speter#define RE_WSTART L("[[:<:]]") /* Ex/vi: not-in-word search pattern. */ 112254225Speter#define RE_WSTOP L("[[:>:]]") 113254225Speter#define RE_WSTART_LEN (SIZE(RE_WSTART) - 1) 114254225Speter#define RE_WSTOP_LEN (SIZE(RE_WSTOP) - 1) 11519304Speter /* Ex/vi: flags to search routines. */ 11619304Speter#define SEARCH_CSCOPE 0x0001 /* Search for a cscope pattern. */ 11719304Speter#define SEARCH_EOL 0x0002 /* Offset past EOL is okay. */ 11819304Speter#define SEARCH_FILE 0x0004 /* Search the entire file. */ 11919304Speter#define SEARCH_INCR 0x0008 /* Search incrementally. */ 12019304Speter#define SEARCH_MSG 0x0010 /* Display search messages. */ 12119304Speter#define SEARCH_PARSE 0x0020 /* Parse the search pattern. */ 12219304Speter#define SEARCH_SET 0x0040 /* Set search direction. */ 12319304Speter#define SEARCH_TAG 0x0080 /* Search for a tag pattern. */ 12419304Speter#define SEARCH_WMSG 0x0100 /* Display search-wrapped messages. */ 12519304Speter 12619304Speter /* Ex/vi: RE information. */ 12719304Speter dir_t searchdir; /* Last file search direction. */ 12819304Speter regex_t re_c; /* Search RE: compiled form. */ 129254225Speter CHAR_T *re; /* Search RE: uncompiled form. */ 13019304Speter size_t re_len; /* Search RE: uncompiled length. */ 13119304Speter regex_t subre_c; /* Substitute RE: compiled form. */ 132254225Speter CHAR_T *subre; /* Substitute RE: uncompiled form. */ 13319304Speter size_t subre_len; /* Substitute RE: uncompiled length). */ 134254225Speter CHAR_T *repl; /* Substitute replacement. */ 13519304Speter size_t repl_len; /* Substitute replacement length.*/ 13619304Speter size_t *newl; /* Newline offset array. */ 13719304Speter size_t newl_len; /* Newline array size. */ 13819304Speter size_t newl_cnt; /* Newlines in replacement. */ 13919304Speter u_int8_t c_suffix; /* Edcompatible 'c' suffix value. */ 14019304Speter u_int8_t g_suffix; /* Edcompatible 'g' suffix value. */ 14119304Speter 14219304Speter OPTION opts[O_OPTIONCOUNT]; /* Ex/vi: Options. */ 14319304Speter 14419304Speter/* 14519304Speter * Screen flags. 14619304Speter * 14719304Speter * Editor screens. 14819304Speter */ 14919304Speter#define SC_EX 0x00000001 /* Ex editor. */ 15019304Speter#define SC_VI 0x00000002 /* Vi editor. */ 15119304Speter 15219304Speter/* 15319304Speter * Screen formatting flags, first major, then minor. 15419304Speter * 15519304Speter * SC_SCR_EX 15619304Speter * Ex screen, i.e. cooked mode. 15719304Speter * SC_SCR_VI 15819304Speter * Vi screen, i.e. raw mode. 15919304Speter * SC_SCR_EXWROTE 16019304Speter * The editor had to write on the screen behind curses' back, and we can't 16119304Speter * let curses change anything until the user agrees, e.g. entering the 16219304Speter * commands :!utility followed by :set. We have to switch back into the 16319304Speter * vi "editor" to read the user's command input, but we can't touch the 16419304Speter * rest of the screen because it's known to be wrong. 16519304Speter * SC_SCR_REFORMAT 16619304Speter * The expected presentation of the lines on the screen have changed, 16719304Speter * requiring that the intended screen lines be recalculated. Implies 16819304Speter * SC_SCR_REDRAW. 16919304Speter * SC_SCR_REDRAW 17019304Speter * The screen doesn't correctly represent the file; repaint it. Note, 17119304Speter * setting SC_SCR_REDRAW in the current window causes *all* windows to 17219304Speter * be repainted. 17319304Speter * SC_SCR_CENTER 17419304Speter * If the current line isn't already on the screen, center it. 17519304Speter * SC_SCR_TOP 17619304Speter * If the current line isn't already on the screen, put it at the to@. 17719304Speter */ 17819304Speter#define SC_SCR_EX 0x00000004 /* Screen is in ex mode. */ 17919304Speter#define SC_SCR_VI 0x00000008 /* Screen is in vi mode. */ 18019304Speter#define SC_SCR_EXWROTE 0x00000010 /* Ex overwrite: see comment above. */ 18119304Speter#define SC_SCR_REFORMAT 0x00000020 /* Reformat (refresh). */ 18219304Speter#define SC_SCR_REDRAW 0x00000040 /* Refresh. */ 18319304Speter 18419304Speter#define SC_SCR_CENTER 0x00000080 /* Center the line if not visible. */ 18519304Speter#define SC_SCR_TOP 0x00000100 /* Top the line if not visible. */ 18619304Speter 18719304Speter/* Screen/file changes. */ 18819304Speter#define SC_EXIT 0x00000200 /* Exiting (not forced). */ 18919304Speter#define SC_EXIT_FORCE 0x00000400 /* Exiting (forced). */ 19019304Speter#define SC_FSWITCH 0x00000800 /* Switch underlying files. */ 19119304Speter#define SC_SSWITCH 0x00001000 /* Switch screens. */ 19219304Speter 19319304Speter#define SC_ARGNOFREE 0x00002000 /* Argument list wasn't allocated. */ 19419304Speter#define SC_ARGRECOVER 0x00004000 /* Argument list is recovery files. */ 19519304Speter#define SC_AT_SET 0x00008000 /* Last at buffer set. */ 19619304Speter#define SC_COMEDIT 0x00010000 /* Colon command-line edit window. */ 19719304Speter#define SC_EX_GLOBAL 0x00020000 /* Ex: executing a global command. */ 19819304Speter#define SC_EX_SILENT 0x00040000 /* Ex: batch script. */ 19919304Speter#define SC_EX_WAIT_NO 0x00080000 /* Ex: don't wait for the user. */ 20019304Speter#define SC_EX_WAIT_YES 0x00100000 /* Ex: do wait for the user. */ 20119304Speter#define SC_READONLY 0x00200000 /* Persistent readonly state. */ 20219304Speter#define SC_RE_SEARCH 0x00400000 /* Search RE has been compiled. */ 20319304Speter#define SC_RE_SUBST 0x00800000 /* Substitute RE has been compiled. */ 20419304Speter#define SC_SCRIPT 0x01000000 /* Shell script window. */ 20519304Speter#define SC_STATUS 0x02000000 /* Welcome message. */ 20619304Speter#define SC_STATUS_CNT 0x04000000 /* Welcome message plus file count. */ 20719304Speter#define SC_TINPUT 0x08000000 /* Doing text input. */ 20819304Speter#define SC_TINPUT_INFO 0x10000000 /* Doing text input on info line. */ 209254225Speter#define SC_CONV_ERROR 0x20000000 /* Met with a conversion error. */ 21019304Speter u_int32_t flags; 21119304Speter}; 212