xref: /plan9/sys/src/libcontrol/textbutton3.c (revision 6f314b92956e16637888967d7478acfbd2ac8dab)
1*6f314b92SDavid du Colombier /* use button 3 for a proper function to the application, that is not for plumber
2*6f314b92SDavid du Colombier  *  as default control(2) supposes.
3*6f314b92SDavid du Colombier  *  codes are mostly from /sys/src/libcontrol/textbutton.c
4*6f314b92SDavid du Colombier  */
5*6f314b92SDavid du Colombier #include <u.h>
6*6f314b92SDavid du Colombier #include <libc.h>
7*6f314b92SDavid du Colombier #include <draw.h>
8*6f314b92SDavid du Colombier #include <thread.h>
9*6f314b92SDavid du Colombier #include <mouse.h>
10*6f314b92SDavid du Colombier #include <keyboard.h>
11*6f314b92SDavid du Colombier #include <control.h>
12*6f314b92SDavid du Colombier 
13*6f314b92SDavid du Colombier typedef struct Textbutton3 Textbutton3;
14*6f314b92SDavid du Colombier 
15*6f314b92SDavid du Colombier struct Textbutton3
16*6f314b92SDavid du Colombier {
17*6f314b92SDavid du Colombier 	Control;
18*6f314b92SDavid du Colombier 	CFont	*font;
19*6f314b92SDavid du Colombier 	CImage	*image;
20*6f314b92SDavid du Colombier 	CImage	*mask;
21*6f314b92SDavid du Colombier 	CImage	*light;
22*6f314b92SDavid du Colombier 	CImage	*bordercolor;
23*6f314b92SDavid du Colombier 	CImage	*textcolor;
24*6f314b92SDavid du Colombier 	CImage	*pressedtextcolor;
25*6f314b92SDavid du Colombier 	int		pressed;
26*6f314b92SDavid du Colombier 	int		lastbut;
27*6f314b92SDavid du Colombier 	int		lastshow;
28*6f314b92SDavid du Colombier 	char		**line;
29*6f314b92SDavid du Colombier 	int		nline;
30*6f314b92SDavid du Colombier 	int		align;
31*6f314b92SDavid du Colombier 	int		border;
32*6f314b92SDavid du Colombier 	int		left;
33*6f314b92SDavid du Colombier 	int		middle;
34*6f314b92SDavid du Colombier 	int		right;
35*6f314b92SDavid du Colombier 	int		toggle;
36*6f314b92SDavid du Colombier 	int		gettextflg;
37*6f314b92SDavid du Colombier };
38*6f314b92SDavid du Colombier 
39*6f314b92SDavid du Colombier enum{
40*6f314b92SDavid du Colombier 	EAlign,
41*6f314b92SDavid du Colombier 	EBorder,
42*6f314b92SDavid du Colombier 	EBordercolor,
43*6f314b92SDavid du Colombier 	EFocus,
44*6f314b92SDavid du Colombier 	EFont,
45*6f314b92SDavid du Colombier 	EFormat,
46*6f314b92SDavid du Colombier 	EHide,
47*6f314b92SDavid du Colombier 	EImage,
48*6f314b92SDavid du Colombier 	ELight,
49*6f314b92SDavid du Colombier 	EMask,
50*6f314b92SDavid du Colombier 	EPressedtextcolor,
51*6f314b92SDavid du Colombier 	ERect,
52*6f314b92SDavid du Colombier 	EReveal,
53*6f314b92SDavid du Colombier 	EShow,
54*6f314b92SDavid du Colombier 	ESize,
55*6f314b92SDavid du Colombier 	EText,
56*6f314b92SDavid du Colombier 	ETextcolor,
57*6f314b92SDavid du Colombier 	EEnable,
58*6f314b92SDavid du Colombier 	EDisable,
59*6f314b92SDavid du Colombier 	EToggle,
60*6f314b92SDavid du Colombier 	EGettext,
61*6f314b92SDavid du Colombier 	EValue,
62*6f314b92SDavid du Colombier };
63*6f314b92SDavid du Colombier 
64*6f314b92SDavid du Colombier static char *cmds[] = {
65*6f314b92SDavid du Colombier 	[EAlign] =			"align",
66*6f314b92SDavid du Colombier 	[EBorder] =		"border",
67*6f314b92SDavid du Colombier 	[EBordercolor] = 	"bordercolor",
68*6f314b92SDavid du Colombier 	[EFocus] = 		"focus",
69*6f314b92SDavid du Colombier 	[EFont] =			"font",
70*6f314b92SDavid du Colombier 	[EFormat] = 		"format",
71*6f314b92SDavid du Colombier 	[EHide] =			"hide",
72*6f314b92SDavid du Colombier 	[EImage] =		"image",
73*6f314b92SDavid du Colombier 	[ELight] =			"light",
74*6f314b92SDavid du Colombier 	[EMask] =			"mask",
75*6f314b92SDavid du Colombier 	[EPressedtextcolor] ="pressedtextcolor",
76*6f314b92SDavid du Colombier 	[ERect] =			"rect",
77*6f314b92SDavid du Colombier 	[EReveal] =		"reveal",
78*6f314b92SDavid du Colombier 	[EShow] =			"show",
79*6f314b92SDavid du Colombier 	[ESize] =			"size",
80*6f314b92SDavid du Colombier 	[EText] =			"text",
81*6f314b92SDavid du Colombier 	[ETextcolor] =		"textcolor",
82*6f314b92SDavid du Colombier 	[EEnable] =		"enable",
83*6f314b92SDavid du Colombier 	[EDisable] =		"disable",
84*6f314b92SDavid du Colombier 	[EToggle] =		"toggle",
85*6f314b92SDavid du Colombier 	[EGettext] =		"gettext",
86*6f314b92SDavid du Colombier 	[EValue] =			"value",
87*6f314b92SDavid du Colombier 	nil
88*6f314b92SDavid du Colombier };
89*6f314b92SDavid du Colombier 
90*6f314b92SDavid du Colombier static void	textbutton3show(Textbutton3 *);
91*6f314b92SDavid du Colombier 
92*6f314b92SDavid du Colombier static void
textbutton3mouse(Control * c,Mouse * m)93*6f314b92SDavid du Colombier textbutton3mouse(Control *c, Mouse *m)
94*6f314b92SDavid du Colombier {
95*6f314b92SDavid du Colombier 	Textbutton3 *t;
96*6f314b92SDavid du Colombier 
97*6f314b92SDavid du Colombier 	t = (Textbutton3 *)c;
98*6f314b92SDavid du Colombier 	if(t->left == 1) {
99*6f314b92SDavid du Colombier 		if((m->buttons&1) == 1 && (t->lastbut&1) == 0){
100*6f314b92SDavid du Colombier 			t->pressed ^= 1;
101*6f314b92SDavid du Colombier 			textbutton3show(t);
102*6f314b92SDavid du Colombier 			t->lastbut = m->buttons & 1;
103*6f314b92SDavid du Colombier 		}else if((m->buttons&1) == 0 && (t->lastbut&1) == 1){
104*6f314b92SDavid du Colombier 			if(t->gettextflg == 0)
105*6f314b92SDavid du Colombier 				chanprint(t->event, t->format, t->name, t->pressed, m->xy.x, m->xy.y);
106*6f314b92SDavid du Colombier 			else
107*6f314b92SDavid du Colombier 				chanprint(t->event, "%q: value %q", t->name, t->line[0]);
108*6f314b92SDavid du Colombier 			t->pressed ^= 1;
109*6f314b92SDavid du Colombier 			textbutton3show(t);
110*6f314b92SDavid du Colombier 			t->lastbut = m->buttons & 1;
111*6f314b92SDavid du Colombier 		}
112*6f314b92SDavid du Colombier 	}
113*6f314b92SDavid du Colombier 	if(t->middle == 1) {
114*6f314b92SDavid du Colombier 		if((m->buttons&2) == 2 && (t->lastbut&2) == 0){
115*6f314b92SDavid du Colombier 			t->pressed ^= 2;
116*6f314b92SDavid du Colombier 			textbutton3show(t);
117*6f314b92SDavid du Colombier 			t->lastbut = m->buttons & 2;
118*6f314b92SDavid du Colombier 		}else if((m->buttons&2) == 0 && (t->lastbut&2) == 2){
119*6f314b92SDavid du Colombier 			if(t->gettextflg == 0)
120*6f314b92SDavid du Colombier 				chanprint(t->event, t->format, t->name, t->pressed, m->xy.x, m->xy.y);
121*6f314b92SDavid du Colombier 			else
122*6f314b92SDavid du Colombier 				chanprint(t->event, "%q: value %q", t->name, t->line[0]);
123*6f314b92SDavid du Colombier 			t->pressed ^= 2;
124*6f314b92SDavid du Colombier 			textbutton3show(t);
125*6f314b92SDavid du Colombier 			t->lastbut = m->buttons & 2;
126*6f314b92SDavid du Colombier 		}
127*6f314b92SDavid du Colombier 	}
128*6f314b92SDavid du Colombier 	if(t->right == 1) {
129*6f314b92SDavid du Colombier 		if((m->buttons&4) == 4 && (t->lastbut&4) == 0){
130*6f314b92SDavid du Colombier 			t->pressed ^= 4;
131*6f314b92SDavid du Colombier 			textbutton3show(t);
132*6f314b92SDavid du Colombier 			t->lastbut = m->buttons & 4;
133*6f314b92SDavid du Colombier 		}else if((m->buttons&4) == 0 && (t->lastbut&4) == 4){
134*6f314b92SDavid du Colombier 			if(t->gettextflg == 0)
135*6f314b92SDavid du Colombier 				chanprint(t->event, t->format, t->name, t->pressed, m->xy.x, m->xy.y);
136*6f314b92SDavid du Colombier 			else
137*6f314b92SDavid du Colombier 				chanprint(t->event, "%q: value %q", t->name, t->line[0]);
138*6f314b92SDavid du Colombier 			t->pressed ^= 4;
139*6f314b92SDavid du Colombier 			textbutton3show(t);
140*6f314b92SDavid du Colombier 			t->lastbut = m->buttons & 4;
141*6f314b92SDavid du Colombier 		}
142*6f314b92SDavid du Colombier 	}
143*6f314b92SDavid du Colombier }
144*6f314b92SDavid du Colombier 
145*6f314b92SDavid du Colombier static void
textbutton3free(Control * c)146*6f314b92SDavid du Colombier textbutton3free(Control *c)
147*6f314b92SDavid du Colombier {
148*6f314b92SDavid du Colombier 	int i;
149*6f314b92SDavid du Colombier 	Textbutton3 *t;
150*6f314b92SDavid du Colombier 
151*6f314b92SDavid du Colombier 	t = (Textbutton3*)c;
152*6f314b92SDavid du Colombier 	_putctlfont(t->font);
153*6f314b92SDavid du Colombier 	_putctlimage(t->image);
154*6f314b92SDavid du Colombier 	_putctlimage(t->light);
155*6f314b92SDavid du Colombier 	_putctlimage(t->mask);
156*6f314b92SDavid du Colombier 	_putctlimage(t->textcolor);
157*6f314b92SDavid du Colombier 	_putctlimage(t->bordercolor);
158*6f314b92SDavid du Colombier 	_putctlimage(t->pressedtextcolor);
159*6f314b92SDavid du Colombier 	for(i=0; i<t->nline; i++)
160*6f314b92SDavid du Colombier 		free(t->line[i]);
161*6f314b92SDavid du Colombier 	free(t->line);
162*6f314b92SDavid du Colombier }
163*6f314b92SDavid du Colombier 
164*6f314b92SDavid du Colombier static void
textbutton3show(Textbutton3 * t)165*6f314b92SDavid du Colombier textbutton3show(Textbutton3 *t)
166*6f314b92SDavid du Colombier {
167*6f314b92SDavid du Colombier 	Rectangle r, clipr;
168*6f314b92SDavid du Colombier 	int i, dx, dy, w;
169*6f314b92SDavid du Colombier 	Font *f;
170*6f314b92SDavid du Colombier 	Point p, q;
171*6f314b92SDavid du Colombier 	Image *im;
172*6f314b92SDavid du Colombier 
173*6f314b92SDavid du Colombier 	if(t->hidden || t->lastshow == t->pressed)
174*6f314b92SDavid du Colombier 		return;
175*6f314b92SDavid du Colombier 	f = t->font->font;
176*6f314b92SDavid du Colombier 	draw(t->screen, t->rect, t->image->image, nil, t->image->image->r.min);
177*6f314b92SDavid du Colombier 	if(t->pressed || t->toggle)
178*6f314b92SDavid du Colombier 		draw(t->screen, t->rect, t->light->image, t->mask->image, t->mask->image->r.min);
179*6f314b92SDavid du Colombier 	if(t->border > 0)
180*6f314b92SDavid du Colombier 		border(t->screen, t->rect, t->border, t->bordercolor->image, ZP);
181*6f314b92SDavid du Colombier 	/* text goes here */
182*6f314b92SDavid du Colombier 	dx = 0;
183*6f314b92SDavid du Colombier 	for(i=0; i<t->nline; i++){
184*6f314b92SDavid du Colombier 		w = stringwidth(f, t->line[i]);		/*****/
185*6f314b92SDavid du Colombier 		if(dx < w)
186*6f314b92SDavid du Colombier 			dx = w;
187*6f314b92SDavid du Colombier 	}
188*6f314b92SDavid du Colombier 	dy = t->nline*f->height;
189*6f314b92SDavid du Colombier 	clipr = insetrect(t->rect, t->border);
190*6f314b92SDavid du Colombier 	p = _ctlalignpoint(clipr, dx, dy, t->align);
191*6f314b92SDavid du Colombier 	im = t->textcolor->image;
192*6f314b92SDavid du Colombier 	if(t->pressed)
193*6f314b92SDavid du Colombier 		im = t->pressedtextcolor->image;
194*6f314b92SDavid du Colombier 	for(i=0; i<t->nline; i++){
195*6f314b92SDavid du Colombier 		r.min = p;
196*6f314b92SDavid du Colombier 		r.max.x = p.x+dx;
197*6f314b92SDavid du Colombier 		r.max.y = p.y+f->height;
198*6f314b92SDavid du Colombier 		q = _ctlalignpoint(r, stringwidth(f, t->line[i]), f->height, t->align%3);
199*6f314b92SDavid du Colombier 		_string(t->screen, q, im,
200*6f314b92SDavid du Colombier 			ZP, f, t->line[i], nil, strlen(t->line[i]),
201*6f314b92SDavid du Colombier 			clipr, nil, ZP, SoverD);
202*6f314b92SDavid du Colombier 		p.y += f->height;
203*6f314b92SDavid du Colombier 	}
204*6f314b92SDavid du Colombier 	t->lastshow = t->pressed;
205*6f314b92SDavid du Colombier 	flushimage(display, 1);
206*6f314b92SDavid du Colombier }
207*6f314b92SDavid du Colombier 
208*6f314b92SDavid du Colombier static void
textbutton3ctl(Control * c,CParse * cp)209*6f314b92SDavid du Colombier textbutton3ctl(Control *c, CParse *cp)
210*6f314b92SDavid du Colombier {
211*6f314b92SDavid du Colombier 	int cmd, i;
212*6f314b92SDavid du Colombier 	Rectangle r;
213*6f314b92SDavid du Colombier 	Textbutton3 *t;
214*6f314b92SDavid du Colombier 
215*6f314b92SDavid du Colombier 	t = (Textbutton3*)c;
216*6f314b92SDavid du Colombier 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
217*6f314b92SDavid du Colombier 	switch(cmd){
218*6f314b92SDavid du Colombier 	default:
219*6f314b92SDavid du Colombier 		ctlerror("%q: unrecognized message '%s'", t->name, cp->str);
220*6f314b92SDavid du Colombier 		break;
221*6f314b92SDavid du Colombier 	case EAlign:
222*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
223*6f314b92SDavid du Colombier 		t->align = _ctlalignment(cp->args[1]);
224*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
225*6f314b92SDavid du Colombier 		break;
226*6f314b92SDavid du Colombier 	case EBorder:
227*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
228*6f314b92SDavid du Colombier 		t->border = cp->iargs[1];
229*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
230*6f314b92SDavid du Colombier 		break;
231*6f314b92SDavid du Colombier 	case EBordercolor:
232*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
233*6f314b92SDavid du Colombier 		_setctlimage(t, &t->bordercolor, cp->args[1]);
234*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
235*6f314b92SDavid du Colombier 		break;
236*6f314b92SDavid du Colombier 	case EFocus:
237*6f314b92SDavid du Colombier 		break;
238*6f314b92SDavid du Colombier 	case EFont:
239*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
240*6f314b92SDavid du Colombier 		_setctlfont(t, &t->font, cp->args[1]);
241*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
242*6f314b92SDavid du Colombier 		break;
243*6f314b92SDavid du Colombier 	case EFormat:
244*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
245*6f314b92SDavid du Colombier 		t->format = ctlstrdup(cp->args[1]);
246*6f314b92SDavid du Colombier 		break;
247*6f314b92SDavid du Colombier 	case EHide:
248*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 1);
249*6f314b92SDavid du Colombier 		t->hidden = 1;
250*6f314b92SDavid du Colombier 		break;
251*6f314b92SDavid du Colombier 	case EImage:
252*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
253*6f314b92SDavid du Colombier 		_setctlimage(t, &t->image, cp->args[1]);
254*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
255*6f314b92SDavid du Colombier 		break;
256*6f314b92SDavid du Colombier 	case ELight:
257*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
258*6f314b92SDavid du Colombier 		_setctlimage(t, &t->light, cp->args[1]);
259*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
260*6f314b92SDavid du Colombier 		break;
261*6f314b92SDavid du Colombier 	case EMask:
262*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
263*6f314b92SDavid du Colombier 		_setctlimage(t, &t->mask, cp->args[1]);
264*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
265*6f314b92SDavid du Colombier 		break;
266*6f314b92SDavid du Colombier 	case EPressedtextcolor:
267*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
268*6f314b92SDavid du Colombier 		_setctlimage(t, &t->pressedtextcolor, cp->args[1]);
269*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
270*6f314b92SDavid du Colombier 		break;
271*6f314b92SDavid du Colombier 	case ERect:
272*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 5);
273*6f314b92SDavid du Colombier 		r.min.x = cp->iargs[1];
274*6f314b92SDavid du Colombier 		r.min.y = cp->iargs[2];
275*6f314b92SDavid du Colombier 		r.max.x = cp->iargs[3];
276*6f314b92SDavid du Colombier 		r.max.y = cp->iargs[4];
277*6f314b92SDavid du Colombier 		if(Dx(r)<=0 || Dy(r)<=0)
278*6f314b92SDavid du Colombier 			ctlerror("%q: bad rectangle: %s", t->name, cp->str);
279*6f314b92SDavid du Colombier 		t->rect = r;
280*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
281*6f314b92SDavid du Colombier 		break;
282*6f314b92SDavid du Colombier 	case EReveal:
283*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 1);
284*6f314b92SDavid du Colombier 		t->hidden = 0;
285*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
286*6f314b92SDavid du Colombier 		textbutton3show(t);
287*6f314b92SDavid du Colombier 		break;
288*6f314b92SDavid du Colombier 	case EShow:
289*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 1);
290*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
291*6f314b92SDavid du Colombier 		textbutton3show(t);
292*6f314b92SDavid du Colombier 		break;
293*6f314b92SDavid du Colombier 	case ESize:
294*6f314b92SDavid du Colombier 		if (cp->nargs == 3)
295*6f314b92SDavid du Colombier 			r.max = Pt(0x7fffffff, 0x7fffffff);
296*6f314b92SDavid du Colombier 		else{
297*6f314b92SDavid du Colombier 			_ctlargcount(t, cp, 5);
298*6f314b92SDavid du Colombier 			r.max.x = cp->iargs[3];
299*6f314b92SDavid du Colombier 			r.max.y = cp->iargs[4];
300*6f314b92SDavid du Colombier 		}
301*6f314b92SDavid du Colombier 		r.min.x = cp->iargs[1];
302*6f314b92SDavid du Colombier 		r.min.y = cp->iargs[2];
303*6f314b92SDavid du Colombier 		if(r.min.x<=0 || r.min.y<=0 || r.max.x<=0 || r.max.y<=0 || r.max.x < r.min.x || r.max.y < r.min.y)
304*6f314b92SDavid du Colombier 			ctlerror("%q: bad sizes: %s", t->name, cp->str);
305*6f314b92SDavid du Colombier 		t->size.min = r.min;
306*6f314b92SDavid du Colombier 		t->size.max = r.max;
307*6f314b92SDavid du Colombier 		break;
308*6f314b92SDavid du Colombier 	case EText:
309*6f314b92SDavid du Colombier 		/* free existing text */
310*6f314b92SDavid du Colombier 		for(i=0; i<t->nline; i++)
311*6f314b92SDavid du Colombier 			free(t->line[i]);
312*6f314b92SDavid du Colombier 		t->nline = cp->nargs-1;
313*6f314b92SDavid du Colombier 		t->line = ctlrealloc(t->line, t->nline*sizeof(char*));
314*6f314b92SDavid du Colombier 		for(i=0; i<t->nline; i++)
315*6f314b92SDavid du Colombier 			t->line[i] = ctlstrdup(cp->args[i+1]);
316*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
317*6f314b92SDavid du Colombier 		textbutton3show(t);
318*6f314b92SDavid du Colombier 		break;
319*6f314b92SDavid du Colombier 	case ETextcolor:
320*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
321*6f314b92SDavid du Colombier 		_setctlimage(t, &t->textcolor, cp->args[1]);
322*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
323*6f314b92SDavid du Colombier 		break;
324*6f314b92SDavid du Colombier 	case EEnable:
325*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
326*6f314b92SDavid du Colombier 		if(strcmp(cp->args[1], "left") == 0)
327*6f314b92SDavid du Colombier 				t->left = 1;
328*6f314b92SDavid du Colombier 		else if(strcmp(cp->args[1], "middle") == 0)
329*6f314b92SDavid du Colombier 				t->middle = 1;
330*6f314b92SDavid du Colombier 		else if(strcmp(cp->args[1], "right") == 0)
331*6f314b92SDavid du Colombier 				t->right = 1;
332*6f314b92SDavid du Colombier 		break;
333*6f314b92SDavid du Colombier 	case EDisable:
334*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
335*6f314b92SDavid du Colombier 		if(strcmp(cp->args[1], "left") == 0)
336*6f314b92SDavid du Colombier 			t->left = 0;
337*6f314b92SDavid du Colombier 		else if(strcmp(cp->args[1], "middle") == 0)
338*6f314b92SDavid du Colombier 			t->middle = 0;
339*6f314b92SDavid du Colombier 		else if(strcmp(cp->args[1], "right") == 0)
340*6f314b92SDavid du Colombier 			t->right = 0;
341*6f314b92SDavid du Colombier 		break;
342*6f314b92SDavid du Colombier 	case EToggle:
343*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
344*6f314b92SDavid du Colombier 		if(strcmp(cp->args[1], "on") == 0)
345*6f314b92SDavid du Colombier 			t->toggle = 1;
346*6f314b92SDavid du Colombier 		else if(strcmp(cp->args[1], "off") == 0)
347*6f314b92SDavid du Colombier 			t->toggle = 0;
348*6f314b92SDavid du Colombier 		t->lastshow = -1;	/* force redraw */
349*6f314b92SDavid du Colombier 		break;
350*6f314b92SDavid du Colombier 	case EGettext:
351*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
352*6f314b92SDavid du Colombier 		if(strcmp(cp->args[1], "on") == 0)
353*6f314b92SDavid du Colombier 			t->gettextflg = 1;
354*6f314b92SDavid du Colombier 		else if(strcmp(cp->args[1], "off") == 0)
355*6f314b92SDavid du Colombier 			t->gettextflg = 0;
356*6f314b92SDavid du Colombier 		break;
357*6f314b92SDavid du Colombier 	case EValue:
358*6f314b92SDavid du Colombier 		_ctlargcount(t, cp, 2);
359*6f314b92SDavid du Colombier 		if((cp->iargs[1]!=0) != t->pressed){
360*6f314b92SDavid du Colombier 			t->pressed ^= 1;
361*6f314b92SDavid du Colombier 			textbutton3show(t);
362*6f314b92SDavid du Colombier 		}
363*6f314b92SDavid du Colombier 		break;
364*6f314b92SDavid du Colombier 	}
365*6f314b92SDavid du Colombier }
366*6f314b92SDavid du Colombier 
367*6f314b92SDavid du Colombier Control*
createtextbutton3(Controlset * cs,char * name)368*6f314b92SDavid du Colombier createtextbutton3(Controlset *cs, char *name)
369*6f314b92SDavid du Colombier {
370*6f314b92SDavid du Colombier 	Textbutton3 *t;
371*6f314b92SDavid du Colombier 
372*6f314b92SDavid du Colombier 	t = (Textbutton3 *)_createctl(cs, "textbutton3", sizeof(Textbutton3), name);
373*6f314b92SDavid du Colombier 	t->line = ctlmalloc(sizeof(char*));
374*6f314b92SDavid du Colombier 	t->nline = 0;
375*6f314b92SDavid du Colombier 	t->image = _getctlimage("white");
376*6f314b92SDavid du Colombier 	t->light = _getctlimage("yellow");
377*6f314b92SDavid du Colombier 	t->mask = _getctlimage("opaque");
378*6f314b92SDavid du Colombier 	t->bordercolor = _getctlimage("black");
379*6f314b92SDavid du Colombier 	t->textcolor = _getctlimage("black");
380*6f314b92SDavid du Colombier 	t->pressedtextcolor = _getctlimage("black");
381*6f314b92SDavid du Colombier 	t->font = _getctlfont("font");
382*6f314b92SDavid du Colombier 	t->format = ctlstrdup("%q: value %d %d %d");
383*6f314b92SDavid du Colombier 	t->lastshow = -1;
384*6f314b92SDavid du Colombier 	t->mouse = textbutton3mouse;
385*6f314b92SDavid du Colombier 	t->ctl = textbutton3ctl;
386*6f314b92SDavid du Colombier 	t->exit = textbutton3free;
387*6f314b92SDavid du Colombier 	t->left = 1;
388*6f314b92SDavid du Colombier 	t->middle = 1;
389*6f314b92SDavid du Colombier 	t->right = 1;
390*6f314b92SDavid du Colombier 	t->toggle = 0;
391*6f314b92SDavid du Colombier 	t->gettextflg = 0;
392*6f314b92SDavid du Colombier 	return (Control *)t;
393*6f314b92SDavid du Colombier }
394