3515 lines
78 KiB
C
3515 lines
78 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/*
|
|
* (c) Copyright 1989, 1990, 1991, 1992, 1993, 1994 OPEN SOFTWARE FOUNDATION, INC.
|
|
* ALL RIGHTS RESERVED
|
|
*/
|
|
/*
|
|
* Motif Release 1.2.4
|
|
*/
|
|
/*
|
|
* (c) Copyright 1987, 1988, 1989, 1990, 1993, 1994 Hewlett-Packard Company
|
|
* (c) Copyright 1993, 1994 International Business Machines Corp.
|
|
* (c) Copyright 1993, 1994 Sun Microsystems, Inc.
|
|
* (c) Copyright 1993, 1994 Novell, Inc.
|
|
*/
|
|
|
|
/*
|
|
* Included Files:
|
|
*/
|
|
|
|
#include "WmGlobal.h"
|
|
#include "WmHelp.h"
|
|
#include <X11/StringDefs.h>
|
|
#include <X11/Intrinsic.h>
|
|
#include <X11/Shell.h>
|
|
#include <X11/Xutil.h>
|
|
#include <X11/Vendor.h>
|
|
|
|
#include <X11/keysymdef.h>
|
|
#include <X11/keysym.h>
|
|
|
|
|
|
#include <Xm/Xm.h>
|
|
#include <Xm/DialogS.h>
|
|
#include <Xm/Frame.h>
|
|
#include <Xm/Label.h>
|
|
#include <Xm/PushB.h>
|
|
#include <Xm/DrawnB.h>
|
|
#include <Xm/ScrolledW.h>
|
|
#include <Xm/BulletinB.h>
|
|
#include <Xm/ToggleB.h>
|
|
|
|
#define MWM_NEED_IIMAGE
|
|
#define MWM_NEED_GREYED75
|
|
#define MWM_NEED_SLANT2
|
|
#include "WmIBitmap.h"
|
|
|
|
#include "WmResNames.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
/*
|
|
* include extern functions
|
|
*/
|
|
|
|
#include "WmIconBox.h"
|
|
#include "WmCDInfo.h"
|
|
#include "WmError.h"
|
|
#include "WmEvent.h"
|
|
#include "WmFunction.h"
|
|
#include "WmIDecor.h"
|
|
#include "WmIPlace.h"
|
|
#include "WmImage.h"
|
|
#include "WmPanelP.h" /* for typedef in WmManage.h */
|
|
#include "WmManage.h"
|
|
#include "WmMenu.h"
|
|
#include "WmResParse.h"
|
|
#include "WmResource.h"
|
|
#include "WmWinInfo.h"
|
|
#include "WmWrkspace.h"
|
|
|
|
#ifndef MAX
|
|
#define MAX(a,b) ((a)>(b)?(a):(b))
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
* Global Variables:
|
|
*/
|
|
|
|
|
|
Pixel select_color;
|
|
Pixmap greyedPixmap;
|
|
|
|
int frameShadowThickness;
|
|
int firstTime = 1;
|
|
Cardinal insertPosition = 0;
|
|
#define DEFAULT_ICON_BOX_TITLE "Icons"
|
|
Const char *szhorizontal = "horizontal";
|
|
Const char *szvertical = "vertical";
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* InitIconBox (pSD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* This function controls creation of icon boxes
|
|
*
|
|
*
|
|
*************************************<->***********************************/
|
|
void InitIconBox (WmScreenData *pSD)
|
|
|
|
{
|
|
int iws;
|
|
/*
|
|
* Start the process of making the icon boxes
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
* Manage a separate icon box in every workspace
|
|
* on this screen.
|
|
*/
|
|
for (iws = 0; iws < pSD->numWorkspaces; iws++)
|
|
{
|
|
AddIconBoxForWorkspace (&pSD->pWS[iws]);
|
|
}
|
|
|
|
if (pSD->fadeNormalIcon)
|
|
{
|
|
MakeFadeIconGC (pSD);
|
|
}
|
|
|
|
|
|
} /* END OF FUNCTION InitIconBox */
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* AddIconBoxForWorkspace (pWS)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* This function adds an iconbox to a workspace
|
|
*
|
|
*
|
|
*************************************<->***********************************/
|
|
void AddIconBoxForWorkspace (WmWorkspaceData *pWS)
|
|
|
|
{
|
|
extern WmWorkspaceData *pIconBoxInitialWS;
|
|
|
|
pIconBoxInitialWS = pWS;
|
|
ManageWindow (pWS->pSD, None, MANAGEW_ICON_BOX);
|
|
|
|
} /* END OF FUNCTION AddIconBoxForWorkspace */
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* MakeIconBox (pWS, pCD);
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
* pCD = a pointer to ClientData
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* Return = (Boolean) True iff successful.
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* If fails, frees the ClientData structure pointed to by pCD.
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
Boolean MakeIconBox (WmWorkspaceData *pWS, ClientData *pCD)
|
|
{
|
|
IconBoxData *pIBD;
|
|
|
|
|
|
/*
|
|
* Make an icon box and return the pCD
|
|
*/
|
|
|
|
if (pCD)
|
|
{
|
|
if (!(pIBD = (IconBoxData *)XtMalloc (sizeof (IconBoxData))))
|
|
{
|
|
/*
|
|
* We need a pointer to icon box data to add to the
|
|
* list of icon boxes linked to pWS->pIconBox. If
|
|
* we can't allocate space we need to free the space
|
|
* allocated for the ClientData structure
|
|
*/
|
|
|
|
Warning (((char *)GETMESSAGE(36, 1, "Insufficient memory to create icon box data")));
|
|
XtFree ((char *)pCD);
|
|
return (FALSE);
|
|
}
|
|
|
|
InitializeIconBoxData (pWS, pIBD);
|
|
InitializeClientData (pCD, pIBD);
|
|
|
|
if (!(pIBD->IPD.placeList =
|
|
(IconInfo *)XtMalloc (pIBD->IPD.totalPlaces * sizeof (IconInfo))))
|
|
{
|
|
Warning (((char *)GETMESSAGE(36, 2, "Insufficient memory to create icon box data")));
|
|
XtFree ((char *)pIBD);
|
|
XtFree ((char *)pCD);
|
|
return (FALSE);
|
|
}
|
|
memset (pIBD->IPD.placeList, 0,
|
|
pIBD->IPD.totalPlaces * sizeof (IconInfo));
|
|
|
|
/*
|
|
* Make the top level shell for this icon box
|
|
*/
|
|
MakeShell (pWS, pIBD);
|
|
|
|
/*
|
|
* Make the scrolled window for this icon box
|
|
*/
|
|
|
|
MakeScrolledWindow (pWS, pIBD);
|
|
|
|
/*
|
|
* Make the row column manager for this icon box
|
|
*/
|
|
MakeBulletinBoard (pWS, pIBD);
|
|
|
|
/*
|
|
* Realize the widget tree and set client data fields
|
|
*/
|
|
|
|
RealizeIconBox (pWS, pIBD, pCD);
|
|
|
|
/*
|
|
* Link the new icon box to list of icon boxes
|
|
*/
|
|
AddNewBox (pWS, pIBD);
|
|
}
|
|
|
|
return (TRUE);
|
|
|
|
} /* END OF FUNCTION MakeIconBox */
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* DestroyIconBox (pWS)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Destroys an icon box
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* Return = none
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* Used when deleting a workspace
|
|
* Should be called AFTER all clients have been removed from the
|
|
* workspace -- there should be no icons in the icon box.
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void DestroyIconBox (WmWorkspaceData *pWS)
|
|
{
|
|
IconBoxData *pIBD;
|
|
|
|
pIBD = pWS->pIconBox;
|
|
|
|
XtDestroyWidget (pIBD->shellWidget);
|
|
|
|
UnManageWindow (pIBD->pCD_iconBox);
|
|
|
|
XtFree ((char *) pIBD);
|
|
|
|
} /* END OF FUNCTION DestroyIconBox */
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* MakeShell (pWS, pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
*
|
|
* pIBD = pointer to IconBoxData
|
|
*
|
|
* XXinput = ...
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* pIBD->shellWidget
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* XXComments ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void MakeShell (WmWorkspaceData *pWS, IconBoxData *pIBD)
|
|
{
|
|
|
|
Arg setArgs[20];
|
|
int i;
|
|
char *pchIBTitle = NULL;
|
|
|
|
/*
|
|
* Create top level application shell for icon box
|
|
*/
|
|
|
|
i=0;
|
|
|
|
XtSetArg (setArgs[i], XmNallowShellResize, (XtArgVal)True); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNborderWidth, (XtArgVal)0); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNkeyboardFocusPolicy, (XtArgVal)XmEXPLICIT); i++;
|
|
|
|
if (pWS->pSD->iconBoxTitle)
|
|
{
|
|
pchIBTitle = WmXmStringToString (pWS->pSD->iconBoxTitle);
|
|
|
|
XtSetArg (setArgs[i], XmNtitle, (XtArgVal)pchIBTitle); i++;
|
|
XtSetArg (setArgs[i], XmNiconName, (XtArgVal)pchIBTitle); i++;
|
|
}
|
|
XtSetArg (setArgs[i], XmNmappedWhenManaged, (XtArgVal)False); i++;
|
|
XtSetArg (setArgs[i], XmNdialogStyle, (XtArgVal)XmDIALOG_MODELESS); i++;
|
|
XtSetArg (setArgs[i], XmNdepth,
|
|
(XtArgVal) DefaultDepth (DISPLAY, pWS->pSD->screen)); i++;
|
|
XtSetArg (setArgs[i], XmNscreen,
|
|
(XtArgVal) ScreenOfDisplay (DISPLAY, pWS->pSD->screen)); i++;
|
|
|
|
pIBD->shellWidget = (Widget) XtCreatePopupShell (WmNclient,
|
|
topLevelShellWidgetClass,
|
|
pWS->workspaceTopLevelW,
|
|
(ArgList)setArgs, i);
|
|
|
|
if (pchIBTitle != NULL) XtFree (pchIBTitle);
|
|
|
|
} /* END OF FUNCTION MakeShell */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* MakeScrolledWindow (pWS, pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
* pIBD = pointer to IconBoxData
|
|
* XXinput = ...
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* Return = pIBD with the pIBD->scrolledWidget set
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* XXComments ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void MakeScrolledWindow (WmWorkspaceData *pWS, IconBoxData *pIBD)
|
|
{
|
|
|
|
Arg setArgs[20];
|
|
int i;
|
|
|
|
/*
|
|
* Create frame widget to give the scrolled window
|
|
* an external bevel
|
|
*/
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNborderWidth, (XtArgVal) 0 ); i++;
|
|
XtSetArg (setArgs[i], XmNmarginWidth, (XtArgVal) 0 ); i++;
|
|
XtSetArg (setArgs[i], XmNmarginHeight, (XtArgVal) 0 ); i++;
|
|
XtSetArg (setArgs[i], XmNshadowType, (XtArgVal) XmSHADOW_OUT); i++;
|
|
XtSetArg (setArgs[i], XmNshadowThickness,
|
|
(XtArgVal) frameShadowThickness); i++;
|
|
pIBD->frameWidget = XtCreateManagedWidget ("IBframe",
|
|
xmFrameWidgetClass,
|
|
pIBD->shellWidget,
|
|
(ArgList)setArgs, i);
|
|
|
|
XtAddCallback (pIBD->frameWidget, XmNhelpCallback,
|
|
WmDtWmTopicHelpCB, WM_DT_ICONBOX_TOPIC);
|
|
|
|
/*
|
|
* Create scrolled window to hold row column manager
|
|
*/
|
|
|
|
i=0;
|
|
|
|
XtSetArg (setArgs[i], XmNscrollingPolicy , (XtArgVal) XmAUTOMATIC ); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNborderWidth , (XtArgVal) 0 ); i++;
|
|
XtSetArg (setArgs[i], XmNspacing , (XtArgVal) IB_MARGIN_WIDTH ); i++;
|
|
/*
|
|
* do we want to get these from a resource or set it here
|
|
* to control the appearance of the iconBox
|
|
*/
|
|
|
|
XtSetArg (setArgs[i], XmNscrolledWindowMarginWidth, (XtArgVal) 3); i++;
|
|
XtSetArg (setArgs[i], XmNscrolledWindowMarginHeight, (XtArgVal) 3); i++;
|
|
XtSetArg (setArgs[i], XmNshadowThickness,
|
|
(XtArgVal) FRAME_EXTERNAL_SHADOW_WIDTH); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNscrollBarDisplayPolicy,(XtArgVal) XmSTATIC ); i++;
|
|
XtSetArg (setArgs[i], XmNvisualPolicy, (XtArgVal) XmVARIABLE ); i++;
|
|
|
|
pIBD->scrolledWidget = XtCreateManagedWidget ("IBsWindow",
|
|
xmScrolledWindowWidgetClass,
|
|
pIBD->frameWidget,
|
|
(ArgList)setArgs, i);
|
|
|
|
XtAddCallback(pIBD->scrolledWidget, XmNtraverseObscuredCallback,
|
|
(XtCallbackProc) IconScrollVisibleCallback, (caddr_t)NULL);
|
|
|
|
XtAddEventHandler(pIBD->scrolledWidget,
|
|
StructureNotifyMask,
|
|
False,
|
|
(XtEventHandler)UpdateIncrements,
|
|
(XtPointer) pIBD);
|
|
|
|
|
|
|
|
} /* END OF FUNCTION MakeScrolledWindow */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* MakeBulletinBoard (pWS, pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
* pIBD = pointer to IconBoxData
|
|
*
|
|
* XXinput = ...
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* Return = pIBD with the pIBD->bBoardWidget
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* XXComments ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void MakeBulletinBoard (WmWorkspaceData *pWS, IconBoxData *pIBD)
|
|
{
|
|
|
|
int i;
|
|
Arg setArgs[20];
|
|
|
|
/*
|
|
* Create bulletin board to hold icons
|
|
*/
|
|
|
|
i=0;
|
|
#ifdef DEBUG_ICON_BOX
|
|
XtSetArg (setArgs[i], XmNborderWidth , 1); i++;
|
|
#else
|
|
XtSetArg (setArgs[i], XmNborderWidth , 0); i++;
|
|
#endif /* DEBUG_ICON_BOX */
|
|
|
|
XtSetArg (setArgs[i], XmNshadowThickness,(XtArgVal) 0); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNspacing , 0); i++;
|
|
XtSetArg (setArgs[i], XmNmarginHeight , 0); i++;
|
|
XtSetArg (setArgs[i], XmNmarginWidth , 0); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNdialogStyle, (XtArgVal) XmDIALOG_WORK_AREA); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNresizePolicy, (XtArgVal) XmRESIZE_NONE); i++;
|
|
XtSetArg (setArgs[i], XmNdefaultPosition , (XtArgVal) False); i++;
|
|
|
|
XtSetArg (setArgs[i], XtNinsertPosition , InsertPosition); i++;
|
|
|
|
pIBD->bBoardWidget = XtCreateManagedWidget ("IBbBoard",
|
|
xmBulletinBoardWidgetClass,
|
|
pIBD->scrolledWidget,
|
|
(ArgList)setArgs, i);
|
|
|
|
} /* END OF FUNCTION MakeBulletinBoard */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* RealizeIconBox (pWS, pIBD, pCD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
*
|
|
* pIBD = pointer to IconBoxData
|
|
*
|
|
* pCD = pointer to ClientData
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
|
|
* Return = pIBD with the pIBD->shellWin set
|
|
* Return = pIBD with the pIBD->scrolledWin set
|
|
* Return = pIBD with the pIBD->bBoardWin set
|
|
|
|
*
|
|
* Return = pCD with appropriate fields set
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* XXComments ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void RealizeIconBox (WmWorkspaceData *pWS, IconBoxData *pIBD, ClientData *pCD)
|
|
{
|
|
|
|
int i;
|
|
Arg getArgs[10];
|
|
Arg setArgs[2];
|
|
Widget clipWidget;
|
|
Pixmap bgPixmap;
|
|
Pixmap defaultImage;
|
|
|
|
|
|
XtRealizeWidget (pIBD->shellWidget);
|
|
|
|
pCD->client = XtWindow (pIBD->shellWidget);
|
|
|
|
/*
|
|
* This will set the scrolling granularity for the icon box
|
|
*/
|
|
|
|
SetGeometry (pWS, pCD, pIBD);
|
|
|
|
/*
|
|
* Point to the iconBox
|
|
*/
|
|
|
|
pIBD->pCD_iconBox = pCD;
|
|
pCD->thisIconBox = pIBD;
|
|
/*
|
|
* get the background color of the bulletin board for
|
|
* greyed icon work
|
|
*/
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNbackground, (XtArgVal) select_color ); i++;
|
|
XtSetValues (pIBD->bBoardWidget, (ArgList) setArgs, i);
|
|
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNbackgroundPixmap, (XtArgVal) &bgPixmap ); i++;
|
|
XtGetValues (pIBD->bBoardWidget, getArgs, i);
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNclipWindow, (XtArgVal) &clipWidget ); i++;
|
|
XtGetValues (pIBD->scrolledWidget, getArgs, i);
|
|
|
|
/*
|
|
* Set the background of the clip window for the scrolled
|
|
* window so the default widget background doesn't flash
|
|
*/
|
|
|
|
i = 0;
|
|
XtSetArg(setArgs[i], XmNbackground, (XtArgVal) select_color); i++;
|
|
XtSetValues (clipWidget, (ArgList) setArgs, i);
|
|
|
|
|
|
/*
|
|
* Save the clipWidget id to use in constraining icon moves in box
|
|
*/
|
|
|
|
pIBD->clipWidget = clipWidget;
|
|
|
|
MakeShrinkWrapIconsGC (pWS->pSD, bgPixmap);
|
|
|
|
|
|
if (pWS->pSD->iconDecoration & ICON_IMAGE_PART)
|
|
{
|
|
/*
|
|
* Make a pixmap to use when iconWindows are unmapped
|
|
*/
|
|
defaultImage = XCreateBitmapFromData (DISPLAY, pWS->pSD->rootWindow,
|
|
(char*)iImage_bits, iImage_width,
|
|
iImage_height);
|
|
|
|
pWS->pSD->defaultPixmap = MakeIconPixmap (pCD,
|
|
defaultImage,
|
|
None, iImage_width,
|
|
iImage_height, 1);
|
|
}
|
|
|
|
|
|
} /* END OF FUNCTION RealizeIconBox */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* AddNewBox (pWS, pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
*
|
|
* pIBD = pointer to IconBoxData
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* Finds the last iconbox on the list starting at pWS->pIconBox and
|
|
* adds the new icon box to the end of the list.
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void AddNewBox (WmWorkspaceData *pWS, IconBoxData *pIBD)
|
|
{
|
|
|
|
IconBoxData *pibd;
|
|
|
|
if (pWS->pIconBox)
|
|
{
|
|
pibd = pWS->pIconBox;
|
|
|
|
while (pibd->pNextIconBox)
|
|
{
|
|
pibd = pibd->pNextIconBox;
|
|
}
|
|
|
|
pibd->pNextIconBox = pIBD;
|
|
}
|
|
else
|
|
{
|
|
pWS->pIconBox = pIBD;
|
|
}
|
|
|
|
|
|
} /* END OF FUNCTION AddNewBox */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* InitializeIconBoxData (pWS, pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to Workspace Data
|
|
*
|
|
* pIBD = pointer to IconBoxData
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* Initializes all pIBD fields to NULL
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void InitializeIconBoxData (WmWorkspaceData *pWS, IconBoxData *pIBD)
|
|
{
|
|
int mask;
|
|
int X;
|
|
int Y;
|
|
unsigned int width;
|
|
unsigned int height;
|
|
int sW, sH;
|
|
|
|
frameShadowThickness = FRAME_INTERNAL_SHADOW_WIDTH;
|
|
|
|
pIBD->numberOfIcons = 0;
|
|
pIBD->currentRow = 0;
|
|
pIBD->currentCol = 0;
|
|
pIBD->lastRow = 0;
|
|
pIBD->lastCol = 0;
|
|
pIBD->IPD.placeList = NULL;
|
|
|
|
pIBD->scrolledWidget = NULL;
|
|
pIBD->bBoardWidget = NULL;
|
|
pIBD->clipWidget = NULL;
|
|
pIBD->wsID = pWS->id;
|
|
|
|
ToLower (pWS->pSD->iconBoxSBDisplayPolicy);
|
|
|
|
if (!((!strcmp(pWS->pSD->iconBoxSBDisplayPolicy , "all")) ||
|
|
(!strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szvertical)) ||
|
|
(!strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szhorizontal))))
|
|
{
|
|
strcpy(pWS->pSD->iconBoxSBDisplayPolicy, "all");
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* this will be set by the iconPlacement resource if
|
|
* iconBoxGeometry width and height are not specified
|
|
*/
|
|
|
|
if (pWS->iconBoxGeometry == NULL) /* not set by user */
|
|
{
|
|
/*
|
|
* Use the iconPlacement resource
|
|
*/
|
|
|
|
if (pWS->pSD->iconPlacement &
|
|
(ICON_PLACE_TOP_PRIMARY | ICON_PLACE_BOTTOM_PRIMARY))
|
|
{
|
|
pIBD->IPD.iconPlacement = ICON_PLACE_TOP_PRIMARY;
|
|
pIBD->IPD.placementCols = 1;
|
|
pIBD->IPD.placementRows = 6;
|
|
}
|
|
else
|
|
{
|
|
pIBD->IPD.iconPlacement = ICON_PLACE_LEFT_PRIMARY;
|
|
pIBD->IPD.placementCols = 6;
|
|
pIBD->IPD.placementRows = 1;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
mask = XParseGeometry(pWS->iconBoxGeometry, &X, &Y,
|
|
&width, &height);
|
|
|
|
if ((mask & WidthValue) && (width > 0))
|
|
{
|
|
pIBD->IPD.placementCols = (int)width;
|
|
}
|
|
else
|
|
{
|
|
pIBD->IPD.placementCols = 6;
|
|
}
|
|
|
|
if ((mask & HeightValue) && (height > 0))
|
|
{
|
|
pIBD->IPD.placementRows = (int)height;
|
|
}
|
|
else
|
|
{
|
|
pIBD->IPD.placementRows = 1;
|
|
}
|
|
|
|
/*
|
|
* Set orientation
|
|
*/
|
|
|
|
if (pIBD->IPD.placementRows <= pIBD->IPD.placementCols)
|
|
{
|
|
pIBD->IPD.iconPlacement = ICON_PLACE_LEFT_PRIMARY;
|
|
}
|
|
else
|
|
{
|
|
pIBD->IPD.iconPlacement = ICON_PLACE_TOP_PRIMARY;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Override orientation if iconBoxSBDisplayPolicy is set to
|
|
* horizontal or vertical
|
|
*/
|
|
|
|
if (!(strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szvertical)))
|
|
{
|
|
pIBD->IPD.iconPlacement = ICON_PLACE_LEFT_PRIMARY;
|
|
}
|
|
else if (!(strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szhorizontal)))
|
|
{
|
|
pIBD->IPD.iconPlacement = ICON_PLACE_TOP_PRIMARY;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* set initial size of placement space to size of screen
|
|
*/
|
|
|
|
sW = DisplayWidth (DISPLAY, pWS->pSD->screen) / pWS->pSD->iconWidth;
|
|
sH = DisplayHeight (DISPLAY, pWS->pSD->screen) / pWS->pSD->iconHeight;
|
|
|
|
pIBD->IPD.totalPlaces = sW * sH;
|
|
|
|
pIBD->IPD.onRootWindow = False;
|
|
|
|
/*
|
|
* The icon box does not live in an icon box in this version
|
|
*/
|
|
|
|
pIBD->pNextIconBox =NULL;
|
|
|
|
|
|
} /* END OF FUNCTION InitializeIconBoxData */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* SetIconBoxInfo (pWS, pCD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pCD
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void SetIconBoxInfo (WmWorkspaceData *pWS, ClientData *pCD)
|
|
{
|
|
pCD->clientClass = WmCIconBox;
|
|
pCD->clientName = pWS->pSD->iconBoxName;
|
|
ProcessClientResources (pCD);
|
|
|
|
} /* END OF FUNCTION SetIconBoxInfo */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* InitializeClientData (pCD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pCD
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* Initializes geometry, etc. fields
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void InitializeClientData (ClientData *pCD, IconBoxData *pIBD)
|
|
{
|
|
pCD->internalBevel = (wmGD.frameStyle == WmSLAB) ? 0 :
|
|
FRAME_INTERNAL_SHADOW_WIDTH;
|
|
|
|
pCD->clientX = 0;
|
|
pCD->clientY = 0;
|
|
|
|
pCD->clientFlags |= ICON_BOX ;
|
|
|
|
pCD->widthInc = pIBD->IPD.iPlaceW = ICON_WIDTH(pCD)
|
|
+ IB_SPACING
|
|
+ (2 * IB_MARGIN_WIDTH);
|
|
|
|
pCD->heightInc = pIBD->IPD.iPlaceH = ICON_HEIGHT(pCD)
|
|
+ IB_SPACING
|
|
+ (2 * IB_MARGIN_HEIGHT);
|
|
|
|
pCD->clientWidth = pIBD->IPD.placementCols * pCD->widthInc;
|
|
pCD->clientHeight = pIBD->IPD.placementRows * pCD->heightInc;
|
|
|
|
if (!(pCD->pSD->iconBoxTitle))
|
|
{
|
|
#ifndef NO_MESSAGE_CATALOG
|
|
pCD->pSD->iconBoxTitle =
|
|
XmStringCreateLocalized(wmNLS.default_icon_box_title);
|
|
#else
|
|
pCD->pSD->iconBoxTitle =
|
|
XmStringCreateLocalized(DEFAULT_ICON_BOX_TITLE);
|
|
#endif
|
|
}
|
|
|
|
pCD->clientTitle = pCD->pSD->iconBoxTitle;
|
|
pCD->iconTitle = pCD->pSD->iconBoxTitle;
|
|
|
|
} /* END OF FUNCTION InitializeClientData */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* MakeShrinkWrapIconsGC (pSD, bgPixmap)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Make an graphic context to shrink the icons in the icon box
|
|
* box that are not in the MINIMIZED_STATE.
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pSD - pointer to screen data
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
* Modifies global data
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void MakeShrinkWrapIconsGC (WmScreenData *pSD, Pixmap bgPixmap)
|
|
{
|
|
|
|
XtGCMask copyMask;
|
|
|
|
|
|
if (!pSD->shrinkWrapGC)
|
|
{
|
|
pSD->shrinkWrapGC = XCreateGC (DISPLAY, pSD->rootWindow, 0,
|
|
(XGCValues *) NULL);
|
|
|
|
copyMask = ~0L;
|
|
|
|
XCopyGC (DISPLAY, pSD->iconAppearance.inactiveGC,
|
|
copyMask, pSD->shrinkWrapGC);
|
|
|
|
if (bgPixmap != XmUNSPECIFIED_PIXMAP)
|
|
{
|
|
XSetTile (DISPLAY, pSD->shrinkWrapGC, bgPixmap);
|
|
XSetFillStyle (DISPLAY, pSD->shrinkWrapGC, FillTiled);
|
|
XSetBackground (DISPLAY, pSD->shrinkWrapGC, select_color);
|
|
}
|
|
else
|
|
{
|
|
XSetForeground (DISPLAY, pSD->shrinkWrapGC, select_color);
|
|
}
|
|
}
|
|
|
|
} /* END OF FUNCTION MakeShrinkWrapIconsGC */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* MakeFadeIconGC (pSD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Make an graphic context for "greying" the icons in the icon
|
|
* box that are not in the MINIMIZED_STATE.
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pSD = pointer to screen data
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
* Modifies global data
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void MakeFadeIconGC (WmScreenData *pSD)
|
|
{
|
|
|
|
XtGCMask copyMask;
|
|
static Pixmap tmpFontClipMask;
|
|
|
|
|
|
pSD->fadeIconGC = XCreateGC (DISPLAY, pSD->rootWindow, 0,
|
|
(XGCValues *) NULL);
|
|
pSD->fadeIconTextGC = XCreateGC (DISPLAY, pSD->rootWindow, 0,
|
|
(XGCValues *) NULL);
|
|
|
|
copyMask = ~0L;
|
|
|
|
XCopyGC (DISPLAY, pSD->iconAppearance.inactiveGC,
|
|
copyMask, pSD->fadeIconGC);
|
|
|
|
XCopyGC (DISPLAY, pSD->iconAppearance.inactiveGC,
|
|
copyMask, pSD->fadeIconTextGC);
|
|
|
|
tmpFontClipMask = XCreateBitmapFromData (DISPLAY, pSD->rootWindow,
|
|
(char*)greyed75_bits, greyed75_width, greyed75_height);
|
|
|
|
greyedPixmap = XCreateBitmapFromData (DISPLAY, pSD->rootWindow,
|
|
(char*)slant2_bits, slant2_width, slant2_height);
|
|
|
|
XSetStipple (DISPLAY, pSD->fadeIconTextGC, tmpFontClipMask);
|
|
XSetFillStyle (DISPLAY, pSD->fadeIconTextGC, FillStippled);
|
|
|
|
XSetStipple (DISPLAY, pSD->fadeIconGC, greyedPixmap);
|
|
XSetFillStyle (DISPLAY, pSD->fadeIconGC, FillStippled);
|
|
XSetForeground (DISPLAY, pSD->fadeIconGC, select_color);
|
|
|
|
} /* END OF FUNCTION MakeFadeIconGC */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* SetGeometry (pWS, pCD, pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD = pointer to IconBoxData
|
|
* pCD = pointer to ClientData
|
|
* XXinput = ...
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* XXComments ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void SetGeometry (WmWorkspaceData *pWS, ClientData *pCD, IconBoxData *pIBD)
|
|
{
|
|
|
|
int i;
|
|
Arg setArgs[10];
|
|
|
|
int mask;
|
|
int X;
|
|
int Y;
|
|
unsigned int width;
|
|
unsigned int height;
|
|
unsigned int boxdim, tmpMin;
|
|
int diff;
|
|
unsigned long decoration;
|
|
|
|
/*
|
|
* Set horizontal and vertical scrolling granularity
|
|
*/
|
|
|
|
SetGranularity (pWS, pCD, pIBD );
|
|
|
|
/*
|
|
* Set the initial width and height of the icon box bulletin board
|
|
*/
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNwidth, (XtArgVal) pCD->clientWidth); i++;
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal) pCD->clientHeight); i++;
|
|
XtSetValues (pIBD->bBoardWidget, (ArgList) setArgs, i);
|
|
|
|
/*
|
|
* Adjust icon box window height for height of
|
|
* horizontal scroll bar etc.
|
|
*/
|
|
|
|
pCD->clientHeight = pCD->clientHeight + pCD->baseHeight;
|
|
pCD->oldMaxHeight = pCD->maxHeight = pCD->clientHeight;
|
|
|
|
/*
|
|
* Adjust iconbox window width for width of
|
|
* vertical scroll bar etc.
|
|
*/
|
|
|
|
pCD->clientWidth = pCD->clientWidth + pCD->baseWidth;
|
|
pCD->oldMaxWidth = pCD->maxWidth = pCD->clientWidth;
|
|
|
|
|
|
/*
|
|
* Check that minWidth is large enough to disallow overlap
|
|
* of title bar gadgets
|
|
*/
|
|
|
|
/* compute for minimum frame size */
|
|
if ((decoration = pCD->decor) & MWM_DECOR_TITLE)
|
|
{
|
|
boxdim = InitTitleBarHeight(pCD); /* macro not valid yet */
|
|
tmpMin = boxdim +
|
|
((decoration & MWM_DECOR_MENU) ? boxdim : 0) +
|
|
((decoration & MWM_DECOR_MINIMIZE) ? boxdim : 0) +
|
|
((decoration & MWM_DECOR_MAXIMIZE) ? boxdim : 0) -
|
|
2*(pCD->matteWidth);
|
|
}
|
|
else {
|
|
tmpMin = 0;
|
|
}
|
|
|
|
/* Make:
|
|
* minWidth >= tmpMin
|
|
* minWidth >= max (baseWidth, widthInc) > 0
|
|
* & an integral number of widthInc from baseWidth.
|
|
*/
|
|
|
|
if (pCD->minWidth < tmpMin)
|
|
{
|
|
if ((diff = ((tmpMin - pCD->baseWidth)%pCD->widthInc)) != 0)
|
|
{
|
|
pCD->minWidth = tmpMin + pCD->widthInc - diff;
|
|
}
|
|
else
|
|
{
|
|
pCD->minWidth = tmpMin;
|
|
}
|
|
}
|
|
|
|
if (pCD->minWidth < pCD->baseWidth)
|
|
{
|
|
pCD->minWidth = pCD->baseWidth;
|
|
}
|
|
|
|
if (pCD->minWidth == 0)
|
|
{
|
|
pCD->minWidth = pCD->widthInc;
|
|
}
|
|
else if ((diff = ((pCD->minWidth - pCD->baseWidth)%pCD->widthInc)) != 0)
|
|
{
|
|
pCD->minWidth += pCD->widthInc - diff;
|
|
}
|
|
|
|
|
|
|
|
if (pCD->clientWidth < pCD->minWidth)
|
|
{
|
|
pCD->clientWidth = pCD->minWidth;
|
|
}
|
|
|
|
pIBD->IPD.placementCols = (int)((pCD->clientWidth - pCD->baseWidth)
|
|
/ pCD->widthInc);
|
|
|
|
|
|
/*
|
|
* Make:
|
|
*
|
|
* maxWidth >= minWidth
|
|
* & an integral number of widthInc from baseWidth.
|
|
*/
|
|
|
|
if (pCD->maxWidth < pCD->minWidth)
|
|
{
|
|
pCD->maxWidth = pCD->minWidth;
|
|
}
|
|
|
|
pCD->maxWidthLimit = pCD->maxWidth;
|
|
|
|
pCD->maxWidth -= ((pCD->maxWidth - pCD->baseWidth)% pCD->widthInc);
|
|
pCD->oldMaxWidth = pCD->maxWidth;
|
|
|
|
pCD->maxHeightLimit = pCD->maxHeight;
|
|
|
|
|
|
/*
|
|
* Set the initial width and height of the icon box bulletin board
|
|
*/
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNwidth, (XtArgVal) pCD->clientWidth
|
|
- pCD->baseWidth ); i++;
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal) pCD->clientHeight
|
|
- pCD->baseHeight ); i++;
|
|
XtSetValues (pIBD->bBoardWidget, (ArgList) setArgs, i);
|
|
|
|
|
|
/*
|
|
* Set the initial width and height of the icon box scrolled Window
|
|
*/
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNwidth, (XtArgVal)
|
|
(pCD->clientWidth - (2 * frameShadowThickness))); i++;
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal)
|
|
(pCD->clientHeight - (2 * frameShadowThickness))); i++;
|
|
|
|
XtSetValues (pIBD->scrolledWidget, (ArgList) setArgs, i);
|
|
|
|
|
|
|
|
/*
|
|
* Call SetFrameInfo with fake X and Y so we can get clientOffset
|
|
*/
|
|
|
|
pCD->xBorderWidth = 0;
|
|
SetFrameInfo (pCD);
|
|
|
|
|
|
/*
|
|
* Set initial placement of icon box
|
|
*/
|
|
|
|
mask = XParseGeometry(pWS->iconBoxGeometry, &X, &Y,
|
|
&width, &height);
|
|
|
|
if (mask & XValue)
|
|
{
|
|
if (mask & XNegative)
|
|
{
|
|
pCD->clientX = X
|
|
+ DisplayWidth(DISPLAY, SCREEN_FOR_CLIENT(pCD))
|
|
- pCD->clientWidth
|
|
- pCD->clientOffset.x;
|
|
}
|
|
else
|
|
{
|
|
pCD->clientX = X + pCD->clientOffset.x;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pCD->clientX = pCD->clientOffset.x;
|
|
}
|
|
|
|
if (mask & YValue)
|
|
{
|
|
if (mask & YNegative)
|
|
{
|
|
pCD->clientY = Y
|
|
+ DisplayHeight(DISPLAY, SCREEN_FOR_CLIENT(pCD))
|
|
- pCD->clientHeight
|
|
- pCD->clientOffset.x ;
|
|
}
|
|
else
|
|
{
|
|
pCD->clientY = Y + pCD->clientOffset.y;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pCD->clientY = pCD->clientOffset.x
|
|
+ DisplayHeight(DISPLAY, SCREEN_FOR_CLIENT(pCD))
|
|
- pCD->clientHeight;
|
|
}
|
|
|
|
|
|
PlaceFrameOnScreen (pCD, &pCD->clientX, &pCD->clientY, pCD->clientWidth,
|
|
pCD->clientHeight);
|
|
pCD->clientX -= (wmGD.positionIsFrame
|
|
? pCD->clientOffset.x
|
|
: 0);
|
|
|
|
pCD->clientY -= (wmGD.positionIsFrame
|
|
? pCD->clientOffset.y
|
|
: 0);
|
|
|
|
|
|
i=0;
|
|
|
|
XtSetArg (setArgs[i], XmNx, (XtArgVal) pCD->clientX); i++;
|
|
XtSetArg (setArgs[i], XmNy, (XtArgVal) pCD->clientY); i++;
|
|
|
|
XtSetValues (pIBD->shellWidget, (ArgList) setArgs, i);
|
|
|
|
pCD->maxX = pCD->clientX;
|
|
pCD->maxY = pCD->clientY;
|
|
|
|
|
|
} /* END OF FUNCTION SetGeometry */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* SetGranularity (pWS, pCD, pIBD )
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD = pointer to IconBoxData
|
|
* pCD = pointer to ClientData
|
|
* XXinput = ...
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* XXComments ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void SetGranularity (WmWorkspaceData *pWS, ClientData *pCD, IconBoxData *pIBD)
|
|
{
|
|
|
|
int i;
|
|
Dimension hScrollBarHeight = 0;
|
|
Dimension hBarHeight = 0;
|
|
Dimension vScrollBarWidth = 0;
|
|
Dimension vBarWidth = 0;
|
|
|
|
Dimension spacing;
|
|
short shadowThickness;
|
|
short marginWidth;
|
|
short marginHeight;
|
|
|
|
short hShighlightThickness;
|
|
short vShighlightThickness;
|
|
|
|
Arg setArgs[10];
|
|
Arg getArgs[10];
|
|
|
|
i=0;
|
|
|
|
|
|
|
|
XtSetArg(getArgs[i], XmNspacing, (XtArgVal) &spacing ); i++;
|
|
XtSetArg(getArgs[i], XmNshadowThickness, (XtArgVal) &shadowThickness); i++;
|
|
XtSetArg(getArgs[i], XmNscrolledWindowMarginWidth,
|
|
(XtArgVal) &marginWidth); i++;
|
|
XtSetArg(getArgs[i], XmNscrolledWindowMarginHeight,
|
|
(XtArgVal) &marginHeight); i++;
|
|
XtSetArg (getArgs[i], XmNverticalScrollBar,
|
|
(XtArgVal) &pIBD->vScrollBar); i++;
|
|
XtSetArg(getArgs[i], XmNhorizontalScrollBar,
|
|
(XtArgVal) &pIBD->hScrollBar); i++;
|
|
XtGetValues (pIBD->scrolledWidget, getArgs, i);
|
|
|
|
|
|
if (strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szvertical))
|
|
{
|
|
|
|
/*
|
|
* Set horizontal scrolling granularity
|
|
*/
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &hBarHeight ); i++;
|
|
XtSetArg (getArgs[i], XmNhighlightThickness,
|
|
(XtArgVal) &hShighlightThickness); i++;
|
|
XtGetValues (pIBD->hScrollBar, getArgs, i);
|
|
|
|
|
|
i=0;
|
|
XtSetArg(setArgs[i], XmNincrement, (XtArgVal) pCD->widthInc); i++;
|
|
XtSetArg (setArgs[i], XmNhighlightThickness ,
|
|
IB_HIGHLIGHT_BORDER); i++;
|
|
XtSetArg(setArgs[i], XmNheight,
|
|
(XtArgVal) (hBarHeight - (2 * hShighlightThickness)) +
|
|
(2 * IB_HIGHLIGHT_BORDER)); i++;
|
|
|
|
XtSetValues (pIBD->hScrollBar, (ArgList) setArgs, i);
|
|
|
|
/*
|
|
* Get hScrollBarHeight and troughColor
|
|
*/
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNtroughColor, (XtArgVal) &select_color ); i++;
|
|
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &hScrollBarHeight ); i++;
|
|
XtGetValues (pIBD->hScrollBar, getArgs, i);
|
|
|
|
}
|
|
|
|
|
|
if (strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szhorizontal))
|
|
{
|
|
|
|
/*
|
|
* Set vertical scrolling granularity
|
|
*/
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &vBarWidth ); i++;
|
|
XtSetArg (getArgs[i], XmNhighlightThickness,
|
|
(XtArgVal) &vShighlightThickness); i++;
|
|
XtGetValues (pIBD->vScrollBar, getArgs, i);
|
|
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNincrement, (XtArgVal) pCD->heightInc); i++;
|
|
XtSetArg (setArgs[i], XmNhighlightThickness ,
|
|
IB_HIGHLIGHT_BORDER); i++;
|
|
XtSetArg(setArgs[i], XmNwidth,
|
|
(XtArgVal) (vBarWidth - (2 * vShighlightThickness)) +
|
|
(2 * IB_HIGHLIGHT_BORDER)); i++;
|
|
|
|
XtSetValues (pIBD->vScrollBar, (ArgList) setArgs, i);
|
|
|
|
/*
|
|
* Get vScrollBarWidth
|
|
*/
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNtroughColor, (XtArgVal) &select_color ); i++;
|
|
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &vScrollBarWidth ); i++;
|
|
XtGetValues (pIBD->vScrollBar, getArgs, i);
|
|
}
|
|
|
|
|
|
|
|
if (!strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szvertical))
|
|
{
|
|
XtUnmanageChild(pIBD->hScrollBar);
|
|
hScrollBarHeight = 0;
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNscrollBarDisplayPolicy,
|
|
(XtArgVal) XmAS_NEEDED ); i++;
|
|
XtSetValues (pIBD->scrolledWidget, (ArgList) setArgs, i);
|
|
|
|
}
|
|
else if (!strcmp(pWS->pSD->iconBoxSBDisplayPolicy , szhorizontal))
|
|
{
|
|
XtUnmanageChild(pIBD->vScrollBar);
|
|
vScrollBarWidth = 0;
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNscrollBarDisplayPolicy,
|
|
(XtArgVal) XmAS_NEEDED ); i++;
|
|
XtSetValues (pIBD->scrolledWidget, (ArgList) setArgs, i);
|
|
}
|
|
|
|
|
|
|
|
|
|
pCD->baseWidth = IB_SPACING
|
|
+ 2 * IB_HIGHLIGHT_BORDER
|
|
#ifdef DEBUG_ICON_BOX
|
|
+ 2
|
|
+ spacing
|
|
#endif /* DEBUG_ICON_BOX */
|
|
+ (int) vScrollBarWidth
|
|
+ 2 * frameShadowThickness
|
|
+ (int) 2 * marginWidth
|
|
+ (marginWidth > 0
|
|
? 2 * (int) shadowThickness
|
|
: shadowThickness);
|
|
|
|
|
|
|
|
pCD->baseHeight = IB_SPACING
|
|
+ 2 * IB_HIGHLIGHT_BORDER
|
|
#ifdef DEBUG_ICON_BOX
|
|
+ 2
|
|
#endif /* DEBUG_ICON_BOX */
|
|
+ spacing
|
|
+ (int) hScrollBarHeight
|
|
+ 2 * frameShadowThickness
|
|
+ (int) 2 * marginHeight
|
|
+ (marginHeight > 0
|
|
? 2 * (int) shadowThickness
|
|
: shadowThickness);
|
|
|
|
pCD->minWidth = pCD->baseWidth + pCD->widthInc;
|
|
pCD->minHeight = pCD->baseHeight + pCD->heightInc;
|
|
|
|
pCD->oldMaxWidth = pCD->maxWidth = pCD->minWidth;
|
|
|
|
pCD->oldMaxHeight = pCD->maxHeight = pCD->minHeight;
|
|
|
|
} /* END OF FUNCTION SetGranularity */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* GetIconBoxMenuItems ()
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
MenuItem *GetIconBoxMenuItems (WmScreenData *pSD)
|
|
{
|
|
|
|
return(ParseMwmMenuStr (pSD,
|
|
(unsigned char *)((char *)GETMESSAGE(36, 3, "\"Pack Icons\" _P Alt Shift<Key>F7 f.pack_icons\n"))));
|
|
|
|
} /* END OF FUNCTION GetIconBoxMenuItems */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* MapIconBoxes ()
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* Maps all iconboxes on the list starting at pWS->pIconBox
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void MapIconBoxes (WmWorkspaceData *pWS)
|
|
{
|
|
|
|
IconBoxData *pibd;
|
|
|
|
if (pWS->pIconBox)
|
|
{
|
|
pibd = pWS->pIconBox;
|
|
|
|
while (pibd)
|
|
{
|
|
XtPopup(pibd->shellWidget, XtGrabNone);
|
|
pibd = pibd->pNextIconBox;
|
|
}
|
|
}
|
|
|
|
|
|
} /* END OF FUNCTION MapIconBoxes */
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* UnmapIconBoxes (pWS)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Unmaps all the iconboxes in the specified workspace
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* Unmaps all iconboxes on the list starting at pWS->pIconBox
|
|
* Does not do anything with icon windows.
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void UnmapIconBoxes (WmWorkspaceData *pWS)
|
|
{
|
|
|
|
IconBoxData *pibd;
|
|
|
|
if (pWS->pIconBox)
|
|
{
|
|
pibd = pWS->pIconBox;
|
|
|
|
while (pibd)
|
|
{
|
|
XUnmapWindow (DISPLAY, pibd->pCD_iconBox->clientFrameWin);
|
|
pibd = pibd->pNextIconBox;
|
|
}
|
|
}
|
|
|
|
} /* END OF FUNCTION UnmapIconBoxes */
|
|
|
|
/******************************<->*************************************
|
|
*
|
|
* IconBoxShowing ()
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Returns True if an icon box tied to a front panel button is
|
|
* showing.
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
* pCW = pointer to control window data (for front panel button )
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
* Return = True if icon box is up, False if it's invisible
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
******************************<->***********************************/
|
|
|
|
|
|
Boolean
|
|
IconBoxShowing (WmWorkspaceData *pWS)
|
|
{
|
|
Boolean rval = False;
|
|
|
|
if (pWS->pIconBox &&
|
|
ClientInWorkspace (pWS, pWS->pIconBox->pCD_iconBox))
|
|
{
|
|
rval = True;
|
|
}
|
|
|
|
return (rval);
|
|
|
|
} /* END OF FUNCTION IconBoxShowing */
|
|
|
|
|
|
|
|
/******************************<->*************************************
|
|
*
|
|
* IconBoxPopUp (pWS, pCW, up)
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Sets the state of the icon box attached to a front panel control.
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pWS = pointer to workspace data
|
|
* pCW = pointer to control window data (for front panel button )
|
|
* up = flag, if True, pop the icon box up; if False, hide it.
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
* None
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
******************************<->***********************************/
|
|
|
|
void
|
|
IconBoxPopUp (WmWorkspaceData *pWS, Boolean up)
|
|
{
|
|
|
|
IconBoxData *pibd;
|
|
|
|
if (pWS->pIconBox)
|
|
{
|
|
pibd = pWS->pIconBox;
|
|
|
|
while (pibd)
|
|
{
|
|
if (up)
|
|
{
|
|
if (ClientInWorkspace(pWS, pibd->pCD_iconBox))
|
|
{
|
|
F_Raise (NULL, pibd->pCD_iconBox, (XEvent *)NULL);
|
|
}
|
|
else
|
|
{
|
|
AddClientToWorkspaces (pibd->pCD_iconBox,
|
|
&pWS->id, 1);
|
|
return;
|
|
}
|
|
}
|
|
else if (!up && ClientInWorkspace (pWS, pibd->pCD_iconBox))
|
|
{
|
|
RemoveClientFromWorkspaces (pibd->pCD_iconBox,
|
|
&pWS->id, 1);
|
|
return;
|
|
}
|
|
pibd = pibd->pNextIconBox;
|
|
}
|
|
|
|
}
|
|
|
|
} /* END OF FUNCTION IconBoxPopUp */
|
|
|
|
|
|
|
|
|
|
/******************************<->*************************************
|
|
*
|
|
* InsertIconIntoBox
|
|
*
|
|
* Inputs
|
|
* ------
|
|
* pCD - pointer to data for client to insert
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
Boolean InsertIconIntoBox (IconBoxData *pIBD, ClientData *pCD)
|
|
{
|
|
|
|
Boolean rval = False;
|
|
Arg setArgs[20];
|
|
int i;
|
|
int iconWidth, iconHeight;
|
|
IconBoxData *tmpPointerToIconBox;
|
|
Widget iconWidget;
|
|
IconInfo *pIconInfo;
|
|
static XmString dummyString = NULL;
|
|
WsClientData *pWsc;
|
|
WmWorkspaceData *pWS = GetWorkspaceData (pCD->pSD, pIBD->wsID);
|
|
|
|
pWsc = GetWsClientData (pWS, pCD);
|
|
|
|
/*
|
|
* If we go to multiple icon boxes, find the box this client
|
|
* wants to live in. For now, we only have one, so point to
|
|
* the first one.
|
|
*/
|
|
|
|
tmpPointerToIconBox = pIBD;
|
|
|
|
if (pCD->client)
|
|
{
|
|
|
|
pWsc->pIconBox = tmpPointerToIconBox;
|
|
|
|
iconWidth = ICON_WIDTH(pCD)
|
|
+ (2 * IB_MARGIN_WIDTH);
|
|
|
|
iconHeight = ICON_HEIGHT(pCD)
|
|
+ (2 * IB_MARGIN_HEIGHT);
|
|
|
|
pIconInfo = InsertIconInfo (pWsc->pIconBox, pCD, (Widget) NULL);
|
|
|
|
if (pIconInfo)
|
|
{
|
|
pWsc->pIconBox->numberOfIcons++;
|
|
|
|
i = 0;
|
|
XtSetArg (setArgs[i], XmNbackground,
|
|
(XtArgVal) ICON_APPEARANCE(pCD).background ); i++;
|
|
XtSetArg (setArgs[i], XmNforeground,
|
|
(XtArgVal) ICON_APPEARANCE(pCD).foreground ); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNx , (XtArgVal) pWsc->iconX); i++;
|
|
XtSetArg (setArgs[i], XmNy , (XtArgVal) pWsc->iconY); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNwidth , (XtArgVal) iconWidth); i++;
|
|
XtSetArg (setArgs[i], XmNheight , (XtArgVal) iconHeight); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNborderWidth , (XtArgVal) 0); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNhighlightThickness ,
|
|
IB_HIGHLIGHT_BORDER); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNmarginHeight , (XtArgVal) 0); i++;
|
|
XtSetArg (setArgs[i], XmNmarginWidth , (XtArgVal) 0); i++;
|
|
/*
|
|
* Use type XmString so we don't get a message from XmLabel
|
|
*/
|
|
XtSetArg (setArgs[i], XmNlabelType, (XtArgVal) XmSTRING); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNrecomputeSize, (XtArgVal) False); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNtraversalOn, (XtArgVal) True); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNpushButtonEnabled, (XtArgVal) False); i++;
|
|
|
|
XtSetArg (setArgs[i], XmNshadowThickness, (XtArgVal) 0); i++;
|
|
|
|
iconWidget = XtCreateManagedWidget("iconInIconBox",
|
|
xmDrawnButtonWidgetClass,
|
|
pWsc->pIconBox->bBoardWidget,
|
|
(ArgList)setArgs, i);
|
|
|
|
if (dummyString == NULL)
|
|
{
|
|
dummyString =
|
|
XmStringCreateLocalized("");
|
|
}
|
|
|
|
i = 0;
|
|
XtSetArg (setArgs[i], XmNlabelString,
|
|
(XtArgVal) dummyString); i++;
|
|
|
|
XtSetValues (iconWidget, setArgs, i);
|
|
|
|
pIconInfo->theWidget = iconWidget;
|
|
|
|
pWsc->iconFrameWin = XtWindow (iconWidget);
|
|
|
|
XtAddCallback (iconWidget, XmNactivateCallback,
|
|
(XtCallbackProc)IconActivateCallback,
|
|
(XtPointer)NULL);
|
|
|
|
XtAddEventHandler(iconWidget,
|
|
SELECT_BUTTON_MOTION_MASK,
|
|
False,
|
|
(XtEventHandler)HandleIconBoxButtonMotion,
|
|
(XtPointer)NULL);
|
|
|
|
XtAddEventHandler(iconWidget,
|
|
DMANIP_BUTTON_MOTION_MASK,
|
|
False,
|
|
(XtEventHandler)HandleIconBoxButtonMotion,
|
|
(XtPointer)NULL);
|
|
|
|
XtAddEventHandler(iconWidget,
|
|
KeyPressMask,
|
|
False,
|
|
(XtEventHandler)HandleIconBoxIconKeyPress,
|
|
(XtPointer)NULL);
|
|
|
|
|
|
|
|
if (ICON_DECORATION(pCD) & ICON_ACTIVE_LABEL_PART)
|
|
{
|
|
XtAddEventHandler(iconWidget,
|
|
FocusChangeMask,
|
|
False,
|
|
(XtEventHandler)ChangeActiveIconboxIconText,
|
|
(XtPointer)NULL);
|
|
|
|
if (pCD->pSD->activeLabelParent != pCD->pSD->rootWindow)
|
|
{
|
|
XRaiseWindow (DISPLAY, pCD->pSD->activeIconTextWin);
|
|
}
|
|
}
|
|
|
|
ResetIconBoxMaxSize(pWsc->pIconBox->pCD_iconBox,
|
|
pWsc->pIconBox->bBoardWidget);
|
|
|
|
ResetArrowButtonIncrements (pWsc->pIconBox->pCD_iconBox);
|
|
|
|
rval = True;
|
|
}
|
|
}
|
|
return(rval);
|
|
|
|
} /* END FUNCTION InsertIconIntoBox() */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* InsertIconInfo (pIBD, pCD, theWidget)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Finds next available spot and inserts the icon
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD - pointer to icon box data
|
|
* pCD - pointer to client data for this client
|
|
* theWidget - widget containing the icon (may be null)
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
IconInfo *InsertIconInfo (IconBoxData *pIBD, ClientData *pCD, Widget theWidget)
|
|
{
|
|
IconInfo *pII;
|
|
int place;
|
|
int amt, i;
|
|
Arg setArgs[3];
|
|
Arg getArgs[4];
|
|
Dimension clipWidth, clipHeight;
|
|
WsClientData *pWsc;
|
|
|
|
place = GetNextIconPlace (&pIBD->IPD);
|
|
if (place == NO_ICON_PLACE)
|
|
{
|
|
if (pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)
|
|
{
|
|
amt = pIBD->IPD.placementCols; /* add a new row */
|
|
}
|
|
else
|
|
{
|
|
amt = pIBD->IPD.placementRows; /* add a new column */
|
|
}
|
|
|
|
if (!ExtendIconList (pIBD, amt))
|
|
{
|
|
Warning (((char *)GETMESSAGE(36, 4, "Insufficient memory to create icon box data")));
|
|
return (NULL);
|
|
}
|
|
|
|
if (pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)
|
|
{
|
|
pIBD->IPD.placementRows++;
|
|
}
|
|
else
|
|
{
|
|
pIBD->IPD.placementCols++;
|
|
}
|
|
place = GetNextIconPlace (&pIBD->IPD);
|
|
}
|
|
|
|
insertPosition = place;
|
|
|
|
/*
|
|
* Update icon info values
|
|
*/
|
|
|
|
pII = &pIBD->IPD.placeList[place];
|
|
pII->theWidget = theWidget;
|
|
|
|
pII->pCD = pCD;
|
|
|
|
pWsc = GetWsClientData (GetWorkspaceData (pCD->pSD, pIBD->wsID), pCD);
|
|
pWsc->iconPlace = place;
|
|
|
|
CvtIconPlaceToPosition (&pIBD->IPD, pWsc->iconPlace,
|
|
&pWsc->iconX, &pWsc->iconY);
|
|
|
|
|
|
/* update next free position */
|
|
|
|
pIBD->currentCol = pWsc->iconX / pIBD->pCD_iconBox->widthInc;
|
|
pIBD->currentRow = pWsc->iconY / pIBD->pCD_iconBox->heightInc;
|
|
|
|
|
|
/*
|
|
* Increase bboard size if necessary
|
|
*/
|
|
i = 0;
|
|
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &clipWidth ); i++;
|
|
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &clipHeight ); i++;
|
|
XtGetValues (pIBD->clipWidget, getArgs, i);
|
|
|
|
i = 0;
|
|
if (pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)
|
|
{
|
|
if (pIBD->currentCol > pIBD->lastCol)
|
|
{
|
|
pIBD->lastCol = pIBD->currentCol;
|
|
}
|
|
|
|
if (pIBD->currentRow > pIBD->lastRow)
|
|
{
|
|
pIBD->lastRow = pIBD->currentRow;
|
|
if (clipHeight <= (Dimension) (pWsc->iconY +
|
|
pIBD->pCD_iconBox->heightInc))
|
|
{
|
|
/*
|
|
* Increase bulletin board height as needed.
|
|
*/
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal)
|
|
pWsc->iconY + pIBD->pCD_iconBox->heightInc); i++;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (pIBD->currentCol > pIBD->lastCol)
|
|
{
|
|
pIBD->lastCol = pIBD->currentCol;
|
|
if (clipWidth <= (Dimension)
|
|
(pWsc->iconX + pIBD->pCD_iconBox->widthInc))
|
|
{
|
|
/*
|
|
* Increase bulletin board width as needed
|
|
*/
|
|
XtSetArg (setArgs[i], XmNwidth,
|
|
(XtArgVal) pWsc->iconX +
|
|
pIBD->pCD_iconBox->widthInc); i++;
|
|
}
|
|
}
|
|
|
|
if (pIBD->currentRow > pIBD->lastRow)
|
|
{
|
|
pIBD->lastRow = pIBD->currentRow;
|
|
}
|
|
}
|
|
|
|
if (i > 0)
|
|
{
|
|
XtSetValues (pIBD->bBoardWidget, setArgs, i);
|
|
}
|
|
|
|
return(pII);
|
|
|
|
|
|
|
|
} /* END OF FUNCTION InsertIconInfo */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* DeleteIconFromBox
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void DeleteIconFromBox (IconBoxData *pIBD, ClientData *pCD)
|
|
{
|
|
Widget theChild;
|
|
ClientData *pCD_tmp;
|
|
Arg args[4];
|
|
Dimension clipWidth, clipHeight;
|
|
Dimension oldWidth, oldHeight;
|
|
int newWidth, newHeight;
|
|
int i, newCols, newRows;
|
|
WmWorkspaceData *pWS = GetWorkspaceData (pCD->pSD, pIBD->wsID);
|
|
WsClientData *pWsc;
|
|
|
|
pWsc = GetWsClientData (pWS, pCD);
|
|
|
|
i = 0;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) &oldWidth ); i++;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) &oldHeight ); i++;
|
|
XtGetValues (pIBD->bBoardWidget, args, i);
|
|
|
|
i = 0;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) &clipWidth); i++;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) &clipHeight ); i++;
|
|
XtGetValues (pIBD->clipWidget, args, i);
|
|
|
|
clipHeight /= (Dimension) pIBD->pCD_iconBox->heightInc;
|
|
clipWidth /= (Dimension) pIBD->pCD_iconBox->widthInc;
|
|
|
|
/*
|
|
* find context of the activeIconTextWin to get pCD and then
|
|
* if it is the same as this client, hide it.
|
|
*/
|
|
|
|
if (!(XFindContext (DISPLAY, pCD->pSD->activeIconTextWin,
|
|
wmGD.windowContextType, (caddr_t *)&pCD_tmp)))
|
|
{
|
|
if (pCD == pCD_tmp)
|
|
{
|
|
/* hide activeIconTextWin */
|
|
HideActiveIconText ((WmScreenData *)NULL);
|
|
}
|
|
}
|
|
|
|
DeleteIconInfo (pWsc->pIconBox, pCD);
|
|
|
|
pWsc->pIconBox->numberOfIcons--;
|
|
|
|
theChild = XtWindowToWidget (DISPLAY, pWsc->iconFrameWin);
|
|
|
|
pWsc->pIconBox = NULL;
|
|
pWsc->iconPlace = NO_ICON_PLACE;
|
|
XtUnmanageChild (theChild);
|
|
|
|
XtDestroyWidget (theChild);
|
|
|
|
/* update last row and col */
|
|
|
|
SetNewBounds (pIBD);
|
|
|
|
/* resize Bulletin board (so scroll bars show correctly */
|
|
i = 0;
|
|
|
|
if (clipWidth <= (Dimension) (pIBD->lastCol + 1))
|
|
{
|
|
newWidth = (pIBD->lastCol + 1) * pIBD->pCD_iconBox->widthInc;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) newWidth); i++;
|
|
newCols = newWidth / pIBD->pCD_iconBox->widthInc;
|
|
}
|
|
else
|
|
{
|
|
newWidth = clipWidth * pIBD->pCD_iconBox->widthInc;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) newWidth); i++;
|
|
newCols = newWidth / pIBD->pCD_iconBox->widthInc;
|
|
}
|
|
|
|
if (clipHeight <= (Dimension) (pIBD->lastRow + 1))
|
|
{
|
|
/* set height of bboard */
|
|
newHeight = (pIBD->lastRow + 1) * pIBD->pCD_iconBox->heightInc;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
newRows = newHeight / pIBD->pCD_iconBox->heightInc;
|
|
}
|
|
else
|
|
{
|
|
newHeight = clipHeight * pIBD->pCD_iconBox->heightInc;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
newRows = newHeight / pIBD->pCD_iconBox->heightInc;
|
|
}
|
|
|
|
if (i > 0 && ExpandVirtualSpace(pIBD, newWidth, newHeight))
|
|
{
|
|
XtSetValues (pIBD->bBoardWidget, args, i);
|
|
RealignIconList (pIBD, newCols, newRows);
|
|
pIBD->IPD.placementCols = newCols;
|
|
pIBD->IPD.placementRows = newRows;
|
|
}
|
|
|
|
|
|
/* reset max size for icon box */
|
|
ResetIconBoxMaxSize(pIBD->pCD_iconBox, pIBD->bBoardWidget);
|
|
|
|
ResetArrowButtonIncrements (pIBD->pCD_iconBox);
|
|
|
|
} /* END FUNCTION DeleteIconFromBox */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* DeleteIconInfo (pIBD, pCD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Deletes an icon info record from the icon box list based on the
|
|
* client data pointer.
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD - pointer to icon box data
|
|
* pCD - pointer to client data
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* o The deleted item is freed
|
|
* o Is pCD the correct key???? !!!
|
|
*
|
|
*************************************<->***********************************/
|
|
void DeleteIconInfo (IconBoxData *pIBD, ClientData *pCD)
|
|
{
|
|
int ix, count;
|
|
IconInfo *pII;
|
|
|
|
/* find first matching entry in list */
|
|
|
|
pII = &pIBD->IPD.placeList[0];
|
|
count = pIBD->IPD.totalPlaces;
|
|
|
|
for (ix = 0; ix < count && pII->pCD != pCD; ix++, pII++)
|
|
{
|
|
}
|
|
|
|
if (ix < count)
|
|
{
|
|
/* found it, zero the entry out */
|
|
pII->theWidget = NULL;
|
|
pII->pCD = NULL;
|
|
}
|
|
|
|
|
|
} /* END FUNCTION DeleteIconInfo */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* ResetIconBoxMaxSize(pCD, bBoardWidget)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void ResetIconBoxMaxSize (ClientData *pCD, Widget bBoardWidget)
|
|
{
|
|
int i;
|
|
Arg getArgs[3];
|
|
Dimension newWidth;
|
|
Dimension newHeight;
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &newWidth ); i++;
|
|
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &newHeight ); i++;
|
|
XtGetValues (bBoardWidget, getArgs, i);
|
|
|
|
pCD->oldMaxWidth = pCD->maxWidth = newWidth + pCD->baseWidth;
|
|
|
|
pCD->oldMaxHeight = pCD->maxHeight = newHeight + pCD->baseHeight;
|
|
|
|
pCD->maxX = pCD->clientX;
|
|
pCD->maxY = pCD->clientY;
|
|
PlaceFrameOnScreen (pCD, &pCD->maxX, &pCD->maxY,
|
|
pCD->maxWidth, pCD->maxHeight);
|
|
|
|
} /* END OF FUNCTION ResetIconBoxMaxSize */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* CheckIconBoxSize(pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
Boolean CheckIconBoxSize (IconBoxData *pIBD)
|
|
{
|
|
int i;
|
|
Arg getArgs[3];
|
|
Arg setArgs[3];
|
|
Dimension oldWidth;
|
|
Dimension oldHeight;
|
|
Dimension newWidth;
|
|
Dimension newHeight;
|
|
int oldCol, oldRow;
|
|
Boolean rval = True;
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &oldWidth ); i++;
|
|
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &oldHeight ); i++;
|
|
XtGetValues (pIBD->bBoardWidget, getArgs, i);
|
|
|
|
newWidth = oldWidth;
|
|
newHeight = oldHeight;
|
|
oldCol = oldWidth / (Dimension) pIBD->pCD_iconBox->widthInc;
|
|
oldRow = oldHeight / (Dimension) pIBD->pCD_iconBox->heightInc;
|
|
|
|
/*
|
|
* Increase bboard size if necessary
|
|
*/
|
|
|
|
i = 0;
|
|
if (pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)
|
|
{
|
|
if (oldRow < pIBD->lastRow + 1)
|
|
{
|
|
/*
|
|
* increase bulletin board height as needed
|
|
*/
|
|
newHeight = (pIBD->lastRow * pIBD->pCD_iconBox->heightInc)
|
|
+ pIBD->pCD_iconBox->heightInc;
|
|
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal) newHeight); i++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (oldCol < pIBD->lastCol + 1)
|
|
{
|
|
/*
|
|
* increase bulletin board width as needed
|
|
*/
|
|
newWidth = (pIBD->lastCol * pIBD->pCD_iconBox->widthInc)
|
|
+ pIBD->pCD_iconBox->widthInc;
|
|
|
|
XtSetArg (setArgs[i], XmNwidth, newWidth); i++;
|
|
}
|
|
}
|
|
|
|
if (i > 0)
|
|
{
|
|
if (! ExpandVirtualSpace(pIBD, newWidth, newHeight))
|
|
{
|
|
/*
|
|
* The user has resized the iconbox larger than
|
|
* memory will allow. Don't honor the resize request
|
|
*/
|
|
rval = False;
|
|
return(rval);
|
|
}
|
|
XtSetValues (pIBD->bBoardWidget, setArgs, i);
|
|
}
|
|
|
|
ResetIconBoxMaxSize(pIBD->pCD_iconBox, pIBD->bBoardWidget);
|
|
|
|
|
|
return(rval);
|
|
|
|
} /* END OF FUNCTION CheckIconBoxSize */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* CheckIconBoxResize(pCD, changedValues)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void CheckIconBoxResize (ClientData *pCD, unsigned int changedValues, int newWidth, int newHeight)
|
|
{
|
|
|
|
Boolean packVert = False;
|
|
Boolean packHorz = False;
|
|
WmScreenData *pSD;
|
|
|
|
IconBoxData *pIBD;
|
|
IconPlacementData *pIPD;
|
|
int i, newCols, newRows;
|
|
Arg getArgs[3];
|
|
Arg setArgs[3];
|
|
Dimension oldWidth;
|
|
Dimension oldHeight;
|
|
|
|
pIPD = &pCD->thisIconBox->IPD;
|
|
pIBD = pCD->thisIconBox;
|
|
|
|
pSD = &(wmGD.Screens[SCREEN_FOR_CLIENT(pCD)]);
|
|
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &oldWidth ); i++;
|
|
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &oldHeight ); i++;
|
|
XtGetValues (pIBD->bBoardWidget, getArgs, i);
|
|
|
|
newCols = pIPD->placementCols;
|
|
newRows = pIPD->placementRows;
|
|
newWidth = newWidth - pCD->baseWidth;
|
|
newHeight = newHeight - pCD->baseHeight;
|
|
|
|
i = 0;
|
|
|
|
if (changedValues & CWWidth)
|
|
{
|
|
/*
|
|
* There was a change in Width, see if we need to change the
|
|
* bulletin board
|
|
*/
|
|
if (newWidth > (int) oldWidth)
|
|
{
|
|
newCols = newWidth / pCD->widthInc;
|
|
XtSetArg (setArgs[i], XmNwidth, (XtArgVal) newWidth ); i++;
|
|
}
|
|
|
|
if (newWidth < (int) oldWidth)
|
|
{
|
|
if ((!strcmp(pSD->iconBoxSBDisplayPolicy, szvertical)) &&
|
|
(newWidth / pCD->widthInc < pIBD->lastCol + 1))
|
|
{
|
|
XtSetArg (setArgs[i], XmNwidth, (XtArgVal) newWidth ); i++;
|
|
newCols = newWidth / pCD->widthInc;
|
|
packVert = True;
|
|
}
|
|
else if (newWidth / pCD->widthInc < pIBD->lastCol + 1)
|
|
{
|
|
newWidth = (pIBD->lastCol +1) * pCD->widthInc;
|
|
XtSetArg (setArgs[i], XmNwidth, (XtArgVal) newWidth ); i++;
|
|
}
|
|
else
|
|
{
|
|
newCols = newWidth / pCD->widthInc;
|
|
XtSetArg (setArgs[i], XmNwidth, (XtArgVal) newWidth ); i++;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
newWidth = oldWidth;
|
|
}
|
|
|
|
if (changedValues & CWHeight)
|
|
{
|
|
/*
|
|
* There was a change in Height, see if we need to change the
|
|
* bulletin board
|
|
*/
|
|
if (newHeight > (int) oldHeight)
|
|
{
|
|
newRows = newHeight / pCD->heightInc;
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
}
|
|
|
|
if (newHeight < (int) oldHeight)
|
|
{
|
|
if ((!strcmp(pSD->iconBoxSBDisplayPolicy, szhorizontal)) &&
|
|
(newHeight / pCD->heightInc < pIBD->lastRow + 1))
|
|
{
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
newRows = newHeight / pCD->heightInc;
|
|
packHorz = True;
|
|
}
|
|
else if (newHeight / pCD->heightInc < pIBD->lastRow + 1)
|
|
{
|
|
newHeight = (pIBD->lastRow + 1) * pCD->heightInc;
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
}
|
|
else
|
|
{
|
|
newRows = newHeight / pCD->heightInc;
|
|
XtSetArg (setArgs[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
newHeight = oldHeight;
|
|
}
|
|
|
|
if ( i >0 && ExpandVirtualSpace(pIBD, newWidth, newHeight))
|
|
{
|
|
XtSetValues (pIBD->bBoardWidget, setArgs, i);
|
|
}
|
|
|
|
RealignIconList (pIBD, newCols, newRows);
|
|
|
|
pIPD->placementCols = newCols;
|
|
pIPD->placementRows = newRows;
|
|
|
|
ResetIconBoxMaxSize(pCD, pIBD->bBoardWidget);
|
|
|
|
/*
|
|
* Pack the icon box if there are icons that can no longer
|
|
* be scrolled to due to iconBoxSBDisplayPolicy.
|
|
*/
|
|
if (packVert)
|
|
{
|
|
PackIconBox (pIBD, packVert, False , newWidth, 0);
|
|
}
|
|
else if (packHorz)
|
|
{
|
|
PackIconBox (pIBD, False, packHorz , 0, newHeight);
|
|
}
|
|
|
|
|
|
} /* END OF FUNCTION CheckIconBoxResize */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* ExpandVirtualSpace (pIBD, newWidth, newHeight)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Add virtural space (really the icon list )
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD - ptr to icon box data
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
* Return - True if successful, False otherwise
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
Boolean ExpandVirtualSpace (IconBoxData *pIBD, int newWidth, int newHeight)
|
|
{
|
|
Boolean rval = True;
|
|
int newSize;
|
|
int increment;
|
|
|
|
newSize = (newWidth / pIBD->pCD_iconBox->widthInc) *
|
|
(newHeight / pIBD->pCD_iconBox->heightInc);
|
|
|
|
if (newSize > pIBD->IPD.totalPlaces )
|
|
{
|
|
increment = newSize - pIBD->IPD.totalPlaces;
|
|
rval = ExtendIconList (pIBD, increment);
|
|
}
|
|
|
|
return (rval);
|
|
|
|
} /* END OF FUNCTION ExpandVirtualSpace */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* ExtendIconList (pIBD, incr);
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Add space to the icon list
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD - ptr to icon box data
|
|
* incr - number of cells to add
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
* Return - True if successful, False otherwise
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
Boolean ExtendIconList (IconBoxData *pIBD, int incr)
|
|
{
|
|
Boolean rval;
|
|
int newSize;
|
|
IconInfo *pTmp;
|
|
|
|
newSize = pIBD->IPD.totalPlaces + incr;
|
|
|
|
if ((pTmp = (IconInfo *) XtMalloc (newSize*sizeof(IconInfo))) != NULL)
|
|
{
|
|
/* copy data */
|
|
memcpy (pTmp, pIBD->IPD.placeList,
|
|
pIBD->IPD.totalPlaces*sizeof(IconInfo));
|
|
memset (&pTmp[pIBD->IPD.totalPlaces], 0, incr*sizeof(IconInfo));
|
|
|
|
/* out with the old, in with the new */
|
|
XtFree ((char *)pIBD->IPD.placeList);
|
|
pIBD->IPD.placeList = pTmp;
|
|
pIBD->IPD.totalPlaces = newSize;
|
|
rval = True;
|
|
}
|
|
else
|
|
{
|
|
rval = False;
|
|
}
|
|
|
|
return (rval);
|
|
} /* END OF FUNCTION ExtendIconList */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* PackIconBox(pIBD, packVert, packHorz, passedInWidth, passedInHeight)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Packs the icons in the icon box
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD - pointer to icon box data
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*************************************<->***********************************/
|
|
void PackIconBox (IconBoxData *pIBD, Boolean packVert, Boolean packHorz, int passedInWidth, int passedInHeight)
|
|
{
|
|
IconInfo *pII_2, *pII_1;
|
|
int ix1, ix2;
|
|
int count;
|
|
int newX, newY;
|
|
ClientData *pCD_tmp = NULL, *pMyCD;
|
|
int hasActiveText = 1;
|
|
Arg args[4];
|
|
Dimension majorDimension, minorDimension;
|
|
Dimension oldWidth, oldHeight;
|
|
int newWidth, newHeight;
|
|
int i;
|
|
Boolean rippling = False;
|
|
WsClientData *pWsc;
|
|
WmWorkspaceData *pWS;
|
|
|
|
i = 0;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) &oldWidth ); i++;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) &oldHeight ); i++;
|
|
XtGetValues (pIBD->bBoardWidget, args, i);
|
|
|
|
/*
|
|
* packing to visual space, first update IconBoxData
|
|
*/
|
|
|
|
i = 0;
|
|
|
|
if (pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)
|
|
{
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) &majorDimension ); i++;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) &minorDimension ); i++;
|
|
XtGetValues (pIBD->clipWidget, args, i);
|
|
if (packVert)
|
|
{
|
|
majorDimension = passedInWidth;
|
|
}
|
|
|
|
minorDimension /= (Dimension) pIBD->pCD_iconBox->heightInc;
|
|
majorDimension /= (Dimension) pIBD->pCD_iconBox->widthInc;
|
|
if (majorDimension != pIBD->IPD.placementCols)
|
|
{
|
|
pIBD->IPD.placementCols = majorDimension;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) &majorDimension ); i++;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) &minorDimension ); i++;
|
|
XtGetValues (pIBD->clipWidget, args, i);
|
|
if (packHorz)
|
|
{
|
|
majorDimension = passedInHeight;
|
|
}
|
|
|
|
minorDimension /= (Dimension) pIBD->pCD_iconBox->widthInc;
|
|
majorDimension /= (Dimension) pIBD->pCD_iconBox->heightInc;
|
|
if (majorDimension != pIBD->IPD.placementRows)
|
|
{
|
|
pIBD->IPD.placementRows = majorDimension;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* find context of the activeIconTextWin to get pCD and then
|
|
* if it is the same as this client, hide it.
|
|
*/
|
|
|
|
pMyCD = pIBD->pCD_iconBox;
|
|
if (ICON_DECORATION(pMyCD) & ICON_ACTIVE_LABEL_PART)
|
|
{
|
|
if (XFindContext (DISPLAY, pMyCD->pSD->activeIconTextWin,
|
|
wmGD.windowContextType, (caddr_t *)&pCD_tmp))
|
|
{
|
|
hasActiveText = 0;
|
|
}
|
|
}
|
|
|
|
pII_2 = pII_1 = pIBD->IPD.placeList;
|
|
ix1 = ix2 = 0;
|
|
count = pIBD->IPD.totalPlaces;
|
|
|
|
while (ix1 < count)
|
|
{
|
|
if (!rippling && (pII_2->pCD != NULL))
|
|
{
|
|
/*
|
|
* We need to start rippling the icons into new positions if
|
|
* their (x,y) position changed
|
|
*/
|
|
pWS = GetWorkspaceData (pII_2->pCD->pSD, pIBD->wsID);
|
|
pWsc = GetWsClientData (pWS, pII_2->pCD);
|
|
CvtIconPlaceToPosition (&pIBD->IPD, pWsc->iconPlace,
|
|
&newX, &newY);
|
|
|
|
rippling = ((newX != pWsc->iconX) ||
|
|
(newY != pWsc->iconY));
|
|
}
|
|
|
|
if ((pII_2->pCD == NULL) || rippling)
|
|
{
|
|
/* find next one to move */
|
|
while ((ix1 < count) && (pII_1->pCD == NULL))
|
|
{
|
|
ix1++;
|
|
pII_1++;
|
|
}
|
|
|
|
if ((ix1 < count) && (pII_1->pCD != NULL))
|
|
{
|
|
if (ix1 != ix2)
|
|
{
|
|
MoveIconInfo (&pIBD->IPD, ix1, ix2);
|
|
}
|
|
|
|
CvtIconPlaceToPosition (&pIBD->IPD, ix2, &newX, &newY);
|
|
|
|
pWS = GetWorkspaceData (pII_2->pCD->pSD, pIBD->wsID);
|
|
pWsc = GetWsClientData (pWS, pII_2->pCD);
|
|
pWsc->iconX = newX;
|
|
pWsc->iconY = newY;
|
|
|
|
if (hasActiveText && (pII_2->pCD == pCD_tmp))
|
|
{
|
|
/* hide activeIconTextWin first */
|
|
HideActiveIconText ((WmScreenData *)NULL);
|
|
XtMoveWidget (pII_2->theWidget, newX, newY);
|
|
ShowActiveIconText (pII_2->pCD);
|
|
}
|
|
else
|
|
{
|
|
XtMoveWidget (pII_2->theWidget, newX, newY);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ix1 < count)
|
|
{
|
|
ix2++;
|
|
pII_2++;
|
|
}
|
|
|
|
ix1++;
|
|
pII_1++;
|
|
}
|
|
|
|
/* update last row and col */
|
|
|
|
SetNewBounds (pIBD);
|
|
|
|
/* resize Bulletin board (so scroll bars show correctly */
|
|
i = 0;
|
|
if (pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)
|
|
{
|
|
if (majorDimension <= (Dimension) (pIBD->lastCol + 1))
|
|
{
|
|
newWidth = (pIBD->lastCol + 1) * pIBD->pCD_iconBox->widthInc;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) newWidth); i++;
|
|
}
|
|
else
|
|
{
|
|
newWidth = oldWidth;
|
|
}
|
|
|
|
if (minorDimension <= (Dimension) (pIBD->lastRow + 1))
|
|
{
|
|
/* set height of bboard */
|
|
newHeight = (pIBD->lastRow + 1) * pIBD->pCD_iconBox->heightInc;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
}
|
|
else
|
|
{
|
|
newHeight = minorDimension * pIBD->pCD_iconBox->heightInc;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (majorDimension <= (Dimension) (pIBD->lastRow + 1))
|
|
{
|
|
newHeight = (pIBD->lastRow + 1) * pIBD->pCD_iconBox->heightInc;
|
|
XtSetArg (args[i], XmNheight, (XtArgVal) newHeight ); i++;
|
|
}
|
|
else
|
|
{
|
|
newHeight = oldHeight;
|
|
}
|
|
|
|
if (minorDimension <= (Dimension) (pIBD->lastCol + 1))
|
|
{
|
|
/* set width of bboard */
|
|
newWidth = (pIBD->lastCol + 1) * pIBD->pCD_iconBox->widthInc;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) newWidth); i++;
|
|
}
|
|
else
|
|
{
|
|
newWidth = minorDimension * pIBD->pCD_iconBox->widthInc;
|
|
XtSetArg (args[i], XmNwidth, (XtArgVal) newWidth); i++;
|
|
}
|
|
}
|
|
|
|
if (i > 0 && ExpandVirtualSpace(pIBD, newWidth, newHeight))
|
|
{
|
|
XtSetValues (pIBD->bBoardWidget, args, i);
|
|
}
|
|
|
|
|
|
/* reset max size for icon box */
|
|
|
|
ResetIconBoxMaxSize (pIBD->pCD_iconBox, pIBD->bBoardWidget);
|
|
|
|
ResetArrowButtonIncrements (pIBD->pCD_iconBox);
|
|
|
|
} /* END FUNCTION PackIconBox */
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* RealignIconList (pIBD, newRows, newCols)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Realigns the icon list according to the new virtual space dimensions
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pIBD - ptr to icon box data
|
|
* newRows - new number of rows
|
|
* newCols - new number of columns
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* o The placement data structure contains the old values.
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void RealignIconList (IconBoxData *pIBD, int newCols, int newRows)
|
|
{
|
|
int c1, c2, ix1, ix2;
|
|
int oldRows, oldCols;
|
|
IconPlacementData ipdNew;
|
|
IconInfo *pII;
|
|
|
|
/*
|
|
* create new icon placement data for ease of calling conversion
|
|
* routines.
|
|
*/
|
|
ipdNew.onRootWindow = pIBD->IPD.onRootWindow;
|
|
ipdNew.iconPlacement = pIBD->IPD.iconPlacement;
|
|
ipdNew.placementRows = newRows;
|
|
ipdNew.placementCols = newCols;
|
|
ipdNew.iPlaceW = pIBD->IPD.iPlaceW;
|
|
ipdNew.iPlaceH = pIBD->IPD.iPlaceH;
|
|
ipdNew.placeList = pIBD->IPD.placeList;
|
|
ipdNew.totalPlaces = pIBD->IPD.totalPlaces;
|
|
|
|
oldRows = pIBD->IPD.placementRows;
|
|
oldCols = pIBD->IPD.placementCols;
|
|
|
|
/*
|
|
* Use the new organization and placement discipline to
|
|
* determine how to move the icon info data around.
|
|
*/
|
|
if (((oldRows < newRows) &&
|
|
(pIBD->IPD.iconPlacement & ICON_PLACE_TOP_PRIMARY)) ||
|
|
((oldCols < newCols) &&
|
|
(pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)))
|
|
{
|
|
/*
|
|
* work backwards
|
|
*/
|
|
for (ix1 = pIBD->IPD.totalPlaces - 1,
|
|
pII = &pIBD->IPD.placeList[ix1]; ix1 >= 0; ix1--, pII--)
|
|
{
|
|
if (pII->pCD != NULL)
|
|
{
|
|
CvtIconPlaceToPosition (&pIBD->IPD, ix1, &c1, &c2);
|
|
ix2 = CvtIconPositionToPlace (&ipdNew, c1, c2);
|
|
if (ix1 != ix2)
|
|
{
|
|
MoveIconInfo (&pIBD->IPD, ix1, ix2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if (((oldRows > newRows) &&
|
|
(pIBD->IPD.iconPlacement & ICON_PLACE_TOP_PRIMARY)) ||
|
|
((oldCols > newCols) &&
|
|
(pIBD->IPD.iconPlacement & ICON_PLACE_LEFT_PRIMARY)))
|
|
{
|
|
/*
|
|
* work forwards
|
|
*/
|
|
for (ix1 = 0, pII = &pIBD->IPD.placeList[ix1];
|
|
ix1 < pIBD->IPD.totalPlaces; ix1++, pII++)
|
|
{
|
|
if (pII->pCD != NULL)
|
|
{
|
|
CvtIconPlaceToPosition (&pIBD->IPD, ix1, &c1, &c2);
|
|
ix2 = CvtIconPositionToPlace (&ipdNew, c1, c2);
|
|
if (ix1 != ix2)
|
|
{
|
|
MoveIconInfo (&pIBD->IPD, ix1, ix2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* update info in placement structure to reflect new reality
|
|
*/
|
|
pIBD->IPD.placementRows = newRows;
|
|
pIBD->IPD.placementCols = newCols;
|
|
|
|
} /* END OF FUNCTION RealignIconList */
|
|
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* SetNewBounds (pIBD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void SetNewBounds (IconBoxData *pIBD)
|
|
{
|
|
|
|
int i;
|
|
int X = 0;
|
|
int Y = 0;
|
|
CompositeWidget cw;
|
|
WidgetList children;
|
|
|
|
cw = (CompositeWidget) pIBD->bBoardWidget;
|
|
children = cw->composite.children;
|
|
|
|
for (i = 0; i < cw->composite.num_children; i++)
|
|
{
|
|
if (children[i]->core.x > X)
|
|
{
|
|
X = children[i]->core.x;
|
|
}
|
|
if (children[i]->core.y > Y)
|
|
{
|
|
Y = children[i]->core.y;
|
|
}
|
|
}
|
|
|
|
pIBD->lastCol = X / pIBD->pCD_iconBox->widthInc;
|
|
pIBD->lastRow = Y / pIBD->pCD_iconBox->heightInc;
|
|
|
|
} /* END OF FUNCTION SetNewBounds */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* InsertPosition (w)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* This procedure is passed to the bulletin board at create time
|
|
* to be used when a child is inserted into the bulletin board
|
|
*
|
|
*
|
|
*************************************<->***********************************/
|
|
Cardinal InsertPosition (Widget w)
|
|
{
|
|
return (insertPosition);
|
|
|
|
} /* END OF FUNCTION InsertPosition */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* ShowClientIconState ();
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void ShowClientIconState (ClientData *pCD, int newState)
|
|
{
|
|
|
|
/*
|
|
* Changing the appearance of an icon window in the box to
|
|
* reflect the client's state
|
|
*/
|
|
|
|
if ((newState == MINIMIZED_STATE) && (pCD->iconWindow))
|
|
XMapRaised (DISPLAY, pCD->iconWindow);
|
|
|
|
if (((newState == NORMAL_STATE) || (newState == MAXIMIZED_STATE ))
|
|
&& (pCD->iconWindow))
|
|
{
|
|
XUnmapWindow (DISPLAY, pCD->iconWindow);
|
|
}
|
|
|
|
} /* END FUNCTION ShowClientIconState */
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* IconScrollVisibleCallback
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* for each icon in the icon box
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void IconScrollVisibleCallback (Widget w, caddr_t client_data, XmAnyCallbackStruct *call_data)
|
|
{
|
|
XmTraverseObscuredCallbackStruct *vis_data;
|
|
|
|
vis_data = (XmTraverseObscuredCallbackStruct *) call_data;
|
|
|
|
XmScrollVisible(ACTIVE_WS->pIconBox->scrolledWidget,
|
|
vis_data->traversal_destination,
|
|
0,0);
|
|
/*
|
|
IB_MARGIN_WIDTH, IB_MARGIN_HEIGHT);
|
|
*/
|
|
} /* END OF FUNCTION IconScrollVisibleCallback */
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* IconActivateCallback
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* for each icon in the icon box
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void IconActivateCallback (Widget w, caddr_t client_data, XmAnyCallbackStruct *call_data)
|
|
{
|
|
ClientData *pCD;
|
|
Window theIcon;
|
|
|
|
theIcon = XtWindow(w);
|
|
|
|
/*
|
|
* find context to get pCD and then carry out
|
|
* default action.
|
|
*/
|
|
|
|
if (!(XFindContext (DISPLAY, theIcon,
|
|
wmGD.windowContextType, (caddr_t *)&pCD)))
|
|
{
|
|
F_Restore_And_Raise ((String)NULL, pCD, (XEvent *)NULL );
|
|
/* F_Normalize_And_Raise ((String)NULL, pCD, (XEvent *)NULL );
|
|
*/ }
|
|
|
|
} /* END OF FUNCTION IconActivateCallback */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* UpdateIncrements
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void UpdateIncrements (Widget sWidget, IconBoxData *pIBD, XConfigureEvent *event)
|
|
{
|
|
ResetArrowButtonIncrements (pIBD->pCD_iconBox);
|
|
|
|
} /* END OF FUNCTION UpdateIncrements */
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* ResetArrowButtonIncrements(pCD)
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void ResetArrowButtonIncrements (ClientData *pCD)
|
|
{
|
|
int i;
|
|
Arg setArgs[2];
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNincrement, (XtArgVal) pCD->heightInc); i++;
|
|
XtSetValues (pCD->thisIconBox->vScrollBar, (ArgList) setArgs, i);
|
|
|
|
i=0;
|
|
XtSetArg (setArgs[i], XmNincrement, (XtArgVal) pCD->widthInc); i++;
|
|
XtSetValues (pCD->thisIconBox->hScrollBar, (ArgList) setArgs, i);
|
|
|
|
} /* END OF FUNCTION ResetArrowButtonIncrements */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* ChangeActiveIconboxIconText
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* XXDescription ...
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void ChangeActiveIconboxIconText (Widget icon, caddr_t dummy, XFocusChangeEvent *event)
|
|
{
|
|
|
|
ClientData *pCD;
|
|
Window theIcon;
|
|
|
|
/*
|
|
* find context to get pCD and then hide or show active icon text.
|
|
* Show/hide the active icon text only if the icon box is not
|
|
* iconified.
|
|
*/
|
|
|
|
theIcon = XtWindow(icon);
|
|
|
|
if (!(XFindContext (DISPLAY, theIcon,
|
|
wmGD.windowContextType, (caddr_t *)&pCD)) &&
|
|
P_ICON_BOX(pCD) &&
|
|
P_ICON_BOX(pCD)->pCD_iconBox &&
|
|
P_ICON_BOX(pCD)->pCD_iconBox->clientState != MINIMIZED_STATE)
|
|
{
|
|
if (event->type == FocusIn)
|
|
{
|
|
if (event->send_event)
|
|
{
|
|
ShowActiveIconText (pCD);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (event->send_event)
|
|
{
|
|
HideActiveIconText (pCD->pSD);
|
|
}
|
|
}
|
|
}
|
|
|
|
} /* END OF FUNCTION ChangeActiveIconboxIconText */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* HandleIconBoxIconKeyPress
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* This event handler catches keyevents for icons in the icon box and
|
|
* passes them on to the standard key handling routine for mwm.
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void HandleIconBoxIconKeyPress (Widget icon, caddr_t dummy, XKeyEvent *keyEvent)
|
|
{
|
|
|
|
Context context;
|
|
ClientData *pCD;
|
|
Window theIcon;
|
|
|
|
/*
|
|
* find context to get pCD and then post menu show active icon text.
|
|
*/
|
|
|
|
theIcon = XtWindow(icon);
|
|
if (!(XFindContext (DISPLAY, theIcon,
|
|
wmGD.windowContextType, (caddr_t *)&pCD)))
|
|
{
|
|
SetClientWsIndex (pCD);
|
|
keyEvent->window = ICON_FRAME_WIN(pCD);
|
|
|
|
if (pCD->clientState == MINIMIZED_STATE)
|
|
{
|
|
context = F_SUBCONTEXT_IB_IICON;
|
|
pCD->grabContext = F_SUBCONTEXT_IB_IICON;
|
|
}
|
|
else
|
|
{
|
|
context = F_SUBCONTEXT_IB_WICON;
|
|
pCD->grabContext = F_SUBCONTEXT_IB_WICON;
|
|
}
|
|
|
|
if(!(HandleKeyPress (keyEvent, ACTIVE_PSD->keySpecs,
|
|
True, context, False, pCD)))
|
|
{
|
|
keyEvent->window = 0;
|
|
keyEvent->type = 0;
|
|
}
|
|
|
|
}
|
|
|
|
} /* END OF FUNCTION HandleIconBoxIconKeyPress */
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* HandleIconBoxButtonMotion
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
* Event handler for button motion events on icon frame window in
|
|
* in icon box.
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* icon - widget for icon frame
|
|
* client_data - extra client data
|
|
* pev - ptr to event
|
|
*
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* o This is added to make sure that ButtonXMotion gets added to the
|
|
* event mask for icons in the icon box.
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
void HandleIconBoxButtonMotion (Widget icon, caddr_t client_data, XEvent *pev)
|
|
{
|
|
|
|
} /* END OF FUNCTION HandleIconBoxButtonMotion */
|
|
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* GetIconBoxIconRootXY (pCD, pX, pY)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pCD - pointer to client data
|
|
* pX - pointer to X return value
|
|
* pY - pointer to Y return value
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* o returns root-window coords
|
|
*
|
|
*************************************<->***********************************/
|
|
void GetIconBoxIconRootXY (ClientData *pCD, int *pX, int *pY)
|
|
{
|
|
|
|
Window child;
|
|
WsClientData *pWsc = GetWsClientData (pCD->pSD->pActiveWS, pCD);
|
|
|
|
if (pCD->pSD->useIconBox && pWsc->pIconBox)
|
|
{
|
|
XTranslateCoordinates(DISPLAY,
|
|
XtWindow(pWsc->pIconBox->bBoardWidget),
|
|
ROOT_FOR_CLIENT(pCD),
|
|
pWsc->iconX + IB_MARGIN_WIDTH,
|
|
pWsc->iconY + IB_MARGIN_HEIGHT,
|
|
pX, pY, &child);
|
|
}
|
|
else
|
|
{
|
|
*pX = *pY = 0;
|
|
}
|
|
} /* END FUNCTION GetIconBoxIconRootXY */
|
|
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* IconVisible (pCD)
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
* pCD - pointer to client data
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
*
|
|
*************************************<->***********************************/
|
|
Boolean IconVisible (ClientData *pCD)
|
|
{
|
|
|
|
/*
|
|
* May use icon->core.visible field if that gets fixed and
|
|
* we want to accept the Intrinsics idea of what is visible.
|
|
*/
|
|
|
|
Boolean rval = True;
|
|
WsClientData *pWsc = GetWsClientData (pCD->pSD->pActiveWS, pCD);
|
|
|
|
|
|
|
|
int i;
|
|
Arg getArgs[5];
|
|
|
|
Dimension tmpWidth = 0;
|
|
Dimension tmpHeight = 0;
|
|
Position clipX = 0;
|
|
Position clipY = 0;
|
|
Position tmpX = 0;
|
|
Position tmpY = 0;
|
|
int iconX, iconY;
|
|
|
|
i=0;
|
|
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &tmpWidth ); i++;
|
|
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &tmpHeight ); i++;
|
|
XtSetArg (getArgs[i], XmNx, (XtArgVal) &tmpX ); i++;
|
|
XtSetArg (getArgs[i], XmNy, (XtArgVal) &tmpY ); i++;
|
|
XtGetValues (pWsc->pIconBox->clipWidget, getArgs, i);
|
|
XtTranslateCoords(pWsc->pIconBox->scrolledWidget,
|
|
tmpX, tmpY,
|
|
&clipX, &clipY);
|
|
|
|
GetIconBoxIconRootXY(pCD, &iconX, &iconY);
|
|
|
|
|
|
/*
|
|
* demand at least 2 pixels of the
|
|
* real icon (not drawnButton) be showing
|
|
*/
|
|
|
|
if (iconX + 2 > ((int)clipX + (int)tmpWidth))
|
|
{
|
|
return(False);
|
|
}
|
|
if (iconY + 2 > ((int)clipY + (int)tmpHeight))
|
|
{
|
|
return(False);
|
|
}
|
|
|
|
if ((iconX + (ICON_WIDTH(pCD) -2)) < (int)clipX)
|
|
{
|
|
return(False);
|
|
}
|
|
if ((iconY + (ICON_HEIGHT(pCD) -2)) < (int)clipY)
|
|
{
|
|
return(False);
|
|
}
|
|
|
|
return(rval);
|
|
|
|
} /* END OF FUNCTION IconVisible */
|
|
|
|
/*************************************<->*************************************
|
|
*
|
|
* WmXmStringToString (xmString
|
|
*
|
|
*
|
|
* Description:
|
|
* -----------
|
|
*
|
|
*
|
|
* Inputs:
|
|
* ------
|
|
*
|
|
* Outputs:
|
|
* -------
|
|
*
|
|
*
|
|
* Comments:
|
|
* --------
|
|
* Return the ascii part of the first segment of an XmString
|
|
* If xmString is NULL, then do nothing
|
|
*
|
|
*************************************<->***********************************/
|
|
|
|
String WmXmStringToString (XmString xmString)
|
|
{
|
|
XmStringContext xmStrContext;
|
|
char *asciiString = NULL;
|
|
XmStringCharSet ibTitleCharset;
|
|
XmStringDirection ibTitleDirection;
|
|
Boolean separator;
|
|
|
|
if (xmString)
|
|
{
|
|
XmStringInitContext (&xmStrContext, xmString);
|
|
|
|
XmStringGetNextSegment (xmStrContext, &asciiString,
|
|
&ibTitleCharset, &ibTitleDirection,
|
|
&separator);
|
|
|
|
if (ibTitleCharset != NULL)
|
|
{
|
|
XtFree ((char *)ibTitleCharset);
|
|
}
|
|
|
|
XmStringFreeContext (xmStrContext);
|
|
}
|
|
|
|
return(asciiString);
|
|
|
|
} /* END OF FUNCTION WmXmStringToString */
|