180ee5cbfSDavid du Colombier #pragma src "/sys/src/libcontrol" 280ee5cbfSDavid du Colombier #pragma lib "libcontrol.a" 380ee5cbfSDavid du Colombier 49a747e4fSDavid du Colombier #pragma varargck argpos ctlprint 2 55fab9909SDavid du Colombier #pragma varargck argpos _ctlprint 2 680ee5cbfSDavid du Colombier 780ee5cbfSDavid du Colombier typedef struct Control Control; 880ee5cbfSDavid du Colombier typedef struct Controlset Controlset; 980ee5cbfSDavid du Colombier typedef struct CParse CParse; 1080ee5cbfSDavid du Colombier typedef struct CCache CCache; 1180ee5cbfSDavid du Colombier typedef struct CCache CImage; 1280ee5cbfSDavid du Colombier typedef struct CCache CFont; 1380ee5cbfSDavid du Colombier 149a747e4fSDavid du Colombier enum /* types */ 1580ee5cbfSDavid du Colombier { 169a747e4fSDavid du Colombier Ctlunknown, 179a747e4fSDavid du Colombier Ctlbox, 189a747e4fSDavid du Colombier Ctlbutton, 199a747e4fSDavid du Colombier Ctlentry, 209a747e4fSDavid du Colombier Ctlkeyboard, 219a747e4fSDavid du Colombier Ctllabel, 229a747e4fSDavid du Colombier Ctlmenu, 239a747e4fSDavid du Colombier Ctlradio, 249a747e4fSDavid du Colombier Ctlscribble, 259a747e4fSDavid du Colombier Ctlslider, 269a747e4fSDavid du Colombier Ctltabs, 279a747e4fSDavid du Colombier Ctltext, 289a747e4fSDavid du Colombier Ctltextbutton, 29da51d93aSDavid du Colombier Ctltextbutton3, 30*41dd6b47SDavid du Colombier Ctlgroup, /* divider between controls and metacontrols */ 319a747e4fSDavid du Colombier Ctlboxbox, 329a747e4fSDavid du Colombier Ctlcolumn, 339a747e4fSDavid du Colombier Ctlrow, 349a747e4fSDavid du Colombier Ctlstack, 359a747e4fSDavid du Colombier Ctltab, 369a747e4fSDavid du Colombier Ntypes, 3780ee5cbfSDavid du Colombier }; 3880ee5cbfSDavid du Colombier 3980ee5cbfSDavid du Colombier struct Controlset 4080ee5cbfSDavid du Colombier { 4180ee5cbfSDavid du Colombier Control *controls; 4280ee5cbfSDavid du Colombier Image *screen; 4380ee5cbfSDavid du Colombier Control *actives; 4480ee5cbfSDavid du Colombier Control *focus; 459a747e4fSDavid du Colombier Channel *ctl; 469a747e4fSDavid du Colombier Channel *data; /* currently only for sync */ 4780ee5cbfSDavid du Colombier Channel *kbdc; 4880ee5cbfSDavid du Colombier Channel *mousec; 4980ee5cbfSDavid du Colombier Channel *resizec; 5080ee5cbfSDavid du Colombier Channel *resizeexitc; 519a747e4fSDavid du Colombier Channel *csexitc; 5280ee5cbfSDavid du Colombier Keyboardctl *keyboardctl; /* will be nil if user supplied keyboard */ 5380ee5cbfSDavid du Colombier Mousectl *mousectl; /* will be nil if user supplied mouse */ 5480ee5cbfSDavid du Colombier int clicktotype; /* flag */ 5580ee5cbfSDavid du Colombier }; 5680ee5cbfSDavid du Colombier 5780ee5cbfSDavid du Colombier struct Control 5880ee5cbfSDavid du Colombier { 5980ee5cbfSDavid du Colombier /* known to client */ 6080ee5cbfSDavid du Colombier char *name; 6180ee5cbfSDavid du Colombier Rectangle rect; 629a747e4fSDavid du Colombier Rectangle size; /* minimum/maximum Dx, Dy (not a rect) */ 6380ee5cbfSDavid du Colombier Channel *event; /* chan(char*) to client */ 6480ee5cbfSDavid du Colombier Channel *data; /* chan(char*) to client */ 65da51d93aSDavid du Colombier 6680ee5cbfSDavid du Colombier /* internal to control set */ 679a747e4fSDavid du Colombier int type; 689a747e4fSDavid du Colombier int hidden; /* hide hides, show unhides (and redraws) */ 6980ee5cbfSDavid du Colombier Controlset *controlset; 7080ee5cbfSDavid du Colombier Image *screen; /* where Control appears */ 7180ee5cbfSDavid du Colombier char *format; /* used to generate events */ 7280ee5cbfSDavid du Colombier char wevent; /* event channel rewired */ 7380ee5cbfSDavid du Colombier char wdata; /* data channel rewired */ 74da51d93aSDavid du Colombier 759a747e4fSDavid du Colombier /* method table */ 769a747e4fSDavid du Colombier void (*ctl)(Control*, CParse*); 779a747e4fSDavid du Colombier void (*mouse)(Control*, Mouse*); 789a747e4fSDavid du Colombier void (*key)(Control*, Rune*); 799a747e4fSDavid du Colombier void (*exit)(Control*); 809a747e4fSDavid du Colombier void (*setsize)(Control*); 819a747e4fSDavid du Colombier void (*activate)(Control*, int); 8280ee5cbfSDavid du Colombier Control *nextactive; 8380ee5cbfSDavid du Colombier Control *next; 8480ee5cbfSDavid du Colombier }; 8580ee5cbfSDavid du Colombier 8680ee5cbfSDavid du Colombier struct CCache 8780ee5cbfSDavid du Colombier { 8880ee5cbfSDavid du Colombier union{ 8980ee5cbfSDavid du Colombier Image *image; 9080ee5cbfSDavid du Colombier Font *font; 9180ee5cbfSDavid du Colombier }; 9280ee5cbfSDavid du Colombier char *name; 9380ee5cbfSDavid du Colombier int index; /* entry number in cache */ 9480ee5cbfSDavid du Colombier int ref; /* one for client, plus one for each use */ 9580ee5cbfSDavid du Colombier }; 9680ee5cbfSDavid du Colombier 9780ee5cbfSDavid du Colombier struct CParse 9880ee5cbfSDavid du Colombier { 999a747e4fSDavid du Colombier char str[256]; 10080ee5cbfSDavid du Colombier char *sender; 1019a747e4fSDavid du Colombier char *receiver; 1029a747e4fSDavid du Colombier int cmd; 1039a747e4fSDavid du Colombier char *pargs[32]; 1049a747e4fSDavid du Colombier int iargs[32]; 1059a747e4fSDavid du Colombier char **args; 10680ee5cbfSDavid du Colombier int nargs; 10780ee5cbfSDavid du Colombier }; 10880ee5cbfSDavid du Colombier 10980ee5cbfSDavid du Colombier enum /* alignments */ 11080ee5cbfSDavid du Colombier { 11180ee5cbfSDavid du Colombier Aupperleft = 0, 11280ee5cbfSDavid du Colombier Auppercenter, 11380ee5cbfSDavid du Colombier Aupperright, 11480ee5cbfSDavid du Colombier Acenterleft, 11580ee5cbfSDavid du Colombier Acenter, 11680ee5cbfSDavid du Colombier Acenterright, 11780ee5cbfSDavid du Colombier Alowerleft, 11880ee5cbfSDavid du Colombier Alowercenter, 11980ee5cbfSDavid du Colombier Alowerright, 12080ee5cbfSDavid du Colombier Nalignments 12180ee5cbfSDavid du Colombier }; 12280ee5cbfSDavid du Colombier 1239a747e4fSDavid du Colombier enum 1249a747e4fSDavid du Colombier { 1259a747e4fSDavid du Colombier _Ctlmaxsize = 10000, 1269a747e4fSDavid du Colombier }; 1279a747e4fSDavid du Colombier 1289a747e4fSDavid du Colombier extern char *ctltypenames[]; 1299a747e4fSDavid du Colombier 13080ee5cbfSDavid du Colombier /* Functions used internally */ 1319a747e4fSDavid du Colombier void _ctladdgroup(Control*, Control*); 13280ee5cbfSDavid du Colombier void _ctlargcount(Control*, CParse*, int); 1339a747e4fSDavid du Colombier Control* _createctl(Controlset*, char*, uint, char*); 13480ee5cbfSDavid du Colombier Rune* _ctlrunestr(char*); 13580ee5cbfSDavid du Colombier char* _ctlstrrune(Rune*); 13680ee5cbfSDavid du Colombier void _ctlputsnarf(Rune*); 13780ee5cbfSDavid du Colombier Rune* _ctlgetsnarf(void); 13880ee5cbfSDavid du Colombier int _ctlalignment(char*); 13980ee5cbfSDavid du Colombier Point _ctlalignpoint(Rectangle, int, int, int); 1409a747e4fSDavid du Colombier void _ctlfocus(Control*, int); 1419a747e4fSDavid du Colombier void _activategroup(Control*); 1429a747e4fSDavid du Colombier void _deactivategroup(Control*); 1439a747e4fSDavid du Colombier int _ctllookup(char *s, char *tab[], int ntab); 1449a747e4fSDavid du Colombier void _ctlprint(Control *c, char *fmt, ...); 14580ee5cbfSDavid du Colombier 14680ee5cbfSDavid du Colombier /* images */ 14780ee5cbfSDavid du Colombier CImage* _getctlimage(char*); 14880ee5cbfSDavid du Colombier void _setctlimage(Control*, CImage**, char*); 14980ee5cbfSDavid du Colombier void _putctlimage(CImage*); 15080ee5cbfSDavid du Colombier CFont* _getctlfont(char*); 15180ee5cbfSDavid du Colombier void _putctlfont(CFont*); 15280ee5cbfSDavid du Colombier 15380ee5cbfSDavid du Colombier /* fonts */ 15480ee5cbfSDavid du Colombier CImage* _getctlfont(char*); 15580ee5cbfSDavid du Colombier void _setctlfont(Control*, CImage**, char*); 15680ee5cbfSDavid du Colombier void _putctlfont(CImage*); 15780ee5cbfSDavid du Colombier CFont* _getctlfont(char*); 15880ee5cbfSDavid du Colombier void _putctlfont(CFont*); 15980ee5cbfSDavid du Colombier 16080ee5cbfSDavid du Colombier /* Public functions */ 16180ee5cbfSDavid du Colombier 16280ee5cbfSDavid du Colombier /* images */ 16380ee5cbfSDavid du Colombier int namectlimage(Image*, char*); 16480ee5cbfSDavid du Colombier int freectlimage(char*); 165da51d93aSDavid du Colombier 16680ee5cbfSDavid du Colombier /* fonts */ 16780ee5cbfSDavid du Colombier int namectlfont(Font*, char*); 16880ee5cbfSDavid du Colombier int freectlfont(char*); 169da51d93aSDavid du Colombier 1709a747e4fSDavid du Colombier /* commands */ 1719a747e4fSDavid du Colombier int ctlprint(Control*, char*, ...); 17280ee5cbfSDavid du Colombier 17380ee5cbfSDavid du Colombier /* general */ 17480ee5cbfSDavid du Colombier void initcontrols(void); 17580ee5cbfSDavid du Colombier Controlset* newcontrolset(Image*, Channel*, Channel*, Channel*); 17680ee5cbfSDavid du Colombier void closecontrolset(Controlset*); 17780ee5cbfSDavid du Colombier void closecontrol(Control*); 17880ee5cbfSDavid du Colombier void ctlerror(char*, ...); 17980ee5cbfSDavid du Colombier Control* controlcalled(char*); 18080ee5cbfSDavid du Colombier 18180ee5cbfSDavid du Colombier /* publicly visible error-checking allocation routines */ 18280ee5cbfSDavid du Colombier void* ctlmalloc(uint); 18380ee5cbfSDavid du Colombier void* ctlrealloc(void*, uint); 18480ee5cbfSDavid du Colombier char* ctlstrdup(char*); 18580ee5cbfSDavid du Colombier 18680ee5cbfSDavid du Colombier /* creation */ 18780ee5cbfSDavid du Colombier void controlwire(Control*, char*, Channel*); 18880ee5cbfSDavid du Colombier void activate(Control*); 18980ee5cbfSDavid du Colombier void deactivate(Control*); 19080ee5cbfSDavid du Colombier Control* createbox(Controlset*, char*); 19180ee5cbfSDavid du Colombier Control* createbutton(Controlset*, char*); 1929a747e4fSDavid du Colombier Control* createcolumn(Controlset*, char*); 1939a747e4fSDavid du Colombier Control* createboxbox(Controlset*, char*); 19480ee5cbfSDavid du Colombier Control* createentry(Controlset*, char*); 19580ee5cbfSDavid du Colombier Control* createkeyboard(Controlset*, char*); 19680ee5cbfSDavid du Colombier Control* createlabel(Controlset*, char*); 1979a747e4fSDavid du Colombier Control* createmenu(Controlset*, char*); 19880ee5cbfSDavid du Colombier Control* createradiobutton(Controlset*, char*); 1999a747e4fSDavid du Colombier Control* createrow(Controlset*, char*); 20080ee5cbfSDavid du Colombier Control* createscribble(Controlset*, char*); 20180ee5cbfSDavid du Colombier Control* createslider(Controlset*, char*); 2029a747e4fSDavid du Colombier Control* createstack(Controlset*, char*); 2039a747e4fSDavid du Colombier Control* createtab(Controlset*, char*); 20480ee5cbfSDavid du Colombier Control* createtext(Controlset*, char*); 20580ee5cbfSDavid du Colombier Control* createtextbutton(Controlset*, char*); 206da51d93aSDavid du Colombier Control* createtextbutton3(Controlset*, char*); 20780ee5cbfSDavid du Colombier 20880ee5cbfSDavid du Colombier /* user-supplied */ 20980ee5cbfSDavid du Colombier void resizecontrolset(Controlset*); 21080ee5cbfSDavid du Colombier 21180ee5cbfSDavid du Colombier int _ctlsnarffd; 21280ee5cbfSDavid du Colombier char *alignnames[]; 21380ee5cbfSDavid du Colombier int ctldeletequits; 214