/*
 *
 *	Author	: Simon J Raybould.	(sie@fulcrum.bt.co.uk).
 *
 *	Date	: 8th April 1990.
 *
 *	Desc	: Header file for my AMIGA CURSES package.
 *		  This should be included instead of stdio.h, this will
 *		  stdio.h for you.
 *		  This file is Public Domain but please leave the name
 *		  of the author intact.
 *
 */


#ifndef stdin	/* May be a better way to do this !! */
#include <stdio.h>
#endif /* stdin */

#define LINES	(24)
#define COLS	(80)

#ifndef TRUE
#define TRUE	(1)
#define FALSE	(0)
#endif /* TRUE */

#define ERR	(-1)
#define OK	(0)


/*
 *	Macros
 */

#define addch(c)			waddch(stdscr, (c))
#define addstr(str)			waddstr(stdscr, (str))
#define attrset(attr)			wattrset(stdscr, (attr))
#define attron(attr)			wattron(stdscr, (attr))
#define attroff(attr)			wattroff(stdscr, (attr))
#define clear()				wclear(stdscr)
#define clrtoeol()			wclrtoeol(stdscr)
#define clrtobot()			wclrtobot(stdscr)
#define delch()				wdelch(stdscr)
#define deleteln()			wdeleteln(stdscr)
#define erase()				werase(stdscr)
#define inch()				winch(stdscr)
#define insch(c)			winsch(stdscr, (c))
#define insertln()			winsertln(stdscr)
#define getch()				wgetch(stdscr)
#define getstr(ptr)			wgetstr(stdscr, (ptr))
#define getyx(window, y, x)		((y) = window->_cury+window->_begy, \
					(x) = window->_curx + window->_begx)
#define move(line, col)			wmove(stdscr, (line), (col))
#define mvdelch(y, x)			(move((y), (x)), delch())
#define mvwdelch(win, y, x)		(wmove((win),(y),(x)),wdelch((win)))
#define mvgetch(y, x)			(move((y), (x)), getch())
#define mvwgetch(win, y, x)		(wmove((win),(y),(x)),wgetch((win)))
#define mvgetstr(y, x, ptr)		(move((y), (x)), getstr((ptr)))
#define mvwgetstr(win, y, x, ptr)	(wmove((win), (y), (x)), \
					wgetstr((win), (ptr)))
#define mvinsch(y, x, c)		(move((y), (x)), insch((c)))
#define mvwinsch(win, y, x, c)		(wmove((win), (y), (x)), \
					winsch((win), (c)))
#define mvinch(y, x)			(move((y), (x)), inch())
#define mvwinch(win, y, x)		(wmove((win), (y), (x)),winch((win)))
#define mvaddch(y, x, c)		(move((y), (x)), addch((c)))
#define mvwaddch(win, y, x, c)		(wmove((win), (y), (x)), \
					waddch((win), (c)))
#define mvaddstr(y, x, str)		(move((y), (x)), addstr((str)))
#define mvwaddstr(win, y, x, str)	(wmove((win), (y), (x)), \
					waddstr((win), (str)))
#define refresh()			wrefresh(stdscr)
#define setscrreg(top, bottom)		wsetscrreg(stdscr, (top), (bottom))
#define standend()			wstandend(stdscr)
#define standout()			wstandout(stdscr)

/*
 *	NON STANDARD MACROS
 */

#define pencolour(n)	wpencolour(stdscr, (n))

/*
 *	Colours
 */

#define	COLOR_BLACK	0	/* Black */
#define	COLOR_WHITE	1	/* White */
#define	COLOR_YELLOW	2	/* Background Blue */
#define	COLOR_ORANGE	3	/* Orange */
#define COLOR_BLUE	4	/* Blue */
#define COLOR_MAGENTA	5	/* Magenta */
#define	COLOR_CYAN	6	/* Cyan */
#define COLOR_PWHITE	7	/* Paper White */
#define COLOR_BROWN	8	/* Brown */
#define	COLOR_RED	9	/* Red */
#define COLOR_LGREEN	10	/* Light Green */
#define COLOR_TAN	11	/* Well err Tan really */
#define COLOR_BBLUE	12	/* Different to BLUE */
#define COLOR_PURPLE	13	/* Pomegranate colour */
#define COLOR_GREEN	14	/* The Bla Bla Bla of home e.t.c. */
#define COLOR_GREY	15	/* Dead giveaway that one */


