Blame tests/lib/Geometry/geoIntrinsic.c

Packit b099d7
/* $XConsortium: geoIntrinsic.c /main/4 1995/07/15 21:13:22 drk $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#define INTRINSIC_C
Packit b099d7
Packit b099d7
#include "IntrinsicI.h"
Packit b099d7
#include "StringDefs.h"
Packit b099d7
#ifndef NO_IDENTIFY_WINDOWS
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
#endif
Packit b099d7
#ifndef VMS
Packit b099d7
#include <sys/stat.h>
Packit b099d7
#endif /* VMS */
Packit b099d7
Packit b099d7
#ifndef X_NOT_STDC_ENV
Packit b099d7
#include <stdlib.h>
Packit b099d7
#else
Packit b099d7
extern char *getenv();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#include "geoTattler.h"
Packit b099d7
Packit b099d7
String XtCXtToolkitError = "XtToolkitError";
Packit b099d7
Packit b099d7
Boolean XtIsSubclass(widget, widgetClass)
Packit b099d7
    Widget    widget;
Packit b099d7
    WidgetClass widgetClass;
Packit b099d7
{
Packit b099d7
    register WidgetClass w;
Packit b099d7
Packit b099d7
    for (w = widget->core.widget_class; w != NULL; w = w->core_class.superclass)
Packit b099d7
	if (w == widgetClass) return (TRUE);
Packit b099d7
    return (FALSE);
Packit b099d7
} /* XtIsSubclass */
Packit b099d7
Packit b099d7
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
Boolean _XtCheckSubclassFlag(
Packit b099d7
    Widget object,
Packit b099d7
    _XtXtEnum flag
Packit b099d7
    )
Packit b099d7
#else
Packit b099d7
Boolean _XtCheckSubclassFlag(object, flag)
Packit b099d7
    Widget object;
Packit b099d7
    XtEnum flag;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    if (object->core.widget_class->core_class.class_inited & flag)
Packit b099d7
	return True;
Packit b099d7
    else
Packit b099d7
	return False;
Packit b099d7
Packit b099d7
} /*_XtVerifySubclass */
Packit b099d7
Packit b099d7
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
Boolean _XtIsSubclassOf(
Packit b099d7
    Widget object,
Packit b099d7
    WidgetClass widgetClass,
Packit b099d7
    WidgetClass superClass,
Packit b099d7
    _XtXtEnum flag
Packit b099d7
    )
Packit b099d7
#else
Packit b099d7
Boolean _XtIsSubclassOf(object, widgetClass, superClass, flag)
Packit b099d7
    Widget object;
Packit b099d7
    WidgetClass widgetClass, superClass;
Packit b099d7
    XtEnum flag;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    if (!(object->core.widget_class->core_class.class_inited & flag))
Packit b099d7
	return False;
Packit b099d7
    else {
Packit b099d7
	register WidgetClass c = object->core.widget_class;
Packit b099d7
	while (c != superClass) {
Packit b099d7
	    if (c == widgetClass)
Packit b099d7
		return True;
Packit b099d7
	    c = c->core_class.superclass;
Packit b099d7
	}
Packit b099d7
	return False;
Packit b099d7
    }
Packit b099d7
} /*_XtIsSubclassOf */
Packit b099d7
Packit b099d7
Packit b099d7
static void ComputeWindowAttributes(widget,value_mask,values)
Packit b099d7
    Widget		 widget;
Packit b099d7
    XtValueMask		 *value_mask;
Packit b099d7
    XSetWindowAttributes *values;
Packit b099d7
{
Packit b099d7
    *value_mask = CWEventMask | CWColormap;
Packit b099d7
    (*values).event_mask = XtBuildEventMask(widget);
Packit b099d7
    (*values).colormap = widget->core.colormap;
Packit b099d7
    if (widget->core.background_pixmap != XtUnspecifiedPixmap) {
Packit b099d7
	*value_mask |= CWBackPixmap;
Packit b099d7
	(*values).background_pixmap = widget->core.background_pixmap;
Packit b099d7
    } else {
Packit b099d7
	*value_mask |= CWBackPixel;
Packit b099d7
	(*values).background_pixel = widget->core.background_pixel;
Packit b099d7
    }
Packit b099d7
    if (widget->core.border_pixmap != XtUnspecifiedPixmap) {
Packit b099d7
	*value_mask |= CWBorderPixmap;
Packit b099d7
	(*values).border_pixmap = widget->core.border_pixmap;
Packit b099d7
    } else {
Packit b099d7
	*value_mask |= CWBorderPixel;
Packit b099d7
	(*values).border_pixel = widget->core.border_pixel;
Packit b099d7
    }
Packit b099d7
    if (widget->core.widget_class->core_class.expose == (XtExposeProc) NULL) {
Packit b099d7
	/* Try to avoid redisplay upon resize by making bit_gravity the same
Packit b099d7
	   as the default win_gravity */
Packit b099d7
	*value_mask |= CWBitGravity;
Packit b099d7
	(*values).bit_gravity = NorthWestGravity;
Packit b099d7
    }
Packit b099d7
} /* ComputeWindowAttributes */
Packit b099d7
Packit b099d7
static void CallChangeManaged(widget)
Packit b099d7
    register Widget		widget;
