Blame tests/DragAndDrop/DNDDrop3.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: DNDDrop3.c /main/8 1995/07/14 11:52:47 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
*  (c) Copyright 1987, 1988, 1989 HEWLETT-PACKARD COMPANY */
Packit b099d7
/*
Packit b099d7
 *	file: DNDDrop3.c
Packit b099d7
 *
Packit b099d7
 *	This tests non-rectangular dropSites, i.e., dropSites that have to be
Packit b099d7
 *	represented by more that one rectangle.
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <X11/X.h>
Packit b099d7
#include <X11/Xlib.h>
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
#include <X11/StringDefs.h>
Packit b099d7
#include <Xm/TextP.h>
Packit b099d7
#include <Xm/TextFP.h>
Packit b099d7
#include <Xm/FormP.h>
Packit b099d7
#include <Xm/PushBP.h>
Packit b099d7
#include <Xm/RowColumn.h>
Packit b099d7
#include <Xm/LabelP.h>
Packit b099d7
#include <Xm/DropSMgrP.h>
Packit b099d7
#include <Xm/DragCP.h>
Packit b099d7
#include <Xm/AtomMgr.h>
Packit b099d7
Packit b099d7
Packit b099d7
static void StartMyDragProc();
Packit b099d7
static void RaiseProc();
Packit b099d7
static void LowerProc();
Packit b099d7
Packit b099d7
Packit b099d7
XRectangle rects0[] = {
Packit b099d7
	{  40,   0,  40,  40 },
Packit b099d7
	{   0,  40, 120,  40 },
Packit b099d7
	{  40,  80,  40,  40 },
Packit b099d7
};
Packit b099d7
Packit b099d7
XRectangle rects1[] = {
Packit b099d7
	{   0,   0,  40,  40 },
Packit b099d7
	{  80,   0,  40,  40 },
Packit b099d7
	{   0,  40, 120,  40 },
Packit b099d7
};
Packit b099d7
Packit b099d7
XRectangle rects2[] = {
Packit b099d7
	{  20,   0,  40,  40 },
Packit b099d7
	{   0,  40,  80,  20 },
Packit b099d7
};
Packit b099d7
Packit b099d7
XRectangle rects3[] = {
Packit b099d7
	{   0,   0,  40,  60 },
Packit b099d7
	{  40,  20,  40,  20 },
Packit b099d7
};
Packit b099d7
Packit b099d7
typedef struct _DropZoneRec {
Packit b099d7
	char	*name;
Packit b099d7
	XRectangle *rects;
Packit b099d7
	int		num_rects;
Packit b099d7
	Region	region;
Packit b099d7
	Widget	refW;
Packit b099d7
	Widget	icon;
Packit b099d7
} DropZoneRec, *DropZone;
Packit b099d7
Packit b099d7
static DropZoneRec DropZones[] = {
Packit b099d7
	{ "cross", rects0, XtNumber(rects0), NULL, NULL, NULL},
Packit b099d7
	{ "trough", rects1, XtNumber(rects1), NULL, NULL, NULL},
Packit b099d7
	{ "MwmIcon", rects2, XtNumber(rects2), NULL, NULL, NULL},
Packit b099d7
	{ "mallet", rects3, XtNumber(rects3), NULL, NULL, NULL},
Packit b099d7
};
Packit b099d7
Packit b099d7
static int numZones = XtNumber(DropZones);
Packit b099d7
Packit b099d7
static String myDNDTranslations = 
Packit b099d7
	" <Btn2Down> :  StartMyDrag() \n\
Packit b099d7
	 m <Btn1Up>  :  Raise(1)        \n\
Packit b099d7
	   <Btn1Up>  :  Raise(0)        \n\
Packit b099d7
	 m <Btn1Up>  :  Lower(1)        \n\
Packit b099d7
	   <Btn1Up>  :  Lower(0)";
Packit b099d7
Packit b099d7
Packit b099d7
static XtActionsRec myDNDActions[] = {
Packit b099d7
	{ "StartMyDrag", StartMyDragProc },
Packit b099d7
	{ "Raise", RaiseProc },
Packit b099d7
	{ "Lower", LowerProc },
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
Widget shell1;
Packit b099d7
Widget form1;
Packit b099d7
Widget p0, p1, p2, p3;
Packit b099d7
Widget text1;
Packit b099d7
int n = 0;
Packit b099d7
Arg args[30];
Packit b099d7
XtAppContext this_app;
Packit b099d7
Display *display;
Packit b099d7
int i;
Packit b099d7
Packit b099d7
Packit b099d7
Pixel GetPixel(dpy, name)
Packit b099d7
Display  *dpy;
Packit b099d7
char     *name;
Packit b099d7
{
Packit b099d7
Packit b099d7
	XColor color, exact_color;
Packit b099d7
	int           scr = DefaultScreen(dpy);
Packit b099d7
	Colormap      cmap = DefaultColormap(dpy, scr);
Packit b099d7
Packit b099d7
	XAllocNamedColor(dpy, cmap, name, &color, &exact_color);
Packit b099d7
Packit b099d7
	return(color.pixel);
Packit b099d7
}
Packit b099d7
Packit b099d7
void ExposeEventHandler(w, client_data, event, continue_to_dispatch)
Packit b099d7
Widget w;
Packit b099d7
XtPointer client_data;
Packit b099d7
XEvent *event;
Packit b099d7
Boolean *continue_to_dispatch;
Packit b099d7
{
Packit b099d7
	static Boolean first_time = True;
Packit b099d7
	XGCValues values;
Packit b099d7
	unsigned long  valueMask;
Packit b099d7
	static GC dzGC;
Packit b099d7
	Pixel zoneColor;
Packit b099d7
	int i, j;
Packit b099d7
	Region clipRegion = NULL;
Packit b099d7
	Region sibRegion = NULL;
Packit b099d7
Packit b099d7
	*continue_to_dispatch = True;
Packit b099d7
Packit b099d7
	if (first_time)
Packit b099d7
	{
Packit b099d7
		valueMask = GCGraphicsExposures;
Packit b099d7
		values.graphics_exposures = False;
Packit b099d7
		dzGC = XCreateGC(XtDisplay(w), XtWindow(w), valueMask, &values);
Packit b099d7
Packit b099d7
		clipRegion = XCreateRegion();
Packit b099d7
		sibRegion = XCreateRegion();
Packit b099d7
	}
Packit b099d7
Packit b099d7
	for (i=0; i < XtNumber(DropZones); i++)
Packit b099d7
	{
Packit b099d7
		valueMask = (GCForeground | GCBackground);
Packit b099d7
		values.background = DropZones[i].refW->core.background_pixel;
Packit b099d7
		values.foreground = DropZones[i].refW->core.background_pixel;
Packit b099d7
		XChangeGC(XtDisplay(w), dzGC, valueMask, &values);
Packit b099d7
Packit b099d7
		XUnionRegion(DropZones[i].region, DropZones[i].region,
Packit b099d7
			clipRegion);
Packit b099d7
		XOffsetRegion(clipRegion, XtX(w), XtY(w));
Packit b099d7
Packit b099d7
		for (j=0; j < i ; j++)
Packit b099d7
		{
Packit b099d7
			XUnionRegion(DropZones[j].region, DropZones[j].region,
Packit b099d7
				sibRegion);
Packit b099d7
			XOffsetRegion(sibRegion, XtX(DropZones[j].refW),
Packit b099d7
				XtY(DropZones[j].refW));
Packit b099d7
			XSubtractRegion(clipRegion, sibRegion, clipRegion);
Packit b099d7
		}
Packit b099d7
Packit b099d7
		XSetRegion(XtDisplay(w), dzGC, clipRegion);
Packit b099d7
Packit b099d7
		XFillRectangle(XtDisplay(w), XtWindow(w), dzGC, 
Packit b099d7
			XtX(w), XtY(w), XtWidth(w), XtHeight(w));
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
static void RaiseProc(w, event, params, num_params)
Packit b099d7
Widget w;
Packit b099d7
XEvent *event;
Packit b099d7
String *params;
Packit b099d7
Cardinal *num_params;
Packit b099d7
{
Packit b099d7
Packit b099d7
	int	operation;
Packit b099d7
	if (*num_params)
Packit b099d7
	{
Packit b099d7
		/* We only expect one */
