|
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 */
|