9 typedef struct Entry Entry;
45 static char *cmds[] = {
48 [EBordercolor] = "bordercolor",
59 [ETextcolor] = "textcolor",
71 _putctlimage(e->image);
72 _putctlimage(e->textcolor);
73 _putctlimage(e->bordercolor);
78 entrypoint(Entry *e, int c)
85 r = insetrect(r, e->border);
87 runestringnwidth(e->font->font, e->text, e->ntext),
88 e->font->font->height, e->align);
91 p.x += runestringnwidth(e->font->font, e->text, c);
104 draw(e->screen, r, e->image->image, nil, e->image->image->r.min);
106 border(e->screen, r, e->border, e->bordercolor->image, e->bordercolor->image->r.min);
107 dr = insetrect(r, e->border);
110 p = entrypoint(e, 0);
111 _string(e->screen, p, e->textcolor->image,
112 ZP, e->font->font, nil, e->text, e->ntext,
113 dr, nil, ZP, SoverD);
115 p = entrypoint(e, e->cursor);
118 r.max.y = p.y+e->font->font->height;
120 draw(e->screen, r, e->textcolor->image, nil, ZP);
122 flushimage(display, 1);
126 entrysetpoint(Entry *e, Point cp)
131 if(!ptinrect(cp, insetrect(e->rect, e->border)))
133 p = entrypoint(e, 0);
134 for(i=0; i<e->ntext; i++){
135 p.x += runestringnwidth(e->font->font, e->text+i, 1);
146 _ctlputsnarf(e->text);
162 e->text = ctlrealloc(e->text, (e->ntext+n+1)*sizeof(Rune));
163 memmove(e->text+e->cursor+n, e->text+e->cursor,
164 (e->ntext+1-e->cursor)*sizeof(Rune));
165 memmove(e->text+e->cursor, s, n*sizeof(Rune));
171 entrymouse(Control *c, Mouse *m)
176 if(m->buttons==1 && e->lastbut==0){
177 entrysetpoint(e, m->xy);
178 } else if(m->buttons==3 && e->lastbut!=3){
181 } else if(m->buttons==5 && e->lastbut!=5){
185 e->lastbut = m->buttons;
189 entryctl(Control *c, CParse *cp)
197 cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
200 ctlerror("%q: unrecognized message '%s'", e->name, cp->str);
203 _ctlargcount(e, cp, 2);
204 e->align = _ctlalignment(cp->args[1]);
207 _ctlargcount(e, cp, 2);
209 ctlerror("%q: bad border: %c", e->name, cp->str);
210 e->border = cp->iargs[1];
213 _ctlargcount(e, cp, 2);
214 _setctlimage(e, &e->bordercolor, cp->args[1]);
217 _ctlargcount(e, cp, 1);
218 chanprint(e->data, "%S", e->text);
221 _ctlargcount(e, cp, 2);
222 e->hasfocus = cp->iargs[1];
227 _ctlargcount(e, cp, 2);
228 _setctlfont(e, &e->font, cp->args[1]);
231 _ctlargcount(e, cp, 2);
232 e->format = ctlstrdup(cp->args[1]);
235 _ctlargcount(e, cp, 1);
239 _ctlargcount(e, cp, 2);
240 _setctlimage(e, &e->image, cp->args[1]);
243 _ctlargcount(e, cp, 5);
244 r.min.x = cp->iargs[1];
245 r.min.y = cp->iargs[2];
246 r.max.x = cp->iargs[3];
247 r.max.y = cp->iargs[4];
248 if(Dx(r)<=0 || Dy(r)<=0)
249 ctlerror("%q: bad rectangle: %s", e->name, cp->str);
253 _ctlargcount(e, cp, 1);
258 _ctlargcount(e, cp, 1);
263 r.max = Pt(0x7fffffff, 0x7fffffff);
265 _ctlargcount(e, cp, 5);
266 r.max.x = cp->iargs[3];
267 r.max.y = cp->iargs[4];
269 r.min.x = cp->iargs[1];
270 r.min.y = cp->iargs[2];
271 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)
272 ctlerror("%q: bad sizes: %s", e->name, cp->str);
277 _ctlargcount(e, cp, 2);
278 _setctlimage(e, &e->textcolor, cp->args[1]);
281 _ctlargcount(e, cp, 2);
282 rp = _ctlrunestr(cp->args[1]);
283 if(runestrcmp(rp, e->text) != 0){
286 e->ntext = runestrlen(e->text);
287 e->cursor = e->ntext;
296 entrykey(Entry *e, Rune r)
302 e->text = ctlrealloc(e->text, (e->ntext+1+1)*sizeof(Rune));
303 memmove(e->text+e->cursor+1, e->text+e->cursor,
304 (e->ntext+1-e->cursor)*sizeof(Rune));
305 e->text[e->cursor++] = r;
308 case L'\n': /* newline: return value */
309 p = _ctlstrrune(e->text);
310 chanprint(e->event, e->format, e->name, p);
315 memmove(e->text+e->cursor-1, e->text+e->cursor,
316 (e->ntext+1-e->cursor)*sizeof(Rune));
322 if(e->cursor < e->ntext)
329 case 0x01: /* control A: beginning of line */
332 case 0x05: /* control E: end of line */
333 e->cursor = e->ntext;
335 case 0x15: /* control U: kill line */
339 case 0x16: /* control V: paste (append snarf buffer) */
343 e->text[e->ntext] = L'\0';
347 entrykeys(Control *c, Rune *rp)
353 for(i=0; rp[i]!=L'\0'; i++)
359 createentry(Controlset *cs, char *name)
363 e = (Entry*) _createctl(cs, "entry", sizeof(Entry), name);
364 e->text = ctlmalloc(sizeof(Rune));
366 e->image = _getctlimage("white");
367 e->textcolor = _getctlimage("black");
368 e->bordercolor = _getctlimage("black");
369 e->font = _getctlfont("font");
370 e->format = ctlstrdup("%q: value %q");
373 e->mouse = entrymouse;