plan9fox/libpanel/mem.c
xfnw 856abd2f7d Squashed 'sys/src/cmd/gopher/' content from commit 3680728b6
git-subtree-dir: sys/src/cmd/gopher
git-subtree-split: 3680728b631ed65201b397f4ae3e5d1b03be42f9
2022-07-01 15:46:23 -04:00

123 lines
2.4 KiB
C

#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
#include <panel.h>
#include "pldefs.h"
void *pl_emalloc(int n){
void *v;
v=mallocz(n, 1);
if(v==0){
fprint(2, "Can't malloc!\n");
exits("no mem");
}
setmalloctag(v, getcallerpc(&n));
return v;
}
void *pl_erealloc(void *v, int n)
{
v=realloc(v, n);
if(v==0){
fprint(2, "Can't realloc!\n");
exits("no mem");
}
setrealloctag(v, getcallerpc(&v));
return v;
}
void pl_unexpected(Panel *g, char *rou){
fprint(2, "%s called unexpectedly (%s %#p)\n", rou, g->kind, g);
abort();
}
void pl_drawerror(Panel *g){
pl_unexpected(g, "draw");
}
int pl_hiterror(Panel *g, Mouse *m){
USED(m);
pl_unexpected(g, "hit");
return 0;
}
void pl_typeerror(Panel *g, Rune c){
USED(c);
pl_unexpected(g, "type");
}
Point pl_getsizeerror(Panel *g, Point childsize){
pl_unexpected(g, "getsize");
return childsize;
}
void pl_childspaceerror(Panel *g, Point *ul, Point *size){
USED(ul, size);
pl_unexpected(g, "childspace");
}
void pl_scrollerror(Panel *g, int dir, int button, int num, int den){
USED(dir, button, num, den);
pl_unexpected(g, "scroll");
}
void pl_setscrollbarerror(Panel *g, int top, int bot, int den){
USED(top, bot, den);
pl_unexpected(g, "setscrollbar");
}
int pl_prinormal(Panel *, Point){
return PRI_NORMAL;
}
Panel *pl_newpanel(Panel *parent, int ndata){
Panel *v;
if(parent && parent->flags&LEAF){
fprint(2, "newpanel: can't create child of %s %#p\n", parent->kind, parent);
exits("bad newpanel");
}
v=pl_emalloc(sizeof(Panel));
v->r=Rect(0,0,0,0);
v->flags=0;
v->ipad=Pt(0,0);
v->pad=Pt(0,0);
v->size=Pt(0,0);
v->sizereq=Pt(0,0);
v->lastmouse=0;
v->next=0;
v->child=0;
v->echild=0;
v->b=0;
v->pri=pl_prinormal;
v->scrollee=0;
v->xscroller=0;
v->yscroller=0;
v->parent=parent;
v->scr.pos=Pt(0,0);
v->scr.size=Pt(0,0);
if(parent){
if(parent->child==0)
parent->child=v;
else
parent->echild->next=v;
parent->echild=v;
}
v->draw=pl_drawerror;
v->hit=pl_hiterror;
v->type=pl_typeerror;
v->getsize=pl_getsizeerror;
v->childspace=pl_childspaceerror;
v->scroll=pl_scrollerror;
v->setscrollbar=pl_setscrollbarerror;
v->free=0;
v->snarf=0;
v->paste=0;
if(ndata)
v->data=pl_emalloc(ndata);
else
v->data=0;
return v;
}
void plfree(Panel *p){
Panel *cp, *ncp;
if(p==0)
return;
if(p==plkbfocus)
plkbfocus=0;
for(cp=p->child;cp;cp=ncp){
ncp=cp->next;
plfree(cp);
}
if(p->free) p->free(p);
if(p->data) free(p->data);
free(p);
}