1*37da2899SCharles.Forsythimplement Volumectl; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsythsys: Sys; 5*37da2899SCharles.Forsythsprint: import sys; 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsythinclude "draw.m"; 8*37da2899SCharles.Forsythdraw: Draw; 9*37da2899SCharles.ForsythContext, Display, Font, Rect, Point, Image, Screen, Pointer: import draw; 10*37da2899SCharles.Forsyth 11*37da2899SCharles.Forsythinclude "prefab.m"; 12*37da2899SCharles.Forsythprefab: Prefab; 13*37da2899SCharles.ForsythStyle, Element, Compound, Environ: import prefab; 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsythinclude "muxclient.m"; 16*37da2899SCharles.Forsythinclude "volume.m"; 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsythinclude "bufio.m"; 19*37da2899SCharles.Forsythbufio: Bufio; 20*37da2899SCharles.ForsythIobuf: import bufio; 21*37da2899SCharles.Forsyth 22*37da2899SCharles.Forsythinclude "ir.m"; 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsythscreen: ref Screen; 25*37da2899SCharles.Forsythdisplay: ref Display; 26*37da2899SCharles.Forsythwindows: array of ref Image; 27*37da2899SCharles.Forsythenv: ref Environ; 28*37da2899SCharles.Forsythzr := ((0,0),(0,0)); 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsythel, et: ref Element; 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsythstyle: ref Style; 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsythc: ref Compound; 35*37da2899SCharles.Forsyth 36*37da2899SCharles.Forsythtics: int; 37*37da2899SCharles.ForsythINTERVAL: con 500; 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsythvalue: int; 40*37da2899SCharles.Forsyth 41*37da2899SCharles.Forsythones, white, red: ref Image; 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsythvolumectl(ctxt: ref Context, ch: chan of int, var: string) 44*37da2899SCharles.Forsyth{ 45*37da2899SCharles.Forsyth key: int; 46*37da2899SCharles.Forsyth 47*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 48*37da2899SCharles.Forsyth draw = load Draw Draw->PATH; 49*37da2899SCharles.Forsyth prefab = load Prefab Prefab->PATH; 50*37da2899SCharles.Forsyth if ((bufio = load Bufio Bufio->PATH) == nil) { 51*37da2899SCharles.Forsyth sys->print("Audioctl: Can't load bufio\n"); 52*37da2899SCharles.Forsyth exit; 53*37da2899SCharles.Forsyth } 54*37da2899SCharles.Forsyth 55*37da2899SCharles.Forsyth if ((ac := bufio->open("/dev/volume", bufio->ORDWR)) == nil) { 56*37da2899SCharles.Forsyth sys->print("Audioctl: Can't open /dev/volume: %r\n"); 57*37da2899SCharles.Forsyth exit; 58*37da2899SCharles.Forsyth } 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsyth screen = ctxt.screen; 61*37da2899SCharles.Forsyth display = ctxt.display; 62*37da2899SCharles.Forsyth windows = array[1] of ref Image; 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsyth ones = display.opaque; 65*37da2899SCharles.Forsyth white = display.color(draw->White); 66*37da2899SCharles.Forsyth red = display.color(draw->Red); 67*37da2899SCharles.Forsyth 68*37da2899SCharles.Forsyth textfont := Font.open(display, "*default*"); 69*37da2899SCharles.Forsyth 70*37da2899SCharles.Forsyth style = ref Style( 71*37da2899SCharles.Forsyth textfont, # titlefont 72*37da2899SCharles.Forsyth textfont, # textfont 73*37da2899SCharles.Forsyth display.color(draw->White), # elemcolor 74*37da2899SCharles.Forsyth display.color(draw->Black), # edgecolor 75*37da2899SCharles.Forsyth display.color(draw->Yellow), # titlecolor 76*37da2899SCharles.Forsyth display.color(draw->Black), # textcolor 77*37da2899SCharles.Forsyth display.color(130)); # highlightcolor 78*37da2899SCharles.Forsyth 79*37da2899SCharles.Forsyth env = ref Environ (ctxt.screen, style); 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth slavectl := chan of int; 82*37da2899SCharles.Forsyth spawn timerslave(slavectl); 83*37da2899SCharles.Forsyth 84*37da2899SCharles.Forsyth while ((s := ac.gets('\n')) != nil) { 85*37da2899SCharles.Forsyth sp := -1; 86*37da2899SCharles.Forsyth for (i := 0; i < len s; i++) if (s[i] == ' ') sp = i; 87*37da2899SCharles.Forsyth if (sp <= 1) { 88*37da2899SCharles.Forsyth sys->print("Volume: /dev/volume bad:\n%s\n", s); 89*37da2899SCharles.Forsyth exit; 90*37da2899SCharles.Forsyth } 91*37da2899SCharles.Forsyth if (var == s[0:sp]) { 92*37da2899SCharles.Forsyth value = int s[sp+1:]; 93*37da2899SCharles.Forsyth } 94*37da2899SCharles.Forsyth } 95*37da2899SCharles.Forsyth 96*37da2899SCharles.Forsyth for(;;) { 97*37da2899SCharles.Forsyth key = <- ch; 98*37da2899SCharles.Forsyth case key { 99*37da2899SCharles.Forsyth Ir->Enter => 100*37da2899SCharles.Forsyth slavectl <-= Muxclient->AMexit; 101*37da2899SCharles.Forsyth return; 102*37da2899SCharles.Forsyth Ir->VolUP => 103*37da2899SCharles.Forsyth if (value++ >= 100) value = 100; 104*37da2899SCharles.Forsyth ac.puts(sprint("%s %d\n", var, value)); 105*37da2899SCharles.Forsyth displayslider(); 106*37da2899SCharles.Forsyth Ir->VolDN => 107*37da2899SCharles.Forsyth if (value-- <= 0) value = 0; 108*37da2899SCharles.Forsyth ac.puts(sprint("%s %d\n", var, value)); 109*37da2899SCharles.Forsyth displayslider(); 110*37da2899SCharles.Forsyth } 111*37da2899SCharles.Forsyth } 112*37da2899SCharles.Forsyth} 113*37da2899SCharles.Forsyth 114*37da2899SCharles.Forsythslider(): ref Element 115*37da2899SCharles.Forsyth{ 116*37da2899SCharles.Forsyth r: Rect; 117*37da2899SCharles.Forsyth 118*37da2899SCharles.Forsyth r = ((0,0),(200,20)); 119*37da2899SCharles.Forsyth chans := display.image.chans; 120*37da2899SCharles.Forsyth icon := display.newimage(r.inset(-2), chans, 0, draw->Black); 121*37da2899SCharles.Forsyth icon.draw(r, white, ones, (0,0)); 122*37da2899SCharles.Forsyth rr := r; 123*37da2899SCharles.Forsyth rr.max.x = 2*value; 124*37da2899SCharles.Forsyth icon.draw(rr, red, ones, (0,0)); 125*37da2899SCharles.Forsyth return Element.icon(env, zr, icon, ones); 126*37da2899SCharles.Forsyth} 127*37da2899SCharles.Forsyth 128*37da2899SCharles.Forsythdisplayslider() 129*37da2899SCharles.Forsyth{ 130*37da2899SCharles.Forsyth if (et == nil) { 131*37da2899SCharles.Forsyth et = Element.text(env, "Volume", zr, Prefab->EText); 132*37da2899SCharles.Forsyth el = slider(); 133*37da2899SCharles.Forsyth } 134*37da2899SCharles.Forsyth 135*37da2899SCharles.Forsyth img := el.image; 136*37da2899SCharles.Forsyth r: Rect = ((0,0),(200,20)); 137*37da2899SCharles.Forsyth img.draw(r, white, nil, (0,0)); 138*37da2899SCharles.Forsyth r.max.x = 2*value; 139*37da2899SCharles.Forsyth img.draw(r, red, nil, (0,0)); 140*37da2899SCharles.Forsyth 141*37da2899SCharles.Forsyth if (c == nil) { 142*37da2899SCharles.Forsyth c = Compound.box(env, Point(100, 100), et, el); 143*37da2899SCharles.Forsyth windows[0] = c.image; 144*37da2899SCharles.Forsyth } 145*37da2899SCharles.Forsyth c.draw(); 146*37da2899SCharles.Forsyth screen.top(windows); 147*37da2899SCharles.Forsyth tics = 5; 148*37da2899SCharles.Forsyth} 149*37da2899SCharles.Forsyth 150*37da2899SCharles.Forsythtimerslave(ctl: chan of int) 151*37da2899SCharles.Forsyth{ 152*37da2899SCharles.Forsyth m: int; 153*37da2899SCharles.Forsyth 154*37da2899SCharles.Forsyth for(;;) { 155*37da2899SCharles.Forsyth sys->sleep(INTERVAL); 156*37da2899SCharles.Forsyth if (tics-- <= 0) { 157*37da2899SCharles.Forsyth tics = 0; 158*37da2899SCharles.Forsyth c = nil; 159*37da2899SCharles.Forsyth el = nil; 160*37da2899SCharles.Forsyth et = nil; 161*37da2899SCharles.Forsyth windows[0] = nil; 162*37da2899SCharles.Forsyth } 163*37da2899SCharles.Forsyth 164*37da2899SCharles.Forsyth alt{ 165*37da2899SCharles.Forsyth m = <-ctl => 166*37da2899SCharles.Forsyth return; 167*37da2899SCharles.Forsyth * => 168*37da2899SCharles.Forsyth continue; 169*37da2899SCharles.Forsyth } 170*37da2899SCharles.Forsyth } 171*37da2899SCharles.Forsyth} 172