#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/Scrollbar.h>
#include "xgc.h"
#define SCROLLBAR_LENGTH 125
#define SLIDER_LENGTH 0.2
static Widget label;
static Widget slider;
static Widget percent;
static float fraction;
static int oldpercent = -1;
static void
slider_jump(Widget w, caddr_t data, caddr_t position)
{
static Arg percentargs[] = {
{XtNlabel, (XtArgVal) NULL}
};
float oldpercent;
float newpercent;
char snewpercent[3];
oldpercent = *(float *) position;
newpercent = oldpercent / (1.0 - SLIDER_LENGTH);
if (newpercent > 1.0) {
newpercent = 1.0;
XawScrollbarSetThumb( slider, 1.0 - SLIDER_LENGTH, SLIDER_LENGTH);
}
*(float *)data = newpercent;
snprintf(snewpercent, sizeof snewpercent, "%d",(int)(newpercent*100));
percentargs[0].value = (XtArgVal) snewpercent;
XtSetValues(percent, percentargs, XtNumber(percentargs));
}
static void
slider_scroll(Widget w, caddr_t data, caddr_t position)
{
}
static void
update(Widget w, XEvent *event, String *params, int *num_params)
{
char buf[80];
int newpercent;
newpercent = (int)(fraction * 100.0);
if (newpercent != oldpercent) {
snprintf(buf, sizeof buf, "percent %d\n", (int)(fraction * 100.0));
interpret(buf);
oldpercent = newpercent;
}
}
void
create_testfrac_choice(Widget w)
{
static XtCallbackRec jumpcallbacks[] = {
{(XtCallbackProc) slider_jump, NULL},
{NULL, NULL}
};
static XtCallbackRec scrollcallbacks[] = {
{(XtCallbackProc) slider_scroll, NULL},
{NULL, NULL}
};
static Arg labelargs[] = {
{XtNborderWidth, (XtArgVal) 0},
{XtNjustify, (XtArgVal) XtJustifyRight},
{XtNvertDistance, (XtArgVal) 4}
};
static Arg percentargs[] = {
{XtNborderWidth, (XtArgVal) 1},
{XtNhorizDistance, (XtArgVal) 10},
{XtNfromHoriz, (XtArgVal) NULL}
};
static Arg scrollargs[] = {
{XtNorientation, (XtArgVal) XtorientHorizontal},
{XtNlength, (XtArgVal) SCROLLBAR_LENGTH},
{XtNthickness, (XtArgVal) 10},
{XtNshown, (XtArgVal) 10},
{XtNhorizDistance, (XtArgVal) 10},
{XtNfromHoriz, (XtArgVal) NULL},
{XtNjumpProc, (XtArgVal) NULL},
{XtNscrollProc, (XtArgVal) NULL}
};
static const char *translationtable = "<Leave>: Update()";
static XtActionsRec actiontable[] = {
{"Update", (XtActionProc) update},
{NULL, NULL}
};
jumpcallbacks[0].closure = (caddr_t) &fraction;
label = XtCreateManagedWidget("Percentage of Test",labelWidgetClass,w,
labelargs,XtNumber(labelargs));
percentargs[2].value = (XtArgVal) label;
percent = XtCreateManagedWidget("100",labelWidgetClass,w,
percentargs,XtNumber(percentargs));
scrollargs[5].value = (XtArgVal) percent;
scrollargs[6].value = (XtArgVal) jumpcallbacks;
scrollargs[7].value = (XtArgVal) scrollcallbacks;
slider = XtCreateManagedWidget("Slider",scrollbarWidgetClass,w,
scrollargs,XtNumber(scrollargs));
XtAppAddActions(appcontext,actiontable,XtNumber(actiontable));
XtOverrideTranslations(slider,XtParseTranslationTable(translationtable));
XawScrollbarSetThumb(slider, 1.0 - SLIDER_LENGTH, SLIDER_LENGTH);
}
void
update_slider(int newpercent)
{
fraction = (float) newpercent / 100.0;
XawScrollbarSetThumb(slider, fraction / (1.0-SLIDER_LENGTH), SLIDER_LENGTH);
}