9 typedef struct Button Button;
46 static char *cmds[] = {
49 [EBordercolor] = "bordercolor",
66 buttonfree(Control *c)
71 _putctlimage(b->image);
72 _putctlimage(b->mask);
73 _putctlimage(b->light);
74 _putctlimage(b->pale);
75 _putctlimage(b->bordercolor);
87 border(b->screen, r, b->border, b->bordercolor->image, ZP);
88 r = insetrect(b->rect, b->border);
90 draw(b->screen, r, b->image->image, nil, b->image->image->r.min);
92 draw(b->screen, r, b->pale->image, b->mask->image, b->mask->image->r.min);
94 draw(b->screen, r, b->light->image, b->mask->image, b->mask->image->r.min);
95 b->lastshow = b->pressed;
96 flushimage(display, 1);
100 buttonmouse(Control *c, Mouse *m)
107 if (ptinrect(m->xy,b->rect)) {
119 if((m->buttons&7) != b->lastbut){
121 b->prepress = b->pressed;
125 b->pressed = m->buttons & 7;
127 }else /* generate event on button up */
128 if (ptinrect(m->xy,b->rect))
129 chanprint(b->event, b->format, b->name, b->pressed);
132 b->pressed = b->prepress;
136 b->lastbut = m->buttons & 7;
140 buttonctl(Control *c, CParse *cp)
147 cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
150 ctlerror("%q: unrecognized message '%s'", b->name, cp->str);
153 _ctlargcount(b, cp, 2);
154 b->align = _ctlalignment(cp->args[1]);
155 b->lastshow = -1; /* force redraw */
158 _ctlargcount(b, cp, 2);
159 b->border = cp->iargs[1];
160 b->lastshow = -1; /* force redraw */
163 _ctlargcount(b, cp, 2);
164 _setctlimage(b, &b->bordercolor, cp->args[1]);
165 b->lastshow = -1; /* force redraw */
168 /* ignore focus change */
171 _ctlargcount(b, cp, 2);
172 b->format = ctlstrdup(cp->args[1]);
175 _ctlargcount(b, cp, 1);
179 _ctlargcount(b, cp, 2);
180 _setctlimage(b, &b->image, cp->args[1]);
181 b->lastshow = -1; /* force redraw */
184 _ctlargcount(b, cp, 2);
185 _setctlimage(b, &b->light, cp->args[1]);
186 b->lastshow = -1; /* force redraw */
189 _ctlargcount(b, cp, 2);
190 _setctlimage(b, &b->mask, cp->args[1]);
191 b->lastshow = -1; /* force redraw */
194 _ctlargcount(b, cp, 2);
195 _setctlimage(b, &b->pale, cp->args[1]);
196 b->lastshow = -1; /* force redraw */
199 _ctlargcount(b, cp, 5);
200 r.min.x = cp->iargs[1];
201 r.min.y = cp->iargs[2];
202 r.max.x = cp->iargs[3];
203 r.max.y = cp->iargs[4];
204 if(Dx(r)<0 || Dy(r)<0)
205 ctlerror("%q: bad rectangle: %s", b->name, cp->str);
207 b->lastshow = -1; /* force redraw */
210 _ctlargcount(b, cp, 1);
215 _ctlargcount(b, cp, 1);
220 r.max = Pt(0x7fffffff, 0x7fffffff);
222 _ctlargcount(b, cp, 5);
223 r.max.x = cp->iargs[3];
224 r.max.y = cp->iargs[4];
226 r.min.x = cp->iargs[1];
227 r.min.y = cp->iargs[2];
228 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)
229 ctlerror("%q: bad sizes: %s", b->name, cp->str);
234 _ctlargcount(b, cp, 2);
235 if((cp->iargs[1]!=0) != b->pressed){
244 createbutton(Controlset *cs, char *name)
247 b = (Button*)_createctl(cs, "button", sizeof(Button), name);
248 b->image = _getctlimage("white");
249 b->mask = _getctlimage("opaque");
250 b->light = _getctlimage("yellow");
251 b->pale = _getctlimage("paleyellow");
252 b->bordercolor = _getctlimage("black");
253 b->format = ctlstrdup("%q: value %d");
256 b->align = Aupperleft;
258 b->mouse = buttonmouse;
260 b->exit = buttonfree;