Packit b099d7
{
Packit b099d7
    register Cardinal		i;
Packit b099d7
    XtWidgetProc		change_managed;
Packit b099d7
    register WidgetList		children;
Packit b099d7
    int    			managed_children = 0;
Packit b099d7
Packit b099d7
    register CompositePtr cpPtr;
Packit b099d7
    register CompositePartPtr clPtr;
Packit b099d7
   
Packit b099d7
    if (XtIsComposite (widget)) {
Packit b099d7
	cpPtr = (CompositePtr)&((CompositeWidget) widget)->composite;
Packit b099d7
        clPtr = (CompositePartPtr)&((CompositeWidgetClass)
Packit b099d7
                   widget->core.widget_class)->composite_class;
Packit b099d7
    } else return;
Packit b099d7
Packit b099d7
    children = cpPtr->children;
Packit b099d7
    change_managed = clPtr->change_managed;
Packit b099d7
Packit b099d7
    /* CallChangeManaged for all children */
Packit b099d7
    for (i = cpPtr->num_children; i != 0; --i) {
Packit b099d7
	CallChangeManaged (children[i-1]);
Packit b099d7
	if (XtIsManaged(children[i-1])) managed_children++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (change_managed != NULL && managed_children != 0) {
Packit b099d7
	_GeoPrintTrace(widget,"Call \"%s\"[%d,%d]'s changemanaged\n", XtName(widget), widget->core.width, widget->core.height);
Packit b099d7
	(*change_managed) (widget);
Packit b099d7
    }
Packit b099d7
} /* CallChangeManaged */
Packit b099d7
Packit b099d7
Packit b099d7
static void MapChildren(cwp)
Packit b099d7
    CompositePart *cwp;
Packit b099d7
{
Packit b099d7
    Cardinal i;
Packit b099d7
    WidgetList children;
Packit b099d7
    register Widget child;
Packit b099d7
Packit b099d7
    children = cwp->children;
Packit b099d7
    for (i = 0; i <  cwp->num_children; i++) {
Packit b099d7
	child = children[i];
Packit b099d7
	if (XtIsWidget (child)){
Packit b099d7
	    if (child->core.managed && child->core.mapped_when_managed) {
Packit b099d7
		XtMapWidget (children[i]);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
} /* MapChildren */
Packit b099d7
Packit b099d7
Packit b099d7
static Boolean ShouldMapAllChildren(cwp)
Packit b099d7
    CompositePart *cwp;
Packit b099d7
{
Packit b099d7
    Cardinal i;
Packit b099d7
    WidgetList children;
Packit b099d7
    register Widget child;
Packit b099d7
Packit b099d7
    children = cwp->children;
Packit b099d7
    for (i = 0; i < cwp->num_children; i++) {
Packit b099d7
	child = children[i];
Packit b099d7
	if (XtIsWidget(child)) {
Packit b099d7
	    if (XtIsRealized(child) && (! (child->core.managed 
Packit b099d7
					  && child->core.mapped_when_managed))){
Packit b099d7
		    return False;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return True;
Packit b099d7
} /* ShouldMapAllChildren */
Packit b099d7
Packit b099d7
Packit b099d7
static void RealizeWidget(widget)
Packit b099d7
    register Widget		widget;
Packit b099d7
{
Packit b099d7
    XtValueMask			value_mask;
Packit b099d7
    XSetWindowAttributes	values;
Packit b099d7
    XtRealizeProc		realize;
Packit b099d7
    Window			window;
Packit b099d7
Packit b099d7
    if (!XtIsWidget(widget) || XtIsRealized(widget)) return;
Packit b099d7
Packit b099d7
    _XtInstallTranslations(widget);
Packit b099d7
Packit b099d7
    ComputeWindowAttributes (widget, &value_mask, &values);
Packit b099d7
    realize = widget->core.widget_class->core_class.realize;
Packit b099d7
    if (realize == NULL)
Packit b099d7
	XtAppErrorMsg(XtWidgetToApplicationContext(widget),
Packit b099d7
		      "invalidProcedure","realizeProc",XtCXtToolkitError,
Packit b099d7
		      "No realize class procedure defined",
Packit b099d7
		      (String *)NULL, (Cardinal *)NULL);
Packit b099d7
    else {
Packit b099d7
	_GeoPrintTrace(widget,"Call \"%s\"[%d,%d]'s realize proc\n", XtName(widget), widget->core.width, widget->core.height);
Packit b099d7
	(*realize) (widget, &value_mask, &values);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    window = XtWindow(widget);
Packit b099d7
#ifndef NO_IDENTIFY_WINDOWS
Packit b099d7
    if (_XtGetPerDisplay(XtDisplay(widget))->appContext->identify_windows) {
Packit b099d7
	int len_nm, len_cl;
Packit b099d7
 	char *s;
Packit b099d7
Packit b099d7
	len_nm = widget->core.name ? strlen(widget->core.name) : 0;
Packit b099d7
 	len_cl = strlen(widget->core.widget_class->core_class.class_name);
Packit b099d7
 	s = XtMalloc((unsigned) (len_nm + len_cl + 2));
Packit b099d7
 	s[0] = '\0';
Packit b099d7
 	if (len_nm)
Packit b099d7
 	    strcpy(s, widget->core.name);
Packit b099d7
 	strcpy(s + len_nm + 1,
Packit b099d7
 	       widget->core.widget_class->core_class.class_name);
Packit b099d7
 	XChangeProperty(XtDisplay(widget), window,
Packit b099d7
 			XInternAtom(XtDisplay(widget), "_MIT_OBJ_CLASS",
Packit b099d7
 				    False),
Packit b099d7
 			XA_STRING, 8, PropModeReplace, (unsigned char *) s, 
Packit b099d7
 			len_nm + len_cl + 2);
Packit b099d7
 	XtFree(s);
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
#ifdef notdef
Packit b099d7
    _XtRegisterAsyncHandlers(widget);
Packit b099d7
#endif
Packit b099d7
    _XtRegisterGrabs(widget);
Packit b099d7
    _XtRegisterWindow (window, widget);
Packit b099d7
Packit b099d7
    if (XtIsComposite (widget)) {
Packit b099d7
	register Cardinal		i;
Packit b099d7
	register CompositePart *cwp = &(((CompositeWidget)widget)->composite);
Packit b099d7
	register WidgetList children = cwp->children;
Packit b099d7
	/* Realize all children */
Packit b099d7
	for (i = cwp->num_children; i != 0; --i) {
Packit b099d7
	    RealizeWidget (children[i-1]);
Packit b099d7
	}
Packit b099d7
	/* Map children that are managed and mapped_when_managed */
Packit b099d7
Packit b099d7
	if (cwp->num_children != 0) {
Packit b099d7
	    if (ShouldMapAllChildren(cwp)) {
Packit b099d7
		XMapSubwindows (XtDisplay(widget), window);
Packit b099d7
	    } else {
Packit b099d7
		MapChildren(cwp);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* If this is the application's popup shell, map it */
Packit b099d7
    if (widget->core.parent == NULL && widget->core.mapped_when_managed) {
Packit b099d7
	XtMapWidget (widget);
Packit b099d7
    }
Packit b099d7
} /* RealizeWidget */
Packit b099d7
Packit b099d7
void XtRealizeWidget (widget)
Packit b099d7
    register Widget		widget;
Packit b099d7
{
Packit b099d7
    if (XtIsRealized (widget)) return;
Packit b099d7
Packit b099d7
    CallChangeManaged(widget);
Packit b099d7
    RealizeWidget(widget);
Packit b099d7
} /* XtRealizeWidget */
Packit b099d7
Packit b099d7
Packit b099d7
static void UnrealizeWidget(widget)
Packit b099d7
    register Widget		widget;
Packit b099d7
{
Packit b099d7
    register CompositeWidget	cw;
Packit b099d7
    register Cardinal		i;
Packit b099d7
    register WidgetList		children;
Packit b099d7
Packit b099d7
    if (!XtIsWidget(widget) || !XtIsRealized(widget)) return;
Packit b099d7
Packit b099d7
    /* If this is the application's popup shell, unmap it? */
Packit b099d7
    /* no, the window is being destroyed */
Packit b099d7
Packit b099d7
    /* Recurse on children */
Packit b099d7
    if (XtIsComposite (widget)) {
Packit b099d7
	cw = (CompositeWidget) widget;
Packit b099d7
	children = cw->composite.children;
Packit b099d7
	/* Unrealize all children */
Packit b099d7
	for (i = cw->composite.num_children; i != 0; --i) {
Packit b099d7
	    UnrealizeWidget (children[i-1]);
Packit b099d7
	}
Packit b099d7
	/* Unmap children that are managed and mapped_when_managed? */
Packit b099d7
	/* No, it's ok to be managed and unrealized as long as your parent */
Packit b099d7
	/* is unrealized. XtUnrealize widget makes sure the "top" widget */
Packit b099d7
	/* is unmanaged, we can ignore all descendents */
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (XtHasCallbacks(widget, XtNunrealizeCallback) == XtCallbackHasSome)
Packit b099d7
	XtCallCallbacks(widget, XtNunrealizeCallback, NULL);
Packit b099d7
Packit b099d7
    /* Unregister window */
Packit b099d7
    _XtUnregisterWindow(XtWindow(widget), widget);
Packit b099d7
Packit b099d7
    /* Remove Event Handlers */
Packit b099d7
    /* remove grabs. Happens automatically when window is destroyed. */
Packit b099d7
Packit b099d7
    /* Destroy X Window, done at outer level with one request */
Packit b099d7
    widget->core.window = None;
Packit b099d7
Packit b099d7
    /* Removing the event handler here saves having to keep track if
Packit b099d7
     * the translation table is changed while the widget is unrealized.
Packit b099d7
     */
Packit b099d7
    _XtRemoveTranslations(widget);
Packit b099d7
} /* UnrealizeWidget */
Packit b099d7
Packit b099d7
Packit b099d7
void XtUnrealizeWidget (widget)
Packit b099d7
    register Widget		widget;
Packit b099d7
{
Packit b099d7
    Window window = XtWindow(widget);
Packit b099d7
Packit b099d7
    if (! XtIsRealized (widget)) return;
Packit b099d7
Packit b099d7
    if (widget->core.parent != NULL) XtUnmanageChild(widget);
Packit b099d7
Packit b099d7
    UnrealizeWidget(widget);
Packit b099d7
Packit b099d7
    if (window != None) XDestroyWindow(XtDisplay(widget), window);
Packit b099d7
} /* XtUnrealizeWidget */
Packit b099d7
Packit b099d7
Packit b099d7
void XtCreateWindow(widget, window_class, visual, value_mask, attributes)
Packit b099d7
    Widget		 widget;
Packit b099d7
    unsigned int	 window_class;
Packit b099d7
    Visual		 *visual;
Packit b099d7
    XtValueMask		 value_mask;
Packit b099d7
    XSetWindowAttributes *attributes;
Packit b099d7
{
Packit b099d7
    if (widget->core.window == None) {
Packit b099d7
	if (widget->core.width == 0 || widget->core.height == 0) {
Packit b099d7
	    Cardinal count = 1;
Packit b099d7
	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
Packit b099d7
		       "invalidDimension", "xtCreateWindow", XtCXtToolkitError,
Packit b099d7
		       "Widget %s has zero width and/or height",
Packit b099d7
		       &widget->core.name, &count);
Packit b099d7
	}
Packit b099d7
	widget->core.window =
Packit b099d7
	    XCreateWindow (
Packit b099d7
		XtDisplay (widget),
Packit b099d7
		(widget->core.parent ?
Packit b099d7
		    widget->core.parent->core.window :
Packit b099d7
		    widget->core.screen->root),
Packit b099d7
		(int)widget->core.x, (int)widget->core.y,
Packit b099d7
		(unsigned)widget->core.width, (unsigned)widget->core.height,
Packit b099d7
		(unsigned)widget->core.border_width, (int) widget->core.depth,
Packit b099d7
		window_class, visual, value_mask, attributes);
Packit b099d7
    }
Packit b099d7
} /* XtCreateWindow */
Packit b099d7
Packit b099d7
Packit b099d7
/* ---------------- XtNameToWidget ----------------- */
Packit b099d7
Packit b099d7
static Widget NameListToWidget();
Packit b099d7
Packit b099d7
typedef Widget (*NameMatchProc)();
Packit b099d7
Packit b099d7
static Widget MatchExactChildren(names, bindings, children, num,
Packit b099d7
	in_depth, out_depth, found_depth)
Packit b099d7
    XrmNameList     names;
Packit b099d7
    XrmBindingList  bindings;
Packit b099d7
    register WidgetList children;
Packit b099d7
    register int num;
Packit b099d7
    int in_depth, *out_depth, *found_depth;
Packit b099d7
{
Packit b099d7
    register Cardinal   i;
Packit b099d7
    register XrmName    name = *names;
Packit b099d7
    Widget w, result = NULL;
Packit b099d7
    int d, min = 10000;
Packit b099d7
Packit b099d7
    for (i = 0; i < num; i++) {
Packit b099d7
	if (name == children[i]->core.xrm_name) {
Packit b099d7
	    w = NameListToWidget(children[i], &names[1], &bindings[1],
Packit b099d7
		    in_depth+1, &d, found_depth);
Packit b099d7
	    if (w != NULL && d < min) {result = w; min = d;}
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    *out_depth = min;
Packit b099d7
    return result;
Packit b099d7
}
Packit b099d7
Packit b099d7
static Widget MatchWildChildren(names, bindings, children, num,
Packit b099d7
	in_depth, out_depth, found_depth)
Packit b099d7
    XrmNameList     names;
Packit b099d7
    XrmBindingList  bindings;
Packit b099d7
    register WidgetList children;
Packit b099d7
    register int num;
Packit b099d7
    int in_depth, *out_depth, *found_depth;
Packit b099d7
{
Packit b099d7
    register Cardinal   i;
Packit b099d7
    Widget w, result = NULL;
Packit b099d7
    int d, min = 10000;
Packit b099d7
Packit b099d7
    for (i = 0; i < num; i++) {
Packit b099d7
	w = NameListToWidget(children[i], names, bindings,
Packit b099d7
		in_depth+1, &d, found_depth);
Packit b099d7
	if (w != NULL && d < min) {result = w; min = d;}
Packit b099d7
    }
Packit b099d7
    *out_depth = min;
Packit b099d7
    return result;
Packit b099d7
}
Packit b099d7
Packit b099d7
static Widget SearchChildren(root, names, bindings, matchproc,
Packit b099d7
	in_depth, out_depth, found_depth)
Packit b099d7
    Widget root;
Packit b099d7
    XrmNameList     names;
Packit b099d7
    XrmBindingList  bindings;
Packit b099d7
    NameMatchProc matchproc;
Packit b099d7
    int in_depth, *out_depth, *found_depth;
Packit b099d7
{
Packit b099d7
    Widget w1, w2;
Packit b099d7
    int d1, d2;
Packit b099d7
Packit b099d7
    if (XtIsComposite(root)) {
Packit b099d7
	w1 = (*matchproc)(names, bindings,
Packit b099d7
		((CompositeWidget) root)->composite.children,
Packit b099d7
		((CompositeWidget) root)->composite.num_children,
Packit b099d7
		in_depth, &d1, found_depth);
Packit b099d7
    } else d1 = 10000;
Packit b099d7
    w2 = (*matchproc)(names, bindings, root->core.popup_list,
Packit b099d7
	    root->core.num_popups, in_depth, &d2, found_depth);
Packit b099d7
    *out_depth = (d1 < d2 ? d1 : d2);
Packit b099d7
    return (d1 < d2 ? w1 : w2);
Packit b099d7
}
Packit b099d7
Packit b099d7
static Widget NameListToWidget(root, names, bindings,
Packit b099d7
	in_depth, out_depth, found_depth)
Packit b099d7
    register Widget root;
Packit b099d7
    XrmNameList     names;
Packit b099d7
    XrmBindingList  bindings;
Packit b099d7
    int in_depth, *out_depth, *found_depth;
Packit b099d7
{
Packit b099d7
    Widget w1, w2;
Packit b099d7
    int d1, d2;
Packit b099d7
Packit b099d7
    if (in_depth >= *found_depth) {
Packit b099d7
	*out_depth = 10000;
Packit b099d7
	return NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (names[0] == NULLQUARK) {
Packit b099d7
	*out_depth = *found_depth = in_depth;
Packit b099d7
	return root;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (! XtIsWidget(root)) {
Packit b099d7
	*out_depth = 10000;
Packit b099d7
	return NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (*bindings == XrmBindTightly) {
Packit b099d7
	return SearchChildren(root, names, bindings, MatchExactChildren,
Packit b099d7
		in_depth, out_depth, found_depth);
Packit b099d7
Packit b099d7
    } else {	/* XrmBindLoosely */
Packit b099d7
	w1 = SearchChildren(root, names, bindings, MatchExactChildren,
Packit b099d7
		in_depth, &d1, found_depth);
Packit b099d7
	w2 = SearchChildren(root, names, bindings, MatchWildChildren,
Packit b099d7
		in_depth, &d2, found_depth);
Packit b099d7
	*out_depth = (d1 < d2 ? d1 : d2);
Packit b099d7
	return (d1 < d2 ? w1 : w2);
Packit b099d7
    }
Packit b099d7
} /* NameListToWidget */
Packit b099d7
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
Widget XtNameToWidget(
Packit b099d7
    Widget root,
Packit b099d7
    _Xconst char* name
Packit b099d7
    )
Packit b099d7
#else
Packit b099d7
Widget XtNameToWidget(root, name)
Packit b099d7
    Widget root;
Packit b099d7
    String name;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XrmName *names;
Packit b099d7
    XrmBinding *bindings;
Packit b099d7
    int len, depth, found = 10000;
Packit b099d7
    Widget result;
Packit b099d7
Packit b099d7
    len = strlen(name);
Packit b099d7
    if (len == 0) return NULL;
Packit b099d7
Packit b099d7
    names = (XrmName *) ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmName));
Packit b099d7
    bindings = (XrmBinding *)
Packit b099d7
	ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmBinding));
Packit b099d7
    if (names == NULL || bindings == NULL) _XtAllocError(NULL);
Packit b099d7
Packit b099d7
    XrmStringToBindingQuarkList(name, bindings, names);
Packit b099d7
    if (names[0] == NULLQUARK) {
Packit b099d7
	DEALLOCATE_LOCAL((char *) bindings);
Packit b099d7
	DEALLOCATE_LOCAL((char *) names);
Packit b099d7
	return NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    result = NameListToWidget(root, names, bindings, 0, &depth, &found);
Packit b099d7
Packit b099d7
    DEALLOCATE_LOCAL((char *) bindings);
Packit b099d7
    DEALLOCATE_LOCAL((char *) names);
Packit b099d7
    return result;
Packit b099d7
} /* XtNameToWidget */
Packit b099d7
Packit b099d7
/* Define user versions of intrinsics macros */
Packit b099d7
Packit b099d7
#undef XtDisplayOfObject
Packit b099d7
Display *XtDisplayOfObject(object)
Packit b099d7
     Widget object;
Packit b099d7
{
Packit b099d7
    return XtDisplay(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtDisplay
Packit b099d7
Display *XtDisplay(widget)
Packit b099d7
	Widget widget;
Packit b099d7
{
Packit b099d7
    return DisplayOfScreen(widget->core.screen);
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtScreenOfObject
Packit b099d7
Screen *XtScreenOfObject(object)
Packit b099d7
     Widget object;
Packit b099d7
{
Packit b099d7
    return XtScreen(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtScreen
Packit b099d7
Screen *XtScreen(widget)
Packit b099d7
	Widget widget;
Packit b099d7
{
Packit b099d7
    return widget->core.screen;
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtWindowOfObject
Packit b099d7
Window XtWindowOfObject(object)
Packit b099d7
     Widget object;
Packit b099d7
{
Packit b099d7
    return XtWindow(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
#undef XtWindow
Packit b099d7
Window XtWindow(widget)
Packit b099d7
	Widget widget;
Packit b099d7
{
Packit b099d7
    return widget->core.window;
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtSuperclass
Packit b099d7
WidgetClass XtSuperclass(widget)
Packit b099d7
	Widget widget;
Packit b099d7
{
Packit b099d7
	return XtClass(widget)->core_class.superclass;
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtClass
Packit b099d7
WidgetClass XtClass(widget)
Packit b099d7
	Widget widget;
Packit b099d7
{
Packit b099d7
	return widget->core.widget_class;
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtIsManaged
Packit b099d7
Boolean XtIsManaged(object)
Packit b099d7
	Widget object;
Packit b099d7
{
Packit b099d7
    if (XtIsRectObj(object))
Packit b099d7
	return object->core.managed;
Packit b099d7
    else
Packit b099d7
	return False;
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtIsRealized
Packit b099d7
Boolean XtIsRealized (object)
Packit b099d7
	Widget   object;
Packit b099d7
{
Packit b099d7
    return XtWindowOfObject(object) != None;
Packit b099d7
} /* XtIsRealized */
Packit b099d7
Packit b099d7
#undef XtIsSensitive
Packit b099d7
Boolean XtIsSensitive(object)
Packit b099d7
	Widget	object;
Packit b099d7
{
Packit b099d7
    if (XtIsRectObj(object))
Packit b099d7
	return object->core.sensitive && object->core.ancestor_sensitive;
Packit b099d7
    else
Packit b099d7
	return False;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Internal routine; must be called only after XtIsWidget returns false
Packit b099d7
 */
Packit b099d7
Widget _XtWindowedAncestor(object)
Packit b099d7
    register Widget object;
Packit b099d7
{
Packit b099d7
    Widget obj = object;
Packit b099d7
    for (object = XtParent(object); object && !XtIsWidget(object);)
Packit b099d7
	object = XtParent(object);
Packit b099d7
Packit b099d7
    if (object == NULL) {
Packit b099d7
	String params = XtName(obj);
Packit b099d7
	Cardinal num_params = 1;
Packit b099d7
	XtErrorMsg("noWidgetAncestor", "windowedAncestor", XtCXtToolkitError,
Packit b099d7
		   "Object \"%s\" does not have windowed ancestor",
Packit b099d7
		   &params, &num_params);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return object;
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtParent
Packit b099d7
Widget XtParent(widget)
Packit b099d7
	Widget widget;
Packit b099d7
{
Packit b099d7
	return widget->core.parent;
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef XtName
Packit b099d7
String XtName(object)
Packit b099d7
     Widget object;
Packit b099d7
{
Packit b099d7
    return XrmQuarkToString(object->core.xrm_name);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Boolean XtIsObject(object)
Packit b099d7
    Widget object;
Packit b099d7
{
Packit b099d7
    WidgetClass wc;
Packit b099d7
    String class_name;
Packit b099d7
Packit b099d7
    /* perform basic sanity checks */
Packit b099d7
    if (object->core.self != object || object->core.xrm_name == NULLQUARK)
Packit b099d7
	return False;
Packit b099d7
Packit b099d7
    wc = object->core.widget_class;
Packit b099d7
    if (wc->core_class.class_name == NULL ||
Packit b099d7
	wc->core_class.xrm_class == NULLQUARK ||
Packit b099d7
	(class_name = XrmClassToString(wc->core_class.xrm_class)) == NULL ||
Packit b099d7
	strcmp(wc->core_class.class_name, class_name) != 0)
Packit b099d7
	    return False;
Packit b099d7
Packit b099d7
    if (XtIsWidget(object)) {
Packit b099d7
	if (object->core.name == NULL ||
Packit b099d7
	    (class_name = XrmNameToString(object->core.xrm_name)) == NULL ||
Packit b099d7
	    strcmp(object->core.name, class_name) != 0)
Packit b099d7
	    return False;
Packit b099d7
    }
Packit b099d7
    return True;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static Boolean TestFile(path)
Packit b099d7
    String path;
Packit b099d7
{
Packit b099d7
#ifdef VMS
Packit b099d7
    return TRUE;	/* Who knows what to do here? */
Packit b099d7
#else
Packit b099d7
    struct stat status;
Packit b099d7
Packit b099d7
    return (access(path, R_OK) == 0 &&		/* exists and is readable */
Packit b099d7
	    stat(path, &status) == 0 &&		/* get the status */
Packit b099d7
#ifndef X_NOT_POSIX
Packit b099d7
	    S_ISDIR(status.st_mode) == 0);	/* not a directory */
Packit b099d7
#else
Packit b099d7
	    (status.st_mode & S_IFDIR) == 0);	/* not a directory */
Packit b099d7
#endif /* X_NOT_POSIX else */
Packit b099d7
#endif /* VMS */
Packit b099d7
}
Packit b099d7
Packit b099d7
/* return of TRUE = resolved string fit, FALSE = didn't fit.  Not
Packit b099d7
   null-terminated and not collapsed if it didn't fit */
Packit b099d7
Packit b099d7
static Boolean Resolve(source, len, sub, num, buf, collapse)
Packit b099d7
    register char *source;	/* The source string */
Packit b099d7
    register int len;		/* The length in bytes of *source */
Packit b099d7
    Substitution sub;	/* Array of string values to substitute */
Packit b099d7
    Cardinal num;	/* Number of substitution entries */
Packit b099d7
    char *buf;		/* Where to put the resolved string; */
Packit b099d7
    char collapse;	/* Character to collapse */
Packit b099d7
{
Packit b099d7
    register int bytesLeft = PATH_MAX;
Packit b099d7
    register char* bp = buf;
Packit b099d7
#ifndef DONT_COLLAPSE
Packit b099d7
    Boolean atBeginning = TRUE;
Packit b099d7
    Boolean prevIsCollapse = FALSE;
Packit b099d7
Packit b099d7
#define PUT(ch) \
Packit b099d7
    { \
Packit b099d7
	if (--bytesLeft == 0) return FALSE; \
Packit b099d7
        if (prevIsCollapse) \
Packit b099d7
	    if ((*bp = ch) != collapse) { \
Packit b099d7
		prevIsCollapse = FALSE; \
Packit b099d7
		bp++; \
Packit b099d7
	    } \
Packit b099d7
	    else bytesLeft++; \
Packit b099d7
        else if ((*bp++ = ch) == collapse && !atBeginning) \
Packit b099d7
	    prevIsCollapse = TRUE; \
Packit b099d7
    }
Packit b099d7
#else /* DONT_COLLAPSE */
Packit b099d7
Packit b099d7
#define PUT(ch) \
Packit b099d7
    { \
Packit b099d7
	if (--bytesLeft == 0) return FALSE; \
Packit b099d7
	*bp++ = ch; \
Packit b099d7
    }
Packit b099d7
#endif /* DONT_COLLAPSE */
Packit b099d7
#define escape '%'
Packit b099d7
Packit b099d7
    while (len--) {
Packit b099d7
#ifndef DONT_COLLAPSE
Packit b099d7
	if (*source == collapse) {
Packit b099d7
	    PUT(*source);
Packit b099d7
	    source++;
Packit b099d7
	    continue;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
#endif /* DONT_COLLAPSE */
Packit b099d7
	    if (*source != escape) {
Packit b099d7
		PUT(*source);
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    source++;
Packit b099d7
	    if (len-- == 0) {
Packit b099d7
		PUT(escape);
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (*source == ':' || *source == escape)
Packit b099d7
		PUT(*source)
Packit b099d7
	    else {
Packit b099d7
		/* Match the character against the match array */
Packit b099d7
		register int j;
Packit b099d7
Packit b099d7
		for (j = 0; j < num && sub[j].match != *source; j++) {}
Packit b099d7
Packit b099d7
		/* Substitute the substitution string */
Packit b099d7
Packit b099d7
		if (j >= num) PUT(*source)
Packit b099d7
		else if (sub[j].substitution != NULL) {
Packit b099d7
		    char *sp = sub[j].substitution;
Packit b099d7
		    while (*sp) {
Packit b099d7
			PUT(*sp);
Packit b099d7
			sp++;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	source++;
Packit b099d7
#ifndef DONT_COLLAPSE
Packit b099d7
	atBeginning = FALSE;
Packit b099d7
#endif /* DONT_COLLAPSE */
Packit b099d7
    }
Packit b099d7
    PUT('\0');
Packit b099d7
Packit b099d7
    return TRUE;
Packit b099d7
#undef PUT
Packit b099d7
#undef escape
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
String XtFindFile(
Packit b099d7
    _Xconst char* path,
Packit b099d7
    Substitution substitutions,
Packit b099d7
    Cardinal num_substitutions,
Packit b099d7
    XtFilePredicate predicate
Packit b099d7
    )
Packit b099d7
#else
Packit b099d7
String XtFindFile(path, substitutions, num_substitutions, predicate)
Packit b099d7
    String path;
Packit b099d7
    Substitution substitutions;
Packit b099d7
    Cardinal num_substitutions;
Packit b099d7
    XtFilePredicate predicate;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    char *buf, *buf1, *buf2, *colon, *start;
Packit b099d7
    int len;
Packit b099d7
    Boolean firstTime = TRUE;
Packit b099d7
Packit b099d7
    buf = buf1 = XtMalloc((unsigned)PATH_MAX);
Packit b099d7
    buf2 = XtMalloc((unsigned)PATH_MAX);
Packit b099d7
Packit b099d7
    if (predicate == NULL) predicate = TestFile;
Packit b099d7
Packit b099d7
    while (1) {
Packit b099d7
	start = (String)path;
Packit b099d7
	while (1) {
Packit b099d7
	    colon = index(start, ':');
Packit b099d7
	    if (colon == NULL) break;
Packit b099d7
	    if (colon == path) {start++; path++; continue; }
Packit b099d7
	    if (*(colon-1) != '%') break;
Packit b099d7
	    start = colon+1;
Packit b099d7
	}
Packit b099d7
	if (colon != NULL)
Packit b099d7
	    len = colon - path;
Packit b099d7
	else
Packit b099d7
	    len = strlen(path);
Packit b099d7
	if (Resolve(path, len, substitutions, num_substitutions,
Packit b099d7
		    buf, '/')) {
Packit b099d7
	    if (firstTime || strcmp(buf1,buf2) != 0) {
Packit b099d7
#ifdef XNL_DEBUG
Packit b099d7
		printf("Testing file %s\n", buf);
Packit b099d7
#endif /* XNL_DEBUG */
Packit b099d7
Packit b099d7
		/* Check out the file */
Packit b099d7
		if ((*predicate) (buf)) {
Packit b099d7
		    /* We've found it, return it */
Packit b099d7
#ifdef XNL_DEBUG
Packit b099d7
		    printf("File found.\n");
Packit b099d7
#endif /* XNL_DEBUG */
Packit b099d7
		    if (buf == buf1) XtFree(buf2);
Packit b099d7
		    else XtFree(buf1);
Packit b099d7
		    return buf;
Packit b099d7
		}
Packit b099d7
		if (buf == buf1)
Packit b099d7
		    buf = buf2;
Packit b099d7
		else
Packit b099d7
		    buf = buf1;
Packit b099d7
		firstTime = FALSE;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* Nope...any more paths? */
Packit b099d7
Packit b099d7
	if (colon == NULL) break;
Packit b099d7
	path = colon+1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* No file found */
Packit b099d7
Packit b099d7
    XtFree(buf1);
Packit b099d7
    XtFree(buf2);
Packit b099d7
    return NULL;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/* The implementation of this routine is operating system dependent */
Packit b099d7
Packit b099d7
static char *ExtractLocaleName(lang)
Packit b099d7
    String	lang;
Packit b099d7
{
Packit b099d7
Packit b099d7
#ifdef hpux	 /* hpux-specific parsing of the locale string */
Packit b099d7
#define MAXLOCALE       64      /* buffer size of locale name */
Packit b099d7
Packit b099d7
    char           *start;
Packit b099d7
    char           *end;
Packit b099d7
    int             len;
Packit b099d7
    static char     buf[MAXLOCALE];
Packit b099d7
Packit b099d7
    /*  If lang has a substring ":<category>;", extract <category>
Packit b099d7
     *  from the first such occurrence as the locale name.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    start = lang;
Packit b099d7
    if (start = strchr (lang, ':')) {
Packit b099d7
        start++;
Packit b099d7
        if (end = strchr (start, ';')) {
Packit b099d7
            len = end - start;
Packit b099d7
            strncpy(buf, start, len);
Packit b099d7
            *(buf + len) = '\0';
Packit b099d7
            lang = buf;
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
#endif	/* hpux */
Packit b099d7
Packit b099d7
    /*  If result is "C", return NULL instead. */
Packit b099d7
Packit b099d7
    if (strcmp(lang, "C"))
Packit b099d7
        return lang;
Packit b099d7
    else
Packit b099d7
      return NULL;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void FillInLangSubs(subs, pd)
Packit b099d7
    Substitution subs;
Packit b099d7
    XtPerDisplay pd;
Packit b099d7
{
Packit b099d7
    int len;
Packit b099d7
    char *string, *p1, *p2, *p3;
Packit b099d7
    char **rest;
Packit b099d7
    char *ch;
Packit b099d7
Packit b099d7
    if (pd->language == NULL || pd->language[0] == '\0') {
Packit b099d7
	subs[0].substitution = subs[1].substitution =
Packit b099d7
		subs[2].substitution = subs[3].substitution = NULL;
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    string = ExtractLocaleName(pd->language);
Packit b099d7
Packit b099d7
    if (string == NULL || string[0] == '\0') {
Packit b099d7
	subs[0].substitution = subs[1].substitution =
Packit b099d7
		subs[2].substitution = subs[3].substitution = NULL;
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    len = strlen(string) + 1;
Packit b099d7
    subs[0].substitution = string;
Packit b099d7
    p1 = subs[1].substitution = XtMalloc((Cardinal) 3*len);
Packit b099d7
    p2 = subs[2].substitution = subs[1].substitution + len;
Packit b099d7
    p3 = subs[3].substitution = subs[2].substitution + len;
Packit b099d7
Packit b099d7
    /* Everything up to the first "_" goes into p1.  From "_" to "." in
Packit b099d7
       p2.  The rest in p3.  If no delimiters, all goes into p1.  We
Packit b099d7
       assume p1, p2, and p3 are large enough. */
Packit b099d7
Packit b099d7
    *p1 = *p2 = *p3 = '\0';
Packit b099d7
Packit b099d7
    ch = index(string, '_');
Packit b099d7
    if (ch != NULL) {
Packit b099d7
	len = ch - string;
Packit b099d7
	(void) strncpy(p1, string, len);
Packit b099d7
	p1[len] = '\0';
Packit b099d7
	string = ch + 1;
Packit b099d7
	rest = &p2;
Packit b099d7
    } else rest = &p1;
Packit b099d7
Packit b099d7
    /* Rest points to where we put the first part */
Packit b099d7
Packit b099d7
    ch = index(string, '.');
Packit b099d7
    if (ch != NULL) {
Packit b099d7
	len = ch - string;
Packit b099d7
	strncpy(*rest, string, len);
Packit b099d7
	(*rest)[len] = '\0';
Packit b099d7
	(void) strcpy(p3, ch+1);
Packit b099d7
    } else (void) strcpy(*rest, string);
Packit b099d7
}
Packit b099d7
Packit b099d7
static SubstitutionRec defaultSubs[] = {
Packit b099d7
    {'N', NULL},
Packit b099d7
    {'T', NULL},
Packit b099d7
    {'S', NULL},
Packit b099d7
    {'C', NULL},
Packit b099d7
    {'L', NULL},
Packit b099d7
    {'l', NULL}, 
Packit b099d7
    {'t', NULL},
Packit b099d7
    {'c', NULL}
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
String XtResolvePathname(
Packit b099d7
    Display *dpy,
Packit b099d7
    _Xconst char* type,
Packit b099d7
    _Xconst char* filename,
Packit b099d7
    _Xconst char* suffix,
Packit b099d7
    _Xconst char* path,
Packit b099d7
    Substitution substitutions,
Packit b099d7
    Cardinal num_substitutions,
Packit b099d7
    XtFilePredicate predicate
Packit b099d7
    )
Packit b099d7
#else
Packit b099d7
String XtResolvePathname(dpy, type, filename, suffix, path, substitutions,
Packit b099d7
			 num_substitutions, predicate)
Packit b099d7
    Display *dpy;
Packit b099d7
    String type, filename, suffix, path;
Packit b099d7
    Substitution substitutions;
Packit b099d7
    Cardinal num_substitutions;
Packit b099d7
    XtFilePredicate predicate;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XtPerDisplay pd = _XtGetPerDisplay(dpy);
Packit b099d7
    static char *defaultPath = NULL;
Packit b099d7
    char *massagedPath;
Packit b099d7
    int bytesAllocd, bytesLeft;
Packit b099d7
    char *ch, *result;
Packit b099d7
    Substitution merged_substitutions;
Packit b099d7
    XrmRepresentation db_type;
Packit b099d7
    XrmValue value;
Packit b099d7
    XrmName name_list[3];
Packit b099d7
    XrmClass class_list[3];
Packit b099d7
    Boolean pathMallocd = False;
Packit b099d7
Packit b099d7
    if (path == NULL) {
Packit b099d7
#ifndef VMS
Packit b099d7
	if (defaultPath == NULL) {
Packit b099d7
	    defaultPath = getenv("XFILESEARCHPATH");
Packit b099d7
	    if (defaultPath == NULL) defaultPath = XFILESEARCHPATHDEFAULT;
Packit b099d7
	}
Packit b099d7
	path = defaultPath;
Packit b099d7
#else
Packit b099d7
	path = "";	/* NULL would kill us later */
Packit b099d7
#endif /* VMS */
Packit b099d7
    }	
Packit b099d7
Packit b099d7
    if (filename == NULL) {
Packit b099d7
	filename = XrmClassToString(pd->class);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    bytesAllocd = bytesLeft = 1000;
Packit b099d7
    massagedPath = ALLOCATE_LOCAL(bytesAllocd);
Packit b099d7
    if (massagedPath == NULL) _XtAllocError(NULL);
Packit b099d7
Packit b099d7
    if (path[0] == ':') {
Packit b099d7
	strcpy(massagedPath, "%N%S");
Packit b099d7
	ch = &massagedPath[4];
Packit b099d7
	bytesLeft -= 4;
Packit b099d7
    } else ch = massagedPath;
Packit b099d7
Packit b099d7
    /* Insert %N%S between adjacent colons */
Packit b099d7
Packit b099d7
    while (*path != '\0') {
Packit b099d7
	if (bytesLeft < 8) {
Packit b099d7
	    int bytesUsed = bytesAllocd - bytesLeft;
Packit b099d7
	    char *new;
Packit b099d7
	    bytesAllocd +=1000;
Packit b099d7
	    new = XtMalloc((Cardinal) bytesAllocd);
Packit b099d7
	    strncpy( new, massagedPath, bytesUsed );
Packit b099d7
	    ch = new + bytesUsed;
Packit b099d7
	    if (pathMallocd)
Packit b099d7
		XtFree(massagedPath);
Packit b099d7
	    else
Packit b099d7
		DEALLOCATE_LOCAL(massagedPath);
Packit b099d7
	    pathMallocd = True;
Packit b099d7
	    massagedPath = new;
Packit b099d7
	    bytesLeft = bytesAllocd - bytesUsed;
Packit b099d7
	}
Packit b099d7
	if (*path == '%' && *(path+1) == ':') {
Packit b099d7
	    *ch++ = '%';
Packit b099d7
	    *ch++ = ':';
Packit b099d7
	    path += 2;
Packit b099d7
	    bytesLeft -= 2;
Packit b099d7
	    continue;
Packit b099d7
	}
Packit b099d7
	if (*path == ':' && *(path+1) == ':') {
Packit b099d7
	    strcpy(ch, ":%N%S:");
Packit b099d7
	    ch += 6;
Packit b099d7
	    bytesLeft -= 6;
Packit b099d7
	    while (*path == ':') path++;
Packit b099d7
	    continue;
Packit b099d7
	}
Packit b099d7
	*ch++ = *path++;
Packit b099d7
	bytesLeft--;
Packit b099d7
    }
Packit b099d7
    *ch = '\0';
Packit b099d7
#ifdef XNL_DEBUG
Packit b099d7
    printf("Massaged path: %s\n", massagedPath);
Packit b099d7
#endif /* XNL_DEBUG */
Packit b099d7
Packit b099d7
    if (num_substitutions == 0)
Packit b099d7
	merged_substitutions = defaultSubs;
Packit b099d7
    else {
Packit b099d7
	int i = XtNumber(defaultSubs);
Packit b099d7
	Substitution sub, def;
Packit b099d7
	merged_substitutions = sub = (Substitution)
Packit b099d7
	    ALLOCATE_LOCAL((unsigned)(num_substitutions+i)*sizeof(SubstitutionRec));
Packit b099d7
	if (sub == NULL) _XtAllocError(NULL);
Packit b099d7
	for (def = defaultSubs; i--; sub++, def++) sub->match = def->match;
Packit b099d7
	for (i = num_substitutions; i--; ) *sub++ = *substitutions++;
Packit b099d7
    }
Packit b099d7
    merged_substitutions[0].substitution = (String)filename;
Packit b099d7
    merged_substitutions[1].substitution = (String)type;
Packit b099d7
    merged_substitutions[2].substitution = (String)suffix;
Packit b099d7
    name_list[0] = pd->name;
Packit b099d7
    name_list[1] = XrmPermStringToQuark("customization");
Packit b099d7
    name_list[2] = NULLQUARK;
Packit b099d7
    class_list[0] = pd->class;
Packit b099d7
    class_list[1] = XrmPermStringToQuark("Customization");
Packit b099d7
    class_list[2] = NULLQUARK;
Packit b099d7
    if (XrmQGetResource(XrmGetDatabase(dpy), name_list, class_list,
Packit b099d7
			&db_type, &value) &&
Packit b099d7
	db_type == _XtQString)
Packit b099d7
	merged_substitutions[3].substitution = (char *)value.addr;
Packit b099d7
    else
Packit b099d7
	merged_substitutions[3].substitution = NULL;
Packit b099d7
    FillInLangSubs(&merged_substitutions[4], pd);
Packit b099d7
Packit b099d7
    result = XtFindFile(massagedPath, merged_substitutions,
Packit b099d7
			num_substitutions + XtNumber(defaultSubs),
Packit b099d7
			predicate);
Packit b099d7
Packit b099d7
    if (merged_substitutions[5].substitution != NULL)
Packit b099d7
	XtFree( (XtPointer)merged_substitutions[5].substitution );
Packit b099d7
Packit b099d7
    if (merged_substitutions != defaultSubs) 
Packit b099d7
	DEALLOCATE_LOCAL(merged_substitutions);
Packit b099d7
Packit b099d7
    if (pathMallocd)
Packit b099d7
	XtFree(massagedPath);
Packit b099d7
    else
Packit b099d7
	DEALLOCATE_LOCAL(massagedPath);
Packit b099d7
Packit b099d7
    return result;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Boolean XtCallAcceptFocus(widget, time)
Packit b099d7
    Widget widget;
Packit b099d7
    Time *time;
Packit b099d7
{
Packit b099d7
    XtAcceptFocusProc ac = XtClass(widget)->core_class.accept_focus;
Packit b099d7
Packit b099d7
    if (ac != NULL) return (*ac) (widget, time);
Packit b099d7
    else return FALSE;
Packit b099d7
}