ref: 0fdd9b51c7c4ada3a441c3a7baa58be31e24a22c
parent: 4d0493cc927121ae117b0e3c5e5179902a134d37
author: qwx <[email protected]>
date: Tue Mar 26 22:04:53 EDT 2024
no, remove volctl, sorry volctl, you're fired
--- a/volctl.c
+++ /dev/null
@@ -1,308 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <draw.h>
-#include <event.h>
-
-// volctl.c: simple volume control for /dev/volume, using our shatup /dev/theme
-
-char *progname = "volctl";
-
-char *vf;
-int vfd;
-
-Font *font;
-
-// if set, write extra stuff to stderr
-int debug;
-
-enum {
- Mono,
- Stereo,
-};
-
-typedef struct Volume Volume;
-struct Volume {
- char *name;
- int type;
- int llevel;
- int rlevel;
- Rectangle r;
-};
-
-Volume *voltab;
-int Nvolume;
-
-#pragma varargck type "V" Volume*
-static int
-volfmt(Fmt *fmt)
-{
- Volume *v;
- v = va_arg(fmt->args, Volume*);
-
- if(v->type == Stereo)
- return fmtprint(fmt, "%s %d %d", v->name, v->llevel, v->rlevel);
-
- return fmtprint(fmt, "%s %d", v->name, v->llevel);
-}
-
-void
-getvol(void)
-{
- char buf[256];
- char *line[32], *elem[3];
- int i, l, n;
- Volume *v;
-
- // read volume file
- seek(vfd, 0, 0);
- if((n = read(vfd, buf, sizeof buf)) <= 0) {
- fprint(2, "cannot read volume file: %r\n");
- exits("read");
- }
-
- if(n >= sizeof buf)
- n = sizeof(buf)-1;
- buf[n] = 0;
-
- // break volume lines into fields
- n = getfields(buf, line, nelem(line), 1, "\n");
-
- voltab = calloc(n, sizeof(struct Volume));
-
- // fill each Volume struct
- for(i=0; i<n; i++) {
- v = voltab+Nvolume;
- l = tokenize(line[i], elem, nelem(elem));
-
- v->name = strdup(elem[0]);
-
- switch(l) {
- case 2:
- v->type = Mono;
- v->llevel = v->rlevel = atoi(elem[1]);
- break;
- case 3:
- v->type = Stereo;
- v->llevel = atoi(elem[1]);
- v->rlevel = atoi(elem[2]);
- break;
- default:
- fprint(2, "bad volume line '%s'\n", line[i]);
- exits(0);
- }
-
- // we dont care about these
- if(strcmp("speed", elem[0]) == 0 || strcmp("delay", elem[0]) == 0) {
- if(debug) fprint(2, "ignored: %V\n", v);
- continue;
- } else {
- Nvolume++;
- }
-
- if(debug) fprint(2, "parsed: %V\n", v);
- }
-}
-
-void
-setvol(Volume *v)
-{
- seek(vfd, 0, 0);
-
- if(debug)
- fprint(2, "write '%V'\n", v);
- if(fprint(vfd, "%V", v) < 0)
- fprint(2, "write '%V' to %s: %r\n", v, vf);
-}
-
-int nvrect;
-int toprect;
-Image *slidercolor;
-Image *background;
-Image *bordertext;
-
-void
-drawvol(Volume *v, int new)
-{
- int midlx, midrx, midy;
-
- midlx = v->r.min.x+(Dx(v->r)*v->llevel)/100;
- midrx = v->r.min.x+(Dx(v->r)*v->rlevel)/100;
- midy = v->r.min.y+Dy(v->r)/2;
-
- if(new) {
- border(screen, v->r, -1, bordertext, ZP);
- draw(screen, v->r, background, nil, ZP);
- line(screen, Pt(v->r.min.x, midy), Pt(v->r.max.x-1, midy), 0, 0, 0, background, ZP);
- }
-
- if(v->type == Stereo) {
- draw(screen, Rect(v->r.min.x, v->r.min.y, midlx, midy), slidercolor, nil, ZP);
- draw(screen, Rect(v->r.min.x, midy+1, midrx, v->r.max.y), slidercolor, nil, ZP);
- } else {
- draw(screen, Rect(v->r.min.x, v->r.min.y, midlx, v->r.max.y), slidercolor, nil, ZP);
- }
-
- if(!new) {
- if(v->type == Stereo) {
- draw(screen, Rect(midlx, v->r.min.y, v->r.max.x, midy), background, nil, ZP);
- draw(screen, Rect(midrx, midy+1, v->r.max.x, v->r.max.y), background, nil, ZP);
- } else {
- draw(screen, Rect(midlx, v->r.min.y, v->r.max.x, v->r.max.y), background, nil, ZP);
- }
- }
-
- string(screen, Pt(v->r.max.x-stringwidth(font, v->name)-5, v->r.min.y+2),
- bordertext, ZP, font, v->name);
-}
-
-void
-redraw(Image *screen)
-{
- enum { PAD=3, MARGIN=5 };
- Point p;
- int i, ht, wid;
- Volume *v;
-
- p = stringsize(font, "0");
- ht = p.y + 2*2;
- nvrect = (Dy(screen->r)-2*MARGIN)/(ht+PAD)+1;
- wid = Dx(screen->r)-2*MARGIN;
- if(nvrect >= Nvolume) {
- nvrect = Nvolume;
- toprect = 0;
- }
-
- draw(screen, screen->r, background, nil, ZP);
- p = addpt(screen->r.min, Pt(MARGIN, MARGIN));
- for(i=0; i<nvrect; i++) {
- v = &voltab[(i+toprect)%Nvolume];
- v->r = Rpt(p, addpt(p, Pt(wid, ht)));
- p.y += ht+PAD;
- drawvol(v, 1);
- }
- for(; i<Nvolume; i++){
- v = &voltab[(i+toprect)%Nvolume];
- v->r = Rect(0,0,0,0);
- }
-}
-
-void
-click(Mouse m)
-{
- Volume *v, *ev;
- int mid, δ, lev;
- int what;
-
- if(m.buttons & 1) {
- if(nvrect < Nvolume) {
- if(toprect-- == 0)
- toprect = Nvolume-1;
- redraw(screen);
- }
- do {
- m = emouse();
- } while(m.buttons);
- return;
- }
-
- if(m.buttons & 6) {
- what = m.buttons;
- for(v=voltab, ev=v+Nvolume; v<ev; v++) {
- if(ptinrect(m.xy, v->r))
- break;
- }
- if(v >= ev)
- return;
- mid = v->r.min.y+Dy(v->r)/2;
- δ = m.xy.y - mid;
-
- do {
- lev = ((m.xy.x - v->r.min.x)*100)/Dx(v->r);
- if(lev < 0)
- lev = 0;
- if(lev > 100)
- lev = 100;
- // if(-5 < δ && δ < 5)
- if(what & 2 || v->type == Mono)
- v->rlevel = v->llevel = lev;
- else if(δ > 0)
- v->rlevel = lev;
- else
- v->llevel = lev;
- setvol(v);
- drawvol(v, 0);
- m = emouse();
- } while(m.buttons);
- return;
- }
- exits(0);
-}
-
-void
-main(int argc, char **argv)
-{
- Event e;
-
- vf = "/dev/volume";
- ARGBEGIN{
- case 'f':
- vf = ARGF();
- break;
- case 'd':
- debug++;
- break;
- default:
- goto Usage;
- }ARGEND;
-
- if(argc) {
- Usage:
- fprint(2, "usage: %s [-f volumefile]\n", progname);
- exits("usage");
- }
-
- if((vfd = open(vf, ORDWR)) < 0) {
- fprint(2, "cannot open '%s': %r\n", vf);
- exits("open");
- }
-
- fmtinstall('V', volfmt);
- getvol();
- initdraw(0, 0, progname);
-
- Theme th[] = {
- { "back", DPaleyellow },
- { "border", DYellowgreen },
- { "text", DBlack },
- };
- readtheme(th, nelem(th), nil);
- background = allocimage(display, Rect(0,0,1,1), screen->chan, 1, th[0].c);
- slidercolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, th[1].c);
- bordertext = allocimage(display, Rect(0,0,1,1), screen->chan, 1, th[2].c);
-
- font = display->defaultfont;
- redraw(screen);
- einit(Emouse|Ekeyboard);
-
- for(;;) {
- switch(eread(Emouse|Ekeyboard, &e)) {
- case Ekeyboard:
- if(e.kbdc == 0x7F || e.kbdc == 'q')
- exits(0);
- break;
- case Emouse:
- if(e.mouse.buttons)
- click(e.mouse);
- break;
- }
- }
-}
-
-void
-eresized(int new)
-{
- if(new && getwindow(display, Refmesg) < 0)
- fprint(2,"can't reattach to window");
- redraw(screen);
-}
-