xref: /plan9/sys/include/control.h (revision 41dd6b4775bcffc7275c15aee7294944759a2ea7)
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