|
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 |
¶ms, &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 |
}
|