#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Shell.h>
#include <stdio.h>
#include <stdlib.h>
#include "xgc.h"
#define DEFINE_TILE
#include "tile"
static void fill_up_commandform(Widget);
static void quit(void);
static void quitAction(Widget, XEvent *, String *, Cardinal *);
static void clear_test_window(void);
static void clear_result_window(void);
static void set_foreground_and_background(void);
static XgcData FunctionData[NUM_FUNCTIONS] = {
{"clear", "clear", GXclear},
{"and", "and", GXand},
{"andReverse", "andReverse", GXandReverse},
{"copy", "copy", GXcopy},
{"andInverted", "andInverted", GXandInverted},
{"noop", "noop", GXnoop},
{"xor", "xor", GXxor},
{"or", "or", GXor},
{"nor", "nor", GXnor},
{"equiv", "equiv", GXequiv},
{"invert", "invert", GXinvert},
{"orReverse", "orReverse", GXorReverse},
{"copyInverted", "copyInverted", GXcopyInverted},
{"orInverted", "orInverted", GXorInverted},
{"nand", "nand", GXnand},
{"set", "set", GXset}
};
XgcStuff FunctionStuff = {
{"Function","function",NUM_FUNCTIONS,4},
FunctionData
};
static XgcData TestData[NUM_TESTS] = {
{"Copy Area", "CopyArea", CopyArea},
{"Copy Plane", "CopyPlane", CopyPlane},
{"Points", "PolyPoint", PolyPoint},
{"Lines", "PolyLine", PolyLine},
{"Segments", "PolySegment", PolySegment},
{"Rectangles", "PolyRectangle", PolyRectangle},
{"Arcs", "PolyArc", PolyArc},
{"(Filled Polygons)", "FillPolygon", FillPolygon},
{"Filled Rectangles", "PolyFillRect", PolyFillRect},
{"Filled Arcs", "PolyFillArc", PolyFillArc},
{"Put Image", "PutImage", PutImage},
{"(Get Image)", "GetImage", GetImage},
{"Text 8", "PolyText8", PolyText8},
{"Image Text 8", "ImageText8", ImageText8},
{"Text 16", "PolyText16", PolyText16},
{"Image Text 16", "ImageText16", ImageText16}
};
XgcStuff TestStuff = {
{"Test","test",NUM_TESTS,2},
TestData
};
static XgcData LinestyleData[NUM_LINESTYLES] = {
{"Solid", "Solid", LineSolid},
{"OnOffDash", "OnOffDash", LineOnOffDash},
{"DoubleDash", "DoubleDash", LineDoubleDash}
};
XgcStuff LinestyleStuff = {
{"LineStyle","linestyle",NUM_LINESTYLES,0},
LinestyleData
};
static XgcData CapstyleData[NUM_CAPSTYLES] = {
{"NotLast", "NotLast", CapNotLast},
{"Butt", "Butt", CapButt},
{"Round", "Round", CapRound},
{"Projecting", "Projecting", CapProjecting}
};
XgcStuff CapstyleStuff = {
{"CapStyle","capstyle",NUM_CAPSTYLES,2},
CapstyleData
};
static XgcData JoinstyleData[NUM_JOINSTYLES] = {
{"Miter", "Miter", JoinMiter},
{"Round", "Round", JoinRound},
{"Bevel", "Bevel", JoinBevel}
};
XgcStuff JoinstyleStuff = {
{"JoinStyle","joinstyle",NUM_JOINSTYLES,0},
JoinstyleData
};
static XgcData FillstyleData[NUM_FILLSTYLES] = {
{"Solid", "Solid", FillSolid},
{"Tiled", "Tiled", FillTiled},
{"Stippled", "Stippled", FillStippled},
{"OpaqueStippled", "OpaqueStippled", FillOpaqueStippled}
};
XgcStuff FillstyleStuff = {
{"FillStyle","fillstyle",NUM_FILLSTYLES,2},
FillstyleData
};
static XgcData FillruleData[NUM_FILLRULES] = {
{"EvenOdd", "EvenOdd", EvenOddRule},
{"Winding", "Winding", WindingRule}
};
XgcStuff FillruleStuff = {
{"FillRule","fillrule",NUM_FILLRULES,0},
FillruleData
};
static XgcData ArcmodeData[NUM_ARCMODES] = {
{"Chord", "Chord", ArcChord},
{"PieSlice", "PieSlice", ArcPieSlice}
};
XgcStuff ArcmodeStuff = {
{"ArcMode","arcmode",NUM_ARCMODES,0},
ArcmodeData
};
static XgcStuff *Everything[8] = {
&FunctionStuff,
&LinestyleStuff,
&CapstyleStuff,
&JoinstyleStuff,
&FillstyleStuff,
&FillruleStuff,
&ArcmodeStuff,
&TestStuff
};
#ifdef notdef
int fildes[2];
FILE *outend;
#endif
XStuff X;
Boolean recording = FALSE;
XtAppContext appcontext;
static Atom wm_delete_window;
static XtActionsRec actions[] = {
{"quit", quitAction}
};
static Widget bigdaddy;
Widget topform;
Widget GCform;
static Widget Testform;
Widget testchoiceform;
ChoiceDesc *testchoicedesc;
static Widget commandform;
Widget test;
Widget result;
static Widget runbutton;
static Widget clearbutton;
Widget recordbutton;
static Widget playbackbutton;
static Widget keyinputbutton;
static Widget GCchoices[NUMCHOICES];
ChoiceDesc *GCdescs[NUMCHOICES];
Widget planemaskchoice;
Widget dashlistchoice;
static Widget linewidthchoice;
Widget linewidthtext;
static Widget fontchoice;
Widget fonttext;
static Widget foregroundchoice;
Widget foregroundtext;
static Widget backgroundchoice;
Widget backgroundtext;
static Widget percentchoice;
int
main(int argc, char *argv[])
{
static Arg shellargs[] = {
{XtNinput, (XtArgVal) True}
};
static Arg testformargs[] = {
{XtNfromVert, (XtArgVal) NULL}
};
static Arg commandformargs[] = {
{XtNfromVert, (XtArgVal) NULL},
{XtNfromHoriz, (XtArgVal) NULL}
};
static Arg testargs[] = {
{XtNheight, (XtArgVal) 400},
{XtNwidth, (XtArgVal) 400},
{XtNfromHoriz, (XtArgVal) NULL}
};
static Arg resultargs[] = {
{XtNheight, (XtArgVal) 50},
{XtNwidth, (XtArgVal) 400},
{XtNfromHoriz, (XtArgVal) NULL},
{XtNfromVert, (XtArgVal) NULL}
};
static Arg gcchoiceargs[] = {
{XtNfromVert, (XtArgVal) NULL},
{XtNfromHoriz, (XtArgVal) NULL},
{XtNborderWidth, (XtArgVal) 0}
};
static Arg testchoiceargs[] = {
{XtNborderWidth, (XtArgVal) 0}
};
int i;
#ifdef notdef
pipe(fildes);
outend = fdopen(fildes[0],"r");
#endif
XtSetLanguageProc(NULL, (XtLanguageProc) NULL, NULL);
bigdaddy = XtAppInitialize(&appcontext, "Xgc", (XrmOptionDescList) NULL,
(Cardinal) 0, &argc, argv, (String *) NULL,
shellargs, XtNumber(shellargs));
X.dpy = XtDisplay(bigdaddy);
XtAppAddActions(appcontext, actions, XtNumber(actions));
XtOverrideTranslations
(bigdaddy, XtParseTranslationTable("<Message>WM_PROTOCOLS: quit()"));
X.scr = DefaultScreenOfDisplay(X.dpy);
X.gc = XCreateGC(X.dpy,RootWindowOfScreen(X.scr),0,(XGCValues *) NULL);
X.miscgc = XCreateGC(X.dpy,RootWindowOfScreen(X.scr),0,(XGCValues *) NULL);
set_foreground_and_background();
topform = XtCreateManagedWidget("topform",formWidgetClass,bigdaddy,
NULL,0);
GCform = XtCreateManagedWidget("GCform",formWidgetClass,topform,
NULL,0);
for (i=0;i<NUMCHOICES;++i) {
if (i==0)
gcchoiceargs[0].value = (XtArgVal) NULL;
else
gcchoiceargs[0].value = (XtArgVal) GCchoices[i-1];
GCchoices[i] = XtCreateManagedWidget(Everything[i]->choice.text,
formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
GCdescs[i] = create_choice(GCchoices[i],Everything[i]);
}
gcchoiceargs[0].value = (XtArgVal) GCchoices[NUMCHOICES-1];
planemaskchoice = XtCreateManagedWidget("planemask",formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
create_planemask_choice(planemaskchoice);
gcchoiceargs[0].value = (XtArgVal) planemaskchoice;
dashlistchoice = XtCreateManagedWidget("dashlist",formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
create_dashlist_choice(dashlistchoice);
gcchoiceargs[0].value = (XtArgVal) dashlistchoice;
linewidthchoice = XtCreateManagedWidget("linewidth",formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
linewidthtext = create_text_choice(linewidthchoice,TLineWidth,2,30);
gcchoiceargs[0].value = (XtArgVal) linewidthchoice;
fontchoice = XtCreateManagedWidget("font",formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
fonttext = create_text_choice(fontchoice,TFont,80,300);
gcchoiceargs[0].value = (XtArgVal) fontchoice;
foregroundchoice = XtCreateManagedWidget("foreground",formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
foregroundtext = create_text_choice(foregroundchoice,TForeground,9,50);
gcchoiceargs[1].value = (XtArgVal) foregroundchoice;
backgroundchoice = XtCreateManagedWidget("background",formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
backgroundtext = create_text_choice(backgroundchoice,TBackground,9,50);
gcchoiceargs[1].value = (XtArgVal) NULL;
gcchoiceargs[0].value = (XtArgVal) foregroundchoice;
percentchoice = XtCreateManagedWidget("testpercent",formWidgetClass,GCform,
gcchoiceargs,XtNumber(gcchoiceargs));
X.percent = 1.0;
create_testfrac_choice(percentchoice);
line_up_labels(GCdescs,(int) XtNumber(GCdescs));
testformargs[0].value = (XtArgVal) GCform;
Testform = XtCreateManagedWidget("Testform",formWidgetClass,topform,
testformargs,XtNumber(testformargs));
testchoiceform = XtCreateManagedWidget("testchoiceform",formWidgetClass,
Testform,testchoiceargs,XtNumber(testchoiceargs));
testchoicedesc = create_choice(testchoiceform,Everything[CTest]);
commandformargs[0].value = (XtArgVal) GCform;
commandformargs[1].value = (XtArgVal) Testform;
commandform = XtCreateManagedWidget("commandform",formWidgetClass,topform,
commandformargs,XtNumber(commandformargs));
fill_up_commandform(commandform);
testargs[2].value = (XtArgVal) GCform;
test = XtCreateManagedWidget("test",widgetClass,topform,
testargs,XtNumber(testargs));
resultargs[2].value = (XtArgVal) GCform;
resultargs[3].value = (XtArgVal) test;
result = XtCreateManagedWidget("result",asciiTextWidgetClass,topform,
resultargs,XtNumber(resultargs));
XtRealizeWidget(bigdaddy);
X.win = XtWindow(test);
X.tile = XCreatePixmap(X.dpy,X.win,tile_width,tile_height,
DefaultDepthOfScreen(X.scr));
X.tile = XCreatePixmapFromBitmapData(X.dpy,X.win,
(char *)tile_bits,tile_width,
tile_height,Black,White,
DefaultDepthOfScreen(X.scr));
X.stipple = XCreateBitmapFromData(X.dpy,X.win,(char *)tile_bits,tile_width,
tile_height);
XSetStipple(X.dpy,X.gc,X.stipple);
XSetStipple(X.dpy,X.miscgc,X.stipple);
GC_change_foreground(X.foreground,TRUE);
GC_change_background(X.background,TRUE);
wm_delete_window = XInternAtom(X.dpy, "WM_DELETE_WINDOW", False);
(void) XSetWMProtocols(X.dpy, XtWindow(bigdaddy), &wm_delete_window, 1);
choose_defaults(GCdescs,(int)XtNumber(GCdescs));
choose_defaults(&testchoicedesc,1);
XtAppMainLoop(appcontext);
return 0;
}
static void
fill_up_commandform(Widget w)
{
static XtCallbackRec runcallbacklist[] = {
{(XtCallbackProc) run_test, NULL},
{NULL, NULL}
};
static XtCallbackRec quitcallbacklist[] = {
{(XtCallbackProc) quit, NULL},
{NULL, NULL}
};
static XtCallbackRec clearcallbacklist[] = {
{(XtCallbackProc) clear_test_window, NULL},
{(XtCallbackProc) clear_result_window, NULL},
{NULL, NULL}
};
static XtCallbackRec playbackcallbacklist[] = {
{(XtCallbackProc) start_playback, NULL},
{NULL, NULL}
};
static XtCallbackRec keyinputcallbacklist[] = {
{(XtCallbackProc) read_from_keyboard, NULL},
{NULL, NULL}
};
static XtCallbackRec recordcallbacklist[] = {
{(XtCallbackProc) toggle_recordbutton, NULL},
{NULL, NULL}
};
static Arg runargs[] = {
{XtNcallback, (XtArgVal) NULL}
};
static Arg clearargs[] = {
{XtNcallback, (XtArgVal) NULL},
{XtNfromVert, (XtArgVal) NULL},
{XtNvertDistance,(XtArgVal) 10}
};
static Arg recordargs[] = {
{XtNcallback, (XtArgVal) NULL},
{XtNfromVert, (XtArgVal) NULL},
{XtNvertDistance,(XtArgVal) 10},
{XtNresizable, (XtArgVal) True}
};
static Arg playbackargs[] = {
{XtNcallback, (XtArgVal) NULL},
{XtNfromVert, (XtArgVal) NULL}
};
static Arg keyinputargs[] = {
{XtNcallback, (XtArgVal) NULL},
{XtNfromVert, (XtArgVal) NULL}
};
static Arg quitargs[] = {
{XtNcallback, (XtArgVal) NULL},
{XtNfromVert, (XtArgVal) NULL},
{XtNvertDistance,(XtArgVal) 10}
};
runargs[0].value = (XtArgVal) runcallbacklist;
runbutton = XtCreateManagedWidget("Run",commandWidgetClass,
w,runargs,XtNumber(runargs));
clearargs[0].value = (XtArgVal) clearcallbacklist;
clearargs[1].value = (XtArgVal) runbutton;
clearbutton = XtCreateManagedWidget("Clear window",commandWidgetClass,
w,clearargs,XtNumber(clearargs));
recordargs[0].value = (XtArgVal) recordcallbacklist;
recordargs[1].value = (XtArgVal) clearbutton;
recordbutton = XtCreateManagedWidget("Record",commandWidgetClass,
w,recordargs,XtNumber(recordargs));
playbackargs[0].value = (XtArgVal) playbackcallbacklist;
playbackargs[1].value = (XtArgVal) recordbutton;
playbackbutton = XtCreateManagedWidget("Playback",commandWidgetClass,
w,playbackargs,XtNumber(playbackargs));
keyinputargs[0].value = (XtArgVal) keyinputcallbacklist;
keyinputargs[1].value = (XtArgVal) playbackbutton;
keyinputbutton = XtCreateManagedWidget("Read Input",commandWidgetClass,
w,keyinputargs,XtNumber(keyinputargs));
quitargs[0].value = (XtArgVal) quitcallbacklist;
quitargs[1].value = (XtArgVal) keyinputbutton;
(void) XtCreateManagedWidget("Quit",commandWidgetClass,
w,quitargs,XtNumber(quitargs));
}
static void
quit(void)
{
close_file_if_recording();
exit(0);
}
static void quitAction(Widget w, XEvent *e, String *p, Cardinal *n)
{
if (e->type == ClientMessage && e->xclient.data.l[0] != wm_delete_window)
XBell(XtDisplay(w), 0);
else
quit();
}
static void
clear_test_window(void)
{
XClearWindow(X.dpy,XtWindow(test));
}
static void
clear_result_window(void)
{
set_text(result, "");
}
static void
set_foreground_and_background(void)
{
X.gcv.foreground = X.foreground = 0;
X.gcv.background = X.background = 0xffffffff;
X.fontname = "6x10";
GC_change_font(X.fontname,FALSE);
}