151 lines · 2.9 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h>#include <event.h> enum {	Dwidth = 3,	Dheight = 5}; char Dfont[10][Dwidth*Dheight] = {	{ 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 }, /* 0 */	{ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1 }, /* 1 */	{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 }, /* 2 */	{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 }, /* 3 */	{ 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1 }, /* 4 */	{ 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1 }, /* 5 */	{ 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 }, /* 6 */	{ 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1 }, /* 7 */	{ 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 }, /* 8 */	{ 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 }  /* 9 */}; char* menustr[] = {	"exit",	0}; Menu menu = {	menustr}; int pixelsize = 10;int spacing = 10;Image *bg;Image *fg;Point origin; voiddrawpixel(int x0, int y0, int x, int y){	Point p[4], o; 	o = addpt(Pt(x0, y0), origin);	p[0] = addpt(o, mulpt(Pt(x,   y),   pixelsize));	p[1] = addpt(o, mulpt(Pt(x+1, y),   pixelsize));	p[2] = addpt(o, mulpt(Pt(x+1, y+1), pixelsize));	p[3] = addpt(o, mulpt(Pt(x  , y+1), pixelsize));	fillpoly(screen, p, 4, 1, fg, ZP);} voiddrawdigit(int digit, int x0, int y0){	int i; 	for(i = 0; i < Dwidth*Dheight; i++){		if(Dfont[digit][i])			drawpixel(x0, y0, i%Dwidth, i/Dwidth);	}} voiddrawcolon(int x0){	drawpixel(x0, spacing, 0, 1);	drawpixel(x0, spacing, 0, 3);} intnextcharpos(int x0, int width){	return x0 + width*pixelsize + spacing;} voidshowtime(void){	Tm* tm;	int x; 	tm = localtime(time(0));	draw(screen, screen->r, bg, nil, ZP);	x = nextcharpos(0, 0);	drawdigit(tm->hour/10, x, spacing);	x = nextcharpos(x, Dwidth);	drawdigit(tm->hour%10, x, spacing);	x = nextcharpos(x, Dwidth);	drawcolon(x);	x = nextcharpos(x, 1);	drawdigit(tm->min/10, x, spacing);	x = nextcharpos(x, Dwidth);	drawdigit(tm->min%10, x, spacing);} voideresized(int new){	int w, h; 	if(new && getwindow(display, Refnone) < 0)		sysfatal("cannot reattach to window: %r");	w = (4*Dwidth+1)*pixelsize+6*spacing;	h = Dheight*pixelsize+2*spacing;	origin = screen->r.min;	origin.x += (Dx(screen->r)-w)/2;	origin.y += (Dy(screen->r)-h)/2;	showtime();} voidusage(void){	fprint(2, "Usage: %s [-sspacing] [-ppixelsize]\n", argv0);	exits("usage");} voidmain(int argc, char** argv){	Event ev;	int e, timer; 	ARGBEGIN {	case 's':		spacing = atoi(EARGF(usage()));		break;	case 'p':		pixelsize = atoi(EARGF(usage()));		break;	default:		usage();	} ARGEND	if(initdraw(nil, nil, "clock") < 0)		sysfatal("initdraw: %r");	fg = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x55AAAAFF);	bg = allocimagemix(display, DPalebluegreen, DWhite);	einit(Emouse);	timer = etimer(0, 15*1000);	eresized(0);	for(;;){		e = event(&ev);		if(e == Emouse){			if((ev.mouse.buttons == 4)			&& (emenuhit(3, &ev.mouse, &menu) == 0))				exits(nil);		}else if(e == timer){			showtime();		}	}}