#include #include #include #include Font *defont; Point cp; int height; char *str; char **fonts; int index; void main(int argc, char *argv[]) { Event e; if (argc < 3) { fprint(2, "usage: fontshow string font...\n"); exits("usage"); } if (initdraw(nil, nil, "fontshow") < 0) { fprint(2, "initdraw failed: %r\n"); exits("initdraw"); } einit(Emouse|Ekeyboard); defont = display->defaultfont; str = argv[1]; fonts = argv + 2; index = 0; eresized(0); for (;;) { switch(event(&e)){ case Ekeyboard: switch(e.kbdc){ case 'q': case '\04': exits(nil); case ' ': if (fonts[index] == nil) exits(nil); eresized(0); } break; case Emouse: if(e.mouse.buttons){ } break; } } exits(nil); } void fontprint(Font *f, char *s) { Point p; p = string(screen, cp, display->black, (Point){0, 0}, f, s); cp = p; if (f->height > height) height = f->height; } void nl(void) { cp.x = screen->r.min.x; cp.y += height; height = 0; } void redraw(Image *screen) { char *s; int i; Font *f; char buf[128]; cp = screen->r.min; height = 0; draw(screen, screen->r, display->white, display->opaque, (Point){0, 0}); for (; fonts[index]; index++) { f = openfont(display, fonts[index]); if (f->height + cp.y > screen->r.max.y) break; fontprint(defont, fonts[index]); fontprint(defont, ": "); if (f == 0) { sprint(buf, "cannot open: %r"); fontprint(defont, buf); nl(); } else { fontprint(f, str); nl(); } } } void eresized(int new) { if(new && getwindow(display, Refnone) < 0){ fprint(2, "can't reattach to window: %r\n"); exits("attach"); } if (new) index = 0; redraw(screen); }