Blame clients/mwm/WmProperty.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[] = "$TOG: WmProperty.c /main/7 1997/12/02 10:00:00 bill $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
 * (c) Copyright 1987, 1988, 1989, 1990, 1993 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Included Files:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmGlobal.h"
Packit b099d7
#include "WmICCC.h"
Packit b099d7
#include <stdio.h>
Packit b099d7
#ifdef WSM
Packit b099d7
#include 
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * include extern functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmColormap.h"
Packit b099d7
#include "WmError.h"
Packit b099d7
#include "WmResParse.h"
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function Declarations:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmProperty.h"
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Global Variables:
Packit b099d7
 */
Packit b099d7
Packit b099d7
static SizeHints sizeHints;
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SizeHints *
Packit b099d7
 *  GetNormalHints (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function replaces the XGetNormalHints Xlib function.  This function
Packit b099d7
 *  gets the information in the WM_NORMAL_HINTS property on the client window.
Packit b099d7
 *  The property encoding can be any of the supported versions (R2, R3+).
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = (client)
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return = A pointer to a filled out SizeHints structure is returned.
Packit b099d7
 *           Default values are set if the WM_NORMAL_HINTS property could
Packit b099d7
 *           not be retrieved.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
SizeHints * 
Packit b099d7
GetNormalHints(
Packit b099d7
        ClientData *pCD )
Packit b099d7
Packit b099d7
{
Packit b099d7
    PropSizeHints *property = NULL;
Packit b099d7
    Atom actualType;
Packit b099d7
    int actualFormat;
Packit b099d7
    unsigned long leftover;
Packit b099d7
    unsigned long nitems;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Retrieve the property data.
Packit b099d7
     *
Packit b099d7
     *     ICCC_R2 version:  nitems = PROP_SIZE_HINTS_ELEMENTS - 3
Packit b099d7
     *     ICCC_CURRENT version: nitems = PROP_SIZE_HINTS_ELEMENTS
Packit b099d7
     */
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
    if ((!HasProperty (pCD, XA_WM_NORMAL_HINTS)) ||
Packit b099d7
	((Success != XGetWindowProperty (DISPLAY, pCD->client,
Packit b099d7
			XA_WM_NORMAL_HINTS, 0L, (long)PROP_SIZE_HINTS_ELEMENTS,
Packit b099d7
			False, XA_WM_SIZE_HINTS, &actualType, &actualFormat,
Packit b099d7
			&nitems, &leftover, (unsigned char **)&property)) ||
Packit b099d7
	  (actualType != XA_WM_SIZE_HINTS) ||
Packit b099d7
	  (nitems < (PROP_SIZE_HINTS_ELEMENTS - 3)) ||
Packit b099d7
	  (actualFormat != 32)))
Packit b099d7
#else /* WSM */
Packit b099d7
    if ((Success != XGetWindowProperty (DISPLAY, pCD->client,
Packit b099d7
			XA_WM_NORMAL_HINTS, 0L, (long)PROP_SIZE_HINTS_ELEMENTS,
Packit b099d7
			False, XA_WM_SIZE_HINTS, &actualType, &actualFormat,
Packit b099d7
			&nitems, &leftover, (unsigned char **)&property)) ||
Packit b099d7
	 (actualType != XA_WM_SIZE_HINTS) ||
Packit b099d7
	 (nitems < (PROP_SIZE_HINTS_ELEMENTS - 3)) ||
Packit b099d7
	 (actualFormat != 32))
Packit b099d7
#endif /* WSM */
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Indicate no property values were retrieved:
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	sizeHints.icccVersion = ICCC_UNKNOWN;
Packit b099d7
	sizeHints.flags = 0;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Parse the hint values out of the property data:
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	sizeHints.flags = property->flags;
Packit b099d7
	sizeHints.x = property->x;
Packit b099d7
	sizeHints.y = property->y;
Packit b099d7
	sizeHints.width = property->width;
Packit b099d7
	sizeHints.height = property->height;
Packit b099d7
	sizeHints.min_width = property->minWidth;
Packit b099d7
	sizeHints.min_height = property->minHeight;
Packit b099d7
	sizeHints.max_width = property->maxWidth;
Packit b099d7
	sizeHints.max_height = property->maxHeight;
Packit b099d7
	sizeHints.width_inc = property->widthInc;
Packit b099d7
	sizeHints.height_inc = property->heightInc;
Packit b099d7
	sizeHints.min_aspect.x = (int)property->minAspectX;
Packit b099d7
	sizeHints.min_aspect.y = (int)property->minAspectY;
Packit b099d7
	sizeHints.max_aspect.x = (int)property->maxAspectX;
Packit b099d7
	sizeHints.max_aspect.y = (int)property->maxAspectY;
Packit b099d7
Packit b099d7
Packit b099d7
	if (nitems == (PROP_SIZE_HINTS_ELEMENTS - 3))
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     *  This is ICCC_R2.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    sizeHints.icccVersion = ICCC_R2;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     *  This is ICCC_CURRENT.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    sizeHints.icccVersion = ICCC_CURRENT;
Packit b099d7
	    sizeHints.base_width = property->baseWidth;
Packit b099d7
	    sizeHints.base_height = property->baseHeight;
Packit b099d7
	    sizeHints.win_gravity = property->winGravity;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Free the property data buffer:
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (property)
Packit b099d7
    {
Packit b099d7
	XFree ((char *)property);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Return the hints values:
Packit b099d7
     */
Packit b099d7
Packit b099d7
    return (&sizeHints);
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetNormalHints */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ProcessWmProtocols (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function reads and processes the WM_PROTOCOLS property that is
Packit b099d7
 *  associated with a client window.
Packit b099d7
 *
Packit b099d7
 *  ICCC_COMPLIANT check added to allow older clients to work, for now...
Packit b099d7
 *  eventually, this code should be removed.
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pCD = (clientProtocols, clientProtocolCount, protocolFlags)
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ProcessWmProtocols (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    int rValue;
Packit b099d7
    Atom *property = NULL;
Packit b099d7
#ifndef ICCC_COMPLIANT
Packit b099d7
    Atom actualType;
Packit b099d7
    int actualFormat;
Packit b099d7
    unsigned long leftover;
Packit b099d7
    unsigned long nitems;
Packit b099d7
#else
Packit b099d7
    int nitems;
Packit b099d7
#endif /* ICCC_COMPLIANT */
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
Packit b099d7
    if (pCD->clientProtocols)
Packit b099d7
    {
Packit b099d7
	XtFree ((char *)pCD->clientProtocols);
Packit b099d7
	pCD->clientProtocols = NULL;
Packit b099d7
    }
Packit b099d7
    pCD->clientProtocolCount = 0;
Packit b099d7
    pCD->protocolFlags = 0;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Read the WM_PROTOCOLS property.
Packit b099d7
     */
Packit b099d7
Packit b099d7
#ifndef ICCC_COMPLIANT
Packit b099d7
#ifdef WSM
Packit b099d7
    if (!HasProperty (pCD, wmGD.xa_WM_PROTOCOLS))
Packit b099d7
	rValue = -1;
Packit b099d7
    else
Packit b099d7
#endif /* WSM */
Packit b099d7
    rValue = XGetWindowProperty (DISPLAY, pCD->client, wmGD.xa_WM_PROTOCOLS, 0L,
Packit b099d7
		 (long)MAX_CLIENT_PROTOCOL_COUNT, False, AnyPropertyType,
Packit b099d7
		 &actualType, &actualFormat, &nitems, &leftover,
Packit b099d7
		 (unsigned char **)&property);
Packit b099d7
Packit b099d7
Packit b099d7
    if ((rValue != Success) || (actualType == None) || (actualFormat != 32))
Packit b099d7
#else
Packit b099d7
#ifdef WSM
Packit b099d7
    if (!HasProperty (pCD, wmGD.xa_WM_PROTOCOLS))
Packit b099d7
	rValue = -1;
Packit b099d7
    else
Packit b099d7
#endif /* WSM */
Packit b099d7
    rValue = XGetWMProtocols (DISPLAY, pCD->client, 
Packit b099d7
		 (Atom **)&property, &nitems);
Packit b099d7
Packit b099d7
    if (0 == rValue) 
Packit b099d7
#endif /* ICCC_COMPLIANT */
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * WM_PROTOCOLS does not exist or it is an invalid type or size.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	pCD->clientProtocols = NULL;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
        if (!(pCD->clientProtocols = (Atom *)XtMalloc (nitems * sizeof (Atom))))
Packit b099d7
        {
Packit b099d7
	    /* unable to allocate space */
Packit b099d7
	    Warning (((char *)GETMESSAGE(54, 1, "Insufficient memory for window management data")));
Packit b099d7
        }
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Save the protocols in the client data and look for predefined
Packit b099d7
	     * protocols.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
    	    pCD->clientProtocolCount = nitems;
Packit b099d7
Packit b099d7
    	    for (i = 0; i < nitems; i++)
Packit b099d7
    	    {
Packit b099d7
		pCD->clientProtocols[i] = property[i];
Packit b099d7
		if (property[i] == wmGD.xa_WM_SAVE_YOURSELF)
Packit b099d7
		{
Packit b099d7
		    pCD->protocolFlags |= PROTOCOL_WM_SAVE_YOURSELF;
Packit b099d7
		}
Packit b099d7
		else if (property[i] == wmGD.xa_WM_TAKE_FOCUS)
Packit b099d7
		{
Packit b099d7
		    pCD->protocolFlags |= PROTOCOL_WM_TAKE_FOCUS;
Packit b099d7
		}
Packit b099d7
		else if (property[i] == wmGD.xa_WM_DELETE_WINDOW)
Packit b099d7
		{
Packit b099d7
		    pCD->protocolFlags |= PROTOCOL_WM_DELETE_WINDOW;
Packit b099d7
		}
Packit b099d7
		else if (property[i] == wmGD.xa_MWM_MESSAGES)
Packit b099d7
		{
Packit b099d7
		    pCD->protocolFlags |= PROTOCOL_MWM_MESSAGES;
Packit b099d7
		}
Packit b099d7
    	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    if (property)
Packit b099d7
    {
Packit b099d7
	XFree ((char *)property);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION ProcessWmProtocols */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ProcessMwmMessages (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function reads and processes the _MWM_MESSAGES property that is
Packit b099d7
 *  associated with a client window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pCD = (mwmMessagesCount, mwmMessages)
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ProcessMwmMessages (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    int rValue;
Packit b099d7
    long *property = NULL;
Packit b099d7
    Atom actualType;
Packit b099d7
    int actualFormat;
Packit b099d7
    unsigned long leftover;
Packit b099d7
    unsigned long nitems;
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
Packit b099d7
    if (pCD->mwmMessages)
Packit b099d7
    {
Packit b099d7
	XtFree ((char *)pCD->mwmMessages);
Packit b099d7
	pCD->mwmMessages = NULL;
Packit b099d7
    }
Packit b099d7
    pCD->mwmMessagesCount = 0;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Read the _MWM_MESSAGES property.
Packit b099d7
     */
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
    if (!HasProperty (pCD, wmGD.xa_MWM_MESSAGES))
Packit b099d7
        rValue = ~Success;
Packit b099d7
    else
Packit b099d7
#endif /* WSM */
Packit b099d7
    rValue = XGetWindowProperty (DISPLAY, pCD->client, wmGD.xa_MWM_MESSAGES, 0L,
Packit b099d7
		 (long)MAX_MWM_MESSAGES_COUNT, False, AnyPropertyType,
Packit b099d7
		 &actualType, &actualFormat, &nitems, &leftover,
Packit b099d7
		 (unsigned char **)&property);
Packit b099d7
Packit b099d7
Packit b099d7
    if ((rValue != Success) || (actualType == None) || (actualFormat != 32)
Packit b099d7
	|| (nitems == 0))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * _MWM_MESSAGES does not exist or it is an invalid type.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	pCD->mwmMessages = NULL;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
        if (!(pCD->mwmMessages = (long *)XtMalloc (nitems * sizeof (long))))
Packit b099d7
        {
Packit b099d7
	    /* unable to allocate space */
Packit b099d7
	    Warning (((char *)GETMESSAGE(54, 2, "Insufficient memory for window management data")));
Packit b099d7
        }
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Save the protocols in the client data and look for predefined
Packit b099d7
	     * protocols.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
    	    pCD->mwmMessagesCount = nitems;
Packit b099d7
Packit b099d7
    	    for (i = 0; i < nitems; i++)
Packit b099d7
    	    {
Packit b099d7
		if ((pCD->mwmMessages[i] = property[i]) == wmGD.xa_MWM_OFFSET)
Packit b099d7
		{
Packit b099d7
		    pCD->protocolFlags |= PROTOCOL_MWM_OFFSET;
Packit b099d7
		}
Packit b099d7
    	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    if (property)
Packit b099d7
    {
Packit b099d7
	XFree ((char *)property);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION ProcessMwmMessages */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetMwmInfo (propWindow, flags, wmWindow)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the _MOTIF_WM_INFO property on the specified (usually
Packit b099d7
 *  the root) window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  propWindow = window on which the _MOTIF_WM_INFO property is to be set
Packit b099d7
 *
Packit b099d7
 *  flags = motifWmInfo.flags value
Packit b099d7
 *
Packit b099d7
 *  wmWindow = motifWmInfo.wmWindow value
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  _MWM_INFO = this property is set on the specified window
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetMwmInfo (Window propWindow, long flags, Window wmWindow)
Packit b099d7
{
Packit b099d7
    PropMwmInfo property;
Packit b099d7
Packit b099d7
Packit b099d7
    property.flags = flags;
Packit b099d7
    property.wmWindow = wmWindow;
Packit b099d7
Packit b099d7
    XChangeProperty (DISPLAY, propWindow, wmGD.xa_MWM_INFO, wmGD.xa_MWM_INFO,
Packit b099d7
	32, PropModeReplace, (unsigned char *)&property,
Packit b099d7
	PROP_MWM_INFO_ELEMENTS);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetMwmInfo */
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetMwmSaveSessionInfo (wmWindow)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the WM_SAVE_YOURSELF property on the wm window
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  wmWindow = motifWmInfo.wmWindow
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  WM_SAVE_YOURSELF = this property is set on the wm window
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetMwmSaveSessionInfo (Window wmWindow)
Packit b099d7
{
Packit b099d7
Packit b099d7
    Atom  property;
Packit b099d7
    property = wmGD.xa_WM_SAVE_YOURSELF;
Packit b099d7
    
Packit b099d7
    XChangeProperty (DISPLAY, wmWindow, 
Packit b099d7
		     wmGD.xa_WM_PROTOCOLS, XA_ATOM,
Packit b099d7
		     32, PropModeReplace,
Packit b099d7
		     (unsigned char *) &property, 1);
Packit b099d7
    SetWMState(wmWindow, NORMAL_STATE, 0);
Packit b099d7
    
Packit b099d7
} /* END OF FUNCTION SetMwmSaveSessionInfo */
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetWMState (window)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function gets the WM_STATE property on a client top-level
Packit b099d7
 *  window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  window = client window from which the WM_STATE property is to be retrieved
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = a pointer to the WM_STATE property value (NULL if not defined)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  This function will eventually be superceded when WM_STATE support is
Packit b099d7
 *  added to the official X release.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
PropWMState *
Packit b099d7
GetWMState(
Packit b099d7
        Window window )
Packit b099d7
{
Packit b099d7
    int ret_val;
Packit b099d7
    PropWMState *property = NULL;
Packit b099d7
    Atom actual_type;
Packit b099d7
    int actual_format;
Packit b099d7
    unsigned long nitems;
Packit b099d7
    unsigned long leftover;
Packit b099d7
Packit b099d7
Packit b099d7
    ret_val = XGetWindowProperty (DISPLAY, window, wmGD.xa_WM_STATE, 
Packit b099d7
		  0L, PROP_WM_STATE_ELEMENTS,
Packit b099d7
		  False, wmGD.xa_WM_STATE, 
Packit b099d7
		  &actual_type, &actual_format, 
Packit b099d7
		  &nitems, &leftover, (unsigned char **)&property);
Packit b099d7
Packit b099d7
    if (!((ret_val == Success) && (actual_type == wmGD.xa_WM_STATE) &&
Packit b099d7
         (nitems == PROP_WM_STATE_ELEMENTS)))
Packit b099d7
    {
Packit b099d7
        /*
Packit b099d7
         * The property could not be retrieved or is not correctly set up.
Packit b099d7
         */
Packit b099d7
Packit b099d7
        if (property)
Packit b099d7
        {
Packit b099d7
	    XFree ((char *)property);
Packit b099d7
	    property = NULL;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (property);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetWMState */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetWMState (window, state, icon)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the WM_STATE property on a client top-level
Packit b099d7
 *  window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  window = client window on which the WM_STATE property is to be set
Packit b099d7
 *
Packit b099d7
 *  state = state of the client application
Packit b099d7
 *
Packit b099d7
 *  icon = window manager's icon window
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  WM_STATE = this property is set on the client window
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  This function will eventually be superceded when WM_STATE support is
Packit b099d7
 *  added to the official X release.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetWMState (Window window, int state, Window icon)
Packit b099d7
{
Packit b099d7
    PropWMState property;
Packit b099d7
Packit b099d7
Packit b099d7
    property.state = state;
Packit b099d7
    property.icon = icon;
Packit b099d7
Packit b099d7
    XChangeProperty (DISPLAY, window, wmGD.xa_WM_STATE, wmGD.xa_WM_STATE, 32,
Packit b099d7
	PropModeReplace, (unsigned char *)&property, PROP_WM_STATE_ELEMENTS);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetWMState */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  PropMwmHints *
Packit b099d7
 *  GetMwmHints (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function reads any _MWM_HINTS property that is associated with a 
Packit b099d7
 *  client window.
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = ptr to mwm hints property, or NULL ptr if failure
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
PropMwmHints *
Packit b099d7
GetMwmHints(
Packit b099d7
        ClientData *pCD )
Packit b099d7
Packit b099d7
{
Packit b099d7
    int ret_val;
Packit b099d7
    PropMwmHints *property = NULL;
Packit b099d7
    Atom actual_type;
Packit b099d7
    int actual_format;
Packit b099d7
    unsigned long nitems;
Packit b099d7
    unsigned long leftover;
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
    if (!HasProperty(pCD, wmGD.xa_MWM_HINTS))
Packit b099d7
	ret_val = ~Success;
Packit b099d7
    else
Packit b099d7
#endif /* WSM */
Packit b099d7
    ret_val = XGetWindowProperty (DISPLAY, pCD->client, wmGD.xa_MWM_HINTS, 
Packit b099d7
		  0L, PROP_MWM_HINTS_ELEMENTS,
Packit b099d7
		  False, wmGD.xa_MWM_HINTS, 
Packit b099d7
		  &actual_type, &actual_format, 
Packit b099d7
		  &nitems, &leftover, (unsigned char **)&property);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Retrieve the property data.
Packit b099d7
     *
Packit b099d7
     *     Motif 1.1.n clients:	nitems	= PROP_MWM_HINTS_ELEMENTS
Packit b099d7
     *     Motif 1.2 clients:	nitems 	= PROP_MWM_HINTS_ELEMENTS + 2
Packit b099d7
     *
Packit b099d7
     * NOTES:  We don't need to check (nitems == PROP_MWM_HINTS_ELEMENTS)
Packit b099d7
     *         since...
Packit b099d7
     *
Packit b099d7
     * If running Motif 1.1.n client with Mwm 1.2, then ignore extra elements
Packit b099d7
     *    since property.flags won't have extra elements set.
Packit b099d7
     *
Packit b099d7
     * If running Motif 1.2 client with Mwm 1.1.n, then ignore extra elements
Packit b099d7
     *    since Mwm 1.1.n won't try to access the extra elements.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((ret_val == Success) && (actual_type == wmGD.xa_MWM_HINTS))
Packit b099d7
    {
Packit b099d7
	return (property);			/* indicate success */
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * The property could not be retrieved or is not correctly set up.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (property)
Packit b099d7
    {
Packit b099d7
	XFree ((char *)property);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (NULL);			/* indicate failure */
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetMwmHints */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  PropMwmInfo *
Packit b099d7
 *  GetMwmInfo (rootWindowOfScreen)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function reads the _MOTIF_WM_INFO property from the root window if
Packit b099d7
 *  it is setup.
Packit b099d7
 * 
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pSD = pointer to screen data 
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = ptr to motif wm info property, or NULL ptr if no property
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
PropMwmInfo *GetMwmInfo (Window rootWindowOfScreen)
Packit b099d7
{
Packit b099d7
    int ret_val;
Packit b099d7
    PropMwmInfo *property = NULL;
Packit b099d7
    Atom actual_type;
Packit b099d7
    int actual_format;
Packit b099d7
    unsigned long nitems;
Packit b099d7
    unsigned long leftover;
Packit b099d7
Packit b099d7
Packit b099d7
    ret_val = XGetWindowProperty (DISPLAY, rootWindowOfScreen,
Packit b099d7
                                     wmGD.xa_MWM_INFO,
Packit b099d7
                                     0L, PROP_MWM_INFO_ELEMENTS,
Packit b099d7
                                     False, wmGD.xa_MWM_INFO,
Packit b099d7
                                     &actual_type, &actual_format,
Packit b099d7
                                     &nitems, &leftover,
Packit b099d7
                                     (unsigned char **)&property);
Packit b099d7
Packit b099d7
    if ((ret_val == Success) && (actual_type == wmGD.xa_MWM_INFO) &&
Packit b099d7
        (nitems == PROP_MWM_INFO_ELEMENTS)) 
Packit b099d7
    {
Packit b099d7
	return (property);			/* indicate success */
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * The property could not be retrieved or is not correctly set up.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (property)
Packit b099d7
    {
Packit b099d7
	XFree ((char *)property);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (NULL);			/* indicate failure */
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetMwmInfo */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ProcessWmColormapWindows (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function retrieves and processes the WM_COLORMAP_WINDOWS client
Packit b099d7
 *  window property.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pCD = (cmapWindows, clientCmapList, clientCmapCount, clientCmapIndex)
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ProcessWmColormapWindows (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    int rValue;
Packit b099d7
    Window *property = NULL;
Packit b099d7
    Atom actualType;
Packit b099d7
    int actualFormat;
Packit b099d7
    unsigned long leftover;
Packit b099d7
    unsigned long nitems;
Packit b099d7
    int i;
Packit b099d7
    Window *pWindows;
Packit b099d7
    Colormap *pColormaps;
Packit b099d7
    int colormapCount;
Packit b099d7
    XWindowAttributes wAttributes;
Packit b099d7
    ClientData *pcd;
Packit b099d7
    XSetWindowAttributes sAttributes;
Packit b099d7
#ifndef OLD_COLORMAP /* colormaps */
Packit b099d7
    int *pCmapFlags;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * pCD->clientCmapCount and pCD->clientCmapIndex are initialized in
Packit b099d7
     * WmWinInfo.c.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Read the WM_COLORMAP_WINDOWS property.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    rValue = XGetWindowProperty (DISPLAY, pCD->client,
Packit b099d7
		 wmGD.xa_WM_COLORMAP_WINDOWS, 0L,
Packit b099d7
		 (long)MAX_COLORMAP_WINDOWS_COUNT, False, AnyPropertyType,
Packit b099d7
		 &actualType, &actualFormat, &nitems, &leftover,
Packit b099d7
		 (unsigned char **)&property);
Packit b099d7
Packit b099d7
Packit b099d7
    if ((rValue == Success) && (actualType != None) && (actualFormat == 32) &&
Packit b099d7
	(nitems > 0))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * WM_COLORMAP_WINDOWS exists and is a valid type.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
        if (!(pWindows = (Window *)XtMalloc ((nitems * sizeof (Window)) + 1)) ||
Packit b099d7
            !(pColormaps = (Colormap *)XtMalloc ((nitems*sizeof(Colormap)) + 1)))
Packit b099d7
        {
Packit b099d7
	    /* unable to allocate space */
Packit b099d7
	    Warning (((char *)GETMESSAGE(54, 3, "Insufficient memory for window management data")));
Packit b099d7
	    if (pWindows)
Packit b099d7
	    {
Packit b099d7
		XtFree ((char *)pWindows);
Packit b099d7
	    }
Packit b099d7
        }
Packit b099d7
#ifndef OLD_COLORMAP /* colormap */
Packit b099d7
	/* Is the above OSF code a bug -- allocates one extra byte, rather */
Packit b099d7
	/* than one extra element, for the top window if needed? */
Packit b099d7
	else if ( ! (pCmapFlags = (int *)XtCalloc(nitems+1,sizeof(int)))) {
Packit b099d7
			/* unable to allocate space */
Packit b099d7
			Warning (((char *)GETMESSAGE(54, 4, "Insufficient memory for window manager flags")));
Packit b099d7
			XtFree ((char *)pWindows); XtFree ((char *)pColormaps);
Packit b099d7
	}
Packit b099d7
#endif
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Check to see if the top-level client window is in the list.
Packit b099d7
	     * If it is not then add it to the head of the list.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
    	    for (i = 0; i < nitems; i++)
Packit b099d7
	    {
Packit b099d7
		if (property[i] == pCD->client)
Packit b099d7
		{
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    colormapCount = 0;
Packit b099d7
	    if (i == nitems)
Packit b099d7
	    {
Packit b099d7
		/* add the client window to the colormap window list */
Packit b099d7
		pWindows[0] = pCD->client;
Packit b099d7
		pColormaps[0] = FindColormap (pCD, pCD->client);
Packit b099d7
		colormapCount++;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    sAttributes.event_mask = (ColormapChangeMask);
Packit b099d7
    	    for (i = 0; i < nitems; i++)
Packit b099d7
    	    {
Packit b099d7
		if ((pColormaps[colormapCount] = 
Packit b099d7
		     FindColormap (pCD, property[i])) != None)
Packit b099d7
		{
Packit b099d7
		    pWindows[colormapCount] = property[i];
Packit b099d7
		    colormapCount++;
Packit b099d7
		}
Packit b099d7
		else if (XFindContext (DISPLAY, property[i],
Packit b099d7
		             wmGD.windowContextType, (caddr_t *)&pcd))
Packit b099d7
		{
Packit b099d7
		    /*
Packit b099d7
		     * The window is not a top level window or a window that
Packit b099d7
		     * is already being tracked for colormap changes.
Packit b099d7
		     * Track colormap attribute changes.
Packit b099d7
		     */
Packit b099d7
Packit b099d7
		    XChangeWindowAttributes (DISPLAY, property[i], CWEventMask,
Packit b099d7
			&sAttributes);
Packit b099d7
		
Packit b099d7
Packit b099d7
		    if (XGetWindowAttributes (DISPLAY, property[i],
Packit b099d7
			    &wAttributes))
Packit b099d7
		    {
Packit b099d7
			pWindows[colormapCount] = property[i];
Packit b099d7
			pColormaps[colormapCount] = wAttributes.colormap;
Packit b099d7
		        colormapCount++;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * Free up the old colormap window data if it has been set.  Set
Packit b099d7
	     * new window contexts.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    ResetColormapData (pCD, pWindows, colormapCount);
Packit b099d7
		
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * Set the colormap window data.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    pCD->clientColormap = pColormaps[0];
Packit b099d7
	    if (colormapCount > 1)
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * The top level window and at least one other window is in
Packit b099d7
		 * the colormap windows list.
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		pCD->clientCmapCount = colormapCount;
Packit b099d7
		pCD->cmapWindows = pWindows;
Packit b099d7
		pCD->clientCmapList = pColormaps;
Packit b099d7
		pCD->clientCmapIndex = 0;
Packit b099d7
#ifndef OLD_COLORMAP /* colormap */
Packit b099d7
		pCD->clientCmapFlags = pCmapFlags;
Packit b099d7
#endif
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * Only the top level window is being tracked for colormap
Packit b099d7
		 * data.
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		pCD->clientCmapCount = 0;
Packit b099d7
		XtFree ((char *)pWindows);
Packit b099d7
		XtFree ((char *)pColormaps);
Packit b099d7
#ifndef OLD_COLORMAP /* colormap */
Packit b099d7
		XtFree((char *)pCmapFlags);
Packit b099d7
#endif
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    if (property)
Packit b099d7
    {
Packit b099d7
	XFree ((char *)property);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION ProcessWmColormapWindows */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  FindColormap (pCD, window)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function checks colormap information that is currently saved in
Packit b099d7
 *  the client data for the colormap of the specified window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 *  window = get the colormap id for this window
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = colormap id for window (NULL if no colormap information)
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Colormap FindColormap (ClientData *pCD, Window window)
Packit b099d7
{
Packit b099d7
    Colormap colormap = (Colormap)0;
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
Packit b099d7
    if (pCD->clientCmapCount == 0)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * If the colormap count is 0 there is no list of colormaps and
Packit b099d7
	 * clientColormap is the colormap of the top-level window.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (window == pCD->client)
Packit b099d7
	{
Packit b099d7
	    colormap = pCD->clientColormap;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	for (i = 0; i < pCD->clientCmapCount; i++)
Packit b099d7
	{
Packit b099d7
	    if (pCD->cmapWindows[i] == window)
Packit b099d7
	    {
Packit b099d7
		colormap = pCD->clientCmapList[i];
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (colormap);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION FindColormap */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetMwmMenuItems (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function reads and processes any _MWM_MENU property that is
Packit b099d7
 *  associated with a client window and returns a list of MenuItem structures
Packit b099d7
 *  specified by the property, or NULL.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return = MenuItem list or NULL.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
MenuItem *
Packit b099d7
GetMwmMenuItems(
Packit b099d7
        ClientData *pCD )
Packit b099d7
{
Packit b099d7
    int rValue;
Packit b099d7
    XTextProperty textProperty;
Packit b099d7
    MenuItem *menuItems;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Read the _MWM_MENU property.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    textProperty.value = (unsigned char *)NULL;
Packit b099d7
    rValue = XGetTextProperty(DISPLAY, pCD->client, &textProperty,
Packit b099d7
			      wmGD.xa_MWM_MENU);
Packit b099d7
    if ((rValue == 0) || (textProperty.value == (unsigned char *)NULL))
Packit b099d7
    /* _MWM_MENU does not exist or it is an invalid type.  */
Packit b099d7
    {
Packit b099d7
	menuItems = NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    else
Packit b099d7
    /* parse the property string */
Packit b099d7
    {
Packit b099d7
	char **textList;
Packit b099d7
	int nItems;
Packit b099d7
Packit b099d7
	if (XmbTextPropertyToTextList(DISPLAY, &textProperty,
Packit b099d7
				      &textList, &nItems) != Success)
Packit b099d7
	{
Packit b099d7
	    menuItems = NULL;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    if(textList)
Packit b099d7
	    {
Packit b099d7
		menuItems = ParseMwmMenuStr (PSD_FOR_CLIENT(pCD),
Packit b099d7
					 (unsigned char *)textList[0]);
Packit b099d7
		XFreeStringList(textList);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
		menuItems = NULL;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XFree((void *)textProperty.value);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (menuItems);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetMwmMenuItems */
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetWorkspaceHints (display, window, ppWsAtoms, pCount, pbAll)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Get the contents of the WM_COMMAND property on a window
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  display	- X display 
Packit b099d7
 *  window	- window to get hints from
Packit b099d7
 *  ppWsAtoms	- pointer to a list of workspace atoms (to be returned)
Packit b099d7
 *  pCount	- ptr to a number of atoms (to be returned)
Packit b099d7
 *  pbAll	- ptr to a boolean (to be returned)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Returns:
Packit b099d7
 *  --------
Packit b099d7
 *  Success if suceeded, otherwise failure code.
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  *ppWsAtoms 	- list of workspace atoms
Packit b099d7
 *  *pCount	- number of atoms in *ppWsAtoms
Packit b099d7
 *  *pbAll	- True if should put in all workspaces
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  The caller must XtFree *ppWsAtoms when done!!!
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Status GetWorkspaceHints (Display *display, Window window, 
Packit b099d7
			  Atom **ppWsAtoms, unsigned int *pCount,
Packit b099d7
			  Boolean *pbAll)
Packit b099d7
{
Packit b099d7
    int rcode;
Packit b099d7
    DtWorkspaceHints *pWsHints;
Packit b099d7
    Atom *paWs;
Packit b099d7
Packit b099d7
    rcode = _DtWsmGetWorkspaceHints(display, window, &pWsHints);
Packit b099d7
    if (rcode == Success)
Packit b099d7
    {
Packit b099d7
	if (pWsHints->flags & DT_WORKSPACE_HINTS_WORKSPACES)
Packit b099d7
	{
Packit b099d7
	    paWs = (Atom *) 
Packit b099d7
		XtMalloc (pWsHints->numWorkspaces * sizeof(Atom));
Packit b099d7
	    memcpy (paWs, 
Packit b099d7
		    pWsHints->pWorkspaces, 
Packit b099d7
		    (pWsHints->numWorkspaces * sizeof(Atom)));
Packit b099d7
Packit b099d7
	    *pCount = pWsHints->numWorkspaces;
Packit b099d7
	    *ppWsAtoms = paWs;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    *pCount = 0;
Packit b099d7
	    *ppWsAtoms = NULL;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if ((pWsHints->flags & DT_WORKSPACE_HINTS_WSFLAGS) &&
Packit b099d7
	    (pWsHints->wsflags & DT_WORKSPACE_FLAGS_OCCUPY_ALL))
Packit b099d7
	{
Packit b099d7
	    *pbAll = True;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    *pbAll = False;
Packit b099d7
	}
Packit b099d7
Packit b099d7
Packit b099d7
	_DtWsmFreeWorkspaceHints (pWsHints);
Packit b099d7
    }
Packit b099d7
	
Packit b099d7
    return(rcode);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetWorkspaceHints */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetEmbeddedClientsProperty (propWindow, pEmbeddedClients, 
Packit b099d7
 *  				cEmbeddedCLients)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function writes the _DT_WORKSPACE_EMBEDDED_CLIENTS property
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  propWindow = window on which the property is to be written
Packit b099d7
 *  pEmbeddedClients = pointer to data (array of window IDs)
Packit b099d7
 *  cEmbeddedClients = number of window IDs in the array
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetEmbeddedClientsProperty (Window propWindow, 
Packit b099d7
    Window *pEmbeddedClients, unsigned long cEmbeddedClients)
Packit b099d7
{
Packit b099d7
    XChangeProperty (DISPLAY, propWindow, wmGD.xa_DT_EMBEDDED_CLIENTS, 
Packit b099d7
	wmGD.xa_DT_EMBEDDED_CLIENTS,
Packit b099d7
	32, PropModeReplace, (unsigned char *)pEmbeddedClients,
Packit b099d7
	cEmbeddedClients);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetEmbeddedClientsProperty */
Packit b099d7
Packit b099d7
#ifdef HP_VUE
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetWorkspaceInfo (propWindow, pWsInfo, cInfo)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the _DT_WORKSPACE_INFO property
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  propWindow = window on which the _DT_WORKSPACE_INFO property is to be set
Packit b099d7
 *  pWsInfo =  pointer to workspace info data
Packit b099d7
 *  cInfo = size of workspace info data
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetWorkspaceInfo (Window propWindow, WorkspaceInfo *pWsInfo, unsigned long cInfo)
Packit b099d7
{
Packit b099d7
    XChangeProperty (DISPLAY, propWindow, wmGD.xa_DT_WORKSPACE_INFO, 
Packit b099d7
	wmGD.xa_DT_WORKSPACE_INFO,
Packit b099d7
	32, PropModeReplace, (unsigned char *)pWsInfo,
Packit b099d7
	(cInfo * sizeof(WorkspaceInfo))/sizeof(long));
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetWorkspaceInfo */
Packit b099d7
#endif /* HP_VUE */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetWorkspaceListProperty (pSD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the _DT_WORKSPACE_LIST property
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pSD = ptr to screen data
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
SetWorkspaceListProperty (WmScreenData *pSD)
Packit b099d7
{
Packit b099d7
    WmWorkspaceData *pws;
Packit b099d7
    Atom *pWsList;
Packit b099d7
    int count;
Packit b099d7
Packit b099d7
    pWsList = (Atom *) 
Packit b099d7
	XtMalloc (pSD->numWorkspaces * sizeof(Atom));
Packit b099d7
Packit b099d7
    pws = pSD->pWS;
Packit b099d7
    for (count = 0; count < pSD->numWorkspaces; count++)
Packit b099d7
    {
Packit b099d7
	pWsList[count] = pws->id;
Packit b099d7
	pws++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XChangeProperty (DISPLAY, pSD->wmWorkspaceWin, 
Packit b099d7
        wmGD.xa_DT_WORKSPACE_LIST, 
Packit b099d7
	XA_ATOM,
Packit b099d7
	32, PropModeReplace, (unsigned char *)pWsList,
Packit b099d7
	(pSD->numWorkspaces * sizeof(Atom))/sizeof(long));
Packit b099d7
Packit b099d7
    XtFree ((char *) pWsList);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetWorkspaceListProperty */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetCurrentWorkspaceProperty (pSD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the _DT_WORKSPACE_CURRENT property
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pSD = ptr to screen data
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
SetCurrentWorkspaceProperty (WmScreenData *pSD)
Packit b099d7
{
Packit b099d7
    Atom aCurrent;
Packit b099d7
Packit b099d7
    aCurrent = pSD->pActiveWS->id;
Packit b099d7
Packit b099d7
    XChangeProperty (DISPLAY, pSD->wmWorkspaceWin, 
Packit b099d7
        wmGD.xa_DT_WORKSPACE_CURRENT, 
Packit b099d7
	XA_ATOM,
Packit b099d7
	32, PropModeReplace, (unsigned char *)&aCurrent,
Packit b099d7
	(sizeof(Atom))/sizeof(long));
Packit b099d7
Packit b099d7
    XSync (DISPLAY, False);     /* XFlush didn't work here, why? */
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetCurrentWorkspaceProperty */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetWorkspaceInfoProperty (pWS)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the _DT_WORKSPACE_INFO_<name> property
Packit b099d7
 *  for a particular workspace
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pWS = ptr to workspace data
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
SetWorkspaceInfoProperty (WmWorkspaceData *pWS)
Packit b099d7
{
Packit b099d7
    char *pch;
Packit b099d7
    Atom aProperty;
Packit b099d7
    String sTitle;
Packit b099d7
    char **ppchList;
Packit b099d7
    int iNumStrings;
Packit b099d7
    int count, iwin;
Packit b099d7
    int i, ix;
Packit b099d7
    Status status;
Packit b099d7
    XTextProperty tp;
Packit b099d7
#define WIP_NUMBER_SIZE		16
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Construct our property name
Packit b099d7
     */
Packit b099d7
    pch = WorkspacePropertyName (pWS);
Packit b099d7
Packit b099d7
    aProperty = XmInternAtom (DISPLAY, pch, FALSE);
Packit b099d7
Packit b099d7
    XtFree ((char *) pch);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Determine the number of strings in our vector. One for each of
Packit b099d7
     *
Packit b099d7
     *     workspace title
Packit b099d7
     *     pixel set id
Packit b099d7
     *     backdrop background
Packit b099d7
     *     backdrop foreground
Packit b099d7
     *     backdrop name
Packit b099d7
     *     number of backdrop windows
Packit b099d7
     *     list of backdrop windows
Packit b099d7
     */
Packit b099d7
    iNumStrings =  6;	/* number of fields minus backdrop window(s) */
Packit b099d7
    count = 1;		/* number of backdrop windows */
Packit b099d7
    iNumStrings += count;
Packit b099d7
Packit b099d7
    /* allocate string vector */
Packit b099d7
    ppchList = (char **) XtMalloc (iNumStrings * sizeof (char *));
Packit b099d7
    pch = (char *) XtMalloc (iNumStrings * WIP_NUMBER_SIZE * sizeof(char));
Packit b099d7
    
Packit b099d7
    i = 0;
Packit b099d7
Packit b099d7
    /* Convert workspace title to ascii */
Packit b099d7
    sTitle = (String) WmXmStringToString (pWS->title);
Packit b099d7
    ppchList[i++] = (char *) sTitle;
Packit b099d7
Packit b099d7
    /*  Pixel set id */
Packit b099d7
    ix = (i * WIP_NUMBER_SIZE);
Packit b099d7
    sprintf (&pch[ix], "%d", pWS->backdrop.colorSet);
Packit b099d7
    ppchList[i++] = &pch[ix];
Packit b099d7
Packit b099d7
    /* backdrop background */
Packit b099d7
    ix = (i * WIP_NUMBER_SIZE);
Packit b099d7
    sprintf (&pch[ix], "0x%lx", pWS->backdrop.background);
Packit b099d7
    ppchList[i++] = &pch[ix];
Packit b099d7
Packit b099d7
    /* backdrop foreground */
Packit b099d7
    ix = (i * WIP_NUMBER_SIZE);
Packit b099d7
    sprintf (&pch[ix], "0x%lx", pWS->backdrop.foreground);
Packit b099d7
    ppchList[i++] = &pch[ix];
Packit b099d7
Packit b099d7
    /* backdrop name */
Packit b099d7
    ix = (i * WIP_NUMBER_SIZE);
Packit b099d7
    sprintf (&pch[ix], "0x%lx", pWS->backdrop.nameAtom);
Packit b099d7
    ppchList[i++] = &pch[ix];
Packit b099d7
Packit b099d7
    /* number of backdrop windows */
Packit b099d7
    ix = (i * WIP_NUMBER_SIZE);
Packit b099d7
    if ((pWS->backdrop.window == None))
Packit b099d7
    {
Packit b099d7
	strcpy (&pch[ix], "0");
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	sprintf (&pch[ix], "%d", count);
Packit b099d7
    }
Packit b099d7
    ppchList[i++] = &pch[ix];
Packit b099d7
Packit b099d7
    /* backdrop windows */
Packit b099d7
    /* 
Packit b099d7
     * One or zero backdrop windows 
Packit b099d7
     * (NULL written if zero)
Packit b099d7
     */
Packit b099d7
    ix = (i * WIP_NUMBER_SIZE);
Packit b099d7
    sprintf (&pch[ix], "0x%lx", pWS->backdrop.window);
Packit b099d7
    ppchList[i++] = &pch[ix];
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Write out the property
Packit b099d7
     */
Packit b099d7
    status = XmbTextListToTextProperty (DISPLAY, ppchList, iNumStrings,
Packit b099d7
					    XStdICCTextStyle, &tp);
Packit b099d7
    if ((status == Success) || (status > 0))
Packit b099d7
    {
Packit b099d7
        /*
Packit b099d7
         * Complete or partial conversion
Packit b099d7
         */
Packit b099d7
        XSetTextProperty (DISPLAY, pWS->pSD->wmWorkspaceWin, &tp, aProperty);
Packit b099d7
        XFree (tp.value);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtFree ((char *) ppchList);
Packit b099d7
    XtFree (pch);
Packit b099d7
    if (sTitle) XtFree ((char *)sTitle);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetWorkspaceInfoProperty */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  DeleteWorkspaceInfoProperty (pWS)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function deletes a _DT_WORKSPACE_INFO_<name> property
Packit b099d7
 *  for a particular workspace
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pWS = ptr to workspace data
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
DeleteWorkspaceInfoProperty (WmWorkspaceData *pWS)
Packit b099d7
{
Packit b099d7
    char *pch;
Packit b099d7
    Atom aProperty;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Get the atom for the workspace property.
Packit b099d7
     */
Packit b099d7
    pch = WorkspacePropertyName (pWS);
Packit b099d7
Packit b099d7
    aProperty = XmInternAtom (DISPLAY, pch, FALSE);
Packit b099d7
Packit b099d7
    XtFree ((char *) pch);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Do the property deletion
Packit b099d7
     */
Packit b099d7
    XDeleteProperty (DISPLAY, pWS->pSD->wmWorkspaceWin, aProperty);
Packit b099d7
    XFlush (DISPLAY);
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION DeleteWorkspaceInfoProperty */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  WorkspacePropertyName (pWS)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function returns a string containing the property name for a 
Packit b099d7
 *  workspace.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pWS = ptr to workspace data
Packit b099d7
 *
Packit b099d7
 *  Returns
Packit b099d7
 *  -------
Packit b099d7
 *  string containing the workspace property name (Free with XtFree)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
char *
Packit b099d7
WorkspacePropertyName (WmWorkspaceData *pWS)
Packit b099d7
{
Packit b099d7
    char *pch;
Packit b099d7
    char *pchName;
Packit b099d7
    int len;
Packit b099d7
    Atom aProperty;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Construct our property name
Packit b099d7
     */
Packit b099d7
    pchName = pWS->name;
Packit b099d7
    len = strlen(pchName) + strlen (_XA_DT_WORKSPACE_INFO) + 4;
Packit b099d7
Packit b099d7
    pch = (char *) XtMalloc (len);
Packit b099d7
    strcpy (pch, _XA_DT_WORKSPACE_INFO);
Packit b099d7
    strcat (pch, "_");
Packit b099d7
    strcat (pch, pchName);
Packit b099d7
Packit b099d7
    return (pch);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION WorkspacePropertyName */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetWorkspacePresence (propWindow, pWsPresence, cPresence)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the _DT_WORKSPACE_PRESENCE property
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  propWindow = window on which the _DT_WORKSPACE_PRESENCE property 
Packit b099d7
 *               is to be set
Packit b099d7
 *  pWsPresence =  pointer to workspace presence data
Packit b099d7
 *  cPresence = size of workspace presence data
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetWorkspacePresence (Window propWindow, Atom *pWsPresence, unsigned long cPresence)
Packit b099d7
{
Packit b099d7
    XChangeProperty (DISPLAY, propWindow, wmGD.xa_DT_WORKSPACE_PRESENCE, 
Packit b099d7
	wmGD.xa_DT_WORKSPACE_PRESENCE, 32, PropModeReplace, 
Packit b099d7
	(unsigned char *)pWsPresence, cPresence);
Packit b099d7
    XFlush (DISPLAY);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetWorkspacePresence */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetDtSessionHints (pSD, sNum)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function reads and processes _DT_SESSION_HINTS property that is
Packit b099d7
 *  associated with the root window of each screen managed by dtwm
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void GetDtSessionHints (WmScreenData *pSD, int sNum)
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
    int           rValue;
Packit b099d7
    char          *property = NULL;
Packit b099d7
    Atom          actualType;
Packit b099d7
    int           actualFormat;
Packit b099d7
    unsigned long leftover;
Packit b099d7
    unsigned long nitems;
Packit b099d7
Packit b099d7
    
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Read the  property.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    rValue = XGetWindowProperty (DISPLAY, pSD->rootWindow,
Packit b099d7
                                 wmGD.xa_DT_SESSION_HINTS, 0L,
Packit b099d7
                                 (long)1000000, False, AnyPropertyType,
Packit b099d7
                                 &actualType, &actualFormat, &nitems,
Packit b099d7
                                 &leftover, (unsigned char **)&property);
Packit b099d7
Packit b099d7
Packit b099d7
    if ((rValue != Success) || (actualType == None) || (actualFormat != 8))
Packit b099d7
        /* _DT_SESSION_HINTS does not exist or it is an invalid type.  */
Packit b099d7
    {
Packit b099d7
        pSD->pDtSessionItems = NULL;
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    else
Packit b099d7
        /* parse the property string */
Packit b099d7
    {
Packit b099d7
	ParseDtSessionHints (pSD, (unsigned char *)property);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    if (property)
Packit b099d7
    {
Packit b099d7
        XFree ((char *)property);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Delete the property so we don't see it if the user
Packit b099d7
     * restarts dtwm.
Packit b099d7
     */
Packit b099d7
#ifndef DEBUG_SESSION_HINTS
Packit b099d7
    XDeleteProperty (DISPLAY, pSD->rootWindow, wmGD.xa_DT_SESSION_HINTS);
Packit b099d7
#endif /* DEBUG_SESSION_HINTS */
Packit b099d7
} /* END OF FUNCTION GetDtSessionHints */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetDtWmRequest (pSD, pszReq, pmore)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function returns the next request
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pSD - pointer to screen data
Packit b099d7
 *  psdReq - pointer to a char pointer
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  *pszReq	- pointer to null terminated string containing next
Packit b099d7
 *                request
Packit b099d7
 *  *pmore	- set to true if more data is left in the property
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  ---------
Packit b099d7
 *  The data for pszReq is allocated in here. The caller must free up
Packit b099d7
 *  this space using XtFree.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
GetDtWmRequest (
Packit b099d7
		WmScreenData *pSD, 
Packit b099d7
		char **pszReq, 
Packit b099d7
		Boolean *pmore)
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
    int           rValue;
Packit b099d7
    char	 *chRequest = NULL;
Packit b099d7
    static char  *property = NULL;
Packit b099d7
    static int    iNext = -1;
Packit b099d7
    int 	  i;
Packit b099d7
    Atom          actualType;
Packit b099d7
    int           actualFormat;
Packit b099d7
    unsigned long leftover;
Packit b099d7
    static unsigned long nitems = 0;
Packit b099d7
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * We need to read the property again if we have no data left
Packit b099d7
     * over from last time;
Packit b099d7
     */
Packit b099d7
    if (property == NULL)
Packit b099d7
    {
Packit b099d7
#ifdef PARANOID
Packit b099d7
	/*
Packit b099d7
	 * Lock down the server to prevent changes to this
Packit b099d7
	 * property while we "edit" it.
Packit b099d7
	 */
Packit b099d7
	XGrabServer(DISPLAY);
Packit b099d7
#endif /* PARANOID */
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Read the property and delete it.
Packit b099d7
	 */
Packit b099d7
	rValue = XGetWindowProperty (DISPLAY, pSD->wmWorkspaceWin,
Packit b099d7
				     wmGD.xa_DT_WM_REQUEST, 0L,
Packit b099d7
				     (long)1000000, True, AnyPropertyType,
Packit b099d7
				     &actualType, &actualFormat, &nitems,
Packit b099d7
				     &leftover, (unsigned char **)&property);
Packit b099d7
Packit b099d7
#ifdef PARANOID
Packit b099d7
	/* Give the server back */ 
Packit b099d7
	XUngrabServer(DISPLAY);
Packit b099d7
#endif /* PARANOID */
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Validate the property that we've read
Packit b099d7
	 */
Packit b099d7
	if ((rValue != Success) || 
Packit b099d7
	    (actualType == None) || 
Packit b099d7
	    (actualFormat != 8))
Packit b099d7
	{
Packit b099d7
	    /* The property does not exist or it is an invalid type. */
Packit b099d7
	    property = NULL;
Packit b099d7
	    iNext = -1;
Packit b099d7
	    nitems = 0;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /* the property is fine, set the index of the next char. */
Packit b099d7
	    iNext = 0;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * If we've got something, then extract and return the next
Packit b099d7
     * request.
Packit b099d7
     */
Packit b099d7
    if (property && iNext >= 0)
Packit b099d7
    {
Packit b099d7
	int len = 0;
Packit b099d7
Packit b099d7
	for (i=iNext; i
Packit b099d7
	{
Packit b099d7
	    if (property [i] == '\0')
Packit b099d7
	    {
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	if (i>=nitems) i=nitems;
Packit b099d7
Packit b099d7
	len = i - iNext + 1 + ((property[i] == '\0') ? 0 : 1);
Packit b099d7
Packit b099d7
        chRequest = (char *) XtMalloc (len);
Packit b099d7
	if (chRequest == NULL)
Packit b099d7
	{
Packit b099d7
	    Warning (((char *)GETMESSAGE(54, 2, "Insufficient memory for window management data")));
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /* dequeue the request */
Packit b099d7
	    strncpy (chRequest, &property[iNext], len);
Packit b099d7
	    if (property[i] != '\0')
Packit b099d7
	    {
Packit b099d7
		chRequest[len-1]='\0';
Packit b099d7
	    }
Packit b099d7
	    iNext = i+1;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	if (iNext >= nitems)
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Extracted the last request, free up the storage
Packit b099d7
	     * and reset for next time.
Packit b099d7
	     */
Packit b099d7
	    XFree ((char *)property);
Packit b099d7
	    iNext = -1;
Packit b099d7
	    property = NULL;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    *pmore = (property != NULL);
Packit b099d7
    *pszReq = chRequest;
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetDtWmRequest */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetIntialPropertyList (ClientData *)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Get the list of initial properties on the window
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD		- pointer to client data
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pCD		- paInitialProperties member is updated
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  The caller must XFree the paIntialialProperties member!
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
GetInitialPropertyList (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    Atom *paList;
Packit b099d7
    int iProps;
Packit b099d7
Packit b099d7
    paList = XListProperties (DISPLAY, pCD->client, &iProps);
Packit b099d7
Packit b099d7
    if (paList)
Packit b099d7
    {
Packit b099d7
	pCD->paInitialProperties = paList;
Packit b099d7
	pCD->numInitialProperties = iProps;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	pCD->paInitialProperties = NULL;
Packit b099d7
	pCD->numInitialProperties = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetInitialPropertyList */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  DiscardIntialPropertyList (ClientData *)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Tosses out the intial property list for a client, frees data
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD		- pointer to client data
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pCD		- paInitialProperties member is updated
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
DiscardInitialPropertyList (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    if (pCD->paInitialProperties)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Free the initial property list. 
Packit b099d7
	 * (see HasProperty() function)
Packit b099d7
	 */
Packit b099d7
	XFree ((char *) pCD->paInitialProperties);
Packit b099d7
	pCD->paInitialProperties = NULL;
Packit b099d7
	pCD->numInitialProperties = 0;
Packit b099d7
    }
Packit b099d7
} /* END OF FUNCTION DiscardInitialPropertyList */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HasProperty (pCD, aProperty)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Returns True if this client had this property when it was mapped
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD		- pointer to client data
Packit b099d7
 *  aProperty	- atom of property to test for
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return	- True if this property was on the initial list for this
Packit b099d7
 *		  client; False otherwise.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean
Packit b099d7
HasProperty (
Packit b099d7
	ClientData *	pCD,
Packit b099d7
	Atom		aProperty)
Packit b099d7
{
Packit b099d7
    Boolean 	bFound = False;
Packit b099d7
    Atom  *	paList;
Packit b099d7
    int		count;
Packit b099d7
Packit b099d7
    paList = pCD->paInitialProperties;
Packit b099d7
Packit b099d7
    if (paList)
Packit b099d7
    {
Packit b099d7
	count = pCD->numInitialProperties;
Packit b099d7
	while ((!bFound) && (count > 0))
Packit b099d7
	{
Packit b099d7
	    bFound = (*paList == aProperty);
Packit b099d7
	    count--;
Packit b099d7
	    paList++;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * The property list doesn't exist. Return
Packit b099d7
	 * True to force a read of this property. The most likely
Packit b099d7
	 * case is that this property was updated after the 
Packit b099d7
	 * window was managed and needs to be read.
Packit b099d7
	 */
Packit b099d7
	bFound = True;
Packit b099d7
    }
Packit b099d7
    return (bFound);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HasProperty */
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7