Blame lib/Xm/DragUnder.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: 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