From 554e6135ec095f6d9b4925fd653c83ddc4052d42 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 12 Oct 2014 20:35:09 +0000 Subject: experimental, move allocation into parent widget --- Display.c | 29 ++++++++++++++++++++++++----- Display.h | 7 ++----- DisplayP.h | 1 + Sgraph.c | 16 ++-------------- SgraphP.h | 1 - spectrogram.c | 37 +++++++++++-------------------------- 6 files changed, 40 insertions(+), 51 deletions(-) diff --git a/Display.c b/Display.c index d4c7dd8..f0dad71 100644 --- a/Display.c +++ b/Display.c @@ -19,7 +19,9 @@ static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *); #define Offset(field) XtOffsetOf(DisplayRec, display.field) static XtResource resources[] = { { XtNnumChannel, XtCNumChannel, XtRInt, sizeof(int), - Offset(num_channel), XtRInt, 2 }, + Offset(num_channel), XtRImmediate, (XtPointer)2 }, + { XtNnumSamples, XtCNumSamples, XtRInt, sizeof(int), + Offset(num_samples), XtRImmediate, (XtPointer)0 }, { XtNdata, XtCData, XtRPointer, sizeof(int **), Offset(data), XtRPointer, NULL }, }; @@ -88,8 +90,22 @@ static void Initialize(Widget req, Widget new, ArgList args, Cardinal *num_args) { DisplayWidget dw = (DisplayWidget)new; + Arg arg[10]; + int n, i; + Trace(new); - dw->display.data = (int **)XtMalloc(dw->display.num_channel * sizeof(int *)); + + dw->display.data = (int **)XtCalloc(dw->display.num_channel, sizeof(int *)); + + for (i = 0; i < dw->display.num_channel; i++) { + dw->display.data[i] = (int *)XtCalloc(dw->display.num_samples, + sizeof(int)); + n = 0; + XtSetArg(arg[n], XtNvalues, dw->display.data[i]); n++; + XtSetArg(arg[n], XtNsize, dw->display.num_samples); n++; + XtSetArg(arg[n], XtNmirror, i % 2 ? False : True); n++; + XtCreateManagedWidget("SGraph", sgraphWidgetClass, new, arg, n); + } } static void @@ -99,7 +115,6 @@ ChangeManaged(Widget w) Dimension width, height; Widget child; int i; - Arg arg; Trace(w); @@ -109,8 +124,6 @@ ChangeManaged(Widget w) for (i = 0; i < dw->composite.num_children; i++) { child = dw->composite.children[i]; if (XtIsManaged(child)) { - XtSetArg(arg, XtNvalues, &dw->display.data[i]); - XtGetValues(child, &arg, 1); XtMoveWidget(child, width, 0); width += child->core.width @@ -121,6 +134,9 @@ ChangeManaged(Widget w) } w->core.width = width; w->core.height = height; + + /* XXX */ + dw->display.num_samples = dw->composite.children[0]->core.width * 2; } static void @@ -148,6 +164,9 @@ Resize(Widget w) child->core.border_width); } } + + /* XXX */ + dw->display.num_samples = dw->composite.children[0]->core.width * 2; } static void diff --git a/Display.h b/Display.h index 83860dd..dea4849 100644 --- a/Display.h +++ b/Display.h @@ -9,11 +9,8 @@ #define XtNnumChannel "numChannel" #define XtCNumChannel "NumChannel" -#define XtNround "round" -#define XtCRound "Round" - -#define XtNmaxRound "maxRound" -#define XtCMaxRound "MaxRound" +#define XtNnumSamples "numSamples" +#define XtCNumSamples "NumSamples" typedef struct _DisplayClassRec *DisplayWidgetClass; typedef struct _DisplayRec *DisplayWidget; diff --git a/DisplayP.h b/DisplayP.h index 6c92c0d..a3ad3d9 100644 --- a/DisplayP.h +++ b/DisplayP.h @@ -7,6 +7,7 @@ typedef struct { int num_channel; + int num_samples; int **data; } DisplayPart; diff --git a/Sgraph.c b/Sgraph.c index 022cb22..1a9be00 100644 --- a/Sgraph.c +++ b/Sgraph.c @@ -44,8 +44,6 @@ static XtResource resources[] = { Offset(values), XtRPointer, NULL }, { XtNsize, XtCsize, XtRInt, sizeof(int), Offset(size), XtRImmediate, (XtPointer)0 }, - { XtNsamples, XtCsamples, XtRInt, sizeof(int), - Offset(samples), XtRImmediate, (XtPointer)0 }, }; #undef Offset @@ -142,8 +140,6 @@ Initialize(Widget request, Widget w, ArgList args, Cardinal *nargs) sw->core.width = 320; sw->core.height = 120; - sw->sgraph.size = 2 * sw->core.width; - sw->sgraph.values = (int *)XtCalloc(sw->sgraph.samples, sizeof(int)); GetGC(w); } @@ -173,13 +169,6 @@ Resize(Widget w) if (!XtIsRealized(w)) return; - sw->sgraph.size = 2 * w->core.width; - if (sw->sgraph.size > sw->sgraph.samples) - sw->sgraph.size = sw->sgraph.samples; - warnx("win: %dx%d", w->core.width, w->core.height); - warnx("size: %zu", sw->sgraph.size); - warnx("samples: %zu", sw->sgraph.samples); - if (sw->sgraph.bg != None) XFreePixmap(XtDisplay(sw), sw->sgraph.bg); sw->sgraph.bg = XCreatePixmap(XtDisplay(sw), XtWindow(sw), @@ -196,7 +185,7 @@ static void Redisplay(Widget w, XEvent *event, Region r) { SgraphWidget sw = (SgraphWidget)w; - Dimension i, x, y, visible; + Dimension i, x, y; XdbeSwapInfo swap; if (!XtIsRealized(w)) { @@ -204,8 +193,7 @@ Redisplay(Widget w, XEvent *event, Region r) return; } - visible = sw->sgraph.size / 2; - for (i = 0; i < visible - 1; i++) { + for (i = 0; i < sw->core.width - 1; i++) { y = sw->sgraph.values[i]; x = sw->sgraph.mirror ? sw->core.width - i : i; diff --git a/SgraphP.h b/SgraphP.h index b76ec0d..3648b30 100644 --- a/SgraphP.h +++ b/SgraphP.h @@ -26,7 +26,6 @@ typedef struct { Boolean mirror; int *values; size_t size; - size_t samples; XdbeBackBuffer backBuf; GC foreGC; diff --git a/spectrogram.c b/spectrogram.c index c3eed91..f41d601 100644 --- a/spectrogram.c +++ b/spectrogram.c @@ -20,7 +20,7 @@ #include #include "Display.h" -#include "Sgraph.h" +//#include "Sgraph.h" #include #include @@ -74,21 +74,20 @@ static Boolean worker(XtPointer p) { Arg arg[10]; - int n, size, samples; + int n, samples; int **data; n = 0; - XtSetArg(arg[n], XtNwidth, &size); n++; - XtSetArg(arg[n], XtNsamples, &samples); n++; - XtSetArg(arg[n], XtNdata, &data); n++; + XtSetArg(arg[n], XtNnumSamples, &samples); n++; + XtSetArg(arg[n], XtNdata, &data); n++; XtGetValues(p, arg, n); - size = read_sio(data, size); - exec_fft(data[0], size); - exec_fft(data[1], size); + samples = read_sio(data, samples); + exec_fft(data[0], samples); + exec_fft(data[1], samples); n = 0; - XtSetArg(arg[n], XtNsize, size); n++; + XtSetArg(arg[n], XtNnumSamples, samples); n++; XtSetValues(p, arg, n); /* trigger expose */ return False; /* don't remove the work procedure from the list */ @@ -106,7 +105,7 @@ int main(int argc, char **argv) { XtAppContext app; - Widget toplevel, display, sgraph; + Widget toplevel, display; int n, samples; Arg args[10]; XtAccelerators acs; @@ -126,26 +125,12 @@ main(int argc, char **argv) acs = XtParseAcceleratorTable("q: quit()"); n = 0; - XtSetArg(args[n], XtNorientation, "horizontal"); n++; - XtSetArg(args[n], XtNaccelerators, acs); n++; + //XtSetArg(args[n], XtNaccelerators, acs); n++; XtSetArg(args[n], XtNnumChannel, 2); n++; + XtSetArg(args[n], XtNnumSamples, samples); n++; display = XtCreateManagedWidget("Display", displayWidgetClass, toplevel, args, n); - n = 0; - XtSetArg(args[n], XtNsamples, samples); n++; - XtSetArg(args[n], XtNmirror, True); n++; - sgraph = XtCreateManagedWidget("SGraph", sgraphWidgetClass, - display, args, n); - XtInstallAccelerators(sgraph, display); - - n = 0; - XtSetArg(args[n], XtNsamples, samples); n++; - XtSetArg(args[n], XtNmirror, False); n++; - sgraph = XtCreateManagedWidget("SGraph", sgraphWidgetClass, - display, args, n); - XtInstallAccelerators(sgraph, display); - XtAppAddWorkProc(app, worker, display); XtRealizeWidget(toplevel); -- cgit v1.2.3