#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,
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;
|