|
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: DragUnder.c /main/12 1995/07/14 10:26:51 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 <Xm/DrawP.h>
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
#include "DragCI.h"
|
|
Packit |
b099d7 |
#include "DragICCI.h"
|
|
Packit |
b099d7 |
#include "DragOverSI.h"
|
|
Packit |
b099d7 |
#include "DragUnderI.h"
|
|
Packit |
b099d7 |
#include "DropSMgrI.h"
|
|
Packit |
b099d7 |
#include "GadgetUtiI.h"
|
|
Packit |
b099d7 |
#include "MessagesI.h"
|
|
Packit |
b099d7 |
#include "RegionI.h"
|
|
Packit |
b099d7 |
#include "ScreenI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MESSAGE1 _XmMMsgDragUnder_0000
|
|
Packit |
b099d7 |
#define MESSAGE2 _XmMMsgDragUnder_0001
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmAnimationSaveData CreateAnimationSaveData(
|
|
Packit |
b099d7 |
XmDragContext dc,
|
|
Packit |
b099d7 |
XmAnimationData aData,
|
|
Packit |
b099d7 |
XmDragProcCallbackStruct *dpcb) ;
|
|
Packit |
b099d7 |
static void FreeAnimationData(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData) ;
|
|
Packit |
b099d7 |
static Boolean SaveAll(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData,
|
|
Packit |
b099d7 |
Position x,
|
|
Packit |
b099d7 |
Position y,
|
|
Packit |
b099d7 |
Dimension width,
|
|
Packit |
b099d7 |
Dimension height) ;
|
|
Packit |
b099d7 |
static Boolean SaveSegments(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData,
|
|
Packit |
b099d7 |
Position x,
|
|
Packit |
b099d7 |
Position y,
|
|
Packit |
b099d7 |
Dimension width,
|
|
Packit |
b099d7 |
Dimension height,
|
|
Packit |
b099d7 |
Dimension *thickness) ;
|
|
Packit |
b099d7 |
static void DrawHighlight(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData) ;
|
|
Packit |
b099d7 |
static void DrawShadow(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData) ;
|
|
Packit |
b099d7 |
static void DrawPixmap(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData) ;
|
|
Packit |
b099d7 |
static void AnimateExpose(Widget w, XmAnimationSaveData aSaveData,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Boolean *cont);
|
|
Packit |
b099d7 |
static void AnimateEnter(
|
|
Packit |
b099d7 |
XmDropSiteManagerObject dsm,
|
|
Packit |
b099d7 |
XmAnimationData aData,
|
|
Packit |
b099d7 |
XmDragProcCallbackStruct *dpcb) ;
|
|
Packit |
b099d7 |
static void AnimateLeave(
|
|
Packit |
b099d7 |
XmDropSiteManagerObject dsm,
|
|
Packit |
b099d7 |
XmAnimationData aData,
|
|
Packit |
b099d7 |
XmDragProcCallbackStruct *dpcb) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** End Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* CreateAnimationSaveData ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Create and fill an XmAnimationSaveData structure containing the data
|
|
Packit |
b099d7 |
* needed to animate the dropsite.
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static XmAnimationSaveData
|
|
Packit |
b099d7 |
CreateAnimationSaveData(
|
|
Packit |
b099d7 |
XmDragContext dc,
|
|
Packit |
b099d7 |
XmAnimationData aData,
|
|
Packit |
b099d7 |
XmDragProcCallbackStruct *dpcb ) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData;
|
|
Packit |
b099d7 |
XGCValues v;
|
|
Packit |
b099d7 |
unsigned long vmask;
|
|
Packit |
b099d7 |
XmDropSiteVisuals dsv;
|
|
Packit |
b099d7 |
int ac;
|
|
Packit |
b099d7 |
Arg al[5];
|
|
Packit |
b099d7 |
Window junkWin;
|
|
Packit |
b099d7 |
int junkInt;
|
|
Packit |
b099d7 |
unsigned int junkUInt;
|
|
Packit |
b099d7 |
unsigned char activeMode;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData = (XmAnimationSaveData)
|
|
Packit |
b099d7 |
XtMalloc (sizeof (XmAnimationSaveDataRec));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->dragOver = aData->dragOver;
|
|
Packit |
b099d7 |
aSaveData->display = XtDisplay (dc);
|
|
Packit |
b099d7 |
aSaveData->xmScreen = (XmScreen) XmGetXmScreen (aData->screen);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->window = aData->window;
|
|
Packit |
b099d7 |
aSaveData->windowX = aData->windowX;
|
|
Packit |
b099d7 |
aSaveData->windowY = aData->windowY;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->dragOver) {
|
|
Packit |
b099d7 |
aSaveData->xmScreen = (XmScreen) XmGetXmScreen (XtScreen (aSaveData->dragOver));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
aSaveData->xmScreen = (XmScreen) XmGetXmScreen(XtScreen (dc));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get the window depth.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XGetGeometry (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
&junkWin, &junkInt, &junkInt,
|
|
Packit |
b099d7 |
&junkUInt, &junkUInt, &junkUInt,
|
|
Packit |
b099d7 |
&(aSaveData->windowDepth))) {
|
|
Packit |
b099d7 |
XmeWarning ((Widget) dc, MESSAGE1);
|
|
Packit |
b099d7 |
aSaveData->windowDepth = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->clipRegion = aData->clipRegion;
|
|
Packit |
b099d7 |
aSaveData->dropSiteRegion = aData->dropSiteRegion;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
dsv = XmDropSiteGetActiveVisuals ((Widget) dc);
|
|
Packit |
b099d7 |
aSaveData->background = dsv->background;
|
|
Packit |
b099d7 |
aSaveData->foreground = dsv->foreground;
|
|
Packit |
b099d7 |
aSaveData->topShadowColor = dsv->topShadowColor;
|
|
Packit |
b099d7 |
aSaveData->topShadowPixmap = dsv->topShadowPixmap;
|
|
Packit |
b099d7 |
aSaveData->bottomShadowColor = dsv->bottomShadowColor;
|
|
Packit |
b099d7 |
aSaveData->bottomShadowPixmap = dsv->bottomShadowPixmap;
|
|
Packit |
b099d7 |
aSaveData->shadowThickness = dsv->shadowThickness;
|
|
Packit |
b099d7 |
aSaveData->highlightThickness = dsv->highlightThickness;
|
|
Packit |
b099d7 |
aSaveData->highlightColor = dsv->highlightColor;
|
|
Packit |
b099d7 |
aSaveData->highlightPixmap = dsv->highlightPixmap;
|
|
Packit |
b099d7 |
aSaveData->borderWidth = dsv->borderWidth;
|
|
Packit |
b099d7 |
XtFree ((char *)dsv);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ac = 0;
|
|
Packit |
b099d7 |
XtSetArg (al[ac], XmNanimationStyle, &(aSaveData->animationStyle)); ac++;
|
|
Packit |
b099d7 |
XtSetArg (al[ac], XmNanimationMask, &(aSaveData->animationMask)); ac++;
|
|
Packit |
b099d7 |
XtSetArg (al[ac], XmNanimationPixmap, &(aSaveData->animationPixmap)); ac++;
|
|
Packit |
b099d7 |
XtSetArg (al[ac], XmNanimationPixmapDepth,
|
|
Packit |
b099d7 |
&(aSaveData->animationPixmapDepth)); ac++;
|
|
Packit |
b099d7 |
XmDropSiteRetrieve ((Widget) dc, al, ac);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->animationStyle == XmDRAG_UNDER_PIXMAP &&
|
|
Packit |
b099d7 |
aSaveData->animationPixmap != None &&
|
|
Packit |
b099d7 |
aSaveData->animationPixmap != XmUNSPECIFIED_PIXMAP &&
|
|
Packit |
b099d7 |
aSaveData->animationPixmapDepth != 1 &&
|
|
Packit |
b099d7 |
aSaveData->animationPixmapDepth != aSaveData->windowDepth) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeWarning ((Widget) dc, MESSAGE2);
|
|
Packit |
b099d7 |
aSaveData->animationPixmap = XmUNSPECIFIED_PIXMAP;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Create the draw GC.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
v.foreground = aSaveData->foreground;
|
|
Packit |
b099d7 |
v.background = aSaveData->background;
|
|
Packit |
b099d7 |
v.graphics_exposures = False;
|
|
Packit |
b099d7 |
v.subwindow_mode = IncludeInferiors;
|
|
Packit |
b099d7 |
vmask = GCGraphicsExposures|GCSubwindowMode|GCForeground|GCBackground;
|
|
Packit |
b099d7 |
aSaveData->drawGC =
|
|
Packit |
b099d7 |
XCreateGC (aSaveData->display, aSaveData->window, vmask, &v);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData -> dragOver != (Widget) NULL) {
|
|
Packit |
b099d7 |
/* Save info on active drag over mode */
|
|
Packit |
b099d7 |
XtSetArg(al[0], XmNdragOverActiveMode, &activeMode);
|
|
Packit |
b099d7 |
XtGetValues((Widget) aSaveData -> dragOver, al, 1);
|
|
Packit |
b099d7 |
aSaveData->activeMode = activeMode;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* XmCURSOR is as good as any other value for here. We only
|
|
Packit |
b099d7 |
check this against XmDRAG_WINDOW */
|
|
Packit |
b099d7 |
aSaveData->activeMode = XmCURSOR;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* initialize savedPixmaps list */
|
|
Packit |
b099d7 |
aSaveData->savedPixmaps = NULL;
|
|
Packit |
b099d7 |
aSaveData->numSavedPixmaps = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (aSaveData);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FreeAnimationData ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Free an XmAnimationSaveData structure.
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
FreeAnimationData(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Cardinal i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (aSaveData->animationStyle)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_SHADOW_IN:
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_SHADOW_OUT:
|
|
Packit |
b099d7 |
XFreeGC (aSaveData->display, aSaveData->topShadowGC);
|
|
Packit |
b099d7 |
XFreeGC (aSaveData->display, aSaveData->bottomShadowGC);
|
|
Packit |
b099d7 |
XFreeGC (aSaveData->display, aSaveData->drawGC);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_HIGHLIGHT:
|
|
Packit |
b099d7 |
XFreeGC (aSaveData->display, aSaveData->highlightGC);
|
|
Packit |
b099d7 |
XFreeGC (aSaveData->display, aSaveData->drawGC);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_PIXMAP:
|
|
Packit |
b099d7 |
XFreeGC (aSaveData->display, aSaveData->drawGC);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_NONE:
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->numSavedPixmaps) {
|
|
Packit |
b099d7 |
for (i = 0; i < aSaveData->numSavedPixmaps; i++) {
|
|
Packit |
b099d7 |
_XmFreeScratchPixmap (aSaveData->xmScreen,
|
|
Packit |
b099d7 |
aSaveData->savedPixmaps[i].pixmap);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
XtFree ((char *)aSaveData->savedPixmaps);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree ((char *)aSaveData);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SaveAll ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Save the original contents of a dropsite window that will be overwritten
|
|
Packit |
b099d7 |
* by dropsite animation into a rectangular backing store.
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
SaveAll(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData,
|
|
Packit |
b099d7 |
Position x,
|
|
Packit |
b099d7 |
Position y,
|
|
Packit |
b099d7 |
Dimension width,
|
|
Packit |
b099d7 |
Dimension height )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
DragPixmapData *pData;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (width <= 0 || height <= 0) {
|
|
Packit |
b099d7 |
return (False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->numSavedPixmaps = 1;
|
|
Packit |
b099d7 |
aSaveData->savedPixmaps = pData =
|
|
Packit |
b099d7 |
(DragPixmapData *) XtMalloc (sizeof(DragPixmapData));
|
|
Packit |
b099d7 |
if (!pData) {
|
|
Packit |
b099d7 |
return (False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pData->x = x;
|
|
Packit |
b099d7 |
pData->y = y;
|
|
Packit |
b099d7 |
pData->width = width;
|
|
Packit |
b099d7 |
pData->height = height;
|
|
Packit |
b099d7 |
pData->pixmap =
|
|
Packit |
b099d7 |
_XmAllocScratchPixmap (aSaveData->xmScreen,
|
|
Packit |
b099d7 |
(Cardinal) aSaveData->windowDepth,
|
|
Packit |
b099d7 |
pData->width, pData->height);
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
pData->pixmap, aSaveData->drawGC,
|
|
Packit |
b099d7 |
pData->x, pData->y,
|
|
Packit |
b099d7 |
pData->width, pData->height, 0, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SaveSegments ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Save the original contents of a dropsite window that will be overwritten
|
|
Packit |
b099d7 |
* by dropsite highlighting or shadowing of indicated thickness. This will
|
|
Packit |
b099d7 |
* save 0, 1, or 4 strips into backing store, depending on the dimensions
|
|
Packit |
b099d7 |
* of the dropsite and the animation thickness.
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
SaveSegments(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData,
|
|
Packit |
b099d7 |
Position x,
|
|
Packit |
b099d7 |
Position y,
|
|
Packit |
b099d7 |
Dimension width,
|
|
Packit |
b099d7 |
Dimension height,
|
|
Packit |
b099d7 |
Dimension *thickness )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
DragPixmapData *pData;
|
|
Packit |
b099d7 |
Boolean save_all = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (width <= 0 || height <= 0 || *thickness <= 0) {
|
|
Packit |
b099d7 |
return (False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (*thickness > (width >> 1)) {
|
|
Packit |
b099d7 |
*thickness = (width >> 1);
|
|
Packit |
b099d7 |
save_all = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (*thickness > (height >> 1)) {
|
|
Packit |
b099d7 |
*thickness = (height >> 1);
|
|
Packit |
b099d7 |
save_all = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (save_all) {
|
|
Packit |
b099d7 |
return (SaveAll (aSaveData, x, y, width, height));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->numSavedPixmaps = 4;
|
|
Packit |
b099d7 |
aSaveData->savedPixmaps = pData =
|
|
Packit |
b099d7 |
(DragPixmapData *) XtMalloc (sizeof(DragPixmapData) * 4);
|
|
Packit |
b099d7 |
if (!pData) {
|
|
Packit |
b099d7 |
return (False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pData->x = x;
|
|
Packit |
b099d7 |
pData->y = y;
|
|
Packit |
b099d7 |
pData->width = width;
|
|
Packit |
b099d7 |
pData->height = *thickness;
|
|
Packit |
b099d7 |
pData->pixmap =
|
|
Packit |
b099d7 |
_XmAllocScratchPixmap (aSaveData->xmScreen,
|
|
Packit |
b099d7 |
(Cardinal) aSaveData->windowDepth,
|
|
Packit |
b099d7 |
pData->width, pData->height);
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
pData->pixmap, aSaveData->drawGC,
|
|
Packit |
b099d7 |
pData->x, pData->y,
|
|
Packit |
b099d7 |
pData->width, pData->height, 0, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pData++;
|
|
Packit |
b099d7 |
pData->x = x;
|
|
Packit |
b099d7 |
pData->y = y + *thickness;
|
|
Packit |
b099d7 |
pData->width = *thickness;
|
|
Packit |
b099d7 |
pData->height = height - (*thickness << 1);
|
|
Packit |
b099d7 |
pData->pixmap =
|
|
Packit |
b099d7 |
_XmAllocScratchPixmap (aSaveData->xmScreen,
|
|
Packit |
b099d7 |
(Cardinal) aSaveData->windowDepth,
|
|
Packit |
b099d7 |
pData->width, pData->height);
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
pData->pixmap, aSaveData->drawGC,
|
|
Packit |
b099d7 |
pData->x, pData->y,
|
|
Packit |
b099d7 |
pData->width, pData->height, 0, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pData++;
|
|
Packit |
b099d7 |
pData->x = x;
|
|
Packit |
b099d7 |
pData->y = y + height - *thickness;
|
|
Packit |
b099d7 |
pData->width = width;
|
|
Packit |
b099d7 |
pData->height = *thickness;
|
|
Packit |
b099d7 |
pData->pixmap =
|
|
Packit |
b099d7 |
_XmAllocScratchPixmap (aSaveData->xmScreen,
|
|
Packit |
b099d7 |
(Cardinal) aSaveData->windowDepth,
|
|
Packit |
b099d7 |
pData->width, pData->height);
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
pData->pixmap, aSaveData->drawGC,
|
|
Packit |
b099d7 |
pData->x, pData->y,
|
|
Packit |
b099d7 |
pData->width, pData->height, 0, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pData++;
|
|
Packit |
b099d7 |
pData->x = x + width - *thickness;
|
|
Packit |
b099d7 |
pData->y = y + *thickness;
|
|
Packit |
b099d7 |
pData->width = *thickness;
|
|
Packit |
b099d7 |
pData->height = height - (*thickness << 1);
|
|
Packit |
b099d7 |
pData->pixmap =
|
|
Packit |
b099d7 |
_XmAllocScratchPixmap (aSaveData->xmScreen,
|
|
Packit |
b099d7 |
(Cardinal) aSaveData->windowDepth,
|
|
Packit |
b099d7 |
pData->width, pData->height);
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
pData->pixmap, aSaveData->drawGC,
|
|
Packit |
b099d7 |
pData->x, pData->y,
|
|
Packit |
b099d7 |
pData->width, pData->height, 0, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* DrawHighlight ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Draws a highlight around the indicated region.
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
DrawHighlight(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues v;
|
|
Packit |
b099d7 |
unsigned long vmask;
|
|
Packit |
b099d7 |
Dimension offset;
|
|
Packit |
b099d7 |
Position x;
|
|
Packit |
b099d7 |
Position y;
|
|
Packit |
b099d7 |
Dimension width;
|
|
Packit |
b099d7 |
Dimension height;
|
|
Packit |
b099d7 |
XRectangle extents;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Create the highlightGC
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
v.foreground = aSaveData->highlightColor;
|
|
Packit |
b099d7 |
v.background = aSaveData->background;
|
|
Packit |
b099d7 |
v.graphics_exposures = False;
|
|
Packit |
b099d7 |
v.subwindow_mode = IncludeInferiors;
|
|
Packit |
b099d7 |
vmask = GCGraphicsExposures|GCSubwindowMode|GCForeground|GCBackground;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->highlightPixmap != None &&
|
|
Packit |
b099d7 |
aSaveData->highlightPixmap != XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
int depth ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(aSaveData->xmScreen),
|
|
Packit |
b099d7 |
aSaveData->highlightPixmap,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
&depth,
|
|
Packit |
b099d7 |
NULL, NULL, NULL, NULL, NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (depth == 1) {
|
|
Packit |
b099d7 |
v.fill_style = FillStippled;
|
|
Packit |
b099d7 |
v.stipple = aSaveData->highlightPixmap;
|
|
Packit |
b099d7 |
vmask |= GCStipple | GCFillStyle;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
v.fill_style = FillTiled;
|
|
Packit |
b099d7 |
v.tile = aSaveData->highlightPixmap;
|
|
Packit |
b099d7 |
vmask |= GCTile | GCFillStyle;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->highlightGC =
|
|
Packit |
b099d7 |
XCreateGC(aSaveData->display, aSaveData->window, vmask, &v);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRegionSetGCRegion (aSaveData->display, aSaveData->highlightGC,
|
|
Packit |
b099d7 |
0, 0, aSaveData->clipRegion);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* draw highlight */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRegionGetExtents (aSaveData->dropSiteRegion, &extents);
|
|
Packit |
b099d7 |
offset = aSaveData->borderWidth;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRegionGetNumRectangles(aSaveData->dropSiteRegion) == 1L) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
x = extents.x + offset;
|
|
Packit |
b099d7 |
y = extents.y + offset;
|
|
Packit |
b099d7 |
width = extents.width - (offset << 1);
|
|
Packit |
b099d7 |
height = extents.height - (offset << 1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (SaveSegments (aSaveData, x, y, width, height,
|
|
Packit |
b099d7 |
&aSaveData->highlightThickness)) {
|
|
Packit |
b099d7 |
XmeDrawHighlight (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
aSaveData->highlightGC,
|
|
Packit |
b099d7 |
x, y, width, height,
|
|
Packit |
b099d7 |
aSaveData->highlightThickness);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
if (SaveAll (aSaveData, extents.x, extents.y, extents.width,
|
|
Packit |
b099d7 |
extents.height)) {
|
|
Packit |
b099d7 |
_XmRegionDrawShadow (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
aSaveData->highlightGC, aSaveData->highlightGC,
|
|
Packit |
b099d7 |
aSaveData->dropSiteRegion,
|
|
Packit |
b099d7 |
offset, aSaveData->highlightThickness,
|
|
Packit |
b099d7 |
XmSHADOW_OUT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* DrawShadow ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Draws a 3-D shadow around the indicated region.
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
DrawShadow(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues v;
|
|
Packit |
b099d7 |
unsigned long vmask;
|
|
Packit |
b099d7 |
Dimension offset;
|
|
Packit |
b099d7 |
Position x;
|
|
Packit |
b099d7 |
Position y;
|
|
Packit |
b099d7 |
Dimension width;
|
|
Packit |
b099d7 |
Dimension height;
|
|
Packit |
b099d7 |
XRectangle extents;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Create the topShadowGC
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
v.foreground = aSaveData->topShadowColor;
|
|
Packit |
b099d7 |
v.background = aSaveData->foreground;
|
|
Packit |
b099d7 |
v.graphics_exposures = False;
|
|
Packit |
b099d7 |
v.subwindow_mode = IncludeInferiors;
|
|
Packit |
b099d7 |
vmask = GCGraphicsExposures|GCSubwindowMode|GCForeground|GCBackground;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->topShadowPixmap != None &&
|
|
Packit |
b099d7 |
aSaveData->topShadowPixmap != XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
int depth ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(aSaveData->xmScreen),
|
|
Packit |
b099d7 |
aSaveData->topShadowPixmap,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
&depth,
|
|
Packit |
b099d7 |
NULL, NULL, NULL, NULL, NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (depth == 1) {
|
|
Packit |
b099d7 |
v.fill_style = FillStippled;
|
|
Packit |
b099d7 |
v.stipple = aSaveData->topShadowPixmap;
|
|
Packit |
b099d7 |
vmask |= GCStipple | GCFillStyle;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
v.fill_style = FillTiled;
|
|
Packit |
b099d7 |
v.tile = aSaveData->topShadowPixmap;
|
|
Packit |
b099d7 |
vmask |= GCTile | GCFillStyle;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->topShadowGC =
|
|
Packit |
b099d7 |
XCreateGC(aSaveData->display, aSaveData->window, vmask, &v);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRegionSetGCRegion (aSaveData->display, aSaveData->topShadowGC,
|
|
Packit |
b099d7 |
0, 0, aSaveData->clipRegion);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Create the bottomShadowGC
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
v.foreground = aSaveData->bottomShadowColor;
|
|
Packit |
b099d7 |
v.background = aSaveData->foreground;
|
|
Packit |
b099d7 |
v.graphics_exposures = False;
|
|
Packit |
b099d7 |
v.subwindow_mode = IncludeInferiors;
|
|
Packit |
b099d7 |
vmask = GCGraphicsExposures|GCSubwindowMode|GCForeground|GCBackground;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->bottomShadowPixmap != None &&
|
|
Packit |
b099d7 |
aSaveData->bottomShadowPixmap != XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
int depth ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(aSaveData->xmScreen),
|
|
Packit |
b099d7 |
aSaveData->bottomShadowPixmap,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
&depth,
|
|
Packit |
b099d7 |
NULL, NULL, NULL, NULL, NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (depth == 1) {
|
|
Packit |
b099d7 |
v.fill_style = FillStippled;
|
|
Packit |
b099d7 |
v.stipple = aSaveData->bottomShadowPixmap;
|
|
Packit |
b099d7 |
vmask |= GCStipple | GCFillStyle;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
v.fill_style = FillTiled;
|
|
Packit |
b099d7 |
v.tile = aSaveData->bottomShadowPixmap;
|
|
Packit |
b099d7 |
vmask |= GCTile | GCFillStyle;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData->bottomShadowGC =
|
|
Packit |
b099d7 |
XCreateGC(aSaveData->display, aSaveData->window, vmask, &v);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRegionSetGCRegion (aSaveData->display, aSaveData->bottomShadowGC,
|
|
Packit |
b099d7 |
0, 0, aSaveData->clipRegion);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Draw the shadows.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRegionGetExtents (aSaveData->dropSiteRegion, &extents);
|
|
Packit |
b099d7 |
offset = aSaveData->borderWidth + aSaveData->highlightThickness;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRegionGetNumRectangles(aSaveData->dropSiteRegion) == 1L) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
x = extents.x + offset;
|
|
Packit |
b099d7 |
y = extents.y + offset;
|
|
Packit |
b099d7 |
width = extents.width - (offset << 1);
|
|
Packit |
b099d7 |
height = extents.height - (offset << 1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (SaveSegments (aSaveData, x, y, width, height,
|
|
Packit |
b099d7 |
&aSaveData->shadowThickness)) {
|
|
Packit |
b099d7 |
XmeDrawShadows (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
aSaveData->topShadowGC,
|
|
Packit |
b099d7 |
aSaveData->bottomShadowGC,
|
|
Packit |
b099d7 |
x, y, width, height,
|
|
Packit |
b099d7 |
aSaveData->shadowThickness,
|
|
Packit |
b099d7 |
(aSaveData->animationStyle ==
|
|
Packit |
b099d7 |
XmDRAG_UNDER_SHADOW_IN) ?
|
|
Packit |
b099d7 |
XmSHADOW_IN : XmSHADOW_OUT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
if (SaveAll (aSaveData, extents.x, extents.y,
|
|
Packit |
b099d7 |
extents.width, extents.height)) {
|
|
Packit |
b099d7 |
_XmRegionDrawShadow (aSaveData->display, aSaveData->window,
|
|
Packit |
b099d7 |
aSaveData->topShadowGC,
|
|
Packit |
b099d7 |
aSaveData->bottomShadowGC,
|
|
Packit |
b099d7 |
aSaveData->dropSiteRegion,
|
|
Packit |
b099d7 |
offset, aSaveData->shadowThickness,
|
|
Packit |
b099d7 |
(aSaveData->animationStyle ==
|
|
Packit |
b099d7 |
XmDRAG_UNDER_SHADOW_IN) ?
|
|
Packit |
b099d7 |
XmSHADOW_IN : XmSHADOW_OUT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* DrawPixmap ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copy an animationPixmap, possibly masked, to the dropsite window.
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
DrawPixmap(
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Position x;
|
|
Packit |
b099d7 |
Position y;
|
|
Packit |
b099d7 |
Dimension width;
|
|
Packit |
b099d7 |
Dimension height;
|
|
Packit |
b099d7 |
XRectangle extents;
|
|
Packit |
b099d7 |
XGCValues v;
|
|
Packit |
b099d7 |
unsigned long vmask;
|
|
Packit |
b099d7 |
Pixmap mask = XmUNSPECIFIED_PIXMAP;
|
|
Packit |
b099d7 |
GC maskGC = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->animationPixmap == None ||
|
|
Packit |
b099d7 |
aSaveData->animationPixmap == XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Determine the destination location and dimensions -- the
|
|
Packit |
b099d7 |
* dropsite's bounding box.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRegionGetExtents (aSaveData->dropSiteRegion, &extents);
|
|
Packit |
b099d7 |
x = extents.x;
|
|
Packit |
b099d7 |
y = extents.y;
|
|
Packit |
b099d7 |
width = extents.width;
|
|
Packit |
b099d7 |
height = extents.height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Save the original window contents.
|
|
Packit |
b099d7 |
* Draw the DrawUnder pixmap into the window.
|
|
Packit |
b099d7 |
* Assume correct depth -- checked in CreateAnimationSaveData().
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (SaveAll (aSaveData, x, y, width, height)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->animationMask != None &&
|
|
Packit |
b099d7 |
aSaveData->animationMask != XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* AnimationMask specified: create a composite mask consisting
|
|
Packit |
b099d7 |
* of both the clipping region and the animationMask to use for
|
|
Packit |
b099d7 |
* copying the animationPixmap into the dropSite.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Create a mask and maskGC.
|
|
Packit |
b099d7 |
* Set the composite mask to 0's.
|
|
Packit |
b099d7 |
* Or the animationMask into it through the ClipRegion.
|
|
Packit |
b099d7 |
* Set the drawGC's ClipMask to the composite mask.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
mask = _XmAllocScratchPixmap (aSaveData->xmScreen, 1,
|
|
Packit |
b099d7 |
width, height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
v.background = 0;
|
|
Packit |
b099d7 |
v.foreground = 1;
|
|
Packit |
b099d7 |
v.function = GXclear;
|
|
Packit |
b099d7 |
v.graphics_exposures = False;
|
|
Packit |
b099d7 |
v.subwindow_mode = IncludeInferiors;
|
|
Packit |
b099d7 |
vmask = GCGraphicsExposures|GCSubwindowMode|
|
|
Packit |
b099d7 |
GCBackground|GCForeground|GCFunction;
|
|
Packit |
b099d7 |
maskGC = XCreateGC (aSaveData->display, mask, vmask, &v);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XFillRectangle (aSaveData->display, mask, maskGC,
|
|
Packit |
b099d7 |
0, 0, width, height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetFunction (aSaveData->display, maskGC, GXor);
|
|
Packit |
b099d7 |
_XmRegionSetGCRegion (aSaveData->display, maskGC,
|
|
Packit |
b099d7 |
-x, -y, aSaveData->clipRegion);
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display,
|
|
Packit |
b099d7 |
aSaveData->animationMask,
|
|
Packit |
b099d7 |
mask, maskGC,
|
|
Packit |
b099d7 |
0, 0, width, height, 0, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetClipOrigin (aSaveData->display, aSaveData->drawGC, x, y);
|
|
Packit |
b099d7 |
XSetClipMask (aSaveData->display, aSaveData->drawGC, mask);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XFreeGC (aSaveData->display, maskGC);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmRegionSetGCRegion (aSaveData->display, aSaveData->drawGC,
|
|
Packit |
b099d7 |
0, 0, aSaveData->clipRegion);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Copy the animationPixmap to the window.
|
|
Packit |
b099d7 |
* If the animationPixmapDepth is 1 we treat the animationPixmap
|
|
Packit |
b099d7 |
* as a bitmap and use XCopyPlane. For 1-deep dropsite windows,
|
|
Packit |
b099d7 |
* this may not be the same as treating the animationPixmap as a
|
|
Packit |
b099d7 |
* 1-deep pixmap and using XCopyArea.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->animationPixmapDepth == 1) {
|
|
Packit |
b099d7 |
XCopyPlane (aSaveData->display,
|
|
Packit |
b099d7 |
aSaveData->animationPixmap,
|
|
Packit |
b099d7 |
aSaveData->window, aSaveData->drawGC,
|
|
Packit |
b099d7 |
0, 0, width, height, x, y, 1L);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display,
|
|
Packit |
b099d7 |
aSaveData->animationPixmap,
|
|
Packit |
b099d7 |
aSaveData->window, aSaveData->drawGC,
|
|
Packit |
b099d7 |
0, 0, width, height, x, y);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (mask != XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
_XmFreeScratchPixmap (aSaveData->xmScreen, mask);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* AnimateExpose ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
AnimateExpose(Widget w, /* unused */
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData,
|
|
Packit |
b099d7 |
XEvent *event, /* unused */
|
|
Packit |
b099d7 |
Boolean *cont) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* If dragging a pixmap or window, hide it while drawing the
|
|
Packit |
b099d7 |
* animation.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->dragOver && aSaveData->activeMode != XmDRAG_WINDOW) {
|
|
Packit |
b099d7 |
_XmDragOverHide (aSaveData->dragOver,
|
|
Packit |
b099d7 |
aSaveData->windowX, aSaveData->windowY,
|
|
Packit |
b099d7 |
aSaveData->clipRegion);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Draw the visuals. */
|
|
Packit |
b099d7 |
switch(aSaveData->animationStyle) {
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_HIGHLIGHT:
|
|
Packit |
b099d7 |
DrawHighlight (aSaveData);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_SHADOW_IN:
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_SHADOW_OUT:
|
|
Packit |
b099d7 |
DrawShadow (aSaveData);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_PIXMAP:
|
|
Packit |
b099d7 |
DrawPixmap (aSaveData);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmDRAG_UNDER_NONE:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* If dragging a pixmap or window, show it.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->dragOver && aSaveData->activeMode != XmDRAG_WINDOW) {
|
|
Packit |
b099d7 |
_XmDragOverShow (aSaveData->dragOver,
|
|
Packit |
b099d7 |
aSaveData->windowX, aSaveData->windowY,
|
|
Packit |
b099d7 |
aSaveData->clipRegion);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* AnimateEnter ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
AnimateEnter(
|
|
Packit |
b099d7 |
XmDropSiteManagerObject dsm, /* unused */
|
|
Packit |
b099d7 |
XmAnimationData aData,
|
|
Packit |
b099d7 |
XmDragProcCallbackStruct *dpcb )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget dc = dpcb->dragContext;
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData;
|
|
Packit |
b099d7 |
Widget dswidget = GetDSWidget((XmDSInfo) (dsm->dropManager.curInfo));
|
|
Packit |
b099d7 |
Boolean dummy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Create and fill an XmAnimationSaveData structure containing the
|
|
Packit |
b099d7 |
* data needed to animate the dropsite. Save it for AnimateLeave().
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
aSaveData = CreateAnimationSaveData ((XmDragContext) dc, aData, dpcb);
|
|
Packit |
b099d7 |
*((XtPointer *) aData->saveAddr) = (XtPointer) aSaveData;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Show the visual */
|
|
Packit |
b099d7 |
AnimateExpose(dswidget, aSaveData, NULL, &dummy);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Save the dragunder widget */
|
|
Packit |
b099d7 |
aSaveData->dragUnder = dswidget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->activeMode == XmDRAG_WINDOW) {
|
|
Packit |
b099d7 |
/* Install the event handler to redo visual on Exposure */
|
|
Packit |
b099d7 |
Widget hwidget = dswidget;
|
|
Packit |
b099d7 |
if (XmIsGadget(hwidget))
|
|
Packit |
b099d7 |
hwidget = XtParent(hwidget);
|
|
Packit |
b099d7 |
XtInsertEventHandler(hwidget, ExposureMask, False,
|
|
Packit |
b099d7 |
(XtEventHandler) AnimateExpose,
|
|
Packit |
b099d7 |
(XtPointer) aSaveData, XtListTail);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* AnimateLeave ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
AnimateLeave(
|
|
Packit |
b099d7 |
XmDropSiteManagerObject dsm, /* unused */
|
|
Packit |
b099d7 |
XmAnimationData aData,
|
|
Packit |
b099d7 |
XmDragProcCallbackStruct *dpcb ) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmAnimationSaveData aSaveData =
|
|
Packit |
b099d7 |
(XmAnimationSaveData) *((XtPointer *) aData->saveAddr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData) {
|
|
Packit |
b099d7 |
Cardinal i;
|
|
Packit |
b099d7 |
DragPixmapData *pData;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Move to here to avoid crashes when aSaveData already zeroed */
|
|
Packit |
b099d7 |
if (aSaveData->activeMode == XmDRAG_WINDOW) {
|
|
Packit |
b099d7 |
/* Remove the event handler to redo visual on Exposure */
|
|
Packit |
b099d7 |
Widget hwidget = aSaveData -> dragUnder;
|
|
Packit |
b099d7 |
if (XmIsGadget(hwidget))
|
|
Packit |
b099d7 |
hwidget = XtParent(hwidget);
|
|
Packit |
b099d7 |
XtRemoveEventHandler(hwidget, ExposureMask, False,
|
|
Packit |
b099d7 |
(XtEventHandler) AnimateExpose,
|
|
Packit |
b099d7 |
(XtPointer) aSaveData);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* If dragging a pixmap or window, hide it while erasing the
|
|
Packit |
b099d7 |
* animation.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->dragOver) {
|
|
Packit |
b099d7 |
_XmDragOverHide (aSaveData->dragOver,
|
|
Packit |
b099d7 |
aSaveData->windowX, aSaveData->windowY,
|
|
Packit |
b099d7 |
aSaveData->clipRegion);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Copy any saved segments back into the window.
|
|
Packit |
b099d7 |
* Be sure GCRegion is set properly here.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRegionSetGCRegion (aSaveData->display, aSaveData->drawGC,
|
|
Packit |
b099d7 |
0, 0, aSaveData->clipRegion);
|
|
Packit |
b099d7 |
for (pData = aSaveData->savedPixmaps, i = aSaveData->numSavedPixmaps;
|
|
Packit |
b099d7 |
i; pData++, i--) {
|
|
Packit |
b099d7 |
XCopyArea (aSaveData->display,
|
|
Packit |
b099d7 |
pData->pixmap,
|
|
Packit |
b099d7 |
aSaveData->window,
|
|
Packit |
b099d7 |
aSaveData->drawGC,
|
|
Packit |
b099d7 |
0, 0,
|
|
Packit |
b099d7 |
pData->width,
|
|
Packit |
b099d7 |
pData->height,
|
|
Packit |
b099d7 |
pData->x,
|
|
Packit |
b099d7 |
pData->y);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* If dragging a pixmap or window, show it.
|
|
Packit |
b099d7 |
* Free the XmAnimationSaveData structure created in AnimateEnter().
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (aSaveData->dragOver) {
|
|
Packit |
b099d7 |
_XmDragOverShow (aSaveData->dragOver,
|
|
Packit |
b099d7 |
aSaveData->windowX, aSaveData->windowY,
|
|
Packit |
b099d7 |
aSaveData->clipRegion);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
FreeAnimationData (aSaveData);
|
|
Packit |
b099d7 |
*((XtPointer *) aData->saveAddr) = (XtPointer) NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* _XmDragUnderAnimation ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmDragUnderAnimation(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtPointer clientData,
|
|
Packit |
b099d7 |
XtPointer callData )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmDropSiteManagerObject dsm = (XmDropSiteManagerObject) w;
|
|
Packit |
b099d7 |
XmDragProcCallbackStruct *dpcb = (XmDragProcCallbackStruct *) callData;
|
|
Packit |
b099d7 |
XmAnimationData aData = (XmAnimationData) clientData;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch(dpcb->reason)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case XmCR_DROP_SITE_LEAVE_MESSAGE:
|
|
Packit |
b099d7 |
AnimateLeave(dsm, aData, dpcb);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmCR_DROP_SITE_ENTER_MESSAGE:
|
|
Packit |
b099d7 |
AnimateEnter(dsm, aData, dpcb);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|