diff options
Diffstat (limited to 'Build/source/texk/web2c/window/suntools.c')
-rw-r--r-- | Build/source/texk/web2c/window/suntools.c | 214 |
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 */ |