#include #include #include #include #include "wordwrap.h" /* TODO: * Allow setting the font. * Allow setting background and text color. * Make tabs bigger. */ Image *background; Font *textfont; char* textfontname; char* message; void usage(void) { fprint(2, "usage: %s\n", argv0); exits("usage"); } void init(void) { if(initdraw(nil, nil, argv0) < 0) { fprint(2, "%s: initdraw failed: %r\n", argv0); exits("initdraw"); } background = allocimagemix(display, DBlack, 0x443344FF); if(background==nil) { fprint(2, "%s: can't create images: %r\n", argv0); exits("image"); } textfont = openfont(display, textfontname); if(textfont == nil) { fprint(2, "%s: openfont %s failed: %r\n", argv0, textfontname); exits("openfont"); } } void drawmesg() { int margin; Point insert; margin = 40; draw(screen, screen->r, background, nil, ZP); insert = addpt(Pt(margin, margin), screen->r.min); insert = wordwrap(message, textfont, insert, margin); flushimage(display, 1); } void eresized(int new) { if(new && getwindow(display, Refmesg) < 0) fprint(2,"can't reattach to window"); draw(screen, screen->r, background, nil, ZP); drawmesg(); flushimage(display, 1); } char* escape(char* in) { char *out, c, next; int inp, outp; inp = outp = 0; out = malloc(strlen(in)); while (c = in[inp++]) { switch(c) { case '\\': next = in[inp++]; switch(next) { case 'n': c = '\n'; break; default: out[outp++] = '\\'; c = next; } break; // case '<': // break; } out[outp++] = c; } return out; } void main(int argc, char *argv[]) { char buf[8192]; long n; Event e; textfontname = "/lib/font/bit/lucida/unicode.32.font"; if ((strcmp(getenv("service"), "unix") == 0) || strcmp(getenv("service"), "") == 0) textfontname = "/mnt/font/Cochin/48a/font"; ARGBEGIN { case 'f': textfontname = EARGF(usage()); break; default: usage(); } ARGEND init(); n = readn(0, buf, (long)sizeof buf); buf[n-1] = '\0'; message = escape(buf); /* We don't need mouse events, but resize events are sent over /dev/mouse, */ /* so we won't see them unless we ask for mouse events somehow. */ einit(Ekeyboard|Emouse); for (;;) { drawmesg(); switch(eread(Ekeyboard, &e)) { case Ekeyboard: if(e.kbdc==0x7F || e.kbdc=='q') exits(0); break; } } }