192 lines · 2.7 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h>#include <thread.h>#include <draw.h>#include <mouse.h>#include <frame.h>#include "dat.h"#include "fns.h" extern Mousectl *mc; static voiddopal(int, char **argv){	Pal *p;		p = findpal("", argv[1], 2);	if(p == nil){		cmdprint("?%r\n");		p = newpal(argv[1]);		palsize(p, 8, 0);	}	if(newwinsel(PAL, mc, p) == nil){		if(p->ref == 0)			putfil(p);		return;	}} static voiddosize(int, char **argv){	char *p;	int n, m; 	if(actf == nil)		goto err;	switch(actf->type){	case PAL:		n = strtol(argv[1], &p, 0);		if(*p != 0 || n < 0)			goto err;		palsize((Pal *) actf->f, n, 1);		return;	case SPR:		n = strtol(argv[1], &p, 0);		if(*p != '*' || n < 0)			goto err;		m = strtol(++p, &p, 0);		if(*p != 0 || m < 0)			goto err;		sprsize((Spr *) actf->f, n, m, 1);		return;	}err:	cmdprint("?\n");} static voiddoset(int, char **argv){	int n;	char *p;	Pal *q; 	if(actf == nil)		goto err;	switch(actf->type){	case PAL:		n = strtol(argv[1], &p, 0);		if(*p != 0 || n < 0 || n > 0xffffff)			goto err;		q = (Pal *) actf->f;		palset(q, q->sel, n);		return;	}err:	cmdprint("?\n");} static voiddozoom(int, char **argv){	int n;	char *p;		if(actf == nil)		goto err;	n = strtol(argv[1], &p, 0);	if(*p != 0 || n <= 0)		goto err;	actf->zoom = n;	actf->tab->draw(actf);	return;err:	cmdprint("?\n");} static voiddospr(int, char **argv){	Win *w;	Spr *s;	Biobuf *bp;		s = newspr(argv[1]);	bp = Bopen(argv[1], OREAD);	if(bp == nil){		cmdprint("?%r\n");		sprsize(s, 8, 8, 0);	}else{		if(readspr(s, bp) < 0){			cmdprint("?%r\n");			sprsize(s, 8, 8, 0);		}		Bterm(bp);	}	w = newwinsel(SPR, mc, s);	if(w == nil){		putfil(s);		return;	}	if(s->palfile != nil){		s->pal = findpal(argv[1], s->palfile, 1);		if(s->pal == nil)			cmdprint("?palette: %r\n");		else{			incref(s->pal);			w->tab->draw(w);		}	}} static voiddowrite(int argc, char **argv){	char *f;		if(argc > 2)		cmdprint("?\n");	if(argc == 2)		f = argv[1];	else		f = nil;	if(actf == nil)		cmdprint("?\n");	winwrite(actf, f);} static voiddoquit(int, char **){	if(quit() < 0)		threadexitsall(nil);} static struct cmd {	char *name;	int argc;	void (*f)(int, char **);} cmds[] = {	{"pal", 2, dopal},	{"size", 2, dosize},	{"set", 2, doset},	{"spr", 2, dospr},	{"w", 0, dowrite},	{"q", 1, doquit},	{"zoom", 2, dozoom},	{nil, nil}}; voiddocmd(char *s){	char *t[32];	int nt;	struct cmd *c; 	nt = tokenize(s, t, nelem(t));	if(nt == 0)		return;	for(c = cmds; c->name != 0; c++)		if(strcmp(t[0], c->name) == 0){			if(c->argc != 0 && c->argc != nt)				cmdprint("?\n");			else				c->f(nt, t);			return;		}	cmdprint("?\n");}