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