Packit b099d7
		operation = atoi(params[0]);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	switch(operation)
Packit b099d7
	{
Packit b099d7
		case 1:
Packit b099d7
		{
Packit b099d7
			/* Raise to top of stack */
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
Packit b099d7
		case 0:
Packit b099d7
		default:
Packit b099d7
		{
Packit b099d7
			/* Circulate the stack upwards */
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
static void LowerProc(w, event, params, num_params)
Packit b099d7
Widget w;
Packit b099d7
XEvent *event;
Packit b099d7
String *params;
Packit b099d7
Cardinal *num_params;
Packit b099d7
{
Packit b099d7
	
Packit b099d7
}
Packit b099d7
Packit b099d7
static void StartMyDragProc(w, event, params, num_params)
Packit b099d7
Widget w;
Packit b099d7
XEvent *event;
Packit b099d7
String *params;
Packit b099d7
Cardinal *num_params;
Packit b099d7
{
Packit b099d7
	Arg args[30];
Packit b099d7
	int n, i;
Packit b099d7
	XButtonEvent *myEvent = (XButtonEvent *) event;
Packit b099d7
	Widget dc;
Packit b099d7
Packit b099d7
	/* detect which, if any drop zone the drag started in */
Packit b099d7
	for (i=0; i < numZones; i++)
Packit b099d7
		if (XPointInRegion(DropZones[i].region, myEvent->x, myEvent->y))
Packit b099d7
			break;
Packit b099d7
	
Packit b099d7
	/* if in a drop zone, load the appropriate cursor */
Packit b099d7
Packit b099d7
	if (i == numZones)
Packit b099d7
		return;
Packit b099d7
	
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNsourceCursorIcon, DropZones[i].icon); n++;
Packit b099d7
	dc = XmDragStart(w, event, args, n);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void MyDropProc(w, client_data, call_data)
Packit b099d7
Widget w;
Packit b099d7
XtPointer client_data;
Packit b099d7
XtPointer call_data;
Packit b099d7
{
Packit b099d7
	XmDropProcCallbackStruct *cb =
Packit b099d7
		(XmDropProcCallbackStruct *) call_data;
Packit b099d7
	Position newX = cb->x - XtX(w);
Packit b099d7
	Position newY = cb->y - XtY(w);
Packit b099d7
	Arg args[5];
Packit b099d7
	int n;
Packit b099d7
	Boolean junk;
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, newX); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, newY); n++;
Packit b099d7
	XtSetValues(w, args, n);
Packit b099d7
Packit b099d7
	ExposeEventHandler(w, NULL, NULL, &junk);
Packit b099d7
}
Packit b099d7
Packit b099d7
void CreateDropZone(w, targets, num_targets, dz)
Packit b099d7
Widget w;
Packit b099d7
Atom *targets;
Packit b099d7
Cardinal num_targets;
Packit b099d7
DropZone dz;
Packit b099d7
{
Packit b099d7
	Display *display = XtDisplay(w);
Packit b099d7
	XRectangle clipBox;
Packit b099d7
	unsigned long vMask;
Packit b099d7
	XGCValues values;
Packit b099d7
	Pixmap iconMap, maskMap;
Packit b099d7
	GC clipGC;
Packit b099d7
	static Boolean first_time = True;
Packit b099d7
	static Region r1, r2;
Packit b099d7
	unsigned long  valueMask;
Packit b099d7
	char buf[128];
Packit b099d7
Packit b099d7
	if (first_time)
Packit b099d7
	{
Packit b099d7
		r1 = XCreateRegion();
Packit b099d7
		r2 = XCreateRegion();
Packit b099d7
		first_time = False;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	dz->refW = w;
Packit b099d7
Packit b099d7
	/* Create and set the region from the rectangle data */
Packit b099d7
	dz->region = XCreateRegion();
Packit b099d7
	for (i=0; i < dz->num_rects; i++)
Packit b099d7
		XUnionRectWithRegion(&(dz->rects[i]), dz->region, dz->region);
Packit b099d7
	
Packit b099d7
	/* Get the bounding box of the region */
Packit b099d7
	XClipBox(dz->region, &clipBox);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNwidth, clipBox.width); n++;
Packit b099d7
	XtSetArg(args[n], XmNheight, clipBox.height); n++;
Packit b099d7
	XtSetValues(w, args, n);
Packit b099d7
Packit b099d7
	/* Create depth 1 pixmaps the size of bounding box */
Packit b099d7
	iconMap = XCreatePixmap(display, DefaultRootWindow(display),
Packit b099d7
		clipBox.width, clipBox.height, 1);
Packit b099d7
	maskMap = XCreatePixmap(display, DefaultRootWindow(display),
Packit b099d7
		clipBox.width, clipBox.height, 1);
Packit b099d7
Packit b099d7
	/* Fill the bitmaps with 0's */
Packit b099d7
	vMask = (GCForeground | GCBackground);
Packit b099d7
	values.background = 0;
Packit b099d7
	values.foreground = 0;
Packit b099d7
	clipGC = XCreateGC(display, iconMap, vMask, &values);
Packit b099d7
Packit b099d7
	XFillRectangle(display, iconMap, clipGC, 0, 0, clipBox.width,
Packit b099d7
		clipBox.height);
Packit b099d7
	XFillRectangle(display, maskMap, clipGC, 0, 0, clipBox.width,
Packit b099d7
		clipBox.height);
Packit b099d7
Packit b099d7
	/* Now we write with 1's */
Packit b099d7
	valueMask = (GCForeground | GCBackground);
Packit b099d7
	values.background = 1;
Packit b099d7
	values.foreground = 1;
Packit b099d7
	XChangeGC(display, clipGC, valueMask, &values);
Packit b099d7
	
Packit b099d7
	/* Fill the shape of the icon with 1's */
Packit b099d7
	XUnionRegion(dz->region, dz->region, r1);
Packit b099d7
	XOffsetRegion(r1, (-1 * clipBox.x), (-1 * clipBox.y));
Packit b099d7
	XSetRegion(display, clipGC, r1);
Packit b099d7
Packit b099d7
	XFillRectangle(display, iconMap, clipGC, 
Packit b099d7
		0, 0, clipBox.width, clipBox.height);
Packit b099d7
Packit b099d7
	/* Create a clip region to shoot the 1's thru into the mask */
Packit b099d7
	XUnionRegion(r1, r1, r2);
Packit b099d7
	XShrinkRegion(r2, 2, 2);
Packit b099d7
	XSubtractRegion(r1, r2, r1);
Packit b099d7
Packit b099d7
	XSetRegion(display, clipGC, r1);
Packit b099d7
Packit b099d7
	XFillRectangle(display, maskMap, clipGC, 
Packit b099d7
		0, 0, clipBox.width, clipBox.height);
Packit b099d7
	
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNpixmap, iconMap); n++;
Packit b099d7
	XtSetArg(args[n], XmNmask, maskMap); n++;
Packit b099d7
	XtSetArg(args[n], XmNdepth, 1); n++;
Packit b099d7
	XtSetArg(args[n], XmNwidth, clipBox.width); n++;
Packit b099d7
	XtSetArg(args[n], XmNheight, clipBox.height); n++;
Packit b099d7
	XtSetArg(args[n], XmNhotX, (clipBox.width / 2)); n++;
Packit b099d7
	XtSetArg(args[n], XmNhotY, (clipBox.height / 2)); n++;
Packit b099d7
	dz->icon = XmCreateDragIcon(w, dz->name, args, n);
Packit b099d7
	
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNimportTargets, targets); n++;
Packit b099d7
	XtSetArg(args[n], XmNnumImportTargets, num_targets); n++;
