Blame lib/Xm/DropSMgrI.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
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: DropSMgrI.c /main/11 1995/07/14 10:30:45 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <Xm/DropSMgrP.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "DropSMgrI.h"
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "RegionI.h"
Packit b099d7
Packit b099d7
#define MESSAGE1 _XmMMsgDropSMgrI_0001
Packit b099d7
#define MESSAGE2 _XmMMsgDropSMgrI_0002
Packit b099d7
#define MESSAGE3 _XmMMsgDropSMgrI_0003
Packit b099d7
Packit b099d7
 /********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
externaldef(xmdsresources)
Packit b099d7
XtResource _XmDSResources[] = {
Packit b099d7
	{   XmNdropSiteType, XmCDropSiteType, XmRDropSiteType,
Packit b099d7
		sizeof(unsigned char),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, type),
Packit b099d7
		XmRImmediate, (XtPointer) XmDROP_SITE_SIMPLE
Packit b099d7
	},
Packit b099d7
	{   XmNdropSiteActivity, XmCDropSiteActivity, XmRDropSiteActivity,
Packit b099d7
		sizeof(unsigned char),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, activity),
Packit b099d7
		XmRImmediate, (XtPointer) XmDROP_SITE_ACTIVE
Packit b099d7
	},
Packit b099d7
	{   XmNimportTargets, XmCImportTargets, XmRAtomList,
Packit b099d7
		sizeof(Atom *),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, import_targets),
Packit b099d7
		XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
	{   XmNnumImportTargets, XmCNumImportTargets, XmRCardinal,
Packit b099d7
		sizeof(Cardinal),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, num_import_targets),
Packit b099d7
		XmRImmediate, (XtPointer) 0
Packit b099d7
	},
Packit b099d7
	{   XmNdropSiteOperations, XmCDropSiteOperations,
Packit b099d7
		XmRDropSiteOperations, sizeof(unsigned char),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, operations), XmRImmediate,
Packit b099d7
		(XtPointer) (XmDROP_MOVE | XmDROP_COPY),
Packit b099d7
	},
Packit b099d7
	{   XmNdropRectangles, XmCDropRectangles, XmRRectangleList,
Packit b099d7
		sizeof(XRectangle *),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, rectangles),
Packit b099d7
		XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
	{   XmNnumDropRectangles, XmCNumDropRectangles, XmRCardinal,
Packit b099d7
		sizeof(Cardinal),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, num_rectangles),
Packit b099d7
		XmRImmediate, (XtPointer) 1
Packit b099d7
	},
Packit b099d7
	{   XmNdragProc, XmCDragProc, XmRProc,
Packit b099d7
		sizeof(XtPointer),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, drag_proc),
Packit b099d7
		XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
	{   XmNdropProc, XmCDropProc, XmRProc,
Packit b099d7
		sizeof(XtPointer),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, drop_proc),
Packit b099d7
		XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
	{   XmNanimationStyle, XmCAnimationStyle, XmRAnimationStyle,
Packit b099d7
		sizeof(unsigned char),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, animation_style),
Packit b099d7
		XmRImmediate, (XtPointer) XmDRAG_UNDER_HIGHLIGHT
Packit b099d7
	},
Packit b099d7
	{   XmNanimationPixmap, XmCAnimationPixmap, XmRDynamicPixmap,
Packit b099d7
		sizeof(Pixmap),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, animation_pixmap),
Packit b099d7
		XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
	},
Packit b099d7
	{   XmNanimationMask, XmCAnimationMask, XmRBitmap,
Packit b099d7
		sizeof(Pixmap),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, animation_mask),
Packit b099d7
		XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
	},
Packit b099d7
	{   XmNanimationPixmapDepth, XmCAnimationPixmapDepth, XmRCardinal,
Packit b099d7
		sizeof(int),
Packit b099d7
		XtOffsetOf( struct _XmDSFullInfoRec, animation_pixmap_depth),
Packit b099d7
		XmRImmediate, (XtPointer) 0
Packit b099d7
	},
Packit b099d7
 	{   XmNclientData, XmCClientData, XmRPointer,
Packit b099d7
 		sizeof(XtPointer),
Packit b099d7
 		XtOffsetOf( struct _XmDSFullInfoRec, client_data),
Packit b099d7
 		XmRImmediate, NULL
Packit b099d7
 	},
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmnumdsresources)
Packit b099d7
Cardinal _XmNumDSResources = XtNumber(_XmDSResources);
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmDSIAddChild(
Packit b099d7
        XmDSInfo parentInfo,
Packit b099d7
        XmDSInfo childInfo,
Packit b099d7
        Cardinal childPosition )
Packit b099d7
{
Packit b099d7
	unsigned short i;
Packit b099d7
	unsigned short num_children;
Packit b099d7
Packit b099d7
	if ((parentInfo == NULL) || (childInfo == NULL))
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	num_children = GetDSNumChildren(parentInfo);
Packit b099d7
Packit b099d7
	if (GetDSType(parentInfo) != XmDROP_SITE_COMPOSITE)
Packit b099d7
	{
Packit b099d7
		XmeWarning(GetDSWidget(childInfo), MESSAGE1 );
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (childPosition > num_children)
Packit b099d7
	{
Packit b099d7
		XmeWarning(GetDSWidget(parentInfo), MESSAGE2);
Packit b099d7
		childPosition = num_children;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (num_children == GetDSMaxChildren(parentInfo))
Packit b099d7
	{
Packit b099d7
		SetDSMaxChildren(parentInfo, num_children + CHILDREN_INCREMENT);
Packit b099d7
		SetDSChildren(parentInfo, (XtPointer *) XtRealloc(
Packit b099d7
				(char *) GetDSChildren(parentInfo),
Packit b099d7
				sizeof(XmDSInfo) * GetDSMaxChildren(parentInfo)));
Packit b099d7
	}
Packit b099d7
Packit b099d7
	for (i = num_children; i > childPosition; i--)
Packit b099d7
		GetDSChildren(parentInfo)[i] = GetDSChildren(parentInfo)[i-1];
Packit b099d7
	
Packit b099d7
	GetDSChildren(parentInfo)[childPosition] = (XtPointer) childInfo;
Packit b099d7
	SetDSNumChildren(parentInfo, (num_children + 1));
Packit b099d7
	SetDSParent(childInfo, (XtPointer) parentInfo);
Packit b099d7
Packit b099d7
	SetDSLeaf(parentInfo, False);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmDSIRemoveChild(
Packit b099d7
        XmDSInfo parentInfo,
Packit b099d7
        XmDSInfo childInfo )
Packit b099d7
{
Packit b099d7
	int i;
Packit b099d7
	unsigned short num_children;
Packit b099d7
	Cardinal position;
Packit b099d7
Packit b099d7
	if ((parentInfo == NULL) || (childInfo == NULL))
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	num_children = GetDSNumChildren(parentInfo);
Packit b099d7
Packit b099d7
	/* Find the child to be Removed */
