/*  CPX.H
 *  Headerdatei zur Erzeugung von CPX-Modulen
 *
 *  aus: Wir basteln uns ein CPX
 *       CPX-Kurs Teil 1
 *       TOS Magazin
 *
 *  (c)1992 by Richard Kurz
 *  Vogelherdbogen 62
 *  7992 Tettnang
 *
 *  Erstellt mit Pure C
 */

/* So sieht der Kopf eines CPX-Moduls aus   */
typedef struct
{
    UWORD   magic;
    struct
    {
        unsigned reserved : 13;
        unsigned ram_resident : 1;
        unsigned boot_init : 1;
        unsigned set_only  : 1;
    } flags;
    LONG    cpx_id;
    UWORD   cpx_version;
    char    i_text[14];
    UWORD   icon[48];
    struct
    {
    	unsigned i_color :4;
    	unsigned reserved : 4;
    	unsigned i_char : 8;
    } i_info;
    char    text[18];
    struct
    {
    	unsigned c_board : 4;
    	unsigned c_text : 4;
    	unsigned pattern : 4;
    	unsigned c_back : 4;
    } t_info;
    char    buffer[64];
    char    reserved[306];
}   CPXHEAD;

/* Mausparameter                                */
typedef struct
{
    WORD x;
    WORD y;
    WORD buttons;
    WORD kstate;
} MRETS;

/* Struktur zur Verwaltung von CPX-Modulen      */
typedef struct cpxlist
{
        char f_name[14];
        WORD head_ok;
        WORD segm_ok;
        struct
        {
                void *text_seg;
                long len_text;
                void *data_seg;
                long len_data;
                void *bss_seg;
                long len_bss;
        } *segm;
        struct cpxlist *next;
        CPXHEAD header;
} CPX_LIST;

/* Funktionen und Flags die von XControl zur Verfgung  */
/* gestellt werden.                                     */
typedef struct
{
    WORD    handle;
    WORD    booting;
    WORD    reserved;
    WORD    SkipRshFix;

    CPX_LIST *  cdecl (*get_cpx_list)(void);
    WORD cdecl  (*save_header)(CPX_LIST *header);

    void cdecl  (*rsh_fix)(WORD num_objs,WORD num_frstr,
                    WORD num_frimg, WORD num_tree,
                    OBJECT *rs_object, TEDINFO *rs_tedinfo,
                    char *rs_strings[], ICONBLK *rs_iconblk,
                    BITBLK *rs_bitblk, long *rs_frstr,
                    long *rs_frimg, long *rs_trindex,
                    struct foobar *rs_imdope);

    void cdecl  (*rsh_obfix)(OBJECT *tree, WORD ob);

    WORD cdecl  (*Popup)(char *items[],WORD num,
                WORD def_item,WORD font,
                GRECT *up, GRECT *world);

    void cdecl  (*Sl_size)(OBJECT *tree, WORD base,
                WORD slider, WORD entrys, WORD vis_ent,
                WORD hvflag, WORD min_pix);

    void cdecl  (*Sl_x)(OBJECT *tree, WORD base, WORD slider,
                WORD value, WORD min, WORD max,
                void (*foo)(void));

    void cdecl  (*Sl_y)(OBJECT *tree, WORD base, WORD slider,
                WORD value, WORD min, WORD max,
                void (*foo)(void));

    void cdecl  (*Sl_arrow)(OBJECT *tree, WORD base,
                WORD slider, WORD obj, WORD inc, WORD min,
                WORD max, WORD *value, WORD hvflag,
                void (*foo)(void));

    void cdecl  (*Sl_dragx)(OBJECT *tree, WORD base,
                WORD slider, WORD min, WORD max,
                WORD *value, void (*foo)(void));

    void cdecl  (*Sl_dragy)(OBJECT *tree, WORD base,
                WORD slider, WORD min, WORD max,
                WORD *value, void (*foo)(void));

    WORD cdecl  (*Xform_do)(OBJECT *tree,WORD eobj,
                WORD *msg);

    GRECT * cdecl   (*GetFirstRect)(GRECT *prect);

    GRECT * cdecl   (*GetNextRect)(void);

    void cdecl  (*Set_Evnt_Mask)(WORD mask, MOBLK *m1,
                MOBLK *m2, long time);

    WORD cdecl  (*XGen_Alert)(WORD al);

    WORD cdecl  (*CPX_Save)(void *ptr, long bytes);

    void * cdecl    (*Get_Buffer)(void);

    WORD cdecl  (*getcookie)(long cookie, long *p_value);

    WORD        Country_Code;

    void cdecl  (*MFsave)(WORD flag, MFORM *mf);

} XCPB;

/* Funktionen die vom CPX-Modul zur Verfgung   */
/* gestellt werden.                             */
typedef struct
{
    WORD cdecl  (*cpx_call)(GRECT *rect);
 
    void cdecl  (*cpx_draw)(GRECT *clip);
 
    void cdecl  (*cpx_wmove)(GRECT *work);
 
    void cdecl  (*cpx_timer)(WORD *quit);
 
    void cdecl  (*cpx_key)(WORD kstate, WORD key, WORD *quit);
 
    void cdecl  (*cpx_button)(MRETS *mrets, WORD nclicks,
    			 WORD *quit);
 
    void cdecl  (*cpx_m1)(MRETS *mrets, WORD *quit);
 
    void cdecl  (*cpx_m2)(MRETS *mrets, WORD *quit);
 
    WORD cdecl  (*cpx_hook)(WORD event, WORD *msg, 
                MRETS *mrets, WORD *key, WORD *nclicks);
 
    void cdecl  (*cpx_close)(WORD flag);
} CPXINFO;

/* Ntzliche Definitionen               */
#define SAVE_DEFAULTS   0
#define MEM_ERR         1
#define FILE_ERR        2
#define FILE_NOT_FOUND  3

#define MFSAVE      1
#define MFRESTORE   0

#define CT_KEY  53
