3 * looks like a group, except diverts hits on certain buttons to
4 * panels that it temporarily pops up.
12 typedef struct Popup Popup;
14 Image *save; /* where to save what the popup covers */
15 Panel *pop[3]; /* what to pop up */
17 void pl_drawpopup(Panel *p){
20 int pl_hitpopup(Panel *g, Mouse *m){
28 case 0: p=g->child; break;
29 case 1: p=pp->pop[0]; g->state=DOWN1; break;
30 case 2: p=pp->pop[1]; g->state=DOWN2; break;
31 case 4: p=pp->pop[2]; g->state=DOWN3; break;
38 else if(g->state!=UP){
39 plpack(p, screen->clipr);
41 d=subpt(m->xy, divpt(addpt(p->lastmouse->r.min,
42 p->lastmouse->r.max), 2));
44 d=subpt(m->xy, divpt(addpt(p->r.min, p->r.max), 2));
45 if(p->r.min.x+d.x<g->r.min.x) d.x=g->r.min.x-p->r.min.x;
46 if(p->r.max.x+d.x>g->r.max.x) d.x=g->r.max.x-p->r.max.x;
47 if(p->r.min.y+d.y<g->r.min.y) d.y=g->r.min.y-p->r.min.y;
48 if(p->r.max.y+d.y>g->r.max.y) d.y=g->r.max.y-p->r.max.y;
50 pp->save=allocimage(display, p->r, g->b->chan, 0, DNofill);
51 if(pp->save!=0) draw(pp->save, p->r, g->b, 0, p->r.min);
58 default: SET(p); break; /* can't happen! */
59 case DOWN1: p=pp->pop[0]; break;
60 case DOWN2: p=pp->pop[1]; break;
61 case DOWN3: p=pp->pop[2]; break;
62 case DOWN: p=g->child; break;
64 if((m->buttons&7)==0){
67 draw(g->b, p->r, pp->save, 0, p->r.min);
68 flushimage(display, 1);
80 return (m->buttons&7)!=0;
82 void pl_typepopup(Panel *g, Rune c){
85 Point pl_getsizepopup(Panel *g, Point children){
89 void pl_childspacepopup(Panel *g, Point *ul, Point *size){
92 int pl_pripopup(Panel *, Point){
95 void plinitpopup(Panel *v, int flags, Panel *pop0, Panel *pop1, Panel *pop2){
101 v->draw=pl_drawpopup;
103 v->type=pl_typepopup;
104 v->getsize=pl_getsizepopup;
105 v->childspace=pl_childspacepopup;
112 Panel *plpopup(Panel *parent, int flags, Panel *pop0, Panel *pop1, Panel *pop2){
114 v=pl_newpanel(parent, sizeof(Popup));
115 plinitpopup(v, flags, pop0, pop1, pop2);