Packit b099d7
	position = _XmDSIGetChildPosition(parentInfo, childInfo);
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * Take it out of the list by writing over its location and
Packit b099d7
	 * reducing the child count.
Packit b099d7
	 */
Packit b099d7
	for (i = position + 1; i < num_children; i++)
Packit b099d7
		GetDSChildren(parentInfo)[i - 1] = GetDSChildren(parentInfo)[i];
Packit b099d7
	
Packit b099d7
	SetDSNumChildren(parentInfo, --num_children);
Packit b099d7
Packit b099d7
	if (!num_children)
Packit b099d7
		SetDSLeaf(parentInfo, True);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
_XmDSIGetChildPosition(
Packit b099d7
        XmDSInfo parentInfo,
Packit b099d7
        XmDSInfo childInfo )
Packit b099d7
{
Packit b099d7
	int i;
Packit b099d7
	unsigned short num_children;
Packit b099d7
Packit b099d7
	if ((parentInfo == NULL) || (childInfo == NULL))
Packit b099d7
		return(0);
Packit b099d7
Packit b099d7
	num_children = GetDSNumChildren(parentInfo);
Packit b099d7
Packit b099d7
	if (GetDSParent(childInfo) != (XtPointer) parentInfo)
Packit b099d7
	{
Packit b099d7
		char buf[256];
Packit b099d7
		sprintf(buf, MESSAGE3,
Packit b099d7
			XrmQuarkToString(GetDSWidget(childInfo)->core.xrm_name),
Packit b099d7
			XrmQuarkToString(GetDSWidget(parentInfo)->core.xrm_name));
Packit b099d7
		XmeWarning(GetDSWidget(parentInfo), buf);
Packit b099d7
		return(num_children);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	for (i = 0; i < num_children; i++)
Packit b099d7
		if (GetDSChildren(parentInfo)[i] == (XtPointer) childInfo)
Packit b099d7
			break;
Packit b099d7
Packit b099d7
	if (i == num_children)
Packit b099d7
	{
Packit b099d7
		char buf[256];
Packit b099d7
		sprintf(buf, MESSAGE3,
Packit b099d7
			XrmQuarkToString(GetDSWidget(childInfo)->core.xrm_name),
Packit b099d7
			XrmQuarkToString(GetDSWidget(parentInfo)->core.xrm_name));
Packit b099d7
		XmeWarning(GetDSWidget(parentInfo), buf);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	return(i);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmDSIReplaceChild(
Packit b099d7
        XmDSInfo oldChildInfo,
Packit b099d7
        XmDSInfo newChildInfo )
Packit b099d7
{
Packit b099d7
	int i;
Packit b099d7
	unsigned short num_children;
Packit b099d7
	XmDSInfo parentInfo;
Packit b099d7
Packit b099d7
	if ((oldChildInfo == NULL) ||
Packit b099d7
		(newChildInfo == NULL))
Packit b099d7
		return;
Packit b099d7
	
Packit b099d7
	if ((parentInfo = (XmDSInfo) GetDSParent(oldChildInfo)) == NULL)
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	num_children = GetDSNumChildren(parentInfo);
Packit b099d7
Packit b099d7
	for (i=0; i < num_children; i++)
Packit b099d7
	{
Packit b099d7
		if (GetDSChildren(parentInfo)[i] == (XtPointer) oldChildInfo)
Packit b099d7
			GetDSChildren(parentInfo)[i] = (XtPointer) newChildInfo;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	SetDSParent(oldChildInfo, NULL);
Packit b099d7
Packit b099d7
	if ((GetDSParent(newChildInfo)) &&
Packit b099d7
		(GetDSParent(newChildInfo) != (XtPointer) parentInfo))
Packit b099d7
		_XmDSIRemoveChild(parentInfo, newChildInfo);
Packit b099d7
	else
Packit b099d7
		SetDSParent(newChildInfo, parentInfo);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmDSISwapChildren(
Packit b099d7
        XmDSInfo parentInfo,
Packit b099d7
		Cardinal position1,
Packit b099d7
		Cardinal position2 )
Packit b099d7
{
Packit b099d7
	XmDSInfo tmp_info;
Packit b099d7
	unsigned short num_children;
Packit b099d7
Packit b099d7
	if (parentInfo == NULL)
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	num_children = GetDSNumChildren(parentInfo);
Packit b099d7
Packit b099d7
	if ((position1 > num_children) || (position2 > num_children))
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	tmp_info = (XmDSInfo) GetDSChildren(parentInfo)[position1];
Packit b099d7
Packit b099d7
	GetDSChildren(parentInfo)[position1] =
Packit b099d7
		GetDSChildren(parentInfo)[position2];
Packit b099d7
	GetDSChildren(parentInfo)[position2] = (XtPointer) tmp_info;
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_XmDSIDestroy(
Packit b099d7
        XmDSInfo info,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int substructures )
Packit b099d7
#else
Packit b099d7
                        Boolean substructures )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
	if (info != NULL)
Packit b099d7
	{
Packit b099d7
Packit b099d7
		if ((GetDSType(info) == XmDROP_SITE_COMPOSITE) &&
Packit b099d7
			(GetDSChildren(info) != NULL) &&
Packit b099d7
			(substructures))
Packit b099d7
			XtFree( (char *) GetDSChildren(info));
Packit b099d7
Packit b099d7
		if (GetDSRegion(info) && (substructures))
Packit b099d7
			_XmRegionDestroy(GetDSRegion(info));
Packit b099d7
Packit b099d7
		XtFree( (char *) info);
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
Dimension
Packit b099d7
_XmDSIGetBorderWidth(
Packit b099d7
        XmDSInfo info)
Packit b099d7
{
Packit b099d7
	if (info == NULL)
Packit b099d7
		return(0);
Packit b099d7
Packit b099d7
	if (GetDSRemote(info))
Packit b099d7
	{
Packit b099d7
		switch (GetDSAnimationStyle(info))
Packit b099d7
		{
Packit b099d7
			case XmDRAG_UNDER_NONE:
Packit b099d7
			{
Packit b099d7
				XmDSRemoteNoneStyleRec *sr =
Packit b099d7
					(XmDSRemoteNoneStyleRec *)
Packit b099d7
						GetDSRemoteAnimationPart(info);
Packit b099d7
				
Packit b099d7
				return(sr->border_width);
Packit b099d7
			}
Packit b099d7
			case XmDRAG_UNDER_HIGHLIGHT:
Packit b099d7
			{
Packit b099d7
				XmDSRemoteHighlightStyleRec *sr =
Packit b099d7
					(XmDSRemoteHighlightStyleRec *)
Packit b099d7
						GetDSRemoteAnimationPart(info);
Packit b099d7
				
Packit b099d7
				return(sr->border_width);
Packit b099d7
			}
Packit b099d7
			case XmDRAG_UNDER_SHADOW_IN:
Packit b099d7
			case XmDRAG_UNDER_SHADOW_OUT:
Packit b099d7
			{
Packit b099d7
				XmDSRemoteShadowStyleRec *sr =
Packit b099d7
					(XmDSRemoteShadowStyleRec *)
Packit b099d7
						GetDSRemoteAnimationPart(info);
Packit b099d7
				
Packit b099d7
				return(sr->border_width);
Packit b099d7
			}
Packit b099d7
			case XmDRAG_UNDER_PIXMAP:
Packit b099d7
			{
Packit b099d7
				XmDSRemotePixmapStyleRec *sr =
Packit b099d7
					(XmDSRemotePixmapStyleRec *)
Packit b099d7
						GetDSRemoteAnimationPart(info);
Packit b099d7
				
Packit b099d7
				return(sr->border_width);
Packit b099d7
			}
Packit b099d7
			default:
Packit b099d7
				/* Shouldn't be here */
Packit b099d7
				return 0;
Packit b099d7
			/*NOTREACHED*/
Packit b099d7
			break;
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
		Widget w = GetDSWidget(info);
Packit b099d7
Packit b099d7
		return(XtBorderWidth(w));
Packit b099d7
	}
Packit b099d7
}
Packit b099d7