summaryrefslogtreecommitdiff
path: root/testfrac.c
diff options
context:
space:
mode:
Diffstat (limited to 'testfrac.c')
-rw-r--r--testfrac.c205
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);
+}