Packit b099d7
	XtSetArg(args[n], XmNdropRectangles, dz->rects); n++;
Packit b099d7
	XtSetArg(args[n], XmNnumDropRectangles, dz->num_rects); n++;
Packit b099d7
	XtSetArg(args[n], XmNdropProc, MyDropProc); n++;
Packit b099d7
	XmDropSiteRegister(w, args, n);
Packit b099d7
}
Packit b099d7
Packit b099d7
main(argc, argv)
Packit b099d7
int argc;
Packit b099d7
char **argv;
Packit b099d7
{
Packit b099d7
	int i;
Packit b099d7
	Atom targets[1];
Packit b099d7
	unsigned short *ID;
Packit b099d7
	XtTranslations myParsedTranslations;
Packit b099d7
Packit b099d7
	XtToolkitInitialize();
Packit b099d7
	this_app = XtCreateApplicationContext();
Packit b099d7
	display = XtOpenDisplay(this_app, NULL, NULL, "DNDNonRect",
Packit b099d7
		NULL, 0, &argc, argv);
Packit b099d7
	
Packit b099d7
	if (display == NULL) {
Packit b099d7
		fprintf(stderr, "%s:  Can't open display\n", argv[0]);
Packit b099d7
		exit(1);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	targets[0] = XmInternAtom(display, "COMPOUND_TEXT", False);
Packit b099d7
Packit b099d7
	XtAppAddActions(this_app, myDNDActions, XtNumber(myDNDActions));
Packit b099d7
Packit b099d7
	myParsedTranslations = XtParseTranslationTable(myDNDTranslations);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNallowShellResize, True);  n++;
Packit b099d7
	XtSetArg(args[n], XmNwidth, 400);  n++;
Packit b099d7
	XtSetArg(args[n], XmNheight, 300);  n++;
Packit b099d7
	shell1 = XtAppCreateShell(NULL, "XMclient",
Packit b099d7
		applicationShellWidgetClass, display, args, n);
Packit b099d7
	
Packit b099d7
	n = 0;
Packit b099d7
	form1 = XmCreateForm(shell1, "form1", args, n);
Packit b099d7
	XtManageChild(form1);
Packit b099d7
	XtOverrideTranslations(form1, myParsedTranslations);
Packit b099d7
Packit b099d7
	XtAddEventHandler(form1, ExposureMask, True, ExposeEventHandler,
Packit b099d7
		NULL);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, 10); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, 10); n++;
