2059 lines
47 KiB
C
2059 lines
47 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 OPEN SOFTWARE FOUNDATION, INC.
|
||
* ALL RIGHTS RESERVED
|
||
*/
|
||
/*
|
||
* Motif Release 1.2.3
|
||
*/
|
||
/*
|
||
* (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */
|
||
|
||
/*
|
||
* Included Files:
|
||
*/
|
||
|
||
|
||
#include "WmGlobal.h"
|
||
#include <Xm/Xm.h>
|
||
#include <Xm/DrawP.h> /* for XmeClearBorder */
|
||
/*
|
||
* include extern functions
|
||
*/
|
||
#include "WmIDecor.h"
|
||
#include "WmError.h"
|
||
#include "WmGraphics.h"
|
||
#include "WmIconBox.h"
|
||
#include "WmMenu.h"
|
||
#include "WmWinInfo.h"
|
||
#include "WmWrkspace.h"
|
||
|
||
|
||
|
||
/*
|
||
* Global Variables:
|
||
*/
|
||
static unsigned int activeIconTextWidth = 1;
|
||
static unsigned int activeIconTextHeight = 1;
|
||
static RList *pActiveIconTopRects = NULL;
|
||
static RList *pActiveIconBotRects = NULL;
|
||
|
||
static int iconShrinkX;
|
||
static int iconShrinkY;
|
||
static unsigned int iconShrinkWidth;
|
||
static unsigned int iconShrinkHeight;
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* MakeIcon (pWS, pcd)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Create an icon frame and fill it in as appropriate for the client.
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pWS - pointer to workspace data
|
||
* pcd - pointer to client data
|
||
*
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
* Return - TRUE if success, FALSE if failure.
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
Boolean MakeIcon (WmWorkspaceData *pWS, ClientData *pcd)
|
||
{
|
||
XSetWindowAttributes window_attribs;
|
||
unsigned long attr_mask;
|
||
int xOffset;
|
||
int yOffset;
|
||
WsClientData *pWsc = GetWsClientData (pWS, pcd);
|
||
|
||
|
||
/*
|
||
* Common to all icons
|
||
*/
|
||
|
||
/* compute dimensions of outer icon frame */
|
||
/* create icon frame window */
|
||
|
||
attr_mask = CWEventMask | CWCursor;
|
||
window_attribs.event_mask = (ButtonPressMask | ButtonReleaseMask |
|
||
SELECT_BUTTON_MOTION_MASK |
|
||
DMANIP_BUTTON_MOTION_MASK |
|
||
ExposureMask |
|
||
SubstructureRedirectMask |
|
||
FocusChangeMask);
|
||
window_attribs.cursor = wmGD.workspaceCursor;
|
||
|
||
if ((wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_POINTER) ||
|
||
(wmGD.colormapFocusPolicy == CMAP_FOCUS_POINTER))
|
||
{
|
||
window_attribs.event_mask |= EnterWindowMask | LeaveWindowMask;
|
||
}
|
||
|
||
/*
|
||
* Use background pixmap if one is specified, otherwise set the
|
||
* appropriate background color.
|
||
*/
|
||
|
||
if (ICON_APPEARANCE(pcd).backgroundPixmap)
|
||
{
|
||
attr_mask |= CWBackPixmap;
|
||
window_attribs.background_pixmap =
|
||
ICON_APPEARANCE(pcd).backgroundPixmap;
|
||
}
|
||
else
|
||
{
|
||
attr_mask |= CWBackPixel;
|
||
window_attribs.background_pixel =
|
||
ICON_APPEARANCE(pcd).background;
|
||
}
|
||
|
||
if ((!pcd->pSD->useIconBox) ||
|
||
(pcd->clientFlags & (CLIENT_WM_CLIENTS | FRONT_PANEL_BOX)))
|
||
{
|
||
pWsc->iconFrameWin = XCreateWindow (DISPLAY,
|
||
ROOT_FOR_CLIENT(pcd), /* parent */
|
||
pWsc->iconX,
|
||
pWsc->iconY,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_HEIGHT(pcd),
|
||
0, /* border width */
|
||
CopyFromParent, /* depth */
|
||
InputOutput, /* class */
|
||
CopyFromParent, /* visual */
|
||
attr_mask,
|
||
&window_attribs);
|
||
|
||
}
|
||
else
|
||
{
|
||
/*
|
||
* Insert the icon into the icon box.
|
||
* Don't make icon in the box for any icon box (or any WM window)
|
||
* OR any client that doesn't have the MWM_FUNC_MINIMIZE bit set
|
||
* in pcd->clientFunctions
|
||
*/
|
||
|
||
if ((pcd->pSD->useIconBox) &&
|
||
(!(pcd->clientFlags & CLIENT_WM_CLIENTS)) &&
|
||
(pcd->clientFunctions & MWM_FUNC_MINIMIZE) )
|
||
{
|
||
if (!InsertIconIntoBox(pWS->pIconBox, pcd))
|
||
Warning(((char *)GETMESSAGE(30, 1, "Could not make icon to go in icon box")));
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/* make space for the top/bottom changing shadow rectangles */
|
||
|
||
if ((pcd->piconTopShadows =
|
||
AllocateRList ((unsigned)NUM_BOTH_TOP_RECTS)) == NULL)
|
||
{
|
||
/* Out of memory! */
|
||
Warning (((char *)GETMESSAGE(30, 2, "Insufficient memory for icon creation")));
|
||
return(FALSE);
|
||
}
|
||
|
||
if ((pcd->piconBottomShadows =
|
||
AllocateRList ((unsigned)NUM_BOTH_BOTTOM_RECTS)) == NULL)
|
||
{
|
||
/* Out of memory! */
|
||
Warning (((char *)GETMESSAGE(30, 3, "Insufficient memory for icon creation")));
|
||
return(FALSE);
|
||
}
|
||
|
||
|
||
/*
|
||
* Adjust for icons in the box
|
||
* Don't adjust the icon for the icon box itself
|
||
*/
|
||
|
||
if (pWS->pIconBox && (pWS->pIconBox->pCD_iconBox != pcd) &&
|
||
!(pcd->clientFlags & FRONT_PANEL_BOX))
|
||
{
|
||
xOffset = IB_MARGIN_WIDTH;
|
||
yOffset = IB_MARGIN_HEIGHT;
|
||
}
|
||
else
|
||
{
|
||
xOffset = 0;
|
||
yOffset = 0;
|
||
}
|
||
|
||
|
||
/*
|
||
* Reparent the icon window if there is one
|
||
*/
|
||
if ((ICON_DECORATION(pcd) & ICON_IMAGE_PART) &&
|
||
(pcd->iconWindow))
|
||
{
|
||
ReparentIconWindow (pcd, xOffset, yOffset);
|
||
}
|
||
|
||
if (pcd->piconTopShadows->used == 0)
|
||
MakeIconShadows (pcd, xOffset, yOffset);
|
||
|
||
return(TRUE);
|
||
|
||
} /* END OF FUNCTION MakeIcon */
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* MakeIconShadows (pcd, xOffset, yOffset)
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
void MakeIconShadows (ClientData *pcd, int xOffset, int yOffset)
|
||
{
|
||
|
||
/*
|
||
* Handle different icon styles
|
||
*/
|
||
|
||
switch (ICON_DECORATION(pcd) & (ICON_LABEL_PART | ICON_IMAGE_PART))
|
||
{
|
||
case ICON_LABEL_PART:
|
||
BevelRectangle (pcd->piconTopShadows, /* label */
|
||
pcd->piconBottomShadows,
|
||
0 + xOffset, (int)ICON_IMAGE_HEIGHT(pcd) + yOffset,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_LABEL_HEIGHT(pcd),
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH);
|
||
break;
|
||
|
||
case ICON_IMAGE_PART:
|
||
BevelRectangle (pcd->piconTopShadows, /* image outside */
|
||
pcd->piconBottomShadows,
|
||
0 + xOffset, 0 + yOffset,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_IMAGE_HEIGHT(pcd),
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH);
|
||
|
||
if (wmGD.frameStyle == WmRECESSED)
|
||
BevelRectangle (pcd->piconBottomShadows, /* image inside */
|
||
pcd->piconTopShadows,
|
||
ICON_INNER_X_OFFSET + xOffset,
|
||
ICON_INNER_Y_OFFSET + yOffset,
|
||
(unsigned int) (ICON_IMAGE_MAXIMUM(pcd).width +
|
||
4*ICON_INTERNAL_SHADOW_WIDTH),
|
||
(unsigned int) (ICON_IMAGE_MAXIMUM(pcd).height +
|
||
4*ICON_INTERNAL_SHADOW_WIDTH),
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH);
|
||
|
||
break;
|
||
|
||
case (ICON_IMAGE_PART | ICON_LABEL_PART):
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
BevelRectangle (pcd->piconTopShadows, /* image outside */
|
||
pcd->piconBottomShadows,
|
||
0 + xOffset, 0 + yOffset,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) (ICON_IMAGE_HEIGHT(pcd) +
|
||
ICON_LABEL_HEIGHT(pcd)),
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH);
|
||
}
|
||
else
|
||
{
|
||
BevelRectangle (pcd->piconTopShadows, /* image outside */
|
||
pcd->piconBottomShadows,
|
||
0 + xOffset, 0 + yOffset,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_IMAGE_HEIGHT(pcd),
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH);
|
||
}
|
||
|
||
if (wmGD.frameStyle == WmRECESSED)
|
||
BevelRectangle (pcd->piconBottomShadows, /* image inside */
|
||
pcd->piconTopShadows,
|
||
ICON_INNER_X_OFFSET + xOffset,
|
||
ICON_INNER_Y_OFFSET + yOffset,
|
||
(unsigned int) (ICON_IMAGE_MAXIMUM(pcd).width +
|
||
4*ICON_INTERNAL_SHADOW_WIDTH),
|
||
(unsigned int) (ICON_IMAGE_MAXIMUM(pcd).height +
|
||
4*ICON_INTERNAL_SHADOW_WIDTH),
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH);
|
||
|
||
if (wmGD.frameStyle == WmRECESSED)
|
||
BevelRectangle (pcd->piconTopShadows, /* label */
|
||
pcd->piconBottomShadows,
|
||
0 + xOffset, (int)ICON_IMAGE_HEIGHT(pcd) + yOffset,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_LABEL_HEIGHT(pcd),
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH);
|
||
|
||
break;
|
||
}
|
||
|
||
} /* END OF FUNCTION MakeIconShadows */
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* IconExposureProc (pcd, expose)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Repaint the icon.
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
*
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
void IconExposureProc (ClientData *pcd, Boolean expose)
|
||
{
|
||
|
||
Pixmap image;
|
||
int dest_x, dest_y;
|
||
int xOffset;
|
||
int yOffset;
|
||
unsigned int width, height;
|
||
GC iconGC, topGC, botGC;
|
||
static XRectangle shrinkRects[4];
|
||
|
||
|
||
|
||
/*
|
||
* Adjust for icons in the iconBox
|
||
*/
|
||
|
||
if (P_ICON_BOX(pcd))
|
||
{
|
||
xOffset = IB_MARGIN_WIDTH;
|
||
yOffset = IB_MARGIN_HEIGHT;
|
||
}
|
||
else
|
||
{
|
||
xOffset = 0;
|
||
yOffset = 0;
|
||
}
|
||
|
||
/* get appropriate GCs */
|
||
|
||
if ((wmGD.keyboardFocus == pcd) && (pcd->clientState == MINIMIZED_STATE))
|
||
{
|
||
iconGC = ICON_APPEARANCE(pcd).activeGC;
|
||
topGC = ICON_APPEARANCE(pcd).activeTopShadowGC;
|
||
botGC = ICON_APPEARANCE(pcd).activeBottomShadowGC;
|
||
}
|
||
else
|
||
{
|
||
iconGC = ICON_APPEARANCE(pcd).inactiveGC;
|
||
topGC = ICON_APPEARANCE(pcd).inactiveTopShadowGC;
|
||
botGC = ICON_APPEARANCE(pcd).inactiveBottomShadowGC;
|
||
}
|
||
|
||
if (ACTIVE_PSD->useIconBox && P_ICON_BOX(pcd))
|
||
{
|
||
/* draw shadowing */
|
||
|
||
if (expose)
|
||
{
|
||
XClearArea (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
IB_MARGIN_WIDTH,
|
||
IB_MARGIN_HEIGHT,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_HEIGHT(pcd), False);
|
||
}
|
||
|
||
if (pcd->clientState == MINIMIZED_STATE)
|
||
{
|
||
/*
|
||
* This is the "raised" icon appearance
|
||
*/
|
||
|
||
if (pcd->piconTopShadows)
|
||
{
|
||
|
||
XFillRectangles (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
topGC,
|
||
pcd->piconTopShadows->prect,
|
||
pcd->piconTopShadows->used);
|
||
}
|
||
|
||
if (pcd->piconBottomShadows)
|
||
{
|
||
XFillRectangles (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
botGC,
|
||
pcd->piconBottomShadows->prect,
|
||
pcd->piconBottomShadows->used);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
shrinkRects[0].x = IB_MARGIN_WIDTH;
|
||
shrinkRects[0].y = IB_MARGIN_HEIGHT;
|
||
shrinkRects[0].width = (unsigned int) ICON_WIDTH(pcd);
|
||
shrinkRects[0].height = iconShrinkY - IB_MARGIN_HEIGHT;
|
||
|
||
shrinkRects[1].x = IB_MARGIN_WIDTH;
|
||
shrinkRects[1].y = iconShrinkY;
|
||
shrinkRects[1].width = iconShrinkX - IB_MARGIN_WIDTH;
|
||
shrinkRects[1].height = iconShrinkHeight;
|
||
|
||
shrinkRects[2].x = iconShrinkX + iconShrinkWidth;
|
||
shrinkRects[2].y = iconShrinkY;
|
||
shrinkRects[2].width = iconShrinkX - IB_MARGIN_WIDTH;
|
||
shrinkRects[2].height = iconShrinkHeight;
|
||
|
||
shrinkRects[3].x = IB_MARGIN_WIDTH;
|
||
shrinkRects[3].y = iconShrinkY + iconShrinkHeight;
|
||
shrinkRects[3].width = (unsigned int) ICON_WIDTH(pcd);
|
||
shrinkRects[3].height = iconShrinkY - IB_MARGIN_HEIGHT;
|
||
|
||
XFillRectangles (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
SHRINK_WRAP_GC(pcd),
|
||
&shrinkRects[0], 4);
|
||
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
/* draw shadowing */
|
||
|
||
if (pcd->clientState == MINIMIZED_STATE)
|
||
{
|
||
/*
|
||
* This is the "raised" icon appearance
|
||
*/
|
||
|
||
if (pcd->piconTopShadows->prect)
|
||
{
|
||
|
||
XFillRectangles (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
topGC,
|
||
pcd->piconTopShadows->prect,
|
||
pcd->piconTopShadows->used);
|
||
}
|
||
|
||
if (pcd->piconBottomShadows->prect)
|
||
{
|
||
XFillRectangles (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
botGC,
|
||
pcd->piconBottomShadows->prect,
|
||
pcd->piconBottomShadows->used);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
/* draw icon text */
|
||
/*
|
||
if ((ICON_DECORATION(pcd) & ICON_LABEL_PART) &&
|
||
(expose || !(ICON_DECORATION(pcd) & ICON_ACTIVE_LABEL_PART)))
|
||
*/
|
||
if (ICON_DECORATION(pcd) & ICON_LABEL_PART)
|
||
{
|
||
DrawIconTitle (pcd);
|
||
}
|
||
|
||
/*
|
||
* Draw image if no icon window (client has to redraw that!)
|
||
* OR if using the iconbox, draw the default image where
|
||
* the icon window was.
|
||
*/
|
||
|
||
if (expose &&
|
||
((!pcd->iconWindow && (ICON_DECORATION(pcd) & ICON_IMAGE_PART)) ||
|
||
(ACTIVE_PSD->useIconBox && P_ICON_BOX(pcd) &&
|
||
pcd->iconWindow &&
|
||
pcd->clientState != MINIMIZED_STATE &&
|
||
(ICON_DECORATION(pcd) & ICON_IMAGE_PART))))
|
||
{
|
||
if (pcd->iconWindow)
|
||
{
|
||
image = DEFAULT_PIXMAP(pcd);
|
||
}
|
||
else
|
||
{
|
||
image = pcd->iconPixmap;
|
||
}
|
||
|
||
if (image)
|
||
{
|
||
|
||
if ((ACTIVE_PSD->useIconBox) && (P_ICON_BOX(pcd)))
|
||
{
|
||
|
||
if (pcd->clientState != MINIMIZED_STATE)
|
||
{
|
||
dest_x = ICON_IMAGE_X_OFFSET
|
||
+ ICON_INTERNAL_SHADOW_WIDTH
|
||
+ xOffset;
|
||
|
||
dest_y = ICON_IMAGE_Y_OFFSET
|
||
+ ICON_INTERNAL_SHADOW_WIDTH
|
||
+ yOffset;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* less beveling in this style */
|
||
dest_x -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
dest_y -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
width = ICON_IMAGE_MAXIMUM(pcd).width;
|
||
height= ICON_IMAGE_MAXIMUM(pcd).height;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
width += 2;
|
||
height += 2;
|
||
}
|
||
XCopyArea (DISPLAY, image,
|
||
ICON_FRAME_WIN(pcd),
|
||
iconGC,
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
ICON_INTERNAL_SHADOW_WIDTH,
|
||
width, height, dest_x, dest_y);
|
||
|
||
if (FADE_NORMAL_ICON(pcd))
|
||
{
|
||
iconGC = FADE_ICON_GC(pcd);
|
||
XFillRectangle (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
iconGC,
|
||
dest_x, dest_y,
|
||
width, height);
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
dest_x = ICON_IMAGE_X_OFFSET
|
||
+ xOffset;
|
||
|
||
dest_y = ICON_IMAGE_Y_OFFSET
|
||
+ yOffset;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* less beveling in this style */
|
||
dest_x -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
dest_y -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
width = ICON_IMAGE_MAXIMUM(pcd).width
|
||
+ (2 * ICON_INTERNAL_SHADOW_WIDTH);
|
||
height= ICON_IMAGE_MAXIMUM(pcd).height
|
||
+ (2 * ICON_INTERNAL_SHADOW_WIDTH);
|
||
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
width += 2;
|
||
height += 2;
|
||
}
|
||
XCopyArea (DISPLAY, image,
|
||
ICON_FRAME_WIN(pcd),
|
||
iconGC, 0, 0, width, height,
|
||
dest_x, dest_y);
|
||
|
||
}
|
||
}
|
||
else
|
||
|
||
{
|
||
width = ICON_IMAGE_MAXIMUM(pcd).width +
|
||
2 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
|
||
height= ICON_IMAGE_MAXIMUM(pcd).height +
|
||
2 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
dest_x = ICON_INNER_X_OFFSET;
|
||
dest_y = ICON_INNER_Y_OFFSET;
|
||
width += 2;
|
||
height += 2;
|
||
}
|
||
else
|
||
{
|
||
dest_x = ICON_INNER_X_OFFSET + ICON_INTERNAL_SHADOW_WIDTH;
|
||
dest_y = ICON_INNER_Y_OFFSET + ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
XCopyArea (DISPLAY, image,
|
||
ICON_FRAME_WIN(pcd),
|
||
iconGC, 0, 0, width, height,
|
||
dest_x, dest_y);
|
||
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
} /* END OF FUNCTION IconExposureProc */
|
||
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* GetIconTitleBox (pcd, pBox)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Returns a rectangle containing the icon text box
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
* pBox - pointer to an XRectangle structure that gets returned data
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
* pBox - returned data
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
void GetIconTitleBox (ClientData *pcd, XRectangle *pBox)
|
||
{
|
||
int xOffset;
|
||
int yOffset;
|
||
|
||
|
||
/*
|
||
* Adjust for icons in the iconBox
|
||
*/
|
||
|
||
if (P_ICON_BOX(pcd))
|
||
{
|
||
xOffset = IB_MARGIN_WIDTH;
|
||
yOffset = IB_MARGIN_HEIGHT;
|
||
}
|
||
else
|
||
{
|
||
xOffset = 0;
|
||
yOffset = 0;
|
||
}
|
||
|
||
if ((P_ICON_BOX(pcd)) && (pcd->clientState != MINIMIZED_STATE))
|
||
{
|
||
/* move label up to enhance shrink wrap effect */
|
||
pBox->x = ICON_EXTERNAL_SHADOW_WIDTH
|
||
+ ICON_IMAGE_LEFT_PAD
|
||
+ (2 * ICON_INTERNAL_SHADOW_WIDTH)
|
||
+ ICON_IMAGE_LEFT_PAD
|
||
+ xOffset;
|
||
|
||
pBox->y = ICON_IMAGE_HEIGHT(pcd)
|
||
+ yOffset
|
||
+ ((ICON_IMAGE_HEIGHT(pcd) > 0)
|
||
? - ICON_IMAGE_BOTTOM_PAD
|
||
: ICON_EXTERNAL_SHADOW_WIDTH)
|
||
+ ((ICON_IMAGE_HEIGHT(pcd) >0)
|
||
? 0
|
||
: WM_TOP_TITLE_PADDING );
|
||
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* account for less beveling in this style */
|
||
pBox->x -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
pBox->y -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
|
||
|
||
pBox->width = ICON_IMAGE_MAXIMUM(pcd).width
|
||
+ ((wmGD.frameStyle == WmSLAB) ? 2 : 0)
|
||
- ICON_IMAGE_LEFT_PAD
|
||
- ICON_EXTERNAL_SHADOW_WIDTH;
|
||
|
||
pBox->height = TEXT_HEIGHT(ICON_APPEARANCE(pcd).font);
|
||
|
||
}
|
||
else if ((P_ICON_BOX(pcd)) && (pcd->clientState == MINIMIZED_STATE))
|
||
{
|
||
pBox->x = ICON_EXTERNAL_SHADOW_WIDTH
|
||
+ ICON_IMAGE_LEFT_PAD
|
||
+ (2 * ICON_INTERNAL_SHADOW_WIDTH)
|
||
+ ICON_IMAGE_LEFT_PAD
|
||
+ xOffset;
|
||
|
||
pBox->y = ICON_IMAGE_HEIGHT(pcd)
|
||
+ yOffset
|
||
+ ((ICON_IMAGE_HEIGHT(pcd) > 0)
|
||
? ICON_INTERNAL_SHADOW_WIDTH
|
||
: ICON_EXTERNAL_SHADOW_WIDTH)
|
||
+ WM_TOP_TITLE_PADDING ;
|
||
|
||
pBox->width = ICON_IMAGE_MAXIMUM(pcd).width
|
||
+ ((wmGD.frameStyle == WmSLAB) ? 2 : 0)
|
||
- ICON_IMAGE_LEFT_PAD;
|
||
|
||
pBox->height = TEXT_HEIGHT(ICON_APPEARANCE(pcd).font);
|
||
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* account for less beveling in this style */
|
||
pBox->x -= ICON_INTERNAL_SHADOW_WIDTH + 2*ICON_IMAGE_LEFT_PAD;
|
||
pBox->y -= 3 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
pBox->width += ICON_IMAGE_LEFT_PAD + 2;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
pBox->x = ICON_EXTERNAL_SHADOW_WIDTH
|
||
+ WM_TOP_TITLE_PADDING
|
||
+ xOffset;
|
||
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* account for less beveling in this style */
|
||
yOffset -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
pBox->y = ICON_IMAGE_HEIGHT(pcd)
|
||
+ WM_TOP_TITLE_PADDING
|
||
+ yOffset
|
||
+ ((ICON_IMAGE_HEIGHT(pcd) > 0)
|
||
? ICON_INTERNAL_SHADOW_WIDTH
|
||
: ICON_EXTERNAL_SHADOW_WIDTH);
|
||
|
||
pBox->width = ICON_WIDTH(pcd) - 2 * ICON_EXTERNAL_SHADOW_WIDTH -
|
||
WM_TOP_TITLE_PADDING - WM_BOTTOM_TITLE_PADDING;
|
||
pBox->height = TEXT_HEIGHT(ICON_APPEARANCE(pcd).font);
|
||
|
||
}
|
||
|
||
|
||
} /* END OF FUNCTION GetIconTitleBox */
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* DrawIconTitle (pcd)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Draws the title in the Icon title area
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
void DrawIconTitle (ClientData *pcd)
|
||
{
|
||
XRectangle textBox;
|
||
GC iconGC;
|
||
|
||
|
||
GetIconTitleBox (pcd, &textBox);
|
||
|
||
/* get appropriate GCs */
|
||
if ((ACTIVE_PSD->useIconBox &&
|
||
!((pcd->dtwmBehaviors & (DtWM_BEHAVIOR_PANEL)) ||
|
||
(pcd->clientFlags & CLIENT_WM_CLIENTS))) ||
|
||
!(wmGD.keyboardFocus == pcd))
|
||
{
|
||
iconGC = ICON_APPEARANCE(pcd).inactiveGC;
|
||
}
|
||
else
|
||
{
|
||
iconGC = ICON_APPEARANCE(pcd).activeGC;
|
||
}
|
||
|
||
/*
|
||
* Dim text if this is in the icon box and the client is mapped
|
||
*/
|
||
|
||
if ((ACTIVE_PSD->useIconBox) &&
|
||
(P_ICON_BOX(pcd)) &&
|
||
(FADE_NORMAL_ICON(pcd)) &&
|
||
(!(pcd->clientState == MINIMIZED_STATE)))
|
||
{
|
||
iconGC = FADE_ICON_TEXT_GC(pcd);
|
||
}
|
||
|
||
|
||
|
||
|
||
/* paint the text */
|
||
WmDrawXmString(DISPLAY, ICON_FRAME_WIN(pcd), ICON_APPEARANCE(pcd).fontList,
|
||
ICON_DISPLAY_TITLE(pcd), iconGC,
|
||
textBox.x, textBox.y, textBox.width, &textBox, True);
|
||
|
||
} /* END OF FUNCTION DrawIconTitle */
|
||
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* RedisplayIconTitle (pcd)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Draws the title in the Icon title area
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
void RedisplayIconTitle (ClientData *pcd)
|
||
{
|
||
XRectangle textBox;
|
||
GC iconGC;
|
||
|
||
/*
|
||
* only proceed if we've got the right icon parts to work on
|
||
*/
|
||
|
||
if (ICON_DECORATION(pcd) & ICON_LABEL_PART && ICON_FRAME_WIN(pcd))
|
||
{
|
||
|
||
/* nothing to do if no labels */
|
||
if (!(ICON_DECORATION(pcd) & ICON_LABEL_PART))
|
||
return;
|
||
|
||
/* get the box that the text sits in */
|
||
GetIconTitleBox (pcd, &textBox);
|
||
|
||
/*
|
||
* Get appropriate GCs
|
||
* Dim text if this is in the icon box and the client is mapped
|
||
*/
|
||
if ((ACTIVE_PSD->useIconBox && (P_ICON_BOX(pcd)) &&
|
||
!(pcd->clientFlags & CLIENT_WM_CLIENTS)) ||
|
||
!(wmGD.keyboardFocus == pcd))
|
||
{
|
||
iconGC = ICON_APPEARANCE(pcd).inactiveGC;
|
||
}
|
||
else
|
||
{
|
||
iconGC = ICON_APPEARANCE(pcd).activeGC;
|
||
}
|
||
|
||
if ((ACTIVE_PSD->useIconBox) &&
|
||
(P_ICON_BOX(pcd)) &&
|
||
(FADE_NORMAL_ICON(pcd)) &&
|
||
(!(pcd->clientState == MINIMIZED_STATE)))
|
||
{
|
||
iconGC = FADE_ICON_TEXT_GC(pcd);
|
||
}
|
||
|
||
/* out with the old */
|
||
XClearArea (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
textBox.x, textBox.y,
|
||
(unsigned int) textBox.width, (unsigned int) textBox.height,
|
||
FALSE);
|
||
|
||
/* in with the new */
|
||
WmDrawXmString(DISPLAY, ICON_FRAME_WIN(pcd),
|
||
ICON_APPEARANCE(pcd).fontList,
|
||
ICON_DISPLAY_TITLE(pcd), iconGC,
|
||
textBox.x, textBox.y, textBox.width, &textBox,
|
||
True);
|
||
|
||
/*
|
||
* Erase & paint text in the active icon text window
|
||
*/
|
||
if ((wmGD.keyboardFocus == pcd) &&
|
||
(ICON_DECORATION(pcd) & ICON_ACTIVE_LABEL_PART))
|
||
{
|
||
PaintActiveIconText (pcd, True);
|
||
}
|
||
}
|
||
} /* END OF FUNCTION RedisplayIconTitle */
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* GetIconDimensions (pSD, &pWidth, &pLabelHeight, &pImageHeight)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* returns dimensions of icon frame parts
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pSD - pointer to screen data
|
||
* pWidth - pointer to width of frame
|
||
* pLabelHeight - pointer to height of label part of icon
|
||
* pImageHeight - pointer to height of image part of icon
|
||
*
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
* *pWidth - width of frame
|
||
* *pLabelHeight - height of label part of icon
|
||
* *pImageHeight - height of image part of icon
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void GetIconDimensions (WmScreenData *pSD, unsigned int *pWidth, unsigned int *pLabelHeight, unsigned int *pImageHeight)
|
||
{
|
||
/*
|
||
* The icon width is always keyed to the icon image maximum regardless
|
||
* of whether an icon image part appears or not.
|
||
*/
|
||
*pWidth = pSD->iconImageMaximum.width +
|
||
((wmGD.frameStyle == WmSLAB) ? 2 : 0) +
|
||
ICON_IMAGE_LEFT_PAD +
|
||
ICON_IMAGE_RIGHT_PAD +
|
||
2 * ICON_EXTERNAL_SHADOW_WIDTH +
|
||
4 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* less beveling in this style */
|
||
*pWidth -= 2 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
switch (pSD->iconDecoration & (ICON_IMAGE_PART | ICON_LABEL_PART))
|
||
{
|
||
case ICON_LABEL_PART:
|
||
*pImageHeight = 0;
|
||
|
||
*pLabelHeight = ICON_EXTERNAL_SHADOW_WIDTH +
|
||
WM_TOP_TITLE_PADDING +
|
||
TEXT_HEIGHT(pSD->iconAppearance.font) +
|
||
WM_BOTTOM_TITLE_PADDING +
|
||
ICON_EXTERNAL_SHADOW_WIDTH;
|
||
break;
|
||
|
||
case ICON_IMAGE_PART:
|
||
*pImageHeight = ICON_EXTERNAL_SHADOW_WIDTH +
|
||
ICON_IMAGE_TOP_PAD +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
pSD->iconImageMaximum.height +
|
||
((wmGD.frameStyle == WmSLAB) ? 2 : 0) +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
ICON_IMAGE_BOTTOM_PAD +
|
||
ICON_EXTERNAL_SHADOW_WIDTH;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* less beveling in this style */
|
||
*pImageHeight -= 2 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
|
||
*pLabelHeight = 0;
|
||
|
||
break;
|
||
|
||
case (ICON_IMAGE_PART | ICON_LABEL_PART):
|
||
*pImageHeight = ICON_EXTERNAL_SHADOW_WIDTH +
|
||
ICON_IMAGE_TOP_PAD +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
pSD->iconImageMaximum.height +
|
||
((wmGD.frameStyle == WmSLAB) ? 2 : 0) +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
ICON_INTERNAL_SHADOW_WIDTH +
|
||
ICON_IMAGE_BOTTOM_PAD +
|
||
ICON_INTERNAL_SHADOW_WIDTH;
|
||
|
||
*pLabelHeight = ICON_INTERNAL_SHADOW_WIDTH +
|
||
WM_TOP_TITLE_PADDING +
|
||
TEXT_HEIGHT(pSD->iconAppearance.font) +
|
||
WM_BOTTOM_TITLE_PADDING +
|
||
ICON_EXTERNAL_SHADOW_WIDTH;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/*
|
||
* In this style there is less beveling and no
|
||
* etching between the icon image and label.
|
||
*/
|
||
*pImageHeight -= 3 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
*pLabelHeight -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
break;
|
||
|
||
default:
|
||
*pLabelHeight = *pImageHeight = 0;
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* InitIconSize (pSD)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* set global icon size variables
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
*
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void InitIconSize (WmScreenData *pSD)
|
||
{
|
||
Cardinal label, image;
|
||
|
||
GetIconDimensions (pSD, (unsigned int *)&(pSD->iconWidth),
|
||
&label, &image);
|
||
|
||
pSD->iconHeight = label+image;
|
||
|
||
pSD->iconImageHeight = image;
|
||
pSD->iconLabelHeight = label;
|
||
|
||
|
||
iconShrinkX = IB_MARGIN_WIDTH
|
||
+ ICON_EXTERNAL_SHADOW_WIDTH
|
||
+ ICON_IMAGE_LEFT_PAD
|
||
+ 2 * ICON_INTERNAL_SHADOW_WIDTH;
|
||
|
||
|
||
iconShrinkY = IB_MARGIN_HEIGHT
|
||
+ ICON_EXTERNAL_SHADOW_WIDTH
|
||
+ ((pSD->iconDecoration & ICON_IMAGE_PART)
|
||
? (ICON_IMAGE_TOP_PAD +
|
||
(2 * ICON_INTERNAL_SHADOW_WIDTH))
|
||
: (WM_TOP_TITLE_PADDING));
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* less beveling in this style */
|
||
iconShrinkX -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
iconShrinkY -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
|
||
iconShrinkWidth = pSD->iconImageMaximum.width ;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
iconShrinkWidth += 2;
|
||
}
|
||
|
||
|
||
|
||
|
||
switch (pSD->iconDecoration & (ICON_IMAGE_PART | ICON_LABEL_PART))
|
||
{
|
||
case ICON_LABEL_PART:
|
||
iconShrinkHeight = TEXT_HEIGHT(pSD->iconAppearance.font);
|
||
break;
|
||
|
||
case ICON_IMAGE_PART:
|
||
iconShrinkHeight = pSD->iconImageMaximum.height;
|
||
|
||
break;
|
||
|
||
case (ICON_IMAGE_PART | ICON_LABEL_PART):
|
||
iconShrinkHeight = pSD->iconHeight
|
||
- ICON_EXTERNAL_SHADOW_WIDTH
|
||
- ICON_IMAGE_TOP_PAD
|
||
- ICON_INTERNAL_SHADOW_WIDTH
|
||
- ICON_INTERNAL_SHADOW_WIDTH
|
||
- ICON_IMAGE_BOTTOM_PAD
|
||
- WM_BOTTOM_TITLE_PADDING
|
||
- ICON_EXTERNAL_SHADOW_WIDTH;
|
||
if (wmGD.frameStyle == WmSLAB)
|
||
{
|
||
/* adjust for less beveling in this style */
|
||
iconShrinkHeight += ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
break;
|
||
|
||
}
|
||
|
||
|
||
} /* END OF FUNCTION InitIconSize */
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* ShowActiveIcon (pcd)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Paint the icon to indicate an "active" state
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
*
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
void ShowActiveIcon (ClientData *pcd)
|
||
{
|
||
unsigned long attr_mask;
|
||
XSetWindowAttributes window_attribs;
|
||
|
||
if (ICON_FRAME_WIN(pcd))
|
||
{
|
||
/*
|
||
* Use background pixmap if one is specified, otherwise set the
|
||
* appropriate background color.
|
||
*/
|
||
|
||
if (ICON_APPEARANCE(pcd).activeBackgroundPixmap)
|
||
{
|
||
attr_mask = CWBackPixmap;
|
||
window_attribs.background_pixmap =
|
||
ICON_APPEARANCE(pcd).activeBackgroundPixmap;
|
||
}
|
||
else
|
||
{
|
||
attr_mask = CWBackPixel;
|
||
window_attribs.background_pixel =
|
||
ICON_APPEARANCE(pcd).activeBackground;
|
||
}
|
||
|
||
|
||
/* set active window attributes */
|
||
XChangeWindowAttributes (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
attr_mask, &window_attribs);
|
||
|
||
/* clear the frame to the right background */
|
||
if ((!ACTIVE_PSD->useIconBox) ||
|
||
(P_ICON_BOX(pcd) == NULL))
|
||
{
|
||
if (ICON_DECORATION(pcd) & ICON_IMAGE_PART)
|
||
{
|
||
Dimension dheight, dwidth;
|
||
|
||
dwidth = ICON_WIDTH(pcd) -
|
||
2*ICON_EXTERNAL_SHADOW_WIDTH;
|
||
if (ICON_DECORATION(pcd) & ICON_LABEL_PART)
|
||
{
|
||
dheight = ICON_IMAGE_HEIGHT(pcd) -
|
||
ICON_EXTERNAL_SHADOW_WIDTH;
|
||
}
|
||
else
|
||
{
|
||
dheight = ICON_IMAGE_HEIGHT(pcd) -
|
||
2*ICON_EXTERNAL_SHADOW_WIDTH;
|
||
}
|
||
if (wmGD.frameStyle == WmRECESSED)
|
||
{
|
||
dheight -= ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
XmeClearBorder (DISPLAY, ICON_FRAME_WIN(pcd),
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
dwidth,
|
||
dheight,
|
||
ICON_IMAGE_TOP_PAD);
|
||
}
|
||
|
||
if (ICON_DECORATION(pcd) & ICON_LABEL_PART)
|
||
{
|
||
XClearArea (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
0,
|
||
ICON_IMAGE_HEIGHT(pcd),
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_HEIGHT(pcd), False);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
/*
|
||
* clear only area of real frame, not highlight area
|
||
*/
|
||
|
||
XClearArea (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
IB_MARGIN_WIDTH,
|
||
IB_MARGIN_HEIGHT,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_HEIGHT(pcd), False);
|
||
}
|
||
|
||
|
||
/*
|
||
* Put up a big icon text label.
|
||
*/
|
||
|
||
if (ICON_DECORATION(pcd) & ICON_ACTIVE_LABEL_PART)
|
||
|
||
{
|
||
if (wmGD.activeIconTextDisplayed)
|
||
PaintActiveIconText(pcd, True);
|
||
else
|
||
ShowActiveIconText(pcd);
|
||
}
|
||
|
||
/* simulate exposure of window */
|
||
IconExposureProc(pcd, False);
|
||
|
||
}
|
||
|
||
} /* END OF FUNCTION ShowActiveIcon */
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* ShowInactiveIcon (pcd, refresh)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Make the icon appear "inactive"
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
*
|
||
* refresh - if True redraw the icon
|
||
*
|
||
*************************************<->***********************************/
|
||
void ShowInactiveIcon (ClientData *pcd, Boolean refresh)
|
||
{
|
||
unsigned long attr_mask = 0;
|
||
XSetWindowAttributes window_attribs;
|
||
|
||
/* turn off the active icon text */
|
||
if (ICON_DECORATION(pcd) & ICON_ACTIVE_LABEL_PART)
|
||
{
|
||
/* pass in screen to fix multiscreen bug [P3385] */
|
||
HideActiveIconText(pcd->pSD);
|
||
}
|
||
|
||
if (ICON_FRAME_WIN(pcd))
|
||
{
|
||
/*
|
||
* Use background pixmap if one is specified, otherwise set the
|
||
* appropriate background color.
|
||
*/
|
||
|
||
if (ICON_APPEARANCE(pcd).backgroundPixmap)
|
||
{
|
||
attr_mask |= CWBackPixmap;
|
||
window_attribs.background_pixmap =
|
||
ICON_APPEARANCE(pcd).backgroundPixmap;
|
||
}
|
||
else
|
||
{
|
||
attr_mask |= CWBackPixel;
|
||
window_attribs.background_pixel =
|
||
ICON_APPEARANCE(pcd).background;
|
||
}
|
||
|
||
|
||
/* set active window attributes */
|
||
XChangeWindowAttributes (DISPLAY, ICON_FRAME_WIN(pcd), attr_mask,
|
||
&window_attribs);
|
||
|
||
|
||
if (refresh)
|
||
{
|
||
/* clear the frame to the right background */
|
||
if ((!ACTIVE_PSD->useIconBox) ||
|
||
(P_ICON_BOX(pcd) == NULL))
|
||
{
|
||
XmeClearBorder (DISPLAY, ICON_FRAME_WIN(pcd),
|
||
0, 0,
|
||
ICON_WIDTH(pcd), ICON_IMAGE_HEIGHT(pcd), 4);
|
||
|
||
XClearArea (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
0, ICON_IMAGE_HEIGHT(pcd),
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_HEIGHT(pcd), False);
|
||
}
|
||
else
|
||
{
|
||
/*
|
||
* clear only area of real frame, not highlight area
|
||
*/
|
||
|
||
XClearArea (DISPLAY,
|
||
ICON_FRAME_WIN(pcd),
|
||
IB_MARGIN_WIDTH,
|
||
IB_MARGIN_HEIGHT,
|
||
(unsigned int) ICON_WIDTH(pcd),
|
||
(unsigned int) ICON_HEIGHT(pcd), False);
|
||
}
|
||
|
||
|
||
/* simulate exposure of window */
|
||
IconExposureProc(pcd, False);
|
||
}
|
||
|
||
}
|
||
|
||
} /* END OF FUNTION ShowInactiveIcon */
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* ReparentIconWindow (pcd, xOffset, yOffset)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Reparent the icon window in the center of the image area
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
* xOffset - adjusts for icons in the iconBox
|
||
* yOffset - adjusts for icons in the iconBox
|
||
*
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void ReparentIconWindow (ClientData *pcd, int xOffset, int yOffset)
|
||
{
|
||
int x, y, rpX, rpY;
|
||
unsigned int width, height, bw, depth;
|
||
Window root;
|
||
XWindowChanges windowChanges;
|
||
unsigned int mask;
|
||
|
||
if (!pcd->pECD)
|
||
{
|
||
/*
|
||
* Check if window size is too big
|
||
*/
|
||
XGetGeometry (DISPLAY, pcd->iconWindow, &root, &x, &y, &width, &height,
|
||
&bw, &depth);
|
||
|
||
/*
|
||
* strip off previous window border and set window geometry to
|
||
* fit inside icon frame
|
||
*/
|
||
if (width != 0) {
|
||
mask = CWBorderWidth;
|
||
windowChanges.border_width = 0;
|
||
}
|
||
else
|
||
{
|
||
mask = 0;
|
||
}
|
||
|
||
if (width > ((ICON_IMAGE_MAXIMUM(pcd).width) +
|
||
((wmGD.frameStyle == WmSLAB) ? 2 : 0)))
|
||
{
|
||
width = windowChanges.width = ICON_IMAGE_MAXIMUM(pcd).width +
|
||
((wmGD.frameStyle == WmSLAB) ? 2 : 0);
|
||
mask |= CWWidth;
|
||
}
|
||
else if (width < ICON_IMAGE_MINIMUM(pcd).width) {
|
||
width = windowChanges.width = ICON_IMAGE_MINIMUM(pcd).width;
|
||
mask |= CWWidth;
|
||
}
|
||
|
||
if (height > ((ICON_IMAGE_MAXIMUM(pcd).height) +
|
||
((wmGD.frameStyle == WmSLAB) ? 2 : 0)))
|
||
{
|
||
height = windowChanges.height = ICON_IMAGE_MAXIMUM(pcd).height +
|
||
((wmGD.frameStyle == WmSLAB) ? 2 : 0);
|
||
mask |= CWHeight;
|
||
}
|
||
else if (height < ICON_IMAGE_MINIMUM(pcd).height) {
|
||
height = windowChanges.height = ICON_IMAGE_MINIMUM(pcd).height;
|
||
mask |= CWHeight;
|
||
}
|
||
|
||
if (mask)
|
||
XConfigureWindow (DISPLAY, pcd->iconWindow, mask, &windowChanges);
|
||
|
||
/*
|
||
* Reparent the icon window to the center of the icon image frame
|
||
*/
|
||
|
||
if (ICON_DECORATION(pcd) & ICON_LABEL_PART)
|
||
{
|
||
yOffset += ICON_INTERNAL_SHADOW_WIDTH;
|
||
}
|
||
|
||
rpX = ((ICON_WIDTH(pcd) - width)/2) + xOffset;
|
||
rpY = ((ICON_IMAGE_HEIGHT(pcd) - height)/2) + yOffset;
|
||
|
||
|
||
|
||
|
||
XReparentWindow (DISPLAY, pcd->iconWindow, ICON_FRAME_WIN(pcd), rpX, rpY);
|
||
pcd->clientFlags |= ICON_REPARENTED;
|
||
|
||
/*
|
||
* Map the icon window when the icon frame is mapped.
|
||
*/
|
||
} /* END if (!pcd->pECD) */
|
||
} /* END OF FUNCTION ReparentIconWindow */
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* PutBoxOnScreen (screen, px, py, width, height)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Changes the position of the passed box so that it is all on screen
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* screen - screen we're talking about
|
||
* px - pointer to x-coord
|
||
* py - pointer to y-coord
|
||
* width - width of box
|
||
* height - height of box
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
* *px - new x-coord
|
||
* *py - new y-coord
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void PutBoxOnScreen (int screen, int *px, int *py, unsigned int width, unsigned int height)
|
||
{
|
||
/*
|
||
* Place active label text nicely on screen
|
||
*/
|
||
|
||
if (*px+width+1 > DisplayWidth (DISPLAY, screen))
|
||
*px -= (*px+width+1) - DisplayWidth (DISPLAY, screen);
|
||
|
||
if (*py+height+1 > DisplayHeight (DISPLAY, screen))
|
||
*py -= (*py+height+1) - DisplayHeight (DISPLAY, screen);
|
||
|
||
if (*px < 1) *px = 1;
|
||
|
||
if (*py < 1) *py = 1;
|
||
|
||
} /* END OF FUNCTION PutBoxOnScreen */
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* PutBoxInIconBox (pCD, px, py, width, height)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Changes the position of the passed box so that it is not
|
||
* clipped by the bulletin board
|
||
*
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pCD - pointer to client data
|
||
* px - pointer to x-coord
|
||
* py - pointer to y-coord
|
||
* width - width of box
|
||
* height - height of box
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
* *px - new x-coord
|
||
* *py - new y-coord
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void PutBoxInIconBox (ClientData *pCD, int *px, int *py, unsigned int *width, unsigned int *height)
|
||
{
|
||
|
||
int i;
|
||
Arg getArgs[3];
|
||
Dimension bBoardWidth;
|
||
Dimension bBoardHeight;
|
||
|
||
int clipWidth;
|
||
int clipHeight;
|
||
|
||
|
||
i=0;
|
||
XtSetArg (getArgs[i], XmNwidth, (XtArgVal) &bBoardWidth ); i++;
|
||
XtSetArg (getArgs[i], XmNheight, (XtArgVal) &bBoardHeight ); i++;
|
||
XtGetValues (P_ICON_BOX(pCD)->bBoardWidget, getArgs, i);
|
||
|
||
clipWidth = (int) bBoardWidth;
|
||
clipHeight = (int) bBoardHeight;
|
||
|
||
if (*px + *width-1 > clipWidth)
|
||
*px -= (*px + *width-1) - clipWidth;
|
||
|
||
if (*py + *height-1 > clipHeight)
|
||
*py -= (*py + *height-1) - clipHeight;
|
||
|
||
if (*px < 0) *px = 0;
|
||
|
||
if (*py < 0) *py = 0;
|
||
|
||
|
||
} /* END OF FUNCTION PutBoxInIconBox */
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* CreateActiveIconTextWindow (pSD)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* creates the window that's popped up when an icon is activated
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pSD - pointer to screen data
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
|
||
void CreateActiveIconTextWindow (WmScreenData *pSD)
|
||
{
|
||
XSetWindowAttributes window_attribs;
|
||
unsigned long attr_mask;
|
||
|
||
/* create active icon text window */
|
||
attr_mask = CWEventMask| CWCursor;
|
||
window_attribs.event_mask = ExposureMask;
|
||
window_attribs.cursor = wmGD.workspaceCursor;
|
||
|
||
/*
|
||
* Use background pixmap if one is specified, otherwise set the
|
||
* appropriate background color.
|
||
*/
|
||
|
||
if (pSD->iconAppearance.activeBackgroundPixmap)
|
||
{
|
||
attr_mask |= CWBackPixmap;
|
||
window_attribs.background_pixmap =
|
||
pSD->iconAppearance.activeBackgroundPixmap;
|
||
}
|
||
else
|
||
{
|
||
attr_mask |= CWBackPixel;
|
||
window_attribs.background_pixel =
|
||
pSD->iconAppearance.activeBackground;
|
||
}
|
||
|
||
|
||
pSD->activeIconTextWin = XCreateWindow (DISPLAY,
|
||
pSD->rootWindow, /* parent */
|
||
0, 0, /* x, y */
|
||
1, 1, /* width, height */
|
||
0, /* border width */
|
||
CopyFromParent, /* depth */
|
||
InputOutput, /* class */
|
||
CopyFromParent, /* visual */
|
||
attr_mask,
|
||
&window_attribs);
|
||
|
||
|
||
pSD->activeLabelParent = pSD->rootWindow;
|
||
|
||
} /* END OF FUNCTION CreateActiveIconTextWindow */
|
||
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* PaintActiveIconText (pcd, erase)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
* pcd - pointer to client data
|
||
* erase - if true, then erase the area before repainting
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void PaintActiveIconText (ClientData *pcd, Boolean erase)
|
||
{
|
||
XRectangle textBox;
|
||
GC iconGC, topGC, botGC;
|
||
|
||
if (!(ICON_DECORATION(pcd) & ICON_ACTIVE_LABEL_PART))
|
||
return;
|
||
|
||
/* get appropriate GCs */
|
||
iconGC = ICON_APPEARANCE(pcd).activeGC;
|
||
topGC = ICON_APPEARANCE(pcd).activeTopShadowGC;
|
||
botGC = ICON_APPEARANCE(pcd).activeBottomShadowGC;
|
||
|
||
/* draw shadowing */
|
||
|
||
if (pActiveIconTopRects) {
|
||
XFillRectangles (DISPLAY,
|
||
pcd->pSD->activeIconTextWin,
|
||
topGC,
|
||
pActiveIconTopRects->prect,
|
||
pActiveIconTopRects->used);
|
||
}
|
||
|
||
if (pActiveIconBotRects) {
|
||
XFillRectangles (DISPLAY,
|
||
pcd->pSD->activeIconTextWin,
|
||
botGC,
|
||
pActiveIconBotRects->prect,
|
||
pActiveIconBotRects->used);
|
||
}
|
||
|
||
/* paint the text */
|
||
textBox.x = ICON_EXTERNAL_SHADOW_WIDTH;
|
||
textBox.y = ICON_EXTERNAL_SHADOW_WIDTH;
|
||
textBox.width = activeIconTextWidth - 2*ICON_EXTERNAL_SHADOW_WIDTH;
|
||
textBox.height = activeIconTextHeight - 2*ICON_EXTERNAL_SHADOW_WIDTH;
|
||
|
||
if (erase)
|
||
{
|
||
XClearArea (DISPLAY, pcd->pSD->activeIconTextWin, textBox.x, textBox.y,
|
||
(unsigned int) textBox.width,
|
||
(unsigned int) textBox.height,
|
||
FALSE);
|
||
}
|
||
|
||
WmDrawXmString(DISPLAY, pcd->pSD->activeIconTextWin,
|
||
ICON_APPEARANCE(pcd).fontList,
|
||
ICON_DISPLAY_TITLE(pcd), iconGC,
|
||
textBox.x, textBox.y, textBox.width, &textBox, True);
|
||
|
||
|
||
} /* END OF FUNCTION PaintActiveIconText */
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* ShowActiveIconText (pcd)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void ShowActiveIconText (ClientData *pcd)
|
||
{
|
||
XWindowAttributes iconFrameAttribs;
|
||
XSetWindowAttributes window_attribs;
|
||
XWindowChanges windowChanges;
|
||
unsigned int mask;
|
||
int x, y;
|
||
unsigned int junk;
|
||
Window root;
|
||
Dimension dWidth, dHeight;
|
||
|
||
|
||
/*
|
||
* put up a big icon text label
|
||
*/
|
||
if (pcd->pSD->activeIconTextWin) {
|
||
/* copy event mask from icon frame window */
|
||
XGetWindowAttributes (DISPLAY, ICON_FRAME_WIN(pcd), &iconFrameAttribs);
|
||
|
||
/* set attributes of window */
|
||
window_attribs.event_mask = iconFrameAttribs.your_event_mask;
|
||
XChangeWindowAttributes (DISPLAY, pcd->pSD->activeIconTextWin,
|
||
CWEventMask, &window_attribs);
|
||
|
||
/* set up geometry for the window */
|
||
|
||
XmStringExtent (ICON_APPEARANCE(pcd).fontList, ICON_DISPLAY_TITLE(pcd),
|
||
&dWidth, &dHeight);
|
||
|
||
activeIconTextHeight = (unsigned int) dHeight +
|
||
WM_BOTTOM_TITLE_PADDING +
|
||
2*ICON_EXTERNAL_SHADOW_WIDTH;
|
||
|
||
activeIconTextWidth = (unsigned int) dWidth;
|
||
|
||
if (activeIconTextWidth < (1.2 * ICON_WIDTH(pcd)))
|
||
{
|
||
activeIconTextWidth = 1.2 * ICON_WIDTH(pcd);
|
||
}
|
||
|
||
activeIconTextWidth += 2*ICON_EXTERNAL_SHADOW_WIDTH;
|
||
|
||
XGetGeometry (DISPLAY,
|
||
(Drawable) ICON_FRAME_WIN(pcd),
|
||
&root, &x, &y,
|
||
&junk, &junk, &junk, &junk);
|
||
|
||
|
||
y += ICON_IMAGE_HEIGHT(pcd);
|
||
x -= (activeIconTextWidth - ICON_WIDTH(pcd))/2;
|
||
|
||
|
||
|
||
if (!(P_ICON_BOX(pcd)))
|
||
{
|
||
/*
|
||
* This is a normal icon
|
||
*/
|
||
PutBoxOnScreen (SCREEN_FOR_CLIENT(pcd), &x, &y,
|
||
activeIconTextWidth, activeIconTextHeight);
|
||
if (ACTIVE_LABEL_PARENT(pcd) != root)
|
||
{
|
||
XReparentWindow(DISPLAY, pcd->pSD->activeIconTextWin ,
|
||
root, x, y );
|
||
ACTIVE_LABEL_PARENT(pcd) = root;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
/*
|
||
* This is an icon in an icon box
|
||
*/
|
||
x = x + IB_MARGIN_WIDTH;
|
||
y = y + IB_MARGIN_HEIGHT;
|
||
|
||
if(!(pcd->pSD->iconDecoration & ( ICON_LABEL_PART)))
|
||
{
|
||
y -= activeIconTextHeight;
|
||
}
|
||
|
||
PutBoxInIconBox (pcd, &x, &y,
|
||
&activeIconTextWidth, &activeIconTextHeight);
|
||
if (ACTIVE_LABEL_PARENT(pcd) != pcd->client)
|
||
{
|
||
XReparentWindow(DISPLAY, pcd->pSD->activeIconTextWin ,
|
||
XtWindow(P_ICON_BOX(pcd)->bBoardWidget),
|
||
x, y );
|
||
ACTIVE_LABEL_PARENT(pcd) = pcd->client;
|
||
}
|
||
}
|
||
|
||
|
||
mask = CWX | CWY | CWWidth | CWHeight;
|
||
windowChanges.x = x;
|
||
windowChanges.y = y;
|
||
windowChanges.width = activeIconTextWidth;
|
||
windowChanges.height = activeIconTextHeight;
|
||
XConfigureWindow (DISPLAY, pcd->pSD->activeIconTextWin, mask,
|
||
&windowChanges);
|
||
|
||
/* bevel the rectangle around the edges */
|
||
if ((pActiveIconTopRects && pActiveIconBotRects) ||
|
||
((pActiveIconTopRects =
|
||
AllocateRList((unsigned)4*ICON_EXTERNAL_SHADOW_WIDTH)) &&
|
||
(pActiveIconBotRects =
|
||
AllocateRList((unsigned)4*ICON_EXTERNAL_SHADOW_WIDTH))))
|
||
{
|
||
pActiveIconTopRects->used = 0;
|
||
pActiveIconBotRects->used = 0;
|
||
BevelRectangle (pActiveIconTopRects,
|
||
pActiveIconBotRects,
|
||
0, 0,
|
||
activeIconTextWidth,
|
||
activeIconTextHeight,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH,
|
||
ICON_EXTERNAL_SHADOW_WIDTH);
|
||
}
|
||
|
||
XMapRaised (DISPLAY, pcd->pSD->activeIconTextWin);
|
||
wmGD.activeIconTextDisplayed = True;
|
||
|
||
/* save context for this window */
|
||
XSaveContext (DISPLAY, pcd->pSD->activeIconTextWin,
|
||
wmGD.windowContextType, (caddr_t) pcd);
|
||
}
|
||
} /* END OF FUNCTION ShowActiveIconText */
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* HideActiveIconText ()
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
* Hides the big label shown over the active icon.
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void HideActiveIconText (WmScreenData *pSD)
|
||
{
|
||
|
||
|
||
if ((pSD && pSD->activeIconTextWin) || ACTIVE_ICON_TEXT_WIN)
|
||
{
|
||
/* disassociate the big label window with this client */
|
||
XDeleteContext (DISPLAY,
|
||
pSD
|
||
? pSD->activeIconTextWin
|
||
: ACTIVE_PSD->activeIconTextWin,
|
||
wmGD.windowContextType);
|
||
|
||
/* hide the big label */
|
||
XUnmapWindow (DISPLAY,
|
||
pSD
|
||
? pSD->activeIconTextWin
|
||
: ACTIVE_PSD->activeIconTextWin);
|
||
wmGD.activeIconTextDisplayed = False;
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************<->*************************************
|
||
*
|
||
* MoveActiveIconText (pcd)
|
||
*
|
||
*
|
||
* Description:
|
||
* -----------
|
||
*
|
||
*
|
||
* Inputs:
|
||
* ------
|
||
*
|
||
* Outputs:
|
||
* -------
|
||
*
|
||
*
|
||
* Comments:
|
||
* --------
|
||
*
|
||
*************************************<->***********************************/
|
||
void MoveActiveIconText (ClientData *pcd)
|
||
{
|
||
int x, y;
|
||
unsigned int junk;
|
||
Window root;
|
||
Dimension dWidth, dHeight;
|
||
|
||
|
||
/*
|
||
* put up a big icon text label
|
||
*/
|
||
if (pcd->pSD->activeIconTextWin && wmGD.activeIconTextDisplayed) {
|
||
/* set up geometry for the window */
|
||
|
||
XmStringExtent (ICON_APPEARANCE(pcd).fontList, ICON_DISPLAY_TITLE(pcd),
|
||
&dWidth, &dHeight);
|
||
|
||
activeIconTextHeight = (unsigned int) dHeight +
|
||
WM_BOTTOM_TITLE_PADDING +
|
||
2 * ICON_EXTERNAL_SHADOW_WIDTH;
|
||
|
||
activeIconTextWidth = (unsigned int) dWidth;
|
||
|
||
if (activeIconTextWidth < (1.2 * ICON_WIDTH(pcd)))
|
||
{
|
||
activeIconTextWidth = 1.2 * ICON_WIDTH(pcd);
|
||
}
|
||
|
||
activeIconTextWidth += 2 * ICON_EXTERNAL_SHADOW_WIDTH;
|
||
|
||
XGetGeometry (DISPLAY,
|
||
(Drawable) ICON_FRAME_WIN(pcd),
|
||
&root, &x, &y,
|
||
&junk, &junk, &junk, &junk);
|
||
|
||
|
||
y += ICON_IMAGE_HEIGHT(pcd);
|
||
x -= (activeIconTextWidth - ICON_WIDTH(pcd))/2;
|
||
|
||
if (!(P_ICON_BOX(pcd)))
|
||
{
|
||
/* This is a normal icon */
|
||
PutBoxOnScreen (SCREEN_FOR_CLIENT(pcd), &x, &y,
|
||
activeIconTextWidth, activeIconTextHeight);
|
||
}
|
||
else
|
||
{
|
||
/* icon box */
|
||
x = x + IB_MARGIN_WIDTH;
|
||
y = y + IB_MARGIN_HEIGHT;
|
||
|
||
if(!(pcd->pSD->iconDecoration & ( ICON_LABEL_PART)))
|
||
{
|
||
y -= activeIconTextHeight;
|
||
}
|
||
|
||
PutBoxInIconBox (pcd, &x, &y,
|
||
&activeIconTextWidth, &activeIconTextHeight);
|
||
}
|
||
|
||
XMoveWindow(DISPLAY, pcd->pSD->activeIconTextWin, x, y );
|
||
|
||
}
|
||
} /* END OF FUNCTION MoveActiveIconText */
|
||
|
||
|