Blame clients/mwm/WmIPlace.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
 * Motif Release 1.2.1
Packit b099d7
*/ 
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: WmIPlace.c /main/4 1995/11/01 11:41:20 rswiston $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
 * (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Included Files:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmGlobal.h"
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * include extern functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmError.h"
Packit b099d7
#include "WmIDecor.h"
Packit b099d7
#include "WmIconBox.h"
Packit b099d7
#include "WmWinConf.h"
Packit b099d7
#ifdef WSM
Packit b099d7
#include "WmWrkspace.h"
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function Declarations:
Packit b099d7
 */
Packit b099d7
#include "WmIPlace.h"
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Global Variables:
Packit b099d7
 */
Packit b099d7
extern Dimension clipWidth;
Packit b099d7
extern Dimension clipHeight;
Packit b099d7
extern Position clipX;
Packit b099d7
extern Position clipY;
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  InitIconPlacement ()
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function intializes icon placement information.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pWS = pointer to workspace data
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  IconPlacmementData
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void InitIconPlacement (WmWorkspaceData *pWS)
Packit b099d7
{
Packit b099d7
    Boolean useMargin;
Packit b099d7
    int sW;
Packit b099d7
    int sH;
Packit b099d7
    int iSpaceX;
Packit b099d7
    int iSpaceY;
Packit b099d7
    int placementW;
Packit b099d7
    int placementH;
Packit b099d7
    int extraXSpace;
Packit b099d7
    int extraYSpace;
Packit b099d7
    int xMargin;
Packit b099d7
    int yMargin;
Packit b099d7
    int extraPX;
Packit b099d7
    int extraPY;
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
Packit b099d7
    xMargin = yMargin = extraPX = extraPY = 0;
Packit b099d7
Packit b099d7
    sW = DisplayWidth (DISPLAY, pWS->pSD->screen);
Packit b099d7
    sH = DisplayHeight (DISPLAY, pWS->pSD->screen);
Packit b099d7
    useMargin = (pWS->pSD->iconPlacementMargin >= 0);
Packit b099d7
    pWS->IPData.iconPlacement = pWS->pSD->iconPlacement;
Packit b099d7
Packit b099d7
    if (useMargin)
Packit b099d7
    {
Packit b099d7
	pWS->IPData.placementCols =
Packit b099d7
	    (sW - (2 * pWS->pSD->iconPlacementMargin)) / pWS->pSD->iconWidth;
Packit b099d7
	pWS->IPData.placementRows =
Packit b099d7
	    (sH - (2 * pWS->pSD->iconPlacementMargin)) / pWS->pSD->iconHeight;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	pWS->IPData.placementCols = sW / pWS->pSD->iconWidth;
Packit b099d7
	pWS->IPData.placementRows = sH / pWS->pSD->iconHeight;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (pWS->IPData.iconPlacement & ICON_PLACE_TIGHT)
Packit b099d7
    {
Packit b099d7
	iSpaceX = 0;
Packit b099d7
	iSpaceY = 0;
Packit b099d7
	xMargin = 2;
Packit b099d7
	yMargin = 2;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	do
Packit b099d7
	{
Packit b099d7
	    if (useMargin)
Packit b099d7
	    {
Packit b099d7
	        iSpaceX = 
Packit b099d7
		    (sW - (2 * pWS->pSD->iconPlacementMargin) -
Packit b099d7
			  (pWS->IPData.placementCols * pWS->pSD->iconWidth)) /
Packit b099d7
			      (pWS->IPData.placementCols - 1);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
	        iSpaceX = 
Packit b099d7
		    (sW - (pWS->IPData.placementCols * pWS->pSD->iconWidth)) /
Packit b099d7
			       pWS->IPData.placementCols;
Packit b099d7
	    }
Packit b099d7
	    if (iSpaceX < MINIMUM_ICON_SPACING)
Packit b099d7
	    {
Packit b099d7
	        pWS->IPData.placementCols--;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	while (iSpaceX < MINIMUM_ICON_SPACING);
Packit b099d7
Packit b099d7
	do
Packit b099d7
	{
Packit b099d7
	    if (useMargin)
Packit b099d7
	    {
Packit b099d7
	        iSpaceY = (sH - (2 * pWS->pSD->iconPlacementMargin) -
Packit b099d7
		       (pWS->IPData.placementRows * pWS->pSD->iconHeight)) /
Packit b099d7
				  (pWS->IPData.placementRows - 1);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
	        iSpaceY = 
Packit b099d7
		    (sH - (pWS->IPData.placementRows * pWS->pSD->iconHeight)) /
Packit b099d7
					    pWS->IPData.placementRows;
Packit b099d7
	    }
Packit b099d7
	    if (iSpaceY < MINIMUM_ICON_SPACING)
Packit b099d7
	    {
Packit b099d7
	        pWS->IPData.placementRows--;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	while (iSpaceY < MINIMUM_ICON_SPACING);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    pWS->IPData.iPlaceW = pWS->pSD->iconWidth + iSpaceX;
Packit b099d7
    pWS->IPData.iPlaceH = pWS->pSD->iconHeight + iSpaceY;
Packit b099d7
Packit b099d7
    placementW = pWS->IPData.placementCols * pWS->IPData.iPlaceW;
Packit b099d7
    placementH = pWS->IPData.placementRows * pWS->IPData.iPlaceH;
Packit b099d7
Packit b099d7
    pWS->IPData.placeIconX = 
Packit b099d7
	((pWS->IPData.iPlaceW - pWS->pSD->iconWidth) + 1) / 2;
Packit b099d7
    pWS->IPData.placeIconY = 
Packit b099d7
        ((pWS->IPData.iPlaceH - pWS->pSD->iconHeight) + 1) / 2;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Special case margin handling for TIGHT icon placement
Packit b099d7
     */
Packit b099d7
    if (pWS->IPData.iconPlacement & ICON_PLACE_TIGHT)
Packit b099d7
    {
Packit b099d7
	if (useMargin)
Packit b099d7
	{
Packit b099d7
	    xMargin = pWS->pSD->iconPlacementMargin;
Packit b099d7
	    yMargin = pWS->pSD->iconPlacementMargin;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	extraXSpace = 0;
Packit b099d7
	extraYSpace = 0;
Packit b099d7
Packit b099d7
	if ((pWS->IPData.iconPlacement & ICON_PLACE_RIGHT_PRIMARY) ||
Packit b099d7
	   (pWS->IPData.iconPlacement & ICON_PLACE_RIGHT_SECONDARY))
Packit b099d7
	    xMargin = sW - placementW - xMargin;
Packit b099d7
Packit b099d7
	if ((pWS->IPData.iconPlacement & ICON_PLACE_BOTTOM_PRIMARY) ||
Packit b099d7
	   (pWS->IPData.iconPlacement & ICON_PLACE_BOTTOM_SECONDARY))
Packit b099d7
	    yMargin = sH - placementH - yMargin;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	if (useMargin)
Packit b099d7
	{
Packit b099d7
	    xMargin = pWS->pSD->iconPlacementMargin - pWS->IPData.placeIconX;
Packit b099d7
	    extraXSpace = sW - (2 * pWS->pSD->iconPlacementMargin) -
Packit b099d7
			  (placementW - iSpaceX);
Packit b099d7
	    extraPX = (pWS->IPData.iconPlacement & ICON_PLACE_RIGHT_PRIMARY) ?
Packit b099d7
				1 : (pWS->IPData.placementCols - extraXSpace);
Packit b099d7
Packit b099d7
	    yMargin = pWS->pSD->iconPlacementMargin - pWS->IPData.placeIconY;
Packit b099d7
	    extraYSpace = sH - (2 * pWS->pSD->iconPlacementMargin) -
Packit b099d7
			  (placementH - iSpaceY);
Packit b099d7
	    extraPY = (pWS->IPData.iconPlacement & ICON_PLACE_BOTTOM_PRIMARY) ?
Packit b099d7
				1 : (pWS->IPData.placementRows - extraYSpace);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    xMargin = (sW - placementW + 
Packit b099d7
		((pWS->IPData.iPlaceW - pWS->pSD->iconWidth) & 1)) / 2;
Packit b099d7
	    extraXSpace = 0;
Packit b099d7
	    yMargin = (sH - placementH + 
Packit b099d7
		((pWS->IPData.iPlaceH - pWS->pSD->iconHeight) & 1))/ 2;
Packit b099d7
	    extraYSpace = 0;
Packit b099d7
Packit b099d7
	    if (pWS->IPData.iconPlacement & ICON_PLACE_RIGHT_PRIMARY)
Packit b099d7
	    {
Packit b099d7
		xMargin = sW - placementW - xMargin;
Packit b099d7
		pWS->IPData.placeIconX = pWS->IPData.iPlaceW - 
Packit b099d7
					 pWS->pSD->iconWidth - 
Packit b099d7
					 pWS->IPData.placeIconX;
Packit b099d7
	    }
Packit b099d7
	    if (pWS->IPData.iconPlacement & ICON_PLACE_BOTTOM_PRIMARY)
Packit b099d7
	    {
Packit b099d7
		yMargin = sH - placementH - yMargin;
Packit b099d7
		pWS->IPData.placeIconY = pWS->IPData.iPlaceH - 
Packit b099d7
					 pWS->pSD->iconHeight - 
Packit b099d7
					 pWS->IPData.placeIconY;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Setup array of grid row positions and grid column positions:
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((pWS->IPData.placementRowY =
Packit b099d7
	    (int *)XtMalloc ((pWS->IPData.placementRows+2) * sizeof (int)))
Packit b099d7
	== NULL)
Packit b099d7
    {
Packit b099d7
	Warning (((char *)GETMESSAGE(34, 1, "Insufficient memory for icon placement")));
Packit b099d7
	wmGD.iconAutoPlace = False;
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
    else if ((pWS->IPData.placementColX =
Packit b099d7
		(int *)XtMalloc ((pWS->IPData.placementCols+2) * sizeof (int)))
Packit b099d7
	     == NULL)
Packit b099d7
    {
Packit b099d7
	XtFree ((char *)pWS->IPData.placementRowY);
Packit b099d7
	Warning (((char *)GETMESSAGE(34, 2, "Insufficient memory for icon placement")));
Packit b099d7
	wmGD.iconAutoPlace = False;
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    pWS->IPData.placementRowY[0] = yMargin;
Packit b099d7
    for (i = 1; i <= pWS->IPData.placementRows; i++)
Packit b099d7
    {
Packit b099d7
	pWS->IPData.placementRowY[i] = pWS->IPData.placementRowY[i - 1] + 
Packit b099d7
	    pWS->IPData.iPlaceH;
Packit b099d7
	if ((extraYSpace > 0) && (i >= extraPY))
Packit b099d7
	{
Packit b099d7
	    (pWS->IPData.placementRowY[i])++;
Packit b099d7
	    extraYSpace--;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    pWS->IPData.placementColX[0] = xMargin;
Packit b099d7
    for (i = 1; i <= pWS->IPData.placementCols; i++)
Packit b099d7
    {
Packit b099d7
	pWS->IPData.placementColX[i] = pWS->IPData.placementColX[i - 1] + 
Packit b099d7
	    pWS->IPData.iPlaceW;
Packit b099d7
	if ((extraXSpace > 0) && (i >= extraPX))
Packit b099d7
	{
Packit b099d7
	    (pWS->IPData.placementColX[i])++;
Packit b099d7
	    extraXSpace--;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Setup an array of icon places.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    pWS->IPData.totalPlaces = 
Packit b099d7
	pWS->IPData.placementRows * pWS->IPData.placementCols;
Packit b099d7
Packit b099d7
    if ((pWS->IPData.placeList =
Packit b099d7
	  (IconInfo *)XtMalloc (pWS->IPData.totalPlaces * sizeof (IconInfo)))
Packit b099d7
	== NULL)
Packit b099d7
    {
Packit b099d7
	Warning (((char *)GETMESSAGE(34, 3, "Insufficient memory for icon placement")));
Packit b099d7
	XtFree ((char *)pWS->IPData.placementRowY);
Packit b099d7
	XtFree ((char *)pWS->IPData.placementColX);
Packit b099d7
	wmGD.iconAutoPlace = False;
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    memset ((char *)pWS->IPData.placeList, 0, 
Packit b099d7
	pWS->IPData.totalPlaces * sizeof (IconInfo));
Packit b099d7
Packit b099d7
    pWS->IPData.onRootWindow = True;
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION InitIconPlacement */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetNextIconPlace (pIPD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function identifies and returns the next free icon grid place.
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return = next free place (index)
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
int GetNextIconPlace (IconPlacementData *pIPD)
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
Packit b099d7
    for (i = 0; i < pIPD->totalPlaces; i++)
Packit b099d7
    {
Packit b099d7
	if (pIPD->placeList[i].pCD == (ClientData *)NULL)
Packit b099d7
	{
Packit b099d7
	    return (i);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * All places are filled!  Find an alternative place.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    return (NO_ICON_PLACE);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetNextIconPlace */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  CvtIconPlaceToPosition (pIPD, place, pX, pY)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function converts an icon place (index) into an icon position.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pIPD = ptr to icon placement data
Packit b099d7
 *
Packit b099d7
 *  place = place to be converted
Packit b099d7
 *
Packit b099d7
 *  wmGD = (iconPlacement ...)
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pX = pointer to icon place X location
Packit b099d7
 *
Packit b099d7
 *  pY = pointer to icon place Y location
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void CvtIconPlaceToPosition (IconPlacementData *pIPD, int place, int *pX, int *pY)
Packit b099d7
{
Packit b099d7
    int row;
Packit b099d7
    int col;
Packit b099d7
Packit b099d7
Packit b099d7
    if (pIPD->iconPlacement &
Packit b099d7
	(ICON_PLACE_LEFT_PRIMARY | ICON_PLACE_RIGHT_PRIMARY))
Packit b099d7
    {
Packit b099d7
	col = place % pIPD->placementCols;
Packit b099d7
	row = place / pIPD->placementCols;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	col = place / pIPD->placementRows;
Packit b099d7
	row = place % pIPD->placementRows;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (pIPD->iconPlacement &
Packit b099d7
	(ICON_PLACE_RIGHT_PRIMARY | ICON_PLACE_RIGHT_SECONDARY))
Packit b099d7
    {
Packit b099d7
	col = pIPD->placementCols - col - 1;
Packit b099d7
    }
Packit b099d7
    if (pIPD->iconPlacement &
Packit b099d7
	     (ICON_PLACE_BOTTOM_PRIMARY | ICON_PLACE_BOTTOM_SECONDARY))
Packit b099d7
    {
Packit b099d7
	row = pIPD->placementRows - row - 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (pIPD->onRootWindow)
Packit b099d7
    {
Packit b099d7
	*pX = pIPD->placementColX[col] + pIPD->placeIconX;
Packit b099d7
	*pY = pIPD->placementRowY[row] + pIPD->placeIconY;
Packit b099d7
    }
Packit b099d7
    else 
Packit b099d7
    {
Packit b099d7
	*pX = col * pIPD->iPlaceW;
Packit b099d7
	*pY = row * pIPD->iPlaceH;
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION CvtIconPlaceToPosition */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  FindIconPlace (pCD, pIPD, x, y)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function is used to find a free icon place in the proximity of the
Packit b099d7
 *  specified position.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pIPD = ptr to icon placement data
Packit b099d7
 *
Packit b099d7
 *  x = desired x location of icon place
Packit b099d7
 *
Packit b099d7
 *  y = desired y location of icon place
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return = icon place (index)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  Look first for a free icon place at the position passed in.  If that place
Packit b099d7
 *  is taken then look at positions that are +- one half the icon width/height
Packit b099d7
 *  from the postion passed in.  If those positions are taken look at
Packit b099d7
 *  positions that are +- one half icon placement width/height from the
Packit b099d7
 *  position passed in.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
int FindIconPlace (ClientData *pCD, IconPlacementData *pIPD, int x, int y)
Packit b099d7
{
Packit b099d7
    int place;
Packit b099d7
    int i;
Packit b099d7
    int j;
Packit b099d7
    int diffX;
Packit b099d7
    int diffY;
Packit b099d7
    int altX;
Packit b099d7
    int altY;
Packit b099d7
    int amt;
Packit b099d7
Packit b099d7
Packit b099d7
    place = CvtIconPositionToPlace (pIPD, x, y);
Packit b099d7
Packit b099d7
    if (place < pIPD->totalPlaces)
Packit b099d7
    {
Packit b099d7
	if (pIPD->placeList[place].pCD == (ClientData *)NULL)
Packit b099d7
	{
Packit b099d7
	return (place);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
        if (pIPD->iconPlacement & ICON_PLACE_LEFT_PRIMARY)
Packit b099d7
        {
Packit b099d7
            amt = pIPD->placementCols;              /* add a new row */
Packit b099d7
        }
Packit b099d7
        else
Packit b099d7
        {
Packit b099d7
            amt = pIPD->placementRows;              /* add a new column */
Packit b099d7
        }
Packit b099d7
Packit b099d7
	if (!ExtendIconList (P_ICON_BOX(pCD), amt))
Packit b099d7
	{
Packit b099d7
	    Warning (((char *)GETMESSAGE(34, 4, "Insufficient memory to create icon box data")));
Packit b099d7
	    return (NO_ICON_PLACE);            
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    /*
Packit b099d7
     * The place for the passed in position is in use, look at places for
Packit b099d7
     * alternative positions.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    for (i = 0; i < 2; i++)
Packit b099d7
    {
Packit b099d7
	switch (i)
Packit b099d7
	{
Packit b099d7
	    case 0:
Packit b099d7
	    {
Packit b099d7
		diffX = ICON_WIDTH(pCD) / 2;
Packit b099d7
		diffY = ICON_HEIGHT(pCD) / 2;
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    case 1:
Packit b099d7
	    {
Packit b099d7
		diffX = pIPD->iPlaceW / 2;
Packit b099d7
		diffY = pIPD->iPlaceH / 2;
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
Packit b099d7
	for (j = 0; j < 4; j++)
Packit b099d7
	{
Packit b099d7
	    switch (j)
Packit b099d7
	    {
Packit b099d7
		case 0:
Packit b099d7
		{
Packit b099d7
		    if (pIPD->iconPlacement & ICON_PLACE_LEFT_PRIMARY)
Packit b099d7
		    {
Packit b099d7
			altX = x - diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_PRIMARY)
Packit b099d7
		    {
Packit b099d7
			altX = x + diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_TOP_PRIMARY)
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y - diffY;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y + diffY;
Packit b099d7
		    }
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
Packit b099d7
		case 1:
Packit b099d7
		{
Packit b099d7
		    if (pIPD->iconPlacement & ICON_PLACE_LEFT_PRIMARY)
Packit b099d7
		    {
Packit b099d7
			altX = x + diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_PRIMARY)
Packit b099d7
		    {
Packit b099d7
			altX = x - diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_TOP_PRIMARY)
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y + diffY;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y - diffY;
Packit b099d7
		    }
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
Packit b099d7
		case 2:
Packit b099d7
		{
Packit b099d7
		    if (pIPD->iconPlacement & ICON_PLACE_LEFT_SECONDARY)
Packit b099d7
		    {
Packit b099d7
			altX = x - diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_SECONDARY)
Packit b099d7
		    {
Packit b099d7
			altX = x + diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_TOP_SECONDARY)
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y + diffY;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y - diffY;
Packit b099d7
		    }
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
Packit b099d7
		case 3:
Packit b099d7
		{
Packit b099d7
		    if (pIPD->iconPlacement & ICON_PLACE_LEFT_SECONDARY)
Packit b099d7
		    {
Packit b099d7
			altX = x + diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_SECONDARY)
Packit b099d7
		    {
Packit b099d7
			altX = x - diffX;
Packit b099d7
			altY = y;
Packit b099d7
		    }
Packit b099d7
		    else if (pIPD->iconPlacement & ICON_PLACE_TOP_SECONDARY)
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y - diffY;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			altX = x;
Packit b099d7
			altY = y + diffY;
Packit b099d7
		    }
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (P_ICON_BOX(pCD))
Packit b099d7
	    {
Packit b099d7
		GetClipDimensions(pCD, False);
Packit b099d7
		if (altX < clipX) 
Packit b099d7
		{
Packit b099d7
		    return (NO_ICON_PLACE);
Packit b099d7
		}
Packit b099d7
		if (altY < clipY) 
Packit b099d7
		{
Packit b099d7
		    return (NO_ICON_PLACE);
Packit b099d7
		}
Packit b099d7
		if (((int)altX) > ((int)clipX + 
Packit b099d7
			(int)clipWidth - ((int)ICON_WIDTH(pCD)))) 
Packit b099d7
		{
Packit b099d7
		    return (NO_ICON_PLACE);
Packit b099d7
		}
Packit b099d7
		if (((int)altY) > ((int)clipY + 
Packit b099d7
			(int)clipHeight - ((int)ICON_HEIGHT(pCD))))
Packit b099d7
		{
Packit b099d7
		    return (NO_ICON_PLACE);
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    place = CvtIconPositionToPlace (pIPD, altX, altY);
Packit b099d7
	    if ((pIPD->placeList[place].pCD) == NULL)
Packit b099d7
	    {
Packit b099d7
		return (place);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Couldn't find an unoccupied place in the proximity of the passed-in
Packit b099d7
     * position.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    return (NO_ICON_PLACE);
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION FindIconPlace */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  CvtIconPostionToPlace (pIPD, x, y)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function converts an icon position to an icon place.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pIPD = ptr to icon placement data
Packit b099d7
 *
Packit b099d7
 *  x,y = location to be converted into an icon place
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return = icon place (index)
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
int CvtIconPositionToPlace (IconPlacementData *pIPD, int x, int y)
Packit b099d7
{
Packit b099d7
    int row;
Packit b099d7
    int col;
Packit b099d7
Packit b099d7
Packit b099d7
    if (pIPD->onRootWindow)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Scan through the root window row/column arrays and find the 
Packit b099d7
	 * placement position.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	for (row = 1; row < pIPD->placementRows; row++)
Packit b099d7
	{
Packit b099d7
	    if (y < pIPD->placementRowY[row])
Packit b099d7
	    {
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	row--;
Packit b099d7
Packit b099d7
	for (col = 1; col < pIPD->placementCols; col++)
Packit b099d7
	{
Packit b099d7
	    if (x < pIPD->placementColX[col])
Packit b099d7
	    {
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	col--;
Packit b099d7
Packit b099d7
Packit b099d7
	if (pIPD->iconPlacement &
Packit b099d7
	    (ICON_PLACE_RIGHT_PRIMARY | ICON_PLACE_RIGHT_SECONDARY))
Packit b099d7
	{
Packit b099d7
	    col = pIPD->placementCols - col - 1;
Packit b099d7
	}
Packit b099d7
	if (pIPD->iconPlacement &
Packit b099d7
	    (ICON_PLACE_BOTTOM_PRIMARY | ICON_PLACE_BOTTOM_SECONDARY))
Packit b099d7
	{
Packit b099d7
	    row = pIPD->placementRows - row - 1;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/* 
Packit b099d7
	 * convert icon box coords
Packit b099d7
	 */
Packit b099d7
	col = x / pIPD->iPlaceW;
Packit b099d7
	row = y / pIPD->iPlaceH;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    if (pIPD->iconPlacement &
Packit b099d7
	(ICON_PLACE_LEFT_PRIMARY | ICON_PLACE_RIGHT_PRIMARY))
Packit b099d7
    {
Packit b099d7
	return ((row * pIPD->placementCols) + col);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	return ((col * pIPD->placementRows) + row);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
Packit b099d7
} /* END OF FUNCTION CvtIconPositionToPlace */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  PackRootIcons ()
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function packs the icons on the root window
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  ---------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void PackRootIcons (void)
Packit b099d7
{
Packit b099d7
    int iOld, iNew;
Packit b099d7
    ClientData *pCD;
Packit b099d7
    ClientData *pCD_active;
Packit b099d7
    int hasActiveText = 1;
Packit b099d7
#ifdef WSM
Packit b099d7
    WsClientData *pWsc;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * find context of the activeIconTextWin to get pCD and then 
Packit b099d7
     * if it is the same as this client, hide it.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (XFindContext (DISPLAY, ACTIVE_PSD->activeIconTextWin,
Packit b099d7
			wmGD.windowContextType, (caddr_t *)&pCD_active))
Packit b099d7
    {
Packit b099d7
	hasActiveText = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     *  Traverse the list and pack them together
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (wmGD.iconAutoPlace)
Packit b099d7
    {
Packit b099d7
	for (iOld = iNew = 0; iOld < ACTIVE_WS->IPData.totalPlaces; 
Packit b099d7
	    iOld++, iNew++)
Packit b099d7
	{
Packit b099d7
	    if (ACTIVE_WS->IPData.placeList[iOld].pCD == NULL)
Packit b099d7
	    {
Packit b099d7
		/* advance to next non-null entry */
Packit b099d7
		while (++iOld < ACTIVE_WS->IPData.totalPlaces && 
Packit b099d7
		       !ACTIVE_WS->IPData.placeList[iOld].pCD)
Packit b099d7
		    ;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (iOld < ACTIVE_WS->IPData.totalPlaces && iOld != iNew)
Packit b099d7
	    {
Packit b099d7
		/* move the icon from its old place to the new place */
Packit b099d7
Packit b099d7
		MoveIconInfo (&ACTIVE_WS->IPData, iOld, iNew);
Packit b099d7
Packit b099d7
		pCD = ACTIVE_WS->IPData.placeList[iNew].pCD;
Packit b099d7
#ifdef WSM
Packit b099d7
		pWsc = GetWsClientData (ACTIVE_WS, pCD);
Packit b099d7
		pWsc->iconPlace = iNew;
Packit b099d7
		CvtIconPlaceToPosition (&ACTIVE_WS->IPData, 
Packit b099d7
		    pWsc->iconPlace, &pWsc->iconX, &pWsc->iconY);
Packit b099d7
#else /* WSM */
Packit b099d7
		pCD->iconPlace = iNew;
Packit b099d7
		CvtIconPlaceToPosition (&ACTIVE_WS->IPData, 
Packit b099d7
		    pCD->iconPlace, &pCD->iconX, &pCD->iconY);
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
		if (hasActiveText && (pCD == pCD_active))
Packit b099d7
		{
Packit b099d7
		    /* hide activeIconTextWin first */
Packit b099d7
		    HideActiveIconText ((WmScreenData *)NULL);
Packit b099d7
#ifdef WSM
Packit b099d7
		    XMoveWindow (DISPLAY, pWsc->iconFrameWin, pWsc->iconX, 
Packit b099d7
			     pWsc->iconY);
Packit b099d7
#else /* WSM */
Packit b099d7
		    XMoveWindow (DISPLAY, ICON_FRAME_WIN(pCD), pCD->iconX, 
Packit b099d7
			     pCD->iconY);
Packit b099d7
#endif /* WSM */
Packit b099d7
		    ShowActiveIconText (pCD);
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
#ifdef WSM
Packit b099d7
		    XMoveWindow (DISPLAY, pWsc->iconFrameWin, pWsc->iconX, 
Packit b099d7
			     pWsc->iconY);
Packit b099d7
#else /* WSM */
Packit b099d7
		    XMoveWindow (DISPLAY, ICON_FRAME_WIN(pCD), pCD->iconX, 
Packit b099d7
			     pCD->iconY);
Packit b099d7
#endif /* WSM */
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
} /* END OF FUNCTION PackRootIcons */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  MoveIconInfo (pIPD, p1, p2)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Move icon info from place 1 to place 2 in the placement list.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pIPD	- ptr to icon placement data
Packit b099d7
 *  p1		- placement index 1 (source)
Packit b099d7
 *  p2		- placement index 2 (destination)
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void MoveIconInfo (IconPlacementData *pIPD, int p1, int p2)
Packit b099d7
{
Packit b099d7
#ifdef WSM
Packit b099d7
    WsClientData *pWsc;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
    /* only move if destination is empty */
Packit b099d7
    if (pIPD->placeList[p2].pCD == NULL)
Packit b099d7
    {
Packit b099d7
	pIPD->placeList[p2].pCD = pIPD->placeList[p1].pCD;
Packit b099d7
	pIPD->placeList[p2].theWidget = pIPD->placeList[p1].theWidget;
Packit b099d7
#ifdef WSM
Packit b099d7
Packit b099d7
	pWsc = GetWsClientData (pIPD->placeList[p2].pCD->pSD->pActiveWS,
Packit b099d7
				pIPD->placeList[p2].pCD);
Packit b099d7
	pWsc->iconPlace = p2;
Packit b099d7
#else /* WSM */
Packit b099d7
	pIPD->placeList[p2].pCD->iconPlace = p2;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
	pIPD->placeList[p1].pCD =  NULL;
Packit b099d7
	pIPD->placeList[p1].theWidget = NULL;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
#ifdef WSM
Packit b099d7
/****************************   eof    ***************************/
Packit b099d7
#endif /* WSM */