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