/* cwdisp.h */

/* Parts of the display:
 *
 * ov  Overall display - The window, the display, etc.
 * co  The core picture
 * pls The player info
 * ti  The title
 * cy  The cycle display
 * but The control buttons
 */

#include "gbut.h"  /* Needed for win3 data structure. */

#define  FONTNAME  "-bitstream-charter-medium-r-normal--%d-*-*-*-*-*-*-*"
#define  FFONTNAME "-bitstream-courier-medium-r-normal--%d-*-*-*-*-*-*-*"
#define  MAXPICS  (DI_PLSIZ * (DI_MAXPLAYERS - 1) + DI_XEQ + 1)
#define  WHRATIO  1.618033989  /* The golden mean. */
#define  MAX_CVAL  65535
#define  NOTLOADED  -1
#define  DS_STOPPED  0
#define  DS_RUNFAST  1
#define  DS_RUNSLOW  2
#define  DS_STEP     3

/* Values for the overall display. */
extern aval_t di_next_move;
extern int  di_next_player;
extern unsigned long  di_stdfg, di_stdbg;
extern unsigned  di_depth, di_picsize;
extern Window  di_win;
extern XFontStruct  *di_bfontstr, *di_sfontstr, *di_ffontstr;
extern Font  di_bfont, di_sfont, di_ffont;
extern Display  *di_dpy;
extern unsigned  di_winw, di_winh, di_width, di_height;
extern Colormap  di_cmap;
extern int  di_color;  /* TRUE or FALSE */

/* Values for the core display. */
extern int  *di_picmap;
extern unsigned  di_co_xoff, di_co_yoff;
extern char  *di_co_pics;
extern Pixmap  di_pixmaps[MAXPICS], di_bigpixmaps[MAXPICS];
extern Pixmap  di_grey50pixmap, di_grey75pixmap;
extern GC  di_picgc[MAXPICS];
extern int  di_nprocs[DI_MAXPLAYERS], di_nalive;
extern int  di_state, di_last_cyc, di_slopos;
extern float  di_speed;

/* Values describing the player status windows. */
typedef struct  {
	unsigned  name_x, name_y;
	unsigned  score_x, score_y;
	unsigned  sbox_x, sbox_y, sbox_w, sbox_h;
	unsigned  nbox_x, nbox_y, nbox_w, nbox_h;
	char  *name;
	GC  sboxgc;
	char  istring[STR_MAXLEN];
} di_plstatinfo;
extern di_plstatinfo   di_plstat[DI_MAXPLAYERS];

/* The title. */
extern int  di_ti_x, di_ti_y;

/* The cycle display. */
extern int  *di_cyx, di_cyty, di_cyby, *di_cyw, di_cyh;
extern GC  di_cytgc, di_cybgc;

/* The buttons. */
#define  DI_BSTOP     0
#define  DI_BSLOW     1
#define  DI_BGO       2
#define  DI_BQUIT     3
#define  DI_BRESTART  4
#define  DI_BWIN2OK   5
#define  DI_BCOREPIC  6
#define  DI_BPLAY(pnum)  (7 + (pnum))
#define  DI_NBUT      (DI_BPLAY(DI_MAXPLAYERS))
#define  DI_BWIN3OK      DI_NBUT
#define  DI_BWIN3UP      (DI_NBUT+1)
#define  DI_BWIN3DOWN    (DI_NBUT+2)
#define  DI_BWIN3SCROLL  (DI_NBUT+3)
#define  DI_B3WIN(but)  (((but)-DI_BWIN3OK)>>2)
#define  DI_B3BUT(but)  ((((but)-DI_BWIN3OK)&3)+DI_BWIN3OK)
#define  DI_W3BUT(win,but)  ((but)+((win)*4))

typedef struct win3  {
	Window  win;
	int  h, w;
	aval_t  startaddr;
	int  lines;
	struct win3  *next, *prev;
	gbut_info  okbut, upbut, downbut, scrollbut;
} win3;
extern int   di_numwin3;
extern win3  di_win3list;
extern int   *di_indis;

