--- /dev/null
+#import "GnuView.h"
+
+
+@implementation GnuView
+
+static NXCoord xsize= NEXT_XMAX;
+static NXCoord ysize= NEXT_YMAX;
+
+static int printing;
+static void setprintsize();
+
+- initFrame: (NXRect *)rects
+{
+ [super initFrame:rects];
+
+ PSstring = NULL;
+ [self display];
+
+ return self;
+}
+
+
+ /* This is here to fix NeXT bug # 21973: failure to free D.O. memory */
+ /* Note: personally I don't think this fixes it. */
+- free
+{
+ if (PSstring) free(PSstring);
+ [super free];
+
+ return self;
+
+}
+
+- executePS:(char *) PStext
+{
+ if (PSstring) free(PSstring);
+ PSstring = PStext;
+
+ [window makeKeyAndOrderFront:self];
+
+ [self display];
+
+ return self;
+}
+
+
+- drawSelf:(const NXRect *) rects : (int) rectCount
+{
+ DPSContext d;
+
+ d = DPSGetCurrentContext();
+
+ if (!printing) {
+ /* Clear Screen */
+ PSsetgray(NX_WHITE);
+ NXRectFill(&bounds);
+ /* scale to gnuplot coords */
+ [self setDrawSize:xsize:ysize];
+ }
+ else {
+ setprintsize();
+ }
+
+ if (PSstring) DPSWritePostScript(d, PSstring, strlen(PSstring));
+
+ DPSFlushContext(d);
+
+ return self;
+}
+
+
+- printPSCode: sender
+{
+ printing = 1;
+ [super printPSCode:sender];
+ printing = 0;
+
+ return self;
+}
+
+static void setprintsize()
+{
+ DPSContext d;
+ NXRect *paperRect;
+ float width, height;
+ id prInfo;
+ float xscale, yscale;
+
+ d = DPSGetCurrentContext();
+ prInfo = [NXApp printInfo];
+ paperRect = (NXRect *) [prInfo paperRect];
+
+ width = paperRect->size.width;
+ height = paperRect->size.height;
+
+ /* Leave margins on paper */
+
+ DPSPrintf(d, "grestore\ngrestore\ngrestore\n");
+
+
+ if ([prInfo orientation] == NX_LANDSCAPE) {
+ DPSPrintf(d, "-90 rotate\n");
+ DPSPrintf(d, "%g 0 translate\n", -1 * paperRect->size.width);
+ DPSPrintf(d, "0 %g translate\n", paperRect->size.height/100);
+
+ xscale = width/NEXT_XMAX*0.95;
+ yscale = height/NEXT_YMAX*0.9;
+ DPSPrintf(d, "%g %g scale\n", xscale, yscale);
+ }
+ else {
+ xscale = width/NEXT_XMAX*0.95;
+ yscale = height/NEXT_YMAX*0.95;
+ DPSPrintf(d, "%g %g scale\n", xscale, yscale);
+ DPSPrintf(d, "0 %g translate\n", paperRect->size.height/100);
+ }
+
+ DPSPrintf(d, "gsave\ngsave\n");
+
+ DPSFlushContext(d);
+
+ return;
+}
+
+
+
+@end
+
+