#include "builtins.h" #include "blocktype.h" static int my_w_out = -1; static int my_h_out; static int x_out; static int my_w_disp = -1; static int my_h_disp; static int x_disp; static char priv_dummy; static BLOCKDIMS size_out(BLOCK_SIZE_ARGS) { int w_l; int w_r; int w_out; if (my_w_out < 0) { w_l = widthof("L",1); w_r = widthof("R",1); w_out = widthof("Out",3); my_w_out = ((w_l > w_r) ? w_l : w_r) + w_out + (3 * font_space); x_out = my_w_out - w_out - font_space; my_h_out = 3 * font_baselineskip; } return((BLOCKDIMS){.w=my_w_out,.h=my_h_out}); } static BLOCKDIMS size_disp(BLOCK_SIZE_ARGS) { int w_in; int w_disp; if (my_w_disp < 0) { w_in = widthof("In",2); w_disp = widthof("Disp",4); my_w_disp = w_in + w_disp + (3 * font_space); x_disp = my_w_disp - w_disp - font_space; my_h_disp = 2 * font_baselineskip; } return((BLOCKDIMS){.w=my_w_disp,.h=my_h_disp}); } static void setup(BLOCK_SETUP_ARGS) { (*cont)(&priv_dummy,contarg); } static void destroy(BLOCK_DESTROY_ARGS) { } static void render_out(BLOCK_RENDER_ARGS) { int y; XFillRectangle(disp,d,gc_bg,0,0,my_w_out,my_h_out); XDrawLine(disp,d,gc_fg,0,0,my_w_out-2,0); XDrawLine(disp,d,gc_fg,my_w_out-1,0,my_w_out-1,my_h_out-2); XDrawLine(disp,d,gc_fg,my_w_out-1,my_h_out-1,1,my_h_out-1); XDrawLine(disp,d,gc_fg,0,my_h_out-1,0,1); y = font_baseline + (font_baselineskip / 2); XDrawString(disp,d,gc_fg,font_space,y,"L",1); y += font_baselineskip; XDrawString(disp,d,gc_fg,font_space,y,"R",1); y = font_baseline + font_baselineskip; XDrawString(disp,d,gc_fg,x_out,y,"Out",3); } static void render_disp(BLOCK_RENDER_ARGS) { int y; XFillRectangle(disp,d,gc_bg,0,0,my_w_disp,my_h_disp); XDrawLine(disp,d,gc_fg,0,0,my_w_disp-2,0); XDrawLine(disp,d,gc_fg,my_w_disp-1,0,my_w_disp-1,my_h_disp-2); XDrawLine(disp,d,gc_fg,my_w_disp-1,my_h_disp-1,1,my_h_disp-1); XDrawLine(disp,d,gc_fg,0,my_h_disp-1,0,1); y = font_baseline + (font_baselineskip / 2); XDrawString(disp,d,gc_fg,font_space,y,"In",2); XDrawString(disp,d,gc_fg,x_disp,y,"Disp",4); } static int iny(BLOCK_OUTPUT_Y_ARGS) { return((pin+1)*font_baselineskip); } static const char *ins_out[] = { "L", "R" }; static const char *ins_disp[] = { "In" }; BLOCKTYPE block_output = BLOCKTYPE_I("Output",ins_out,size_out,setup,destroy,render_out,iny); BLOCKTYPE block_display = BLOCKTYPE_I("Display",ins_disp,size_disp,setup,destroy,render_disp,iny);