/*-*-C-*-
 * Menu support
 */

#ifndef __defined_menu_h
#define __defined_menu_h


typedef struct
{
    unsigned int flags;
    void *sub;              /* (void *) -1 for none */
    unsigned int iconflags;
    unsigned int data[3];
} MenuItemRec, *MenuItemPtr;


typedef struct
{
    char title[12];
    unsigned char titleFG, titleBG, workFG, workBG;
    int itemwidth, itemheight, itemspacing;
    MenuItemRec items[1];       /* sic */
} MenuRec, *MenuPtr;


#define MF_TICKED       BIT(0)
#define MF_DOTTED       BIT(1)
#define MF_WRITEABLE    BIT(2)
#define MF_MESSAGE      BIT(3)
#define MF_LAST         BIT(7)

#define MENU_WIDTH(nchars) ((nchars) * 16 + 12)

/*
 * Colours
 */
#define MENU_TITLEFG 7
#define MENU_TITLEBG 2
#define MENU_WORKFG  7
#define MENU_WORKBG  0


/*
 * For the menu register
 */

typedef int MenuType;


/*
 * Menu callback types
 */

typedef error * (*MenuCallback) (MenuPtr, int *, void *, Bool);
typedef error * (*MenuWarningCallback) (MenuPtr, MessageMenuWarningPtr, void *);


extern error * menu_register (MenuPtr menu, MenuType type);
extern void menu_deregister (MenuPtr menu);
extern MenuType menu_lookup_type (void);
extern char * strsave (char *src);
extern error * menu_create (int numitems, char *title, MenuPtr *ret);
extern error * menu_entry (MenuPtr menu,
                           int item,
                           char *text,
                           int maxlength,
                           unsigned int flags,
                           int fg, int bg,
                           void *sub);
extern void menu_set_validation (MenuPtr menu, int item, char *valid);
extern char * menu_get_entry (MenuPtr menu, int item);
extern error * menu_alter_entry (MenuPtr menu,
                                 int item,
                                 unsigned int flagsclear,
                                 unsigned int flagseor,
                                 int fg, int bg);
extern error * menu_post (MenuPtr menu,
                          PointPtr position,
                          Bool iconbar,
                          MenuCallback callback,
                          void *closure);

extern void menu_shade (MenuPtr menu, int item, Bool shaded);
extern void menu_shade_menu (MenuPtr menu, Bool shaded);
extern error * menu_tick_menu (MenuPtr menu, int ticked);


#endif
