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);
144 entrymouse(Control *c, Mouse *m)
149 if(m->buttons==1 && e->lastbut==0)
150 entrysetpoint(e, m->xy);
151 e->lastbut = m->buttons;
155 entryctl(Control *c, CParse *cp)
163 cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
166 ctlerror("%q: unrecognized message '%s'", e->name, cp->str);
169 _ctlargcount(e, cp, 2);
170 e->align = _ctlalignment(cp->args[1]);
173 _ctlargcount(e, cp, 2);
175 ctlerror("%q: bad border: %c", e->name, cp->str);
176 e->border = cp->iargs[1];
179 _ctlargcount(e, cp, 2);
180 _setctlimage(e, &e->bordercolor, cp->args[1]);
183 _ctlargcount(e, cp, 1);
184 chanprint(e->data, "%S", e->text);
187 _ctlargcount(e, cp, 2);
188 e->hasfocus = cp->iargs[1];
193 _ctlargcount(e, cp, 2);
194 _setctlfont(e, &e->font, cp->args[1]);
197 _ctlargcount(e, cp, 2);
198 e->format = ctlstrdup(cp->args[1]);
201 _ctlargcount(e, cp, 1);
205 _ctlargcount(e, cp, 2);
206 _setctlimage(e, &e->image, cp->args[1]);
209 _ctlargcount(e, cp, 5);
210 r.min.x = cp->iargs[1];
211 r.min.y = cp->iargs[2];
212 r.max.x = cp->iargs[3];
213 r.max.y = cp->iargs[4];
214 if(Dx(r)<=0 || Dy(r)<=0)
215 ctlerror("%q: bad rectangle: %s", e->name, cp->str);
219 _ctlargcount(e, cp, 1);
224 _ctlargcount(e, cp, 1);
229 r.max = Pt(0x7fffffff, 0x7fffffff);
231 _ctlargcount(e, cp, 5);
232 r.max.x = cp->iargs[3];
233 r.max.y = cp->iargs[4];
235 r.min.x = cp->iargs[1];
236 r.min.y = cp->iargs[2];
237 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)
238 ctlerror("%q: bad sizes: %s", e->name, cp->str);
243 _ctlargcount(e, cp, 2);
244 _setctlimage(e, &e->textcolor, cp->args[1]);
247 _ctlargcount(e, cp, 2);
248 rp = _ctlrunestr(cp->args[1]);
249 if(runestrcmp(rp, e->text) != 0){
252 e->ntext = runestrlen(e->text);
253 e->cursor = e->ntext;
262 entrykey(Entry *e, Rune r)
270 e->text = ctlrealloc(e->text, (e->ntext+1+1)*sizeof(Rune));
271 memmove(e->text+e->cursor+1, e->text+e->cursor,
272 (e->ntext+1-e->cursor)*sizeof(Rune));
273 e->text[e->cursor++] = r;
276 case L'\n': /* newline: return value */
277 p = _ctlstrrune(e->text);
278 chanprint(e->event, e->format, e->name, p);
283 memmove(e->text+e->cursor-1, e->text+e->cursor,
284 (e->ntext+1-e->cursor)*sizeof(Rune));
290 if(e->cursor < e->ntext)
297 case 0x01: /* control A: beginning of line */
300 case 0x05: /* control E: end of line */
301 e->cursor = e->ntext;
303 case 0x15: /* control U: kill line */
307 case 0x16: /* control V: paste (append snarf buffer) */
311 e->text = ctlrealloc(e->text, (e->ntext+n+1)*sizeof(Rune));
312 memmove(e->text+e->cursor+n, e->text+e->cursor,
313 (e->ntext+1-e->cursor)*sizeof(Rune));
314 memmove(e->text+e->cursor, s, n*sizeof(Rune));
320 e->text[e->ntext] = L'\0';
324 entrykeys(Control *c, Rune *rp)
330 for(i=0; rp[i]!=L'\0'; i++)
336 createentry(Controlset *cs, char *name)
340 e = (Entry*) _createctl(cs, "entry", sizeof(Entry), name);
341 e->text = ctlmalloc(sizeof(Rune));
343 e->image = _getctlimage("white");
344 e->textcolor = _getctlimage("black");
345 e->bordercolor = _getctlimage("black");
346 e->font = _getctlfont("font");
347 e->format = ctlstrdup("%q: value %q");
350 e->mouse = entrymouse;