Packit b099d7
	XtSetArg(args[n], XmNbackground, GetPixel(display, "DarkGreen"));
Packit b099d7
		n++;
Packit b099d7
	p0 = XtCreateWidget("p0", xmPrimitiveWidgetClass, form1, args, n);
Packit b099d7
Packit b099d7
	CreateDropZone(p0, targets, XtNumber(targets), &DropZones[0]);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, 50); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, 50); n++;
Packit b099d7
	XtSetArg(args[n], XmNbackground, GetPixel(display, "Blue")); n++;
Packit b099d7
	p1 = XtCreateWidget("p1", xmPrimitiveWidgetClass, form1, args, n);
Packit b099d7
Packit b099d7
	CreateDropZone(p1, targets, XtNumber(targets), &DropZones[1]);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNbackground, GetPixel(display, "Cyan")); n++;
Packit b099d7
	p2 = XtCreateWidget("p2", xmPrimitiveWidgetClass, form1, args, n);
Packit b099d7
Packit b099d7
	CreateDropZone(p2, targets, XtNumber(targets), &DropZones[2]);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, 150); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, 150); n++;
Packit b099d7
	XtSetArg(args[n], XmNbackground, GetPixel(display, "Orange")); n++;
Packit b099d7
	p3 = XtCreateWidget("p3", xmPrimitiveWidgetClass, form1, args, n);
Packit b099d7
Packit b099d7
	CreateDropZone(p3, targets, XtNumber(targets), &DropZones[3]);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
Packit b099d7
	XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
Packit b099d7
	XtSetArg(args[n], XmNtopAttachment, XmATTACH_NONE); n++;
Packit b099d7
	XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
	text1 = XmCreateTextField( form1, "text1", args, n);
Packit b099d7
	XtManageChild(text1);
Packit b099d7
Packit b099d7
	XtRealizeWidget(shell1);
Packit b099d7
Packit b099d7
	/* MainLoop */
Packit b099d7
	XtAppMainLoop(this_app);
Packit b099d7
}
Packit b099d7