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