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