9 typedef struct Entry Entry;
17 void (*hit)(Panel *, char *);
20 #define SLACK 7 /* enough for one extra rune and ◀ and a nul */
21 void pl_cutentry(Panel *p){
25 memmove(ep->entry+ep->a, ep->entry+ep->b, (ep->n-ep->b)*sizeof(Rune));
30 char *pl_snarfentry(Panel *p){
34 if(p->flags&USERFL) /* no snarfing from password entry */
39 return smprint("%.*S", n, ep->entry+ep->a);
41 void pl_pasteentry(Panel *p, char *s){
47 ep->sz=ep->n+m+100+SLACK;
48 ep->entry=pl_erealloc(ep->entry,ep->sz*sizeof(Rune));
49 memmove(ep->entry+ep->a+m, ep->entry+ep->b, (ep->n-ep->b)*sizeof(Rune));
50 ep->n+=m-(ep->b-ep->a);
52 s += chartorune(&ep->entry[ep->a++], s);
57 static void drawentry(Panel *p, Rectangle r, Rune *s){
70 tick.x += runestringnwidth(font, s, ep->a);
74 if(!ptinrect(tick, r)){
78 else if(tick.x > r.max.x)
87 if(!rectclip(&r, save))
89 replclipr(b, b->repl, r);
90 runestring(b, ep->text, pl_black, ZP, font, s);
94 r.max.x = ep->text.x+runestringnwidth(font, s, ep->b);
95 if(r.max.x < r.min.x){
104 replclipr(b, b->repl, save);
106 void pl_drawentry(Panel *p){
112 r=pl_box(p->b, p->r, p->state|BORDER);
114 if(p->flags & USERFL){
124 int pl_hitentry(Panel *p, Mouse *m){
127 if((m->buttons&7)==1){
132 for(i = 1; i <= ep->n; i++)
133 if(runestringnwidth(font, ep->entry, i) > m->xy.x-ep->text.x)
142 if(display->bufp > display->buf)
143 flushimage(display, 1);
147 if((m->buttons&7)==3){
153 if(selecting && (m->buttons&7)==1){
155 for(i = 0; i < ep->n; i++)
156 if(runestringnwidth(font, ep->entry, i)+TICKW > m->xy.x-ep->text.x)
159 * tick is moved towards the mouse pointer dragging the selection
160 * after drawing it has to be set so that (a <= b), since
161 * the rest of the logic assumes that's always the case
172 if((m->buttons&7)==5)
181 void pl_typeentry(Panel *p, Rune c){
187 if(ep->hit) ep->hit(p, plentryval(p));
210 case Kdel: /* clear */
211 ep->a = ep->b = ep->n = 0;
214 case Knack: /* ^U: erase line */
218 case Kbs: /* ^H: erase character */
219 if(ep->a > 0 && ep->a == ep->b)
223 case Ketb: /* ^W: erase word */
224 while(ep->a>0 && !pl_idchar(ep->entry[ep->a-1]))
226 while(ep->a>0 && pl_idchar(ep->entry[ep->a-1]))
232 if(c < 0x20 || (c & 0xFF00) == KF || (c & 0xFF00) == Spec)
234 memmove(ep->entry+ep->a+1, ep->entry+ep->b, (ep->n-ep->b)*sizeof(Rune));
235 ep->n -= ep->b - ep->a - 1;
236 ep->entry[ep->a++] = c;
240 ep->entry=pl_erealloc(ep->entry, (ep->sz+SLACK)*sizeof(Rune));
247 Point pl_getsizeentry(Panel *p, Point children){
249 return pl_boxsize(((Entry *)p->data)->minsize, p->state);
251 void pl_childspaceentry(Panel *p, Point *ul, Point *size){
254 void pl_freeentry(Panel *p){
262 void plinitentry(Panel *v, int flags, int wid, char *str, void (*hit)(Panel *, char *)){
267 v->draw=pl_drawentry;
269 v->type=pl_typeentry;
270 v->getsize=pl_getsizeentry;
271 v->childspace=pl_childspaceentry;
272 ep->minsize=Pt(wid, font->height);
273 v->free=pl_freeentry;
274 v->snarf=pl_snarfentry;
275 v->paste=pl_pasteentry;
277 ep->n = str ? utflen(str) : 0;
278 ep->sz = ep->n + 100;
279 ep->entry=pl_erealloc(ep->entry, (ep->sz+SLACK)*sizeof(Rune));
280 runesnprint(ep->entry, ep->sz, "%s", str ? str : "");
284 Panel *plentry(Panel *parent, int flags, int wid, char *str, void (*hit)(Panel *, char *)){
286 v=pl_newpanel(parent, sizeof(Entry));
287 plinitentry(v, flags, wid, str, hit);
290 char *plentryval(Panel *p){
294 ep->sentry = smprint("%S", ep->entry);