v04i084: xconf -- X-based conferencing tool, Part01/05

Dan Heller argv at island.uu.net
Tue Jul 25 18:10:51 AEST 1989


Submitted-by: Jon Crowcroft <J.Crowcroft at Cs.Ucl.AC.UK>
Posting-number: Volume 4, Issue 84
Archive-name: xconf/part01



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix at uunet.uu.net if you want that tool.
# If this archive is complete, you will see the following message at the end:
#		"End of archive 3 (of 5)."
# Contents:  xconf/Converters.c xconf/Text.c.ac xconf/ru.h
# Wrapped by argv at sumatra on Tue Jul 25 01:01:06 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xconf/Converters.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xconf/Converters.c'\"
else
echo shar: Extracting \"'xconf/Converters.c'\" \(25972 characters\)
sed "s/^X//" >'xconf/Converters.c' <<'END_OF_FILE'
X#ifndef lint
Xstatic char Xrcsid[] = "$XConsortium: Converters.c,v 1.36 88/10/18 11:22:55 swick Exp $";
X/* $oHeader: Converters.c,v 1.6 88/09/01 09:26:23 asente Exp $ */
X#endif lint
X/*LINTLIBRARY*/
X
X/***********************************************************
XCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
Xand the Massachusetts Institute of Technology, Cambridge, Massachusetts.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Digital or MIT not be
Xused in advertising or publicity pertaining to distribution of the
Xsoftware without specific, written prior permission.  
X
XDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
XDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
XSOFTWARE.
X
X******************************************************************/
X
X/* Conversion.c - implementations of resource type conversion procs */
X
X#include	"StringDefs.h"
X#include	<stdio.h>
X#include        <X11/cursorfont.h>
X#include	"IntrinsicI.h"
X#include	"Quarks.h"
X
X#define	done(address, type) \
X	{ (*toVal).size = sizeof(type); (*toVal).addr = (caddr_t) address; }
X
Xvoid XtStringConversionWarning(from, toType)
X    String from, toType;
X{
X#ifdef notdef
X    static enum {Check, Report, Ignore} report_it = Check;
X
X    /* %%% aarrgghh.  We really want an app context handle! */
X    if (report_it == Check && _XtDefaultAppContext()->list[0] != NULL) {
X	XrmDatabase rdb = XtDatabase(_XtDefaultAppContext()->list[0]);
X	static void CvtStringToBoolean();
X	XrmName xrm_name[2];
X	XrmClass xrm_class[2];
X	XrmRepresentation rep_type;
X	XrmValue value;
X	xrm_name[0] = StringToName( "stringConversionWarnings" );
X	xrm_name[1] = NULL;
X	xrm_class[0] = StringToClass( "StringConversionWarnings" );
X	xrm_class[1] = NULL;
X	if (XrmQGetResource( rdb, xrm_name, xrm_class,
X			     &rep_type, &value ))
X	{
X	    if (rep_type == StringToQuark(XtRBoolean) && value.addr)
X		report_it = Report;
X	    else if (rep_type == StringToQuark(XtRString)) {
X		XrmValue toVal;
X		XtDirectConvert(CvtStringToBoolean, NULL, 0, &value, &toVal);
X		if (toVal.addr && *(Boolean*)toVal.addr)
X		    report_it = Report;
X	    }
X	}
X    }
X
X    if (report_it == Report) {
X#endif /*notdef*/
X	String params[2];
X	Cardinal num_params = 2;
X	params[0] = from;
X	params[1] = toType;
X	XtWarningMsg("conversionError","string","XtToolkitError",
X		   "Cannot convert string \"%s\" to type %s",
X		    params,&num_params);
X#ifdef notdef
X    }
X#endif /*notdef*/
X}
X
Xstatic void CvtXColorToPixel();
Xstatic void CvtIntToBoolean();
Xstatic void CvtIntToBool();
Xstatic void CvtIntToPixmap();
Xstatic void CvtIntToFont();
Xstatic void CvtIntOrPixelToXColor();
Xstatic void CvtIntToPixel();
X
Xstatic void CvtStringToBoolean();
Xstatic void CvtStringToBool();
Xstatic void CvtStringToCursor();
Xstatic void CvtStringToDisplay();
Xstatic void CvtStringToFile();
Xstatic void CvtStringToFont();
Xstatic void CvtStringToFontStruct();
Xstatic void CvtStringToGeometry();
Xstatic void CvtStringToInt();
Xstatic void CvtStringToShort();
Xstatic void CvtStringToUnsignedChar();
Xstatic void CvtStringToPixel();
X
X/*ARGSUSED*/
Xstatic void CvtIntToBoolean(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static Boolean	b;
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtIntToBoolean","XtToolkitError",
X                  "Integer to Boolean conversion needs no extra arguments",
X                   (String *)NULL, (Cardinal *)NULL);
X    b = (*(int *)fromVal->addr != 0);
X    done(&b, Boolean);
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtIntToShort(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static short    s;
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtIntToShort","XtToolkitError",
X                  "Integer to Short conversion needs no extra arguments",
X                   (String *)NULL, (Cardinal *)NULL);
X    s = (*(int *)fromVal->addr);
X    done(&s, short);
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtStringToBoolean(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static Boolean b;
X    XrmQuark	q;
X    char	lowerName[1000];
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtStringToBoolean","XtToolkitError",
X                  "String to Boolean conversion needs no extra arguments",
X                   (String *)NULL, (Cardinal *)NULL);
X
X    LowerCase((char *) fromVal->addr, lowerName);
X    q = XrmStringToQuark(lowerName);
X
X    if (q == XtQEtrue || q == XtQEon || q == XtQEyes) {
X	b = TRUE;
X	done(&b, Boolean);
X	return;
X    }
X    if (q == XtQEfalse || q ==XtQEoff || q == XtQEno) {
X	b = FALSE;
X	done(&b, Boolean);
X	return;
X    }
X
X    XtStringConversionWarning((char *) fromVal->addr, "Boolean");
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtIntToBool(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static Bool	b;
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtIntToBool","XtToolkitError",
X                  "Integer to Bool conversion needs no extra arguments",
X                   (String *)NULL, (Cardinal *)NULL);
X    b = (*(int *)fromVal->addr != 0);
X    done(&b, Bool);
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtStringToBool(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static Bool	b;
X    XrmQuark	q;
X    char	lowerName[1000];
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtStringToBool",
X		"XtToolkitError",
X                 "String to Bool conversion needs no extra arguments",
X                  (String *)NULL, (Cardinal *)NULL);
X
X    LowerCase((char *) fromVal->addr, lowerName);
X    q = XrmStringToQuark(lowerName);
X
X    if (q == XtQEtrue || q == XtQEon || q == XtQEyes) {
X	b = TRUE;
X	done(&b, Bool);
X	return;
X    }
X    if (q == XtQEfalse || q ==XtQEoff || q == XtQEno) {
X	b = FALSE;
X	done(&b, Bool);
X	return;
X    }
X
X    XtStringConversionWarning((char *) fromVal->addr, "Bool");
X};
X
XXtConvertArgRec colorConvertArgs[] = {
X    {XtBaseOffset, (caddr_t) XtOffset(Widget, core.screen),  sizeof(Screen *)},
X    {XtBaseOffset, (caddr_t) XtOffset(Widget, core.colormap),sizeof(Colormap)}
X};
X
X
Xstatic void CvtIntOrPixelToXColor(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{    
X    static XColor   c;
X    Screen	    *screen;
X    Colormap	    colormap;
X
X    if (*num_args != 2)
X      XtErrorMsg("wrongParameters","cvtIntOrPixelToXColor","XtToolkitError",
X         "Pixel to color conversion needs screen and colormap arguments",
X          (String *)NULL, (Cardinal *)NULL);
X    screen = *((Screen **) args[0].addr);
X    colormap = *((Colormap *) args[1].addr);
X    c.pixel = *(int *)fromVal->addr;
X
X    XQueryColor(DisplayOfScreen(screen), colormap, &c);
X    done(&c, XColor);
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtStringToPixel(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static XColor   screenColor;
X    XColor	    exactColor;
X    Screen	    *screen;
X    XtPerDisplay    perDpy;
X    XtAppContext    app;
X    Colormap	    colormap;
X    Status	    status;
X    char	    message[1000];
X    XrmQuark	    q;
X    String          params[1];
X    Cardinal       num_params=1;
X
X    if (*num_args != 2)
X     XtErrorMsg("wrongParameters","cvtStringToPixel","XtToolkitError",
X       "String to pixel conversion needs screen and colormap arguments",
X        (String *)NULL, (Cardinal *)NULL);
X
X    screen = *((Screen **) args[0].addr);
X    perDpy = _XtGetPerDisplay(DisplayOfScreen(screen));
X    app = perDpy->appContext;
X    colormap = *((Colormap *) args[1].addr);
X
X    LowerCase((char *) fromVal->addr, message);
X    q = XrmStringToQuark(message);
X
X    if (q == XtQExtdefaultbackground) {
X	if (app->rv) { done(&screen->black_pixel, Pixel); return; }
X	else { done(&screen->white_pixel, Pixel); return; }
X    }
X    if (q == XtQExtdefaultforeground) {
X	if (app->rv) { done(&screen->white_pixel, Pixel); return; }
X        else { done(&screen->black_pixel, Pixel); return; }
X    }
X
X    if ((char) fromVal->addr[0] == '#') {  /* some color rgb definition */
X
X        status = XParseColor(DisplayOfScreen(screen), colormap,
X                 (String) fromVal->addr, &screenColor);
X
X        if (status != 0)
X           status = XAllocColor(DisplayOfScreen(screen), colormap,
X                                &screenColor);
X    } else  /* some color name */
X
X        status = XAllocNamedColor(DisplayOfScreen(screen), colormap,
X                                  (String) fromVal->addr, &screenColor,
X				  &exactColor);
X    if (status == 0) {
X       params[0]=(String)fromVal->addr;
X       XtWarningMsg("noColormap","cvtStringToPixel","XtToolkitError",
X                 "Cannot allocate colormap entry for \"%s\"",
X                  params,&num_params);
X    } else {
X        done(&(screenColor.pixel), Pixel)
X    }
X
X};
X
X
XXtConvertArgRec screenConvertArg[] = {
X    {XtBaseOffset, (caddr_t) XtOffset(Widget, core.screen), sizeof(Screen *)}
X};
X
X/*ARGSUSED*/
Xstatic void CvtStringToCursor(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X
X{
X    static struct _CursorName {
X	char		*name;
X	unsigned int	shape;
X	Cursor		cursor;
X    } cursor_names[] = {
X			{"X_cursor",		XC_X_cursor,		NULL},
X			{"arrow",		XC_arrow,		NULL},
X			{"based_arrow_down",	XC_based_arrow_down,    NULL},
X			{"based_arrow_up",	XC_based_arrow_up,      NULL},
X			{"boat",		XC_boat,		NULL},
X			{"bogosity",		XC_bogosity,		NULL},
X			{"bottom_left_corner",	XC_bottom_left_corner,  NULL},
X			{"bottom_right_corner",	XC_bottom_right_corner, NULL},
X			{"bottom_side",		XC_bottom_side,		NULL},
X			{"bottom_tee",		XC_bottom_tee,		NULL},
X			{"box_spiral",		XC_box_spiral,		NULL},
X			{"center_ptr",		XC_center_ptr,		NULL},
X			{"circle",		XC_circle,		NULL},
X			{"clock",		XC_clock,		NULL},
X			{"coffee_mug",		XC_coffee_mug,		NULL},
X			{"cross",		XC_cross,		NULL},
X			{"cross_reverse",	XC_cross_reverse,       NULL},
X			{"crosshair",		XC_crosshair,		NULL},
X			{"diamond_cross",	XC_diamond_cross,       NULL},
X			{"dot",			XC_dot,			NULL},
X#ifdef XC_dotbox
X			{"dotbox",		XC_dotbox,		NULL},
X#endif
X			{"double_arrow",	XC_double_arrow,	NULL},
X			{"draft_large",		XC_draft_large,		NULL},
X			{"draft_small",		XC_draft_small,		NULL},
X			{"draped_box",		XC_draped_box,		NULL},
X			{"exchange",		XC_exchange,		NULL},
X			{"fleur",		XC_fleur,		NULL},
X			{"gobbler",		XC_gobbler,		NULL},
X			{"gumby",		XC_gumby,		NULL},
X#ifdef XC_hand1
X			{"hand1",		XC_hand1,		NULL},
X#endif
X#ifdef XC_hand2
X			{"hand2",		XC_hand2,		NULL},
X#endif
X			{"heart",		XC_heart,		NULL},
X			{"icon",		XC_icon,		NULL},
X			{"iron_cross",		XC_iron_cross,		NULL},
X			{"left_ptr",		XC_left_ptr,		NULL},
X			{"left_side",		XC_left_side,		NULL},
X			{"left_tee",		XC_left_tee,		NULL},
X			{"leftbutton",		XC_leftbutton,		NULL},
X			{"ll_angle",		XC_ll_angle,		NULL},
X			{"lr_angle",		XC_lr_angle,		NULL},
X			{"man",			XC_man,			NULL},
X			{"middlebutton",	XC_middlebutton,	NULL},
X			{"mouse",		XC_mouse,		NULL},
X			{"pencil",		XC_pencil,		NULL},
X			{"pirate",		XC_pirate,		NULL},
X			{"plus",		XC_plus,		NULL},
X			{"question_arrow",	XC_question_arrow,	NULL},
X			{"right_ptr",		XC_right_ptr,		NULL},
X			{"right_side",		XC_right_side,		NULL},
X			{"right_tee",		XC_right_tee,		NULL},
X			{"rightbutton",		XC_rightbutton,		NULL},
X			{"rtl_logo",		XC_rtl_logo,		NULL},
X			{"sailboat",		XC_sailboat,		NULL},
X			{"sb_down_arrow",	XC_sb_down_arrow,       NULL},
X			{"sb_h_double_arrow",	XC_sb_h_double_arrow,   NULL},
X			{"sb_left_arrow",	XC_sb_left_arrow,       NULL},
X			{"sb_right_arrow",	XC_sb_right_arrow,      NULL},
X			{"sb_up_arrow",		XC_sb_up_arrow,		NULL},
X			{"sb_v_double_arrow",	XC_sb_v_double_arrow,   NULL},
X			{"shuttle",		XC_shuttle,		NULL},
X			{"sizing",		XC_sizing,		NULL},
X			{"spider",		XC_spider,		NULL},
X			{"spraycan",		XC_spraycan,		NULL},
X			{"star",		XC_star,		NULL},
X			{"target",		XC_target,		NULL},
X			{"tcross",		XC_tcross,		NULL},
X			{"top_left_arrow",	XC_top_left_arrow,      NULL},
X			{"top_left_corner",	XC_top_left_corner,	NULL},
X			{"top_right_corner",	XC_top_right_corner,    NULL},
X			{"top_side",		XC_top_side,		NULL},
X			{"top_tee",		XC_top_tee,		NULL},
X			{"trek",		XC_trek,		NULL},
X			{"ul_angle",		XC_ul_angle,		NULL},
X			{"umbrella",		XC_umbrella,		NULL},
X			{"ur_angle",		XC_ur_angle,		NULL},
X			{"watch",		XC_watch,		NULL},
X			{"xterm",		XC_xterm,		NULL},
X    };
X    struct _CursorName *cache;
X    char *name = (char *)fromVal->addr;
X    register int i;
X    Screen	    *screen;
X
X    if (*num_args != 1)
X     XtErrorMsg("wrongParameters","cvtStringToCursor","XtToolkitError",
X             "String to cursor conversion needs screen argument",
X              (String *)NULL, (Cardinal *)NULL);
X
X    screen = *((Screen **) args[0].addr);
X    for (i=0, cache=cursor_names; i < XtNumber(cursor_names); i++, cache++ ) {
X	if (strcmp(name, cache->name) == 0) {
X#ifndef JON
X/*
X * Of course yet another static which blows away multiple displays
X * since second (identical) widget on new display with this cursor
X * the cursor aint never been heard of...by the server
X */
X	    if (!cache->cursor)
X#endif JON
X		cache->cursor =
X		    XCreateFontCursor(DisplayOfScreen(screen), cache->shape );
X	    done(&(cache->cursor), Cursor);
X	    return;
X	}
X    }
X    XtStringConversionWarning(name, "Cursor");
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtStringToDisplay(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static Display	*d;
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtStringToDisplay","XtToolkitError",
X                  "String to Display conversion needs no extra arguments",
X                   (String *)NULL, (Cardinal *)NULL);
X
X    d = XOpenDisplay((char *)fromVal->addr);
X    if (d != NULL) {
X	done(&d, Display);
X    } else {
X	XtStringConversionWarning((char *) fromVal->addr, "Display");
X    }
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtStringToFile(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static FILE	*f;
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtStringToFile","XtToolkitError",
X                 "String to File conversion needs no extra arguments",
X                 (String *) NULL, (Cardinal *)NULL);
X
X    f = fopen((char *)fromVal->addr, "r");
X    if (f != NULL) {
X	done(&f, FILE);
X    } else {
X	XtStringConversionWarning((char *) fromVal->addr, "File");
X    }
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtStringToFont(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static Font	f;
X    Screen	    *screen;
X    Display         *display;
X    char	    lcfont[1000];
X    XrmQuark	    q;
X
X    if (*num_args != 1)
X     XtErrorMsg("wrongParameters","cvtStringToFont","XtToolkitError",
X             "String to font conversion needs screen argument",
X              (String *) NULL, (Cardinal *)NULL);
X
X    screen = *((Screen **) args[0].addr);
X    LowerCase((char *) fromVal->addr, lcfont);
X    q = XrmStringToQuark(lcfont);
X
X    if (q != XtQExtdefaultfont) {
X	f = XLoadFont(DisplayOfScreen(screen), (char *)fromVal->addr);
X	if (f != 0) {
X	    done(&f, Font);
X	    return;
X	}
X	XtStringConversionWarning((char *) fromVal->addr, "Font");
X    }
X    /* try and get the default font */
X
X    display   = DisplayOfScreen(screen);
X
X    f = XLoadFont(display,"fixed");
X
X/* this crashes the server for some reason.  I think that it is */
X/* supposed to work.  so for now we will use the above line     */
X/*  done(&f, DefaultGCOfScreen(screen)->values.font);        */
X
X    if (f != 0) done(&f, Font);
X}
X
X
X/*ARGSUSED*/
Xstatic void CvtIntToFont(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtIntToFont","XtToolkitError",
X           "Integer to Font conversion needs no extra arguments",
X            (String *) NULL, (Cardinal *)NULL);
X    done(fromVal->addr, int);
X};
X
X
X/*ARGSUSED*/
Xstatic void CvtStringToFontStruct(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static XFontStruct	*f;
X    Screen	    *screen;
X    char	    lcfont[1000];
X    XrmQuark	    q;
X
X    if (*num_args != 1)
X     XtErrorMsg("wrongParameters","cvtStringToFontStruct","XtToolkitError",
X             "String to cursor conversion needs screen argument",
X              (String *) NULL, (Cardinal *)NULL);
X
X    screen = *((Screen **) args[0].addr);
X    LowerCase((char *) fromVal->addr, lcfont);
X    q = XrmStringToQuark(lcfont);
X
X    if (q != XtQExtdefaultfont) {
X	f = XLoadQueryFont(DisplayOfScreen(screen), (char *)fromVal->addr);
X	if (f != NULL) {
X	    done(&f, XFontStruct *);
X	    return;
X	}
X	XtStringConversionWarning((char *) fromVal->addr, "XFontStruct");
X    }
X
X    /* try and get the default font */
X
X    /* This still crashes the server... */
X/*  
X    f = XQueryFont(DisplayOfScreen(screen),
X	           DefaultGCOfScreen(screen)->values.font);
X*/
X    /* ...so we do this instead */
X
X    f = XLoadQueryFont(DisplayOfScreen(screen), "fixed");
X
X    if (f != 0) done(&f, XFontStruct *);
X}
X
X/*ARGSUSED*/
Xstatic void CvtStringToInt(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    static int	i;
X
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtStringToInt","XtToolkitError",
X                  "String to Integer conversion needs no extra arguments",
X                  (String *) NULL, (Cardinal *)NULL);
X    if (sscanf((char *)fromVal->addr, "%d", &i) == 1) {
X	done(&i, int);
X    } else {
X	XtStringConversionWarning((char *) fromVal->addr, "Integer");
X    }
X}
X
X/*ARGSUSED*/
Xstatic void CvtStringToShort(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr fromVal;
X    XrmValuePtr toVal;
X{
X    static short i;
X
X    if (*num_args != 0)
X        XtWarningMsg("wrongParameters","cvtStringToShort","XtToolkitError",
X          "String to Integer conversion needs no extra arguments",
X           (String *) NULL, (Cardinal *)NULL);
X    if (sscanf((char *)fromVal->addr, "%hd", &i) == 1) {
X        done(&i, short);
X    } else {
X        XtStringConversionWarning((char *) fromVal->addr, "Short");
X    }
X}
X/*ARGSUSED*/
Xstatic void CvtStringToUnsignedChar(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr fromVal;
X    XrmValuePtr toVal;
X{
X    static int i;
X    static unsigned char uc;
X
X    if (*num_args != 0)
X        XtWarningMsg("wrongParameters","cvtStringToUnsignedChar","XtToolkitError",
X                  "String to Integer conversion needs no extra arguments",
X                   (String *) NULL, (Cardinal *)NULL);
X    if (sscanf((char *)fromVal->addr, "%d", &i) == 1) {
X
X        if ( i < 0 || i > 255 )
X            XtStringConversionWarning((char *) fromVal->addr, "Unsigned Char");
X        uc = (unsigned char)i;
X        done(&uc, unsigned char);
X    } else {
X        XtStringConversionWarning((char *) fromVal->addr, "Unsigned Char");
X    }
X}
X
X
X/*ARGSUSED*/
Xstatic void CvtXColorToPixel(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtXColorToPixel","XtToolkitError",
X                  "Color to Pixel conversion needs no extra arguments",
X                   (String *) NULL, (Cardinal *)NULL);
X    done(&((XColor *)fromVal->addr)->pixel, int);
X};
X
X/*ARGSUSED*/
Xstatic void CvtIntToPixel(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr	fromVal;
X    XrmValuePtr	toVal;
X{
X    if (*num_args != 0)
X	XtWarningMsg("wrongParameters","cvtIntToPixel","XtToolkitError",
X                  "Integer to Pixel conversion needs no extra arguments",
X                   (String *) NULL, (Cardinal *)NULL);
X    done(fromVal->addr, int);
X};
X
X/*ARGSUSED*/
Xstatic void CvtIntToPixmap(args, num_args, fromVal, toVal)
X    XrmValuePtr args;
X    Cardinal    *num_args;
X    XrmValuePtr fromVal;
X    XrmValuePtr toVal;
X{
X    if (*num_args != 0)
X        XtWarningMsg("wrongParameters","cvtIntToPixmap","XtToolkitError",
X                  "Integer to Pixmap conversion needs no extra arguments",
X                   (String *) NULL, (Cardinal *)NULL);
X    done(fromVal->addr, int);
X};
X
X
Xvoid LowerCase(source, dest)
X    register char  *source, *dest;
X{
X    register char ch;
X
X    for (; (ch = *source) != 0; source++, dest++) {
X    	if ('A' <= ch && ch <= 'Z')
X	    *dest = ch - 'A' + 'a';
X	else
X	    *dest = ch;
X    }
X    *dest = 0;
X}
X
XXrmQuark  XtQBoolean;
XXrmQuark  XtQBool;
XXrmQuark  XtQColor;
XXrmQuark  XtQCursor;
XXrmQuark  XtQDisplay;
XXrmQuark  XtQDimension;
XXrmQuark  XtQFile;
XXrmQuark  XtQFont;
XXrmQuark  XtQFontStruct;
XXrmQuark  XtQInt;
XXrmQuark  XtQPixel;
XXrmQuark  XtQPixmap;
XXrmQuark  XtQPointer;
XXrmQuark  XtQPosition;
XXrmQuark  XtQShort;
XXrmQuark  XtQString;
XXrmQuark  XtQUnsignedChar;
XXrmQuark  XtQWindow;
X
XXrmQuark  XtQEoff;
XXrmQuark  XtQEfalse;
XXrmQuark  XtQEno;
XXrmQuark  XtQEon;
XXrmQuark  XtQEtrue;
XXrmQuark  XtQEyes;
XXrmQuark  XtQEnotUseful;
XXrmQuark  XtQEwhenMapped;
XXrmQuark  XtQEalways;
XXrmQuark  XtQEdefault;
X
XXrmQuark  XtQExtdefaultbackground;
XXrmQuark  XtQExtdefaultforeground;
XXrmQuark  XtQExtdefaultfont;
X
Xstatic Boolean initialized = FALSE;
X
Xvoid _XtConvertInitialize()
X{
X    if (initialized) return;
X    initialized = TRUE;
X
X/* Representation types */
X
X    XtQBoolean		= XrmStringToQuark(XtRBoolean);
X    XtQColor		= XrmStringToQuark(XtRColor);
X    XtQCursor		= XrmStringToQuark(XtRCursor);
X    XtQDimension	= XrmStringToQuark(XtRDimension);
X    XtQDisplay		= XrmStringToQuark(XtRDisplay);
X    XtQFile		= XrmStringToQuark(XtRFile);
X    XtQFont		= XrmStringToQuark(XtRFont);
X    XtQFontStruct	= XrmStringToQuark(XtRFontStruct);
X    XtQInt		= XrmStringToQuark(XtRInt);
X    XtQBool		= XrmStringToQuark(XtRBool);
X    XtQPixel		= XrmStringToQuark(XtRPixel);
X    XtQPixmap		= XrmStringToQuark(XtRPixmap);
X    XtQPointer		= XrmStringToQuark(XtRPointer);
X    XtQPosition		= XrmStringToQuark(XtRPosition);
X    XtQShort            = XrmStringToQuark(XtRShort);
X    XtQString		= XrmStringToQuark(XtRString);
X    XtQUnsignedChar     = XrmStringToQuark(XtRUnsignedChar);
X    XtQWindow		= XrmStringToQuark(XtRWindow);
X
X/* Boolean enumeration constants */
X
X    XtQEfalse		= XrmStringToQuark(XtEfalse);
X    XtQEno		= XrmStringToQuark(XtEno);
X    XtQEoff		= XrmStringToQuark(XtEoff);
X    XtQEon		= XrmStringToQuark(XtEon);
X    XtQEtrue		= XrmStringToQuark(XtEtrue);
X    XtQEyes		= XrmStringToQuark(XtEyes);
X
X/* Default color and font  enumeration constants */
X
X    XtQExtdefaultbackground = XrmStringToQuark(XtExtdefaultbackground);
X    XtQExtdefaultforeground = XrmStringToQuark(XtExtdefaultforeground);
X    XtQExtdefaultfont	    = XrmStringToQuark(XtExtdefaultfont);
X}
X
X_XtAddDefaultConverters(table)
X    ConverterTable table;
X{
X#define Add(from, to, proc, convert_args, num_args) \
X    _XtTableAddConverter(table, from, to, (XtConverter) proc, \
X	    (XtConvertArgList) convert_args, num_args)
X
X    Add(XtQColor,   XtQPixel,       CvtXColorToPixel,	    NULL, 0);
X    Add(XtQInt,     XtQBoolean,     CvtIntToBoolean,	    NULL, 0);
X    Add(XtQInt,     XtQBool,        CvtIntToBool,	    NULL, 0);
X    Add(XtQInt,	    XtQDimension,   CvtIntToShort,	    NULL, 0);
X    Add(XtQInt,     XtQPixel,       CvtIntToPixel,          NULL, 0);
X    Add(XtQInt,     XtQPosition,    CvtIntToShort,          NULL, 0);
X    Add(XtQInt,     XtQPixmap,      CvtIntToPixmap,	    NULL, 0);
X    Add(XtQInt,     XtQFont,        CvtIntToFont,	    NULL, 0);
X    Add(XtQInt,     XtQColor,       CvtIntOrPixelToXColor,  
X	colorConvertArgs, XtNumber(colorConvertArgs));
X
X    Add(XtQString,  XtQBoolean,     CvtStringToBoolean,     NULL, 0);
X    Add(XtQString,  XtQBool,        CvtStringToBool,	    NULL, 0);
X    Add(XtQString,  XtQCursor,      CvtStringToCursor,      
X	screenConvertArg, XtNumber(screenConvertArg));
X    Add(XtQString,  XtQDimension,   CvtStringToShort,       NULL, 0);
X    Add(XtQString,  XtQDisplay,     CvtStringToDisplay,     NULL, 0);
X    Add(XtQString,  XtQFile,        CvtStringToFile,	    NULL, 0);
X    Add(XtQString,  XtQFont,        CvtStringToFont,	    
X	screenConvertArg, XtNumber(screenConvertArg));
X    Add(XtQString,  XtQFontStruct,  CvtStringToFontStruct,  
X	screenConvertArg, XtNumber(screenConvertArg));
X    Add(XtQString,  XtQInt,         CvtStringToInt,	    NULL, 0);
X    Add(XtQString,  XtQPosition,    CvtStringToShort,       NULL, 0);
X    Add(XtQString,  XtQPixel,       CvtStringToPixel,       
X	colorConvertArgs, XtNumber(colorConvertArgs));
X    Add(XtQString,  XtQShort,       CvtStringToShort,       NULL, 0);
X    Add(XtQString,  XtQUnsignedChar,CvtStringToUnsignedChar,NULL, 0);
X
X    Add(XtQPixel,   XtQColor,       CvtIntOrPixelToXColor,  
X	colorConvertArgs, XtNumber(colorConvertArgs));
X
X   _XtAddTMConverters(table);
X}
END_OF_FILE
if test 25972 -ne `wc -c <'xconf/Converters.c'`; then
    echo shar: \"'xconf/Converters.c'\" unpacked with wrong size!
fi
# end of 'xconf/Converters.c'
fi
if test -f 'xconf/Text.c.ac' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xconf/Text.c.ac'\"
else
echo shar: Extracting \"'xconf/Text.c.ac'\" \(25203 characters\)
sed "s/^X//" >'xconf/Text.c.ac' <<'END_OF_FILE'
X/* The following used to be a separate file, TextActs.c, but
X   is included here because textActionsTable can't be external
X   to the file declaring textClassRec */
X
X/* Misc. routines */
Xvoid TextAcceptFocus(w)
X    Widget          w;
X{
X    TextWidget ctx = (TextWidget) w;
X    if (!ctx->text.hasfocus)
X	XSetInputFocus(XtDisplay(ctx), XtWindow(ctx), 
X	  RevertToPointerRoot,  CurrentTime);
X}
X
Xstatic StartAction(ctx, event)
X   TextWidget ctx;
X   XEvent *event;
X{
X    _XtTextPrepareToUpdate(ctx);
X    if (event != NULL) {
X	switch (event->type) {
X	  case ButtonPress:
X	  case ButtonRelease:
X				    ctx->text.time = event->xbutton.time;
X				    ctx->text.ev_x = event->xbutton.x;
X				    ctx->text.ev_y = event->xbutton.y;
X				    break;
X	  case KeyPress:
X	  case KeyRelease:
X				    ctx->text.time = event->xkey.time;
X				    ctx->text.ev_x = event->xkey.x;
X				    ctx->text.ev_y = event->xkey.y;
X				    break;
X	  case MotionNotify:
X				    ctx->text.time = event->xmotion.time;
X				    ctx->text.ev_x = event->xmotion.x;
X				    ctx->text.ev_y = event->xmotion.y;
X				    break;
X	  case EnterNotify:
X	  case LeaveNotify:
X				    ctx->text.time = event->xcrossing.time;
X				    ctx->text.ev_x = event->xcrossing.x;
X				    ctx->text.ev_y = event->xcrossing.y;
X	}
X#ifdef JON
X        XtCallCallbacks(ctx, XtNcallback, (caddr_t)event); 
X#endif JON
X    }
X}
X
Xstatic EndAction(ctx)
X   TextWidget ctx;
X{
X    CheckResizeOrOverflow(ctx);
X    _XtTextExecuteUpdate(ctx);
X}
X
X#ifdef notdef
Xstatic DoFeep(ctx)
X    TextWidget ctx;
X{
X    XBell(XtDisplay(ctx), 50);
X}
X#endif
X
Xstatic DeleteOrKill(ctx, from, to, kill)
X    TextWidget	   ctx;
X    XtTextPosition from, to;
X    Boolean	   kill;
X{
X    XtTextBlock text;
X    char *ptr;
X
X    if (kill && from < to) {
X	ptr = _XtTextGetText(ctx, from, to);
X	XStoreBuffer(XtDisplay(ctx), ptr, strlen(ptr), 1);
X	XtFree(ptr);
X    }
X    text.length = 0;
X    text.firstPos = 0;
X    if (ReplaceText(ctx, from, to, &text)) {
X	XBell(XtDisplay(ctx), 50);
X	return;
X    }
X    ctx->text.insertPos = from;
X    XtTextUnsetSelection((Widget)ctx);
X    ctx->text.showposition = TRUE;
X}
X
X
XStuffFromBuffer(ctx, buffer)
X  TextWidget ctx;
X  int buffer;
X{
X    extern char *XFetchBuffer();
X    XtTextBlock text;
X    text.ptr = XFetchBuffer(XtDisplay(ctx), &(text.length), buffer);
X    text.firstPos = 0;
X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
X	XBell(XtDisplay(ctx), 50);
X	return;
X    }
X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
X    	ctx->text.insertPos, XtstPositions, XtsdRight, text.length, TRUE);
X    XtTextUnsetSelection((Widget)ctx);
X    XtFree(text.ptr);
X}
X
X
Xstatic void UnKill(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    StuffFromBuffer(ctx, 1);
X   EndAction(ctx);
X}
X
X
Xstatic void Stuff(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    StuffFromBuffer(ctx, 0);
X   EndAction(ctx);
X}
X
X
Xstruct _SelectionList {
X    String *params;
X    Cardinal count;
X    Time time;
X};
X
Xstatic void _GetSelection(w, time, params, num_params)
XWidget w;
XTime time;
XString *params;			/* selections in precedence order */
XCardinal num_params;
X{
X    void _SelectionReceived();
X    Atom selection;
X    int buffer;
X
X    XmuInternStrings(XtDisplay(w), params, (Cardinal)1, &selection);
X    switch (selection) {
X      case XA_CUT_BUFFER0: buffer = 0; break;
X      case XA_CUT_BUFFER1: buffer = 1; break;
X      case XA_CUT_BUFFER2: buffer = 2; break;
X      case XA_CUT_BUFFER3: buffer = 3; break;
X      case XA_CUT_BUFFER4: buffer = 4; break;
X      case XA_CUT_BUFFER5: buffer = 5; break;
X      case XA_CUT_BUFFER6: buffer = 6; break;
X      case XA_CUT_BUFFER7: buffer = 7; break;
X      default:	       buffer = -1;
X    }
X    if (buffer >= 0) {
X	unsigned long nbytes;
X	int fmt8 = 8;
X	Atom type = XA_STRING;
X	char *line = XFetchBuffer(XtDisplay(w), &nbytes, buffer);
X	if (nbytes > 0)
X	    _SelectionReceived(w, NULL, &selection, &type, (caddr_t)line,
X			       &nbytes, &fmt8);
X	else if (num_params > 1)
X	    _GetSelection(w, time, params+1, num_params-1);
X    } else {
X	struct _SelectionList* list;
X	if (--num_params) {
X	    list = XtNew(struct _SelectionList);
X	    list->params = params + 1;
X	    list->count = num_params;
X	    list->time = time;
X	} else list = NULL;
X	XtGetSelectionValue(w, selection, XA_STRING, _SelectionReceived,
X			    (caddr_t)list, time);
X    }
X}
X
X
X/* ARGSUSED */
Xstatic void _SelectionReceived(w, client_data, selection, type,
X			       value, length, format)
XWidget w;
Xcaddr_t client_data;
XAtom *selection, *type;
Xcaddr_t value;
Xunsigned long *length;
Xint *format;
X{
X    TextWidget ctx = (TextWidget)w;
X    XtTextBlock text;
X				  
X    if (*type == 0 /*XT_CONVERT_FAIL*/ || *length == 0) {
X	struct _SelectionList* list = (struct _SelectionList*)client_data;
X	if (list != NULL) {
X	    _GetSelection(w, list->time, list->params, list->count);
X	    XtFree(client_data);
X	}
X	return;
X    }
X
X    StartAction(ctx, NULL);
X
X    text.ptr = (char*)value;
X    text.firstPos = 0;
X    text.length = *length;
X    text.format = FMT8BIT;
X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
X	XBell(XtDisplay(ctx), 50);
X	return;
X    }
X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
X    	ctx->text.insertPos, XtstPositions, XtsdRight, text.length, TRUE);
X    XtTextUnsetSelection((Widget)ctx);
X
X    EndAction(ctx);
X
X    XtFree(client_data);
X    XtFree(value);
X}
X
X
Xstatic void InsertSelection(w, event, params, num_params)
X   Widget w;
X   XEvent *event;
X   String *params;		/* precedence list of selections to try */
X   Cardinal *num_params;
X{
X   static String default_params[] = {"PRIMARY", "CUT_BUFFER0"};
X   int count;
X   StartAction((TextWidget)w, event);
X    if ((count = *num_params) == 0) {
X	params = default_params;
X	count = XtNumber(default_params);
X    }
X    _GetSelection(w, ((TextWidget)w)->text.time, params, count);
X   EndAction((TextWidget)w);
X}
X
X
Xstatic XtTextPosition NextPosition(ctx, position, kind, direction)
X    TextWidget ctx;
X    XtTextPosition position;
X    XtTextScanType kind;
X    XtTextScanDirection direction;
X{
X    XtTextPosition pos;
X
X     pos = (*ctx->text.source->Scan)(
X	    ctx->text.source, position, kind, direction, 1, FALSE);
X     if (pos == ctx->text.insertPos) 
X         pos = (*ctx->text.source->Scan)(
X            ctx->text.source, position, kind, direction, 2, FALSE);
X     return pos;
X}
X
X/* routines for moving around */
X
Xstatic void MoveForwardChar(ctx, event)
X   TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X   ctx->text.insertPos = (*ctx->text.source->Scan)(
X        ctx->text.source, ctx->text.insertPos, XtstPositions, XtsdRight, 1, 
X	TRUE);
X   EndAction(ctx);
X}
X
Xstatic void MoveBackwardChar(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ctx->text.insertPos = (*ctx->text.source->Scan)(
X            ctx->text.source, ctx->text.insertPos, XtstPositions, XtsdLeft,
X	    1, TRUE);
X   EndAction(ctx);
X}
X
Xstatic void MoveForwardWord(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
X      XtstWhiteSpace, XtsdRight);
X   EndAction(ctx);
X}
X
Xstatic void MoveBackwardWord(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
X      XtstWhiteSpace, XtsdLeft);
X   EndAction(ctx);
X}
X
Xstatic void MoveBackwardParagraph(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
X      XtstEOL, XtsdLeft);
X   EndAction(ctx);
X}
X
Xstatic void MoveForwardParagraph(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
X      XtstEOL, XtsdRight);
X   EndAction(ctx);
X}
X
X
Xstatic void MoveToLineStart(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X    int line;
X   StartAction(ctx, event);
X    _XtTextShowPosition(ctx);
X    line = LineForPosition(ctx, ctx->text.insertPos);
X    ctx->text.insertPos = ctx->text.lt.info[line].position;
X   EndAction(ctx);
X}
X
Xstatic void MoveToLineEnd(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X    int line;
X    XtTextPosition next;
X   StartAction(ctx, event);
X    _XtTextShowPosition(ctx);
X    line = LineForPosition(ctx, ctx->text.insertPos);
X    next = ctx->text.lt.info[line+1].position;
X    if (next > ctx->text.lastPos)
X	next = ctx->text.lastPos;
X    else
X	next = (*ctx->text.source->Scan)(ctx->text.source, next, XtstPositions, 
X	  XtsdLeft, 1, TRUE);
X    ctx->text.insertPos = next;
X   EndAction(ctx);
X}
X
X
Xstatic void MoveNextLine(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X    int     width, width2, height, line;
X    XtTextPosition position, maxp;
X   StartAction(ctx, event);
X    _XtTextShowPosition(ctx);
X    line = LineForPosition(ctx, ctx->text.insertPos);
X    if (line == ctx->text.lt.lines - 1 &&
X	ctx->text.lt.info[ctx->text.lt.lines].position <= ctx->text.lastPos) {
X	_XtTextScroll(ctx, 1);
X	line = LineForPosition(ctx, ctx->text.insertPos);
X    }
X    (*ctx->text.sink->FindDistance)(ctx,
X		ctx->text.lt.info[line].position, ctx->text.lt.info[line].x,
X		ctx->text.insertPos, &width, &position, &height);
X    line++;
X    if (ctx->text.lt.info[line].position > ctx->text.lastPos) {
X	ctx->text.insertPos = ctx->text.lastPos;
X	EndAction(ctx);
X	return;
X    }
X    (*ctx->text.sink->FindPosition)(ctx,
X	    ctx->text.lt.info[line].position, ctx->text.lt.info[line].x,
X	    width, FALSE, &position, &width2, &height);
X    maxp = (*ctx->text.source->Scan)(ctx->text.source,
X            ctx->text.lt.info[line+1].position,
X	    XtstPositions, XtsdLeft, 1, TRUE);
X    if (position > maxp)
X	position = maxp;
X    ctx->text.insertPos = position;
X   EndAction(ctx);
X}
X
Xstatic void MovePreviousLine(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X    int     width, width2, height, line;
X    XtTextPosition position, maxp;
X   StartAction(ctx, event);
X    _XtTextShowPosition(ctx);
X    line = LineForPosition(ctx, ctx->text.insertPos);
X    if (line == 0) {
X	_XtTextScroll(ctx, -1);
X	line = LineForPosition(ctx, ctx->text.insertPos);
X    }
X    if (line > 0) {
X	(*ctx->text.sink->FindDistance)(ctx,
X		    ctx->text.lt.info[line].position, 
X		    ctx->text.lt.info[line].x,
X		    ctx->text.insertPos, &width, &position, &height);
X	line--;
X	(*ctx->text.sink->FindPosition)(ctx,
X		ctx->text.lt.info[line].position, ctx->text.lt.info[line].x,
X		width, FALSE, &position, &width2, &height);
X	maxp = (*ctx->text.source->Scan)(ctx->text.source, 
X		ctx->text.lt.info[line+1].position,
X		XtstPositions, XtsdLeft, 1, TRUE);
X	if (position > maxp)
X	    position = maxp;
X	ctx->text.insertPos = position;
X    }
X   EndAction(ctx);
X}
X
X
X
Xstatic void MoveBeginningOfFile(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
X    	ctx->text.insertPos, XtstAll, XtsdLeft, 1, TRUE);
X   EndAction(ctx);
X}
X
X
Xstatic void MoveEndOfFile(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
X    	ctx->text.insertPos, XtstAll,  XtsdRight, 1, TRUE);
X   EndAction(ctx);
X}
X
Xstatic void ScrollOneLineUp(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    _XtTextScroll(ctx, 1);
X   EndAction(ctx);
X}
X
Xstatic void ScrollOneLineDown(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    _XtTextScroll(ctx, -1);
X   EndAction(ctx);
X}
X
Xstatic void MoveNextPage(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    _XtTextScroll(ctx, max(1, ctx->text.lt.lines - 2));
X    ctx->text.insertPos = ctx->text.lt.top;
X   EndAction(ctx);
X}
X
Xstatic void MovePreviousPage(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    _XtTextScroll(ctx, -max(1, ctx->text.lt.lines - 2));
X    ctx->text.insertPos = ctx->text.lt.top;
X   EndAction(ctx);
X}
X
X
X
X
X/* delete routines */
X
Xstatic void DeleteForwardChar(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    next = (*ctx->text.source->Scan)(
X            ctx->text.source, ctx->text.insertPos, XtstPositions, 
X	    XtsdRight, 1, TRUE);
X    DeleteOrKill(ctx, ctx->text.insertPos, next, FALSE);
X   EndAction(ctx);
X}
X
Xstatic void DeleteBackwardChar(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    next = (*ctx->text.source->Scan)(
X            ctx->text.source, ctx->text.insertPos, XtstPositions, 
X	    XtsdLeft, 1, TRUE);
X    DeleteOrKill(ctx, next, ctx->text.insertPos, FALSE);
X   EndAction(ctx);
X}
X
Xstatic void DeleteForwardWord(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdRight);
X    DeleteOrKill(ctx, ctx->text.insertPos, next, FALSE);
X   EndAction(ctx);
X}
X
Xstatic void DeleteBackwardWord(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdLeft);
X    DeleteOrKill(ctx, next, ctx->text.insertPos, FALSE);
X   EndAction(ctx);
X}
X
Xstatic void KillForwardWord(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdRight);
X    DeleteOrKill(ctx, ctx->text.insertPos, next, TRUE);
X   EndAction(ctx);
X}
X
Xstatic void KillBackwardWord(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdLeft);
X    DeleteOrKill(ctx, next, ctx->text.insertPos, TRUE);
X   EndAction(ctx);
X}
X
Xstatic void KillCurrentSelection(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    DeleteOrKill(ctx, ctx->text.s.left, ctx->text.s.right, TRUE);
X   EndAction(ctx);
X}
X
Xstatic void DeleteCurrentSelection(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    DeleteOrKill(ctx, ctx->text.s.left, ctx->text.s.right, FALSE);
X   EndAction(ctx);
X}
X
Xstatic void KillToEndOfLine(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    int     line;
X    XtTextPosition last, next;
X   StartAction(ctx, event);
X    _XtTextShowPosition(ctx);
X    line = LineForPosition(ctx, ctx->text.insertPos);
X    last = ctx->text.lt.info[line + 1].position;
X    next = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
X       XtstEOL, XtsdRight, 1, FALSE);
X    if (last > ctx->text.lastPos)
X	last = ctx->text.lastPos;
X    if (last > next && ctx->text.insertPos < next)
X	last = next;
X    DeleteOrKill(ctx, ctx->text.insertPos, last, TRUE);
X   EndAction(ctx);
X}
X
Xstatic void KillToEndOfParagraph(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    next = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
X				       XtstEOL, XtsdRight, 1, FALSE);
X    if (next == ctx->text.insertPos)
X	next = (*ctx->text.source->Scan)(ctx->text.source, next, XtstEOL,
X					   XtsdRight, 1, TRUE);
X    DeleteOrKill(ctx, ctx->text.insertPos, next, TRUE);
X   EndAction(ctx);
X}
X
Xstatic void InsertNewLineAndBackup(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X   InsertNewLineAndBackupInternal(ctx);
X   EndAction(ctx);
X}
X
Xstatic int InsertNewLineAndBackupInternal(ctx)
X  TextWidget ctx;
X{
X    XtTextBlock text;
X    text.length = 1;
X    text.ptr = "\n";
X    text.firstPos = 0;
X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
X	XBell( XtDisplay(ctx), 50);
X	return(EditError);
X    }
X    XtTextUnsetSelection((Widget)ctx);
X    ctx->text.showposition = TRUE;
X    return(EditDone);
X}
X
X
X
Xstatic int InsertNewLine(ctx, event)
X    TextWidget ctx;
X   XEvent *event;
X{
X    XtTextPosition next;
X
X   StartAction(ctx, event);
X    if (InsertNewLineAndBackupInternal(ctx))
X	return(EditError);
X    next = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
X	    XtstPositions, XtsdRight, 1, TRUE);
X    ctx->text.insertPos = next;
X   EndAction(ctx);
X    return(EditDone);
X}
X
X
Xstatic void InsertNewLineAndIndent(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X    XtTextBlock text;
X    XtTextPosition pos1, pos2;
X
X   StartAction(ctx, event);
X    pos1 = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos, 
X    	XtstEOL, XtsdLeft, 1, FALSE);
X    pos2 = (*ctx->text.source->Scan)(ctx->text.source, pos1, XtstEOL, 
X    	XtsdLeft, 1, TRUE);
X    pos2 = (*ctx->text.source->Scan)(ctx->text.source, pos2, XtstWhiteSpace, 
X    	XtsdRight, 1, TRUE);
X    text.ptr = _XtTextGetText(ctx, pos1, pos2);
X    text.length = strlen(text.ptr);
X    if (InsertNewLine(ctx, event)) return;
X    text.firstPos = 0;
X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
X	XBell(XtDisplay(ctx), 50);
X	EndAction(ctx);
X	return;
X    }
X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
X    	ctx->text.insertPos, XtstPositions, XtsdRight, text.length, TRUE);
X    XtFree(text.ptr);
X   EndAction(ctx);
X}
X
Xstatic void SelectWord(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;
X   Cardinal *num_params;
X{
X    XtTextPosition l, r;
X   StartAction(ctx, event);
X    l = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos, 
X    	XtstWhiteSpace, XtsdLeft, 1, FALSE);
X    r = (*ctx->text.source->Scan)(ctx->text.source, l, XtstWhiteSpace, 
X    	XtsdRight, 1, FALSE);
X    _XtTextSetNewSelection(ctx, l, r,
X			   _SelectionList(ctx, params, *num_params),
X			   *num_params);
X   EndAction(ctx);
X}
X
X
Xstatic void SelectAll(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;
X   Cardinal *num_params;
X{
X   StartAction(ctx, event);
X   _XtTextSetNewSelection(ctx, (XtTextPosition)0, ctx->text.lastPos,
X			  _SelectionList(ctx, params, *num_params),
X			  *num_params);
X   EndAction(ctx);
X}
X
Xstatic void SelectStart(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;		/* unused */
X   Cardinal *num_params;	/* unused */
X{
X   StartAction(ctx, event);
X    AlterSelection(ctx, XtsmTextSelect, XtactionStart, NULL, ZERO);
X   EndAction(ctx);
X}
X
Xstatic void SelectAdjust(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;		/* unused */
X   Cardinal *num_params;	/* unused */
X{
X   StartAction(ctx, event);
X    AlterSelection(ctx, XtsmTextSelect, XtactionAdjust, NULL, ZERO);
X   EndAction(ctx);
X}
X
Xstatic void SelectEnd(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;
X   Cardinal *num_params;
X{
X   StartAction(ctx, event);
X    AlterSelection(ctx, XtsmTextSelect, XtactionEnd, params, num_params);
X   EndAction(ctx);
X}
X
Xstatic void ExtendStart(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;		/* unused */
X   Cardinal *num_params;	/* unused */
X{
X   StartAction(ctx, event);
X    AlterSelection(ctx, XtsmTextExtend, XtactionStart, NULL, ZERO);
X   EndAction(ctx);
X}
X
Xstatic void ExtendAdjust(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;		/* unused */
X   Cardinal *num_params;	/* unused */
X{
X   StartAction(ctx, event);
X    AlterSelection(ctx, XtsmTextExtend, XtactionAdjust, NULL, ZERO);
X   EndAction(ctx);
X}
X
Xstatic void ExtendEnd(ctx, event, params, num_params)
X  TextWidget ctx;
X   XEvent *event;
X   String *params;
X   Cardinal *num_params;
X{
X   StartAction(ctx, event);
X    AlterSelection(ctx, XtsmTextExtend, XtactionEnd, params, num_params);
X   EndAction(ctx);
X}
X
X
Xstatic void RedrawDisplay(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   StartAction(ctx, event);
X    ForceBuildLineTable(ctx);
X    DisplayTextWindow((Widget)ctx);
X   EndAction(ctx);
X}
X
X
X/* ARGSUSED */
Xvoid _XtTextAbortDialog(w, closure, call_data)
X     Widget w;			/* unused */
X     caddr_t closure;		/* dialog */
X     caddr_t call_data;		/* unused */
X{
X   struct _dialog *dialog = (struct _dialog*)closure;
X   Widget popup = dialog->widget->core.parent;
X   TextWidget ctx = dialog->text; 
X
X   StartAction(ctx, (XEvent*)NULL);
X     XtPopdown(popup);
X     dialog->mapped = False;
X     if (dialog->message)
X	 XtUnmanageChild( dialog->message );
X   EndAction(ctx);
X}
X
X
X/* Insert a file of the given name into the text.  Returns 0 if file found, 
X   -1 if not. */
X
Xstatic int InsertFileNamed(ctx, str)
X  TextWidget ctx;
X  char *str;
X{
X    int fid;
X    XtTextBlock text;
X    char    buf[1000];
X    XtTextPosition position;
X
X    if (str == NULL || strlen(str) == 0) return -1;
X    fid = open(str, O_RDONLY);
X    if (fid <= 0) return -1;
X    _XtTextPrepareToUpdate(ctx);
X    position = ctx->text.insertPos;
X    text.firstPos = 0;
X    while ((text.length = read(fid, buf, 512)) > 0) {
X	text.ptr = buf;
X	(void) ReplaceText(ctx, position, position, &text);
X	position = (*ctx->text.source->Scan)(ctx->text.source, position, 
X		XtstPositions, XtsdRight, text.length, TRUE);
X    }
X    (void) close(fid);
X    ctx->text.insertPos = position;
X    _XtTextExecuteUpdate(ctx);
X    return 0;
X}
X
X/* ARGSUSED */
Xstatic void DoInsert(w, closure, call_data)
X     Widget w;			/* unused */
X     caddr_t closure;		/* text widget */
X     caddr_t call_data;		/* unused */
X{
X    struct _dialog *dialog = (struct _dialog*)closure;
X
X    if (InsertFileNamed( dialog->text,
X			 XtDialogGetValueString(dialog->widget) )) {
X	char msg[128];
X	static Arg args[] = {
X	    {XtNlabel, NULL},
X	    {XtNfromVert, NULL},
X	    {XtNleft, (XtArgVal)XtChainLeft},
X	    {XtNright, (XtArgVal)XtChainRight},
X	    {XtNborderWidth, 0},
X	};
X	sprintf( msg, "*** Error: %s ***",
X		 (errno > 0 && errno < sys_nerr) ?
X			sys_errlist[errno] : "Can't open file" );
X	args[0].value = (XtArgVal)msg;
X	if (dialog->message) {
X	    XtSetValues( dialog->message, args, ONE );
X	    XtManageChild( dialog->message );
X	}
X	else {
X	    args[1].value = (XtArgVal)dialog->doit;
X	    dialog->message =
X		XtCreateManagedWidget( "message", labelWidgetClass,
X				       dialog->widget, args, XtNumber(args) );
X	}
X/*	XBell(XtDisplay(w), 50); */
X    }
X    else {
X	_XtTextAbortDialog(w, closure, NULL);
X    }
X}
X
X/*ARGSUSED*/
Xstatic void TextFocusIn (ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{ ctx->text.hasfocus = TRUE; }
X
X/*ARGSUSED*/
Xstatic void TextFocusOut(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{ ctx->text.hasfocus = FALSE; }
X
X#ifdef JON
X
X/*
XXXX Here is where to update any other windows...
X */
X#endif
X
X#define STRBUFSIZE 100
X
Xstatic XComposeStatus compose_status = {NULL, 0};
Xstatic void InsertChar(ctx, event)
X  TextWidget ctx;
X   XEvent *event;
X{
X   char strbuf[STRBUFSIZE];
X   int     keycode;
X   XtTextBlock text;
X   text.length = XLookupString (event, strbuf, STRBUFSIZE,
X                &keycode, &compose_status);
X   if (text.length==0) return;
X   StartAction(ctx, event);
X   text.ptr = &strbuf[0];
X   text.firstPos = 0;
X   if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
X	XBell(XtDisplay(ctx), 50);
X	EndAction(ctx);
X	return;
X    }
X    ctx->text.insertPos =
X	(*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
X			    XtstPositions, XtsdRight, text.length, TRUE);
X   XtTextUnsetSelection((Widget)ctx);
X
X   EndAction(ctx);
X}
X
Xstatic void InsertFile(w, event)
X    Widget w;
X    XEvent *event;
X{
X    TextWidget ctx = (TextWidget)w;
X    register struct _dialog *dialog, *prev;
X    char *ptr;
X    static char *dialog_label = "Insert File:";
X#ifdef notdef
X    XtTextBlock text;
X#endif
X    register Widget popup;
X    static Arg popup_args[] = {
X	{XtNx, NULL},
X	{XtNy, NULL},
X	{XtNiconName, NULL},
X	{XtNgeometry, NULL},
X	{XtNallowShellResize, True},
X	{XtNsaveUnder, True},
X    };
X    Arg args[2];
X    int x, y;
X    Window j;
X
X   StartAction(ctx, event);
X    if (ctx->text.source->edit_mode != XttextEdit) {
X	XBell(XtDisplay(w), 50);
X	EndAction(ctx);
X	return;
X    }
X    if (ctx->text.s.left < ctx->text.s.right) {
X	ptr = _XtTextGetText(ctx, ctx->text.s.left, ctx->text.s.right);
X	DeleteCurrentSelection(ctx, (XEvent*)NULL);
X#ifdef notdef
X	if (InsertFileNamed(ctx, ptr)) {
X	    XBell( XtDisplay(w), 50);
X	    text.ptr = ptr;
X	    text.length = strlen(ptr);
X	    text.firstPos = 0;
X	    (void) ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text);
X	    ctx->text.s.left = ctx->text.insertPos;
X	    ctx->text.s.right = ctx->text.insertPos = 
X	      (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos, 
X		  XtstPositions, XtsdRight, text.length, TRUE);
X	}
X	XtFree(ptr);
X	EndAction(ctx);
X	return;
X#endif
X    }
X    else {
X	ptr = "";
X    }
X    XTranslateCoordinates( XtDisplay(w), XtWindow(w),
X			   RootWindowOfScreen(XtScreen(w)), 0, 0, &x, &y, &j );
X    x += ctx->text.dialog_horiz_offset;
X    y += ctx->text.dialog_vert_offset;
X    if (ctx->text.sbar)
X	x += ctx->text.sbar->core.width + ctx->text.sbar->core.border_width;
X    prev = NULL;
X    for (dialog = ctx->text.dialog; dialog; dialog = dialog->next) {
X	if (!dialog->mapped)
X	    break;
END_OF_FILE
if test 25203 -ne `wc -c <'xconf/Text.c.ac'`; then
    echo shar: \"'xconf/Text.c.ac'\" unpacked with wrong size!
fi
# end of 'xconf/Text.c.ac'
fi
if test -f 'xconf/ru.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xconf/ru.h'\"
else
echo shar: Extracting \"'xconf/ru.h'\" \(576 characters\)
sed "s/^X//" >'xconf/ru.h' <<'END_OF_FILE'
X/*
X * Not def'd anywhere useful
X */
X#define CPUSTATES 4
X
X#ifdef sun
X#define DK_NDRIVE 4
X#endif
X
X#include <pwd.h>
X#ifdef hp
X#include <time.h>
X#endif
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <sys/ioctl.h>
X#include <rpcsvc/rstat.h>
X#include <utmp.h>
X#include <rpcsvc/rusers.h>
X#include <netinet/in.h>
X#include <netdb.h>
X#include <stdio.h>
X#include <sgtty.h>
X#include <signal.h>
X#include <errno.h>
X
X
X/*
X * Also not cleanly available without includeing almost all of sys
X */
X#define FSCALE (1<<8)
X
X#ifdef pyr
Xextern int errno;
X#endif
X
X#define XHosts "/etc/X0.hosts"
END_OF_FILE
if test 576 -ne `wc -c <'xconf/ru.h'`; then
    echo shar: \"'xconf/ru.h'\" unpacked with wrong size!
fi
# end of 'xconf/ru.h'
fi
echo shar: End of archive 3 \(of 5\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 5 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0



More information about the Comp.sources.x mailing list