|
Packit |
b099d7 |
/* $XConsortium: pack.c /main/5 1995/07/15 20:38:40 drk $ */
|
|
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 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "wsm_proto.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* this will redifine bzero to memset if needed. */
|
|
Packit |
b099d7 |
#include <Xm/XmosP.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define COUNT_SIZE (sizeof(CARD16))
|
|
Packit |
b099d7 |
#define BOOL_SIZE 1 /* at least 1 byte for a boolean. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* More intuitive names for various functions.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define PackBoolean(d, num) PackCARD8((d), (CARD8) (num))
|
|
Packit |
b099d7 |
#define PackListNum(d, num) PackCARD16((d), (CARD16) (num))
|
|
Packit |
b099d7 |
#define PackWindow(d, num) PackCARD32((d), (CARD32) (num))
|
|
Packit |
b099d7 |
#define PackProperty(d, num) PackCARD32((d), (CARD32) (num))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define UnpackBoolean(data) ((Boolean) UnpackCARD8(data))
|
|
Packit |
b099d7 |
#define UnpackListNum(data) ((int) UnpackCARD16(data))
|
|
Packit |
b099d7 |
#define UnpackWindow(data) ((Window) UnpackCARD32(data))
|
|
Packit |
b099d7 |
#define UnpackProperty(data) ((WindowProperty) UnpackCARD32(data))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define START_CHECK_MASK 0x80
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Function definitions.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Routines for getting the amount of space that a request will take in the
|
|
Packit |
b099d7 |
* protocol data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static int WinInfoSizePacked(Display *, int, WSMWinInfo *);
|
|
Packit |
b099d7 |
static int WinEntrySizePacked(Display *, int, WSMWinEntry *);
|
|
Packit |
b099d7 |
static int WinDataSizePacked(Display *, int,
|
|
Packit |
b099d7 |
WSMWinData *, int, WSMConfigFormatType);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Routines for packing protocol data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static MessageData PackConfigFormat(MessageData, WSMConfigFormatReply *);
|
|
Packit |
b099d7 |
static MessageData PackSingleAttribute(MessageData, WSMAttribute *, int);
|
|
Packit |
b099d7 |
static MessageData PackWinInfo(Display *, int, MessageData,
|
|
Packit |
b099d7 |
WSMWinInfo *);
|
|
Packit |
b099d7 |
static MessageData PackWinEntry(Display *, int, MessageData,
|
|
Packit |
b099d7 |
WSMWinEntry *);
|
|
Packit |
b099d7 |
static MessageData PackWinData(Display *, int, MessageData,
|
|
Packit |
b099d7 |
WSMWinData *, int, WSMConfigFormatType);
|
|
Packit |
b099d7 |
/* public */ MessageData PackCARD16(MessageData, CARD16);
|
|
Packit |
b099d7 |
/* public */ MessageData PackCARD8(MessageData, CARD8);
|
|
Packit |
b099d7 |
/* public */ MessageData PackString(MessageData, String);
|
|
Packit |
b099d7 |
/* public */ MessageData PackCARD32(MessageData, CARD32);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Routines for unpacking protocol data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void UnpackWinData(MessageData *, Display *,
|
|
Packit |
b099d7 |
int, WSMConfigFormatType, WSMWinData **, int *);
|
|
Packit |
b099d7 |
static void UnpackSingleWinDataRec(MessageData *, WSMAttribute *,WSMWinData *);
|
|
Packit |
b099d7 |
static void UnpackWinInfo(MessageData *, Display *, int, WSMWinInfo *);
|
|
Packit |
b099d7 |
static void UnpackWinEntry(MessageData *, Display *, int, WSMWinEntry *);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* public */ String UnpackString(MessageData *);
|
|
Packit |
b099d7 |
/* public */ CARD32 UnpackCARD32(MessageData *);
|
|
Packit |
b099d7 |
/* public */ CARD16 UnpackCARD16(MessageData *);
|
|
Packit |
b099d7 |
/* public */ CARD8 UnpackCARD8(MessageData *);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These two routines take data stored in a structure that
|
|
Packit |
b099d7 |
* humans can understand and pack it down into nice little
|
|
Packit |
b099d7 |
* protocol requests defined by the OSF WSM Protocol spec.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: _WSMPackRequest
|
|
Packit |
b099d7 |
* Description: Packs up the request passed into an appropriate
|
|
Packit |
b099d7 |
* message data structure.
|
|
Packit |
b099d7 |
* Arguments: dpy - the display we will be sending this message on.
|
|
Packit |
b099d7 |
* screen_num - The screen we will be sending this message to.
|
|
Packit |
b099d7 |
* request - request to send.
|
|
Packit |
b099d7 |
* RETURNED msg_data_len - The length of the message data.
|
|
Packit |
b099d7 |
* RETURNED error - An error code if something went wrong.
|
|
Packit |
b099d7 |
* Returns: A pointer to a message data struct.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* NOTE: The message data struct must be freed by the calling routine.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MessageData
|
|
Packit |
b099d7 |
_WSMPackRequest(Display *dpy, int screen_num, WSMRequest *request,
|
|
Packit |
b099d7 |
unsigned long *msg_data_len, WSMErrorCode *error)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
MessageData data, save;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
long size;
|
|
Packit |
b099d7 |
WSMWinInfo *win_info;
|
|
Packit |
b099d7 |
WSMConfigFormatData *global_attrs, *win_attrs, *icon_attrs;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*msg_data_len = 0; /* default value. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
global_attrs = _WSMGetConfigFormat(dpy, screen_num, WSM_GLOBAL_FMT);
|
|
Packit |
b099d7 |
win_attrs = _WSMGetConfigFormat(dpy, screen_num, WSM_WINDOW_FMT);
|
|
Packit |
b099d7 |
icon_attrs = _WSMGetConfigFormat(dpy, screen_num, WSM_ICON_FMT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*error = WSM_SUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_WSMRequiresConfigFormat(request->any.type) &&
|
|
Packit |
b099d7 |
(global_attrs->num_attrs == 0) &&
|
|
Packit |
b099d7 |
(win_attrs->num_attrs == 0) && (icon_attrs->num_attrs == 0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*error = WSM_ERROR_NO_CONFIG_FORMAT;
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (((request->any.type == WSM_CONNECT) ||
|
|
Packit |
b099d7 |
(request->any.type == WSM_CONFIG_FMT)) &&
|
|
Packit |
b099d7 |
((global_attrs->num_attrs != 0) ||
|
|
Packit |
b099d7 |
(win_attrs->num_attrs != 0) || (icon_attrs->num_attrs != 0)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*error = WSM_ERROR_ALREADY_HAVE_CONFIG_FORMAT;
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* before sending extensions make sure screen_info config format
|
|
Packit |
b099d7 |
is cleared */
|
|
Packit |
b099d7 |
/* may want to remove this and leave it up to application writer */
|
|
Packit |
b099d7 |
if ((request->any.type == WSM_EXTENSIONS) &&
|
|
Packit |
b099d7 |
((global_attrs->num_attrs != 0) ||
|
|
Packit |
b099d7 |
(win_attrs->num_attrs != 0) || (icon_attrs->num_attrs != 0)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_WSMClearConfigScreenInfo(dpy,screen_num);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Calculate the size of the request.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
switch (request->any.type) {
|
|
Packit |
b099d7 |
case WSM_CONNECT:
|
|
Packit |
b099d7 |
size = COUNT_SIZE;
|
|
Packit |
b099d7 |
size += sizeof(CARD8) * request->connect.num_versions;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_EXTENSIONS:
|
|
Packit |
b099d7 |
size = COUNT_SIZE;
|
|
Packit |
b099d7 |
for (i = 0; i < request->extensions.num_extensions; i++) {
|
|
Packit |
b099d7 |
size += (strlen(request->extensions.extension_suggestions[i]) +
|
|
Packit |
b099d7 |
COUNT_SIZE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_CONFIG_FMT:
|
|
Packit |
b099d7 |
size = 0;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_GET_STATE:
|
|
Packit |
b099d7 |
size = sizeof(CARD32) + BOOL_SIZE;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_SET_STATE:
|
|
Packit |
b099d7 |
size = COUNT_SIZE; /* The count of window info. */
|
|
Packit |
b099d7 |
win_info = request->set_state.win_info_list;
|
|
Packit |
b099d7 |
for (i = 0; i < request->set_state.num_win_info_list; i++,win_info++)
|
|
Packit |
b099d7 |
size += WinInfoSizePacked(dpy, screen_num, win_info);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_REG_WINDOW:
|
|
Packit |
b099d7 |
size = sizeof(CARD32);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_GET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
size = sizeof(CARD16);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_SET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
size = sizeof(CARD32);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_WINDOWS:
|
|
Packit |
b099d7 |
size = sizeof(CARD32); /* flag */
|
|
Packit |
b099d7 |
size += COUNT_SIZE; /* prop count */
|
|
Packit |
b099d7 |
size += request->wm_windows.num_window_properties * sizeof(Window);
|
|
Packit |
b099d7 |
size += COUNT_SIZE; /* num match attributes */
|
|
Packit |
b099d7 |
for (i=0; i<request->wm_windows.num_match_attributes; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
size += COUNT_SIZE; /* num attributes */
|
|
Packit |
b099d7 |
size += 2 *
|
|
Packit |
b099d7 |
request->wm_windows.match_attributes[i]->num_attributes *
|
|
Packit |
b099d7 |
sizeof(WindowProperty);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_FOCUS:
|
|
Packit |
b099d7 |
size = 0;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_POINTER:
|
|
Packit |
b099d7 |
size = 0;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
save = data = (MessageData) XtMalloc(size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Fill in the message.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
switch (request->any.type) {
|
|
Packit |
b099d7 |
case WSM_CONNECT:
|
|
Packit |
b099d7 |
data = PackListNum(data, request->connect.num_versions);
|
|
Packit |
b099d7 |
for (i = 0; i < request->connect.num_versions; i++)
|
|
Packit |
b099d7 |
data = PackCARD8(data, (CARD8) request->connect.known_versions[i]);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_EXTENSIONS:
|
|
Packit |
b099d7 |
data = PackListNum(data, request->extensions.num_extensions);
|
|
Packit |
b099d7 |
for (i = 0; i < request->extensions.num_extensions; i++)
|
|
Packit |
b099d7 |
data=PackString(data,request->extensions.extension_suggestions[i]);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_CONFIG_FMT:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_GET_STATE:
|
|
Packit |
b099d7 |
data = PackWindow(data, request->get_state.window);
|
|
Packit |
b099d7 |
(void) PackBoolean(data, request->get_state.diffs_allowed);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_SET_STATE:
|
|
Packit |
b099d7 |
win_info = request->set_state.win_info_list;
|
|
Packit |
b099d7 |
data = PackListNum(data, request->set_state.num_win_info_list);
|
|
Packit |
b099d7 |
for (i = 0; i < request->set_state.num_win_info_list; i++, win_info++)
|
|
Packit |
b099d7 |
data = PackWinInfo(dpy, screen_num, data, win_info);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_REG_WINDOW:
|
|
Packit |
b099d7 |
(void) PackWindow(data, request->register_window.window);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_GET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
(void) PackCARD16(data, request->get_background.screen);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_SET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
(void) PackWindow(data, request->set_background.window);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_WINDOWS:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, j;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackCARD32(data, request->wm_windows.location_flag);
|
|
Packit |
b099d7 |
data = PackListNum(data, request->wm_windows.num_window_properties);
|
|
Packit |
b099d7 |
for (i=0; i<request->wm_windows.num_window_properties; i++)
|
|
Packit |
b099d7 |
data = PackProperty(data, request->wm_windows.window_properties[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackListNum(data, request->wm_windows.num_match_attributes);
|
|
Packit |
b099d7 |
for (i = 0; i < request->wm_windows.num_match_attributes; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
AttributePair *match_attr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
match_attr = request->wm_windows.match_attributes[i];
|
|
Packit |
b099d7 |
data = PackListNum(data, match_attr->num_attributes);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (j = 0; j < match_attr->num_attributes; j++)
|
|
Packit |
b099d7 |
data = PackProperty(data, match_attr->allowed_attributes[j]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (j = 0; j < match_attr->num_attributes; j++)
|
|
Packit |
b099d7 |
data = PackProperty(data, match_attr->prohibited_attributes[j]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_FOCUS:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_POINTER:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*msg_data_len = size;
|
|
Packit |
b099d7 |
return(save);
|
|
Packit |
b099d7 |
} /* _WSMPackRequest */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: _WSMPackReply
|
|
Packit |
b099d7 |
* Description: Packs up the Reply passed into an appropriate
|
|
Packit |
b099d7 |
* message data structure.
|
|
Packit |
b099d7 |
* Arguments: dpy - the display we will be sending this message on.
|
|
Packit |
b099d7 |
* screen_num - The screen we will be sending this message to.
|
|
Packit |
b099d7 |
* reply - reply to send.
|
|
Packit |
b099d7 |
* RETURNED msg_data_len - The length of the message data.
|
|
Packit |
b099d7 |
* Returns: A pointer to a message data struct.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* NOTE: The message data struct must be freed by the calling routine.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MessageData
|
|
Packit |
b099d7 |
_WSMPackReply(Display *dpy, int screen_num,
|
|
Packit |
b099d7 |
WSMReply *reply, unsigned long *msg_data_len)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
WSMAttribute *attr;
|
|
Packit |
b099d7 |
WSMWinInfo *win_info;
|
|
Packit |
b099d7 |
WSMWinEntry *win_entry;
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
long size;
|
|
Packit |
b099d7 |
MessageData data, save;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*msg_data_len = 0; /* default value. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (reply->any.type) {
|
|
Packit |
b099d7 |
case WSM_CONNECT:
|
|
Packit |
b099d7 |
size = sizeof(CARD8);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_EXTENSIONS:
|
|
Packit |
b099d7 |
size = COUNT_SIZE;
|
|
Packit |
b099d7 |
for (i = 0; i < reply->extensions.num_extensions; i++) {
|
|
Packit |
b099d7 |
size += (strlen(reply->extensions.extensions[i]) + COUNT_SIZE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_CONFIG_FMT:
|
|
Packit |
b099d7 |
size = BOOL_SIZE; /* accept_diffs. */
|
|
Packit |
b099d7 |
size += COUNT_SIZE; /* The count of global attributes. */
|
|
Packit |
b099d7 |
attr = reply->config_format.global_formats;
|
|
Packit |
b099d7 |
for (i = 0; i < reply->config_format.num_global_formats; i++) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Bytes in string
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
size += strlen(XrmQuarkToString(attr[i].nameq)) * sizeof(CARD8);
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* len of string + size + is_list.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
size += COUNT_SIZE + sizeof(CARD8) + BOOL_SIZE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size += COUNT_SIZE; /* The count of window attributes. */
|
|
Packit |
b099d7 |
attr = reply->config_format.window_formats;
|
|
Packit |
b099d7 |
for (i = 0; i < reply->config_format.num_window_formats; i++) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Bytes in string
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
size += strlen(XrmQuarkToString(attr[i].nameq)) * sizeof(CARD8);
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* len of string + size + is_list.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
size += COUNT_SIZE + sizeof(CARD8) + BOOL_SIZE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size += COUNT_SIZE; /* The count of icon attributes. */
|
|
Packit |
b099d7 |
attr = reply->config_format.icon_formats;
|
|
Packit |
b099d7 |
for (i = 0; i < reply->config_format.num_icon_formats; i++) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Bytes in string
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
size += strlen(XrmQuarkToString(attr[i].nameq)) * sizeof(CARD8);
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* len of string + size + is_list.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
size += COUNT_SIZE + sizeof(CARD8) + BOOL_SIZE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_GET_STATE:
|
|
Packit |
b099d7 |
size = COUNT_SIZE; /* The count of window info. */
|
|
Packit |
b099d7 |
win_info = reply->get_state.win_info_list;
|
|
Packit |
b099d7 |
for (i = 0; i < reply->get_state.num_win_info_list; i++,win_info++)
|
|
Packit |
b099d7 |
size += WinInfoSizePacked(dpy, screen_num, win_info);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_SET_STATE:
|
|
Packit |
b099d7 |
size = 0;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_REG_WINDOW:
|
|
Packit |
b099d7 |
size = WinDataSizePacked(dpy, screen_num,
|
|
Packit |
b099d7 |
reply->register_window.window_data,
|
|
Packit |
b099d7 |
reply->register_window.num_window_data,
|
|
Packit |
b099d7 |
WSM_WINDOW_FMT);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_GET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
size = sizeof(CARD32);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_SET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
size = sizeof(CARD32);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_WINDOWS:
|
|
Packit |
b099d7 |
size = COUNT_SIZE; /* The count of window entries. */
|
|
Packit |
b099d7 |
win_entry = reply->wm_windows.win_entry_list;
|
|
Packit |
b099d7 |
for (i = 0; i < reply->wm_windows.num_win_entry_list; i++,win_entry++)
|
|
Packit |
b099d7 |
size += WinEntrySizePacked(dpy, screen_num, win_entry);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_FOCUS:
|
|
Packit |
b099d7 |
size = sizeof(CARD32);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_POINTER:
|
|
Packit |
b099d7 |
size = sizeof(CARD32); /* window */
|
|
Packit |
b099d7 |
size += sizeof(CARD32); /* flag */
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* ||| Error Message.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
save = data = (MessageData) XtMalloc(size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (reply->any.type) {
|
|
Packit |
b099d7 |
case WSM_CONNECT:
|
|
Packit |
b099d7 |
(void) PackCARD8(data, (CARD8) (reply->connect.version & 0xFF));
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_EXTENSIONS:
|
|
Packit |
b099d7 |
data = PackListNum(data, reply->extensions.num_extensions);
|
|
Packit |
b099d7 |
for (i = 0; i < reply->extensions.num_extensions; i++)
|
|
Packit |
b099d7 |
data = PackString(data, reply->extensions.extensions[i]);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_CONFIG_FMT:
|
|
Packit |
b099d7 |
PackConfigFormat(data, &(reply->config_format));
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_GET_STATE:
|
|
Packit |
b099d7 |
win_info = reply->get_state.win_info_list;
|
|
Packit |
b099d7 |
data = PackListNum(data, reply->get_state.num_win_info_list);
|
|
Packit |
b099d7 |
for (i = 0; i < reply->get_state.num_win_info_list; i++, win_info++)
|
|
Packit |
b099d7 |
data = PackWinInfo(dpy, screen_num, data, win_info);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_SET_STATE:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_REG_WINDOW:
|
|
Packit |
b099d7 |
data = PackWinData(dpy, screen_num, data,
|
|
Packit |
b099d7 |
reply->register_window.window_data,
|
|
Packit |
b099d7 |
reply->register_window.num_window_data,
|
|
Packit |
b099d7 |
WSM_WINDOW_FMT);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_GET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
(void) PackWindow(data, reply->get_background.window);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_SET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
(void) PackWindow(data, reply->set_background.window);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_WINDOWS:
|
|
Packit |
b099d7 |
win_entry = reply->wm_windows.win_entry_list;
|
|
Packit |
b099d7 |
data = PackListNum(data, reply->wm_windows.num_win_entry_list);
|
|
Packit |
b099d7 |
for (i = 0; i < reply->wm_windows.num_win_entry_list; i++, win_entry++)
|
|
Packit |
b099d7 |
data = PackWinEntry(dpy, screen_num, data, win_entry);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_FOCUS:
|
|
Packit |
b099d7 |
(void) PackWindow(data, reply->wm_focus.window);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_POINTER:
|
|
Packit |
b099d7 |
(void) PackWindow(data, reply->wm_pointer.window);
|
|
Packit |
b099d7 |
(void) PackCARD32(data, reply->wm_pointer.location_flag);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*msg_data_len = size;
|
|
Packit |
b099d7 |
return(save);
|
|
Packit |
b099d7 |
}/* _WSMPackReply */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These routines take data on the wire and put it into a structure
|
|
Packit |
b099d7 |
* that can be manipulated by the app.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: _WSMUnpackRequest
|
|
Packit |
b099d7 |
* Description: Unpacks the byte stream from the wire into a request
|
|
Packit |
b099d7 |
* message structure.
|
|
Packit |
b099d7 |
* Arguments: dpy - The Display.
|
|
Packit |
b099d7 |
* screen_num - The Screen number.
|
|
Packit |
b099d7 |
* data - The bits from accross the wire.
|
|
Packit |
b099d7 |
* len - The number of bits sent - Better error checking
|
|
Packit |
b099d7 |
* makes this more necessary.
|
|
Packit |
b099d7 |
* type - The type of message received.
|
|
Packit |
b099d7 |
* RETURNED request - This request structure is filled in with the data
|
|
Packit |
b099d7 |
* unpacked from the protocol.
|
|
Packit |
b099d7 |
* Returns: none.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_WSMUnpackRequest(Display *dpy, int screen_num, MessageData data,
|
|
Packit |
b099d7 |
unsigned long len, WSMRequestType type, WSMRequest *request)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
request->any.type = type; /* Save the type. */
|
|
Packit |
b099d7 |
request->any.allocated = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (request->any.type) {
|
|
Packit |
b099d7 |
case WSM_CONNECT:
|
|
Packit |
b099d7 |
request->connect.num_versions = UnpackListNum(&data);
|
|
Packit |
b099d7 |
request->connect.known_versions =
|
|
Packit |
b099d7 |
(short *) XtMalloc(sizeof(short) * request->connect.num_versions);
|
|
Packit |
b099d7 |
request->connect.allocated = True;
|
|
Packit |
b099d7 |
for (i = 0; i < request->connect.num_versions; i++)
|
|
Packit |
b099d7 |
request->connect.known_versions[i] = (short) UnpackCARD8(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_EXTENSIONS:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int num;
|
|
Packit |
b099d7 |
register String *ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num = request->extensions.num_extensions = UnpackListNum(&data);
|
|
Packit |
b099d7 |
ptr = (String *) XtMalloc(sizeof(String) * num);
|
|
Packit |
b099d7 |
request->extensions.extension_suggestions = ptr;
|
|
Packit |
b099d7 |
request->extensions.allocated = True;
|
|
Packit |
b099d7 |
for (i = 0; i < num; i++, ptr++)
|
|
Packit |
b099d7 |
*ptr = UnpackString(&data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_CONFIG_FMT:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_GET_STATE:
|
|
Packit |
b099d7 |
request->get_state.window = UnpackWindow(&data);
|
|
Packit |
b099d7 |
request->get_state.diffs_allowed = UnpackBoolean(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_SET_STATE:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int num = UnpackListNum(&data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
request->set_state.num_win_info_list = num;
|
|
Packit |
b099d7 |
request->set_state.win_info_list =
|
|
Packit |
b099d7 |
(WSMWinInfo *) XtMalloc(sizeof(WSMWinInfo) * num);
|
|
Packit |
b099d7 |
request->extensions.allocated = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < num; i++) {
|
|
Packit |
b099d7 |
UnpackWinInfo(&data, dpy, screen_num,
|
|
Packit |
b099d7 |
request->set_state.win_info_list + i);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_REG_WINDOW:
|
|
Packit |
b099d7 |
request->register_window.window = UnpackWindow(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_GET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
request->get_background.screen = (int)UnpackCARD16(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_SET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
request->set_background.window = UnpackWindow(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_WINDOWS:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int num, i, j;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
request->extensions.allocated = True;
|
|
Packit |
b099d7 |
request->wm_windows.location_flag = UnpackCARD32(&data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num = request->wm_windows.num_window_properties = UnpackListNum(&data);
|
|
Packit |
b099d7 |
request->wm_windows.window_properties =
|
|
Packit |
b099d7 |
(WindowProperty *) XtMalloc(sizeof(WindowProperty) * num);
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
request->wm_windows.window_properties[i] = UnpackProperty(&data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num = request->wm_windows.num_match_attributes = UnpackListNum(&data);
|
|
Packit |
b099d7 |
request->wm_windows.match_attributes =
|
|
Packit |
b099d7 |
(AttributePair **) XtMalloc(sizeof(AttributePair*) * num);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i<request->wm_windows.num_match_attributes; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
num = UnpackListNum(&data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
request->wm_windows.match_attributes[i] = (AttributePair *)
|
|
Packit |
b099d7 |
XtMalloc(sizeof(AttributePair) * num * 2 + sizeof(int));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
request->wm_windows.match_attributes[i]->num_attributes = num;
|
|
Packit |
b099d7 |
for (j=0; j
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
request->wm_windows.match_attributes[i]->allowed_attributes[j] =
|
|
Packit |
b099d7 |
UnpackProperty(&data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
for (j=0; j
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
request->wm_windows.match_attributes[i]->prohibited_attributes[j] =
|
|
Packit |
b099d7 |
UnpackProperty(&data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_FOCUS:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_POINTER:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* _WSMUnpackRequest */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: _WSMUnpackReply
|
|
Packit |
b099d7 |
* Description: Unpacks the byte stream from the wire into a reply
|
|
Packit |
b099d7 |
* message structure.
|
|
Packit |
b099d7 |
* Arguments: dpy - The Display.
|
|
Packit |
b099d7 |
* screen_num - The Screen number.
|
|
Packit |
b099d7 |
* data - the bits from accross the wire.
|
|
Packit |
b099d7 |
* len - The number of bits sent - Better error checking
|
|
Packit |
b099d7 |
* makes this more necessary.
|
|
Packit |
b099d7 |
* type - The type of message received.
|
|
Packit |
b099d7 |
* RETURNED reply - This reply structure is filled in with the data
|
|
Packit |
b099d7 |
* unpacked from the protocol.
|
|
Packit |
b099d7 |
* Returns: none.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_WSMUnpackReply(Display *dpy, int screen_num, MessageData data,
|
|
Packit |
b099d7 |
unsigned long len, WSMRequestType type, WSMReply *reply)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
reply->any.type = type; /* Save the type. */
|
|
Packit |
b099d7 |
reply->any.allocated = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (reply->any.type) {
|
|
Packit |
b099d7 |
case WSM_CONNECT:
|
|
Packit |
b099d7 |
if (data != NULL)
|
|
Packit |
b099d7 |
reply->connect.version = (short) UnpackCARD8(&data);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
fprintf(stderr, "Error - Connection request reply data is empty!\n");
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_EXTENSIONS:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int num;
|
|
Packit |
b099d7 |
register String *ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num = reply->extensions.num_extensions = UnpackListNum(&data);
|
|
Packit |
b099d7 |
ptr = (String *) XtMalloc(sizeof(String) * num);
|
|
Packit |
b099d7 |
reply->extensions.allocated = True;
|
|
Packit |
b099d7 |
reply->extensions.extensions = ptr;
|
|
Packit |
b099d7 |
for (i = 0; i < num; i++, ptr++)
|
|
Packit |
b099d7 |
*ptr = UnpackString(&data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_CONFIG_FMT:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int types;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
WSMConfigFormatReply * config_format = &(reply->config_format);
|
|
Packit |
b099d7 |
WSMConfigFormatData *fmt;
|
|
Packit |
b099d7 |
WSMScreenInfo *scr_info = _WSMGetScreenInfo(dpy, screen_num);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
config_format->accepts_diffs = UnpackBoolean(&data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (types = 0; types < 3; types++) {
|
|
Packit |
b099d7 |
switch(types) {
|
|
Packit |
b099d7 |
case WSM_GLOBAL_FMT:
|
|
Packit |
b099d7 |
fmt = &(scr_info->global);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WINDOW_FMT:
|
|
Packit |
b099d7 |
fmt = &(scr_info->window);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_ICON_FMT:
|
|
Packit |
b099d7 |
fmt = &(scr_info->icon);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
fmt->num_attrs = UnpackListNum(&data);
|
|
Packit |
b099d7 |
fmt->attr_list = (WSMAttribute *)
|
|
Packit |
b099d7 |
XtMalloc(sizeof(WSMAttribute) * fmt->num_attrs);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < fmt->num_attrs; i++) {
|
|
Packit |
b099d7 |
String str = UnpackString(&data);
|
|
Packit |
b099d7 |
fmt->attr_list[i].nameq = XrmStringToQuark(str);
|
|
Packit |
b099d7 |
XtFree(str);
|
|
Packit |
b099d7 |
fmt->attr_list[i].size = UnpackCARD8(&data);
|
|
Packit |
b099d7 |
fmt->attr_list[i].is_list = UnpackCARD8(&data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* No need to allocate this, since they are just pointers
|
|
Packit |
b099d7 |
* back to global data.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
config_format->global_formats = scr_info->global.attr_list;
|
|
Packit |
b099d7 |
config_format->num_global_formats = scr_info->global.num_attrs;
|
|
Packit |
b099d7 |
config_format->window_formats = scr_info->window.attr_list;
|
|
Packit |
b099d7 |
config_format->num_window_formats = scr_info->window.num_attrs;
|
|
Packit |
b099d7 |
config_format->icon_formats = scr_info->icon.attr_list;
|
|
Packit |
b099d7 |
config_format->num_icon_formats = scr_info->icon.num_attrs;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_GET_STATE:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int num =reply->get_state.num_win_info_list = UnpackListNum(&data);
|
|
Packit |
b099d7 |
reply->get_state.win_info_list =
|
|
Packit |
b099d7 |
(WSMWinInfo *) XtMalloc(sizeof(WSMWinInfo) * num);
|
|
Packit |
b099d7 |
reply->get_state.allocated = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < num; i++)
|
|
Packit |
b099d7 |
UnpackWinInfo(&data, dpy, screen_num,
|
|
Packit |
b099d7 |
reply->get_state.win_info_list + i);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_SET_STATE:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_REG_WINDOW:
|
|
Packit |
b099d7 |
if (data != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
UnpackWinData(&data, dpy, screen_num, WSM_WINDOW_FMT,
|
|
Packit |
b099d7 |
&(reply->register_window.window_data),
|
|
Packit |
b099d7 |
&(reply->register_window.num_window_data));
|
|
Packit |
b099d7 |
reply->register_window.allocated = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
fprintf(stderr, "Error - Register Window reply data is empty!\n");
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_GET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
reply->get_background.window = UnpackWindow(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_SET_BACKGROUND_WINDOW:
|
|
Packit |
b099d7 |
reply->set_background.window = UnpackWindow(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_WINDOWS:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int num;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num = reply->wm_windows.num_win_entry_list = UnpackListNum(&data);
|
|
Packit |
b099d7 |
reply->wm_windows.win_entry_list =
|
|
Packit |
b099d7 |
(WSMWinEntry *) XtMalloc(sizeof(WSMWinEntry) * num);
|
|
Packit |
b099d7 |
reply->wm_windows.allocated = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < num; i++)
|
|
Packit |
b099d7 |
UnpackWinEntry(&data, dpy, screen_num,
|
|
Packit |
b099d7 |
reply->wm_windows.win_entry_list + i);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_FOCUS:
|
|
Packit |
b099d7 |
reply->wm_focus.window = UnpackWindow(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case WSM_WM_POINTER:
|
|
Packit |
b099d7 |
reply->wm_pointer.location_flag = UnpackCARD32(&data);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* _WSMUnpackReply */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Internal Routines for getting size of packed requests.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: WinInfoSizePacked
|
|
Packit |
b099d7 |
* Description: Returns the size this window structure will take
|
|
Packit |
b099d7 |
* when packed into a protocol data stream.
|
|
Packit |
b099d7 |
* Arguments: dpy, screen_num - The display and screen of the client we
|
|
Packit |
b099d7 |
* are talking to.
|
|
Packit |
b099d7 |
* win_info - The window info whose size me are checking.
|
|
Packit |
b099d7 |
* Returns: the size (in bytes)
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
WinInfoSizePacked(Display *dpy, int screen_num, WSMWinInfo *win_info)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int size = sizeof(CARD32);
|
|
Packit |
b099d7 |
size += WinDataSizePacked(dpy, screen_num,
|
|
Packit |
b099d7 |
win_info->data_list, win_info->num_data_list,
|
|
Packit |
b099d7 |
_WSMGetConfigFormatType(win_info->window));
|
|
Packit |
b099d7 |
return(size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: WinEntrySizePacked
|
|
Packit |
b099d7 |
* Description: Returns the size this window structure will take
|
|
Packit |
b099d7 |
* when packed into a protocol data stream.
|
|
Packit |
b099d7 |
* Arguments: dpy, screen_num - The display and screen of the client we
|
|
Packit |
b099d7 |
* are talking to.
|
|
Packit |
b099d7 |
* win_entry - The window entry whose size we are checking.
|
|
Packit |
b099d7 |
* Returns: the size (in bytes)
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
WinEntrySizePacked(Display *dpy, int screen_num, WSMWinEntry *win_entry)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
size = sizeof(CARD32);
|
|
Packit |
b099d7 |
size += sizeof(CARD32) * win_entry->num_windows;
|
|
Packit |
b099d7 |
size = sizeof(CARD32);
|
|
Packit |
b099d7 |
size += sizeof(WindowProperty) * win_entry->num_match_properties;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: WinDataSizePacked
|
|
Packit |
b099d7 |
* Description: The size that will be taken up with this window data
|
|
Packit |
b099d7 |
* once it is packed into the protocol stream.
|
|
Packit |
b099d7 |
* Arguments: dpy, screen_num - The screen nmuber and display that
|
|
Packit |
b099d7 |
* we are talking to.
|
|
Packit |
b099d7 |
* win_data - The data stored in a window data structure list.
|
|
Packit |
b099d7 |
* num - number of items in the list.
|
|
Packit |
b099d7 |
* fmt - The type of format to use to pack this data.
|
|
Packit |
b099d7 |
* Returns: The size.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
WinDataSizePacked(Display *dpy, int screen_num,
|
|
Packit |
b099d7 |
WSMWinData *win_data, int num, WSMConfigFormatType fmt)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i, size;
|
|
Packit |
b099d7 |
WSMConfigFormatData *fmt_data = _WSMGetConfigFormat(dpy, screen_num, fmt);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
size = fmt_data->num_attrs / 8 + 1; /* Size of header bits. */
|
|
Packit |
b099d7 |
for ( i = 0; i < num; i++, win_data++) {
|
|
Packit |
b099d7 |
WSMAttribute *attr = _WSMGetMatchingAttr(win_data->nameq, fmt_data);
|
|
Packit |
b099d7 |
if (attr == NULL) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* ||| ERROR.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
continue;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch(win_data->type) {
|
|
Packit |
b099d7 |
case WSM_VALUE_DATA:
|
|
Packit |
b099d7 |
size += attr->size/8;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default: /* All others are lists. */
|
|
Packit |
b099d7 |
size += COUNT_SIZE;
|
|
Packit |
b099d7 |
size += ((attr->size/8) * win_data->data_len);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Internal Routines for packing data into the protocol stream.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackString
|
|
Packit |
b099d7 |
* Description: Packs a string into the data stream.
|
|
Packit |
b099d7 |
* Arguments: data - The data stream to pack into.
|
|
Packit |
b099d7 |
* str - The string to pack.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MessageData
|
|
Packit |
b099d7 |
PackString(MessageData data, String str)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i, len = strlen(str);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackListNum(data, len);
|
|
Packit |
b099d7 |
for (i = 0; i < len; i++, str++)
|
|
Packit |
b099d7 |
data = PackCARD8(data, *str);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackConfigFormat
|
|
Packit |
b099d7 |
* Description: Packs the configuration format into the data stream.
|
|
Packit |
b099d7 |
* Arguments: data - the datastream.
|
|
Packit |
b099d7 |
* config - the reply config format message.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static MessageData
|
|
Packit |
b099d7 |
PackConfigFormat(MessageData data, WSMConfigFormatReply *config)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
data = PackBoolean(data, config->accepts_diffs);
|
|
Packit |
b099d7 |
data = PackSingleAttribute(data, config->global_formats,
|
|
Packit |
b099d7 |
config->num_global_formats);
|
|
Packit |
b099d7 |
data = PackSingleAttribute(data, config->window_formats,
|
|
Packit |
b099d7 |
config->num_window_formats);
|
|
Packit |
b099d7 |
data = PackSingleAttribute(data, config->icon_formats,
|
|
Packit |
b099d7 |
config->num_icon_formats);
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackSingleAttribute
|
|
Packit |
b099d7 |
* Description: Packs a single attribute into a the data stream.
|
|
Packit |
b099d7 |
* Arguments: data - the datastream.
|
|
Packit |
b099d7 |
* attr_list, num - The attribute list to pack into the stream.
|
|
Packit |
b099d7 |
* The number of items in the list.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static MessageData
|
|
Packit |
b099d7 |
PackSingleAttribute(MessageData data, WSMAttribute *attr_list, int num)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackListNum(data, num);
|
|
Packit |
b099d7 |
for (i = 0; i < num; i++, attr_list++) {
|
|
Packit |
b099d7 |
data = PackString(data, XrmQuarkToString(attr_list->nameq));
|
|
Packit |
b099d7 |
data = PackCARD8(data, (CARD8) attr_list->size);
|
|
Packit |
b099d7 |
data = PackBoolean(data, attr_list->is_list);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackWinInfo
|
|
Packit |
b099d7 |
* Description: Packs the window information into the data stream.
|
|
Packit |
b099d7 |
* Arguments: dpy, screen_num - The display and screen of the client
|
|
Packit |
b099d7 |
* that we are talking to.
|
|
Packit |
b099d7 |
* data - The message stream.
|
|
Packit |
b099d7 |
* win_info - The window info list to pack into the data stream.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static MessageData
|
|
Packit |
b099d7 |
PackWinInfo(Display *dpy,
|
|
Packit |
b099d7 |
int screen_num, MessageData data, WSMWinInfo *win_info)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
data = PackWindow(data, win_info->window);
|
|
Packit |
b099d7 |
return(PackWinData(dpy, screen_num, data,
|
|
Packit |
b099d7 |
win_info->data_list, win_info->num_data_list,
|
|
Packit |
b099d7 |
_WSMGetConfigFormatType(win_info->window)));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackWinEntry
|
|
Packit |
b099d7 |
* Description: Packs the window information into the data stream.
|
|
Packit |
b099d7 |
* Arguments: dpy, screen_num - The display and screen of the client
|
|
Packit |
b099d7 |
* that we are talking to.
|
|
Packit |
b099d7 |
* data - The message stream.
|
|
Packit |
b099d7 |
* win_info - The window info list to pack into the data stream.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static MessageData
|
|
Packit |
b099d7 |
PackWinEntry(Display *dpy,
|
|
Packit |
b099d7 |
int screen_num, MessageData data, WSMWinEntry *win_entry)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackListNum(data, win_entry->num_windows);
|
|
Packit |
b099d7 |
for (i = 0; i < win_entry->num_windows; i++)
|
|
Packit |
b099d7 |
data = PackWindow(data, win_entry->windows[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackListNum(data, win_entry->num_match_properties);
|
|
Packit |
b099d7 |
for (i = 0; i < win_entry->num_match_properties; i++)
|
|
Packit |
b099d7 |
data = PackProperty(data, win_entry->match_properties[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackWinData
|
|
Packit |
b099d7 |
* Description: Packs the window data into the data stream.
|
|
Packit |
b099d7 |
* Arguments: dpy, screen_num - The display and screen of the client
|
|
Packit |
b099d7 |
* that we are talking to.
|
|
Packit |
b099d7 |
* data - The message stream.
|
|
Packit |
b099d7 |
* win_data, num - The window data to pack
|
|
Packit |
b099d7 |
* into the data stream, and its size.
|
|
Packit |
b099d7 |
* fmt - The type of config format to use.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static MessageData
|
|
Packit |
b099d7 |
PackWinData(Display *dpy, int screen_num, MessageData data,
|
|
Packit |
b099d7 |
WSMWinData *win_data, int num, WSMConfigFormatType fmt)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
WSMConfigFormatData *conf_fmt = _WSMGetConfigFormat(dpy, screen_num, fmt);
|
|
Packit |
b099d7 |
MessageData mask_pos = data;
|
|
Packit |
b099d7 |
WSMAttribute *attr;
|
|
Packit |
b099d7 |
register int i, size = (conf_fmt->num_attrs / 8) + 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = (MessageData) ((char *)data + size);
|
|
Packit |
b099d7 |
bzero((char *) mask_pos, size); /* Set all bits to zero initially*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
attr = conf_fmt->attr_list;
|
|
Packit |
b099d7 |
for (i = 0; i < conf_fmt->num_attrs ; i++, attr++) {
|
|
Packit |
b099d7 |
WSMWinData *this_data;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
this_data = _WSMGetMatchingWinData(win_data, num, attr->nameq);
|
|
Packit |
b099d7 |
if (this_data != NULL) {
|
|
Packit |
b099d7 |
if (this_data->type != WSM_VALUE_DATA)
|
|
Packit |
b099d7 |
data = PackListNum(data, this_data->data_len);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch(this_data->type) {
|
|
Packit |
b099d7 |
case WSM_CHAR_LIST_DATA:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int j;
|
|
Packit |
b099d7 |
char * ptr = this_data->data.char_ptr;
|
|
Packit |
b099d7 |
for (j = 0 ; j < this_data->data_len; j++, ptr++)
|
|
Packit |
b099d7 |
data = PackCARD8(data, (CARD8) *ptr);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
case WSM_SHORT_LIST_DATA:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int j;
|
|
Packit |
b099d7 |
short * ptr = this_data->data.short_ptr;
|
|
Packit |
b099d7 |
for (j = 0 ; j < this_data->data_len; j++, ptr++)
|
|
Packit |
b099d7 |
data = PackCARD16(data, (CARD16) *ptr);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
case WSM_LONG_LIST_DATA:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int j;
|
|
Packit |
b099d7 |
long * ptr = this_data->data.long_ptr;
|
|
Packit |
b099d7 |
for (j = 0 ; j < this_data->data_len; j++, ptr++)
|
|
Packit |
b099d7 |
data = PackCARD32(data, (CARD32) *ptr);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
case WSM_VALUE_DATA:
|
|
Packit |
b099d7 |
switch(attr->size) {
|
|
Packit |
b099d7 |
case 8:
|
|
Packit |
b099d7 |
data = PackCARD8(data, (CARD8) this_data->data.value);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 16:
|
|
Packit |
b099d7 |
data = PackCARD16(data, (CARD16) this_data->data.value);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 32:
|
|
Packit |
b099d7 |
data = PackCARD32(data, (CARD32) this_data->data.value);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
case WSM_NONE:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* The first item sets the MSBit, the 8th Item sets the LSBit.
|
|
Packit |
b099d7 |
* The Nineth sets the MSBit in the second byte. The unused
|
|
Packit |
b099d7 |
* bits are the LSBits of the last byte.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(*(unsigned char *)mask_pos) |= (char)(1 << (7 - (i % 8)));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* When we get to the end of a char, move to the next one.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((i % 8) == 7)
|
|
Packit |
b099d7 |
mask_pos = ((char *)mask_pos + 1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackCARD32
|
|
Packit |
b099d7 |
* Description: Packs an 32 bit value into the data stream.
|
|
Packit |
b099d7 |
* Arguments: data - The data stream to pack into.
|
|
Packit |
b099d7 |
* val - The 32 bit value to pack.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MessageData
|
|
Packit |
b099d7 |
PackCARD32(MessageData data, CARD32 val)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CARD16 bottom = val & (0xFFFF);
|
|
Packit |
b099d7 |
CARD16 top = val >> 16;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackCARD16(data, top);
|
|
Packit |
b099d7 |
data = PackCARD16(data, bottom);
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackCARD16
|
|
Packit |
b099d7 |
* Description: Packs an 16 bit value into the data stream.
|
|
Packit |
b099d7 |
* Arguments: data - The data stream to pack into.
|
|
Packit |
b099d7 |
* val - The 16 bit value to pack.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MessageData
|
|
Packit |
b099d7 |
PackCARD16(MessageData data, CARD16 val)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CARD8 bottom = val & (0xFF);
|
|
Packit |
b099d7 |
CARD8 top = val >> 8;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data = PackCARD8(data, top);
|
|
Packit |
b099d7 |
data = PackCARD8(data, bottom);
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: PackCARD8
|
|
Packit |
b099d7 |
* Description: Packs an 8 bit value into the data stream.
|
|
Packit |
b099d7 |
* Arguments: data - The data stream to pack into.
|
|
Packit |
b099d7 |
* val - The 8 bit value to pack.
|
|
Packit |
b099d7 |
* Returns: data - A pointer into the next empty location in the
|
|
Packit |
b099d7 |
* data stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MessageData
|
|
Packit |
b099d7 |
PackCARD8(MessageData data, CARD8 val)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CARD8 *ptr = (CARD8 *) data;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*ptr = (CARD8) val;
|
|
Packit |
b099d7 |
data = ((char*)data) + 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Internal routines for unpacking the data from the
|
|
Packit |
b099d7 |
* protocol stream.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackWinData
|
|
Packit |
b099d7 |
* Description: Unpacks the window data from the protocol stream.
|
|
Packit |
b099d7 |
* Arguments: data_ptr - A pointer to the message data stream.
|
|
Packit |
b099d7 |
* dpy, screen_num - The display and screen of the client
|
|
Packit |
b099d7 |
* that we are talking to.
|
|
Packit |
b099d7 |
* fmt - The window format to use.
|
|
Packit |
b099d7 |
* RETURNED win_data - The window data information.
|
|
Packit |
b099d7 |
* RETURNED num - The number of window data structs in "win_data".
|
|
Packit |
b099d7 |
* Returns: none
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
UnpackWinData(MessageData *data_ptr, Display *dpy, int screen_num,
|
|
Packit |
b099d7 |
WSMConfigFormatType fmt,
|
|
Packit |
b099d7 |
WSMWinData **win_data, int *num)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i, size;
|
|
Packit |
b099d7 |
WSMConfigFormatData *conf_fmt = _WSMGetConfigFormat(dpy, screen_num, fmt);
|
|
Packit |
b099d7 |
unsigned char *bit_mask, *current_mask, check_mask;
|
|
Packit |
b099d7 |
WSMAttribute *attr;
|
|
Packit |
b099d7 |
WSMWinData *ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Figure out how many values have been specified so we know how much
|
|
Packit |
b099d7 |
* memory to allocate.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
size = conf_fmt->num_attrs / 8 + 1;
|
|
Packit |
b099d7 |
current_mask = bit_mask = (unsigned char *) XtMalloc(size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Unpack the bits from the wire.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
for (i = 0; i < size; i++, current_mask++)
|
|
Packit |
b099d7 |
*current_mask = UnpackCARD8(data_ptr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
current_mask = bit_mask;
|
|
Packit |
b099d7 |
check_mask = START_CHECK_MASK;
|
|
Packit |
b099d7 |
for (*num = 0, i = 0; i < conf_fmt->num_attrs; i++) {
|
|
Packit |
b099d7 |
if (*current_mask & check_mask)
|
|
Packit |
b099d7 |
(*num)++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
check_mask >>= 1;
|
|
Packit |
b099d7 |
if ((i % 8) == 7) {
|
|
Packit |
b099d7 |
current_mask++;
|
|
Packit |
b099d7 |
check_mask = START_CHECK_MASK;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ptr = *win_data = (WSMWinData *) XtMalloc(*num * sizeof(WSMWinData));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* For each value that was specified pack the data into the window
|
|
Packit |
b099d7 |
* data record.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
current_mask = bit_mask;
|
|
Packit |
b099d7 |
check_mask = START_CHECK_MASK;
|
|
Packit |
b099d7 |
attr = conf_fmt->attr_list;
|
|
Packit |
b099d7 |
for (i = 0; i < conf_fmt->num_attrs; i++, attr++) {
|
|
Packit |
b099d7 |
if (*current_mask & check_mask)
|
|
Packit |
b099d7 |
UnpackSingleWinDataRec(data_ptr, attr, ptr++);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
check_mask >>= 1;
|
|
Packit |
b099d7 |
if ((i % 8) == 7) {
|
|
Packit |
b099d7 |
current_mask++;
|
|
Packit |
b099d7 |
check_mask = START_CHECK_MASK;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree((XtPointer) bit_mask);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackSingleWinDataRec
|
|
Packit |
b099d7 |
* Description: Packs a single window data record.
|
|
Packit |
b099d7 |
* Arguments: data_ptr - The data pointer.
|
|
Packit |
b099d7 |
* attr - The attribute record that defines general information
|
|
Packit |
b099d7 |
* on how to unpack this data.
|
|
Packit |
b099d7 |
* win_data - the window data struct.
|
|
Packit |
b099d7 |
* Returns: none
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
UnpackSingleWinDataRec(MessageData *data_ptr,
|
|
Packit |
b099d7 |
WSMAttribute *attr, WSMWinData *win_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Set these no matter what the size.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
win_data->nameq = attr->nameq; /* Save the name. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (attr->is_list) {
|
|
Packit |
b099d7 |
win_data->data_len = UnpackListNum(data_ptr);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
win_data->type = WSM_VALUE_DATA;
|
|
Packit |
b099d7 |
win_data->data_len = 0; /* unused... */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Based on the size, and whether or not this is a list, unpack
|
|
Packit |
b099d7 |
* the data from the wire.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch(attr->size) {
|
|
Packit |
b099d7 |
case 8:
|
|
Packit |
b099d7 |
if (attr->is_list) {
|
|
Packit |
b099d7 |
char *local;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
win_data->type = WSM_CHAR_LIST_DATA;
|
|
Packit |
b099d7 |
local = win_data->data.char_ptr =
|
|
Packit |
b099d7 |
(char *) XtMalloc(sizeof(char) * win_data->data_len);
|
|
Packit |
b099d7 |
for (i = 0; i < win_data->data_len; i++, local++)
|
|
Packit |
b099d7 |
*local = UnpackCARD8(data_ptr);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
win_data->data.value = UnpackCARD8(data_ptr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 16:
|
|
Packit |
b099d7 |
if (attr->is_list) {
|
|
Packit |
b099d7 |
short *local;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
win_data->type = WSM_SHORT_LIST_DATA;
|
|
Packit |
b099d7 |
local = win_data->data.short_ptr =
|
|
Packit |
b099d7 |
(short *) XtMalloc(sizeof(short) * win_data->data_len);
|
|
Packit |
b099d7 |
for (i = 0; i < win_data->data_len; i++, local++)
|
|
Packit |
b099d7 |
*local = UnpackCARD16(data_ptr);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
win_data->data.value = UnpackCARD16(data_ptr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 32:
|
|
Packit |
b099d7 |
if (attr->is_list) {
|
|
Packit |
b099d7 |
long *local;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
win_data->type = WSM_LONG_LIST_DATA;
|
|
Packit |
b099d7 |
local = win_data->data.long_ptr =
|
|
Packit |
b099d7 |
(long *) XtMalloc(sizeof(long) * win_data->data_len);
|
|
Packit |
b099d7 |
for (i = 0; i < win_data->data_len; i++, local++)
|
|
Packit |
b099d7 |
*local = UnpackCARD32(data_ptr);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
win_data->data.value = UnpackCARD32(data_ptr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackWinInfo
|
|
Packit |
b099d7 |
* Description: Unpacks the window information from the protocol stream.
|
|
Packit |
b099d7 |
* Arguments: data_ptr - A pointer to the message data stream.
|
|
Packit |
b099d7 |
* dpy, screen_num - The display and screen of the client
|
|
Packit |
b099d7 |
* that we are talking to.
|
|
Packit |
b099d7 |
* win_info - The window information.
|
|
Packit |
b099d7 |
* Returns: none
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
UnpackWinInfo(MessageData *data, Display *dpy,
|
|
Packit |
b099d7 |
int screen_num, WSMWinInfo *win_info)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
win_info->window = UnpackWindow(data);
|
|
Packit |
b099d7 |
UnpackWinData(data, dpy, screen_num,
|
|
Packit |
b099d7 |
_WSMGetConfigFormatType(win_info->window),
|
|
Packit |
b099d7 |
&(win_info->data_list), &(win_info->num_data_list));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackWinEntry
|
|
Packit |
b099d7 |
* Description: Unpacks the window entry information from the protocol stream.
|
|
Packit |
b099d7 |
* Arguments: data_ptr - A pointer to the message data stream.
|
|
Packit |
b099d7 |
* dpy, screen_num - The display and screen of the client
|
|
Packit |
b099d7 |
* that we are talking to.
|
|
Packit |
b099d7 |
* win_entry - The window entry information.
|
|
Packit |
b099d7 |
* Returns: none
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
UnpackWinEntry(MessageData *data, Display *dpy,
|
|
Packit |
b099d7 |
int screen_num, WSMWinEntry *win_entry)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
win_entry->num_windows = UnpackListNum(data);
|
|
Packit |
b099d7 |
win_entry->windows = (Window *) XtMalloc(sizeof(Window) * win_entry->num_windows);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i<win_entry->num_windows; i++)
|
|
Packit |
b099d7 |
win_entry->windows[i] = UnpackWindow(data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
win_entry->num_match_properties = UnpackListNum(data);
|
|
Packit |
b099d7 |
win_entry->match_properties =
|
|
Packit |
b099d7 |
(WindowProperty *) XtMalloc(sizeof(WindowProperty) *
|
|
Packit |
b099d7 |
win_entry->num_match_properties);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i<win_entry->num_match_properties; i++)
|
|
Packit |
b099d7 |
win_entry->match_properties[i] = UnpackProperty(data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackString
|
|
Packit |
b099d7 |
* Description: Unpacks a string from the protocol data stream.
|
|
Packit |
b099d7 |
* Arguments: data - Pointer to the data stream.
|
|
Packit |
b099d7 |
* Returns: the string from the data stream.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* NOTE: Data is modified to point to the next empty location in the stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
String
|
|
Packit |
b099d7 |
UnpackString(MessageData *data_ptr)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
int len = UnpackListNum(data_ptr);
|
|
Packit |
b099d7 |
char *str, *top = XtMalloc((len + 1) * sizeof(char));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (str = top, i = 0; i < len; i++, str++) {
|
|
Packit |
b099d7 |
*str = (char) UnpackCARD8(data_ptr);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
*str = '\0';
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return((String) top);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackCARD32
|
|
Packit |
b099d7 |
* Description: Unpacks an 32 bit value from the protocol data stream.
|
|
Packit |
b099d7 |
* Arguments: data - Pointer to the data stream.
|
|
Packit |
b099d7 |
* Returns: the CARD32 from the data stream.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* NOTE: data is modified to point to the next empty location in the stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CARD32
|
|
Packit |
b099d7 |
UnpackCARD32(MessageData *data_ptr)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CARD32 val = UnpackCARD16(data_ptr) << 16;
|
|
Packit |
b099d7 |
val |= UnpackCARD16(data_ptr);
|
|
Packit |
b099d7 |
return(val);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackCARD16
|
|
Packit |
b099d7 |
* Description: Unpacks an 16 bit value from the protocol data stream.
|
|
Packit |
b099d7 |
* Arguments: data - Pointer to the data stream.
|
|
Packit |
b099d7 |
* Returns: the CARD16 from the data stream.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* NOTE: data is modified to point to the next empty location in the stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CARD16
|
|
Packit |
b099d7 |
UnpackCARD16(MessageData *data_ptr)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CARD16 val = UnpackCARD8(data_ptr) << 8;
|
|
Packit |
b099d7 |
val |= UnpackCARD8(data_ptr);
|
|
Packit |
b099d7 |
return(val);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Function Name: UnpackCARD8
|
|
Packit |
b099d7 |
* Description: Unpacks an 8 bit value from the protocol data stream.
|
|
Packit |
b099d7 |
* Arguments: data - Pointer to the data stream.
|
|
Packit |
b099d7 |
* Returns: the CARD8 from the data stream.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* NOTE: data is modified to point to the next empty location in the stream.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CARD8
|
|
Packit |
b099d7 |
UnpackCARD8(MessageData *data_ptr)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CARD8 ret_val = *((char *) *data_ptr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*data_ptr = ((char *) *data_ptr) + 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(ret_val);
|
|
Packit |
b099d7 |
}
|