/*
 *	Video Attributes.
 */

#define	A_NORMAL	0000000
#define	A_STANDOUT	0000200
#define _STANDOUT	A_STANDOUT	/* for compatibility with old curses */
#define	A_UNDERLINE	0000400
#define	A_REVERSE	0001000
#define	A_BLINK		0002000
#define	A_DIM		0004000
#define	A_BOLD		0010000

#define	A_ATTRIBUTES	0377600
#define	A_CHARTEXT	0000177



# define        bool    char
# define        reg     register

/*
 * chtype is the type used to store a character together with attributes.
 * It can be set to "char" to save space, or "long" to get more attributes.
 */
        typedef unsigned short chtype;

struct _win_st {
        short   _cury, _curx;
        short   _maxy, _maxx;
        short   _begy, _begx;
        short   _flags;
        chtype  _attrs;
        bool    _clear;	/* T=clear on every refresh set by clearok() */
        bool    _cls;	/* T=clear on next refresh set by clear() */
        bool    _leave;
        bool    _scroll;
        bool    _use_idl;
        bool    _use_keypad;    /* 0=no, 1=yes, 2=yes/timeout */
        bool    _use_meta;      /* T=use the meta key */
        bool    _nodelay;       /* T=don't wait for tty input */
        chtype  **_y;
        short   *_firstch;
        short   *_lastch;
        short   _tmarg,_bmarg;
};

typedef struct _win_st  WINDOW;
extern WINDOW *stdscr, *curscr;

/* Funny "characters" enabled for various special function keys for input */
#define KEY_BREAK       0401            /* break key (unreliable) */
#define KEY_DOWN        0402            /* The four arrow keys ... */
#define KEY_UP          0403
#define KEY_LEFT        0404
#define KEY_RIGHT       0405            /* ... */
#define KEY_HOME        0406            /* Home key (upward+left arrow) */
#define KEY_BACKSPACE   0407            /* backspace (unreliable) */
#define KEY_F0          0410            /* Function keys.  Space for 64 */
#define KEY_F(n)        (KEY_F0+(n))    /* keys is reserved. */
#define KEY_DL          0510            /* Delete line */
#define KEY_IL          0511            /* Insert line */
#define KEY_DC          0512            /* Delete character */
#define KEY_IC          0513            /* Insert char or enter insert mode */
#define KEY_EIC         0514            /* Exit insert char mode */
#define KEY_CLEAR       0515            /* Clear screen */
#define KEY_EOS         0516            /* Clear to end of screen */
#define KEY_EOL         0517            /* Clear to end of line */
#define KEY_SF          0520            /* Scroll 1 line forward */
#define KEY_SR          0521            /* Scroll 1 line backwards (reverse) */
#define KEY_NPAGE       0522            /* Next page */
#define KEY_PPAGE       0523            /* Previous page */
#define KEY_STAB        0524            /* Set tab */
#define KEY_CTAB        0525            /* Clear tab */
#define KEY_CATAB       0526            /* Clear all tabs */
#define KEY_ENTER       0527            /* Enter or send (unreliable) */
#define KEY_SRESET      0530            /* soft (partial) reset (unreliable) */
#define KEY_RESET       0531            /* reset or hard reset (unreliable) */
#define KEY_PRINT       0532            /* print or copy */
#define KEY_LL          0533            /* home down or bottom (lower left) */
                                        /* The keypad is arranged like this: */
                                        /*    a1    up    a3   */
                                        /*   left   b2  right  */
                                        /*    c1   down   c3   */
#define KEY_A1          0534            /* upper left of keypad */
#define KEY_A3          0535            /* upper right of keypad */
#define KEY_B2          0536            /* center of keypad */
#define KEY_C1          0537            /* lower left of keypad */
#define KEY_C3          0540            /* lower right of keypad */
#define KEY_HELP        0553            /* Help Key */

WINDOW *newwin(), *subwin(), *newpad();
