Blame lib/Xm/XmExtUtil.c

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
Packit b099d7
/************************************************************
Packit b099d7
*	INCLUDE FILES
Packit b099d7
*************************************************************/
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <stdarg.h>
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
Packit b099d7
#include "XmI.h"
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
#include <Xm/PrimitiveP.h>
Packit b099d7
#include <Xm/GadgetP.h>
Packit b099d7
#include <Xm/ExtP.h>
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
*	TYPEDEFS AND DEFINES
Packit b099d7
*************************************************************/
Packit b099d7
Packit b099d7
typedef struct _PixmapCache {
Packit b099d7
    Screen *screen;
Packit b099d7
    Pixmap pixmap;
Packit b099d7
    Pixel foreground, background;
Packit b099d7
    unsigned int depth;
Packit b099d7
    int ref_count;
Packit b099d7
    struct _PixmapCache *next;
Packit b099d7
} CacheEntry;
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
*	MACROS
Packit b099d7
*************************************************************/
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
*	GLOBAL DECLARATIONS
Packit b099d7
*************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
String xm_std_filter[] = { XmNx, XmNy, XmNwidth, XmNheight,
Packit b099d7
			   XmNdestroyCallback, XmNsensitive, XmNuserData, 
Packit b099d7
			   XmNnavigationType, NULL };
Packit b099d7
Packit b099d7
String xm_std_constraint_filter[] = { XmNx, XmNy, XmNwidth, XmNheight, 
Packit b099d7
			   XmNdestroyCallback, XmNsensitive, XmNuserData, 
Packit b099d7
			   XmNnavigationType, XmNbottomAttachment,
Packit b099d7
			   XmNbottomOffset, XmNbottomPosition, XmNbottomWidget,
Packit b099d7
			   XmNbottomAttachment, XmNtopAttachment,
Packit b099d7
			   XmNleftOffset, XmNleftPosition, XmNleftWidget,
Packit b099d7
			   XmNtopOffset, XmNtopPosition, XmNtopWidget,
Packit b099d7
			   XmNrightOffset, XmNrightPosition, XmNrightWidget,
Packit b099d7
			   XmNrightAttachment, XmNleftAttachment,
Packit b099d7
			   XmNallowResize, XmNpaneMinimum, XmNshowSash, 
Packit b099d7
			   XmNpaneMaximum, XmNpreferredPaneSize, 
Packit b099d7
			   XmNresizeToPreferred, XmNskipAdjust,
Packit b099d7
			   XmNdFieldPrefHeight, XmNdFieldMaxHeight,
Packit b099d7
			   XmNdFieldPrefWidth, XmNdFieldMaxWidth,
Packit b099d7
                           XmNdFieldMinHeight, XmNdFieldMinWidth,
Packit b099d7
			   /* CR03683 */ XmNpixmapWidth, XmNpixmapHeight,
Packit b099d7
			   NULL };
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
*	EXTERNAL DECLARATIONS
Packit b099d7
*************************************************************/
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
*	STATIC DECLARATIONS
Packit b099d7
*************************************************************/
Packit b099d7
Packit b099d7
static CacheEntry *pixmapCache = NULL;
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
*	GLOBAL CODE
Packit b099d7
*************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: _XmRequestNewSize
Packit b099d7
 *	Description:   Asks our parent for a new size.
Packit b099d7
 *	Arguments:     w - the data request tree widget.
Packit b099d7
 *                     query_only - only ask what would happen, don't 
Packit b099d7
 *                                  change anything.
Packit b099d7
 *                     width, height - size to request.
Packit b099d7
 *                     r_width, r_height - allowed size.
Packit b099d7
 *	Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
XtGeometryResult
Packit b099d7
_XmRequestNewSize(Widget w, Boolean query_only, 
Packit b099d7
		  Dimension width, Dimension height,
Packit b099d7
		  Dimension * r_width, Dimension * r_height)
