Blame clients/mwm/WmCDInfo.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * Motif Release 1.2.3
Packit b099d7
*/ 
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: WmCDInfo.c /main/4 1995/11/01 11:32:15 rswiston $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
 * (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Included Files:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmGlobal.h"
Packit b099d7
#include "WmCDInfo.h"
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int TitleTextHeight (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the height of the title text plus padding
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  TitleTextHeight	-  Height of title text plus padding
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int TitleTextHeight (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int ttextheight;
Packit b099d7
Packit b099d7
#ifndef NO_MULTIBYTE
Packit b099d7
    if (DECOUPLE_TITLE_APPEARANCE(pcd))
Packit b099d7
    {
Packit b099d7
	ttextheight = CLIENT_TITLE_APPEARANCE(pcd).titleHeight;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	ttextheight = CLIENT_APPEARANCE(pcd).titleHeight;
Packit b099d7
    }
Packit b099d7
#else
Packit b099d7
Packit b099d7
    XFontStruct	*font;
Packit b099d7
Packit b099d7
    if (DECOUPLE_TITLE_APPEARANCE(pcd))
Packit b099d7
    {
Packit b099d7
	font = CLIENT_TITLE_APPEARANCE(pcd).font;
Packit b099d7
    }
Packit b099d7
    else 
Packit b099d7
    {
Packit b099d7
	font = CLIENT_APPEARANCE(pcd).font;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (font)
Packit b099d7
    {
Packit b099d7
	ttextheight = TEXT_HEIGHT(font) + WM_TITLE_BAR_PADDING;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/* 
Packit b099d7
	 * Failed to load any font! (probably due to error in 
Packit b099d7
	 * font path, toolkit, or resource converter. Set to
Packit b099d7
	 * arbitrary value for robustness.
Packit b099d7
	 *
Packit b099d7
	 */
Packit b099d7
	ttextheight = 16; 
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
    return (ttextheight);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int InitTitleBarHeight (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Used to initialize pCD->frameInfo.titleBarHeight which is used by the new
Packit b099d7
 *  macro TitleBarHeight().  Returns the height of the title bar.
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  InitTitleBarHeight	-  height of title bar, 0 if no title bar.
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int InitTitleBarHeight (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int tbarheight;
Packit b099d7
Packit b099d7
    if (pcd->decor & MWM_DECOR_TITLE)
Packit b099d7
    {
Packit b099d7
	tbarheight = TitleTextHeight(pcd);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	tbarheight = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (tbarheight);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int UpperBorderWidth (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the width of the upper frame border
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  UpperBorderWidth	- width of the upper frame border
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  The upper border width is thinner if there is a title bar. The
Packit b099d7
 *  title bar appears to sit across some of the inside beveling to
Packit b099d7
 *  make the frame look more integrated.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int UpperBorderWidth (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int uswidth;
Packit b099d7
    unsigned int decoration = pcd->decor;
Packit b099d7
Packit b099d7
    if (decoration & MWM_DECOR_RESIZEH)
Packit b099d7
    {
Packit b099d7
	uswidth = RESIZE_BORDER_WIDTH(pcd);
Packit b099d7
    }
Packit b099d7
    else if (decoration & MWM_DECOR_BORDER)
Packit b099d7
    {
Packit b099d7
	uswidth = FRAME_BORDER_WIDTH(pcd);
Packit b099d7
#ifdef PANELIST
Packit b099d7
	if((pcd->clientFlags & FRONT_PANEL_BOX) &&
Packit b099d7
	   (uswidth > 0))
Packit b099d7
	{
Packit b099d7
	    uswidth -= 1;
Packit b099d7
	}
Packit b099d7
#endif /* PANELIST */
Packit b099d7
    }
Packit b099d7
    else if ((decoration & MWM_DECOR_TITLE) ||
Packit b099d7
	     (pcd->matteWidth > 0))
Packit b099d7
    {
Packit b099d7
	uswidth = 0;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	uswidth = pcd->xBorderWidth;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (uswidth);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int LowerBorderWidth (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the width of the lower frame border
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  LowerBorderWidth	- width of the lower frame border
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  The upper border width is thinner than the lower border if there 
Packit b099d7
 *  is a title bar. The title bar appears to sit across some of the 
Packit b099d7
 *  inside beveling to make the frame look more integrated.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int LowerBorderWidth (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int lswidth;
Packit b099d7
    unsigned int decoration = pcd->decor;
Packit b099d7
Packit b099d7
    if (decoration & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER))
Packit b099d7
    {
Packit b099d7
	if ((pcd->matteWidth == 0) && (decoration & MWM_DECOR_TITLE) &&
Packit b099d7
		(wmGD.frameStyle == WmRECESSED))
Packit b099d7
	    lswidth = UpperBorderWidth (pcd) + 
Packit b099d7
		      (pcd->internalBevel - JOIN_BEVEL(pcd));
Packit b099d7
	else
Packit b099d7
	    lswidth = UpperBorderWidth (pcd);
Packit b099d7
    }
Packit b099d7
    else if (pcd->matteWidth > 0)
Packit b099d7
    {
Packit b099d7
	lswidth = 0;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	lswidth = pcd->xBorderWidth;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (lswidth);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int FrameWidth (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the width of the frame
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  FrameWidth	- width of frame
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int FrameWidth (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int frameWidth;
Packit b099d7
Packit b099d7
    frameWidth = ((pcd->maxConfig) ? pcd->maxWidth : pcd->clientWidth) +
Packit b099d7
		  2*pcd->matteWidth + 2*LowerBorderWidth (pcd);
Packit b099d7
Packit b099d7
    return (frameWidth);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int CornerWidth (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the width of the corner frame resize handle
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  CornerWidth	- width of the corner resize handle
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int CornerWidth (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int cwidth;
Packit b099d7
    unsigned int frameWidth = FrameWidth (pcd);
Packit b099d7
Packit b099d7
    /* adjust for resize border (default border if no resize wanted) */
Packit b099d7
    if (pcd->decor & MWM_DECOR_RESIZEH)
Packit b099d7
    {
Packit b099d7
	/* corner size is driven by title bar height */
Packit b099d7
	cwidth = TitleTextHeight(pcd) + UpperBorderWidth (pcd);
Packit b099d7
Packit b099d7
	/* scale down corners to make resize pieces proportional */
Packit b099d7
	if (3*cwidth > frameWidth) cwidth = frameWidth / 3;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	/* no resizing functions */
Packit b099d7
	cwidth = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (cwidth);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int FrameHeight (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the height of the frame
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  FrameHeight	-  position of frame
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int FrameHeight (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int frameHeight;
Packit b099d7
Packit b099d7
    if (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER))
Packit b099d7
    {
Packit b099d7
	frameHeight = ((pcd->maxConfig) ? 
Packit b099d7
			  pcd->maxHeight : pcd->clientHeight) +
Packit b099d7
		      2*pcd->matteWidth + LowerBorderWidth (pcd) + 
Packit b099d7
		      UpperBorderWidth (pcd) + TitleBarHeight(pcd);
Packit b099d7
    }
Packit b099d7
    else 
Packit b099d7
    {
Packit b099d7
	frameHeight = ((pcd->maxConfig) ? 
Packit b099d7
			  pcd->maxHeight : pcd->clientHeight) +
Packit b099d7
		      2*pcd->matteWidth + 2*LowerBorderWidth (pcd) + 
Packit b099d7
		      TitleBarHeight(pcd);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (frameHeight);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int CornerHeight (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the height of the corner frame resize handle
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  CornerHeight	- Height of the corner resize handle
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int CornerHeight (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int cheight;
Packit b099d7
    unsigned int frameHeight = FrameHeight (pcd);
Packit b099d7
Packit b099d7
    /* adjust for resize border (default border if no resize wanted) */
Packit b099d7
    if (pcd->decor & MWM_DECOR_RESIZEH)
Packit b099d7
    {
Packit b099d7
	/* corner size is driven by title bar height */
Packit b099d7
	cheight = TitleTextHeight(pcd) + UpperBorderWidth (pcd);
Packit b099d7
Packit b099d7
	/* scale down corners to make resize pieces proportional */
Packit b099d7
	if (3*cheight > frameHeight) cheight = frameHeight / 3;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	/* produce default border with no resizing functions */
Packit b099d7
	cheight = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (cheight);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  int BaseWindowX (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the X coord of the base window in the frame
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  BaseWindowX
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
int BaseWindowX (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    int rval;
Packit b099d7
Packit b099d7
    if (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER))
Packit b099d7
	rval = LowerBorderWidth(pcd);
Packit b099d7
    else
Packit b099d7
	rval = 0;
Packit b099d7
    
Packit b099d7
    return (rval);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  int BaseWindowY (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the Y coord of the base window in the frame
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  BaseWindowY
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
int BaseWindowY (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    int rval;
Packit b099d7
Packit b099d7
    if (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER))
Packit b099d7
	rval = UpperBorderWidth (pcd) + TitleBarHeight(pcd);
Packit b099d7
    else
Packit b099d7
	rval = TitleBarHeight(pcd);
Packit b099d7
    
Packit b099d7
    return (rval);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  int FrameX (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the X-coordinate of the frame for the window
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  FrameX		- X position of frame
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
int FrameX (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    int frameX;
Packit b099d7
Packit b099d7
    frameX = ((pcd->maxConfig) ? pcd->maxX : pcd->clientX)
Packit b099d7
	     - LowerBorderWidth (pcd)  - pcd->matteWidth;
Packit b099d7
Packit b099d7
    return (frameX);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  int FrameY (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the Y-coordinate of the frame for the window
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  FrameY		- Y position of frame
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
int FrameY (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    int frameY;
Packit b099d7
Packit b099d7
    frameY = ((pcd->maxConfig) ? pcd->maxY : pcd->clientY) 
Packit b099d7
	 - UpperBorderWidth (pcd) 
Packit b099d7
	 - TitleBarHeight (pcd) - pcd->matteWidth;
Packit b099d7
Packit b099d7
    if ((pcd->decor & MWM_DECOR_TITLE) && 
Packit b099d7
	!(pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER)) &&
Packit b099d7
	!(pcd->matteWidth))
Packit b099d7
    {
Packit b099d7
	frameY -= pcd->xBorderWidth;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (frameY);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int BaseWindowWidth (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the width of the base window 
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  BaseWindowWidth
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  o Based on code taken out of FrameWidth to make it a little 
Packit b099d7
 *    more efficient.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int BaseWindowWidth (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int rval;
Packit b099d7
Packit b099d7
    if (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 *  rval = FrameWidth(pcd) - 2*LowerBorderWidth(pcd);
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	rval = ((pcd->maxConfig) ? pcd->maxWidth : pcd->clientWidth) +
Packit b099d7
		  2*pcd->matteWidth;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 *  rval = FrameWidth(pcd);
Packit b099d7
	 */
Packit b099d7
	rval = ((pcd->maxConfig) ? pcd->maxWidth : pcd->clientWidth) +
Packit b099d7
		  2*pcd->matteWidth + 2*LowerBorderWidth (pcd);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return (rval);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  unsigned int BaseWindowHeight (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns the height of the base window 
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd			- pointer to client data record
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  BaseWindowHeight
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  o Based on code taken out of FrameHeight to make it a little 
Packit b099d7
 *    more efficient.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
unsigned int BaseWindowHeight (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    unsigned int rval;
Packit b099d7
Packit b099d7
    if (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER))
Packit b099d7
    {
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 *  rval = FrameHeight(pcd) - LowerBorderWidth(pcd) - 
Packit b099d7
	 *             UpperBorderWidth(pcd) - TitleBarHeight(pcd);
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	rval = ((pcd->maxConfig) ? pcd->maxHeight : pcd->clientHeight) +
Packit b099d7
		      2*pcd->matteWidth;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/* 
Packit b099d7
	 *  rval = FrameHeight(pcd) - TitleBarHeight(pcd); 
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	rval = ((pcd->maxConfig) ? pcd->maxHeight : pcd->clientHeight) +
Packit b099d7
		      2*pcd->matteWidth + 2*LowerBorderWidth (pcd);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return (rval);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Boolean GetFramePartInfo (pcd, part, pX, pY, pWidth, pHeight)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Gets frame relative position and size of the specified frame part
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 *  part	- part id (e.g. FRAME_TITLE, FRAME_SYSTEM, etc.)
Packit b099d7
 *  pX		- pointer to x-coord return value
Packit b099d7
 *  pY		- pointer to y-coord return value
Packit b099d7
 *  pWidth	- pointer to width return value
Packit b099d7
 *  pHeight	- pointer to width return value
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return 	- True if values returned, false if no such part for this
Packit b099d7
 * 		  frame (values undefined).
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Boolean GetFramePartInfo (ClientData *pcd, int part, int *pX, int *pY, unsigned int *pWidth, unsigned int *pHeight)
Packit b099d7
{
Packit b099d7
    unsigned int boxdim = TitleBarHeight (pcd);
Packit b099d7
    unsigned long decor = pcd->decor;
Packit b099d7
    int vert, horiz;
Packit b099d7
    Boolean rval = FALSE;
Packit b099d7
    
Packit b099d7
    switch (part) 
Packit b099d7
    {
Packit b099d7
	case FRAME_SYSTEM:
Packit b099d7
		if (decor & MWM_DECOR_MENU) {
Packit b099d7
		    *pX = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pY = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pWidth = boxdim;
Packit b099d7
		    *pHeight = boxdim;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	case FRAME_TITLE:
Packit b099d7
		if (decor & MWM_DECOR_TITLE) {
Packit b099d7
		    *pX = pcd->frameInfo.upperBorderWidth + 
Packit b099d7
			    ((decor & MWM_DECOR_MENU) ? boxdim : 0);
Packit b099d7
		    *pY = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pWidth = pcd->frameInfo.width - 
Packit b099d7
			    2*pcd->frameInfo.upperBorderWidth - 
Packit b099d7
			    ((decor & MWM_DECOR_MENU) ? boxdim : 0) -
Packit b099d7
			    ((decor & MWM_DECOR_MINIMIZE) ? boxdim : 0) -
Packit b099d7
			    ((decor & MWM_DECOR_MAXIMIZE) ? boxdim : 0);
Packit b099d7
		    *pHeight = boxdim;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
#ifdef WSM
Packit b099d7
Packit b099d7
	case FRAME_TITLEBAR:
Packit b099d7
		if (decor & MWM_DECOR_TITLE) {
Packit b099d7
		    *pX = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pY = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pWidth = pcd->frameInfo.width - 
Packit b099d7
			    2*pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pHeight = boxdim;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
	case FRAME_MINIMIZE:
Packit b099d7
		if (decor & MWM_DECOR_MINIMIZE) {
Packit b099d7
		    *pX = pcd->frameInfo.width - 
Packit b099d7
			    pcd->frameInfo.upperBorderWidth - boxdim -
Packit b099d7
			    ((decor & MWM_DECOR_MAXIMIZE) ? boxdim : 0);
Packit b099d7
		    *pY = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pWidth= boxdim;
Packit b099d7
		    *pHeight = boxdim;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	case FRAME_MAXIMIZE:
Packit b099d7
		if (decor & MWM_DECOR_MAXIMIZE) {
Packit b099d7
		    *pX = pcd->frameInfo.width - 
Packit b099d7
			    pcd->frameInfo.upperBorderWidth - boxdim;
Packit b099d7
		    *pY = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    *pWidth = boxdim;
Packit b099d7
		    *pHeight = boxdim;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * For very small windows, the resize pieces will shrink
Packit b099d7
	 * equally until the corner pieces get within two pixels
Packit b099d7
	 * of the resize border width. At this point the "side" section
Packit b099d7
	 * is killed off (by giving it a zero length) and the corner
Packit b099d7
	 * pieces claim the additional space
Packit b099d7
	 */
Packit b099d7
	case FRAME_RESIZE_NW:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    *pX = 0;
Packit b099d7
		    *pY = 0;
Packit b099d7
Packit b099d7
		    if ((int)pcd->frameInfo.cornerWidth > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			horiz = pcd->frameInfo.width - 
Packit b099d7
				2*pcd->frameInfo.cornerWidth;
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth + 
Packit b099d7
				horiz/2 + horiz%2;
Packit b099d7
		    }
Packit b099d7
Packit b099d7
		    if ((int)pcd->frameInfo.cornerHeight > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			vert = pcd->frameInfo.height - 
Packit b099d7
				2*pcd->frameInfo.cornerHeight;
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight + 
Packit b099d7
				vert/2 + vert%2;
Packit b099d7
		    }
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	case FRAME_RESIZE_N:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    *pX = pcd->frameInfo.cornerWidth;
Packit b099d7
		    *pY = 0;
Packit b099d7
		    *pHeight = pcd->frameInfo.upperBorderWidth;
Packit b099d7
		    if ((int)pcd->frameInfo.cornerWidth > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pWidth = pcd->frameInfo.width - 
Packit b099d7
				2*pcd->frameInfo.cornerWidth;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			*pWidth = 0;
Packit b099d7
		    }
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	case FRAME_RESIZE_NE:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    if ((int)pcd->frameInfo.cornerWidth > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			horiz = pcd->frameInfo.width - 
Packit b099d7
			    2*pcd->frameInfo.cornerWidth;
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth + horiz/2;
Packit b099d7
		    }
Packit b099d7
		    *pX = pcd->frameInfo.width - *pWidth;
Packit b099d7
Packit b099d7
		    if ((int)pcd->frameInfo.cornerHeight > 
Packit b099d7
			   (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			vert = pcd->frameInfo.height - 
Packit b099d7
				2*pcd->frameInfo.cornerHeight;
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight + 
Packit b099d7
				vert/2 + vert%2;
Packit b099d7
		    }
Packit b099d7
		    *pY = 0;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	case FRAME_RESIZE_E:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    *pX = pcd->frameInfo.width - 
Packit b099d7
		            pcd->frameInfo.lowerBorderWidth;
Packit b099d7
		    *pY = pcd->frameInfo.cornerHeight;
Packit b099d7
		    *pWidth = pcd->frameInfo.lowerBorderWidth;
Packit b099d7
		    if ((int)pcd->frameInfo.cornerHeight > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pHeight = pcd->frameInfo.height - 
Packit b099d7
				2*pcd->frameInfo.cornerHeight;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			*pHeight = 0;
Packit b099d7
		    }
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	case FRAME_RESIZE_SE:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    if ((int)pcd->frameInfo.cornerWidth > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			horiz = pcd->frameInfo.width - 
Packit b099d7
				2*pcd->frameInfo.cornerWidth;
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth + horiz/2;
Packit b099d7
		    }
Packit b099d7
		    *pX = pcd->frameInfo.width - *pWidth;
Packit b099d7
Packit b099d7
		    if ((int)pcd->frameInfo.cornerHeight > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			vert = pcd->frameInfo.height - 
Packit b099d7
				2*pcd->frameInfo.cornerHeight;
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight + vert/2;
Packit b099d7
		    }
Packit b099d7
		    *pY = pcd->frameInfo.height - *pHeight;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	case FRAME_RESIZE_S:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    *pX = pcd->frameInfo.cornerWidth;
Packit b099d7
		    *pY = pcd->frameInfo.height - 
Packit b099d7
			    pcd->frameInfo.lowerBorderWidth;
Packit b099d7
		    if ((int)pcd->frameInfo.cornerWidth > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pWidth = pcd->frameInfo.width - 
Packit b099d7
				2*pcd->frameInfo.cornerWidth;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			*pWidth = 0;
Packit b099d7
		    }
Packit b099d7
		    *pHeight = pcd->frameInfo.lowerBorderWidth;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	case FRAME_RESIZE_SW:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    if ((int)pcd->frameInfo.cornerWidth > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			horiz = pcd->frameInfo.width - 
Packit b099d7
			        2*pcd->frameInfo.cornerWidth;
Packit b099d7
			*pWidth = pcd->frameInfo.cornerWidth + 
Packit b099d7
				horiz/2 + horiz%2;
Packit b099d7
		    }
Packit b099d7
		    *pX = 0;
Packit b099d7
Packit b099d7
		    if ((int)pcd->frameInfo.cornerHeight > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			vert = pcd->frameInfo.height - 
Packit b099d7
				2*pcd->frameInfo.cornerHeight;
Packit b099d7
			*pHeight = pcd->frameInfo.cornerHeight + vert/2;
Packit b099d7
		    }
Packit b099d7
		    *pY = pcd->frameInfo.height - *pHeight;
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	case FRAME_RESIZE_W:
Packit b099d7
		if (decor & MWM_DECOR_RESIZEH) {
Packit b099d7
		    *pX = 0;
Packit b099d7
		    *pY = pcd->frameInfo.cornerHeight;
Packit b099d7
		    *pWidth = pcd->frameInfo.lowerBorderWidth;
Packit b099d7
		    if ((int)pcd->frameInfo.cornerHeight > 
Packit b099d7
			    (int)pcd->frameInfo.lowerBorderWidth+2) {
Packit b099d7
			*pHeight = pcd->frameInfo.height - 
Packit b099d7
				2*pcd->frameInfo.cornerHeight;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			*pHeight = 0;
Packit b099d7
		    }
Packit b099d7
		    rval = TRUE;
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    
Packit b099d7
	default:
Packit b099d7
		break;
Packit b099d7
    }
Packit b099d7
    return(rval);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  IdentifyFramePart (pCD, x, y)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns an ID representing which part of the frame received the event
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD		- pointer to client data
Packit b099d7
 *
Packit b099d7
 *  x, y	- client coordinates of event
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return 	- ID of frame part where the button event occurred.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
int IdentifyFramePart (ClientData *pCD, int x, int y)
Packit b099d7
{
Packit b099d7
    unsigned long decor = pCD->decor;
Packit b099d7
    int clientWidth = (pCD->maxConfig) ? pCD->maxWidth : pCD->clientWidth;
Packit b099d7
    int clientHeight= (pCD->maxConfig) ? pCD->maxHeight : pCD->clientHeight;
Packit b099d7
    int rval;
Packit b099d7
Packit b099d7
Packit b099d7
    /* check for client window */
Packit b099d7
Packit b099d7
    if ( (x >= pCD->clientOffset.x) &&
Packit b099d7
	 (x <  pCD->clientOffset.x + clientWidth) &&
Packit b099d7
	 (y >= pCD->clientOffset.y) &&
Packit b099d7
	 (y <  pCD->clientOffset.y + clientHeight) )
Packit b099d7
    {
Packit b099d7
	return (FRAME_CLIENT);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /* check for client matte */
Packit b099d7
Packit b099d7
    if (pCD->matteWidth)
Packit b099d7
    {
Packit b099d7
	if ( (x >= pCD->matteRectangle.x) &&
Packit b099d7
	     (x <  (int)pCD->matteRectangle.x + (int)pCD->matteRectangle.width) &&
Packit b099d7
	     (y >= pCD->matteRectangle.y) &&
Packit b099d7
	     (y <  (int)pCD->matteRectangle.y + (int)pCD->matteRectangle.height) )
Packit b099d7
	{
Packit b099d7
	    return (FRAME_MATTE);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /* check title bar */
Packit b099d7
Packit b099d7
    if (decor & MWM_DECOR_TITLE)
Packit b099d7
    {
Packit b099d7
	if ( (x >= pCD->titleRectangle.x) &&
Packit b099d7
	     (x <  (int)pCD->titleRectangle.x + (int)pCD->titleRectangle.width) &&
Packit b099d7
	     (y >= pCD->titleRectangle.y) &&
Packit b099d7
	     (y <  (int)pCD->titleRectangle.y + (int)pCD->titleRectangle.height) )
Packit b099d7
	{
Packit b099d7
	    return(GadgetID(x, y, pCD->pTitleGadgets, 
Packit b099d7
			    (unsigned int)pCD->cTitleGadgets));
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /* try resize border */
Packit b099d7
Packit b099d7
    if (decor & MWM_DECOR_RESIZEH)
Packit b099d7
    {
Packit b099d7
	rval = GadgetID(x, y, pCD->pResizeGadgets, STRETCH_COUNT);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	rval = FRAME_NONE;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /* if not a resize border, but still in bounds return FRAME_NBORDER */
Packit b099d7
Packit b099d7
    if (rval == FRAME_NONE)
Packit b099d7
    {
Packit b099d7
	if ((x >= 0) && (y >= 0) &&
Packit b099d7
	    (x < FrameWidth (pCD)) && (y < FrameHeight (pCD))) 
Packit b099d7
	{
Packit b099d7
	    rval = FRAME_NBORDER;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (rval);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION IdentifyFramePart */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GadgetID (x, y, pgadget, count)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  returns the id of the gadget in the list that the event occured in
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  x		- x coordinate of event
Packit b099d7
 *  y		- y coordinate of event
Packit b099d7
 *  pgadget	- pointer to a list of GadgetRectangles
Packit b099d7
 *  count	- number of elements in the pgadget list
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return 	- ID of gadget if found, FRAME_NONE if not found
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
int GadgetID (int x, int y, GadgetRectangle *pgadget, unsigned int count)
Packit b099d7
{
Packit b099d7
    int ix;
Packit b099d7
Packit b099d7
    for (ix = 0; ix < count; ix++, pgadget++) {
Packit b099d7
	if ( (x >= pgadget->rect.x) &&
Packit b099d7
	     (x <  (int)pgadget->rect.x + (int)pgadget->rect.width) &&
Packit b099d7
	     (y >= pgadget->rect.y) &&
Packit b099d7
	     (y <  (int)pgadget->rect.y + (int)pgadget->rect.height) ) {
Packit b099d7
	    return ((unsigned long) pgadget->id);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    return(FRAME_NONE);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  FrameToClient (pcd, pX, pY, pWidth, pHeight)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Converts frame position and size to client position and size
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 *  pX		- pointer to frame x-coord
Packit b099d7
 *  pY		- pointer to frame y-coord
Packit b099d7
 *  pWidth	- pointer to frame width in pixels
Packit b099d7
 *  pHeight	- pointer to frame height in pixels
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  *pX		- client x-coord
Packit b099d7
 *  *pY		- client y-coord
Packit b099d7
 *  *pWidth	- client width in pixels
Packit b099d7
 *  *pHeight	- client height in pixels
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void FrameToClient (ClientData *pcd, int *pX, int *pY, unsigned int *pWidth, unsigned int *pHeight)
Packit b099d7
{
Packit b099d7
    /* compute client window coordinates from frame coordinates */
Packit b099d7
Packit b099d7
    *pWidth = *pWidth - 2*pcd->clientOffset.x; 
Packit b099d7
    *pHeight = *pHeight - pcd->clientOffset.x - pcd->clientOffset.y; 
Packit b099d7
    *pX =  *pX + pcd->clientOffset.x;
Packit b099d7
    *pY =  *pY + pcd->clientOffset.y;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ClientToFrame (pcd, pX, pY, pWidth, pHeight)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Converts frame position and size to client position and size
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 *  pX		- client x-coord
Packit b099d7
 *  pY 		- client y-coord
Packit b099d7
 *  pWidth	- client width in pixels
Packit b099d7
 *  pHeight	- client height in pixels
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  *pX		- frame x-coord
Packit b099d7
 *  *pY		- frame y-coord
Packit b099d7
 *  *pWidth	- frame width in pixels
Packit b099d7
 *  *pHeight	- frame height in pixels
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void ClientToFrame (ClientData *pcd, int *pX, int *pY, unsigned int *pWidth, unsigned int *pHeight)
Packit b099d7
{
Packit b099d7
    /* compute client window coordinates from frame coordinates */
Packit b099d7
    *pWidth = *pWidth + 2*pcd->clientOffset.x;
Packit b099d7
    *pHeight = *pHeight + pcd->clientOffset.x + pcd->clientOffset.y;
Packit b099d7
    *pX = *pX - pcd->clientOffset.x;
Packit b099d7
    *pY = *pY - pcd->clientOffset.y;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Boolean GetDepressInfo (pcd, part, pX, pY, pWidth, pHeight)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Gets frame relative position, size, and width of the beveling 
Packit b099d7
 *  to show the gadget in its depressed state.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 *  part	- part id (e.g. FRAME_TITLE, FRAME_SYSTEM, etc.)
Packit b099d7
 *  pX		- pointer to x-coord return value
Packit b099d7
 *  pY		- pointer to y-coord return value
Packit b099d7
 *  pWidth	- pointer to width return value
Packit b099d7
 *  pHeight	- pointer to width return value
Packit b099d7
 *  pInverWidth	- pointer to inversion width return value
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return 	- True if values returned, false if no such part for this
Packit b099d7
 * 		  frame (values undefined).
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  o The "part" must be a title bar gadget.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Boolean GetDepressInfo (ClientData *pcd, int part, int *pX, int *pY, unsigned int *pWidth, unsigned int *pHeight, unsigned int *pInvertWidth)
Packit b099d7
{
Packit b099d7
    Boolean rval;
Packit b099d7
    unsigned int exBevel, eBevel;
Packit b099d7
    unsigned int wBevel, sBevel;
Packit b099d7
    unsigned int insideBevel, meBevel;
Packit b099d7
    unsigned int decoration = pcd->decor;
Packit b099d7
    unsigned int tmp;
Packit b099d7
Packit b099d7
    switch (part)
Packit b099d7
    {
Packit b099d7
	case FRAME_SYSTEM:
Packit b099d7
	case FRAME_TITLE:
Packit b099d7
	case FRAME_MINIMIZE:
Packit b099d7
	case FRAME_MAXIMIZE:
Packit b099d7
	    if ((rval = GetFramePartInfo (pcd, part, pX, pY, pWidth, pHeight)))
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * set bevel width based on join bevel
Packit b099d7
		 */
Packit b099d7
		*pInvertWidth = 1 + (JOIN_BEVEL(pcd) / 2);
Packit b099d7
		
Packit b099d7
		/* bevel between title and client (or matte) */
Packit b099d7
		insideBevel = (pcd->matteWidth > 0) ?  JOIN_BEVEL(pcd) : 
Packit b099d7
						   pcd->internalBevel;
Packit b099d7
Packit b099d7
Packit b099d7
		/*
Packit b099d7
		 * Compute beveling around the title area of the
Packit b099d7
		 * title bar.
Packit b099d7
		 */
Packit b099d7
		if (decoration & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER))
Packit b099d7
		{
Packit b099d7
		    exBevel = JOIN_BEVEL(pcd);	/* north side */
Packit b099d7
		    sBevel = insideBevel;		/* south side */
Packit b099d7
		    eBevel = JOIN_BEVEL(pcd);	/* east side */
Packit b099d7
		    wBevel = JOIN_BEVEL(pcd);	/* west side */
Packit b099d7
		    meBevel = JOIN_BEVEL(pcd);	/* east of Min */
Packit b099d7
		}
Packit b099d7
		else 
Packit b099d7
		{
Packit b099d7
		    /* borderless window */
Packit b099d7
Packit b099d7
		    exBevel = EXTERNAL_BEVEL(pcd);
Packit b099d7
Packit b099d7
		    sBevel = (pcd->matteWidth > 0) ? insideBevel : 
Packit b099d7
						      EXTERNAL_BEVEL(pcd);
Packit b099d7
Packit b099d7
		    eBevel = (decoration & (MWM_DECOR_MINIMIZE | 
Packit b099d7
						 MWM_DECOR_MAXIMIZE))?
Packit b099d7
				      JOIN_BEVEL(pcd) : EXTERNAL_BEVEL(pcd);
Packit b099d7
Packit b099d7
		    wBevel = (decoration & MWM_DECOR_MENU) ?
Packit b099d7
				      JOIN_BEVEL(pcd) : EXTERNAL_BEVEL(pcd);
Packit b099d7
Packit b099d7
		    meBevel = (decoration & (MWM_DECOR_MAXIMIZE)) ?
Packit b099d7
				      JOIN_BEVEL(pcd) : EXTERNAL_BEVEL(pcd);
Packit b099d7
		}
Packit b099d7
Packit b099d7
		/*
Packit b099d7
		 * Adjust height of all title bar gadgets if necessary.
Packit b099d7
		 * (The bottom bevel is the same for all the pieces.)
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		if (sBevel > *pInvertWidth)
Packit b099d7
		{
Packit b099d7
		    *pHeight -= (sBevel - *pInvertWidth);
Packit b099d7
		}
Packit b099d7
Packit b099d7
		/*
Packit b099d7
		 * Adjust the beveling on the other sides of the 
Packit b099d7
		 * gadgets.
Packit b099d7
		 */
Packit b099d7
		switch (part)
Packit b099d7
		{
Packit b099d7
		    case FRAME_SYSTEM:
Packit b099d7
			/* west and north sides */
Packit b099d7
			if (exBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    tmp = exBevel - *pInvertWidth;
Packit b099d7
			    *pX += tmp;
Packit b099d7
			    *pWidth -= tmp;
Packit b099d7
			    *pY += tmp;
Packit b099d7
			    *pHeight -= tmp;
Packit b099d7
			}
Packit b099d7
Packit b099d7
			/* east side */
Packit b099d7
			if (wBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    *pWidth -= (wBevel - *pInvertWidth);
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		    case FRAME_TITLE:
Packit b099d7
			/* west side */
Packit b099d7
			if (wBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    tmp = wBevel - *pInvertWidth;
Packit b099d7
			    *pX += tmp;
Packit b099d7
			    *pWidth -= tmp;
Packit b099d7
			}
Packit b099d7
Packit b099d7
			/* north side */
Packit b099d7
			if (exBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    tmp = exBevel - *pInvertWidth;
Packit b099d7
			    *pY += tmp;
Packit b099d7
			    *pHeight -= tmp;
Packit b099d7
			}
Packit b099d7
Packit b099d7
			/* east side */
Packit b099d7
			if (eBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    *pWidth -= eBevel - *pInvertWidth;
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		    case FRAME_MINIMIZE:
Packit b099d7
			/* north side */
Packit b099d7
			if (exBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    tmp = exBevel - *pInvertWidth;
Packit b099d7
			    *pY += tmp;
Packit b099d7
			    *pHeight -= tmp;
Packit b099d7
			}
Packit b099d7
Packit b099d7
			/* west side */
Packit b099d7
			if (eBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    tmp = eBevel - *pInvertWidth;
Packit b099d7
			    *pX += tmp;
Packit b099d7
			    *pWidth -= tmp;
Packit b099d7
			}
Packit b099d7
Packit b099d7
			/* east side */
Packit b099d7
			if (meBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    *pWidth -= meBevel - *pInvertWidth;
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		    case FRAME_MAXIMIZE:
Packit b099d7
			/* north and east sides */
Packit b099d7
			if (exBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    tmp = exBevel - *pInvertWidth;
Packit b099d7
			    *pY += tmp;
Packit b099d7
			    *pHeight -= tmp;
Packit b099d7
			    *pWidth -= tmp;
Packit b099d7
			}
Packit b099d7
Packit b099d7
			/* west side */
Packit b099d7
			if (eBevel > *pInvertWidth) 
Packit b099d7
			{
Packit b099d7
			    tmp = eBevel - *pInvertWidth;
Packit b099d7
			    *pX += tmp;
Packit b099d7
			    *pWidth -= tmp;
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
		} /* end switch */
Packit b099d7
	    } /* end case "title bar part" */	
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	default:
Packit b099d7
	    rval = False;
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
    }	/* end switch */
Packit b099d7
Packit b099d7
    return (rval);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetFrameInfo (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Sets frame information into client data structure for easy access.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  o Sets values into the FrameInfo component of the client data structure
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void SetFrameInfo (ClientData *pcd)
Packit b099d7
{
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * The title bar height value stored in pcd->frameInfo is used by the
Packit b099d7
     * macro TitleBarHeight(pcd).
Packit b099d7
     */
Packit b099d7
Packit b099d7
    pcd->frameInfo.titleBarHeight = InitTitleBarHeight (pcd);
Packit b099d7
Packit b099d7
    pcd->frameInfo.x = FrameX (pcd);
Packit b099d7
    pcd->frameInfo.y = FrameY (pcd);
Packit b099d7
    pcd->frameInfo.width = FrameWidth (pcd);
Packit b099d7
    pcd->frameInfo.height = FrameHeight (pcd);
Packit b099d7
    pcd->frameInfo.upperBorderWidth = UpperBorderWidth (pcd);
Packit b099d7
    pcd->frameInfo.lowerBorderWidth = LowerBorderWidth (pcd);
Packit b099d7
    pcd->frameInfo.cornerWidth = CornerWidth (pcd);
Packit b099d7
    pcd->frameInfo.cornerHeight = CornerHeight (pcd);
Packit b099d7
Packit b099d7
    /* set client offset */
Packit b099d7
     
Packit b099d7
    if ( (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER)) ||
Packit b099d7
         (pcd->matteWidth > 0) )
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 *  The window has a window manager border.
Packit b099d7
	 */
Packit b099d7
	pcd->clientOffset.x = pcd->frameInfo.lowerBorderWidth + 
Packit b099d7
			          pcd->matteWidth;
Packit b099d7
	pcd->clientOffset.y = pcd->frameInfo.upperBorderWidth + 
Packit b099d7
				  pcd->frameInfo.titleBarHeight + 
Packit b099d7
			          pcd->matteWidth;
Packit b099d7
    }
Packit b099d7
    else 
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * No window manager border, the original X border is showing
Packit b099d7
	 * through.
Packit b099d7
	 */
Packit b099d7
	pcd->clientOffset.x =  pcd->xBorderWidth + pcd->matteWidth;
Packit b099d7
	pcd->clientOffset.y =  pcd->xBorderWidth + 
Packit b099d7
				   pcd->frameInfo.titleBarHeight + 
Packit b099d7
				   pcd->matteWidth;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetClientOffset (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Sets the client offset into client data structure
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  This can be called before SetFrameInfo to set up the client offset
Packit b099d7
 *  without the danger of using uninitialized variables during 
Packit b099d7
 *  extraneous computation.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void SetClientOffset (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    /*
Packit b099d7
     * The title bar height value stored in pcd->frameInfo is used by the
Packit b099d7
     * macro TitleBarHeight(pcd).
Packit b099d7
     */
Packit b099d7
Packit b099d7
    pcd->frameInfo.titleBarHeight = InitTitleBarHeight (pcd);
Packit b099d7
Packit b099d7
    pcd->frameInfo.upperBorderWidth = UpperBorderWidth (pcd);
Packit b099d7
    pcd->frameInfo.lowerBorderWidth = LowerBorderWidth (pcd);
Packit b099d7
Packit b099d7
    /* set client offset */
Packit b099d7
     
Packit b099d7
    if ( (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER)) ||
Packit b099d7
         (pcd->matteWidth > 0) )
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 *  The window has a window manager border.
Packit b099d7
	 */
Packit b099d7
	pcd->clientOffset.x = pcd->frameInfo.lowerBorderWidth + 
Packit b099d7
			          pcd->matteWidth;
Packit b099d7
	pcd->clientOffset.y = pcd->frameInfo.upperBorderWidth + 
Packit b099d7
				  pcd->frameInfo.titleBarHeight + 
Packit b099d7
			          pcd->matteWidth;
Packit b099d7
    }
Packit b099d7
    else 
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * No window manager border, the original X border is showing
Packit b099d7
	 * through.
Packit b099d7
	 */
Packit b099d7
	pcd->clientOffset.x =  pcd->xBorderWidth + pcd->matteWidth;
Packit b099d7
	pcd->clientOffset.y =  pcd->xBorderWidth + 
Packit b099d7
				   pcd->frameInfo.titleBarHeight + 
Packit b099d7
				   pcd->matteWidth;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  XBorderIsShowing (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns true if the X border is showing.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  XBorderIsShowing	- True if no window manager border & x border is 
Packit b099d7
 *			  visible, False otherwise
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Boolean XBorderIsShowing (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    Boolean rval;
Packit b099d7
Packit b099d7
    if ( (pcd->decor & (MWM_DECOR_RESIZEH | MWM_DECOR_BORDER)) ||
Packit b099d7
         (pcd->matteWidth > 0) )
Packit b099d7
    {
Packit b099d7
	rval = False; 	/* hidden by window manager */
Packit b099d7
    }
Packit b099d7
    else 
Packit b099d7
    {
Packit b099d7
        rval = True;	/* it's showing */
Packit b099d7
    }
Packit b099d7
    return(rval);
Packit b099d7
}