|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T x
Length: 7443 (0x1d13) Types: TextFile Names: »x11-Xt.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦c319c2751⟧ »unix3.0/TeX3.0.tar.Z« └─⟦036c765ac⟧ └─⟦this⟧ »TeX3.0/mf/MFwindow/x11-Xt.c«
/* * X11 window interface for Metafont, using Xt. * (rusty@garnet.berkeley.edu) */ #define EXTERN extern #include "../mfd.h" #ifdef X11WIN #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Intrinsic.h> #include <X11/StringDefs.h> # define PLANE 0 static int mf_defwidth = 0; static int mf_defheight = 0; static Display *mf_display; static Window mf_window; static Pixmap mf_pixmap; static XtAppContext mf_app; static GC mf_dgc; /* draw gc */ static GC mf_egc; /* erase gc */ static GC mf_cgc; /* copy plane gc */ static Pixel mf_fg, mf_bg; static unsigned int mf_width, mf_height; static Boolean mf_mapped; static int mf_max_x, mf_max_y; static int mf_min_x, mf_min_y; static XtResource mf_resources[] = { { "width", "Width", XtRInt, sizeof(int), (Cardinal) &mf_width, XtRInt, (caddr_t) &mf_defwidth }, { "height", "Height", XtRInt, sizeof(int), (Cardinal) &mf_height, XtRInt, (caddr_t) &mf_defheight }, { "foreground", "Foreground", XtRPixel, sizeof(Pixel), (Cardinal) &mf_fg, XtRString, (caddr_t) "Black" }, { "background", "Background", XtRPixel, sizeof(Pixel), (Cardinal) &mf_bg, XtRString, (caddr_t) "White" }, }; static XrmOptionDescRec mf_optiondesclist[] = { {"-width", "width", XrmoptionSepArg, (caddr_t) NULL}, {"-height", "height", XrmoptionSepArg, (caddr_t) NULL}, {"-fg", "foreground", XrmoptionSepArg, (caddr_t) NULL}, {"-bg", "background", XrmoptionSepArg, (caddr_t) NULL}, }; /* return 1 if display opened successfully, else 0 */ int mf_x11_initscreen() { extern void mf_repaint(); extern void mf_mapstatus(); extern void mf_newpixmap(); XSetWindowAttributes xwa; Widget mf_toplevel; Widget mf_canvas; XGCValues gcv; Arg args[1]; int mf_argc; char *mf_argv[2]; mf_argv[0] = "mf"; mf_argv[1] = NULL; mf_argc = 1; mf_toplevel = XtInitialize("mf", "Metafont", mf_optiondesclist, XtNumber(mf_optiondesclist), &mf_argc, mf_argv); XtGetApplicationResources(mf_toplevel, 0, mf_resources, XtNumber(mf_resources), NULL, 0 ); if (mf_argc != 1) { (void) fprintf(stderr, "Usage: %s\n", mf_argv[0]); exit(1); } /* * if nothing specified in their resources/.Xdefaults * then use the values of metafont's "screen". */ if (mf_width == 0) mf_width = screenwidth; if (mf_height == 0) mf_height = screendepth; mf_canvas = XtCreateManagedWidget("canvas", widgetClass, mf_toplevel, NULL, 0); XtSetArg(args[0], XtNwidth, mf_width); XtSetValues(mf_canvas, args, 1); XtSetArg(args[0], XtNheight, mf_height); XtSetValues(mf_canvas, args, 1); /* for mf_x11_updatescreen() */ mf_app = XtWidgetToApplicationContext(mf_canvas); XtAddEventHandler(mf_canvas, (Cardinal) ExposureMask, True, mf_repaint, NULL); XtAddEventHandler(mf_canvas, (Cardinal) StructureNotifyMask, True, mf_mapstatus, NULL); XtRealizeWidget(mf_toplevel); mf_display = XtDisplay(mf_canvas); mf_window = XtWindow(mf_canvas); /* * since metafont isn't your typical x window program that * sits in xt_main_loop, if the server supports backing store * and save unders this will help keep the output looking * nice. */ xwa.backing_store = Always; xwa.save_under = True; XChangeWindowAttributes(mf_display, mf_window, CWBackingStore|CWSaveUnder, &xwa); gcv.background = mf_bg; gcv.foreground = mf_fg; gcv.function = GXcopy; /* copy plane gc */ mf_cgc = XCreateGC(mf_display, mf_window, GCForeground|GCBackground|GCFunction, &gcv); mf_newpixmap(screenwidth > mf_width ? screenwidth : mf_width, screendepth > mf_height ? screendepth : mf_height); return(1); } /* make sure the screen is up to date */ void mf_x11_updatescreen() { extern void mf_redraw(); extern void mf_events(); XEvent event; mf_events(); mf_redraw(); # ifdef notdef printf("max_x=%d, min_x=%d, max_y=%d, min_y=%d\n", mf_max_x, mf_min_x, mf_max_y, mf_min_y); # endif notdef } void mf_x11_blankrectangle(left, right, top, bottom) screencol left, right; screenrow top, bottom; { extern void mf_events(); XFillRectangle(mf_display, mf_pixmap, mf_egc, (int) left, (int) top, (int) (right - left + 1), (int) (bottom - top + 1)); mf_events(); } void mf_x11_paintrow(row, init_color, tvect, vector_size) screenrow row; pixelcolor init_color; transspec tvect; register screencol vector_size; { extern void mf_events(); extern void mf_checkextent(); Pixel color; GC gc; int col; gc = (init_color == 0) ? mf_egc : mf_dgc; do { col = *tvect++; # ifdef MF_XT_DEBUG mf_checkextent(col, (*tvect -1), row); # endif /* MF_XT_DEBUG */ XDrawLine(mf_display, mf_pixmap, gc, col, (int) row, (int) (*tvect - 1), (int) row); gc = (gc == mf_egc) ? mf_dgc : mf_egc; } while (--vector_size > 0); mf_events(); } # ifdef MF_XT_DEBUG static void mf_checkextent(x1, x2, y) { if (x1 < mf_min_x) mf_min_x = x1; if (x1 > mf_max_x) mf_max_x = x1; if (x2 < mf_min_x) mf_min_x = x2; if (x2 > mf_max_x) mf_max_x = x2; if (y > mf_max_y) mf_max_y = y; if (y < mf_min_y) mf_min_y = y; } # endif /* MF_XT_DEBUG */ static void mf_events() { XEvent event; if (XtAppPending(mf_app) != 0) { while (XtAppPending(mf_app) != 0) { XtAppNextEvent(mf_app, &event); XtDispatchEvent(&event); } /* mf_redraw(); */ } } static void mf_newpixmap(width, height) unsigned int width, height; { XGCValues gcv; Pixmap newpixmap; /* * width == mf_width and height == mf_height * the first time mf_newpixmap() is called. */ if ((width < mf_width) && (height < mf_height)) return; newpixmap = XCreatePixmap(mf_display, mf_window, width, height, 1); gcv.background = 0; gcv.foreground = 1; if (mf_dgc != 0) XFreeGC(mf_display, mf_dgc); /* draw gc */ gcv.line_width = 1; mf_dgc = XCreateGC(mf_display, newpixmap, GCForeground|GCBackground|GCLineWidth, &gcv); if (mf_egc != 0) XFreeGC(mf_display, mf_egc); /* erase gc */ gcv.foreground = 0; mf_egc = XCreateGC(mf_display, newpixmap, GCForeground|GCBackground|GCLineWidth, &gcv); XFillRectangle(mf_display, newpixmap, mf_egc, 0, 0, width, height); if (mf_pixmap != 0) { XCopyArea(mf_display, mf_pixmap, newpixmap, mf_dgc, 0, 0, mf_width, mf_height, 0, 0); XFreePixmap(mf_display, mf_pixmap); } mf_pixmap = newpixmap; mf_width = width; mf_height = height; } /*ARGSUSED*/ static void mf_repaint(w, data, ev) Widget w; caddr_t data; XEvent *ev; { extern void mf_redraw(); if (! mf_mapped) return; if (ev == NULL) return; if (ev->type != Expose) return; /* we are a "simple application" */ if (ev->xexpose.count == 0) { XEvent event; /* skip all excess redraws */ while (XCheckTypedEvent(mf_display, Expose, &event) != False) continue; mf_redraw(); } } /*ARGSUSED*/ static void mf_mapstatus(w, data, ev) Widget w; caddr_t data; XEvent *ev; { extern void mf_redraw(); extern void mf_newpixmap(); if (ev->type == MapNotify) { mf_mapped = True; return; } if (ev->type == UnmapNotify) { mf_mapped = False; return; } if (ev->type == ConfigureNotify) { mf_newpixmap(ev->xconfigure.width, ev->xconfigure.height); mf_redraw(); return; } } static void mf_redraw() { XCopyPlane(mf_display, mf_pixmap, mf_window, mf_cgc, 0, 0, mf_width, mf_height, 0, 0, (unsigned long) 1); XFlush(mf_display); } #else int x11_dummy; #endif /* X11WIN */