1 /* Copyright (c) 1998, 1999, 2001, 2002 John E. Davis
2  * This file is part of the S-Lang library.
3  *
4  * You may distribute under the terms of either the GNU General Public
5  * License or the Perl Artistic License.
6  */
7 #include <stdio.h>
8 
9 #ifndef SLANG_VERSION
10 # include <slang.h>
11 #endif
12 
13 /* This is a temporary hack until lynx is fixed to not include this file. */
14 #ifndef LYCURSES_H
15 
16 typedef struct
17 {
18    unsigned int _begy, _begx, _maxy, _maxx;
19    unsigned int _curx, _cury;
20    unsigned int nrows, ncols;
21    unsigned int scroll_min, scroll_max;
22    SLsmg_Char_Type **lines;
23    SLsmg_Char_Type color;
24    int is_subwin;
25    SLtt_Char_Type attr;
26    int delay_off;
27    int scroll_ok;
28    int modified;
29    int has_box;
30    int use_keypad;
31 }
32 SLcurses_Window_Type;
33 
34 extern int SLcurses_wclrtobot (SLcurses_Window_Type *);
35 extern int SLcurses_wscrl (SLcurses_Window_Type *, int);
36 extern int SLcurses_wrefresh (SLcurses_Window_Type *);
37 extern int SLcurses_delwin (SLcurses_Window_Type *);
38 extern int SLcurses_wprintw (SLcurses_Window_Type *, char *, ...);
39 extern SLcurses_Window_Type *SLcurses_newwin (unsigned int, unsigned int,
40 					      unsigned int, unsigned int);
41 
42 extern SLcurses_Window_Type *SLcurses_subwin (SLcurses_Window_Type *,
43 					      unsigned int, unsigned int,
44 					      unsigned int, unsigned int);
45 
46 extern int SLcurses_wnoutrefresh (SLcurses_Window_Type *);
47 extern int SLcurses_wclrtoeol (SLcurses_Window_Type *);
48 
49 extern int SLcurses_wmove (SLcurses_Window_Type *, unsigned int, unsigned int);
50 extern int SLcurses_waddch (SLcurses_Window_Type *, SLtt_Char_Type);
51 extern int SLcurses_waddnstr (SLcurses_Window_Type *, char *, int);
52 
53 #define waddnstr		SLcurses_waddnstr
54 #define waddch			SLcurses_waddch
55 #define waddstr(w,s)		waddnstr((w),(s),-1)
56 #define addstr(x)		waddstr(stdscr, (x))
57 #define addnstr(s,n)		waddnstr(stdscr,(s),(n))
58 #define addch(ch)      		waddch(stdscr,(ch))
59 
60 #define mvwaddnstr(w,y,x,s,n) \
61   (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s),(n)))
62 #define mvwaddstr(w,y,x,s) \
63   (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s), -1))
64 #define mvaddnstr(y,x,s,n)	mvwaddnstr(stdscr,(y),(x),(s),(n))
65 #define mvaddstr(y,x,s)       	mvwaddstr(stdscr,(y),(x),(s))
66 #define mvwaddch(w,y,x,c) \
67   ((-1 == wmove((w),(y),(x))) ? -1 : waddch((w),(c)))
68 #define mvaddch(y,x,c)         	mvwaddch(stdscr,(y),(x),(c))
69 
70 extern int SLcurses_wclear (SLcurses_Window_Type *w);
71 extern int SLcurses_printw (char *, ...);
72 
73 #if 0
74 /* Why are these functions part of curses??? */
75 extern int SLcurses_mvwscanw (SLcurses_Window_Type *, unsigned int, unsigned int,
76 			      char *, ...);
77 extern int SLcurses_wscanw (SLcurses_Window_Type *, char *, ...);
78 extern int SLcurses_scanw (char *, ...);
79 #define mvwscanw SLcurses_mvwscanw
80 #define wscanw SLcurses_wscanw
81 #define scanw SLcurses_scanw
82 #endif
83 
84 extern SLcurses_Window_Type *SLcurses_Stdscr;
85 #define WINDOW SLcurses_Window_Type
86 #define stdscr SLcurses_Stdscr
87 
88 #define subwin		SLcurses_subwin
89 #define wclrtobot	SLcurses_wclrtobot
90 #define wscrl		SLcurses_wscrl
91 #define scrl(n)		wscrl(stdscr,(n))
92 #define scroll(w)	wscrl((w),1)
93 #define wrefresh	SLcurses_wrefresh
94 #define delwin		SLcurses_delwin
95 #define wmove		SLcurses_wmove
96 #define newwin		SLcurses_newwin
97 #define wnoutrefresh	SLcurses_wnoutrefresh
98 #define werase(w)	SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w)
99 #define wclear(w)	SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w)
100 #define wprintw		SLcurses_wprintw
101 #define mvwprintw	SLcurses_mvwprintw
102 
103 #define winch(w) \
104     ((((w)->_cury < (w)->nrows) && ((w)->_curx < (w)->ncols)) \
105        ? ((w)->lines[(w)->_cury][(w)->_curx]) : 0)
106 
107 #define inch() winch(stdscr)
108 #define mvwinch(w,x,y) \
109     ((-1 != wmove((w),(x),(y))) ? winch(w) : (-1))
110 #define doupdate SLsmg_refresh
111 
112 #define mvwin(w,a,b) ((w)->_begy = (a), (w)->_begx = (b))
113 
114 extern int SLcurses_mvprintw (int, int, char *, ...);
115 extern int SLcurses_mvwprintw (SLcurses_Window_Type *, int, int, char *, ...);
116 extern int SLcurses_has_colors(void);
117 extern int SLcurses_nil (void);
118 extern int SLcurses_wgetch (SLcurses_Window_Type *);
119 extern int SLcurses_getch (void);
120 
121 extern int SLcurses_wattrset (SLcurses_Window_Type *, SLtt_Char_Type);
122 extern int SLcurses_wattron (SLcurses_Window_Type *, SLtt_Char_Type);
123 extern int SLcurses_wattroff (SLcurses_Window_Type *, SLtt_Char_Type);
124 #define attrset(x) SLcurses_wattrset(stdscr, (x))
125 #define attron(x) SLcurses_wattron(stdscr, (x))
126 #define attroff(x) SLcurses_wattroff(stdscr, (x))
127 #define wattrset(w, x) SLcurses_wattrset((w), (x))
128 #define wattron(w, x) SLcurses_wattron((w), (x))
129 #define wattroff(w, x) SLcurses_wattroff((w), (x))
130 #define wattr_get(w) ((w)->color << 8)
131 #define attr_get() wattr_get(stdscr)
132 
133 #define COLOR_PAIR(x) ((x) << 8)
134 
135 extern int SLcurses_start_color (void);
136 #define start_color SLcurses_start_color
137 
138 #define ERR 0xFFFF
139 #define wgetch SLcurses_wgetch
140 #define getch SLcurses_getch
141 
142 extern int SLcurses_nodelay (SLcurses_Window_Type *, int);
143 extern SLcurses_Window_Type *SLcurses_initscr (void);
144 #define initscr SLcurses_initscr
145 
146 extern int SLcurses_cbreak (void);
147 extern int SLcurses_raw (void);
148 #define cbreak SLcurses_cbreak
149 #define crmode SLcurses_cbreak
150 #define raw SLcurses_raw
151 #define noraw SLang_reset_tty
152 #define nocbreak SLang_reset_tty
153 
154 #define mvprintw SLcurses_mvprintw
155 #define has_colors SLcurses_has_colors
156 #define nodelay SLcurses_nodelay
157 
158 #define ungetch SLang_ungetkey
159 
160 #define COLS SLtt_Screen_Cols
161 #define LINES SLtt_Screen_Rows
162 
163 #define move(x,y) SLcurses_wmove(stdscr, (x), (y))
164 #define wclrtoeol SLcurses_wclrtoeol
165 #define clrtoeol() SLcurses_wclrtoeol(stdscr)
166 #define clrtobot() SLcurses_wclrtobot(stdscr)
167 
168 #define printw SLcurses_printw
169 #define mvprintw SLcurses_mvprintw
170 #define wstandout(w) SLcurses_wattrset((w),A_STANDOUT)
171 #define wstandend(w) SLcurses_wattrset((w),A_NORMAL)
172 #define standout() SLcurses_wattrset(stdscr,A_STANDOUT)
173 #define standend() SLcurses_wattrset(stdscr,A_NORMAL)
174 
175 #define refresh() SLcurses_wrefresh(stdscr)
176 #define clear() SLcurses_wclear(stdscr)
177 #define erase() werase(stdscr)
178 #define touchline SLsmg_touch_lines
179 #define resetterm SLang_reset_tty
180 
181 extern int SLcurses_endwin (void);
182 #define endwin SLcurses_endwin
183 extern int SLcurses_Is_Endwin;
184 #define isendwin() SLcurses_Is_Endwin
185 
186 #define keypad(w,x) ((w)->use_keypad = (x))
187 
188 #define KEY_MIN		SL_KEY_UP
189 #define KEY_DOWN	SL_KEY_DOWN
190 #define KEY_UP		SL_KEY_UP
191 #define KEY_LEFT	SL_KEY_LEFT
192 #define KEY_RIGHT	SL_KEY_RIGHT
193 #define KEY_A1		SL_KEY_A1
194 #define KEY_B1		SL_KEY_B1
195 #define KEY_C1		SL_KEY_C1
196 #define KEY_A2		SL_KEY_A2
197 #define KEY_B2		SL_KEY_B2
198 #define KEY_C2		SL_KEY_C2
199 #define KEY_A3		SL_KEY_A3
200 #define KEY_B3		SL_KEY_B3
201 #define KEY_C3		SL_KEY_C3
202 #define KEY_REDO	SL_KEY_REDO
203 #define KEY_UNDO	SL_KEY_UNDO
204 #define KEY_BACKSPACE	SL_KEY_BACKSPACE
205 #define KEY_PPAGE	SL_KEY_PPAGE
206 #define KEY_NPAGE	SL_KEY_NPAGE
207 #define KEY_HOME	SL_KEY_HOME
208 #define KEY_END		SL_KEY_END
209 #define KEY_F0		SL_KEY_F0
210 #define KEY_F		SL_KEY_F
211 #define KEY_ENTER	SL_KEY_ENTER
212 #define KEY_MAX		0xFFFF
213 
214 /* Ugly Hacks that may not work */
215 #define flushinp SLcurses_nil
216 #define winsertln(w) \
217   ((w)->scroll_min=(w)->_cury, \
218    (w)->scroll_max=(w)->nrows, \
219    wscrl((w), -1))
220 
221 extern SLtt_Char_Type SLcurses_Acs_Map [128];
222 #define acs_map SLcurses_Acs_Map
223 
224 #define ACS_ULCORNER (acs_map[SLSMG_ULCORN_CHAR])
225 #define ACS_URCORNER (acs_map[SLSMG_URCORN_CHAR])
226 #define ACS_LRCORNER (acs_map[SLSMG_LRCORN_CHAR])
227 #define ACS_LLCORNER (acs_map[SLSMG_LLCORN_CHAR])
228 #define ACS_TTEE (acs_map[SLSMG_UTEE_CHAR])
229 #define ACS_LTEE (acs_map[SLSMG_LTEE_CHAR])
230 #define ACS_RTEE (acs_map[SLSMG_RTEE_CHAR])
231 #define ACS_BTEE (acs_map[SLSMG_DTEE_CHAR])
232 #define ACS_PLUS (acs_map[SLSMG_PLUS_CHAR])
233 #define ACS_VLINE (acs_map[SLSMG_VLINE_CHAR])
234 #define ACS_HLINE (acs_map[SLSMG_HLINE_CHAR])
235 #define ACS_S1		'-'
236 #define ACS_S9		'-'
237 #define ACS_DIAMOND		'&'
238 #define ACS_CKBOARD		(acs_map[SLSMG_CKBRD_CHAR])
239 #define ACS_DEGREE		'o'
240 #define ACS_PLMINUS		'+'
241 #define ACS_BULLET		'*'
242 #define ACS_LARROW		'<'
243 #define ACS_RARROW		'>'
244 #define ACS_DARROW		'v'
245 #define ACS_UARROW		'^'
246 #define ACS_BOARD		'#'
247 #define ACS_LANTERN		'#'
248 #define ACS_BLOCK		'#'
249 
250 #if 1
251 #define hline(x,y) SLcurses_nil ()
252 #define vline(x,y) SLcurses_nil ()
253 #endif
254 
255 #define A_CHARTEXT	0x00FF
256 #define A_NORMAL 0
257 #define A_BOLD		0x1000
258 #define A_REVERSE	0x2000
259 #define A_STANDOUT	A_REVERSE
260 #define A_UNDERLINE	0x4000
261 #define A_BLINK		0
262 #define A_COLOR		0x0700
263 #define A_ALTCHARSET	0x8000
264 #define A_DIM		0
265 #define A_PROTECT	0
266 #define A_INVIS		0
267 
268 #define COLOR_BLACK	SLSMG_COLOR_BLACK
269 #define COLOR_RED	SLSMG_COLOR_RED
270 #define COLOR_GREEN	SLSMG_COLOR_GREEN
271 #define COLOR_YELLOW	SLSMG_COLOR_BROWN
272 #define COLOR_BLUE	SLSMG_COLOR_BLUE
273 #define COLOR_MAGENTA	SLSMG_COLOR_MAGENTA
274 #define COLOR_CYAN	SLSMG_COLOR_CYAN
275 #define COLOR_WHITE	SLSMG_COLOR_LGRAY
276 
277 extern int SLcurses_Num_Colors;
278 #define COLORS		SLcurses_Num_Colors
279 #define COLOR_PAIRS	(SLcurses_Num_Colors*SLcurses_Num_Colors)
280 
281 #define init_pair(_x,_f,_b) \
282  SLtt_set_color_object((_x), ((_f) == (_b) ? 0x0700 : ((_f) | ((_b) << 8)) << 8))
283 
284 #define scrollok(a,b) ((a)->scroll_ok = (b))
285 #define getyx(a,y,x)  (y=(a)->_cury, x=(a)->_curx)
286 #define getmaxyx(a,y,x)  (y=(a)->nrows, x=(a)->ncols)
287 #ifdef napms
288 # undef napms
289 #endif
290 #define napms(x) usleep(1000 * (x))
291 typedef SLtt_Char_Type chtype;
292 #define beep SLtt_beep
293 #define curs_set(x) SLtt_set_cursor_visibility(x)
294 #define touchwin(x) SLsmg_touch_lines((x)->_begy, (x)->nrows)
295 #define flash SLtt_beep
296 
297 #define wsetscrreg(w,a,b)	((w)->scroll_min = (a), (w)->scroll_max = (b))
298 
299 #define wtimeout(a,b) (a)->delay_off = ((b >= 0) ? (b) / 100 : -1)
300 #define timeout(a) wtimeout(stdscr, a)
301 extern int SLcurses_wdelch (SLcurses_Window_Type *);
302 #if SLANG_HAS_KANJI_SUPPORT
303 extern int kSLcurses_wdelch (SLcurses_Window_Type *);
304 #endif
305 # define wdelch SLcurses_wdelch
306 #define delch() wdelch(stdscr)
307 
308 extern int SLcurses_winsch (SLcurses_Window_Type *, int);
309 #define winsch SLcurses_winsch
310 
311 extern int SLcurses_Esc_Delay;/* ESC expire time in milliseconds (ncurses compatible) */
312 #define ESCDELAY SLcurses_Esc_Delay
313 
314 extern int SLcurses_clearok (SLcurses_Window_Type *, int);
315 #define clearok SLcurses_clearok
316 
317 /* Functions that have not been implemented. */
318 #define copywin(w,v,a,b,c,d,e,f,g) SLcurses_nil()
319 #define wdeleteln(win) SLcurses_nil()
320 #define resetty SLcurses_nil
321 #define savetty SLcurses_nil
322 #define overlay(u,v) SLcurses_nil()
323 
324 /* These functions do nothing */
325 #define savetty SLcurses_nil
326 #define nonl    SLcurses_nil
327 #define echo SLcurses_nil
328 #define noecho SLcurses_nil
329 #define saveterm SLcurses_nil
330 #define box(w,y,z) ((w)->has_box = 1, (w)->modified = 1)
331 #define leaveok(a,b) SLcurses_nil()
332 #define nl() SLcurses_nil()
333 #define trace(x) SLcurses_nil()
334 #define tigetstr(x) NULL
335 
336 /* These have no place in C */
337 #define TRUE 1
338 #define FALSE 0
339 #define bool int
340 
341 /* Lynx compatability */
342 #else
343 
344 #define stdscr NULL
345 #define COLS SLtt_Screen_Cols
346 #define LINES SLtt_Screen_Rows
347 #define move SLsmg_gotorc
348 #define addstr SLsmg_write_string
349 #define clear SLsmg_cls
350 #define standout SLsmg_reverse_video
351 #define standend  SLsmg_normal_video
352 #define clrtoeol SLsmg_erase_eol
353 #define scrollok(a,b) SLsmg_Newline_Moves = ((b) ? 1 : -1)
354 #define addch SLsmg_write_char
355 #define echo()
356 #define printw SLsmg_printf
357 #define endwin SLsmg_reset_smg(),SLang_reset_tty
358 
359 #endif
360