Packit b099d7
{
Packit b099d7
    XtGeometryResult ret_val;
Packit b099d7
    XtWidgetGeometry request, result;
Packit b099d7
Packit b099d7
    request.width = width;
Packit b099d7
    request.height = height;
Packit b099d7
    request.request_mode = CWWidth | CWHeight;
Packit b099d7
Packit b099d7
    if (query_only)
Packit b099d7
	request.request_mode |= XtCWQueryOnly;
Packit b099d7
Packit b099d7
    ret_val = XtMakeGeometryRequest(w, &request, &result);
Packit b099d7
Packit b099d7
    if (ret_val == XtGeometryAlmost) {
Packit b099d7
	if (!query_only)
Packit b099d7
	    ret_val = XtMakeGeometryRequest(w, &result, NULL);
Packit b099d7
Packit b099d7
	*r_width = result.width;
Packit b099d7
	*r_height = result.height;
Packit b099d7
    }
Packit b099d7
    else if (ret_val == XtGeometryYes) {
Packit b099d7
	*r_width = request.width;
Packit b099d7
	*r_height = request.height;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	*r_width = w->core.width;
Packit b099d7
	*r_height = w->core.height;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return(ret_val);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmHWQuery
Packit b099d7
 *	Description:   Handles much of the generic height and width query 
Packit b099d7
 *                     geometry processing.
Packit b099d7
 *	Arguments:     w - the widget to process.
Packit b099d7
 *                     intended, preferred - The values from the real query
Packit b099d7
 *                                           procedure.  It is assumed
Packit b099d7
 *                                           that preferred is already 
Packit b099d7
 *                                           filled with the correct desired
Packit b099d7
 *                                           size.
Packit b099d7
 *	Returns:       an XtGeometryResult.
Packit b099d7
 */
Packit b099d7
Packit b099d7
XtGeometryResult
Packit b099d7
_XmHWQuery(Widget w, XtWidgetGeometry * intended, XtWidgetGeometry * preferred)
Packit b099d7
{
Packit b099d7
    if (intended == NULL) {
Packit b099d7
	if ((preferred->width == w->core.width) &&
Packit b099d7
 	    (preferred->height == w->core.height))
Packit b099d7
	{
Packit b099d7
	    return(XtGeometryNo);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	if ((intended->request_mode & CWWidth) &&
Packit b099d7
	    (intended->request_mode & CWHeight))
Packit b099d7
	{
Packit b099d7
	    if ((intended->width == preferred->width) &&
Packit b099d7
		(intended->height == preferred->height))
Packit b099d7
	    {
Packit b099d7
		return(XtGeometryYes);
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		return(XtGeometryNo);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    preferred->request_mode = CWWidth | CWHeight;
Packit b099d7
    return(XtGeometryAlmost);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmGadgetWarning
Packit b099d7
 *	Description: Checks to see if this is a gadget.  If it is then
Packit b099d7
 *                   print out a warning, and return True.
Packit b099d7
 *	Arguments: w - the widget to check.
Packit b099d7
 *	Returns: True if this object is a gadget.
Packit b099d7
 */
Packit b099d7
Packit b099d7
Boolean
Packit b099d7
_XmGadgetWarning(Widget w)
Packit b099d7
{
Packit b099d7
    if (!XtIsRectObj(w) || XtIsWidget(w))
Packit b099d7
	return(False);
Packit b099d7
Packit b099d7
    XmeWarning(XtParent(w), XmNnoGadgetSupportMsg);
Packit b099d7
    
Packit b099d7
    return(True); 
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmGetFocus
Packit b099d7
 *	Description:   Gets the XmFocus.
Packit b099d7
 *	Arguments:     w - the icon button widget.
Packit b099d7
 *                     event - the event that caused this action.
Packit b099d7
 *                     params, num_params - action routine parameters.
Packit b099d7
 *	Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
void
Packit b099d7
_XmGetFocus(Widget w, XEvent * event, String * params, Cardinal * num_params)
Packit b099d7
{
Packit b099d7
#ifdef VMS
Packit b099d7
    if (XtIsRealized(w))
Packit b099d7
#endif
Packit b099d7
	(void) XmProcessTraversal(w, XmTRAVERSE_CURRENT);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmFilterArgs
Packit b099d7
 *	Description: Filters certain resources out of an argument list.
Packit b099d7
 *	Arguments: args, num_args - the input argument list.
Packit b099d7
 *                 filter - the list of resources (by name) to remove.
Packit b099d7
 * RETURNED        filtered_args, num_filtered_args - new filtered list.
Packit b099d7
 *	Returns: none.
Packit b099d7
 *
Packit b099d7
 * NOTE The caller of this function is responsible for freeing "filtered_args"
Packit b099d7
 *      with XtFree() when it is no longer in use.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmFilterArgs(ArgList args, Cardinal num_args, String *filter,
Packit b099d7
	      ArgList *filtered_args, Cardinal *num_filtered_args)
Packit b099d7
{
Packit b099d7
    ArgList fargs = (ArgList) XtMalloc(sizeof(Arg) * num_args);
Packit b099d7
    register int i;
Packit b099d7
    String *ptr;
Packit b099d7
Packit b099d7
    *filtered_args = fargs;
Packit b099d7
    *num_filtered_args = 0;
Packit b099d7
    for (i = 0; i < num_args; i++) {
Packit b099d7
	Boolean match = False;
Packit b099d7
	for (ptr = filter; *ptr != NULL; ptr++) {
Packit b099d7
	    if (streq(*ptr, args[i].name)) {
Packit b099d7
		match = True;
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	if (!match) {
Packit b099d7
	    *fargs++ = args[i];
Packit b099d7
	    (*num_filtered_args)++;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmSetValuesOnChildren
Packit b099d7
 *	Description: Calls setvalues on all children of this widget, 
Packit b099d7
 *                   and then recurses.
Packit b099d7
 *	Arguments: w - the widget to set.
Packit b099d7
 *                 args, num_args - arguments to set.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmSetValuesOnChildren(Widget w, ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
Packit b099d7
    if (!XtIsSubclass(w, compositeWidgetClass))
Packit b099d7
	return;
Packit b099d7
Packit b099d7
    ForAllChildren((CompositeWidget) w, childP) {
Packit b099d7
	XtSetValues(*childP, args, num_args);
Packit b099d7
	_XmSetValuesOnChildren(*childP, args, num_args);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*      Function Name: _XmUtilIsSubclassByNameQ
Packit b099d7
 *      Description:   Determines whether this is a subclass of the named
Packit b099d7
 *                     class.
Packit b099d7
 *      Arguments:     w - the widget to check.
Packit b099d7
 *                     nameq - a quarkified name for the class to check.
Packit b099d7
 *      Returns:       True if this is a subclass.
Packit b099d7
 */
Packit b099d7
Packit b099d7
Boolean
Packit b099d7
_XmUtilIsSubclassByNameQ(Widget w, XrmQuark nameq)
Packit b099d7
{
Packit b099d7
    WidgetClass class;
Packit b099d7
Packit b099d7
    Boolean returnValue = False;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    for (class = XtClass(w) ;
Packit b099d7
         class != NULL ;
Packit b099d7
         class = class->core_class.superclass)
Packit b099d7
    {
Packit b099d7
        if (nameq == XrmStringToQuark(class->core_class.class_name))
Packit b099d7
        {
Packit b099d7
            returnValue = True;
Packit b099d7
            break;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    
Packit b099d7
    return(returnValue);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmGetMBStringFromXmString
Packit b099d7
 *	Description: Given an Xm String, returns an MB string
Packit b099d7
 *	Arguments: xmstr - an Xm String.
Packit b099d7
 *	Returns: A multi byte string.
Packit b099d7
 */
Packit b099d7
Packit b099d7
String
Packit b099d7
_XmGetMBStringFromXmString(XmString xmstr)
Packit b099d7
{
Packit b099d7
    String 			text;
Packit b099d7
    XmStringContext 		context;   /* context for conversion	*/
Packit b099d7
    char			*newText;  /* new text string        	*/
Packit b099d7
    XmStringCharSet		charset;   /* dummy			*/
Packit b099d7
    XmStringDirection   	direction; /* dummy			*/
Packit b099d7
    XmStringComponentType	u_tag;	   /* is newline		*/
Packit b099d7
    int				length;    /* length of string		*/
Packit b099d7
    unsigned short		u_length;  /* bogus length		*/
Packit b099d7
    unsigned char		*u_value;  /* bogus value		*/
Packit b099d7
    XmStringComponentType 	type;	   /* type			*/
Packit b099d7
    Boolean			done, separator; /* done with it	*/
Packit b099d7
Packit b099d7
    if ( !XmStringInitContext(&context, xmstr) )
Packit b099d7
    {
Packit b099d7
      XmStringFree(xmstr);
Packit b099d7
      return(NULL);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * First path to get length.
Packit b099d7
     */
Packit b099d7
    length = 0; 
Packit b099d7
    if ( XmStringPeekNextComponent(context) == XmSTRING_COMPONENT_UNKNOWN ) {
Packit b099d7
      XmStringFree(xmstr);
Packit b099d7
      XmStringFreeContext(context);
Packit b099d7
      return(NULL);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    done = False;
Packit b099d7
    while( !done ) 
Packit b099d7
    {
Packit b099d7
	newText = NULL;		/* By source code inspection I have */
Packit b099d7
	charset = NULL;		/* Determined that this will make sure */
Packit b099d7
	u_value = NULL;		/* that no memory is leaked (I hope). */
Packit b099d7
Packit b099d7
	type = XmStringGetNextComponent( context, &newText, &charset, 
Packit b099d7
		&direction, &u_tag, &u_length, &u_value );
Packit b099d7
Packit b099d7
        switch( type )
Packit b099d7
	{
Packit b099d7
    	case XmSTRING_COMPONENT_TEXT:
Packit b099d7
	case XmSTRING_COMPONENT_LOCALE_TEXT:
Packit b099d7
	    length += strlen( newText );
Packit b099d7
	    break;
Packit b099d7
 	case XmSTRING_COMPONENT_SEPARATOR:
Packit b099d7
	    length += 1;
Packit b099d7
	    break;
Packit b099d7
	case XmSTRING_COMPONENT_USER_BEGIN:
Packit b099d7
	case XmSTRING_COMPONENT_USER_END:
Packit b099d7
	case XmSTRING_COMPONENT_CHARSET:
Packit b099d7
	case XmSTRING_COMPONENT_DIRECTION:
Packit b099d7
	    break;
Packit b099d7
	case XmSTRING_COMPONENT_END:
Packit b099d7
	default:
Packit b099d7
	    done = True;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XtFree((XtPointer) newText);
Packit b099d7
	XtFree((XtPointer) charset);
Packit b099d7
	XtFree((XtPointer) u_value);
Packit b099d7
   }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If XmStringGetNextComponent() fails on the current xmstring,
Packit b099d7
     * try by using XmStringGetNextSegment(). AIX 4.3.2 currently
Packit b099d7
     * fails to obtain the compound string from
Packit b099d7
     * XmStringGetNextComponent. (Change Reguest: CR03841)
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if(length == 0) {
Packit b099d7
	while ( XmStringGetNextSegment(context, &newText, &charset,
Packit b099d7
				       &direction, &separator) ) {
Packit b099d7
Packit b099d7
	length = strlen(newText);
Packit b099d7
	if (separator == True) {
Packit b099d7
	  length += 1;     ;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	text = XtMalloc( length + 1 );
Packit b099d7
	text[0] = '\0';
Packit b099d7
	strcat(text, newText);
Packit b099d7
Packit b099d7
	if (separator == True) {
Packit b099d7
	  strcat(text, "\n");
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XtFree(newText);
Packit b099d7
	XmStringFreeContext(context);
Packit b099d7
Packit b099d7
	return (text);
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Failed to obtain any compound string, return with NULL pointer.
Packit b099d7
     */
Packit b099d7
    if(length == 0) return(NULL);
Packit b099d7
    
Packit b099d7
    XmStringFreeContext( context );
Packit b099d7
    text = XtMalloc( length + 1 );
Packit b099d7
    text[0] = '\0';
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Fill in the string.
Packit b099d7
     */ 
Packit b099d7
    XmStringInitContext(&context, xmstr);
Packit b099d7
Packit b099d7
    done = False;
Packit b099d7
    while( !done ) 
Packit b099d7
    {
Packit b099d7
	newText = NULL;		/* By source code inspection I have */
Packit b099d7
	charset = NULL;		/* Determined that this will make sure */
Packit b099d7
	u_value = NULL;		/* that no memory is leaked (I hope). */
Packit b099d7
Packit b099d7
	type = XmStringGetNextComponent( context, &newText, &charset, 
Packit b099d7
		&direction, &u_tag, &u_length, &u_value );
Packit b099d7
        switch( type )
Packit b099d7
	{
Packit b099d7
    	case XmSTRING_COMPONENT_TEXT:
Packit b099d7
	case XmSTRING_COMPONENT_LOCALE_TEXT:
Packit b099d7
	    strcat(text, newText); 
Packit b099d7
	    break;
Packit b099d7
 	case XmSTRING_COMPONENT_SEPARATOR:
Packit b099d7
	    strcat(text, "\n");
Packit b099d7
	    break;
Packit b099d7
	case XmSTRING_COMPONENT_USER_BEGIN:
Packit b099d7
	case XmSTRING_COMPONENT_USER_END:
Packit b099d7
	case XmSTRING_COMPONENT_CHARSET:
Packit b099d7
	case XmSTRING_COMPONENT_DIRECTION:
Packit b099d7
	    break;
Packit b099d7
	case XmSTRING_COMPONENT_END:
Packit b099d7
	default:
Packit b099d7
	    done = True;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XtFree((XtPointer) newText);
Packit b099d7
	XtFree((XtPointer) charset);
Packit b099d7
	XtFree((XtPointer) u_value);
Packit b099d7
   }
Packit b099d7
 
Packit b099d7
    XmStringFreeContext(context);
Packit b099d7
    return(text);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XiWoveWidget
Packit b099d7
 *	Description: Wrapper for XtMoveWidget to deal with Motif1.2
Packit b099d7
 *                   drag N drop.
Packit b099d7
 *	Arguments: w - The widget to change
Packit b099d7
 *                 x, y - The new location for this widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmMoveWidget(Widget w, Position x, Position y)
Packit b099d7
{
Packit b099d7
    XmDropSiteStartUpdate(w);
Packit b099d7
    XtMoveWidget(w, x, y);
Packit b099d7
    XmDropSiteEndUpdate(w);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmResizeWidget
Packit b099d7
 *	Description: Wrapper for XtResizeWidget to deal with Motif1.2
Packit b099d7
 *                   drag N drop.
Packit b099d7
 *	Arguments: w - The widget to change
Packit b099d7
 *                 width, height, bw - The new size for the widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmResizeWidget(Widget w, Dimension width, Dimension height, Dimension bw)
Packit b099d7
{
Packit b099d7
    XmDropSiteStartUpdate(w);
Packit b099d7
    XtResizeWidget(w, width, height, bw);
Packit b099d7
    XmDropSiteEndUpdate(w);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _XmConfigureWidget
Packit b099d7
 *	Description: Wrapper for XtConfigureWidget to deal with Motif1.2
Packit b099d7
 *                   drag N drop.
Packit b099d7
 *	Arguments: w - The widget to change
Packit b099d7
 *                 x, y - The new location for this widget.
Packit b099d7
 *                 width, height, bw - The new size for the widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmConfigureWidget(Widget w, Position x, Position y,
Packit b099d7
		   Dimension width, Dimension height, Dimension bw)
Packit b099d7
{
Packit b099d7
    /* 0x0 will sometimes result in a BadValue Error for X_ConfigureWindow */
Packit b099d7
    if (height < 1) height = 1;
Packit b099d7
    if (width < 1) width = 1;
Packit b099d7
Packit b099d7
    XmDropSiteStartUpdate(w);
Packit b099d7
    XtConfigureWidget(w, x, y, width, height, bw);
Packit b099d7
    XmDropSiteEndUpdate(w);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 *  This code is taken from the MIT X Consortium's Xmu 
Packit b099d7
 *  Utility Library.
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/* 
Packit b099d7
 * Copyright 1988 by the Massachusetts Institute of Technology
Packit b099d7
 *
Packit b099d7
 * Permission to use, copy, modify, and distribute this software and its
Packit b099d7
 * documentation for any purpose and without fee is hereby granted, provided 
Packit b099d7
 * that the above copyright notice appear in all copies and that both that 
Packit b099d7
 * copyright notice and this permission notice appear in supporting 
Packit b099d7
 * documentation, and that the name of M.I.T. not be used in advertising
Packit b099d7
 * or publicity pertaining to distribution of the software without specific, 
Packit b099d7
 * written prior permission. M.I.T. makes no representations about the 
Packit b099d7
 * suitability of this software for any purpose.  It is provided "as is"
Packit b099d7
 * without express or implied warranty.
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
#define  XK_LATIN1
Packit b099d7
#include <X11/keysymdef.h>
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * ISO Latin-1 case conversion routine
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmCompareISOLatin1(first, second)
Packit b099d7
 * Description:
Packit b099d7
 *	Compares two ISO Latin 1 strings to determine if they are equivalent.
Packit b099d7
 *	Case is not considered for the comparison.
Packit b099d7
 * Input:
Packit b099d7
 *	first  : char * - the first ISO Latin 1 String
Packit b099d7
 *	second : char * - the second ISO Latin 1 String
Packit b099d7
 * Output:
Packit b099d7
 *	int - (-1) -> first < second
Packit b099d7
 *            ( 0) -> first == second
Packit b099d7
 *            ( 1) -> first > second
Packit b099d7
 */
Packit b099d7
int
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmCompareISOLatin1(char *first, char *second)
Packit b099d7
#else
Packit b099d7
XmCompareISOLatin1(first, second)
Packit b099d7
    char *first, *second;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    register unsigned char *ap, *bp;
Packit b099d7
Packit b099d7
    for (ap = (unsigned char *) first, bp = (unsigned char *) second;
Packit b099d7
         *ap && *bp; ap++, bp++) {
Packit b099d7
        register unsigned char a, b;
Packit b099d7
Packit b099d7
        if ((a = *ap) != (b = *bp)) {
Packit b099d7
            /* try lowercasing and try again */
Packit b099d7
Packit b099d7
            if ((a >= XK_A) && (a <= XK_Z))
Packit b099d7
		a += (XK_a - XK_A);
Packit b099d7
            else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis))
Packit b099d7
              a += (XK_agrave - XK_Agrave);
Packit b099d7
            else if ((a >= XK_Ooblique) && (a <= XK_Thorn))
Packit b099d7
              a += (XK_oslash - XK_Ooblique);
Packit b099d7
Packit b099d7
            if ((b >= XK_A) && (b <= XK_Z))
Packit b099d7
              b += (XK_a - XK_A);
Packit b099d7
            else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis))
Packit b099d7
              b += (XK_agrave - XK_Agrave);
Packit b099d7
            else if ((b >= XK_Ooblique) && (b <= XK_Thorn))
Packit b099d7
              b += (XK_oslash - XK_Ooblique);
Packit b099d7
Packit b099d7
            if (a != b) break;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
    return (((int) *bp) - ((int) *ap));
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
XmCopyISOLatin1Lowered(dst, src)
Packit b099d7
    char *dst, *src;
Packit b099d7
{
Packit b099d7
    register unsigned char *dest, *source;
Packit b099d7
Packit b099d7
    for (dest = (unsigned char *)dst, source = (unsigned char *)src;
Packit b099d7
	 *source;
Packit b099d7
	 source++, dest++)
Packit b099d7
    {
Packit b099d7
	if ((*source >= XK_A) && (*source <= XK_Z))
Packit b099d7
	    *dest = *source + (XK_a - XK_A);
Packit b099d7
	else if ((*source >= XK_Agrave) && (*source <= XK_Odiaeresis))
Packit b099d7
	    *dest = *source + (XK_agrave - XK_Agrave);
Packit b099d7
	else if ((*source >= XK_Ooblique) && (*source <= XK_Thorn))
Packit b099d7
	    *dest = *source + (XK_oslash - XK_Ooblique);
Packit b099d7
	else
Packit b099d7
	    *dest = *source;
Packit b099d7
    }
Packit b099d7
    *dest = '\0';
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *	Creates a stippled pixmap of specified depth
Packit b099d7
 *	caches these so that multiple requests share the pixmap
Packit b099d7
 */
Packit b099d7
Packit b099d7
#define pixmap_width 2
Packit b099d7
#define pixmap_height 2
Packit b099d7
Packit b099d7
Pixmap 
Packit b099d7
XiCreateStippledPixmap(Screen *screen, 
Packit b099d7
		       Pixel fore, Pixel back, unsigned int depth)
Packit b099d7
{
Packit b099d7
    register Display *display = DisplayOfScreen(screen);
Packit b099d7
    CacheEntry *cachePtr;
Packit b099d7
    Pixmap stippled_pixmap;
Packit b099d7
    static unsigned char pixmap_bits[] = {
Packit b099d7
	0x02, 0x01,
Packit b099d7
    };
Packit b099d7
Packit b099d7
    /* see if we already have a pixmap suitable for this screen */
Packit b099d7
    for (cachePtr = pixmapCache; cachePtr; cachePtr = cachePtr->next) {
Packit b099d7
	if (cachePtr->screen == screen && cachePtr->foreground == fore &&
Packit b099d7
	    cachePtr->background == back && cachePtr->depth == depth)
Packit b099d7
	    return( cachePtr->ref_count++, cachePtr->pixmap );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    stippled_pixmap = XCreatePixmapFromBitmapData (display,
Packit b099d7
			RootWindowOfScreen(screen), (char *)pixmap_bits, 
Packit b099d7
			pixmap_width, pixmap_height, fore, back, depth);
Packit b099d7
Packit b099d7
    /* and insert it at the head of the cache */
Packit b099d7
    cachePtr = XtNew(CacheEntry);
Packit b099d7
    cachePtr->screen = screen;
Packit b099d7
    cachePtr->foreground = fore;
Packit b099d7
    cachePtr->background = back;
Packit b099d7
    cachePtr->depth = depth;
Packit b099d7
    cachePtr->pixmap = stippled_pixmap;
Packit b099d7
    cachePtr->ref_count = 1;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    cachePtr->next = pixmapCache;
Packit b099d7
    pixmapCache = cachePtr;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    return( stippled_pixmap );
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
XiReleaseStippledPixmap(Screen *screen, Pixmap pixmap)
Packit b099d7
{
Packit b099d7
    register Display *display = DisplayOfScreen(screen);
Packit b099d7
    CacheEntry *cachePtr, **prevP;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    for (prevP = &pixmapCache, cachePtr = pixmapCache; cachePtr;)
Packit b099d7
    {
Packit b099d7
        if (cachePtr->screen == screen && cachePtr->pixmap == pixmap)
Packit b099d7
        {
Packit b099d7
	        if (--cachePtr->ref_count == 0)
Packit b099d7
            {
Packit b099d7
		        XFreePixmap( display, pixmap );
Packit b099d7
		        *prevP = cachePtr->next;
Packit b099d7
		        XtFree( (char*)cachePtr );
Packit b099d7
		        break;
Packit b099d7
	        }
Packit b099d7
	    }
Packit b099d7
	    prevP = &cachePtr->next;
Packit b099d7
	    cachePtr = *prevP;
Packit b099d7
    }
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmCompareXtWidgetGeometryToWidget(geom, widget)
Packit b099d7
 * Description:
Packit b099d7
 *	This function compares an XtWidgetGeometry structure to the
Packit b099d7
 *	actual values contained in a widget.
Packit b099d7
 * Input:
Packit b099d7
 *	geom   : XtWidgetGeometry* - the geometry to test against the widget
Packit b099d7
 *	widget : Widget            - the widget to use in the comparison
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the geometry fits the specified widget, else False
Packit b099d7
 */
Packit b099d7
Boolean
Packit b099d7
XmCompareXtWidgetGeometryToWidget(XtWidgetGeometry *geom, Widget widget)
Packit b099d7
{
Packit b099d7
    Boolean returnValue = True;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if( (geom->request_mode & CWX && geom->x != widget->core.x) ||
Packit b099d7
        (geom->request_mode & CWY && geom->y != widget->core.y) ||
Packit b099d7
        (geom->request_mode & CWWidth && geom->width != XtHeight(widget)) ||
Packit b099d7
        (geom->request_mode & CWHeight && geom->height != XtHeight(widget)) ||
Packit b099d7
        (geom->request_mode & CWBorderWidth && geom->border_width != widget->core.border_width) )
Packit b099d7
    {
Packit b099d7
        returnValue = False;
Packit b099d7
    }
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    return( returnValue );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmCompareXtWidgetGeometry(geom1, geom2)
Packit b099d7
 * Description:
Packit b099d7
 *	Compares to XtWidgetGeometry structures to check for equality.
Packit b099d7
 * Input:
Packit b099d7
 *	geom1 : XtWidgetGeometry* - geometry to compare
Packit b099d7
 *	geom2 : XtWidgetGeometry* - geometry to compare
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if both the request_mode and values match, else False
Packit b099d7
 */
Packit b099d7
Boolean
Packit b099d7
XmCompareXtWidgetGeometry(XtWidgetGeometry *geom1, XtWidgetGeometry *geom2)
Packit b099d7
{
Packit b099d7
    if( geom1->request_mode != geom2->request_mode )
Packit b099d7
        return( False );
Packit b099d7
Packit b099d7
    if( (geom1->request_mode & CWX              && (geom1->x != geom2->x)) ||
Packit b099d7
        (geom1->request_mode & CWY              && (geom1->y != geom2->y)) ||
Packit b099d7
        (geom1->request_mode & CWWidth          && (geom1->width != geom2->width)) ||
Packit b099d7
        (geom1->request_mode & CWHeight         && (geom1->height != geom2->height)) ||
Packit b099d7
        (geom1->request_mode & CWBorderWidth    && (geom1->border_width != geom2->border_width)) ||
Packit b099d7
        (geom1->request_mode & CWSibling        && (geom1->sibling != geom2->sibling)) ||
Packit b099d7
        (geom1->request_mode & CWStackMode      && (geom1->stack_mode != geom2->stack_mode)) )
Packit b099d7
        return( False );
Packit b099d7
Packit b099d7
    return( True );
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 *  Static functions
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
Packit b099d7
/*************************************************************************/
Packit b099d7
/* The following code is snipped directly from OSF Motif 1.2.4           */
Packit b099d7
/* DEC did not compile this correctly (ALIGN_SUBCLASS_PARTS was not def- */
Packit b099d7
/* ined) on all versions of Motif for Digital Unix.  We include it here  */
Packit b099d7
/* to get correct behavior.                                              */
Packit b099d7
/*************************************************************************/
Packit b099d7
/* and now there's a fix added; refer to OSF contact number 24617 for
Packit b099d7
** details 
Packit b099d7
*/
Packit b099d7
/* And rewritten to support manual alignment.  HP/UX aligns doubles to
Packit b099d7
** 8 bytes, but everthing else to 4.  There is NO WAY to discover at
Packit b099d7
** runtime whether or not a structure contains doubles.  It cannot be
Packit b099d7
** done, period; thus, the OSF mechanism won't work for PA-RISC
Packit b099d7
** processors.  We get around that by specifying an extra flag (see
Packit b099d7
** XiResolvePartOffsets64) saying "align my subpart (only) to 8
Packit b099d7
** bytes".  This is needed in EPak only for the XiPanner widget.
Packit b099d7
** Note, this mechanism does NOT work for subclasses of 8-byte-aligned
Packit b099d7
** subparts.  We'd need to provide a "copy my parents offset array"
Packit b099d7
** flag for that.  Since EPak doesn't need it, we don't.  Beware...
Packit b099d7
*/
Packit b099d7
Packit b099d7
#define ALIGN_SUBCLASS_PARTS
Packit b099d7
Packit b099d7
#ifdef ALIGN_SUBCLASS_PARTS
Packit b099d7
#define _ALIGN(size) (((size) + (sizeof(double)-1)) & ~(sizeof(double)-1))
Packit b099d7
#else
Packit b099d7
#define _ALIGN(size) (size)
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  FIX for 5178: remove dependency on Xt private data 
Packit b099d7
 */
Packit b099d7
static Boolean
Packit b099d7
IsSubclassOf(
Packit b099d7
	WidgetClass wc,
Packit b099d7
	WidgetClass sc)
Packit b099d7
{
Packit b099d7
	WidgetClass p = wc;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
	for(; (p) && (p != sc); p = p->core_class.superclass);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
	return (p == sc);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
#define XtIsConstraintClass(wc) IsSubclassOf(wc, constraintWidgetClass)
Packit b099d7
/*
Packit b099d7
 *  end FIX for 5178.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XiResolveAllPartOffsets(
Packit b099d7
        WidgetClass w_class,
Packit b099d7
        XmOffsetPtr *offset,
Packit b099d7
        XmOffsetPtr *constraint_offset,
Packit b099d7
	Boolean     align64)
Packit b099d7
{
Packit b099d7
    WidgetClass c, super = w_class->core_class.superclass;
Packit b099d7
    ConstraintWidgetClass cc = NULL, scc = NULL;
Packit b099d7
    int i, classcount = 0;
Packit b099d7
    XmPartResource *pr;
Packit b099d7
    
Packit b099d7
    Boolean do_align = False;
Packit b099d7
    
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if (sizeof(int) != sizeof(void*))
Packit b099d7
	do_align = True;
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     *  Set up constraint class pointers
Packit b099d7
     */
Packit b099d7
    if (XtIsConstraintClass(super))
Packit b099d7
    {
Packit b099d7
	cc = (ConstraintWidgetClass)w_class;
Packit b099d7
	scc = (ConstraintWidgetClass)super;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     *  Update the part size value (initially, it is the size of this part)
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    if (do_align)
Packit b099d7
    {
Packit b099d7
	w_class->core_class.widget_size =
Packit b099d7
	    w_class->core_class.widget_size
Packit b099d7
	    + _ALIGN(super->core_class.widget_size);
Packit b099d7
	w_class->core_class.widget_size =
Packit b099d7
	    _ALIGN(w_class->core_class.widget_size);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	w_class->core_class.widget_size =
Packit b099d7
	    w_class->core_class.widget_size + super->core_class.widget_size;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Another nasty hack.  Just plain old DON'T allow the size to be
Packit b099d7
     * a multiple of anything smaller than 4.  This causes bus errors on
Packit b099d7
     * most platforms when the constraint record is appended (by Xt)
Packit b099d7
     * to the widget struct.  Just round up.
Packit b099d7
     * The do_align flag above does the same thing, but only on 8 byte
Packit b099d7
     * boundaries on 64 bit systems.  All of this code desperately
Packit b099d7
     * needs to be re-written.
Packit b099d7
     */
Packit b099d7
    if(w_class->core_class.widget_size & 3) {
Packit b099d7
	int size = w_class->core_class.widget_size;
Packit b099d7
	w_class->core_class.widget_size = 4 * ((size / 4) + 1);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (cc && scc)
Packit b099d7
    {
Packit b099d7
	if (do_align)
Packit b099d7
	{
Packit b099d7
	    cc->constraint_class.constraint_size =
Packit b099d7
		cc->constraint_class.constraint_size
Packit b099d7
		+ _ALIGN(scc->constraint_class.constraint_size);
Packit b099d7
	    cc->constraint_class.constraint_size =
Packit b099d7
		_ALIGN(cc->constraint_class.constraint_size);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	    cc->constraint_class.constraint_size =
Packit b099d7
		cc->constraint_class.constraint_size +
Packit b099d7
		scc->constraint_class.constraint_size;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     *  Count the number of superclasses and allocate the offset record(s)
Packit b099d7
     */
Packit b099d7
    for (c = w_class; c != NULL; c = c->core_class.superclass) classcount++;
Packit b099d7
    
Packit b099d7
    *offset = (XmOffsetPtr) XtMalloc(classcount * sizeof(XmOffset));
Packit b099d7
    if (cc)
Packit b099d7
	*constraint_offset = (XmOffsetPtr) XtMalloc(classcount 
Packit b099d7
						    * sizeof(XmOffset));
Packit b099d7
    else 
Packit b099d7
	if(constraint_offset != NULL) *constraint_offset = NULL;
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     *  Fill in the offset table(s) with the offset of all parts
Packit b099d7
     */
Packit b099d7
    for (i = classcount-1, c = super; i > 0; c = c->core_class.superclass, i--)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * The do_align flag is true iff _all_ subparts must be 8-byte
Packit b099d7
	 * aligned (e.g. on an Alpha).
Packit b099d7
	 *
Packit b099d7
	 * align64 is true only if the _current_ widget part must be
Packit b099d7
	 * 8-byte aligned (e.g. subparts containing doubles on HP/UX)
Packit b099d7
	 */
Packit b099d7
	if (do_align ||
Packit b099d7
	    (c == super && align64))
Packit b099d7
	    (*offset)[i] = (long)_ALIGN((c->core_class.widget_size));	
Packit b099d7
	else
Packit b099d7
	    (*offset)[i] = (long)(c->core_class.widget_size);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    (*offset)[0] = 0;
Packit b099d7
    
Packit b099d7
    if (constraint_offset != NULL && *constraint_offset != NULL) {
Packit b099d7
	for (i = classcount-1, scc = (ConstraintWidgetClass) super; i > 0; 
Packit b099d7
	     scc = (ConstraintWidgetClass)(scc->core_class.superclass), i--)
Packit b099d7
	    if (XtIsConstraintClass((WidgetClass)scc))
Packit b099d7
	    {
Packit b099d7
		if (do_align)
Packit b099d7
		    (*constraint_offset)[i] = 
Packit b099d7
			(long)_ALIGN((scc->constraint_class.constraint_size));
Packit b099d7
		else
Packit b099d7
		    (*constraint_offset)[i] = 
Packit b099d7
			(long)(scc->constraint_class.constraint_size);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
		(*constraint_offset)[i] = 0;
Packit b099d7
	
Packit b099d7
	(*constraint_offset)[0] = 0;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     *  Update the resource list(s) offsets in place
Packit b099d7
     */
Packit b099d7
    for (i = 0; i < w_class->core_class.num_resources; i++) 
Packit b099d7
    {
Packit b099d7
	pr = (XmPartResource *) &w_class->core_class.resources[i];
Packit b099d7
	
Packit b099d7
	/* The next line updates this in place--be careful */
Packit b099d7
	
Packit b099d7
	w_class->core_class.resources[i].resource_offset =
Packit b099d7
	    XmGetPartOffset(pr, offset);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if (cc)
Packit b099d7
	for (i = 0; i < cc->constraint_class.num_resources; i++) 
Packit b099d7
	{
Packit b099d7
	    pr = (XmPartResource *) &cc->constraint_class.resources[i];
Packit b099d7
	    
Packit b099d7
	    /* The next line updates this in place--be careful */
Packit b099d7
	    
Packit b099d7
	    cc->constraint_class.resources[i].resource_offset =
Packit b099d7
		XmGetPartOffset(pr, constraint_offset);
Packit b099d7
	}
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
XiResolveAllPartOffsets(
Packit b099d7
        WidgetClass w_class,
Packit b099d7
        XmOffsetPtr *offset,
Packit b099d7
        XmOffsetPtr *constraint_offset )
Packit b099d7
{
Packit b099d7
    _XiResolveAllPartOffsets( w_class, offset, constraint_offset, False );
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
XmResolveAllPartOffsets64(
Packit b099d7
        WidgetClass w_class,
Packit b099d7
        XmOffsetPtr *offset,
Packit b099d7
        XmOffsetPtr *constraint_offset )
Packit b099d7
{
Packit b099d7
#ifdef XM_ALIGN_64
Packit b099d7
    _XiResolveAllPartOffsets( w_class, offset, constraint_offset, True );
Packit b099d7
#else
Packit b099d7
    _XiResolveAllPartOffsets( w_class, offset, constraint_offset, False );
Packit b099d7
#endif
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/* -------------------------------------------------------------------------- */
Packit b099d7
 
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  The border highlighting and unhighlighting routines.
Packit b099d7
 *
Packit b099d7
 *  These routines were originally in Primitive.c but not used anywhere.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmExtHighlightBorder(Widget w )
Packit b099d7
{
Packit b099d7
XtWidgetProc border_highlight;
Packit b099d7
    if(XmIsPrimitive(w))
Packit b099d7
    {
Packit b099d7
        _XmProcessLock();
Packit b099d7
        border_highlight = xmPrimitiveClassRec.primitive_class.border_highlight;
Packit b099d7
        _XmProcessUnlock();
Packit b099d7
Packit b099d7
        (*border_highlight) (w);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	    if(XmIsGadget(w))
Packit b099d7
        {
Packit b099d7
            _XmProcessLock();
Packit b099d7
            border_highlight = xmGadgetClassRec.gadget_class.border_highlight;
Packit b099d7
            _XmProcessUnlock();
Packit b099d7
Packit b099d7
            (*border_highlight) (w);
Packit b099d7
	    }
Packit b099d7
    } 
Packit b099d7
    return ;
Packit b099d7
} 
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmExtUnhighlightBorder(Widget w)
Packit b099d7
{
Packit b099d7
XtWidgetProc border_unhighlight;
Packit b099d7
Packit b099d7
    if( XmIsPrimitive(w))
Packit b099d7
    {   
Packit b099d7
        _XmProcessLock();
Packit b099d7
        border_unhighlight = xmPrimitiveClassRec.primitive_class.border_unhighlight;
Packit b099d7
        _XmProcessUnlock();
Packit b099d7
        (*border_unhighlight)(w) ;
Packit b099d7
    } 
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
        if(XmIsGadget(w))
Packit b099d7
        {   
Packit b099d7
            _XmProcessLock();
Packit b099d7
            border_unhighlight = xmGadgetClassRec.gadget_class.border_unhighlight;
Packit b099d7
            _XmProcessUnlock();
Packit b099d7
            (*border_unhighlight)(w);
Packit b099d7
        } 
Packit b099d7
    } 
Packit b099d7
    return ;
Packit b099d7
}