#include #include "builtins.h" #include "blocktype.h" static int my_w = -1; static int my_h; static int x_name; static int x_out; static char priv_dummy; static BLOCKDIMS size(BLOCK_SIZE_ARGS) { int wi; int wo; int wt; int wn; if (my_w < 0) { wi = widthof("A",1); wt = widthof("+",1); if (wt > wi) wi = wt; wt = widthof("-",1); if (wt > wi) wi = wt; wt = widthof("B",1); if (wt > wi) wi = wt; wo = widthof("A+B-",4); wt = widthof("B+A-",4); if (wt > wo) wo = wt; wn = widthof("Select",6); my_w = wi + wn + wo + (4 * font_space); x_out = my_w - wo - font_space; x_name = font_space + wi + font_space; my_h = 5 * font_baselineskip; } return((BLOCKDIMS){.w=my_w,.h=my_h}); } static void setup(BLOCK_SETUP_ARGS) { (*cont)(&priv_dummy,contarg); } static void resetup(BLOCK_RESETUP_ARGS) { (*cont)(contarg,1); } static void destroy(BLOCK_DESTROY_ARGS) { } static void render(BLOCK_RENDER_ARGS) { int y; XFillRectangle(disp,d,gc_bg,0,0,my_w,my_h); XDrawLine(disp,d,gc_fg,0,0,my_w-2,0); XDrawLine(disp,d,gc_fg,my_w-1,0,my_w-1,my_h-2); XDrawLine(disp,d,gc_fg,my_w-1,my_h-1,1,my_h-1); XDrawLine(disp,d,gc_fg,0,my_h-1,0,1); y = font_baseline + (font_baselineskip / 2); XDrawString(disp,d,gc_fg,font_space,y,"A",1); y += font_baselineskip; XDrawString(disp,d,gc_fg,font_space,y,"+",1); XDrawString(disp,d,gc_fg,x_out,y,"A+B-",4); y += font_baselineskip; XDrawString(disp,d,gc_fg,font_space,y,"-",1); XDrawString(disp,d,gc_fg,x_out,y,"B+A-",4); y += font_baselineskip; XDrawString(disp,d,gc_fg,font_space,y,"B",1); y = font_baseline + (font_baselineskip * 2); XDrawString(disp,d,gc_fg,x_name,y,"Select",6); } static int iny(BLOCK_INPUT_Y_ARGS) { return((pin+1)*font_baselineskip); } static int outy(BLOCK_INPUT_Y_ARGS) { return((pin+2)*font_baselineskip); } static void rinit(BLOCK_RUN_INIT_ARGS) { } static void rstep(BLOCK_RUN_STEP_ARGS) { } static double out(BLOCK_RUN_OUT_ARGS) { if (ins[1] > ins[2]) { return(ins[out?3:0]); } else { return(ins[out?0:3]); } } static const char *ins[] = { "A", "+", "-", "B" }; static const char *outs[] = { "A+, B-", "B+, A-" }; BLOCKTYPE block_select = BLOCKTYPE_I_O("Select",ins,outs,size,setup,resetup,destroy,render,iny,outy,rinit,rstep,out);