henesyinit from lsubb0c8bdb6 years agoHistory
231 lines · 3.5 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <thread.h>#include <omero.h>#include <error.h>#include <b.h> typedef struct Scr Scr;  enum {	Nscr = 10,}; struct Scr {	char*	name;	char*	addr;	Panel*	g;}; Panel*	gcol;Scr	scr[Nscr];int	nscr;char*	current;int	refresh; Scr	adds[Nscr];int	nadds; voidinit(int nsc, char* sc[]){	int	i, j;	char*	e;	char*	p; 	for(i = 0; i < nscr; i++){		if (scr[i].name == nil)			break;		free(scr[i].name);		free(scr[i].addr);		scr[i].name = nil;		scr[i].addr = nil;	}	if (nsc > Nscr){		nsc = Nscr;		fprint(2, "screen: Nscr overflow\n");	}	for(i=0; i<nsc; i++){		if (e = strchr(sc[i], '='))			*e++ = 0;		scr[i].name = estrdup(sc[i]);		if (e){			scr[i].addr = estrdup(e);			p = strstr(scr[i].addr, "mouse");			if (p)				strcpy(p, "11000");		}	}	nscr = nsc;	for (i = 0; i < nadds; i++){		for(j = 0; j < nscr; j++)			if (scr[j].name && !strcmp(scr[j].name, adds[i].name)){				free(scr[j].addr);				scr[j].addr = estrdup(adds[i].addr);				break;			}		if (j == nscr){			scr[nscr].name = estrdup(adds[i].name);			scr[nscr].addr = estrdup(adds[i].addr);			nscr++;		}	}} voidupdate(void){	char	out[200];	char*	sc[Nscr];	int	nsc, n; 	n = tcmdoutput("/bin/env/terms -m", out, sizeof(out)-1);	if (n < 0)		return;	out[n] = 0;	nsc = tokenize(out, sc, nelem(sc));	init(nsc, sc);} intsetscr(char *name){	int fd; 	if((fd = open("/dev/mousectl", OWRITE)) < 0){		fprint(2, "cannot open /dev/mousectl: %r");		return -1;	}	fprint(fd, "call %s\n", name);	close(fd);	return 0;} intsetkbd(char *name){	int fd; 	if((fd = open("/dev/kbdctl", OWRITE)) < 0){		fprint(2, "cannot open /dev/kbdctl: %r");		return -1;	}	fprint(fd, "call %s\n", name);	close(fd);	return 0;} voidupdateui(void){	int	i;	char	nm[40]; 	for (i = 0; i < Nscr; i++){		if (scr[i].name){			if (!scr[i].g){				seprint(nm, nm+40, "label:m%d", i);				scr[i].g = createsubpanel(gcol, nm);			}			if (scr[i].g == nil)				continue;			openpanel(scr[i].g, OWRITE|OTRUNC);			writepanel(scr[i].g, scr[i].name, strlen(scr[i].name));			closepanel(scr[i].g);		} else if (scr[i].g){			removepanel(scr[i].g);			scr[i].g = nil;		}	}} voidclick(int i){	char*	ld;	char	old; 	free(current);	current = estrdup(scr[i].name);	if (scr[i].addr){		setscr(scr[i].addr);		ld = scr[i].addr + strlen(scr[i].addr) - 1;		old = *ld;		*ld = old + 1;		setkbd(scr[i].addr);		*ld = old;	} else		setscr(scr[i].name);	openpanelctl(gcol);	panelctl(gcol, "hold");	if (refresh)		update();	updateui();	closepanelctl(gcol);} voidusage(void){	fprint(2, "usage: %s [-a machine=addr] [machine...]\n", argv0);	exits("usage");} intomerogone(void){	sysfatal("terminated");	return 0;} voidthreadmain(int argc, char **argv){	Oev	e;	char	dir[80];	Channel*	c;	int	i;	char*	p; 	ARGBEGIN{	case 'a':		strecpy(dir, dir+sizeof(dir), EARGF(usage()));		p = strchr(dir, '=');		if (!p)			usage();		*p++ = 0;		adds[nadds].name = strdup(dir);		adds[nadds++].addr = strdup(p);		break;	default:		usage();	}ARGEND;	if (argc != 0)		init(argc, argv);	else {		update();		refresh = 1;	}	current = estrdup(sysname());	c = omeroeventchan(nil);	gcol = createpanel("oscreen", "row",  nil);	if (gcol == nil)		sysfatal("createpanel: %r\n");	updateui();	closepanelctl(gcol);	while(recv(c, &e) != -1){		if (!strcmp(e.ev, "exit")){			threadexitsall(nil);		} else if (!strcmp(e.ev, "look") || !strcmp(e.ev, "exec")){			for (i = 0; i < nscr; i++)				if (e.panel == scr[i].g){					click(i);					break;				}		}		clearoev(&e);	}	threadexitsall(nil);}