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