9 typedef struct Slider Slider;
18 CImage *indicatorcolor;
49 static char *cmds[] = {
50 [EAbsolute] = "absolute",
52 [EBordercolor] = "bordercolor",
58 [EIndicatorcolor] = "indicatorcolor",
70 sliderfree(Control *c)
75 _putctlimage(s->image);
76 _putctlimage(s->textcolor);
77 _putctlimage(s->bordercolor);
78 _putctlimage(s->indicatorcolor);
90 draw(s->screen, r, s->image->image, nil, s->image->image->r.min);
92 border(s->screen, r, s->border, s->bordercolor->image, s->bordercolor->image->r.min);
93 r = insetrect(r, s->border);
101 l = muldiv(s->value, d, s->max);
102 h = muldiv(s->value+s->vis, d, s->max);
103 if(s->clamplow && s->clamphigh){
106 }else if(s->clamplow){
109 }else if(s->clamphigh)
120 draw(s->screen, r, s->indicatorcolor->image, nil, s->indicatorcolor->image->r.min);
121 flushimage(display, 1);
125 sliderctl(Control *c, CParse *cp)
132 cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
135 ctlerror("%q: unrecognized message '%s'", s->name, cp->str);
138 _ctlargcount(s, cp, 2);
139 s->absolute = cp->iargs[1];
142 _ctlargcount(s, cp, 2);
144 ctlerror("%q: bad border: %c", s->name, cp->str);
145 s->border = cp->iargs[1];
148 _ctlargcount(s, cp, 2);
149 _setctlimage(s, &s->bordercolor, cp->args[1]);
152 _ctlargcount(s, cp, 3);
153 if(strcmp(cp->args[1], "high") == 0)
154 s->clamphigh = cp->iargs[2];
155 else if(strcmp(cp->args[1], "low") == 0)
156 s->clamplow = cp->iargs[2];
158 ctlerror("%q: unrecognized clamp: %s", s->name, cp->str);
161 /* ignore focus change */
164 _ctlargcount(s, cp, 2);
165 s->format = ctlstrdup(cp->args[1]);
168 _ctlargcount(s, cp, 1);
172 _ctlargcount(s, cp, 2);
173 _setctlimage(s, &s->image, cp->args[1]);
175 case EIndicatorcolor:
176 _ctlargcount(s, cp, 2);
177 _setctlimage(s, &s->indicatorcolor, cp->args[1]);
180 _ctlargcount(s, cp, 2);
182 ctlerror("%q: negative max value: %s", s->name, cp->str);
183 if(s->max != cp->iargs[1]){
184 s->max = cp->iargs[1];
189 _ctlargcount(s, cp, 2);
190 prev = s->horizontal;
191 if(strncmp(cp->args[1], "hor", 3) == 0)
193 else if(strncmp(cp->args[1], "ver", 3) == 0)
196 ctlerror("%q: unrecognized orientation: %s", s->name, cp->str);
197 if(s->horizontal != prev)
201 _ctlargcount(s, cp, 5);
202 r.min.x = cp->iargs[1];
203 r.min.y = cp->iargs[2];
204 r.max.x = cp->iargs[3];
205 r.max.y = cp->iargs[4];
206 if(Dx(r)<=0 || Dy(r)<=0)
207 ctlerror("%q: bad rectangle: %s", s->name, cp->str);
211 _ctlargcount(s, cp, 1);
216 _ctlargcount(s, cp, 1);
221 r.max = Pt(0x7fffffff, 0x7fffffff);
223 _ctlargcount(s, cp, 5);
224 r.max.x = cp->iargs[3];
225 r.max.y = cp->iargs[4];
227 r.min.x = cp->iargs[1];
228 r.min.y = cp->iargs[2];
229 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)
230 ctlerror("%q: bad sizes: %s", s->name, cp->str);
235 _ctlargcount(s, cp, 2);
236 if(s->value != cp->iargs[1]){
237 s->value = cp->iargs[1];
242 _ctlargcount(s, cp, 2);
243 if(s->vis != cp->iargs[1]){
244 s->vis = cp->iargs[1];
252 slidermouse(Control *c, Mouse *m)
264 if(!s->absolute && s->lastbut==m->buttons && s->lastbut!=2){
265 /* clicks only on buttons 1 & 3; continuous motion on 2 (or when absolute) */
268 if(s->lastbut!=0 && m->buttons!=s->lastbut){
269 /* buttons down have changed; wait for button up */
272 s->lastbut = m->buttons;
274 r = insetrect(s->rect, s->border);
276 v = m->xy.x - r.min.x;
279 v = m->xy.y - r.min.y;
290 l = s->value - muldiv(v, s->vis, d);
293 l = muldiv(v, s->max, d);
296 l = s->value + muldiv(v, s->vis, d);
305 chanprint(s->event, s->format, s->name, s->value);
311 createslider(Controlset *cs, char *name)
315 s = (Slider*)_createctl(cs, "slider", sizeof(Slider), name);
316 s->image = _getctlimage("white");
317 s->textcolor = _getctlimage("black");
318 s->bordercolor = _getctlimage("black");
319 s->indicatorcolor = _getctlimage("black");
320 s->format = ctlstrdup("%q: value %d");
322 s->mouse = slidermouse;
324 s->exit = sliderfree;