ref: c04fd4ce67a03c04b342c38185523bb834f4e0b7
dir: /nate_construct.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <event.h> #include "nate_construct.h" typedef struct NCelem NCelem; struct NCelem { Nelem* elem; NCelem* next; }; static NCelem* nc_stack = nil; void nc_init() { nc_stack = nil; } void nc_push(Nelem* nelem) { NCelem *n; if (!nc_stack) { nc_stack = malloc(sizeof(NCelem)); assert(nc_stack); nc_stack->next = nil; nc_stack->elem = nelem; } else { n = malloc(sizeof(NCelem)); assert(n); n->next = nc_stack; n->elem = nelem; nc_stack = n; } } void nc_pop() { if (!nc_stack) return; NCelem *nc = nc_stack; nc_stack = nc->next; free(nc); } Nelem* nc_get() { return nc_stack ? nc_stack->elem : nil; } Nelem* ch_retelem; Rectangle ch_rect; Image* ch_screen; Mouse ch_mouse; void fe_checkhit(Nelem* elem, int) { Rectangle r; Nelem* e; Point s; s = ncallcalcsize(elem, ch_screen); r.min = ch_rect.min; r.max = addpt(r.min, s); if (!ptinrect(ch_mouse.xy, r)) return; e = ncallcheckhit(elem, ch_screen, ch_rect, ch_mouse); if (e) { ch_retelem = e; } } Nelem* nd_checkhit(Nelem* nelem, Image* screen, Rectangle r, Mouse m) { Nlist* l = ncallgetchildren(nelem); if (!l) return nil; ch_retelem = nil; ch_rect = r; ch_screen = screen; ch_mouse = m; lforeach(l, fe_checkhit); return ch_retelem; }