/* NetHack 3.7  wintype.h       $NHDT-Date: 1596498573 2020/08/03 23:49:33 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.23 $ */
/* Copyright (c) David Cohrs, 1991                                */
/* NetHack may be freely redistributed.  See license for details. */

#ifndef WINTYPE_H
#define WINTYPE_H

typedef int winid; /* a window identifier */

/* generic parameter - must not be any larger than a pointer */
typedef union any {
    genericptr_t a_void;
    struct obj *a_obj;
    struct monst *a_monst;
    int a_int;
    int a_xint16;
    int a_xint8;
    char a_char;
    schar a_schar;
    uchar a_uchar;
    unsigned int a_uint;
    long a_long;
    unsigned long a_ulong;
    coordxy a_coordxy;
    int *a_iptr;
    xint16 *a_xint16ptr;
    xint8 *a_xint8ptr;
    long *a_lptr;
    coordxy *a_coordxyptr;
    unsigned long *a_ulptr;
    unsigned *a_uptr;
    const char *a_string;
    int (*a_nfunc)(void);
    unsigned long a_mask32; /* used by status highlighting */
    /* add types as needed */
} anything;
#define ANY_P union any /* avoid typedef in prototypes */
                        /* (buggy old Ultrix compiler) */

/* symbolic names for the data types housed in anything */
enum any_types {
    ANY_VOID = 1,
    ANY_OBJ,         /* struct obj */
    ANY_MONST,       /* struct monst (not used) */
    ANY_INT,         /* int */
    ANY_CHAR,        /* char */
    ANY_UCHAR,       /* unsigned char */
    ANY_SCHAR,       /* signed char */
    ANY_UINT,        /* unsigned int */
    ANY_LONG,        /* long */
    ANY_ULONG,       /* unsigned long */
    ANY_IPTR,        /* pointer to int */
    ANY_UPTR,        /* pointer to unsigned int */
    ANY_LPTR,        /* pointer to long */
    ANY_ULPTR,       /* pointer to unsigned long */
    ANY_STR,         /* pointer to null-terminated char string */
    ANY_NFUNC,       /* pointer to function taking no args, returning int */
    ANY_MASK32       /* 32-bit mask (stored as unsigned long) */
};

/* menu return list */
typedef struct mi {
    anything item;     /* identifier */
    long count;        /* count */
    unsigned itemflags; /* item flags */
} menu_item;
#define MENU_ITEM_P struct mi

/* These would be in sym.h and display.h if they weren't needed to
   define the windowproc interface for X11 which doesn't include
   most of the main NetHack header files */

struct classic_representation {
    int color;
    int symidx;
};

struct unicode_representation {
    uint32 ucolor;
    uint16 u256coloridx;
    uint32 utf32ch;
    uint8 *utf8str;
};

typedef struct glyph_map_entry {
    unsigned glyphflags;
    struct classic_representation sym;
    short int tileidx;
#ifdef ENHANCED_SYMBOLS
    struct unicode_representation *u;
#endif
} glyph_map;

/* glyph plus additional info
   if you add fields or change the ordering, fix up the following:
        g_info initialization in display.c
        nul_glyphinfo initialization in diplay.c
 */
typedef struct gi {
    int glyph;            /* the display entity */
    int ttychar;
    uint32 framecolor;
    glyph_map gm;
} glyph_info;
#define GLYPH_INFO_P struct gi

/* select_menu() "how" argument types */
/* [MINV_PICKMASK in monst.h assumes these have values of 0, 1, 2] */
#define PICK_NONE 0 /* user picks nothing (display only) */
#define PICK_ONE 1  /* only pick one */
#define PICK_ANY 2  /* can pick any amount */

/* window types */
/* any additional port specific types should be defined in win*.h */
#define NHW_MESSAGE 1
#define NHW_STATUS 2
#define NHW_MAP 3
#define NHW_MENU 4
#define NHW_TEXT 5
#define NHW_PERMINVENT 6
#define NHW_LAST_TYPE NHW_PERMINVENT

/* attribute types for putstr; the same as the ANSI value, for convenience */
#define ATR_NONE       0
#define ATR_BOLD       1
#define ATR_DIM        2
#define ATR_ITALIC     3
#define ATR_ULINE      4
#define ATR_BLINK      5
#define ATR_INVERSE    7
/* not a display attribute but passed to putstr() as an attribute;
   can be masked with one regular display attribute */
#define ATR_URGENT    16
#define ATR_NOHISTORY 32

/* nh_poskey() modifier types */
#define CLICK_1 1
#define CLICK_2 2
#define NUM_MOUSE_BUTTONS 2

/* invalid winid */
#define WIN_ERR ((winid) -1)

/* menu window keyboard commands (may be mapped); menu_shift_right and
   menu_shift_left are for interacting with persistent inventory window */
/* clang-format off */
#define MENU_FIRST_PAGE         '^'
#define MENU_LAST_PAGE          '|'
#define MENU_NEXT_PAGE          '>'
#define MENU_PREVIOUS_PAGE      '<'
#define MENU_SHIFT_RIGHT        '}'
#define MENU_SHIFT_LEFT         '{'
#define MENU_SELECT_ALL         '.'
#define MENU_UNSELECT_ALL       '-'
#define MENU_INVERT_ALL         '@'
#define MENU_SELECT_PAGE        ','
#define MENU_UNSELECT_PAGE      '\\'
#define MENU_INVERT_PAGE        '~'
#define MENU_SEARCH             ':'

#define MENU_ITEMFLAGS_NONE       0x0000000U
#define MENU_ITEMFLAGS_SELECTED   0x0000001U
#define MENU_ITEMFLAGS_SKIPINVERT 0x0000002U

/* 3.7+ enhanced menu flags that not all window ports are likely to
 * support initially.
 *
 * As behavior and appearance modification flags are added, the various
 * individual window ports will likely have to be updated to respond
 * to the flags in an appropriate way.
 */

#define MENU_BEHAVE_STANDARD      0x0000000U
#define MENU_BEHAVE_PERMINV       0x0000001U

enum perm_invent_toggles {toggling_off = -1, toggling_not = 0, toggling_on = 1 };

/* inventory modes */
enum inv_modes { InvNormal = 0, InvShowGold = 1, InvSparse = 2, InvInUse = 4 };

enum to_core_flags {
    active           = 0x001,
    prohibited       = 0x002,
    no_init_done     = 0x004
};

enum from_core_requests {
    set_mode         = 1,
    request_settings = 2,
};

struct to_core {
    long tocore_flags;
    boolean active;
    boolean use_update_inventory;    /* disable the newer slot interface */
    int maxslot;
    int needrows, needcols;
    int haverows, havecols;
};

struct from_core {
    enum from_core_requests core_request;
    enum inv_modes invmode;
};

struct win_request_info_t {
    struct to_core tocore;
    struct from_core fromcore;
};

typedef struct win_request_info_t win_request_info;

/* #define CORE_INVENT */

/* In a binary with multiple window interfaces linked in, this is
 * a structure to track certain interface capabilities that cannot be
 * statically done at compile time. Some of them can be toggled and
 * the core needs to know if they are active or not at the time.
 */

enum win_display_modes {
    wdmode_traditional = 0,
    wdmode_tiled
};

struct win_settings {
    enum win_display_modes wdmode;
    uint32 map_frame_color;
};

/* clang-format on */

#endif /* WINTYPE_H */
