Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#pragma src "/sys/src/libcontrol"
#pragma lib "libcontrol.a"

#pragma varargck        argpos  ctlprint        2
#pragma varargck        argpos  _ctlprint       2

typedef struct Control Control;
typedef struct Controlset Controlset;
typedef struct CParse CParse;
typedef struct CCache CCache;
typedef struct CCache CImage;
typedef struct CCache CFont;

enum    /* types */
{
        Ctlunknown,
        Ctlbox,
        Ctlbutton,
        Ctlentry,
        Ctlkeyboard,
        Ctllabel,
        Ctlmenu,
        Ctlradio,
        Ctlscribble,
        Ctlslider,
        Ctltabs,
        Ctltext,
        Ctltextbutton,
        Ctltextbutton3,
        Ctlgroup,               /* divider between controls and metacontrols */
        Ctlboxbox,
        Ctlcolumn,
        Ctlrow,
        Ctlstack,
        Ctltab,
        Ntypes,
};

struct Controlset
{
        Control         *controls;
        Image           *screen;
        Control         *actives;
        Control         *focus;
        Channel         *ctl;
        Channel         *data;          /* currently only for sync */
        Channel         *kbdc;
        Channel         *mousec;
        Channel         *resizec;
        Channel         *resizeexitc;
        Channel         *csexitc;
        Keyboardctl     *keyboardctl;   /* will be nil if user supplied keyboard */
        Mousectl        *mousectl;      /* will be nil if user supplied mouse */
        int             clicktotype;    /* flag */
};

struct Control
{
        /* known to client */
        char            *name;
        Rectangle       rect;
        Rectangle       size;           /* minimum/maximum Dx, Dy (not a rect) */
        Channel         *event;         /* chan(char*) to client */
        Channel         *data;          /* chan(char*) to client */

        /* internal to control set */
        int             type;
        int             hidden;         /* hide hides, show unhides (and redraws) */
        Controlset      *controlset;
        Image           *screen;        /* where Control appears */
        char            *format;        /* used to generate events */
        char            wevent;         /* event channel rewired */
        char            wdata;          /* data channel rewired */

        /* method table */
        void            (*ctl)(Control*, CParse*);
        void            (*mouse)(Control*, Mouse*);
        void            (*key)(Control*, Rune*);
        void            (*exit)(Control*);
        void            (*setsize)(Control*);
        void            (*activate)(Control*, int);
        Control         *nextactive;
        Control         *next;
};

struct CCache
{
        union{
                Image   *image;
                Font    *font;
        };
        char            *name;
        int             index;          /* entry number in cache */
        int             ref;            /* one for client, plus one for each use */
};

struct CParse
{
        char    str[256];
        char    *sender;
        char    *receiver;
        int     cmd;
        char    *pargs[32];
        int     iargs[32];
        char    **args;
        int     nargs;
};

enum    /* alignments */
{
        Aupperleft = 0,
        Auppercenter,
        Aupperright,
        Acenterleft,
        Acenter,
        Acenterright,
        Alowerleft,
        Alowercenter,
        Alowerright,
        Nalignments
};

enum
{
        _Ctlmaxsize = 10000,
};

extern char *ctltypenames[];

/* Functions used internally */
void            _ctladdgroup(Control*, Control*);
void            _ctlargcount(Control*, CParse*, int);
Control*        _createctl(Controlset*, char*, uint, char*);
Rune*           _ctlrunestr(char*);
char*           _ctlstrrune(Rune*);
void            _ctlputsnarf(Rune*);
Rune*           _ctlgetsnarf(void);
int             _ctlalignment(char*);
Point           _ctlalignpoint(Rectangle, int, int, int);
void            _ctlfocus(Control*, int);
void            _activategroup(Control*);
void            _deactivategroup(Control*);
int             _ctllookup(char *s, char *tab[], int ntab);
void            _ctlprint(Control *c, char *fmt, ...);

/* images */
CImage*         _getctlimage(char*);
void            _setctlimage(Control*, CImage**, char*);
void            _putctlimage(CImage*);
CFont*          _getctlfont(char*);
void            _putctlfont(CFont*);

/* fonts */
CImage*         _getctlfont(char*);
void            _setctlfont(Control*, CImage**, char*);
void            _putctlfont(CImage*);
CFont*          _getctlfont(char*);
void            _putctlfont(CFont*);

/* Public functions */

/* images */
int             namectlimage(Image*, char*);
int             freectlimage(char*);

/* fonts */
int             namectlfont(Font*, char*);
int             freectlfont(char*);

/* commands */
int             ctlprint(Control*, char*, ...);

/* general */
void            initcontrols(void);
Controlset*     newcontrolset(Image*, Channel*, Channel*, Channel*);
void            closecontrolset(Controlset*);
void            closecontrol(Control*);
void            ctlerror(char*, ...);
Control*        controlcalled(char*);

/* publicly visible error-checking allocation routines */
void*           ctlmalloc(uint);
void*           ctlrealloc(void*, uint);
char*           ctlstrdup(char*);

/* creation */
void            controlwire(Control*, char*, Channel*);
void            activate(Control*);
void            deactivate(Control*);
Control*        createbox(Controlset*, char*);
Control*        createbutton(Controlset*, char*);
Control*        createcolumn(Controlset*, char*);
Control*        createboxbox(Controlset*, char*);
Control*        createentry(Controlset*, char*);
Control*        createkeyboard(Controlset*, char*);
Control*        createlabel(Controlset*, char*);
Control*        createmenu(Controlset*, char*);
Control*        createradiobutton(Controlset*, char*);
Control*        createrow(Controlset*, char*);
Control*        createscribble(Controlset*, char*);
Control*        createslider(Controlset*, char*);
Control*        createstack(Controlset*, char*);
Control*        createtab(Controlset*, char*);
Control*        createtext(Controlset*, char*);
Control*        createtextbutton(Controlset*, char*);
Control*        createtextbutton3(Controlset*, char*);

/* user-supplied */
void            resizecontrolset(Controlset*);

int             _ctlsnarffd;
char            *alignnames[];
int             ctldeletequits;