ref: 06fb503b9abe0fd23e174b57e1e080f34789bde2
parent: 368a207fb0dd648960417b79e41c5f352e16a1c9
author: Sigrid Haflínudóttir <[email protected]>
date: Wed Feb 26 15:53:12 EST 2020
move ui glue and aux to base
--- /dev/null
+++ b/aux.h
@@ -1,0 +1,56 @@
+typedef enum {
+ Xclone,
+ Xctl,
+ Xmetadata,
+
+ Xdsp,
+ Xdspctl,
+ Xdspdata,
+
+ Xui,
+ Xuictl,
+ Xuimeta,
+}Auxtype;
+
+typedef struct Aux Aux;
+typedef struct Auxdsp Auxdsp;
+typedef struct Meta Meta;
+typedef struct UI UI;
+
+struct Auxdsp {
+ void *dsp;
+ float **in, **out;
+ int numin, numout;
+ int inmax, outmax;
+};
+
+struct Aux {
+ Auxtype type;
+ int id;
+ int ctl;
+ int data;
+ int metadata;
+
+ Auxdsp *dsp;
+ UI *ui;
+};
+
+struct Meta {
+ const char *k;
+ const char *v;
+};
+
+struct UI {
+ UItype type;
+ const char *label;
+ float *zone;
+ float init;
+ float min;
+ float max;
+ float step;
+ char *(*readstr)(UI *ui, int type, char *s, int sz);
+ int (*write)(UI *ui, int type, char *s);
+
+ Meta *meta;
+ int nummeta;
+};
--- a/dsp/aux.h
+++ /dev/null
@@ -1,56 +1,0 @@
-typedef enum {
- Xclone,
- Xctl,
- Xmetadata,
-
- Xdsp,
- Xdspctl,
- Xdspdata,
-
- Xui,
- Xuictl,
- Xuimeta,
-}Auxtype;
-
-typedef struct Aux Aux;
-typedef struct Auxdsp Auxdsp;
-typedef struct Meta Meta;
-typedef struct UI UI;
-
-struct Auxdsp {
- void *dsp;
- float **in, **out;
- int numin, numout;
- int inmax, outmax;
-};
-
-struct Aux {
- Auxtype type;
- int id;
- int ctl;
- int data;
- int metadata;
-
- Auxdsp *dsp;
- UI *ui;
-};
-
-struct Meta {
- const char *k;
- const char *v;
-};
-
-struct UI {
- UItype type;
- const char *label;
- float *zone;
- float init;
- float min;
- float max;
- float step;
- char *(*readstr)(UI *ui, int type, char *s, int sz);
- int (*write)(UI *ui, int type, char *s);
-
- Meta *meta;
- int nummeta;
-};
--- a/dsp/mkfile
+++ b/dsp/mkfile
@@ -26,3 +26,6 @@
common.$O: ../common.c
$CC $CFLAGS $prereq
+
+uiglue.$O: ../uiglue.c
+ $CC $CFLAGS $prereq
--- a/dsp/uiglue.c
+++ /dev/null
@@ -1,285 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <fcall.h>
-#include <thread.h>
-#include <9p.h>
-#include "uiglue.h"
-#include "common.h"
-#include "aux.h"
-
-static struct {
- float *zone;
- Meta *meta;
- int nummeta;
-}decl;
-
-static char *
-ui_readstr(UI *ui, int type, char *s, int sz)
-{
- char *x, *t;
- int i;
-
- if (type == Xuictl) {
- if (ui->type < 0 || ui->type >= UInum)
- sysfatal("unknown ui type %d", ui->type);
- t = uitypenames[ui->type];
- switch (ui->type) {
- case UITGroup:
- case UIHGroup:
- case UIVGroup:
- snprint(s, sz, "%s\n", t);
- return s;
- case UIButton:
- case UICheckBox:
- snprint(s, sz, "%s\t%g\n", t, *ui->zone);
- return s;
- case UIVSlider:
- case UIHSlider:
- case UINEntry:
- snprint(s, sz, "%s\t%g\t%g\t%g\t%g\t%g\n", t, *ui->zone, ui->init, ui->min, ui->max, ui->step);
- return s;
- case UIHBarGraph:
- case UIVBarGraph:
- snprint(s, sz, "%s\t%g\t%g\t%g\n", t, *ui->zone, ui->min, ui->max);
- return s;
- default:
- sysfatal("readstr not implemented for ui type %d", ui->type);
- }
- } else if (type == Xuimeta) {
- x = s;
- *x = 0;
- for (i = 0; i < ui->nummeta; i++)
- x = seprint(x, s+sz-1, "%s\t%s\n", ui->meta[i].k, ui->meta[i].v);
- return s;
- } else {
- sysfatal("unknown ui file type %d", type);
- }
-
- return nil;
-}
-
-static int
-ui_write(UI *ui, int type, char *s)
-{
- char *e;
- int failoor;
- float v;
-
- if (type != Xuictl)
- sysfatal("unknown ui file %d", type);
-
- /* FIXME optional argument should specify at which frame to apply the change */
-
- v = 0.0f;
- failoor = 0;
- if (strncmp(s, "reset", 5) == 0) { /* FIXME reset for a box should reset ALL controls inside it */
- v = ui->init;
- } else if (strncmp(s, "add", 3) == 0) {
- if (ui->zone != nil)
- v = *ui->zone + atof(s+3);
- } else if (strncmp(s, "sub", 3) == 0) {
- if (ui->zone != nil)
- v = *ui->zone - atof(s+3);
- } else {
- v = strtod(s, &e);
- if (*e != 0 && *e != '\n')
- return -1;
- failoor = 1;
- }
-
- if (ui->zone != nil) {
- if (ui->type == UIButton || ui->type == UICheckBox) {
- *ui->zone = v > 0 ? 1 : 0;
- } else {
- if (v < ui->min) {
- if (failoor)
- return -1;
- v = ui->min;
- } else if (v > ui->max) {
- if (failoor)
- return -1;
- v = ui->max;
- }
- *ui->zone = v;
- }
- }
-
- return 0;
-}
-
-static UI *
-newui(File *f, const char *label, int type)
-{
- Aux *a;
-
- a = calloc(1, sizeof(*a)+sizeof(UI) + sizeof(Meta)*decl.nummeta);
- a->type = Xui;
- a->ui = (UI*)(a+1);
- a->ui->type = type;
- a->ui->meta = (Meta*)(a->ui+1);
- a->ui->nummeta = decl.nummeta;
- memmove(a->ui->meta, decl.meta, sizeof(Meta)*decl.nummeta);
- a->ctl = Xuictl;
- a->metadata = Xuimeta;
- a->ui->zone = decl.zone;
- a->ui->label = label;
- a->ui->readstr = ui_readstr;
- a->ui->write = ui_write;
- if ((uiglue.f = createfile(f, label, nil, DMDIR|0775, a)) == nil)
- sysfatal("failed to create ui: %r");
- if ((f = createfile(uiglue.f, "ctl", nil, 0664, &a->ctl)) == nil)
- sysfatal("failed to create ui ctl: %r");
- closefile(f);
- if ((f = createfile(uiglue.f, "metadata", nil, 0664, &a->metadata)) == nil)
- sysfatal("failed to create ui metadata: %r");
- closefile(f);
- closefile(uiglue.f);
-
- free(decl.meta);
- decl.zone = nil;
- decl.meta = nil;
- decl.nummeta = 0;
-
- return a->ui;
-}
-
-static void
-ui_tgroup(void *f, const char *label)
-{
- newui(f, label, UITGroup);
-}
-
-static void
-ui_hgroup(void *f, const char *label)
-{
- newui(f, label, UIHGroup);
-}
-
-static void
-ui_vgroup(void *f, const char *label)
-{
- newui(f, label, UIVGroup);
-}
-
-static void
-ui_close_group(void *file)
-{
- File *f;
-
- f = file;
- uiglue.f = f->parent;
-}
-
-static UI *
-ui_define(File *f, int type, const char *label, float *zone)
-{
- UI *ui;
-
- if (zone != decl.zone) { /* no "declare" called before */
- decl.zone = zone;
- free(decl.meta);
- decl.meta = nil;
- decl.nummeta = 0;
- }
- ui = newui(f, label, type);
- uiglue.f = f;
-
- return ui;
-}
-
-static void
-ui_button(void *f, const char *label, float *zone)
-{
- ui_define(f, UIButton, label, zone);
-}
-
-static void
-ui_checkbox(void *f, const char *label, float *zone)
-{
- ui_define(f, UICheckBox, label, zone);
-}
-
-static void
-ui_vslider(void *f, const char *label, float *zone, float init, float min, float max, float step)
-{
- UI *ui;
-
- ui = ui_define(f, UIVSlider, label, zone);
- ui->init = init;
- ui->min = min;
- ui->max = max;
- ui->step = step;
-}
-
-static void
-ui_hslider(void *f, const char *label, float *zone, float init, float min, float max, float step)
-{
- UI *ui;
-
- ui = ui_define(f, UIHSlider, label, zone);
- ui->init = init;
- ui->min = min;
- ui->max = max;
- ui->step = step;
-}
-
-static void
-ui_nentry(void *f, const char *label, float *zone, float init, float min, float max, float step)
-{
- UI *ui;
-
- ui = ui_define(f, UINEntry, label, zone);
- ui->init = init;
- ui->min = min;
- ui->max = max;
- ui->step = step;
-}
-
-static void
-ui_hbargraph(void *f, const char *label, float *zone, float min, float max)
-{
- UI *ui;
-
- ui = ui_define(f, UIHBarGraph, label, zone);
- ui->min = min;
- ui->max = max;
-}
-
-static void
-ui_vbargraph(void *f, const char *label, float *zone, float min, float max)
-{
- UI *ui;
-
- ui = ui_define(f, UIVBarGraph, label, zone);
- ui->min = min;
- ui->max = max;
-}
-
-static void
-ui_declare(void *f, float *zone, const char *key, const char *value)
-{
- USED(f);
-
- if (decl.zone != nil && decl.zone != zone)
- sysfatal("%s=\"%s\": zone mismatch during declaration (%p != %p)", key, value, decl.zone, zone);
- decl.zone = zone;
- decl.meta = realloc(decl.meta, sizeof(Meta)*(decl.nummeta+1));
- decl.meta[decl.nummeta].k = key;
- decl.meta[decl.nummeta].v = value;
- decl.nummeta++;
-}
-
-UIGlue uiglue = {
- .openTabBox = ui_tgroup,
- .openHorizontalBox = ui_hgroup,
- .openVerticalBox = ui_vgroup,
- .closeBox = ui_close_group,
- .addButton = ui_button,
- .addCheckButton = ui_checkbox,
- .addVerticalSlider = ui_vslider,
- .addHorizontalSlider = ui_hslider,
- .addNumEntry = ui_nentry,
- .addHorizontalBargraph = ui_hbargraph,
- .addVerticalBargraph = ui_vbargraph,
- .declare = ui_declare,
-};
--- a/dsp/uiglue.h
+++ /dev/null
@@ -1,30 +1,0 @@
-typedef struct UIGlue UIGlue;
-typedef struct MetaGlue MetaGlue;
-
-struct File;
-
-struct UIGlue {
- union {
- void *uiInterface;
- struct File *f;
- };
- void (*openTabBox)(void *uiInterface, const char *label);
- void (*openHorizontalBox)(void *uiInterface, const char *label);
- void (*openVerticalBox)(void *uiInterface, const char *label);
- void (*closeBox)(void *uiInterface);
- void (*addButton)(void *uiInterface, const char *label, float *zone);
- void (*addCheckButton)(void *uiInterface, const char *label, float *zone);
- void (*addVerticalSlider)(void *uiInterface, const char *label, float *zone, float init, float min, float max, float step);
- void (*addHorizontalSlider)(void *uiInterface, const char *label, float *zone, float init, float min, float max, float step);
- void (*addNumEntry)(void *uiInterface, const char *label, float *zone, float init, float min, float max, float step);
- void (*addHorizontalBargraph)(void *uiInterface, const char *label, float *zone, float min, float max);
- void (*addVerticalBargraph)(void *uiInterface, const char *label, float *zone, float min, float max);
- void (*declare)(void *uiInterface, float *zone, const char *key, const char *value);
-};
-
-struct MetaGlue {
- void *metaInterface;
- void (*declare)(void *metaInterface, const char *key, const char *value);
-};
-
-extern UIGlue uiglue;
--- /dev/null
+++ b/uiglue.c
@@ -1,0 +1,285 @@
+#include <u.h>
+#include <libc.h>
+#include <fcall.h>
+#include <thread.h>
+#include <9p.h>
+#include "uiglue.h"
+#include "common.h"
+#include "aux.h"
+
+static struct {
+ float *zone;
+ Meta *meta;
+ int nummeta;
+}decl;
+
+static char *
+ui_readstr(UI *ui, int type, char *s, int sz)
+{
+ char *x, *t;
+ int i;
+
+ if (type == Xuictl) {
+ if (ui->type < 0 || ui->type >= UInum)
+ sysfatal("unknown ui type %d", ui->type);
+ t = uitypenames[ui->type];
+ switch (ui->type) {
+ case UITGroup:
+ case UIHGroup:
+ case UIVGroup:
+ snprint(s, sz, "%s\n", t);
+ return s;
+ case UIButton:
+ case UICheckBox:
+ snprint(s, sz, "%s\t%g\n", t, *ui->zone);
+ return s;
+ case UIVSlider:
+ case UIHSlider:
+ case UINEntry:
+ snprint(s, sz, "%s\t%g\t%g\t%g\t%g\t%g\n", t, *ui->zone, ui->init, ui->min, ui->max, ui->step);
+ return s;
+ case UIHBarGraph:
+ case UIVBarGraph:
+ snprint(s, sz, "%s\t%g\t%g\t%g\n", t, *ui->zone, ui->min, ui->max);
+ return s;
+ default:
+ sysfatal("readstr not implemented for ui type %d", ui->type);
+ }
+ } else if (type == Xuimeta) {
+ x = s;
+ *x = 0;
+ for (i = 0; i < ui->nummeta; i++)
+ x = seprint(x, s+sz-1, "%s\t%s\n", ui->meta[i].k, ui->meta[i].v);
+ return s;
+ } else {
+ sysfatal("unknown ui file type %d", type);
+ }
+
+ return nil;
+}
+
+static int
+ui_write(UI *ui, int type, char *s)
+{
+ char *e;
+ int failoor;
+ float v;
+
+ if (type != Xuictl)
+ sysfatal("unknown ui file %d", type);
+
+ /* FIXME optional argument should specify at which frame to apply the change */
+
+ v = 0.0f;
+ failoor = 0;
+ if (strncmp(s, "reset", 5) == 0) { /* FIXME reset for a box should reset ALL controls inside it */
+ v = ui->init;
+ } else if (strncmp(s, "add", 3) == 0) {
+ if (ui->zone != nil)
+ v = *ui->zone + atof(s+3);
+ } else if (strncmp(s, "sub", 3) == 0) {
+ if (ui->zone != nil)
+ v = *ui->zone - atof(s+3);
+ } else {
+ v = strtod(s, &e);
+ if (*e != 0 && *e != '\n')
+ return -1;
+ failoor = 1;
+ }
+
+ if (ui->zone != nil) {
+ if (ui->type == UIButton || ui->type == UICheckBox) {
+ *ui->zone = v > 0 ? 1 : 0;
+ } else {
+ if (v < ui->min) {
+ if (failoor)
+ return -1;
+ v = ui->min;
+ } else if (v > ui->max) {
+ if (failoor)
+ return -1;
+ v = ui->max;
+ }
+ *ui->zone = v;
+ }
+ }
+
+ return 0;
+}
+
+static UI *
+newui(File *f, const char *label, int type)
+{
+ Aux *a;
+
+ a = calloc(1, sizeof(*a)+sizeof(UI) + sizeof(Meta)*decl.nummeta);
+ a->type = Xui;
+ a->ui = (UI*)(a+1);
+ a->ui->type = type;
+ a->ui->meta = (Meta*)(a->ui+1);
+ a->ui->nummeta = decl.nummeta;
+ memmove(a->ui->meta, decl.meta, sizeof(Meta)*decl.nummeta);
+ a->ctl = Xuictl;
+ a->metadata = Xuimeta;
+ a->ui->zone = decl.zone;
+ a->ui->label = label;
+ a->ui->readstr = ui_readstr;
+ a->ui->write = ui_write;
+ if ((uiglue.f = createfile(f, label, nil, DMDIR|0775, a)) == nil)
+ sysfatal("failed to create ui: %r");
+ if ((f = createfile(uiglue.f, "ctl", nil, 0664, &a->ctl)) == nil)
+ sysfatal("failed to create ui ctl: %r");
+ closefile(f);
+ if ((f = createfile(uiglue.f, "metadata", nil, 0664, &a->metadata)) == nil)
+ sysfatal("failed to create ui metadata: %r");
+ closefile(f);
+ closefile(uiglue.f);
+
+ free(decl.meta);
+ decl.zone = nil;
+ decl.meta = nil;
+ decl.nummeta = 0;
+
+ return a->ui;
+}
+
+static void
+ui_tgroup(void *f, const char *label)
+{
+ newui(f, label, UITGroup);
+}
+
+static void
+ui_hgroup(void *f, const char *label)
+{
+ newui(f, label, UIHGroup);
+}
+
+static void
+ui_vgroup(void *f, const char *label)
+{
+ newui(f, label, UIVGroup);
+}
+
+static void
+ui_close_group(void *file)
+{
+ File *f;
+
+ f = file;
+ uiglue.f = f->parent;
+}
+
+static UI *
+ui_define(File *f, int type, const char *label, float *zone)
+{
+ UI *ui;
+
+ if (zone != decl.zone) { /* no "declare" called before */
+ decl.zone = zone;
+ free(decl.meta);
+ decl.meta = nil;
+ decl.nummeta = 0;
+ }
+ ui = newui(f, label, type);
+ uiglue.f = f;
+
+ return ui;
+}
+
+static void
+ui_button(void *f, const char *label, float *zone)
+{
+ ui_define(f, UIButton, label, zone);
+}
+
+static void
+ui_checkbox(void *f, const char *label, float *zone)
+{
+ ui_define(f, UICheckBox, label, zone);
+}
+
+static void
+ui_vslider(void *f, const char *label, float *zone, float init, float min, float max, float step)
+{
+ UI *ui;
+
+ ui = ui_define(f, UIVSlider, label, zone);
+ ui->init = init;
+ ui->min = min;
+ ui->max = max;
+ ui->step = step;
+}
+
+static void
+ui_hslider(void *f, const char *label, float *zone, float init, float min, float max, float step)
+{
+ UI *ui;
+
+ ui = ui_define(f, UIHSlider, label, zone);
+ ui->init = init;
+ ui->min = min;
+ ui->max = max;
+ ui->step = step;
+}
+
+static void
+ui_nentry(void *f, const char *label, float *zone, float init, float min, float max, float step)
+{
+ UI *ui;
+
+ ui = ui_define(f, UINEntry, label, zone);
+ ui->init = init;
+ ui->min = min;
+ ui->max = max;
+ ui->step = step;
+}
+
+static void
+ui_hbargraph(void *f, const char *label, float *zone, float min, float max)
+{
+ UI *ui;
+
+ ui = ui_define(f, UIHBarGraph, label, zone);
+ ui->min = min;
+ ui->max = max;
+}
+
+static void
+ui_vbargraph(void *f, const char *label, float *zone, float min, float max)
+{
+ UI *ui;
+
+ ui = ui_define(f, UIVBarGraph, label, zone);
+ ui->min = min;
+ ui->max = max;
+}
+
+static void
+ui_declare(void *f, float *zone, const char *key, const char *value)
+{
+ USED(f);
+
+ if (decl.zone != nil && decl.zone != zone)
+ sysfatal("%s=\"%s\": zone mismatch during declaration (%p != %p)", key, value, decl.zone, zone);
+ decl.zone = zone;
+ decl.meta = realloc(decl.meta, sizeof(Meta)*(decl.nummeta+1));
+ decl.meta[decl.nummeta].k = key;
+ decl.meta[decl.nummeta].v = value;
+ decl.nummeta++;
+}
+
+UIGlue uiglue = {
+ .openTabBox = ui_tgroup,
+ .openHorizontalBox = ui_hgroup,
+ .openVerticalBox = ui_vgroup,
+ .closeBox = ui_close_group,
+ .addButton = ui_button,
+ .addCheckButton = ui_checkbox,
+ .addVerticalSlider = ui_vslider,
+ .addHorizontalSlider = ui_hslider,
+ .addNumEntry = ui_nentry,
+ .addHorizontalBargraph = ui_hbargraph,
+ .addVerticalBargraph = ui_vbargraph,
+ .declare = ui_declare,
+};
--- /dev/null
+++ b/uiglue.h
@@ -1,0 +1,30 @@
+typedef struct UIGlue UIGlue;
+typedef struct MetaGlue MetaGlue;
+
+struct File;
+
+struct UIGlue {
+ union {
+ void *uiInterface;
+ struct File *f;
+ };
+ void (*openTabBox)(void *uiInterface, const char *label);
+ void (*openHorizontalBox)(void *uiInterface, const char *label);
+ void (*openVerticalBox)(void *uiInterface, const char *label);
+ void (*closeBox)(void *uiInterface);
+ void (*addButton)(void *uiInterface, const char *label, float *zone);
+ void (*addCheckButton)(void *uiInterface, const char *label, float *zone);
+ void (*addVerticalSlider)(void *uiInterface, const char *label, float *zone, float init, float min, float max, float step);
+ void (*addHorizontalSlider)(void *uiInterface, const char *label, float *zone, float init, float min, float max, float step);
+ void (*addNumEntry)(void *uiInterface, const char *label, float *zone, float init, float min, float max, float step);
+ void (*addHorizontalBargraph)(void *uiInterface, const char *label, float *zone, float min, float max);
+ void (*addVerticalBargraph)(void *uiInterface, const char *label, float *zone, float min, float max);
+ void (*declare)(void *uiInterface, float *zone, const char *key, const char *value);
+};
+
+struct MetaGlue {
+ void *metaInterface;
+ void (*declare)(void *metaInterface, const char *key, const char *value);
+};
+
+extern UIGlue uiglue;