#include <X11/Xos.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/Toggle.h>
#include "xgc.h"
static void choose_plane(Widget, caddr_t, caddr_t);
static unsigned long planemask;
static Widget *pm;
void
create_planemask_choice(Widget w)
{
static XtCallbackRec callbacklist[] = {
{(XtCallbackProc) choose_plane, NULL},
{NULL, NULL}
};
static Arg labelargs[] = {
{XtNborderWidth, (XtArgVal) 0},
{XtNjustify, (XtArgVal) XtJustifyRight},
{XtNvertDistance, (XtArgVal) 4}
};
static Arg pmargs[] = {
{XtNcallback, (XtArgVal) NULL},
{XtNhorizDistance, (XtArgVal) NULL},
{XtNfromHoriz, (XtArgVal) NULL},
{XtNwidth, (XtArgVal) 10},
{XtNheight, (XtArgVal) 10},
{XtNhighlightThickness,(XtArgVal) 1},
{XtNstate, (XtArgVal) True},
{XtNlabel, (XtArgVal) ""}
};
static Widget label;
static int *pminfo;
int i, num_planes;
char buf[40];
char name[12];
num_planes = PlanesOfScreen(X.scr);
planemask = (1<<num_planes)-1;
snprintf(buf, sizeof buf, "planemask %lu",planemask);
interpret(buf);
pm = (Widget *) malloc(num_planes * sizeof(Widget));
pminfo = (int *) malloc(num_planes * sizeof(int));
label = XtCreateManagedWidget("planemask",labelWidgetClass,w,
labelargs,XtNumber(labelargs));
pmargs[0].value = (XtArgVal) callbacklist;
for (i=0;i<num_planes;++i) {
if (i==0) {
pmargs[1].value = (XtArgVal) 10;
pmargs[2].value = (XtArgVal) label;
}
else {
pmargs[1].value = (XtArgVal) -1;
pmargs[2].value = (XtArgVal) pm[i-1];
}
if (planemask & 1<<i)
pmargs[6].value = (XtArgVal) True;
else
pmargs[6].value = (XtArgVal) False;
snprintf(name, sizeof name, "planemask%d",i);
pminfo[i] = i;
callbacklist[0].closure = (caddr_t) &pminfo[i];
pm[i] = XtCreateManagedWidget(name,toggleWidgetClass,w,
pmargs,XtNumber(pmargs));
}
}
static void
choose_plane(Widget w, caddr_t closure, caddr_t call_data)
{
int num;
Boolean on;
char buf[80];
static Arg args[] = {
{XtNstate, (XtArgVal) NULL}
};
args[0].value = (XtArgVal) &on;
num = * (int *) closure;
XtGetValues(w,args,XtNumber(args));
if (on)
planemask |= 1<<num;
else
planemask &= ~(1<<num);
(void) snprintf(buf, sizeof buf, "planemask %lu\n",planemask);
interpret(buf);
}
void
update_planemask(long mask)
{
int i;
static Arg maskargs[] = {
{XtNstate, (XtArgVal) NULL}
};
planemask = mask;
for (i = 0; i < PlanesOfScreen(X.scr); ++i) {
if (planemask & 1<<i) {
maskargs[0].value = (XtArgVal) True;
}
else {
maskargs[0].value = (XtArgVal) False;
}
XtSetValues(pm[i],maskargs,XtNumber(maskargs));
}
}