1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22
23/*
24 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
25 * Use is subject to license terms.
26 */
27
28/*	Copyright (c) 1988 AT&T	*/
29/*	  All Rights Reserved	*/
30
31/*
32 * University Copyright- Copyright (c) 1982, 1986, 1988
33 * The Regents of the University of California
34 * All Rights Reserved
35 *
36 * University Acknowledgment- Portions of this document are derived from
37 * software developed by the University of California, Berkeley, and its
38 * contributors.
39 */
40
41#ifndef _CURSHDR_H
42#define	_CURSHDR_H
43
44#pragma ident	"%Z%%M%	%I%	%E% SMI"
45
46#ifdef	__cplusplus
47extern "C" {
48#endif
49
50#define	_NOHASH		(-1)	/* if the hash value is unknown */
51#define	_REDRAW		(-2)	/* if line need redrawn */
52#define	_BLANK		(-3)	/* if line is blank */
53#define	_THASH		(123)	/* base hash if clash with other hashes */
54#define	_KEY		(01)
55#define	_MACRO		(02)
56
57#define	_INPUTPENDING	cur_term->_iwait
58#define	_PUTS(x, y)	(void) tputs(x, y, _outch)
59#define	_VIDS(na, oa)	(vidupdate((na), (oa), _outch), curscr->_attrs = (na))
60#define	_ONINSERT()	(_PUTS(enter_insert_mode, 1), SP->phys_irm = TRUE)
61#define	_OFFINSERT()	(_PUTS(exit_insert_mode, 1), SP->phys_irm = FALSE)
62#define	_STRNOTEQ(a, b)	(a == NULL ? (b != NULL) : \
63			    (b == NULL ? 1 : strcmp(a, b)))
64
65/*
66 * IC and IL overheads and costs should be set to this
67 * value if the corresponding feature is missing
68 */
69
70#define	LARGECOST	500
71
72typedef	struct
73{
74    short	icfixed;		/* Insert char fixed overhead */
75    short	dcfixed;		/* Delete char fixed overhead */
76    short	Insert_character;
77    short	Delete_character;
78    short	Cursor_home;
79    short	Cursor_to_ll;
80    short	Cursor_left;
81    short	Cursor_right;
82    short	Cursor_down;
83    short	Cursor_up;
84    short	Carriage_return;
85    short	Tab;
86    short	Back_tab;
87    short	Clr_eol;
88    short	Clr_bol;
89    short	Parm_ich;
90    short	Parm_dch;
91    short	Parm_left_cursor;
92    short	Parm_up_cursor;
93    short	Parm_down_cursor;
94    short	Parm_right_cursor;
95    short	Cursor_address;
96    short	Row_address;
97} COSTS;
98
99#define	_COST(field)	(SP->term_costs.field)
100
101/* Soft label keys */
102
103#define	LABMAX	16	/* max number of labels allowed */
104#define	LABLEN	8	/* max length of each label */
105
106typedef	struct
107{
108    WINDOW	*_win;		/* the window to display labels */
109    char	_ldis[LABMAX][LABLEN+1]; /* labels suitable to display */
110    char	_lval[LABMAX][LABLEN+1]; /* labels' true values */
111    short	_labx[LABMAX];	/* where to display labels */
112    short	_num;		/* actual number of labels */
113    short	_len;		/* real length of labels */
114    bool	_changed;	/* TRUE if some labels changed */
115    bool	_lch[LABMAX];	/* change status */
116} SLK_MAP;
117
118struct	screen
119{
120    unsigned	fl_echoit : 1;	/* in software echo mode */
121    unsigned	fl_endwin : 2;	/* has called endwin */
122    unsigned	fl_meta : 1;	/* in meta mode */
123    unsigned	fl_nonl : 1;	/* do not xlate input \r-> \n */
124    unsigned	yesidln : 1;	/* has idln capabilities */
125    unsigned	dmode : 1;	/* Terminal has delete mode */
126    unsigned	imode : 1;	/* Terminal has insert mode */
127    unsigned	ichok : 1;	/* Terminal can insert characters */
128    unsigned	dchok : 1;	/* Terminal can delete characters */
129    unsigned	sid_equal : 1;	/* enter insert and delete mode equal */
130    unsigned	eid_equal : 1;	/* exit insert and delete mode equal */
131    unsigned	phys_irm : 1;	/* in insert mode or not */
132    long	baud;		/* baud rate of this tty */
133    short	kp_state;	/* 1 iff keypad is on, else 0 */
134    short	Yabove;		/* How many lines are above stdscr */
135    short	lsize;		/* How many lines decided by newscreen */
136    short	csize;		/* How many columns decided by newscreen */
137    short	tsize;		/* How big is a tab decided by newscreen */
138    WINDOW	*std_scr;	/* primary output screen */
139    WINDOW	*cur_scr;	/* what's physically on the screen */
140    WINDOW	*virt_scr;	/* what's virtually on the screen */
141    int		*cur_hash;	/* hash table of curscr */
142    int		*virt_hash;	/* hash table of virtscr */
143    TERMINAL	*tcap;		/* TERMINFO info */
144    FILE	*term_file;	/* File to write on for output. */
145    FILE	*input_file;	/* Where to get keyboard input */
146    SLK_MAP	*slk;		/* Soft label information */
147    char	**_mks;		/* marks, only used with xhp terminals */
148    COSTS	term_costs;	/* costs of various capabilities */
149    SGTTY	save_tty_buf;	/* saved termio state of this tty */
150#ifdef	SYSV
151    SGTTYS	save_tty_bufs;	/* saved termios state of this tty */
152#endif
153    char	**_color_mks;	/* marks, only used with color xhp terminals */
154    unsigned long  _trap_mbe;		/* trap these mouse button events    */
155    unsigned long  _map_mbe_to_key;	/* map selected buttons on top of    */
156					/* slk's to function keys */
157};
158
159extern	SCREEN	*SP;
160extern	WINDOW	*_virtscr;
161
162#ifdef	DEBUG
163#ifndef	outf
164extern	FILE	*outf;
165#endif	/* outf */
166#endif	/* DEBUG */
167
168extern	short	cswidth[],	/* byte size of multi-byte chars */
169		_curs_scrwidth[];	/* display size */
170extern	short	_csmax,
171		_scrmax;
172extern	bool	_mbtrue;
173
174#define	MBIT		0200		/* indicator for a multi-byte char */
175#define	CBIT		002000000000	/* indicator for a continuing col */
176#define	RBYTE(x)	((x) & 0377)
177#define	LBYTE(x)	(((x) >> 8) & 0177)
178#define	ISMBIT(x)	((x) & MBIT)
179#define	SETMBIT(x)	((x) |= MBIT)
180#define	CLRMBIT(x)	((x) &= ~MBIT)
181#define	ISCBIT(x)	((x) & CBIT)
182#define	SETCBIT(x)	((x) |= CBIT)
183#define	CLRCBIT(x)	((x) &= ~CBIT)
184#define	TYPE(x)		((x) == SS2 ? 1 : (x) == SS3 ? 2 : ISMBIT(x) ? 0 : 3)
185#define	TRIM		037777777777	/* 0xFFFFFFFF */
186
187/* terminfo magic number */
188#define	MAGNUM	0432
189
190/* curses screen dump magic number */
191#define	SVR2_DUMP_MAGIC_NUMBER	0433
192#define	SVR3_DUMP_MAGIC_NUMBER	0434
193
194/* Getting the baud rate is different on the two systems. */
195
196#ifdef	SYSV
197#define	_BR(x)	(x.c_cflag & CBAUD)
198#define	_BRS(x)	(cfgetospeed(&x))
199#include	<values.h>
200#else	/* SYSV */
201#define	BITSPERBYTE	8
202#define	MAXINT		32767
203#define	_BR(x)	(x.sg_ispeed)
204#endif	/* SYSV */
205
206#define	_BLNKCHAR	' '
207#define	_CTRL(c)	(c | 0100)
208#define	_ATTR(c)	((c) & A_ATTRIBUTES)
209#define	_CHAR(c)	((c) & A_CHARTEXT)
210
211/*
212 *	combine CHAR par of the character with the attributes of the window.
213 *	Two points: 1) If character is blank, usebackground instead
214 *		    2) If character contains color, delete color from
215 *			window attribute.
216 */
217
218#define	_WCHAR(w, c)    (_CHAR((c) == _BLNKCHAR ? (w)->_bkgd : (c))| \
219			    (((c) & A_COLOR) ? ((w)->_attrs & ~A_COLOR) : \
220			    ((w)->_attrs)))
221
222#define	_DARKCHAR(c)	((c) != _BLNKCHAR)
223#define	_UNCTRL(c)	((c) ^ 0100)
224
225/* blank lines info of curscr */
226#define	_BEGNS		curscr->_firstch
227#define	_ENDNS		curscr->_lastch
228
229/* hash tables */
230#define	_CURHASH	SP->cur_hash
231#define	_VIRTHASH	SP->virt_hash
232
233/* top/bot line changed */
234#define	_VIRTTOP	_virtscr->_parx
235#define	_VIRTBOT	_virtscr->_pary
236
237/* video marks */
238#define	_MARKS		SP->_mks
239#define	_COLOR_MARKS	SP->_color_mks
240
241#define	_NUMELEMENTS(x)	(sizeof (x)/sizeof (x[0]))
242
243#ifdef	_VR3_COMPAT_CODE
244/*
245 * #define	_TO_OCHTYPE(x)		((_ochtype)(((x&A_ATTRIBUTES)>>9)| \
246 * 						(x&0x0000007FUL)))
247 */
248#define	_TO_OCHTYPE(x)		((_ochtype)(((x&A_ATTRIBUTES)>>9)|(x&0177)))
249#define	_FROM_OCHTYPE(x)	((chtype) ((x&0177) | ((x&0177600)<<9)))
250extern	void	(*_y16update)(WINDOW *, int, int, int, int);
251#endif	/* _VR3_COMPAT_CODE */
252
253/* functions for screen updates */
254
255extern	int	(*_setidln)(void);
256extern	int	(*_useidln)(void);
257extern	int	(*_quick_ptr)(WINDOW *, chtype);
258extern	int	(_quick_echo)(WINDOW *, chtype);
259
260/* min/max functions */
261
262#define	_MIN(a, b)	((a) < (b) ? (a) : (b))
263#define	_MAX(a, b)	((a) > (b) ? (a) : (b))
264
265extern	int	(*_do_slk_ref)(void);
266extern	int	(*_do_slk_tch)(void);
267extern	int	(*_do_slk_noref)(void);
268extern	int	_image(WINDOW *);
269extern	int	_outch(char);
270extern	int	_outwch(chtype);
271extern	int	_chkinput(void);
272extern	int	_curs_mbtowc(wchar_t *, const char *, size_t);
273extern	int	_curs_wctomb(char *, wchar_t);
274extern	int	_delay(int, int (*)(char));
275extern	int	_mbaddch(WINDOW *, chtype, chtype);
276extern	int	_mbclrch(WINDOW *, int, int);
277extern	int	_mbinsshift(WINDOW *, int), _mbvalid(WINDOW *);
278extern	int	_padjust(WINDOW *, int, int, int, int, int, int);
279extern	int	_prefresh(int (*)(WINDOW *), WINDOW *, int, int, int,
280		int, int, int);
281extern	int	_overlap(WINDOW *, WINDOW *, int);
282extern	int	_scr_all(char *, int);
283extern	int	_slk_update(void);
284extern	int	_tcsearch(char *, short [], char *[], int, int);
285extern	int	_vsscanf(const char *, const char *, __va_list);
286extern	int	force_doupdate(void);
287extern	int	init_acs(void);
288extern	int	mbscrw(int);
289extern	int	mbeucw(int);
290extern	int	scr_ll_dump(FILE *);
291extern	int	scr_reset(FILE *, int);
292extern	int	setkeymap(void);
293extern	int	ttimeout(int);
294extern	int	wadjcurspos(WINDOW *);
295extern	int	wcscrw(wchar_t);
296extern	int	wmbmove(WINDOW *, int, int);
297
298extern	chtype	tgetch(int);
299
300extern	WINDOW	*_makenew(int, int, int, int);
301
302extern	void	(*_slk_init)(void);
303extern	void	(*_rip_init)(void);
304extern	void	delkeymap(TERMINAL *);
305extern	void	mbgetwidth(void);
306extern	void	memSset(chtype *, chtype, int);
307extern	void	_blast_keys(TERMINAL *);
308extern	void	_init_costs(void);
309extern	void	_init_HP_pair(short, short, short);
310extern	void	_update_old_y_area(WINDOW *, int, int, int, int);
311
312extern	char    *tparm_p0(char *);
313extern	char    *tparm_p1(char *, long);
314extern	char    *tparm_p2(char *, long, long);
315extern	char    *tparm_p3(char *, long, long, long);
316extern	char    *tparm_p4(char *, long, long, long, long);
317extern	char    *tparm_p7(char *, long, long, long, long, long, long, long);
318
319
320extern	char	*infotocap(char *, int *);
321extern	char	*_strcode2byte(wchar_t *, char *, int);
322extern	char	*wmbinch(WINDOW *, int, int);
323
324#ifdef	__cplusplus
325}
326#endif
327
328#endif	/* _CURSHDR_H */
329