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  * Copyright (c) 1996, by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * private.h
31  *
32  * XCurses Library
33  *
34  * Copyright 1990, 1995 by Mortice Kern Systems Inc.  All rights reserved.
35  *
36  */
37 
38 #include <mks.h>
39 #include <curses.h>
40 
41 #ifndef M_CURSES_VERSION
42 #define M_CURSES_VERSION        "MKS XCurses"
43 #endif
44 
45 #ifndef M_TERM_NAME
46 #define M_TERM_NAME             "dumb"
47 #endif
48 
49 #ifndef M_TERMINFO_DIR
50 #define M_TERMINFO_DIR          "/usr/lib/terminfo"
51 #endif
52 
53 /*
54  * Interbyte timer value used for processing multibyte function keys.
55  */
56 #ifndef M_CURSES_INTERBYTE_TIME
57 #define M_CURSES_INTERBYTE_TIME		10
58 #endif
59 
60 /*
61  * Maximum number of lines that can be ripped off.
62  */
63 #ifndef M_CURSES_MAX_RIPOFFLINE
64 #define M_CURSES_MAX_RIPOFFLINE		5
65 #endif
66 
67 /*
68  * See copywin() and wrefresh() case 4.  It is unclear whether XPG4 V2
69  * disallows supporting case 4 (expanding characters straddling a window
70  * boundary).
71  */
72 #define M_CURSES_SENSIBLE_WINDOWS
73 
74 /*
75  * Enable typeahead() support.
76  */
77 #define M_CURSES_TYPEAHEAD
78 
79 /*
80  * Not everyone supports the latest version of the (draft) MSE.
81  */
82 #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199409L
83 #undef wcrtomb
84 #define wcrtomb(mb, wc, state)		wctomb(mb, wc)
85 #undef mbrtowc
86 #define mbrtowc(wc, mb, n, state)	mbtowc(wc, mb, n)
87 #endif
88 
89 /***
90  *** END OF CONFIGURABLE SECTION
91  ***/
92 
93 /*
94  * Constant WINDOW definition attributes.
95  */
96 #define W_IS_PAD	0x0001	/* Window is a pad. */
97 #define W_END_LINE	0x0002	/* End of line is the margin. */
98 #define W_FULL_LINE	0x0004	/* Line spans screen width. */
99 #define W_FULL_WINDOW	0x0008	/* Window is full screen. */
100 #define W_SCROLL_WINDOW	0x0010	/* Touches bottom-right corner */
101 
102 /*
103  * WINDOW state.
104  */
105 #define W_CLEAR_WINDOW	0x0020	/* clearok() clear screen next update. */
106 #define W_REDRAW_WINDOW 0x0040	/* wredrawln() use simple() next update. */
107 
108 /*
109  * Configurable WINDOW options.
110  */
111 #define W_FLUSH		0x0080	/* immedok() update when window changes. */
112 #define W_CAN_SCROLL	0x0100	/* scrollok() window can software scroll. */
113 #define W_LEAVE_CURSOR	0x0200	/* leaveok() don't fuss with the cursor. */
114 #define W_SYNC_UP	0x0400	/* syncok() update ancestors when changed. */
115 #define W_USE_KEYPAD	0x0800	/* keypad() enbles KEY_ processing. */
116 #define W_USE_TIMEOUT	0x1000	/* notimeout() disables the interbyte timer. */
117 #define W_CONFIG_MASK	0x1f80 	/* Mask of configurable flags. */
118 
119 /*
120  * Flags used in SCREEN.
121  */
122 #define S_ECHO		0x0001	/* Software echo enbled. */
123 #define S_ENDWIN	0x0002	/* Curses is in "shell" mode. */
124 #define S_INS_DEL_CHAR	0x0004	/* idcok() enabled for terminal (future). */
125 #define S_INS_DEL_LINE	0x0008	/* idlok() enabled for terminal. */
126 #define S_ISATTY	0x0010	/* _kfd is a terminal. */
127 #define S_USE_META	0x0020	/* meta() enabled. */
128 
129 typedef struct t_decode {
130 	struct t_decode *sibling;
131 	struct t_decode *child;
132 	short key;			/* KEY_ value or 0. */
133 	int ch;				/* Character found by this node. */
134 } t_decode;
135 
136 typedef struct {
137 	int top;			/* # of lines off the top. */
138 	int bottom;			/* # of lines off the bottom (-ve). */
139 	struct {
140 		int dy;			/* Distance from screen top/bottom. */
141 		int (*init)(WINDOW *, int);	/* Init. function for window. */
142 	} line[M_CURSES_MAX_RIPOFFLINE];
143 } t_rip;
144 
145 extern SCREEN *__m_screen;
146 extern int __m_slk_format;
147 extern short __m_keyindex[][2];
148 
149 #define ATTR_STATE	cur_term->_at
150 
151 extern void __m_trace(const char *, ...);
152 
153 #ifdef M_CURSES_TRACE
154 extern int __m_return_code(const char *, int);
155 extern int __m_return_int(const char *, int);
156 extern chtype __m_return_chtype(const char *, chtype);
157 extern void *__m_return_pointer(const char *, const void *);
158 extern void __m_return_void(const char *);
159 #else
160 #define __m_return_code(s, c)		(c)
161 #define __m_return_int(s, c)		(c)
162 #define __m_return_chtype(s, c)		(c)
163 #define __m_return_pointer(s, p)	(p)
164 #define __m_return_void(s)
165 #endif /* M_CURSES_TRACE */
166 
167 extern int __m_wc_cc(wint_t, cchar_t *);
168 extern int __m_mbs_cc(const char *, attr_t, short, cchar_t *);
169 extern int __m_wcs_cc(const wchar_t *, attr_t, short, cchar_t *);
170 extern int __m_acs_cc(chtype, cchar_t *);
171 extern int __m_wacs_cc(const cchar_t *, cchar_t *);
172 extern int __m_cc_mbs(const cchar_t *, char *, int);
173 
174 extern int __m_cc_sort(cchar_t *);
175 extern int __m_cc_width(const cchar_t *);
176 extern int __m_cc_write(const cchar_t *);
177 extern int __m_cc_first(WINDOW *, int, int);
178 extern int __m_cc_next(WINDOW *, int, int);
179 extern int __m_cc_islast(WINDOW *, int, int);
180 extern int __m_cc_expand(WINDOW *, int, int, int);
181 extern int __m_cc_erase(WINDOW *, int, int, int, int);
182 extern int __m_cc_compare(const cchar_t *, const cchar_t *, int);
183 extern int __m_cc_replace(WINDOW *, int, int, const cchar_t *, int);
184 extern int __m_cc_add(WINDOW *, int, int, const cchar_t *, int, int *, int *);
185 extern void __m_cc_hash(WINDOW *, unsigned long *, int);
186 
187 extern int __m_set_echo(int);
188 extern int __m_tty_get(struct termios *);
189 extern int __m_tty_set(struct termios *);
190 extern int __m_decode_init(t_decode **);
191 extern void __m_decode_free(t_decode **);
192 extern int __m_do_scroll(WINDOW *, int, int, int *, int *);
193 extern int __m_ptr_move(void **, unsigned, unsigned, unsigned, unsigned);
194 
195 extern int __m_doupdate_init(void);
196 extern int __m_wins_wch(WINDOW *, int, int, const cchar_t *, int *, int *);
197 extern int __m_cc_ins(WINDOW *, int, int, const cchar_t *);
198 extern void __m_mvcur_cost(void);
199 
200 /*
201  * Unique callback functions to initialize a SCREEN's wide_io_t structure,
202  * which is used by __m_wio_get().   The __xc_ denotes XCurses and is used
203  * instead of __m_ to avoid possible name conflicts else-where in MKS
204  * libraries and applications.  Note that wgetch() is used for the get
205  * function.
206  */
207 extern int __xc_feof(void *);
208 extern int __xc_ferror(void *);
209 extern void __xc_clearerr(void *);
210 extern int __xc_ungetc(int, void *);
211 
212 /*
213  * Input stack macros.
214  */
215 #define ISFULL()	(__m_screen->_unget._size <= __m_screen->_unget._count)
216 #define ISEMPTY()	(__m_screen->_unget._count <= 0)
217 #define DEC()		--__m_screen->_unget._count
218 #define INC()		__m_screen->_unget._count++
219 #define RESET()		__m_screen->_unget._count = 0
220 #define POP()		__m_screen->_unget._stack[DEC()]
221 #define PUSH(x)		(__m_screen->_unget._stack[INC()] = (x))
222 
223 #define WSYNC(w)	(((w)->_flags & W_SYNC_UP) ? wsyncup(w) : (void) OK)
224 #define WFLUSH(w)	(((w)->_flags & W_FLUSH) ? wrefresh(w) : OK)
225 
226 /* end */
227