ref: f664f9d3a8d305e088f259a23cb6e86e664a7b36
dir: /libeenter.c/
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
#include <keyboard.h>
#include "genenter.h"
static int
eeinitsave(Enterparams *p)
{
if(p->save)
return 0;
p->save = allocimage(display, p->r, p->b->chan, 0, DNofill);
if(p->save == nil){
return 1;
}
draw(p->save, p->r, p->b, nil, p->r.min);
return 0;
}
static int
eegetevent(Enterparams *p)
{
Event ev;
int i = Ekeyboard;
if(p->aux)
i |= Emouse;
replclipr(p->b, 0, p->sc);
i = eread(i, &ev);
/* screen might have been resized */
if(p->b != screen || !eqrect(screen->clipr, p->sc)){
freeimage(p->save);
p->save = nil;
}
p->b = screen;
p->sc = p->b->clipr;
replclipr(p->b, 0, p->b->r);
if(i == Emouse){
p->m = ev.mouse;
return Gmouse;
}
if(i == Ekeyboard){
p->k = ev.kbdc;
return Gkeyboard;
}
return -1;
}
static void
eeloopcleanup(Enterparams *p)
{
if(p->save){
draw(p->b, p->save->r, p->save, nil, p->save->r.min);
freeimage(p->save);
p->save = nil;
}
}
static void
eecleanup(Enterparams *p)
{
replclipr(p->b, 0, p->sc);
}
int
eenter(char *ask, char *buf, int len, Mouse *m)
{
Enterparams p;
while(ecankbd())
ekbd();
if(m)
p.o = m->xy;
p.b = screen;
p.sc = p.b->clipr;
replclipr(p.b, 0, p.b->r);
p.aux = m;
p.initsave = eeinitsave;
p.getevent = eegetevent;
p.loopcleanup = eeloopcleanup;
p.cleanup = eecleanup;
return _genenter(ask, buf, len, &p);
}