home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!island!argv
- From: argv@island.uu.net (Dan Heller)
- Newsgroups: comp.sources.x
- Subject: v04i057: xtroff -- troff previewer for X11, Part12/18
- Message-ID: <891@island.uu.net>
- Date: 18 Jul 89 07:27:13 GMT
- Organization: Island Graphics, Marin County, California
- Lines: 1360
- Approved: island!argv@sun.com
-
- Submitted-by: Mark Moraes <moraes@ai.toronto.edu>
- Posting-number: Volume 4, Issue 57
- Archive-name: xtroff/part12
-
-
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 12 (of 18)."
- # Contents: xtroff/XtStuff/Menu.c xtroff/devpsc/bdfdit.awk
- # Wrapped by moraes@neat.ai on Thu Jul 13 20:55:18 1989
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'xtroff/XtStuff/Menu.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'xtroff/XtStuff/Menu.c'\"
- else
- echo shar: Extracting \"'xtroff/XtStuff/Menu.c'\" \(19435 characters\)
- sed "s/^X//" >'xtroff/XtStuff/Menu.c' <<'END_OF_FILE'
- X#ifndef lint
- Xstatic char rcsid[] = "$Header: Menu.c,v 1.3 88/06/01 02:22:16 moraes Exp $";
- X#endif lint
- X
- X/*
- X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
- X *
- X * All Rights Reserved
- X *
- X * Permission to use, copy, modify, and distribute this software and its
- X * documentation for any purpose and without fee is hereby granted,
- X * provided that the above copyright notice appear in all copies and that
- X * both that copyright notice and this permission notice appear in
- X * supporting documentation, and that the name of Digital Equipment
- X * Corporation not be used in advertising or publicity pertaining to
- X * distribution of the software without specific, written prior permission.
- X *
- X *
- X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- X * SOFTWARE.
- X */
- X/*
- X * Menu.c -
- X *
- X * Author: Robert P. Shen
- X * Malcolm Forbes
- X * Digital Equipment Corporation
- X * ESG Systems Engineering
- X *
- X * Date: February 1, 1988
- X */
- X
- X#include <X11/IntrinsicP.h>
- X#include <X11/StringDefs.h>
- X#include <X11/XawMisc.h>
- X#include <X11/Xmu.h>
- X#include "MenuP.h"
- X#include "MenuItem.h"
- X#include "CheckItem.h"
- X#include <X11/Label.h>
- X#include <ctype.h>
- X
- X/****************************************************************
- X *
- X * Menu Resources
- X *
- X ****************************************************************/
- X
- Xstatic XtOrientation init_orient = XtorientVertical;
- Xstatic XtResource resources[] = {
- X {XtNxMargin, XtCHSpace, XtRInt, sizeof(int),
- X XtOffset(MenuWidget, menu.x_margin), XtRString, "0"},
- X {XtNyMargin, XtCVSpace, XtRInt, sizeof(int),
- X XtOffset(MenuWidget, menu.y_margin), XtRString, "0"},
- X {XtNx, XtCPosition, XtRPosition, sizeof(Position),
- X XtOffset(MenuWidget,core.x),XtRString, "800"},
- X {XtNy, XtCPosition, XtRPosition, sizeof(Position),
- X XtOffset(MenuWidget,core.y),XtRString, "800"},
- X {XtNborder,"MyBorder",XtRPixel,sizeof(Pixel),
- X XtOffset(MenuWidget,core.border_pixel),XtRString, "Black"},
- X/*
- X {XtNborder,XtCBorderColor,XtRPixel,sizeof(Pixel),
- X XtOffset(MenuWidget,core.border_pixel),XtRString, "White"},
- X*/
- X {XtNmenuForeground, XtCForeground,XtRPixel, sizeof(Pixel),
- X XtOffset(MenuWidget,menu.menu_foreground_pixel),XtRString, "Black"},
- X {XtNcheckForeground, XtCForeground,XtRPixel, sizeof(Pixel),
- X XtOffset(MenuWidget,menu.check_foreground_pixel),XtRString, "Black"},
- X {XtNbackground, XtCBackground,XtRPixel, sizeof(Pixel),
- X XtOffset(MenuWidget,core.background_pixel),XtRString, "White"},
- X {XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension),
- X XtOffset(MenuWidget,core.border_width),XtRString, "2"},
- X {XtNorientation, XtCOrientation, XtROrientation, sizeof(XtOrientation),
- X XtOffset(MenuWidget,menu.orient),XtRString, "vertical"},
- X {XtNmenuItemsList, "MenuItemsList", XtRPointer, sizeof(MenuItems),
- X XtOffset(MenuWidget,menu.items),XtRPointer, NULL},
- X};
- X/****************************************************************
- X *
- X * Full class record constant
- X *
- X ****************************************************************/
- X
- Xstatic void Initialize();
- Xstatic void Realize();
- Xstatic void Resize();
- Xstatic Boolean SetValues();
- Xstatic XtGeometryResult GeometryManager();
- Xstatic void ChangeManaged();
- Xstatic void ClassInitialize();
- X
- XMenuClassRec menuClassRec = {
- X {
- X/* core_class fields */
- X /* superclass */ (WidgetClass) &compositeClassRec,
- X /* class_name */ "Menu",
- X /* widget_size */ sizeof(MenuRec),
- X /* class_initialize */ ClassInitialize,
- X /* class_part_init */ NULL,
- X /* class_inited */ FALSE,
- X /* initialize */ Initialize,
- X /* initialize_hook */ NULL,
- X /* realize */ Realize,
- X /* actions */ NULL,
- X /* num_actions */ 0,
- X /* resources */ resources,
- X /* num_resources */ XtNumber(resources),
- X /* xrm_class */ NULLQUARK,
- X /* compress_motion */ TRUE,
- X /* compress_exposure */ TRUE,
- X /* compress_enterleave*/ TRUE,
- X /* visible_interest */ FALSE,
- X /* destroy */ NULL,
- X /* resize */ Resize,
- X /* expose */ NULL,
- X /* set_values */ SetValues,
- X /* set_values_hook */ NULL,
- X /* set_values_almost */ NULL,
- X /* get_values_hook */ NULL,
- X /* accept_focus */ NULL,
- X /* version */ XtVersion,
- X /* callback_private */ NULL,
- X /* tm_table */ NULL,
- X /* query_geometry */ NULL,
- X /* display_accelerator */ XtInheritDisplayAccelerator,
- X /* extension */ NULL
- X },{
- X/* composite_class fields */
- X /* geometry_manager */ GeometryManager,
- X /* change_managed */ ChangeManaged,
- X /* insert_child */ NULL, /* Inherit from superclass */
- X /* delete_child */ NULL, /* Inherit from superclass */
- X },{
- X /* mumble */ 0 /* Make C compiler happy */
- X }
- X};
- X
- XWidgetClass menuWidgetClass = (WidgetClass)&menuClassRec;
- Xstatic Dimension no_resize_width, no_resize_height;
- X
- X
- X
- X
- Xstatic void CvtStringToOrientation();
- X
- Xstatic XrmQuark XrmQEvertical;
- Xstatic XrmQuark XrmQEhorizontal;
- X/* ARGSUSED */
- Xstatic void CvtStringToOrientation(args, pargs, fromVal, toVal)
- X XrmValuePtr args;
- X Cardinal pargs;
- X XrmValuePtr fromVal;
- X XrmValuePtr toVal;
- X{
- X static XtOrientation e;
- X XrmQuark q;
- X char *s = (char *) fromVal->addr;
- X char lowerName[1000];
- X int i;
- X
- X if (s == NULL) return;
- X
- X for (i=0; i<=strlen(s); i++) {
- X char c = s[i];
- X lowerName[i] = isupper(c) ? (char) tolower(c) : c;
- X }
- X
- X q = XrmStringToQuark(lowerName);
- X
- X toVal->size = sizeof(XtOrientation);
- X toVal->addr = (caddr_t) &e;
- X
- X if (q == XrmQEvertical) { e = XtorientVertical; return; }
- X if (q == XrmQEhorizontal) { e = XtorientHorizontal; return; }
- X
- X toVal->size = 0;
- X toVal->addr = NULL;
- X};
- X
- X/****************************************************************
- X *
- X * Private Routines
- X *
- X ****************************************************************/
- X
- Xstatic void ClassInitialize()
- X{
- X CompositeWidgetClass superclass;
- X MenuWidgetClass myclass;
- X
- X myclass = (MenuWidgetClass) menuWidgetClass;
- X superclass = (CompositeWidgetClass) myclass->core_class.superclass;
- X
- X /* Inherit insert_child and delete_child from Composite */
- X myclass->composite_class.insert_child =
- X superclass->composite_class.insert_child;
- X myclass->composite_class.delete_child =
- X superclass->composite_class.delete_child;
- X
- X XrmQEvertical = XrmStringToQuark("vertical");
- X XrmQEhorizontal = XrmStringToQuark("horizontal");
- X
- X XtAddConverter(XtRString, XtROrientation, CvtStringToOrientation,
- X NULL, (Cardinal)0 );
- X}
- X
- X/*
- X *
- X * Do a layout, either actually assigning positions, or just calculating size.
- X * Returns TRUE on success; FALSE if it couldn't make things fit.
- X *
- X */
- X
- Xstatic void horizontal_layout_plan(menuw, width, height, position)
- X MenuWidget menuw;
- X Dimension *width, *height;
- X{
- X Widget kid;
- X Dimension w, h;
- X Dimension child_w, child_h, x, y, x_margin, y_margin;
- X int i;
- X
- X /* Menu width and height */
- X w = x = child_w = x_margin = menuw->menu.x_margin;
- X h = y = child_h = y_margin = menuw->menu.y_margin;
- X
- X for (i = 0; i < menuw->composite.num_children; i++) {
- X kid = menuw->composite.children[i];
- X if (kid->core.managed) {
- X /* Compute menu width */
- X child_w = kid->core.width + 2*kid->core.border_width + x_margin;
- X AssignMax(child_h, kid->core.height);
- X w += child_w;
- X h = child_h + 2*kid->core.border_width+2* y_margin;
- X
- X if (position) {
- X
- X XtMoveWidget(kid, (int)x, (int)y);
- X XtResizeWidget(kid,kid->core.width,child_h,kid->core.border_width);
- X
- X }
- X x = w;
- X } /* if managed */
- X } /* for */
- X
- X *width = w;
- X *height = h;
- X
- X}
- X
- Xstatic void redeploy_kids(menuw)
- X MenuWidget menuw;
- X{
- X Widget kid;
- X int i;
- X Dimension menu_width, kid_width;
- X Dimension x, y;
- X Dimension x_margin, y_margin;
- X
- X menu_width = menuw->core.width;
- X x = x_margin = menuw->menu.x_margin;
- X y = y_margin = menuw->menu.y_margin;
- X
- X for (i = 0; i <menuw->composite.num_children; i++) {
- X kid = menuw->composite.children[i];
- X if (kid->core.managed) {
- X kid_width = menu_width - 2*kid->core.border_width - 2*x_margin;
- X/*
- X XtResizeWidget(kid,kid_width,kid->core.height,kid->core.border_width);
- X*/
- X XtMoveWidget(kid, (int)x, (int)y);
- X y += kid->core.height + 2*kid->core.border_width + y_margin;
- X }
- X }
- X}
- X
- X
- X/* ARGSUSED */
- Xstatic LayoutPlan(menuw, width, height, replyWidth, replyHeight, position)
- X MenuWidget menuw;
- X Dimension width, height;
- X Dimension *replyWidth, *replyHeight; /* RETURN */
- X Boolean position; /* actually reposition the windows? */
- X{
- X Cardinal i;
- X Dimension w, h; /* Width and height needed for menu panel */
- X Dimension x, y;
- X Dimension child_w, child_h;
- X Dimension x_margin, y_margin; /* Local copy of menuw->menu.x_margin */
- X Dimension hlayout_width, hlayout_height;
- X Widget kid; /* Current menu */
- X
- X /* Menu width and height */
- X w = x = x_margin = menuw->menu.x_margin;
- X h = y = y_margin = menuw->menu.y_margin;
- X
- X for (i = 0; i < menuw->composite.num_children; i++) {
- X kid = menuw->composite.children[i];
- X if (kid->core.managed) {
- X /* Compute menu width */
- X child_w = kid->core.width + 2*kid->core.border_width + 2*x_margin;
- X child_h = kid->core.height + 2*kid->core.border_width + y_margin;
- X AssignMax(w, child_w);
- X h += child_h + y_margin;
- X
- X if (position) {
- X
- X XtMoveWidget(kid, (int)x, (int)y);
- X XtResizeWidget(kid,(width-2*kid->core.border_width-2*x_margin),
- X kid->core.height,kid->core.border_width);
- X
- X }
- X y = h;
- X } /* if managed */
- X } /* for */
- X
- X h += y_margin;
- X
- X *replyWidth = Max(w, 1);
- X *replyHeight = Max(h, 1);
- X}
- X
- X/*
- X *
- X * Calculate preferred size, given constraining box
- X *
- X */
- X
- Xstatic Boolean PreferredSize(menuw, width, height, replyWidth, replyHeight)
- X MenuWidget menuw;
- X Dimension width, height;
- X Dimension *replyWidth, *replyHeight;
- X{
- X LayoutPlan(menuw, width, height, replyWidth, replyHeight, FALSE);
- X return ((*replyWidth <= width) && (*replyHeight <= height));
- X}
- X
- X/*
- X *
- X * Actually layout the menu panel
- X *
- X */
- X
- Xstatic void Resize(menuw)
- X MenuWidget menuw;
- X{
- X Widget kid;
- X Dimension junk, width, height;
- X
- X if (menuw->menu.orient == XtorientVertical) {
- X LayoutPlan((MenuWidget)menuw, menuw->core.width, menuw->core.height,
- X &junk, &junk, TRUE);
- X }
- X else if (menuw->menu.orient == XtorientHorizontal) {
- X horizontal_layout_plan (menuw, &width, &height, TRUE);
- X }
- X/*
- X redeploy_kids(w);
- X*/
- X} /* Resize */
- X
- X/*
- X *
- X * Try to do a new layout within the current width and height;
- X * if that fails try to do it within the box returned by PreferredSize.
- X *
- X * TryNewLayout just says if it's possible, and doesn't actually move the kids
- X */
- X
- Xstatic Boolean TryNewLayout(menuw)
- X MenuWidget menuw;
- X{
- X Dimension width, height, junk_w, junk_h;
- X
- X if (!PreferredSize(menuw, menuw->core.width, menuw->core.height, &width, &height))
- X (void) PreferredSize(menuw, width, height, &width, &height);
- X
- X if ((menuw->core.width == width) && (menuw->core.height == height)) {
- X /* Same size */
- X return (TRUE);
- X }
- X
- X /* let's see if our parent will go for a new size. */
- X switch (XtMakeResizeRequest((Widget) menuw, width, height, &width, &height)) {
- X
- X case XtGeometryYes:
- X return (TRUE);
- X
- X case XtGeometryNo:
- X if ((width <= menuw->core.width) && (height <= menuw->core.height))
- X return (TRUE);
- X else
- X return (FALSE);
- X
- X case XtGeometryAlmost:
- X if (! PreferredSize(menuw, width, height, &junk_w, &junk_h))
- X return (FALSE);
- X (void) XtMakeResizeRequest((Widget) menuw, width, height,
- X &width, &height);
- X return (TRUE);
- X }
- X}
- X
- X/*
- X *
- X * Geometry Manager
- X *
- X */
- X
- X/*ARGSUSED*/
- Xstatic XtGeometryResult GeometryManager(w, request, reply)
- X Widget w;
- X XtWidgetGeometry *request;
- X XtWidgetGeometry *reply; /* RETURN */
- X
- X{
- X Dimension width, height, borderWidth;
- X MenuWidget menuw;
- X
- X /* Position request always denied */
- X if (request->request_mode & (CWX | CWY))
- X return (XtGeometryNo);
- X
- X /* Size changes must see if the new size can be accomodated */
- X if (request->request_mode & (CWWidth | CWHeight | CWBorderWidth)) {
- X
- X /* Make all three fields in the request valid */
- X if ((request->request_mode & CWWidth) == 0)
- X request->width = w->core.width;
- X if ((request->request_mode & CWHeight) == 0)
- X request->height = w->core.height;
- X if ((request->request_mode & CWBorderWidth) == 0)
- X request->border_width = w->core.border_width;
- X
- X /* Save current size and set to new size */
- X width = w->core.width;
- X height = w->core.height;
- X borderWidth = w->core.border_width;
- X w->core.width = request->width;
- X w->core.height = request->height;
- X w->core.border_width = request->border_width;
- X
- X /* Decide if new layout works: (1) new menu is smaller,
- X (2) new menu fits in existing Menu, (3) Menu can be
- X expanded to allow new menu to fit */
- X
- X menuw = (MenuWidget) w->core.parent;
- X
- X/* whenever a child changes his geometry, we attempt to
- X * change ours to be the minimum enclosing size...
- X if (((request->width + request->border_width <= width + borderWidth) &&
- X (request->height + request->border_width <= height + borderWidth))
- X || PreferredSize(menuw, menuw->core.width, menuw->core.height, &junk, &junk)
- X || TryNewLayout(menuw)) {
- X */
- X if (TryNewLayout(menuw)) {
- X /* Fits in existing or new space, relayout */
- X Resize((Widget)menuw);
- X return (XtGeometryYes);
- X } else {
- X /* Cannot satisfy request, change back to original geometry */
- X w->core.width = width;
- X w->core.height = height;
- X w->core.border_width = borderWidth;
- X return (XtGeometryNo);
- X }
- X }; /* if any size changes requested */
- X
- X /* Any stacking changes don't make a difference, so allow if that's all */
- X return (XtGeometryYes);
- X}
- X
- Xstatic void ChangeManaged(w)
- X MenuWidget w;
- X{
- X Dimension hlayout_width, h_layout_height, kid_height;
- X Dimension x_margin, y_margin;
- X Dimension width, height;
- X
- X if (w->menu.orient == XtorientVertical)
- X {
- X
- X (void) TryNewLayout((MenuWidget)w);
- X
- X Resize(w);
- X/*
- X redeploy_kids(w);
- X*/
- X }
- X else if (w->menu.orient == XtorientHorizontal)
- X {
- X horizontal_layout_plan (w, &width, &height, FALSE);
- X switch (XtMakeResizeRequest((Widget)w, width, height, &width, &height))
- X {
- X case XtGeometryYes: break;
- X case XtGeometryNo: break;
- X case XtGeometryAlmost: break;
- X }
- X horizontal_layout_plan (w, &width, &height, TRUE);
- X }
- X}
- X
- X/* ARGSUSED */
- Xstatic void Initialize(request, new)
- X Widget request, new;
- X {
- X MenuWidget newmenuw = (MenuWidget)new;
- X Widget cmd;
- X MenuItems items;
- X int i, j;
- X/* char str[32]; */
- X/* static char check_pad[] = " "; */
- X/* static char space_pad[] = " "; */
- X
- X static Arg labelArgs[] = {
- X {XtNbackground, (XtArgVal) NULL},
- X {XtNforeground, (XtArgVal) NULL}
- X };
- X static Arg menuArgs[] = {
- X {XtNbackground, (XtArgVal) NULL},
- X {XtNforeground, (XtArgVal) NULL},
- X {XtNborderWidth, (XtArgVal) 0},
- X {XtNcallback, (XtArgVal) NULL}
- X };
- X static Arg checkArgs[] = {
- X {XtNbackground, (XtArgVal) NULL},
- X {XtNforeground, (XtArgVal) NULL},
- X {XtNborderWidth, (XtArgVal) 0},
- X {XtNcheckState, (XtArgVal) TRUE},
- X {XtNcallback, (XtArgVal) NULL}
- X };
- X static Arg uncheckArgs[] = {
- X {XtNbackground, (XtArgVal) NULL},
- X {XtNforeground, (XtArgVal) NULL},
- X {XtNborderWidth, (XtArgVal) 0},
- X {XtNcheckState, (XtArgVal) FALSE},
- X {XtNcallback, (XtArgVal) NULL}
- X };
- X
- X
- X/* ||| What are consequences of letting height, width be 0? If okay, then
- X Initialize can be NULL */
- X
- X if (newmenuw->core.width == 0)
- X newmenuw->core.width = ((newmenuw->menu.x_margin != 0)
- X ? newmenuw->menu.x_margin : 1); /* MOD */
- X if (newmenuw->core.height == 0)
- X newmenuw->core.height = ((newmenuw->menu.y_margin != 0)
- X ? newmenuw->menu.y_margin : 1); /* MOD */
- X
- X XtSetArg(labelArgs[0], XtNbackground,newmenuw->menu.menu_foreground_pixel);
- X XtSetArg(labelArgs[1], XtNforeground,newmenuw->core.background_pixel);
- X XtSetArg(menuArgs[0], XtNbackground,newmenuw->core.background_pixel);
- X XtSetArg(menuArgs[1],XtNforeground,newmenuw->menu.menu_foreground_pixel);
- X XtSetArg(checkArgs[0], XtNbackground, newmenuw->core.background_pixel);
- X XtSetArg(checkArgs[1],XtNforeground,newmenuw->menu.check_foreground_pixel);
- X XtSetArg(uncheckArgs[0], XtNbackground, newmenuw->core.background_pixel);
- X XtSetArg(uncheckArgs[1],XtNforeground,newmenuw->menu.check_foreground_pixel);
- X cmd = XtCreateManagedWidget (newmenuw->core.name,
- X labelWidgetClass, new,
- X labelArgs, XtNumber(labelArgs));
- X
- X if( newmenuw->menu.items )
- X {
- X XtCallbackList temprec;
- X
- X items = newmenuw->menu.items;
- X for (; items->proc; items++) { /* at least proc must exist! */
- X temprec = (XtCallbackList)XtMalloc(sizeof(XtCallbackRec)*2);
- X temprec->callback = items->proc;
- X temprec->closure = items->closure;
- X (temprec+1)->callback = NULL;
- X (temprec+1)->closure = NULL;
- X if (items->flags & (XtitemCheckable | XtitemIsChecked)) {
- X XtSetArg(checkArgs[4], XtNcallback, temprec);
- X XtSetArg(uncheckArgs[4], XtNcallback, temprec);
- X cmd = XtCreateManagedWidget (items->text,
- X checkitemWidgetClass, new,
- X (items->flags & XtitemIsChecked ?
- X (ArgList) checkArgs :
- X (ArgList) uncheckArgs),
- X (items->flags & XtitemIsChecked ?
- X XtNumber(checkArgs) :
- X XtNumber(uncheckArgs)));
- X
- X }
- X else {
- X XtSetArg(menuArgs[3], XtNcallback, temprec);
- X cmd = XtCreateManagedWidget (items->text,
- X menuitemWidgetClass, new,
- X (ArgList) menuArgs,
- X XtNumber(menuArgs));
- X }
- X XtSetSensitive (cmd, !(items->flags & XtitemUnselectable));
- X }
- X }
- X} /* Initialize */
- X
- X/* ||| Should Realize just return a modified mask and attributes? Or will some
- X of the other parameters change from class to class? */
- Xstatic void Realize(w, valueMask, attributes)
- X
- X register Widget w;
- X Mask *valueMask;
- X XSetWindowAttributes *attributes;
- X{
- X MenuWidget newmenuw = (MenuWidget)w;
- X
- X attributes->bit_gravity = NorthWestGravity;
- X *valueMask |= CWBitGravity;
- X
- X XtCreateWindow( w, (unsigned)InputOutput, (Visual *)CopyFromParent,
- X *valueMask, attributes);
- X} /* Realize */
- X
- X/*
- X *
- X * Set Values
- X *
- X */
- X
- X/* ARGSUSED */
- Xstatic Boolean SetValues (current, request, new, last)
- X Widget current, request, new;
- X Boolean last;
- X{
- X /* ||| Old code completely bogus, need background, etc. then relayout */
- X
- X /*XtSetValuesGeometryRequest( current, new, (XtWidgetGeometry *)NULL );*/
- X
- X /* ||| should handle XtGeometryAlmost */
- X
- X return (FALSE);
- X}
- END_OF_FILE
- if test 19435 -ne `wc -c <'xtroff/XtStuff/Menu.c'`; then
- echo shar: \"'xtroff/XtStuff/Menu.c'\" unpacked with wrong size!
- fi
- # end of 'xtroff/XtStuff/Menu.c'
- fi
- if test -f 'xtroff/devpsc/bdfdit.awk' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'xtroff/devpsc/bdfdit.awk'\"
- else
- echo shar: Extracting \"'xtroff/devpsc/bdfdit.awk'\" \(17215 characters\)
- sed "s/^X//" >'xtroff/devpsc/bdfdit.awk' <<'END_OF_FILE'
- X# devpsc/bdfdit.awk
- X#
- X# Copyright (c) 1988 Cray Research, Inc. All Rights Reserved.
- X#
- X# This awk(1) program serves two purposes. It helps convert
- X# X11 bdf font metrics files (bdf files) into ditroff
- X# font description files (as input to makedev), and it
- X# helps create the ditroff device description file (DESC) for
- X# bdf fonts.
- X#
- X
- XBEGIN {
- X SCALE = 5.0 # font width scale factor to
- X # achieve proper dynamic range
- X # (ditroff widths are <= 256)
- X
- X # file names for pieces. These are cat'ed together.
- X header = "temp.header" # comments and ligature list
- X spaces = "temp.spaces" # space widths and "charset" header
- X trailer = "temp.trailer"# actual character data
- X aux = "temp.aux"
- X
- X isspecial = 0
- X istext = 1
- X
- X# ligatures
- X
- X ligature["ff"] = "ff"
- X ligature["ffi"] = "Fi"
- X ligature["ffl"] = "Fl"
- X ligature["fi"] = "fi"
- X ligature["fl"] = "fl"
- X
- X# ditmap is a mapping from non-ascii bdf file character names
- X# (plus a few special ones) to DITROFF \( special codes.
- X# Note that some chars have more than one code (separated by spaces).
- X
- X ditmap[".ditspace"] = "\\^ \\| \\&"
- X ditmap["AE"] = "AE"
- X ditmap["Alpha"] = "*A"
- X ditmap["Beta"] = "*B"
- X ditmap["Chi"] = "*X"
- X ditmap["Delta"] = "*D"
- X ditmap["Epsilon"] = "*E"
- X ditmap["Eta"] = "*Y"
- X ditmap["Gamma"] = "*G"
- X ditmap["Iota"] = "*I"
- X ditmap["Kappa"] = "*K"
- X ditmap["Lambda"] = "*L"
- X ditmap["Lslash"] = "PL"
- X ditmap["Mu"] = "*M"
- X ditmap["Nu"] = "*N"
- X ditmap["OE"] = "OE"
- X ditmap["Omega"] = "*W"
- X ditmap["Omicron"] = "*O"
- X ditmap["Oslash"] = "O/"
- X ditmap["Phi"] = "*F"
- X ditmap["Pi"] = "*P"
- X ditmap["Psi"] = "*Q"
- X ditmap["Rho"] = "*R"
- X ditmap["Sigma"] = "*S"
- X ditmap["Tau"] = "*T"
- X ditmap["Theta"] = "*H"
- X ditmap["Upsilon"] = "*U"
- X ditmap["Xi"] = "*C"
- X ditmap["Zeta"] = "*Z"
- X ditmap["acute"] = "aa \\'"
- X ditmap["ae"] = "ae"
- X ditmap["aleph"] = "al"
- X ditmap["alpha"] = "*a"
- X ditmap["angle"] = "ag"
- X ditmap["angleleft"] = "l< L<"
- X ditmap["angleright"] = "r> R>"
- X ditmap["apple"] = "AL"
- X ditmap["approxequal"] = "~="
- X ditmap["arrowboth"] = "<>"
- X ditmap["arrowdbldown"] = "d="
- X ditmap["arrowdblboth"] = "io"
- X ditmap["arrowdblleft"] = "<: lh" # left double arrow (& hand)
- X ditmap["arrowdblright"] = ":> im rh" # right double arrow (& hand)
- X ditmap["arrowdblup"] = "u="
- X ditmap["arrowdown"] = "da"
- X ditmap["arrowleft"] = "<-"
- X ditmap["arrowright"] = "->"
- X ditmap["arrowup"] = "ua"
- X ditmap["asciicircum"] = "a^"
- X ditmap["asciitilde"] = "a~"
- X ditmap["asteriskmath"] = "**"
- X ditmap["bar"] = "or"
- X ditmap["beta"] = "*b"
- X# ditmap["br"] = "br" # box rule
- X# ditmap["bu"] = "bu" # bullet
- X# ditmap["bv"] = "bv" # bold vertical
- X# ditmap["bx"] = "bx" # box
- X ditmap["breve"] = "be"
- X ditmap["bullet"] = "bu"
- X ditmap["caron"] = "hc"
- X ditmap["cedilla"] = "cd"
- X ditmap["cent"] = "ct"
- X ditmap["chi"] = "*x"
- X ditmap["circumflex"] = "^"
- X ditmap["carriagereturn"] = "cr"
- X# ditmap["ci"] = "ci" # circle
- X ditmap["circlemultiply"] = "ax"
- X ditmap["circleplus"] = "a+"
- X ditmap["club"] = "Cc"
- X ditmap["congruent"] = "=~"
- X ditmap["copyrightserif"] = "co"
- X ditmap["dagger"] = "dg"
- X ditmap["daggerdbl"] = "dd"
- X ditmap["degree"] = "de"
- X ditmap["delta"] = "*d"
- X ditmap["diamond"] = "Cd"
- X ditmap["dieresis"] = "um .." # umlaut
- X ditmap["dotaccent"] = "dt"
- X ditmap["dotlessi"] = "ui"
- X ditmap["divide"] = "di"
- X ditmap["dotmath"] = "m."
- X ditmap["element"] = "mo"
- X ditmap["emdash"] = "em"
- X ditmap["emptyset"] = "es"
- X ditmap["endash"] = "en"
- X ditmap["epsilon"] = "*e"
- X ditmap["equal"] = "eq" ; mathonly["eq"] = "equal"
- X ditmap["equivalence"] = "=="
- X ditmap["eta"] = "*y"
- X ditmap["exclamdown"] = "!! I!"
- X ditmap["existential"] = "te"
- X ditmap["ff"] = "ff"
- X ditmap["ffi"] = "Fi"
- X ditmap["ffl"] = "Fl"
- X ditmap["fi"] = "fi"
- X ditmap["fl"] = "fl"
- X ditmap["florin"] = "$D"
- X ditmap["germandbls"] = "ss"
- X ditmap["gamma"] = "*g"
- X ditmap["gradient"] = "gr"
- X ditmap["grave"] = "ga \\`"
- X ditmap["greaterequal"] = ">="
- X ditmap["guillemotleft"] = "d<"
- X ditmap["guillemotright"] = "d>"
- X ditmap["guillmotleft"] = "d<"
- X ditmap["guillmotright"] = "d>"
- X ditmap["guilsinglleft"] = "l<"
- X ditmap["guilsinglright"] = "r>"
- X ditmap["heart"] = "bs Ch"
- X ditmap["hungarumlaut"] = "''"
- X ditmap["hyphen"] = "hy"
- X ditmap["infinity"] = "if"
- X ditmap["integral"] = "is"
- X# ditmap["lb"] = "lb" # left bot curly
- X# ditmap["lc"] = "lc" # left ceil
- X# ditmap["lf"] = "lf" # left floor
- X# ditmap["lk"] = "lk" # left center curly
- X ditmap["logicaland"] = "an la"
- X ditmap["logicalor"] = "lo"
- X ditmap["lozenge"] = "dm"
- X ditmap["intersection"] = "ca"
- X ditmap["iota"] = "*i"
- X ditmap["kappa"] = "*k"
- X ditmap["lambda"] = "*l"
- X ditmap["lessequal"] = "<="
- X ditmap["logicalnot"] = "no"
- X ditmap["lslash"] = "Pl"
- X ditmap["onequarter"] = "14"
- X ditmap["onehalf"] = "12"
- X ditmap["threequarters"] = "34"
- X ditmap["macron"] = "mc ma"
- X ditmap["minus"] = "\\- mi" ; mathonly["mi"] = "minus"
- X# ditmap["minus"] = "\\- mi"
- X ditmap["minute"] = "fm mt"
- X ditmap["mu"] = "*m"
- X ditmap["multiply"] = "mu"
- X ditmap["notelement"] = "!m"
- X ditmap["notsubset"] = "!s"
- X ditmap["notequal"] = "!="
- X ditmap["nu"] = "*n"
- X ditmap["ogonek"] = "og"
- X ditmap["oe"] = "oe"
- X ditmap["omega"] = "*w"
- X ditmap["omicron"] = "*o"
- X ditmap["oslash"] = "o/"
- X ditmap["onehalf"] = "12"
- X ditmap["onequarter"] = "14"
- X ditmap["paragraph"] = "pp"
- X ditmap["partialdiff"] = "pd"
- X ditmap["phi"] = "*f"
- X ditmap["pi"] = "*p"
- X ditmap["plus"] = "pl" ; mathonly["pl"] = "plus"
- X ditmap["plusminus"] = "+-"
- X ditmap["propersubset"] = "sb"
- X ditmap["propersuperset"] = "sp"
- X ditmap["proportional"] = "pt"
- X ditmap["psi"] = "*q"
- X ditmap["questiondown"] = "?? I?"
- X ditmap["quotedblbase"] = "bq"
- X ditmap["quotedblleft"] = "lq oq"
- X ditmap["quotedblright"] = "rq cq"
- X ditmap["quotesingle"] = "n'"
- X ditmap["radical"] = "sr"
- X ditmap["radicalex"] = "rn"
- X ditmap["reflexsubset"] = "ib"
- X ditmap["reflexsuperset"] = "ip"
- X ditmap["registerserif"] = "rg"
- X ditmap["rho"] = "*r"
- X ditmap["ring"] = "ri"
- X ditmap["second"] = "sd"
- X ditmap["section"] = "sc"
- X ditmap["sigma"] = "*s"
- X ditmap["sigma1"] = "ts"
- X ditmap["similar"] = "ap"
- X ditmap["slash"] = "sl"
- X ditmap["spade"] = "Cs"
- X ditmap["sterling"] = "ps po"
- X ditmap["suchthat"] = "cm"
- X ditmap["tau"] = "*t"
- X ditmap["therefore"] = "tf"
- X ditmap["theta"] = "*h"
- X ditmap["tilde"] = "~"
- X ditmap["trademarkserif"] = "tm"
- X ditmap["underscore"] = "ul \\_"
- X# ditmap["ul"] = "ul" # under rule
- X# ditmap["underscore"] = "\\_"
- X# ditmap["vr"] = "vr" # vertical rule
- X ditmap["union"] = "cu"
- X ditmap["universal"] = "fa"
- X ditmap["upsilon"] = "*u"
- X ditmap["xi"] = "*c"
- X ditmap["yen"] = "yn"
- X ditmap["yen"] = "yi yn $J"
- X ditmap["zeta"] = "*z"
- X ditmap["circle"] = "ci"
- X ditmap["square"] = "sq"
- X
- X# Additional troff characters. The mod to add these special
- X# characters to the bdf character set is needed.
- X
- X ditmap["box"] = "bx"
- X ditmap["boxrule"] = "br"
- X ditmap["rule"] = "ru"
- X ditmap["boldvertical"] = "bv"
- X ditmap["lefttopcurly"] = "lt"
- X ditmap["leftbotcurly"] = "lb"
- X ditmap["righttopcurly"] = "rt"
- X ditmap["rightbotcurly"] = "rb"
- X# ditmap["lt"] = "lt" # left top curly
- X# ditmap["ob"] = "ob" # outline bullet
- X# ditmap["rb"] = "rb" # right bot curly
- X# ditmap["rc"] = "rc" # right ceil
- X# ditmap["rf"] = "rf" # right floor
- X# ditmap["rk"] = "rk" # right center curly
- X# ditmap["rn"] = "rn" # root extender
- X# ditmap["rt"] = "rt" # rith top curly
- X# ditmap["ru"] = "ru" # rule
- X ditmap["leftmidcurly"] = "lk"
- X ditmap["rightmidcurly"] = "rk"
- X ditmap["leftfloor"] = "lf"
- X ditmap["rightfloor"] = "rf"
- X ditmap["leftceiling"] = "lc"
- X ditmap["rightceiling"] = "rc"
- X ditmap["outlinebullet"] = "ob"
- X ditmap["perpendicular"] = "bt"
- X ditmap["perthousand"] = "pm"
- X
- X# Characters in the ISO Latan 1 set
- X# Assignment of troff characters made by D. A. Cahlander 89/01/09.
- X# Disabled since the DESC.out file can only describe 256-character fonts.
- X
- X# ditmap["Aacute"] = "A'"
- X# ditmap["Acircumflex"] = "A^"
- X ditmap["Adieresis"] = "A:"
- X# ditmap["Agrave"] = "A`"
- X# ditmap["Aring"] = "Ao"
- X# ditmap["Atilde"] = "A~"
- X# ditmap["Ccedilla"] = "Cc"
- X# ditmap["Eacute"] = "E'"
- X# ditmap["Ecircumflex"] = "E^"
- X# ditmap["Edieresis"] = "E."
- X# ditmap["Egrave"] = "E`"
- X# ditmap["Iacute"] = "I'"
- X# ditmap["Icircumflex"] = "I^"
- X# ditmap["Idieresis"] = "I."
- X# ditmap["Igrave"] = "I`"
- X# ditmap["Ntilde"] = "N~"
- X# ditmap["Oacute"] = "O'"
- X# ditmap["Ocircumflex"] = "O^"
- X ditmap["Odieresis"] = "O:"
- X# ditmap["Ograve"] = "O`"
- X# ditmap["Otilde"] = "O~"
- X# ditmap["Scaron"] = "Sc"
- X# ditmap["Uacute"] = "U'"
- X# ditmap["Ucircumflex"] = "U^"
- X ditmap["Udieresis"] = "U:"
- X# ditmap["Ugrave"] = "U`"
- X# ditmap["Ydieresis"] = "Y."
- X# ditmap["Zcaron"] = "Zc"
- X# ditmap["aacute"] = "a'"
- X# ditmap["acircumflex"] = "a^"
- X ditmap["adieresis"] = "a:"
- X# ditmap["agrave"] = "a`"
- X# ditmap["aring"] = "ao"
- X# ditmap["atilde"] = "a~"
- X# ditmap["ccedilla"] = "cc"
- X# ditmap["eacute"] = "e'"
- X# ditmap["ecircumflex"] = "e^"
- X# ditmap["edieresis"] = "e."
- X# ditmap["egrave"] = "e`"
- X# ditmap["iacute"] = "i'"
- X# ditmap["icircumflex"] = "i^"
- X# ditmap["idieresis"] = "i."
- X# ditmap["igrave"] = "i`"
- X# ditmap["ntilde"] = "n~"
- X# ditmap["oacute"] = "o'"
- X# ditmap["ocircumflex"] = "o^"
- X ditmap["odieresis"] = "o:"
- X# ditmap["ograve"] = "o`"
- X# ditmap["otilde"] = "o~"
- X# ditmap["scaron"] = "sc"
- X# ditmap["uacute"] = "u'"
- X# ditmap["ucircumflex"] = "u^"
- X ditmap["udieresis"] = "u:"
- X# ditmap["ugrave"] = "u`"
- X# ditmap["ydieresis"] = "y."
- X# ditmap["zcaron"] = "zc"
- X
- X# Characters that have subroutine proceedures that are used
- X# to draw them with psdit.
- X
- X psdit["onequarter"] = "14"
- X psdit["onehalf"] = "12"
- X psdit["threequarters"] = "34"
- X
- X psdit["square"] = 1
- X psdit["box"] = 1
- X psdit["circle"] = 1
- X psdit["boxrule"] = 1
- X psdit["boldvertical"] = 1
- X psdit["rule"] = 1
- X
- X psdit["lefttopcurly"] = 1
- X psdit["leftbotcurly"] = 1
- X psdit["righttopcurly"] = 1
- X psdit["rightbotcurly"] = 1
- X psdit["leftmidcurly"] = 1
- X psdit["rightmidcurly"] = 1
- X psdit["leftfloor"] = 1
- X psdit["rightfloor"] = 1
- X psdit["leftceiling"] = 1
- X psdit["rightceiling"] = 1
- X
- X# No mapping exists for these characters.
- X
- X ditmap[".noPS1"] = "ma fe" # male female
- X ditmap[".noPS2"] = "~~" # almost exactly equals
- X ditmap[".noPS3"] = ">< <> !> !<" # funny relations
- X ditmap[".noPS4"] = "uj" # dotless (undotted) j
- X ditmap[".noPS5"] = "cp" # cap (upside down breve)
- X ditmap[".noPS6"] = "-+" # - over + ?
- X ditmap[".noPS7"] = "vr" # vertical rule
- X
- X# ditmap[".noPS90"] = "wi tp sg sa rd ra os =p =. 4d"
- X# ditmap[".noPS91"] = "le ld hi gp ge el eg dc"
- X# ditmap[".noPS92"] = "cy bc b9 b0 as an ai \\` \\_ \\'"
- X# ditmap[".noPS93"] = "UT Sl SQ RC RB LE GE EL EG DT CB *V"
- X
- X# L. and l. are used for line drawing on systems without graphics
- X
- X# ascii is a mapping which contains the troff character names
- X# for the printable ascii characters. The values are the ascii
- X# character codes but are not used in this program. A test is
- X# made to see if a specific name is in the table.
- X
- X ascii["space"] = 32
- X ascii["exclam"] = 33
- X ascii["quotedbl"] = 34
- X ascii["numbersign"] = 35
- X ascii["dollar"] = 36
- X ascii["percent"] = 37
- X ascii["ampersand"] = 38
- X ascii["quoteright"] = 39
- X ascii["parenleft"] = 40
- X ascii["parenright"] = 41
- X ascii["asterisk"] = 42
- X ascii["plus"] = 43
- X ascii["comma"] = 44
- X ascii["hyphen"] = 45
- X# ascii["minus"] = 45
- X ascii["period"] = 46
- X ascii["slash"] = 47
- X ascii["zero"] = 48
- X ascii["one"] = 49
- X ascii["two"] = 50
- X ascii["three"] = 51
- X ascii["four"] = 52
- X ascii["five"] = 53
- X ascii["six"] = 54
- X ascii["seven"] = 55
- X ascii["eight"] = 56
- X ascii["nine"] = 57
- X ascii["colon"] = 58
- X ascii["semicolon"] = 59
- X ascii["less"] = 60
- X ascii["equal"] = 61
- X ascii["greater"] = 62
- X ascii["question"] = 63
- X ascii["at"] = 64
- X ascii["A"] = 65
- X ascii["B"] = 66
- X ascii["C"] = 67
- X ascii["D"] = 68
- X ascii["E"] = 69
- X ascii["F"] = 70
- X ascii["G"] = 71
- X ascii["H"] = 72
- X ascii["I"] = 73
- X ascii["J"] = 74
- X ascii["K"] = 75
- X ascii["L"] = 76
- X ascii["M"] = 77
- X ascii["N"] = 78
- X ascii["O"] = 79
- X ascii["P"] = 80
- X ascii["Q"] = 81
- X ascii["R"] = 82
- X ascii["S"] = 83
- X ascii["T"] = 84
- X ascii["U"] = 85
- X ascii["V"] = 86
- X ascii["W"] = 87
- X ascii["X"] = 88
- X ascii["Y"] = 89
- X ascii["Z"] = 90
- X ascii["bracketleft"] = 91
- X ascii["backslash"] = 92
- X ascii["bracketright"] = 93
- X# ascii["asciicircum"] = 94 # 195 see ditmap, should be ascii!
- X ascii["underscore"] = 95
- X ascii["quoteleft"] = 96
- X ascii["a"] = 97
- X ascii["b"] = 98
- X ascii["c"] = 99
- X ascii["d"] = 100
- X ascii["e"] = 101
- X ascii["f"] = 102
- X ascii["g"] = 103
- X ascii["h"] = 104
- X ascii["i"] = 105
- X ascii["j"] = 106
- X ascii["k"] = 107
- X ascii["l"] = 108
- X ascii["m"] = 109
- X ascii["n"] = 110
- X ascii["o"] = 111
- X ascii["p"] = 112
- X ascii["q"] = 113
- X ascii["r"] = 114
- X ascii["s"] = 115
- X ascii["t"] = 116
- X ascii["u"] = 117
- X ascii["v"] = 118
- X ascii["w"] = 119
- X ascii["x"] = 120
- X ascii["y"] = 121
- X ascii["z"] = 122
- X ascii["braceleft"] = 123
- X ascii["bar"] = 124
- X ascii["braceright"] = 125
- X# ascii["asciitilde"] = 126 # 196 see ditmap, should be ascii !
- X
- X ditmap[".proctext"] = "18 38 58 78 13 23"
- X
- X # character-code and width info for synthetic characters
- X
- X cc = 132 # manufacture unique character codes
- X proc["18"] = cc++ " 0 833" # 1/8
- X proc["38"] = cc++ " 0 833" # 3/8
- X proc["58"] = cc++ " 0 833" # 5/8
- X proc["78"] = cc++ " 0 833" # 7/8
- X proc["13"] = cc++ " 0 833" # 1/3
- X proc["23"] = cc++ " 0 833" # 2/3
- X} # BEGIN
- X
- X# The following dumps the character set defined above to standard
- X# output. It is triggared if the input file is named "DESC".
- X# This info is used in the device description DESC to describe the
- X# global (over all fonts) character set of the device.
- X# Note that this dumps the information in random order (awk's
- X# enumeration of ditmap), but troff (makedev) shouldn't care. This
- X# is the only place the resolution, font sizes, unitwidth, etc. are
- X# wired. If they get too large, troff will explode, so change them
- X# at your own risk.
- X
- XFILENAME == "DESC" {
- X SIZES = "6 8 10 12 14 18 24"
- X RES = 72 * 8
- X print "sizes", SIZES, 0
- X print "res", RES
- X print "hor 1"
- X print "vert 1"
- X print "unitwidth", int((1000.0 / SCALE) * (72.0 / RES))
- X print "charset"
- X outstr = ""
- X for (i in ditmap) {
- X n = ditmap[i]
- X if ((length(outstr)+length(n)) > 60) {
- X print outstr
- X outstr = n " "
- X } else {
- X outstr = outstr n " "
- X }
- X }
- X if (length(outstr) != 0) print outstr
- X exit
- X}
- X
- X# Define the actions on the fields in the BDF format.
- X# Note that 3 files are generated which are cat'ed together
- X# outside this program.
- X
- X# handle header information
- X
- X/^STARTFONT/ {
- X print "#", $0 > header
- X next
- X}
- X
- X/^COMMENT Begin LogicalFontDescription/ {next}
- X/^COMMENT END LogicalFontDescription/ {next}
- X/^COMMENT .* end of inserted font properties/ {next}
- X
- X/^COMMENT/ {
- X $1 = "# "
- X print > header
- X next
- X}
- X
- X/^FONT / {
- X print "# " $2 > header
- X split($0, arg, ".")
- X print "name", arg[2] > header
- X if (arg[2] == "S") {
- X print "special" > header
- X isspecial = 1
- X istext = 0
- X }
- X next
- X}
- X
- X/^X_HEIGHT / {
- X ascender = $2
- X next
- X}
- X
- X/^ENDPROPERTIES/ { next }
- X
- X# set character name
- X
- X/^STARTCHAR .*/ {
- X charname = $2
- X next
- X}
- X
- X# set encoding
- X
- X/^ENCODING .*/ {
- X charcode = $2
- X next
- X}
- X
- X/^SWIDTH [0-9]* [0-9]*/ {
- X width = $2
- X next
- X}
- X
- X/^DWIDTH [0-9]* [0-9]*/ {
- X dwidth = $2
- X next
- X}
- X
- X# 1 2 3 4 5
- X/^BBX [-0-9]* [-0-9]* [-0-9]* [-0-9]*/ {
- X if (charcode == -1) # unused character
- X next
- X
- X bblly = $5
- X bbury = $3 + $5
- X
- X# ignore out of range characters
- X if (charcode >= 256)
- X next
- X
- X# compute width
- X scaledwidth = int(0.5 + (width / SCALE))
- X if ((scaledwidth < 0) || (scaledwidth > 256)) {
- X print "ERROR! Width out of range!"
- X exit 2
- X }
- X
- X# handle space
- X if (charname == "space") { # special char widths
- X spacewidth = scaledwidth
- X printf "ligatures " > header
- X printf "spacewidth %d\n", spacewidth > spaces
- X print "charset" > spaces
- X printf "\\|\t%d 0 000\t1/6 em space\n", int (0.5 + (1000.0/6.0) / SCALE) > trailer
- X printf "\\^\t%d 0 000\t1/12 em space\n", int (0.5 + (1000.0/12.0) / SCALE) > trailer
- X printf "\\&\t00 0 000\tno space\n" > trailer
- X next
- X }
- X
- X# parse ligatures
- X if (length(ligature[charname]))
- X printf "%s ", charname > header
- X
- X# ascender/descender flags
- X ad = 0
- X if (bblly < 0) ad += 1
- X if (bbury > ascender) ad += 2
- X
- X# dump the description line
- X if (length(ascii[charname]) > 0) {
- X printf "%c\t%d %d 0%2o\t%s\n", charcode, scaledwidth, ad, charcode, charname > trailer
- X # look for ditmap synonyms
- X if (length(ditmap[charname]) > 0) {
- X n = split(ditmap[charname],others," ")
- X for (i = 1; i <= n; i++) {
- X oth = others[i];
- X if ((length(mathonly[oth]) > 0) && (isspecial != 1)) continue;
- X printf "%s\t\"\n", others[i] > trailer
- X }
- X }
- X } else if (length(ditmap[charname]) > 0) {
- X # not a printable ascii character
- X n = split(ditmap[charname],others," ")
- X printf "%s\t%d %d 0%o\t%s\n", others[1], scaledwidth, ad, charcode, charname > trailer
- X for (i = 2; i <= n; i++) {
- X printf "%s\t\"\n", others[i] > trailer
- X }
- X }
- X
- X# dump a line for PS specific actual width/hack table
- X
- X specialcode = 0
- X if (length(psdit[charname]) != 0)
- X specialcode = 1
- X printf "%d %d %d\n", charcode, width, specialcode > aux
- X next
- X}
- X
- XEND {
- X printf "0\n" > header
- X
- X # dump the "fudged" characters.
- X for (i in proc) {
- X p = proc[i]
- X split(p,vals," ")
- X scaledwidth = int(0.5 + (vals[3] / SCALE))
- X if (((istext == 1) && (index(ditmap[".proctext"],i) != 0)) || ((isspecial == 1) && (index(ditmap[".procspecial"],i) != 0))) {
- X printf "%s\t%d %d 0%o\tfudgedproc!\n", i, scaledwidth, vals[2], vals[1] > trailer
- X
- X printf "%d %d %d\n", vals[1], vals[3], 1 > aux
- X }
- X }
- X exit
- X
- X}
- END_OF_FILE
- if test 17215 -ne `wc -c <'xtroff/devpsc/bdfdit.awk'`; then
- echo shar: \"'xtroff/devpsc/bdfdit.awk'\" unpacked with wrong size!
- fi
- # end of 'xtroff/devpsc/bdfdit.awk'
- fi
- echo shar: End of archive 12 \(of 18\).
- cp /dev/null ark12isdone
- MISSING=""
- for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 18 archives.
- rm -f ark[1-9]isdone ark[1-9][0-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-