staden-lg/src/bap/myparams.c

233 lines
6.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Box.h>
#include <X11/Xaw/Command.h>
#include "myparams.h"
#define MAXWIDTH 50
static void okCallback(Widget w, XtPointer status, XtPointer call_data)
{
* (int *) status = 1;
}
static void cancelCallback(Widget w, XtPointer status, XtPointer call_data)
{
* (int *) status = 2;
}
static void SourceChanged(Widget w, XtPointer i, XtPointer junk)
{
XtRemoveAllCallbacks(w, XtNcallback);
*(int *)i = 1;
}
static Widget create_window(Widget parentWid, char *title, Field_entry *field_list, int field_entries,int *modified,Widget *fields, int *status)
/*
** This creates a popup widget that allows you to change the values of
** fields
*/
{
Widget wid;
Widget form;
Widget label;
Widget box, ok, cancel;
int maxlen; /* maximum length of label */
Cardinal nargs;
Arg args[10];
int i;
Position x, y; /* top-left hand corner of new widget */
Dimension height; /* height of parent widget */
/*
** Determine the position of up and comming widget
*/
nargs = 0;
XtSetArg(args[nargs], XtNheight, &height); nargs++;
XtGetValues(parentWid, args, nargs);
XtTranslateCoords(parentWid, (Position) 0, (Position) height, &x, &y);
y+=3; /* a suitable gap between widgets */
/*
** Create popup shell
*/
nargs = 0;
XtSetArg(args[nargs], XtNx, x); nargs++;
XtSetArg(args[nargs], XtNy, y); nargs++;
wid = XtCreatePopupShell("changeparam", transientShellWidgetClass, parentWid, args, nargs);
/*
** Create main form
*/
nargs = 0;
form = XtCreateManagedWidget("form", formWidgetClass, wid, args, nargs);
/*
** Create title for form
*/
nargs = 0;
XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
XtSetArg(args[nargs], XtNlabel, (title != NULL) ? title : "Change Parameters..."); nargs++;
label = XtCreateManagedWidget("label", labelWidgetClass, form, args, nargs);
maxlen = 0;
for (i=0; i < field_entries; i++) {
int len = strlen(field_list[i].field_name);
if (maxlen < len) maxlen = len;
}
/*
** Create labels and buttons for each field entry
*/
for (i=0; i < field_entries; i++) {
Widget fromVert = label;
char init_string[MAXWIDTH+1];
if (maxlen>MAXWIDTH) maxlen = MAXWIDTH;
sprintf(init_string,"%-*s",maxlen,field_list[i].field_name);
nargs = 0;
XtSetArg(args[nargs], XtNfromVert, fromVert); nargs++;
XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
XtSetArg(args[nargs], XtNlabel, init_string); nargs++;
label = XtCreateManagedWidget("label", labelWidgetClass, form, args, nargs);
switch (field_list[i].field_type) {
case t_int :
sprintf(init_string,"%d", * (int *) field_list[i].field_value);
break;
case t_float :
sprintf(init_string,"%f", * (float *) field_list[i].field_value);
break;
case t_char:
strncpy(init_string, field_list[i].field_value, MAXWIDTH);
break;
default:
strcpy(init_string, "** Unknown Type **");
break;
}
nargs = 0;
XtSetArg(args[nargs], XtNfromHoriz, label); nargs++;
XtSetArg(args[nargs], XtNfromVert, fromVert); nargs++;
XtSetArg(args[nargs], XtNstring, init_string); nargs++;
XtSetArg(args[nargs], XtNeditType, XawtextEdit); nargs++;
XtSetArg(args[nargs], XtNwidth, 300); nargs++;
fields[i] = XtCreateManagedWidget("text",asciiTextWidgetClass, form, args, nargs);
XtAddCallback(XawTextGetSource(fields[i]), XtNcallback, SourceChanged, (XtPointer) &modified[i]);
my_translations(fields[i]);
XawTextSetInsertionPoint(fields[i], strlen(init_string));
modified[i] = 0;
}
/*
** Create Exit Action Buttons
*/
nargs = 0;
XtSetArg(args[nargs], XtNfromVert, label); nargs++;
XtSetArg(args[nargs], XtNborderWidth, 0); nargs++;
#define XtOrientHorizontal "horizontal"
XtSetArg(args[nargs], XtNorientation, XtOrientHorizontal); nargs++;
box = XtCreateManagedWidget("box", boxWidgetClass, form, args, nargs);
nargs = 0;
ok = XtCreateManagedWidget("ok", commandWidgetClass, box, args, nargs);
XtAddCallback(ok, XtNcallback, okCallback, (XtPointer) status);
nargs = 0;
cancel = XtCreateManagedWidget("cancel", commandWidgetClass, box, args, nargs);
XtAddCallback(cancel, XtNcallback, cancelCallback, (XtPointer) status);
return wid;
}
static void update_params(Widget *fields, Field_entry *field_list, int field_entries, int *modified)
{
int i;
Arg args[10];
Cardinal nargs;
for (i=0; i < field_entries; i++) {
if (modified[i]) {
char *new_value;
nargs = 0;
XtSetArg(args[nargs], XtNstring, &new_value); nargs++;
XtGetValues(fields[i],args,nargs);
switch(field_list[i].field_type) {
case t_int:
* (int *) field_list[i].field_value = atoi(new_value);
break;
case t_float:
* (float *) field_list[i].field_value = (float) atof(new_value);
break;
case t_char:
strncpy(field_list[i].field_value, new_value, field_list[i].field_size-1);
field_list[i].field_value[field_list[i].field_size-1]='\0';
break;
default:
break;
}
}
}
}
void change_params(Widget parentWid, char *title, Field_entry *field_list, int field_entries)
{
Widget wid;
int status;
Widget *fields;
int *modified;
/*
** Allocate space for data
*/
fields = (Widget *) malloc(field_entries * sizeof(Widget));
modified = (int *) malloc(field_entries * sizeof(int));
wid = create_window(parentWid,title,field_list,field_entries,modified,fields,&status);
XtPopup(wid, XtGrabExclusive);
status = 0;
while (!status)
{
XEvent event;
XtAppNextEvent(XtWidgetToApplicationContext(wid), &event);
XtDispatchEvent(&event);
}
XtPopdown(wid);
if (status == 1) update_params(fields, field_list, field_entries, modified);
free (fields);
free (modified);
XtDestroyWidget(wid);
}