|
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 |
}
|