/* Borders on the core picture. */
#define  CP_U  0x100
#define  CP_D  0x200
#define  CP_R  0x400
#define  CP_L  0x800
#define  CP_M  0xf00  /* I just had to make up this name. */

extern unsigned  di_butbw;
extern gbut_info  di_but[DI_NBUT];
extern GC  di_butgc, di_butlgc, di_butdgc;

/* General stuff. */
extern unsigned  di_cycles;
extern program_t  di_progs[DI_MAXPLAYERS];

/* Window #2; the load window. */
extern Window  di_win2;
extern unsigned  di_win2w, di_win2h;
extern int  di_ldplayer, di_curon;


/* From "disp.c" */
extern void  di_drawaddr(aval_t addr, int val),
             di_newoutline(aval_t addr, int val),
             di_changestate(Display *dpy, Window win, int newstate),
             di_exit(int exitval);

/* From "di_timer.c" */
extern void  di_set_timer(float freq), di_unset_timer(void),
             di_undo_wait(void);
extern int   di_timer_wait(Display *dpy);

/* From "di_recalc.c" */
extern unsigned long  di_colors[4+DI_MAXPLAYERS*2];
extern void  di_redraw(Display *dpy, Window win, XWindowAttributes *xwa,
											 int x, int y, int w, int h);

/* From "di_draw.c" */
extern void  di_draw_ov(Display *dpy, Window win, int x, int y, int w, int h),
             di_draw_co(Display *dpy, Window win, int x, int y, int w, int h),
             di_draw_pls(Display *dpy, Window win, unsigned plno),
             di_draw_nprocs(int plnum, unsigned nprocs, Display *dpy,
														Window win),
             di_draw_cy(Display *dpy, Window win),
             di_reset_cy(void), di_update_cy(Display *dpy, Window win);

/* From "di_but.c" */
extern void  di_draw_ctbut(int butnum, gbut_info *info),
             di_draw_sfbut(int butnum, gbut_info *info),
             di_outline_box(Display *dpy, Window win, int x, int y,
														int w, int h, int bstate),
	           di_draw_upbut(int butnum, gbut_info *info),
             di_draw_downbut(int butnum, gbut_info *info),
             di_draw_sbar(int butnum, gbut_info *info);
#define  BUT_POPUP     0
#define  BUT_PUSHDOWN  GBUT_TWITCHED

/* From "di_input.c" */
extern void  di_in_init(void);
extern void  di_butpress(Display *dpy, Window win, XButtonPressedEvent *evt);
extern void  di_butrelease(Display *dpy, Window win,
                           XButtonReleasedEvent *evt);
extern void  di_keypress(Display *dpy, Window win, XKeyPressedEvent *evt);
extern void  di_keyrelease(Display *dpy, Window win, XKeyReleasedEvent *evt);
extern void  di_input_m(Display *dpy, Window win, XMotionEvent *evt);

/* From "di_load.c" */
extern void  di_loadbut(unsigned pnum), di_reset(void),
             di_redraw2(Display *dpy, Window win2, XWindowAttributes *xwa),
             di_killwin2(int absolute),
             di_keypress2(Display *dpy, Window win, XKeyPressedEvent *evt),
             di_cursor(Display *dpy, Window win, int visible),
             di_mkwin2(char *name);

/* From "di_dis.c" */
extern void  di_redraw3(Display *dpy, Window win3, int x, int y, int w, int h),
             di_killwin3(int winnum), di_mkwin3(aval_t location),
             di_fixline(aval_t lineaddr),
             di_dis_newstart(int winnum, aval_t newloc),
             di_dis_init(void);
extern void  di_drawoutline(aval_t addr, int format);
extern int  di_dis_cpcheck(int butnum, gbut_info *info, int checktype,
										int x, int y);
extern void  di_dis_cpdraw(int butnum, gbut_info *info);
