diff options
Diffstat (limited to 'testfrac.c')
-rw-r--r-- | testfrac.c | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/testfrac.c b/testfrac.c new file mode 100644 index 0000000..56ba951 --- /dev/null +++ b/testfrac.c @@ -0,0 +1,205 @@ +/* +** testfrac.c +** +** How to make a widget to choose the fraction of tests to be run. +** +*/ +/* $XFree86: xc/programs/xgc/testfrac.c,v 1.3 2000/02/17 14:00:37 dawes Exp $ */ + +#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" + +extern void interpret(); + +extern XtAppContext appcontext; + +#define SCROLLBAR_LENGTH 125 +#define SLIDER_LENGTH 0.2 /* proportion of scrollbar taken up + by the slider */ + +static Widget label; /* the label */ +static Widget slider; /* the scrollbar */ +static Widget percent; /* label with chosen percentage */ + +static float fraction; /* what percent has been chosen */ +static int oldpercent = -1; /* so we only update when the slider has + been moved */ + +/* slider_jump(w,data,position) +** ---------------------------- +** This function is called if the user moves the scrollbar to a new +** position (generally, by using the middle button). It updates +** information about where the scrollbar is. +*/ + +/*ARGSUSED*/ +static void +slider_jump(w, data, position) + Widget w; + caddr_t data; + caddr_t position; +{ + static Arg percentargs[] = { + {XtNlabel, (XtArgVal) NULL} + }; + + float oldpercent; /* where the scrollbar is */ + float newpercent; /* normalized scrollbar */ + char snewpercent[3]; /* string representation of scrollbar */ + + oldpercent = *(float *) position; + + /* We want the scrollbar to be at 100% when the right edge of the slider + ** hits the end of the scrollbar, not the left edge. When the right edge + ** is at 1.0, the left edge is at 1.0 - SLIDER_LENGTH. Normalize + ** accordingly. */ + + newpercent = oldpercent / (1.0 - SLIDER_LENGTH); + + /* If the slider's partially out of the scrollbar, move it back in. */ + + if (newpercent > 1.0) { + newpercent = 1.0; + XawScrollbarSetThumb( slider, 1.0 - SLIDER_LENGTH, SLIDER_LENGTH); + } + + /* Store the position of the silder where it can be found */ + + *(float *)data = newpercent; + + /* Update the label widget */ + + sprintf(snewpercent,"%d",(int)(newpercent*100)); + percentargs[0].value = (XtArgVal) snewpercent; + XtSetValues(percent, percentargs, XtNumber(percentargs)); +} + +/* slider_scroll(w,data,position) +** ------------------------------ +** This function is called when the user does incremental scrolling, +** generally with the left or right button. Right now it just ignores it. +*/ + +/*ARGSUSED*/ +static void +slider_scroll(w, data, position) + Widget w; + caddr_t data; + caddr_t position; +{} + +/*ARGSUSED*/ +static void +update(w,event,params,num_params) + Widget w; + XEvent *event; + String *params; + int *num_params; +{ + char buf[80]; + int newpercent; + + newpercent = (int)(fraction * 100.0); + if (newpercent != oldpercent) { + sprintf(buf, "percent %d\n", (int)(fraction * 100.0)); + interpret(buf); + oldpercent = newpercent; + } +} + +/* create_testfrac_choice(w) +** ------------------------- +** Inside w (a form widget), creates: +** 1. A label "Percentage of Test" +** 2. A scrollbar for the user to choose the percentage (from 0 to 100) +** 3. A label with the current percentage displayed on it. +** The percentage starts at 100. +** +** When the pointer leaves the scrollbar, a string is sent to interpret() +** so that it knows the position of the scrollbar. +*/ + +void +create_testfrac_choice(w) + 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} + }; + + /* Let the scrollbar know where to store information where we + ** can see it */ + + 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)); + + /* Start the thumb out at 100% */ + + XawScrollbarSetThumb(slider, 1.0 - SLIDER_LENGTH, SLIDER_LENGTH); +} + +void +update_slider(newpercent) + int newpercent; +{ + fraction = (float) newpercent / 100.0; + XawScrollbarSetThumb(slider, fraction / (1.0-SLIDER_LENGTH), SLIDER_LENGTH); +} |