ref: 228a7b0eeda3531eb0bf0efa2211e4532af69681
dir: /n_window.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <event.h> #include "nate_construct.h" #include "n_window.h" #define N_TYPE NWindow_Type char* NWindow_Type = "NWindow"; Rectangle wcalcsize(Nelem* nelem, Image* screen, Rectangle r) { Nelem *f; NWindow *w = (NWindow*)nelem; GUARD(w); f = lgetfirst(&w->child); if (f) ncallcalcsize(f, screen, screen->r); nelem->r = r; return screen->r; } static void wdraw(Nelem* nelem, Image* img) { Nelem *f; NWindow *w = (NWindow*)nelem; GUARD(w); f = lgetfirst(&w->child); if (f) ncalldraw(f, img); } void wfree(Nelem* nelem) { Nelem* f; NWindow* w = (NWindow*)nelem; if (nisroot(w)) return; if ((f = lgetfirst(&w->child))) ncallfree(f); free(w); } Nlist* wgetchildren(Nelem* nelem) { NWindow* w = (NWindow*)nelem; GUARD(w); return &w->child; } static Nelemfunctions Nwindowfunctions = { .calcsize = wcalcsize, .draw = wdraw, .checkhit = nd_checkhit, .hit = nil, .free = wfree, .getchildren = wgetchildren, }; NWindow* slot(Nelem* child) { if (child == nc_get()) { nc_pop(); } NWindow* w = (NWindow*)nc_get(); GUARD(w); // old child is potential leak! lsetfirst(&w->child, child); return w; } NWindow* makeroot(void) { NWindow* w = (NWindow*)nc_get(); GUARD(w); nregroot(w); return w; } NWindow* New_Window(char *name) { NWindow *e = MakeNelem(NWindow, NWindow_Type, &Nwindowfunctions, name); e->Slot = slot; e->MakeRoot = makeroot; linit(&e->child); nc_push(e); return e; }