#include #include #include "xshmu.h" #include "rpncalc.h" xshmu w; void rpn_setup() { w = xshmu_open("RPN calc", 60, 10, ""); } void rpn_cleanup() { xshmu_close(w); } rpn_key rpn_getch() { for (xshmu_event *ev;;) { for (;;) { ev = xshmu_get_event(w); if (ev) break; xshmu_wait(w); } if (xshmu_as_die_event(ev)) return 0; xshmu_key_event *kev = xshmu_as_key_event(ev); if (kev && kev->down) { if (kev->keysym == 0) return -1; if (kev->keysym == xks_backspace) return '\b'; return kev->keysym; } } } /* XXX C&P from tetris.c plus a few more glyphs */ static void show(xshmu_pic where, char *text) { /* Half-assed fixed-width font format: each byte here contains one 6-bit row of pixels in its 6 least significant bits, ordered with the least significant on the left on the screen. There is an implicit horizontal pixel of spacing between glyphs. */ char *font = "NQQUUQQN" // 0 "DFDDDDDN" // 1 "NQPPHDB_" // 2 "OPHDHPQN" // 3 "@JJI_HHH" // 4 "_AAOPPQN" // 5 "HDBAOQQN" // 6 "_QHDNDDD" // 7 "NQQNQQQN" // 8 "NQQ^PPQN" // 9 "@FF@FF@@" // : "@FF@FFDB" // ; "@@@@FFDB" // , "@@@??@@@" // - "@@@@@LL@" // . "@@@@@@@?" // _ ; uint32_t fg = 0xff33aa, bg = 0x333333; for (char *p = text; *p; p++) { if (*p == ' ') continue; char *glyph = font + (*p & 0xf) * 8; for (int y = 0; y != 8; y++) { for (int x = 0; x != 6; x++) { *xshmu_pix(where, 1 + x + 7 * (p - text), 1 + y) = (glyph[y] & (1 << x)) ? fg : bg; } } } } void rpn_set_screen(const char *numbers, int len) { xshmu_pic fb = xshmu_framebuffer(w); memset(fb.p, 0x33, fb.w*fb.h*4); char buf[64] = {0}; memcpy(buf, numbers, sizeof(buf) - 1 < len ? sizeof(buf) - 1 : len); show(fb, buf); xshmu_flush(w); }