1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #include <lib9.h>
- #include <draw.h>
- #include <interp.h>
- #include <isa.h>
- #include "../libinterp/runt.h"
- #include <drawif.h>
- #include <prefab.h>
- PCompound*
- iconbox(Prefab_Environ *e, Draw_Point p, String *titletext, Draw_Image *icon, Draw_Image *mask)
- {
- Draw_Rect er, r, ir;
- PCompound *pc;
- Prefab_Compound *c;
- PElement *elem, *title;
- Image *disp;
- Draw_Image *ddisp;
- Screen *screen;
- Heap *h;
- Rectangle t;
- Point pt;
- screen = lookupscreen(e->screen);
- if(screen == nil)
- return H;
- h = heapz(TCompound);
- if(h == H)
- return H;
- pc = H2D(PCompound*, h);
- c = &pc->c;
- gchalt++;
- title = H;
- if(titletext != H){
- er.min.x = 0;
- er.min.y = 0;
- er.max.x = Dx(icon->r)-5;
- er.max.y = 0;
- title = textelement(e, titletext, er, ETitle);
- if(title == H){
- Err:
- destroy(c);
- gchalt--;
- return H;
- }
- c->title = (Prefab_Element*)title;
- }
- r = icon->r;
- if(title != H)
- r.max.y += 2+1+title->nkids*e->style->titlefont->height+1;
- er = edgerect(e, p, &r);
- R2R(t, er);
- disp = allocwindow(screen, t, Refbackup /*refreshcompound*/, DWhite);
- if(disp == nil)
- goto Err;
- if((ddisp=mkdrawimage(disp, e->screen, e->screen->display, nil)) == H){
- freeimage(disp);
- goto Err;
- }
- ir = r;
- if(title != H){
- ir = r;
- pt.x = r.min.x+3;
- pt.y = r.min.y+3;
- translateelement(&title->e, pt);
- ir.min.y = title->e.r.max.y+1;
- }
- elem = iconelement(e, ir, icon, mask);
- c->r = r;
- c->image = ddisp;
- c->environ = e;
- D2H(e)->ref++;
- c->contents = (Prefab_Element*)elem;
- pc->display = screen->display;
- gchalt--;
- return pc;
- }
|