summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/window/suntools.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
commit487ca4806cc046076293cf6cc5fbba0db282bac7 (patch)
tree847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/web2c/window/suntools.c
parenta3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff)
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/window/suntools.c')
-rw-r--r--Build/source/texk/web2c/window/suntools.c214
1 files changed, 214 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/window/suntools.c b/Build/source/texk/web2c/window/suntools.c
new file mode 100644
index 00000000000..b0cf48f0af1
--- /dev/null
+++ b/Build/source/texk/web2c/window/suntools.c
@@ -0,0 +1,214 @@
+/* Link this to sun.c if you are running on a SunView system */
+
+/*
+ * author = "Pierre MacKay (from the original by Paul Richards)"
+ * version = "0.5",
+ * date = "5 May 1991 - June 1992"
+ * filename = "sun_sunview.c",
+ * contact = "Pierre MacKay",
+ * email = "mackay@cs.washington.edu"
+ * Graphics window interface to Metafont for Suns running
+ * SunView (Sun Unix release 3.n)
+ * This code is essentially a translation from the old
+ * sun.c which used <suntool/gfxsw.h>. The model for the
+ * translation is the example in Appendix C (C.2.) of the
+ * Sunview 1 Programmer's guide as applied to bouncedemo.c
+ * There are nice additional benefits, such as a moveable
+ * and scalable graphics window, and the chance to see
+ * the controlling window while METAFONT is at work
+ *
+ * Destroy checking is bogus, and SunView does not clean up the mess
+ * if you "quit" from the pulldown menu. You will be left with
+ * an hysterical orphaned process screaming for a window that isn't
+ * there. You will have to go elsewhere and KILL that process.
+ * Otherwise it seems clean.
+ *
+ * For the moment this and the XView interface seem to be
+ * mutually exclusive, since they use library routines with
+ * the same names, which mightily confuses the loader.
+ * It doesn't help much to change the name of MFTERM since
+ * XView wants to name its own terminal "sun" just like
+ * the SunView terminal
+ */
+
+#define EXTERN extern
+#include "../mfd.h"
+
+#undef _POSIX_SOURCE
+#ifdef SUNTOOLSWIN
+
+/* <sundev/cg9reg.h> wants to have a field named `reset'. Since we
+ don't need the WEB(2C) reset, no problem. */
+#undef reset
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <suntool/sunview.h>
+#include <suntool/canvas.h>
+
+static void repaint_proc();
+static void resize_proc();
+
+static Notify_value mf_notice_destroy();
+extern Notify_error notify_dispatch();
+
+static int destroy_ready; /* could be used for tighter control */
+
+/*
+ * global handle on the graphics subwindow
+ */
+
+struct MFsubwindow {
+ int mf_flags;
+#define MF_RESTART 0x01
+ struct pixwin *mf_pixwin;
+ struct rect mf_rect;
+ } sun_mf_subwin; /* Make sure that names storage is allocated. */
+
+static struct MFsubwindow *metafont_sw = &sun_mf_subwin; /* window handle */
+
+/*
+ * Gray background for graphics area
+ */
+
+static short mf_graybackground_image[] = {0x5555, 0xaaaa};
+ mpr_static(mf_sunview_gray_bkgr, 2, 2, 1, mf_graybackground_image);
+
+
+Rect *rect;
+Frame frame;
+Canvas canvas;
+Pixwin *pw;
+
+/*
+ * init_screen: boolean; return true if window operations legal
+ */
+
+int
+mf_sun_initscreen()
+{
+ frame = window_create(NULL,FRAME,
+ FRAME_LABEL, "METAFONT",
+ FRAME_SHOW_LABEL, TRUE,
+ WIN_ERROR_MSG, "! Window access requires METAFONT to run under suntools\n",
+ 0);
+ canvas = window_create(frame, CANVAS,
+ CANVAS_RESIZE_PROC, resize_proc,
+ CANVAS_FAST_MONO, TRUE,
+ WIN_ERROR_MSG, "Can't creat canvas",
+ 0);
+ pw = canvas_pixwin(canvas);
+
+ metafont_sw->mf_pixwin = canvas_pixwin(canvas);
+
+ /* interpose a destroy procedure so we can shut down cleanly */
+ (void) notify_interpose_destroy_func(frame, mf_notice_destroy);
+
+ /*
+ * Instead of using window_main_loop, just show the frame.
+ * Metafont's procedures will be in control, not the notifier.
+ */
+ window_set(frame,WIN_SHOW, TRUE, 0);
+
+ rect = (Rect *)window_get(canvas, WIN_RECT); /* Get current dimensions */
+ pw_replrop(pw,
+ 0, 0,
+ rect->r_width,
+ rect->r_height,
+ PIX_SRC,
+ &mf_sunview_gray_bkgr, 0, 0); /* clear subwindow */
+
+ return(1); /* Caller expects a TRUE value */
+}
+
+/*
+ * updatescreen; -- just make sure screen is ready to view
+ */
+
+void
+mf_sun_updatescreen()
+{
+ (void)notify_dispatch();
+/* if (destroy_ready != 0) return; */
+ rect = (Rect *)window_get(canvas, WIN_RECT); /* Get current dimensions */
+ if (metafont_sw->mf_flags & MF_RESTART) {
+ metafont_sw->mf_flags &= ~MF_RESTART;
+ pw_replrop(pw,
+ 0, 0,
+ rect->r_width,
+ rect->r_height,
+ PIX_SRC,
+ &mf_sunview_gray_bkgr, 0, 0); /* clear subwindow */
+ }
+}
+
+/*
+ * blankrectangle: reset rectangle bounded by ([left,right],[top,bottom])
+ * to background color
+ */
+
+void
+mf_sun_blankrectangle P4C(screencol, left,
+ screencol, right,
+ screenrow, top,
+ screenrow, bottom)
+{
+ pw_writebackground(pw, left, top,
+ right-left+1, bottom-top+1, PIX_CLR);
+}
+
+/*
+ * paintrow -- paint "row" starting with color "init_color", up to next
+ * transition specified by "transition_vector", switch colors,
+ * and continue for "vector_size" transitions.
+ */
+
+void
+mf_sun_paintrow P4C(screenrow, row,
+ pixelcolor, init_color,
+ transspec, transition_vector,
+ screencol, vector_size)
+{
+ register col;
+ register color;
+
+ (void)notify_dispatch();
+ color = (init_color == 0)? 0 : 1;
+
+ do {
+ col = *transition_vector++;
+ pw_vector(pw,
+ col, row, (*transition_vector)-1, row,
+ PIX_SRC, color);
+ color = 1 - color;
+ } while (--vector_size);
+}
+
+static void
+repaint_proc( /* Ignore args */ )
+{
+ /* if repainting is required, just restart */
+ metafont_sw->mf_flags |= MF_RESTART;
+}
+
+static void
+resize_proc( /* Ignore args */ )
+{
+ metafont_sw->mf_flags |= MF_RESTART;
+}
+
+static Notify_value
+mf_notice_destroy(frame, status)
+ Frame frame;
+ Destroy_status status;
+{
+ if (status != DESTROY_CHECKING) {
+ destroy_ready = TRUE;
+ (void)notify_stop();
+ }
+ return(notify_next_destroy_func(frame,status));
+}
+
+#else
+int sunview_dummy;
+#endif /* SUNTOOLSWIN */