Charles.Forsyth20080122-2200d1341b018 years agoHistory
171 lines · 3.1 KB · Brainfuck
RawDownload
implement Volumectl; include "sys.m";sys: Sys;sprint: import sys; include "draw.m";draw: Draw;Context, Display, Font, Rect, Point, Image, Screen, Pointer: import draw; include "prefab.m";prefab: Prefab;Style, Element, Compound, Environ: import prefab; include "muxclient.m";include "volume.m"; include "bufio.m";bufio: Bufio;Iobuf: import bufio; include "ir.m"; screen: ref Screen;display: ref Display;windows: array of ref Image;env: ref Environ;zr := ((0,0),(0,0)); el, et: ref Element; style: ref Style; c: ref Compound; tics: int;INTERVAL: con 500; value: int; ones, white, red: ref Image; volumectl(ctxt: ref Context, ch: chan of int, var: string){	key: int; 	sys = load Sys Sys->PATH;	draw = load Draw Draw->PATH;	prefab = load Prefab Prefab->PATH;	if ((bufio = load Bufio Bufio->PATH) == nil) {		sys->print("Audioctl: Can't load bufio\n");		exit;	} 	if ((ac := bufio->open("/dev/volume", bufio->ORDWR)) == nil) {		sys->print("Audioctl: Can't open /dev/volume: %r\n");		exit;	} 	screen = ctxt.screen;	display = ctxt.display;	windows = array[1] of ref Image; 	ones = display.opaque;	white = display.color(draw->White);	red = display.color(draw->Red); 	textfont := Font.open(display, "*default*"); 	style = ref Style(			textfont,			# titlefont			textfont,			# textfont			display.color(draw->White),	# elemcolor			display.color(draw->Black),	# edgecolor			display.color(draw->Yellow),	# titlecolor				display.color(draw->Black),	# textcolor			display.color(130));		# highlightcolor 	env = ref Environ (ctxt.screen, style); 	slavectl := chan of int;	spawn timerslave(slavectl); 	while ((s := ac.gets('\n')) != nil) {		sp := -1;		for (i := 0; i < len s; i++) if (s[i] == ' ') sp = i;		if (sp <= 1) {			sys->print("Volume: /dev/volume bad:\n%s\n", s);			exit;		}		if (var == s[0:sp]) {			value = int s[sp+1:];		}	} 	for(;;) {		key = <- ch;		case key {		Ir->Enter =>			slavectl <-= Muxclient->AMexit;			return;		Ir->VolUP =>			if (value++ >= 100) value = 100;			ac.puts(sprint("%s %d\n", var, value));			displayslider();		Ir->VolDN =>			if (value-- <= 0) value = 0;			ac.puts(sprint("%s %d\n", var, value));			displayslider();		}	}} slider(): ref Element{	r: Rect; 	r = ((0,0),(200,20));	chans := display.image.chans;	icon := display.newimage(r.inset(-2), chans, 0, draw->Black);	icon.draw(r, white, ones, (0,0));	rr := r;	rr.max.x = 2*value;	icon.draw(rr, red, ones, (0,0));	return Element.icon(env, zr, icon, ones);} displayslider(){	if (et == nil) {		et = Element.text(env, "Volume", zr, Prefab->EText);		el = slider();	} 	img := el.image;	r: Rect = ((0,0),(200,20));	img.draw(r, white, nil, (0,0));	r.max.x = 2*value;	img.draw(r, red, nil, (0,0)); 	if (c == nil) {		c = Compound.box(env, Point(100, 100), et, el);		windows[0] = c.image;	}	c.draw();	screen.top(windows);	tics = 5;} timerslave(ctl: chan of int){	m: int; 	for(;;) {		sys->sleep(INTERVAL);		if (tics-- <= 0) {			tics = 0;			c = nil;			el = nil;			et = nil;			windows[0] = nil;		} 		alt{		m = <-ctl =>			return;		* =>			continue;		}	}}