Blame src/EditresCom.c

Packit cd2a55
/*
Packit cd2a55
Packit cd2a55
Copyright 1989, 1998  The Open Group
Packit cd2a55
Packit cd2a55
Permission to use, copy, modify, distribute, and sell this software and its
Packit cd2a55
documentation for any purpose is hereby granted without fee, provided that
Packit cd2a55
the above copyright notice appear in all copies and that both that
Packit cd2a55
copyright notice and this permission notice appear in supporting
Packit cd2a55
documentation.
Packit cd2a55
Packit cd2a55
The above copyright notice and this permission notice shall be included in
Packit cd2a55
all copies or substantial portions of the Software.
Packit cd2a55
Packit cd2a55
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit cd2a55
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit cd2a55
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit cd2a55
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit cd2a55
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit cd2a55
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit cd2a55
Packit cd2a55
Except as contained in this notice, the name of The Open Group shall not be
Packit cd2a55
used in advertising or otherwise to promote the sale, use or other dealings
Packit cd2a55
in this Software without prior written authorization from The Open Group.
Packit cd2a55
Packit cd2a55
*/
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Author:  Chris D. Peterson, Dave Sternlicht, MIT X Consortium
Packit cd2a55
 */
Packit cd2a55
Packit cd2a55
#ifdef HAVE_CONFIG_H
Packit cd2a55
#include <config.h>
Packit cd2a55
#endif
Packit cd2a55
#include <X11/IntrinsicP.h>	/* To get into the composite and core widget
Packit cd2a55
				   structures. */
Packit cd2a55
#include <X11/ObjectP.h>	/* For XtIs<Classname> macros. */
Packit cd2a55
#include <X11/StringDefs.h>	/* for XtRString. */
Packit cd2a55
#include <X11/ShellP.h>		/* for Application Shell Widget class. */
Packit cd2a55
Packit cd2a55
#include <X11/Xatom.h>
Packit cd2a55
#include <X11/Xos.h>		/* for strcpy declaration */
Packit cd2a55
#include <X11/Xfuncs.h>
Packit cd2a55
#include <X11/Xmu/EditresP.h>
Packit cd2a55
#include <X11/Xmd.h>
Packit cd2a55
#include <X11/Xmu/CharSet.h>
Packit cd2a55
#include <X11/Xmu/SysUtil.h>
Packit cd2a55
#include <stdio.h>
Packit cd2a55
#include <stdlib.h>
Packit cd2a55
#include <string.h>
Packit cd2a55
Packit cd2a55
#define _XEditResPutBool _XEditResPut8
Packit cd2a55
#define _XEditResPutResourceType _XEditResPut8
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Types
Packit cd2a55
 */
Packit cd2a55
typedef enum {
Packit cd2a55
    BlockNone,
Packit cd2a55
    BlockSetValues,
Packit cd2a55
    BlockAll
Packit cd2a55
} EditresBlock;
Packit cd2a55
Packit cd2a55
typedef struct _SetValuesEvent {
Packit cd2a55
    EditresCommand type;		/* first field must be type */
Packit cd2a55
    WidgetInfo *widgets;
Packit cd2a55
    unsigned short num_entries;		/* number of set values requests */
Packit cd2a55
    char *name;
Packit cd2a55
    char *res_type;
Packit cd2a55
    XtPointer value;
Packit cd2a55
    unsigned short value_len;
Packit cd2a55
} SetValuesEvent;
Packit cd2a55
Packit cd2a55
typedef struct _SVErrorInfo {
Packit cd2a55
    SetValuesEvent *event;
Packit cd2a55
    ProtocolStream *stream;
Packit cd2a55
    unsigned short *count;
Packit cd2a55
    WidgetInfo *entry;
Packit cd2a55
} SVErrorInfo;
Packit cd2a55
Packit cd2a55
typedef struct _GetValuesEvent {
Packit cd2a55
    EditresCommand type;		/* first field must be type */
Packit cd2a55
    WidgetInfo *widgets;
Packit cd2a55
    unsigned short num_entries;		/* number of get values requests */
Packit cd2a55
    char *name;
Packit cd2a55
} GetValuesEvent;
Packit cd2a55
Packit cd2a55
typedef struct _FindChildEvent {
Packit cd2a55
    EditresCommand type;		/* first field must be type */
Packit cd2a55
    WidgetInfo *widgets;
Packit cd2a55
    short x, y;
Packit cd2a55
} FindChildEvent;
Packit cd2a55
Packit cd2a55
typedef struct _GenericGetEvent {
Packit cd2a55
    EditresCommand type;		/* first field must be type */
Packit cd2a55
    WidgetInfo *widgets;
Packit cd2a55
    unsigned short num_entries;		/* number of set values requests */
Packit cd2a55
} GenericGetEvent, GetResEvent, GetGeomEvent;
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Common to all events
Packit cd2a55
 */
Packit cd2a55
typedef struct _AnyEvent {
Packit cd2a55
    EditresCommand type;		/* first field must be type */
Packit cd2a55
    WidgetInfo *widgets;
Packit cd2a55
} AnyEvent;
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * The event union
Packit cd2a55
 */
Packit cd2a55
typedef union _EditresEvent {
Packit cd2a55
    AnyEvent any_event;
Packit cd2a55
    SetValuesEvent set_values_event;
Packit cd2a55
    GetResEvent get_resources_event;
Packit cd2a55
    GetGeomEvent get_geometry_event;
Packit cd2a55
    FindChildEvent find_child_event;
Packit cd2a55
} EditresEvent;
Packit cd2a55
Packit cd2a55
typedef struct _Globals {
Packit cd2a55
    EditresBlock block;
Packit cd2a55
    SVErrorInfo error_info;
Packit cd2a55
    ProtocolStream stream;
Packit cd2a55
    ProtocolStream *command_stream;	/* command stream */
Packit cd2a55
#if defined(LONG64) || defined(WORD64)
Packit cd2a55
    unsigned long base_address;
Packit cd2a55
#endif
Packit cd2a55
} Globals;
Packit cd2a55
Packit cd2a55
#define CURRENT_PROTOCOL_VERSION 5L
Packit cd2a55
Packit cd2a55
#define streq(a,b) (strcmp((a), (b)) == 0)
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Prototypes
Packit cd2a55
 */
Packit cd2a55
static Widget _FindChild(Widget, int, int);
Packit cd2a55
static void _XEditresGetStringValues(Widget, Arg*, int);
Packit cd2a55
static XtPointer BuildReturnPacket(ResIdent, EditResError, ProtocolStream*);
Packit cd2a55
static void CommandDone(Widget, Atom*, Atom*);
Packit cd2a55
static Boolean ConvertReturnCommand(Widget, Atom*, Atom*, Atom*, XtPointer*,
Packit cd2a55
				    unsigned long*, int*);
Packit cd2a55
static Boolean CvtStringToBlock(Display*, XrmValue*, Cardinal*,
Packit cd2a55
				XrmValue*, XrmValue*, XtPointer*);
Packit cd2a55
static EditresEvent *BuildEvent(Widget, Atom, XtPointer, ResIdent,
Packit cd2a55
				unsigned long);
Packit cd2a55
static _Xconst char *DoFindChild(Widget, EditresEvent*, ProtocolStream*);
Packit cd2a55
static _Xconst char *DoGetGeometry(Widget, EditresEvent*, ProtocolStream*);
Packit cd2a55
static _Xconst char *DoGetResources(Widget, EditresEvent*, ProtocolStream*);
Packit cd2a55
static _Xconst char *DoSetValues(Widget, EditresEvent*, ProtocolStream*);
Packit cd2a55
static void DumpChildren(Widget, ProtocolStream*, unsigned short*);
Packit cd2a55
static _Xconst char *DumpValues(Widget, EditresEvent*, ProtocolStream*);
Packit cd2a55
static _Xconst char *DumpWidgets(Widget, EditresEvent*, ProtocolStream*);
Packit cd2a55
static void ExecuteCommand(Widget, Atom, ResIdent, EditresEvent*);
Packit cd2a55
static void ExecuteGetGeometry(Widget, ProtocolStream*);
Packit cd2a55
static void ExecuteGetResources(Widget w, ProtocolStream *stream);
Packit cd2a55
static void ExecuteSetValues(Widget, SetValuesEvent*, WidgetInfo*,
Packit cd2a55
			     ProtocolStream*, unsigned short*);
Packit cd2a55
static void FreeEvent(EditresEvent*);
Packit cd2a55
static void GetCommand(Widget w, XtPointer, Atom*, Atom*, XtPointer,
Packit cd2a55
		       unsigned long*, int*);
Packit cd2a55
static void HandleToolkitErrors(String, String, String, String,
Packit cd2a55
				String*, Cardinal*);
Packit cd2a55
static void InsertWidget(ProtocolStream*, Widget);
Packit cd2a55
static Bool IsChild(Widget, Widget, Widget);
Packit cd2a55
static Bool isApplicationShell(Widget);
Packit cd2a55
static void LoadResources(Widget);
Packit cd2a55
static Bool PositionInChild(Widget, int, int);
Packit cd2a55
static int qcmp_widget_list(register _Xconst void*, register _Xconst void*);
Packit cd2a55
static void SendCommand(Widget, Atom, ResIdent, EditResError,
Packit cd2a55
			ProtocolStream*);
Packit cd2a55
static void SendFailure(Widget, Atom, ResIdent, _Xconst char*);
Packit cd2a55
static _Xconst char *VerifyWidget(Widget, WidgetInfo*);
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * External
Packit cd2a55
 */
Packit cd2a55
void _XEditResCheckMessages(Widget, XtPointer, XEvent*, Boolean*);
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Initialization
Packit cd2a55
 */
Packit cd2a55
static Atom res_editor_command, res_editor_protocol, client_value;
Packit cd2a55
static Globals globals;
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Resource Editor Communication Code
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResCheckMessages
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	data  - unused
Packit cd2a55
 *	event - The X Event that triggered this handler
Packit cd2a55
 *	cont  - unused
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	  This callback routine is set on all shell widgets, and checks to
Packit cd2a55
 *	see if a client message event has come from the resource editor.
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
void
Packit cd2a55
_XEditResCheckMessages(Widget w, XtPointer data, XEvent *event, Boolean *cont)
Packit cd2a55
{
Packit cd2a55
    Time time;
Packit cd2a55
    ResIdent ident;
Packit cd2a55
    static Boolean first_time = False;
Packit cd2a55
    static Atom res_editor, res_comm;
Packit cd2a55
    Display *dpy;
Packit cd2a55
Packit cd2a55
    if (event->type == ClientMessage)
Packit cd2a55
    {
Packit cd2a55
	XClientMessageEvent * c_event = (XClientMessageEvent *)event;
Packit cd2a55
	dpy = XtDisplay(w);
Packit cd2a55
Packit cd2a55
	if (!first_time)
Packit cd2a55
	{
Packit cd2a55
	    Atom atoms[4];
Packit cd2a55
	    static _Xconst char *names[] = {
Packit cd2a55
		EDITRES_NAME, EDITRES_COMMAND_ATOM,
Packit cd2a55
		EDITRES_PROTOCOL_ATOM, EDITRES_CLIENT_VALUE
Packit cd2a55
	    };
Packit cd2a55
Packit cd2a55
	    first_time = True;
Packit cd2a55
	    XInternAtoms(dpy, (char **) names, 4, False, atoms);
Packit cd2a55
	    res_editor = atoms[0];
Packit cd2a55
	    res_editor_command = atoms[1];
Packit cd2a55
	    res_editor_protocol = atoms[2];
Packit cd2a55
	  /* Used in later procedures */
Packit cd2a55
	    client_value = atoms[3];
Packit cd2a55
	    LoadResources(w);
Packit cd2a55
	}
Packit cd2a55
Packit cd2a55
	if ((c_event->message_type != res_editor)
Packit cd2a55
	    || (c_event->format != EDITRES_SEND_EVENT_FORMAT))
Packit cd2a55
	    return;
Packit cd2a55
Packit cd2a55
	time = c_event->data.l[0];
Packit cd2a55
	res_comm = c_event->data.l[1];
Packit cd2a55
	ident = (ResIdent) c_event->data.l[2];
Packit cd2a55
	if (c_event->data.l[3] != CURRENT_PROTOCOL_VERSION)
Packit cd2a55
	{
Packit cd2a55
	    _XEditResResetStream(&globals.stream);
Packit cd2a55
	    _XEditResPut8(&globals.stream,
Packit cd2a55
			  (unsigned int) CURRENT_PROTOCOL_VERSION);
Packit cd2a55
	    SendCommand(w, res_comm, ident, ProtocolMismatch, &globals.stream);
Packit cd2a55
	    return;
Packit cd2a55
	}
Packit cd2a55
Packit cd2a55
	XtGetSelectionValue(w, res_comm, res_editor_command,
Packit cd2a55
			    GetCommand, (XtPointer)(long)ident, time);
Packit cd2a55
    }
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	BuildEvent
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - widget to own selection, in case of error
Packit cd2a55
 *	sel    - selection to send error message beck in
Packit cd2a55
 *	data   - the data for the request
Packit cd2a55
 *	ident  - the id number we are looking for
Packit cd2a55
 *	length - length of request
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	  Takes the info out the protocol stream an constructs
Packit cd2a55
 *                   the proper event structure.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	the event, or NULL
Packit cd2a55
 */
Packit cd2a55
#if defined(ERROR_MESSAGE)
Packit cd2a55
#undef ERROR_MESSAGE
Packit cd2a55
#endif
Packit cd2a55
#define ERROR_MESSAGE "Client: Improperly formatted protocol request"
Packit cd2a55
static EditresEvent *
Packit cd2a55
BuildEvent(Widget w, Atom sel, XtPointer data, ResIdent ident,
Packit cd2a55
	   unsigned long length)
Packit cd2a55
{
Packit cd2a55
    EditresEvent *event;
Packit cd2a55
    ProtocolStream alloc_stream, *stream;
Packit cd2a55
    unsigned char temp;
Packit cd2a55
    register unsigned int i;
Packit cd2a55
Packit cd2a55
    stream = &alloc_stream;
Packit cd2a55
    stream->current = stream->top = (unsigned char *)data;
Packit cd2a55
    stream->size = HEADER_SIZE;		/* size of header */
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Retrieve the Header
Packit cd2a55
     */
Packit cd2a55
    if (length < HEADER_SIZE)
Packit cd2a55
    {
Packit cd2a55
	SendFailure(w, sel, ident, ERROR_MESSAGE);
Packit cd2a55
	return (NULL);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    (void)_XEditResGet8(stream, &temp);
Packit cd2a55
    if (temp != ident)			/* Id's don't match, ignore request */
Packit cd2a55
	return (NULL);
Packit cd2a55
Packit cd2a55
    event = (EditresEvent *)XtCalloc(sizeof(EditresEvent), 1);
Packit cd2a55
Packit cd2a55
    (void)_XEditResGet8(stream, &temp);
Packit cd2a55
    event->any_event.type = (EditresCommand)temp;
Packit cd2a55
    (void)_XEditResGet32(stream, &stream->size);
Packit cd2a55
    stream->top = stream->current;	/* reset stream to top of value */
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Now retrieve the data segment
Packit cd2a55
     */
Packit cd2a55
    switch(event->any_event.type)
Packit cd2a55
    {
Packit cd2a55
    case SendWidgetTree:
Packit cd2a55
	break;			/* no additional info */
Packit cd2a55
    case SetValues:
Packit cd2a55
        {
Packit cd2a55
	    SetValuesEvent *sv_event = (SetValuesEvent *)event;
Packit cd2a55
Packit cd2a55
	    if (!(_XEditResGetString8(stream, &sv_event->name)
Packit cd2a55
		  && _XEditResGetString8(stream, &sv_event->res_type)))
Packit cd2a55
		goto done;
Packit cd2a55
Packit cd2a55
	    /*
Packit cd2a55
	     * Since we need the value length, we have to pull the
Packit cd2a55
	     * value out by hand
Packit cd2a55
	     */
Packit cd2a55
	    if (!_XEditResGet16(stream, &sv_event->value_len))
Packit cd2a55
		goto done;
Packit cd2a55
Packit cd2a55
	    sv_event->value = XtMalloc(sizeof(char) * (sv_event->value_len + 1));
Packit cd2a55
Packit cd2a55
	    for (i = 0; i < sv_event->value_len; i++)
Packit cd2a55
		if (!_XEditResGet8(stream, (unsigned char *)sv_event->value + i))
Packit cd2a55
		    goto done;
Packit cd2a55
Packit cd2a55
	    ((char*)sv_event->value)[i] = '\0';
Packit cd2a55
Packit cd2a55
	    if (!_XEditResGet16(stream, &sv_event->num_entries))
Packit cd2a55
		goto done;
Packit cd2a55
Packit cd2a55
	    sv_event->widgets = (WidgetInfo *)
Packit cd2a55
		XtCalloc(sizeof(WidgetInfo), sv_event->num_entries);
Packit cd2a55
Packit cd2a55
	    for (i = 0; i < sv_event->num_entries; i++)
Packit cd2a55
		if (!_XEditResGetWidgetInfo(stream, sv_event->widgets + i))
Packit cd2a55
		    goto done;
Packit cd2a55
	}
Packit cd2a55
	break;
Packit cd2a55
    case FindChild:
Packit cd2a55
	{
Packit cd2a55
	    FindChildEvent *find_event = (FindChildEvent *)event;
Packit cd2a55
Packit cd2a55
	    find_event->widgets = (WidgetInfo *)XtCalloc(sizeof(WidgetInfo), 1);
Packit cd2a55
Packit cd2a55
	    if (!(_XEditResGetWidgetInfo(stream, find_event->widgets)
Packit cd2a55
		  && _XEditResGetSigned16(stream, &find_event->x)
Packit cd2a55
		  && _XEditResGetSigned16(stream, &find_event->y)))
Packit cd2a55
		goto done;
Packit cd2a55
	}
Packit cd2a55
	break;
Packit cd2a55
    case GetGeometry:
Packit cd2a55
    case GetResources:
Packit cd2a55
	{
Packit cd2a55
	    GenericGetEvent *get_event = (GenericGetEvent *)event;
Packit cd2a55
Packit cd2a55
	    if (!_XEditResGet16(stream, &get_event->num_entries))
Packit cd2a55
		goto done;
Packit cd2a55
Packit cd2a55
	    get_event->widgets = (WidgetInfo *)
Packit cd2a55
		XtCalloc(sizeof(WidgetInfo), get_event->num_entries);
Packit cd2a55
Packit cd2a55
	    for (i = 0; i < get_event->num_entries; i++)
Packit cd2a55
		if (!_XEditResGetWidgetInfo(stream, get_event->widgets + i))
Packit cd2a55
		    goto done;
Packit cd2a55
	}
Packit cd2a55
	break;
Packit cd2a55
    case GetValues:
Packit cd2a55
	{
Packit cd2a55
	    GetValuesEvent *gv_event = (GetValuesEvent *)event;
Packit cd2a55
Packit cd2a55
	    _XEditResGetString8(stream, &gv_event->name);
Packit cd2a55
	    _XEditResGet16(stream, &gv_event->num_entries);
Packit cd2a55
	    gv_event->widgets = (WidgetInfo *)
Packit cd2a55
		XtCalloc(sizeof(WidgetInfo), gv_event->num_entries);
Packit cd2a55
	    _XEditResGetWidgetInfo(stream, gv_event->widgets);
Packit cd2a55
	}
Packit cd2a55
        break;
Packit cd2a55
    default:
Packit cd2a55
	{
Packit cd2a55
	    char buf[BUFSIZ];
Packit cd2a55
Packit cd2a55
	    XmuSnprintf(buf, sizeof(buf),
Packit cd2a55
			"Unknown Protocol request %d.", event->any_event.type);
Packit cd2a55
	    SendFailure(w, sel, ident, buf);
Packit cd2a55
	    FreeEvent(event);
Packit cd2a55
	    return (NULL);
Packit cd2a55
	}
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    return (event);
Packit cd2a55
Packit cd2a55
  done:
Packit cd2a55
    SendFailure(w, sel, ident, ERROR_MESSAGE);
Packit cd2a55
    FreeEvent(event);
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	FreeEvent
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	event - event to free
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Frees the event structure and any other pieces in it that need freeing.
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
FreeEvent(EditresEvent *event)
Packit cd2a55
{
Packit cd2a55
    if (event->any_event.widgets != NULL)
Packit cd2a55
    {
Packit cd2a55
	XtFree((char *)event->any_event.widgets->ids);
Packit cd2a55
	XtFree((char *)event->any_event.widgets);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    if (event->any_event.type == SetValues)
Packit cd2a55
    {
Packit cd2a55
	XtFree(event->set_values_event.name);
Packit cd2a55
	XtFree(event->set_values_event.res_type);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    XtFree((char *)event);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	GetCommand
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	(See Xt XtConvertSelectionProc)
Packit cd2a55
 *	data - contains the ident number for the command
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Gets the Command out of the selection asserted by the resource manager.
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static void
Packit cd2a55
GetCommand(Widget w, XtPointer data, Atom *selection, Atom *type,
Packit cd2a55
	   XtPointer value, unsigned long *length, int *format)
Packit cd2a55
{
Packit cd2a55
    ResIdent ident = (ResIdent)(long)data;
Packit cd2a55
    EditresEvent *event;
Packit cd2a55
Packit cd2a55
    if (*type != res_editor_protocol || *format != EDITRES_FORMAT)
Packit cd2a55
	return;
Packit cd2a55
Packit cd2a55
    if ((event = BuildEvent(w, *selection, value, ident, *length)) != NULL)
Packit cd2a55
    {
Packit cd2a55
	ExecuteCommand(w, *selection, ident, event);
Packit cd2a55
	FreeEvent(event);
Packit cd2a55
    }
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	ExecuteCommand
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w	- widget
Packit cd2a55
 *	command	- the command to execute
Packit cd2a55
 *	value	- the associated with the command
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Executes a command string received from the resource editor.
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static void
Packit cd2a55
ExecuteCommand(Widget w, Atom sel, ResIdent ident, EditresEvent *event)
Packit cd2a55
{
Packit cd2a55
    _Xconst char *(*func)(Widget, EditresEvent*, ProtocolStream*);
Packit cd2a55
    _Xconst char *str;
Packit cd2a55
Packit cd2a55
    if (globals.block == BlockAll)
Packit cd2a55
    {
Packit cd2a55
	SendFailure(w, sel, ident,
Packit cd2a55
		    "This client has blocked all Editres commands.");
Packit cd2a55
	return;
Packit cd2a55
    }
Packit cd2a55
    else if (globals.block == BlockSetValues
Packit cd2a55
	     && event->any_event.type == SetValues)
Packit cd2a55
    {
Packit cd2a55
	SendFailure(w, sel, ident,
Packit cd2a55
		    "This client has blocked all SetValues requests.");
Packit cd2a55
	return;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    switch(event->any_event.type)
Packit cd2a55
    {
Packit cd2a55
    case SendWidgetTree:
Packit cd2a55
#if defined(LONG64) || defined(WORD64)
Packit cd2a55
	globals.base_address = (unsigned long)w & 0xFFFFFFFF00000000;
Packit cd2a55
#endif
Packit cd2a55
	func = DumpWidgets;
Packit cd2a55
	break;
Packit cd2a55
    case SetValues:
Packit cd2a55
	func = DoSetValues;
Packit cd2a55
	break;
Packit cd2a55
    case FindChild:
Packit cd2a55
	func = DoFindChild;
Packit cd2a55
	break;
Packit cd2a55
    case GetGeometry:
Packit cd2a55
	func = DoGetGeometry;
Packit cd2a55
	break;
Packit cd2a55
    case GetResources:
Packit cd2a55
	func = DoGetResources;
Packit cd2a55
	break;
Packit cd2a55
    case GetValues:
Packit cd2a55
        func = DumpValues;
Packit cd2a55
    break;
Packit cd2a55
    default:
Packit cd2a55
        {
Packit cd2a55
	    char buf[BUFSIZ];
Packit cd2a55
Packit cd2a55
	    XmuSnprintf(buf, sizeof(buf),
Packit cd2a55
			"Unknown Protocol request %d.",event->any_event.type);
Packit cd2a55
	    SendFailure(w, sel, ident, buf);
Packit cd2a55
	    return;
Packit cd2a55
	}
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    _XEditResResetStream(&globals.stream);
Packit cd2a55
    if ((str = (*func)(w, event, &globals.stream)) == NULL)
Packit cd2a55
	SendCommand(w, sel, ident, PartialSuccess, &globals.stream);
Packit cd2a55
    else
Packit cd2a55
	SendFailure(w, sel, ident, str);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	ConvertReturnCommand
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w	   - the widget that owns the selection
Packit cd2a55
 *	selection  - selection to convert
Packit cd2a55
 *	target	   - target type for this selection
Packit cd2a55
 *	type_ret   - type of the selection
Packit cd2a55
 *	value_ret  - selection value
Packit cd2a55
 *	length_ret - lenght of this selection
Packit cd2a55
 *	format_ret - the format the selection is in
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Converts a selection
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if conversion was sucessful
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static Boolean
Packit cd2a55
ConvertReturnCommand(Widget w, Atom *selection, Atom *target, Atom *type_ret,
Packit cd2a55
		     XtPointer *value_ret, unsigned long *length_ret,
Packit cd2a55
		     int *format_ret)
Packit cd2a55
{
Packit cd2a55
    /*
Packit cd2a55
     * I assume the intrinsics give me the correct selection back
Packit cd2a55
     */
Packit cd2a55
    if ((*target != client_value))
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    *type_ret = res_editor_protocol;
Packit cd2a55
    *value_ret = (XtPointer)globals.command_stream->real_top;
Packit cd2a55
    *length_ret = globals.command_stream->size + HEADER_SIZE;
Packit cd2a55
    *format_ret = EDITRES_FORMAT;
Packit cd2a55
Packit cd2a55
  return (True);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	CommandDone
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	widget	  - unused
Packit cd2a55
 *	selection - unused
Packit cd2a55
 *	target	  - unused
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	done with the selection
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static void
Packit cd2a55
CommandDone(Widget widget, Atom *selection, Atom *target)
Packit cd2a55
{
Packit cd2a55
    /* Keep the toolkit from automaticaly freeing the selection value */
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	SendFailure
Packit cd2a55
 *
Packit cd2a55
 * Paramters:
Packit cd2a55
 *	w     - widget to own the selection
Packit cd2a55
 *	sel   - selection to assert
Packit cd2a55
 *	ident - identifier
Packit cd2a55
 *	str   - error message
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Sends a failure message
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
SendFailure(Widget w, Atom sel, ResIdent ident, _Xconst char *str)
Packit cd2a55
{
Packit cd2a55
    _XEditResResetStream(&globals.stream);
Packit cd2a55
    _XEditResPutString8(&globals.stream, str);
Packit cd2a55
    SendCommand(w, sel, ident, Failure, &globals.stream);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	BuildReturnPacket
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	ident   - identifier
Packit cd2a55
 *	command - command code
Packit cd2a55
 *	stream  - protocol stream
Packit cd2a55
 * Description:
Packit cd2a55
 *	Builds a return packet, given the data to send
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	packet to send
Packit cd2a55
 */
Packit cd2a55
static XtPointer
Packit cd2a55
BuildReturnPacket(ResIdent ident, EditResError error, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    long old_alloc, old_size;
Packit cd2a55
    unsigned char *old_current;
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * We have cleverly keep enough space at the top of the header
Packit cd2a55
     * for the return protocol stream, so all we have to do is
Packit cd2a55
     * fill in the space
Packit cd2a55
     */
Packit cd2a55
    /*
Packit cd2a55
     * Fool the insert routines into putting the header in the right
Packit cd2a55
     * place while being damn sure not to realloc (that would be very bad.)
Packit cd2a55
     */
Packit cd2a55
    old_current = stream->current;
Packit cd2a55
    old_alloc = stream->alloc;
Packit cd2a55
    old_size = stream->size;
Packit cd2a55
Packit cd2a55
    stream->current = stream->real_top;
Packit cd2a55
    stream->alloc = stream->size + (2 * HEADER_SIZE);
Packit cd2a55
Packit cd2a55
    _XEditResPut8(stream, ident);
Packit cd2a55
    _XEditResPut8(stream, (unsigned char)error);
Packit cd2a55
    _XEditResPut32(stream, old_size);
Packit cd2a55
Packit cd2a55
    stream->alloc = old_alloc;
Packit cd2a55
    stream->current = old_current;
Packit cd2a55
    stream->size = old_size;
Packit cd2a55
Packit cd2a55
    return ((XtPointer)stream->real_top);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	SendCommand
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w	- widget to own the selection
Packit cd2a55
 *	sel	- selection to assert
Packit cd2a55
 *	ident   - identifier
Packit cd2a55
 *	command - command code
Packit cd2a55
 *	stream  - protocol stream
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Builds a return command line
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
SendCommand(Widget w, Atom sel, ResIdent ident, EditResError error,
Packit cd2a55
	    ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    BuildReturnPacket(ident, error, stream);
Packit cd2a55
    globals.command_stream = stream;
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * I REALLY want to own the selection.  Since this was not triggered
Packit cd2a55
     * by a user action, and I am the only one using this atom it is safe to
Packit cd2a55
     * use CurrentTime
Packit cd2a55
     */
Packit cd2a55
    XtOwnSelection(w, sel, CurrentTime, ConvertReturnCommand, NULL, CommandDone);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Generic Utility Functions
Packit cd2a55
 ************************************************************/
Packit cd2a55
static int
Packit cd2a55
qcmp_widget_list(register _Xconst void *left, register _Xconst void *right)
Packit cd2a55
{
Packit cd2a55
    return (char *)*(Widget **)left - (char *)*(Widget **)right;
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	FindChildren
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	parent   - parent widget
Packit cd2a55
 *	children - list of children
Packit cd2a55
 *	normal   - return normal children
Packit cd2a55
 *	popup    - return popup children
Packit cd2a55
 *	extra	 - return extra children
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Retuns all children (popup, normal and otherwise) of this widget
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	number of children
Packit cd2a55
 */
Packit cd2a55
static int
Packit cd2a55
FindChildren(Widget parent, Widget **children, Bool normal, Bool popup,
Packit cd2a55
	     Bool extra)
Packit cd2a55
{
Packit cd2a55
    CompositeWidget cw = (CompositeWidget)parent;
Packit cd2a55
    Cardinal i, num_children, current = 0;
Packit cd2a55
    Widget *extra_widgets = NULL;
Packit cd2a55
    Cardinal num_extra = 0;
Packit cd2a55
Packit cd2a55
    num_children = 0;
Packit cd2a55
Packit cd2a55
    if (XtIsWidget(parent) && popup)
Packit cd2a55
	num_children += parent->core.num_popups;
Packit cd2a55
Packit cd2a55
    if (XtIsComposite(parent) && normal)
Packit cd2a55
	num_children += cw->composite.num_children;
Packit cd2a55
Packit cd2a55
    if (XtIsWidget(parent) && extra)
Packit cd2a55
    {
Packit cd2a55
	XtResourceList norm_list, cons_list;
Packit cd2a55
	Cardinal num_norm, num_cons;
Packit cd2a55
	Arg args[1];
Packit cd2a55
	Widget widget;
Packit cd2a55
Packit cd2a55
	XtGetResourceList(XtClass(parent), &norm_list, &num_norm);
Packit cd2a55
Packit cd2a55
	if (XtParent(parent) != NULL)
Packit cd2a55
	    XtGetConstraintResourceList(XtClass(XtParent(parent)),
Packit cd2a55
					&cons_list, &num_cons);
Packit cd2a55
	else
Packit cd2a55
	    num_cons = 0;
Packit cd2a55
Packit cd2a55
	extra_widgets = (Widget *)XtMalloc(sizeof(Widget));
Packit cd2a55
	for (i = 0; i < num_norm; i++)
Packit cd2a55
	    if (strcmp(norm_list[i].resource_type, XtRWidget) == 0)
Packit cd2a55
	    {
Packit cd2a55
		widget = NULL;
Packit cd2a55
		XtSetArg(args[0], norm_list[i].resource_name, &widget);
Packit cd2a55
		XtGetValues(parent, args, 1);
Packit cd2a55
		if (widget && XtParent(widget) == parent)
Packit cd2a55
		{
Packit cd2a55
		    ++num_extra;
Packit cd2a55
		    extra_widgets = (Widget *) XtRealloc(
Packit cd2a55
			(char *)extra_widgets, num_extra * sizeof(Widget));
Packit cd2a55
		    extra_widgets[num_extra - 1] = widget;
Packit cd2a55
		}
Packit cd2a55
	    }
Packit cd2a55
	for (i = 0; i < num_cons; i++)
Packit cd2a55
	    if (strcmp(cons_list[i].resource_type, XtRWidget) == 0)
Packit cd2a55
	    {
Packit cd2a55
		widget = NULL;
Packit cd2a55
		XtSetArg(args[0], cons_list[i].resource_name, &widget);
Packit cd2a55
		XtGetValues(parent, args, 1);
Packit cd2a55
		if (widget && XtParent(widget) == parent)
Packit cd2a55
		{
Packit cd2a55
		    ++num_extra;
Packit cd2a55
		    extra_widgets = (Widget *) XtRealloc(
Packit cd2a55
			(char *)extra_widgets, num_extra * sizeof(Widget));
Packit cd2a55
		    extra_widgets[num_extra - 1] = widget;
Packit cd2a55
		}
Packit cd2a55
	    }
Packit cd2a55
	if (num_norm)
Packit cd2a55
	    XtFree((char *)norm_list);
Packit cd2a55
	if (num_cons)
Packit cd2a55
	    XtFree((char *)cons_list);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    if ((num_children + num_extra) == 0)
Packit cd2a55
    {
Packit cd2a55
	*children = NULL;
Packit cd2a55
	return (0);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    *children = (Widget *)XtMalloc(sizeof(Widget) * (num_children + num_extra));
Packit cd2a55
Packit cd2a55
    if (XtIsComposite(parent) && normal)
Packit cd2a55
	for (i = 0; i < cw->composite.num_children; i++, current++)
Packit cd2a55
	    (*children)[current] = cw->composite.children[i];
Packit cd2a55
Packit cd2a55
    if (XtIsWidget(parent) && popup)
Packit cd2a55
	for (i = 0; i < parent->core.num_popups; i++, current++)
Packit cd2a55
	    (*children)[current] = parent->core.popup_list[i];
Packit cd2a55
Packit cd2a55
    if (num_extra)
Packit cd2a55
    /* Check for dups */
Packit cd2a55
    {
Packit cd2a55
	Cardinal j, old_num_extra = num_extra;
Packit cd2a55
Packit cd2a55
	qsort(extra_widgets, num_extra, sizeof(Widget), qcmp_widget_list);
Packit cd2a55
	for (i = 0; i < num_extra - 1; i++)
Packit cd2a55
	    while (i < num_extra - 1 &&
Packit cd2a55
		   extra_widgets[i] == extra_widgets[i + 1])
Packit cd2a55
	    {
Packit cd2a55
		memmove(&extra_widgets[i], &extra_widgets[i + 1],
Packit cd2a55
			(num_extra - i) * sizeof(Widget));
Packit cd2a55
		--num_extra;
Packit cd2a55
	    }
Packit cd2a55
Packit cd2a55
	for (i = 0; i < num_children; i++)
Packit cd2a55
	    for (j = 0; j < num_extra; j++)
Packit cd2a55
		if ((*children)[i] == extra_widgets[j])
Packit cd2a55
		{
Packit cd2a55
		    if ((j + 1) < num_extra)
Packit cd2a55
			memmove(&extra_widgets[j], &extra_widgets[j + 1],
Packit cd2a55
				(num_extra - j) * sizeof(Widget));
Packit cd2a55
		    --num_extra;
Packit cd2a55
		}
Packit cd2a55
Packit cd2a55
	if (old_num_extra != num_extra)
Packit cd2a55
	    *children = (Widget *)XtRealloc((char *)*children, sizeof(Widget)
Packit cd2a55
					    * (num_children + num_extra));
Packit cd2a55
Packit cd2a55
	if (num_extra)
Packit cd2a55
	    memcpy(&(*children)[num_children], extra_widgets,
Packit cd2a55
		   sizeof(Widget) * num_extra);
Packit cd2a55
    }
Packit cd2a55
    if (extra_widgets)
Packit cd2a55
	XtFree((char *)extra_widgets);
Packit cd2a55
    if (num_children + num_extra == 0)
Packit cd2a55
    {
Packit cd2a55
	XtFree((char *)*children);
Packit cd2a55
	*children = NULL;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    return (num_children + num_extra);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	IsChild
Packit cd2a55
 *
Packit cd2a55
 * parameters:
Packit cd2a55
 *	top    - top of the tree
Packit cd2a55
 *	parent - parent widget
Packit cd2a55
 *	child  - child widget
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Check to see of child is a child of parent
Packit cd2a55
 */
Packit cd2a55
static Bool
Packit cd2a55
IsChild(Widget top, Widget parent, Widget child)
Packit cd2a55
{
Packit cd2a55
    int i, num_children;
Packit cd2a55
    Widget *children;
Packit cd2a55
Packit cd2a55
    if (parent == NULL)
Packit cd2a55
	return (top == child);
Packit cd2a55
Packit cd2a55
    num_children = FindChildren(parent, &children, True, True, True);
Packit cd2a55
Packit cd2a55
    for (i = 0; i < num_children; i++)
Packit cd2a55
	if (children[i] == child)
Packit cd2a55
	{
Packit cd2a55
	    XtFree((char *)children);
Packit cd2a55
	    return (True);
Packit cd2a55
	}
Packit cd2a55
Packit cd2a55
    XtFree((char *)children);
Packit cd2a55
    return (False);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	VerifyWidget
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w    - any widget in the tree
Packit cd2a55
 *	info - info about the widget to verify
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Makes sure all the widgets still exist
Packit cd2a55
 */
Packit cd2a55
static _Xconst char *
Packit cd2a55
VerifyWidget(Widget w, WidgetInfo *info)
Packit cd2a55
{
Packit cd2a55
    Widget top;
Packit cd2a55
    register int count;
Packit cd2a55
    register Widget parent;
Packit cd2a55
    register unsigned long *child;
Packit cd2a55
Packit cd2a55
    for (top = w; XtParent(top) != NULL; top = XtParent(top))
Packit cd2a55
	;
Packit cd2a55
Packit cd2a55
    parent = NULL;
Packit cd2a55
    child = info->ids;
Packit cd2a55
    count = 0;
Packit cd2a55
Packit cd2a55
    while (True)
Packit cd2a55
    {
Packit cd2a55
	if (!IsChild(top, parent, (Widget) *child))
Packit cd2a55
	    return ("This widget no longer exists in the client.");
Packit cd2a55
Packit cd2a55
	if (++count == info->num_widgets)
Packit cd2a55
	    break;
Packit cd2a55
Packit cd2a55
	parent = (Widget)*child++;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    info->real_widget = (Widget)*child;
Packit cd2a55
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Code to Perform SetValues operations
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	DoSetValues
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - a widget in the tree
Packit cd2a55
 *	event  - event that caused this action
Packit cd2a55
 *	stream - protocol stream to add
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Performs the setvalues requested
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	NULL
Packit cd2a55
 */
Packit cd2a55
static _Xconst char *
Packit cd2a55
DoSetValues(Widget w, EditresEvent *event, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    _Xconst char *str;
Packit cd2a55
    register unsigned i;
Packit cd2a55
    unsigned short count = 0;
Packit cd2a55
    SetValuesEvent *sv_event = (SetValuesEvent *)event;
Packit cd2a55
Packit cd2a55
    _XEditResPut16(stream, count);  /* insert 0, will be overwritten later */
Packit cd2a55
Packit cd2a55
    for (i = 0; i < sv_event->num_entries; i++)
Packit cd2a55
    {
Packit cd2a55
	if ((str = VerifyWidget(w, &sv_event->widgets[i])) != NULL)
Packit cd2a55
	{
Packit cd2a55
	    _XEditResPutWidgetInfo(stream, &sv_event->widgets[i]);
Packit cd2a55
	    _XEditResPutString8(stream, str);
Packit cd2a55
	    count++;
Packit cd2a55
	}
Packit cd2a55
	else
Packit cd2a55
	    ExecuteSetValues(sv_event->widgets[i].real_widget,
Packit cd2a55
			     sv_event, sv_event->widgets + i, stream, &count);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Overwrite the first 2 bytes with the real count.
Packit cd2a55
     */
Packit cd2a55
    *(stream->top) = count >> XER_NBBY;
Packit cd2a55
    *(stream->top + 1) = count;
Packit cd2a55
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	HandleToolkitErrors
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	name	   - name of the error
Packit cd2a55
 *	type	   - type of the error
Packit cd2a55
 *	class	   - class of the error
Packit cd2a55
 *	msg	   - the default message
Packit cd2a55
 *	params	   - the extra parameters for this message
Packit cd2a55
 *	num_params - ""
Packit cd2a55
 *
Packit cd2a55
 *	Description: Handles X Toolkit Errors.
Packit cd2a55
 */
Packit cd2a55
/* ARGSUSED */
Packit cd2a55
static void
Packit cd2a55
HandleToolkitErrors(String name, String type, String class, String msg,
Packit cd2a55
		    String *params, Cardinal *num_params)
Packit cd2a55
{
Packit cd2a55
    SVErrorInfo *info = &globals.error_info;
Packit cd2a55
    char buf[BUFSIZ];
Packit cd2a55
Packit cd2a55
    if (streq(name, "unknownType"))
Packit cd2a55
	XmuSnprintf(buf, sizeof(buf),
Packit cd2a55
		    "The `%s' resource is not used by this widget.",
Packit cd2a55
		    info->event->name);
Packit cd2a55
    else if (streq(name, "noColormap"))
Packit cd2a55
	XmuSnprintf(buf, sizeof(buf), msg, params[0]);
Packit cd2a55
    else if (streq(name, "conversionFailed") || streq(name, "conversionError"))
Packit cd2a55
    {
Packit cd2a55
	if (streq((String)info->event->value, XtRString))
Packit cd2a55
	    XmuSnprintf(buf, sizeof(buf),
Packit cd2a55
			"Could not convert the string '%s' for the `%s' "
Packit cd2a55
			"resource.", (String)info->event->value,
Packit cd2a55
			info->event->name);
Packit cd2a55
	else
Packit cd2a55
	    XmuSnprintf(buf, sizeof(buf),
Packit cd2a55
			"Could not convert the `%s' resource.",
Packit cd2a55
			info->event->name);
Packit cd2a55
    }
Packit cd2a55
    else
Packit cd2a55
	XmuSnprintf(buf, sizeof(buf),
Packit cd2a55
		    "Name: %s, Type: %s, Class: %s, Msg: %s",
Packit cd2a55
		    name, type, class, msg);
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Insert this info into the protocol stream, and update the count
Packit cd2a55
     */
Packit cd2a55
    (*(info->count))++;
Packit cd2a55
    _XEditResPutWidgetInfo(info->stream, info->entry);
Packit cd2a55
    _XEditResPutString8(info->stream, buf);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	ExecuteSetValues
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w	 - widget to perform the set_values on
Packit cd2a55
 *	sv_event - set values event
Packit cd2a55
 *	sv_info  - set_value info
Packit cd2a55
 *.
Packit cd2a55
 * Description:
Packit cd2a55
 *	Performs a setvalues for a given command
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
ExecuteSetValues(Widget w, SetValuesEvent *sv_event, WidgetInfo *entry,
Packit cd2a55
		 ProtocolStream *stream, unsigned short *count)
Packit cd2a55
{
Packit cd2a55
    XtErrorMsgHandler old;
Packit cd2a55
    SVErrorInfo *info = &globals.error_info;
Packit cd2a55
Packit cd2a55
    info->event = sv_event;	/* No data can be passed to */
Packit cd2a55
    info->stream = stream;	/* an error handler, so we */
Packit cd2a55
    info->count = count;	/* have to use a global */
Packit cd2a55
    info->entry = entry;
Packit cd2a55
Packit cd2a55
    old = XtAppSetWarningMsgHandler(XtWidgetToApplicationContext(w),
Packit cd2a55
				    HandleToolkitErrors);
Packit cd2a55
Packit cd2a55
    XtVaSetValues(w, XtVaTypedArg,
Packit cd2a55
		  sv_event->name, sv_event->res_type,
Packit cd2a55
		  sv_event->value, sv_event->value_len,
Packit cd2a55
		  NULL);
Packit cd2a55
Packit cd2a55
    (void)XtAppSetWarningMsgHandler(XtWidgetToApplicationContext(w), old);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Code for Creating and dumping widget tree.
Packit cd2a55
 ************************************************************/
Packit cd2a55
/* Function:
Packit cd2a55
 *	DumpWidgets
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - a widget in the tree
Packit cd2a55
 *	event  - event that caused this action
Packit cd2a55
 *	stream - protocol stream to add
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	  Given a widget it builds a protocol packet containing the entire
Packit cd2a55
 *	widget heirarchy.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	NULL
Packit cd2a55
 */
Packit cd2a55
#define TOOLKIT_TYPE ("Xt")
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static _Xconst char *
Packit cd2a55
DumpWidgets(Widget w, EditresEvent *event, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    unsigned short count = 0;
Packit cd2a55
Packit cd2a55
    /* Find Tree's root */
Packit cd2a55
    for (; XtParent(w) != NULL; w = XtParent(w))
Packit cd2a55
	;
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * hold space for count, overwritten later
Packit cd2a55
     */
Packit cd2a55
    _XEditResPut16(stream, (unsigned int)0);
Packit cd2a55
Packit cd2a55
    DumpChildren(w, stream, &count);
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * write out toolkit type
Packit cd2a55
     */
Packit cd2a55
    _XEditResPutString8(stream, TOOLKIT_TYPE);
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Overwrite the first 2 bytes with the real count
Packit cd2a55
     */
Packit cd2a55
    *(stream->top) = count >> XER_NBBY;
Packit cd2a55
    *(stream->top + 1) = count;
Packit cd2a55
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	 DumpChildren
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - widget to dump
Packit cd2a55
 *	stream - stream to dump to
Packit cd2a55
 *	count  - number of dumps we have performed
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Adds a child's name to the list.
Packit cd2a55
 */
Packit cd2a55
/* This is a trick/kludge.  To make shared libraries happier (linking
Packit cd2a55
 * against Xmu but not linking against Xt, and apparently even work
Packit cd2a55
 * as we desire on SVR4, we need to avoid an explicit data reference
Packit cd2a55
 * to applicationShellWidgetClass.  XtIsTopLevelShell is known
Packit cd2a55
 * (implementation dependent assumption!) to use a bit flag.  So we
Packit cd2a55
 * go that far.  Then, we test whether it is an applicationShellWidget
Packit cd2a55
 * class by looking for an explicit class name.  Seems pretty safe.
Packit cd2a55
 */
Packit cd2a55
static Bool
Packit cd2a55
isApplicationShell(Widget w)
Packit cd2a55
{
Packit cd2a55
    register WidgetClass c;
Packit cd2a55
Packit cd2a55
    if (!XtIsTopLevelShell(w))
Packit cd2a55
	return (False);
Packit cd2a55
    for (c = XtClass(w); c; c = c->core_class.superclass)
Packit cd2a55
      if (strcmp(c->core_class.class_name, "ApplicationShell") == 0)
Packit cd2a55
	  return (True);
Packit cd2a55
Packit cd2a55
    return (False);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
static void
Packit cd2a55
DumpChildren(Widget w, ProtocolStream *stream, unsigned short *count)
Packit cd2a55
{
Packit cd2a55
    int i, num_children;
Packit cd2a55
    Widget *children;
Packit cd2a55
    unsigned long window;
Packit cd2a55
    char *c_class;
Packit cd2a55
Packit cd2a55
    (*count)++;
Packit cd2a55
Packit cd2a55
    InsertWidget(stream, w);		/* Insert the widget into the stream */
Packit cd2a55
Packit cd2a55
    _XEditResPutString8(stream, XtName(w)); /* Insert name */
Packit cd2a55
Packit cd2a55
    if (isApplicationShell(w))
Packit cd2a55
	c_class = ((ApplicationShellWidget)w)->application.class;
Packit cd2a55
    else
Packit cd2a55
	c_class = XtClass(w)->core_class.class_name;
Packit cd2a55
Packit cd2a55
    _XEditResPutString8(stream, c_class);	/* Insert class */
Packit cd2a55
Packit cd2a55
    if (XtIsWidget(w))
Packit cd2a55
	if (XtIsRealized(w))
Packit cd2a55
	    window = XtWindow(w);
Packit cd2a55
	else
Packit cd2a55
	    window = EDITRES_IS_UNREALIZED;
Packit cd2a55
    else
Packit cd2a55
	window = EDITRES_IS_OBJECT;
Packit cd2a55
Packit cd2a55
    _XEditResPut32(stream, window);		/* Insert window id */
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Find children and recurse
Packit cd2a55
     */
Packit cd2a55
    num_children = FindChildren(w, &children, True, True, True);
Packit cd2a55
    for (i = 0; i < num_children; i++)
Packit cd2a55
	DumpChildren(children[i], stream, count);
Packit cd2a55
Packit cd2a55
    XtFree((char *)children);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Code for getting the geometry of widgets
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	DoGetGeometry
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - widget in the tree
Packit cd2a55
 *	event  - event that caused this action
Packit cd2a55
 *	stream - protocol stream to add
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Retrieves the Geometry of each specified widget.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	NULL
Packit cd2a55
 */
Packit cd2a55
static _Xconst char *
Packit cd2a55
DoGetGeometry(Widget w, EditresEvent *event, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    unsigned i;
Packit cd2a55
    _Xconst char *str;
Packit cd2a55
    GetGeomEvent *geom_event = (GetGeomEvent *)event;
Packit cd2a55
Packit cd2a55
    _XEditResPut16(stream, geom_event->num_entries);
Packit cd2a55
Packit cd2a55
    for (i = 0; i < geom_event->num_entries; i++)
Packit cd2a55
    {
Packit cd2a55
	/*
Packit cd2a55
	 * Send out the widget id
Packit cd2a55
	 */
Packit cd2a55
	_XEditResPutWidgetInfo(stream, &geom_event->widgets[i]);
Packit cd2a55
Packit cd2a55
	if ((str = VerifyWidget(w, &geom_event->widgets[i])) != NULL)
Packit cd2a55
	{
Packit cd2a55
	    _XEditResPutBool(stream, True);	/* an error occured */
Packit cd2a55
	    _XEditResPutString8(stream, str);	/* set message */
Packit cd2a55
	}
Packit cd2a55
	else
Packit cd2a55
	    ExecuteGetGeometry(geom_event->widgets[i].real_widget, stream);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	ExecuteGetGeometry
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - widget to get geometry
Packit cd2a55
 *	stream - stream to append to
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Gets the geometry for each widget specified.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if no error occured.
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
ExecuteGetGeometry(Widget w, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    int i;
Packit cd2a55
    Boolean mapped_when_man;
Packit cd2a55
    Dimension width, height, border_width;
Packit cd2a55
    Arg args[8];
Packit cd2a55
    Cardinal num_args = 0;
Packit cd2a55
    Position x, y;
Packit cd2a55
Packit cd2a55
    if (!XtIsRectObj(w) || (XtIsWidget(w) && !XtIsRealized(w)))
Packit cd2a55
    {
Packit cd2a55
	_XEditResPutBool(stream, False);	/* no error */
Packit cd2a55
	_XEditResPutBool(stream, False);	/* not visable */
Packit cd2a55
	for (i = 0; i < 5; i++)		/* fill in extra space with 0's */
Packit cd2a55
	    _XEditResPut16(stream, 0);
Packit cd2a55
	return;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    XtSetArg(args[num_args], XtNwidth, &width); num_args++;
Packit cd2a55
    XtSetArg(args[num_args], XtNheight, &height); num_args++;
Packit cd2a55
    XtSetArg(args[num_args], XtNborderWidth, &border_width); num_args++;
Packit cd2a55
    XtSetArg(args[num_args], XtNmappedWhenManaged, &mapped_when_man);
Packit cd2a55
    num_args++;
Packit cd2a55
    XtGetValues(w, args, num_args);
Packit cd2a55
Packit cd2a55
    if (!(XtIsManaged(w) && mapped_when_man) && XtIsWidget(w))
Packit cd2a55
    {
Packit cd2a55
	XWindowAttributes attrs;
Packit cd2a55
Packit cd2a55
	/*
Packit cd2a55
	 * The toolkit does not maintain mapping state, we have
Packit cd2a55
	 * to go to the server
Packit cd2a55
	 */
Packit cd2a55
	if (XGetWindowAttributes(XtDisplay(w), XtWindow(w), &attrs) != 0)
Packit cd2a55
	{
Packit cd2a55
	    if (attrs.map_state != IsViewable)
Packit cd2a55
	    {
Packit cd2a55
		_XEditResPutBool(stream, False);	/* no error */
Packit cd2a55
		_XEditResPutBool(stream, False);	/* not visable */
Packit cd2a55
		for (i = 0; i < 5; i++)	/* fill in extra space with 0's */
Packit cd2a55
		    _XEditResPut16(stream, 0);
Packit cd2a55
		return;
Packit cd2a55
	    }
Packit cd2a55
	}
Packit cd2a55
	else
Packit cd2a55
	{
Packit cd2a55
	    _XEditResPut8(stream, True); /* Error occured. */
Packit cd2a55
	    _XEditResPutString8(stream, "XGetWindowAttributes failed.");
Packit cd2a55
	    return;
Packit cd2a55
	}
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    XtTranslateCoords(w, -((int) border_width), -((int) border_width), &x, &y);
Packit cd2a55
Packit cd2a55
    _XEditResPutBool(stream, False);	/* no error */
Packit cd2a55
    _XEditResPutBool(stream, True);	/* Visable */
Packit cd2a55
    _XEditResPut16(stream, x);
Packit cd2a55
    _XEditResPut16(stream, y);
Packit cd2a55
    _XEditResPut16(stream, width);
Packit cd2a55
    _XEditResPut16(stream, height);
Packit cd2a55
    _XEditResPut16(stream, border_width);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Code for executing FindChild
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	PositionInChild
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	child - child widget to check
Packit cd2a55
 *	x     - location of point to check in the parent's coord space
Packit cd2a55
 *	y     - ""
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Returns true if this location is in the child.
Packit cd2a55
 */
Packit cd2a55
static Bool
Packit cd2a55
PositionInChild(Widget child, int x, int y)
Packit cd2a55
{
Packit cd2a55
    Arg args[6];
Packit cd2a55
    Cardinal num;
Packit cd2a55
    Dimension width, height, border_width;
Packit cd2a55
    Position child_x, child_y;
Packit cd2a55
    Boolean mapped_when_managed;
Packit cd2a55
Packit cd2a55
    if (!XtIsRectObj(child))	/* we must at least be a rect obj */
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    num = 0;
Packit cd2a55
    XtSetArg(args[num], XtNmappedWhenManaged, &mapped_when_managed); num++;
Packit cd2a55
    XtSetArg(args[num], XtNwidth, &width); num++;
Packit cd2a55
    XtSetArg(args[num], XtNheight, &height); num++;
Packit cd2a55
    XtSetArg(args[num], XtNx, &child_x); num++;
Packit cd2a55
    XtSetArg(args[num], XtNy, &child_y); num++;
Packit cd2a55
    XtSetArg(args[num], XtNborderWidth, &border_width); num++;
Packit cd2a55
    XtGetValues(child, args, num);
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * The only way we will know of the widget is mapped is to see if
Packit cd2a55
     * mapped when managed is True and this is a managed child.  Otherwise
Packit cd2a55
     * we will have to ask the server if this window is mapped
Packit cd2a55
     */
Packit cd2a55
    if (XtIsWidget(child) && !(mapped_when_managed && XtIsManaged(child)))
Packit cd2a55
    {
Packit cd2a55
	XWindowAttributes attrs;
Packit cd2a55
Packit cd2a55
	if (XGetWindowAttributes(XtDisplay(child), XtWindow(child), &attrs)
Packit cd2a55
	    &&  attrs.map_state != IsViewable)
Packit cd2a55
	return (False);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    return ((x >= child_x)
Packit cd2a55
	    && (x <= (child_x + (Position)width + 2 * (Position)border_width))
Packit cd2a55
	    && (y >= child_y)
Packit cd2a55
	    && (y <= (child_y + (Position)height + 2 * (Position)border_width)));
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_FindChild
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	parent - widget that is known to contain the point specified
Packit cd2a55
 *	x      - point in coordinates relative to the widget specified
Packit cd2a55
 *	y      - ""
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Finds the child that actually contains the point shown.
Packit cd2a55
 */
Packit cd2a55
static Widget
Packit cd2a55
_FindChild(Widget parent, int x, int y)
Packit cd2a55
{
Packit cd2a55
    Widget *children;
Packit cd2a55
    int i = FindChildren(parent, &children, True, False, True);
Packit cd2a55
Packit cd2a55
    while (i > 0)
Packit cd2a55
    {
Packit cd2a55
	i--;
Packit cd2a55
Packit cd2a55
	if (PositionInChild(children[i], x, y))
Packit cd2a55
	{
Packit cd2a55
	    Widget child = children[i];
Packit cd2a55
Packit cd2a55
	    XtFree((char *)children);
Packit cd2a55
	    return (_FindChild(child, x - child->core.x, y - child->core.y));
Packit cd2a55
	}
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    XtFree((char *)children);
Packit cd2a55
Packit cd2a55
    return (parent);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	DoFindChild
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - widget in the tree
Packit cd2a55
 *	event  - event that caused this action
Packit cd2a55
 *	stream - protocol stream to add
Packit cd2a55
 * Description:
Packit cd2a55
 *	Finds the child that contains the location specified.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	  An allocated error message if something went horribly wrong and
Packit cd2a55
 *	no set values were performed, else NULL.
Packit cd2a55
 */
Packit cd2a55
static _Xconst char *
Packit cd2a55
DoFindChild(Widget w, EditresEvent *event, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    _Xconst char *str;
Packit cd2a55
    Widget parent, child;
Packit cd2a55
    Position parent_x, parent_y;
Packit cd2a55
    FindChildEvent *find_event = (FindChildEvent *)event;
Packit cd2a55
Packit cd2a55
    if ((str = VerifyWidget(w, find_event->widgets)) != NULL)
Packit cd2a55
	return (str);
Packit cd2a55
Packit cd2a55
    parent = find_event->widgets->real_widget;
Packit cd2a55
Packit cd2a55
    XtTranslateCoords(parent, (Position) 0, (Position) 0,
Packit cd2a55
		      &parent_x, &parent_y);
Packit cd2a55
Packit cd2a55
    child = _FindChild(parent, find_event->x - (int) parent_x,
Packit cd2a55
		       find_event->y - (int) parent_y);
Packit cd2a55
Packit cd2a55
    InsertWidget(stream, child);
Packit cd2a55
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Procedures for performing GetResources
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	DoGetResources
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - widget in the tree
Packit cd2a55
 *	event  - event that caused this action
Packit cd2a55
 *	stream - protocol stream to add
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Gets the Resources associated with the widgets passed.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	NULL
Packit cd2a55
 */
Packit cd2a55
static _Xconst char *
Packit cd2a55
DoGetResources(Widget w, EditresEvent *event, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    unsigned int i;
Packit cd2a55
    _Xconst char *str;
Packit cd2a55
    GetResEvent *res_event = (GetResEvent *)event;
Packit cd2a55
Packit cd2a55
    _XEditResPut16(stream, res_event->num_entries); /* number of replys */
Packit cd2a55
Packit cd2a55
    for (i = 0; i < res_event->num_entries; i++)
Packit cd2a55
    {
Packit cd2a55
	/*
Packit cd2a55
	 * Send out the widget id
Packit cd2a55
	 */
Packit cd2a55
	_XEditResPutWidgetInfo(stream, &res_event->widgets[i]);
Packit cd2a55
	if ((str = VerifyWidget(w, &res_event->widgets[i])) != NULL)
Packit cd2a55
	{
Packit cd2a55
	    _XEditResPutBool(stream, True);	/* an error occured */
Packit cd2a55
	    _XEditResPutString8(stream, str);	/* set message */
Packit cd2a55
	}
Packit cd2a55
	else
Packit cd2a55
	{
Packit cd2a55
	    _XEditResPutBool(stream, False);	/* no error occured */
Packit cd2a55
	    ExecuteGetResources(res_event->widgets[i].real_widget, stream);
Packit cd2a55
	}
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* Function:
Packit cd2a55
 *	ExecuteGetResources
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w      - widget to get resources on
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Gets the resources for any individual widget
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
ExecuteGetResources(Widget w, ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    XtResourceList norm_list, cons_list;
Packit cd2a55
    Cardinal num_norm, num_cons;
Packit cd2a55
    register Cardinal i;
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Get Normal Resources
Packit cd2a55
     */
Packit cd2a55
    XtGetResourceList(XtClass(w), &norm_list, &num_norm);
Packit cd2a55
Packit cd2a55
    if (XtParent(w) != NULL)
Packit cd2a55
	XtGetConstraintResourceList(XtClass(XtParent(w)), &cons_list,&num_cons);
Packit cd2a55
    else
Packit cd2a55
	num_cons = 0;
Packit cd2a55
Packit cd2a55
    _XEditResPut16(stream, num_norm + num_cons);	/* how many resources */
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Insert all the normal resources
Packit cd2a55
     */
Packit cd2a55
    for (i = 0; i < num_norm; i++)
Packit cd2a55
    {
Packit cd2a55
	_XEditResPutResourceType(stream, NormalResource);
Packit cd2a55
	_XEditResPutString8(stream, norm_list[i].resource_name);
Packit cd2a55
	_XEditResPutString8(stream, norm_list[i].resource_class);
Packit cd2a55
	_XEditResPutString8(stream, norm_list[i].resource_type);
Packit cd2a55
    }
Packit cd2a55
    XtFree((char *)norm_list);
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Insert all the constraint resources
Packit cd2a55
     */
Packit cd2a55
    if (num_cons > 0)
Packit cd2a55
    {
Packit cd2a55
	for (i = 0; i < num_cons; i++)
Packit cd2a55
	{
Packit cd2a55
	    _XEditResPutResourceType(stream, ConstraintResource);
Packit cd2a55
	    _XEditResPutString8(stream, cons_list[i].resource_name);
Packit cd2a55
	    _XEditResPutString8(stream, cons_list[i].resource_class);
Packit cd2a55
	    _XEditResPutString8(stream, cons_list[i].resource_type);
Packit cd2a55
	}
Packit cd2a55
	XtFree((char *)cons_list);
Packit cd2a55
    }
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	DumpValues
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	event  - event that caused this action
Packit cd2a55
 *	stream - protocol stream to add
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Returns resource values to the resource editor.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	NULL
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static _Xconst char *
Packit cd2a55
DumpValues(Widget w, EditresEvent* event, ProtocolStream* stream)
Packit cd2a55
{
Packit cd2a55
    _Xconst char *str;
Packit cd2a55
    Arg warg[1];
Packit cd2a55
    _Xconst _XtString res_value = NULL;
Packit cd2a55
    GetValuesEvent *gv_event = (GetValuesEvent *)event;
Packit cd2a55
Packit cd2a55
    /* put the count in the stream */
Packit cd2a55
    _XEditResPut16(stream, (unsigned int)1);
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Get the resource of the widget asked for by the
Packit cd2a55
     * resource editor and insert it into the stream
Packit cd2a55
     */
Packit cd2a55
    XtSetArg(warg[0], gv_event->name, &res_value);
Packit cd2a55
Packit cd2a55
    if ((str = VerifyWidget(w, &gv_event->widgets[0])) != NULL)
Packit cd2a55
	_XEditResPutString8(stream, str);
Packit cd2a55
    else
Packit cd2a55
    {
Packit cd2a55
	_XEditresGetStringValues(gv_event->widgets[0].real_widget, warg, 1);
Packit cd2a55
	if (!res_value)
Packit cd2a55
	    res_value = "NoValue";
Packit cd2a55
	_XEditResPutString8(stream, res_value);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    return (NULL);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Code for inserting values into the protocol stream
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	InsertWidget
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *	w      - widget to insert
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	  Inserts the full parent hierarchy of this widget into the protocol
Packit cd2a55
 *	stream as a widget list.
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
InsertWidget(ProtocolStream *stream, Widget w)
Packit cd2a55
{
Packit cd2a55
    Widget temp;
Packit cd2a55
    unsigned long *widget_list;
Packit cd2a55
    register int i, num_widgets;
Packit cd2a55
Packit cd2a55
    for (temp = w, i = 0; temp != NULL; temp = XtParent(temp), i++)
Packit cd2a55
	;
Packit cd2a55
Packit cd2a55
    num_widgets = i;
Packit cd2a55
    widget_list = (unsigned long *)XtMalloc(sizeof(unsigned long) * num_widgets);
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Put the widgets into the list
Packit cd2a55
     * make sure that they are inserted in the list from parent -> child
Packit cd2a55
     */
Packit cd2a55
    for (i--, temp = w; temp != NULL; temp = XtParent(temp), i--)
Packit cd2a55
    widget_list[i] = (unsigned long)temp;
Packit cd2a55
Packit cd2a55
    _XEditResPut16(stream, num_widgets);	/* insert number of widgets */
Packit cd2a55
    for (i = 0; i < num_widgets; i++)		/* insert Widgets themselves */
Packit cd2a55
	_XEditResPut32(stream, widget_list[i]);
Packit cd2a55
Packit cd2a55
    XtFree((char *)widget_list);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * All of the following routines are public
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResPutString8
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - stream to insert string into
Packit cd2a55
 *	str    - string to insert
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Inserts a string into the protocol stream.
Packit cd2a55
 */
Packit cd2a55
void
Packit cd2a55
_XEditResPutString8(ProtocolStream *stream, _Xconst char *str)
Packit cd2a55
{
Packit cd2a55
    int i, len = strlen(str);
Packit cd2a55
Packit cd2a55
    _XEditResPut16(stream, len);
Packit cd2a55
    for (i = 0; i < len; i++, str++)
Packit cd2a55
	_XEditResPut8(stream, *str);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResPut8
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - stream to insert string into
Packit cd2a55
 *	value  - value to insert
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Inserts an 8 bit integer into the protocol stream.
Packit cd2a55
 */
Packit cd2a55
void
Packit cd2a55
_XEditResPut8(ProtocolStream *stream, unsigned int value)
Packit cd2a55
{
Packit cd2a55
    unsigned char temp;
Packit cd2a55
Packit cd2a55
    if (stream->size >= stream->alloc)
Packit cd2a55
    {
Packit cd2a55
	stream->alloc += 100;
Packit cd2a55
	stream->real_top = (unsigned char *)
Packit cd2a55
	    XtRealloc((char *)stream->real_top, stream->alloc + HEADER_SIZE);
Packit cd2a55
	stream->top = stream->real_top + HEADER_SIZE;
Packit cd2a55
	stream->current = stream->top + stream->size;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    temp = (unsigned char) (value & BYTE_MASK);
Packit cd2a55
    *((stream->current)++) = temp;
Packit cd2a55
    (stream->size)++;
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResPut16
Packit cd2a55
 *
Packit cd2a55
 * Arguments:
Packit cd2a55
 *	stream - stream to insert string into
Packit cd2a55
 *	value  - value to insert
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Inserts a 16 bit integer into the protocol stream.
Packit cd2a55
 */
Packit cd2a55
void
Packit cd2a55
_XEditResPut16(ProtocolStream *stream, unsigned int value)
Packit cd2a55
{
Packit cd2a55
    _XEditResPut8(stream, (value >> XER_NBBY) & BYTE_MASK);
Packit cd2a55
    _XEditResPut8(stream, value & BYTE_MASK);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResPut32
Packit cd2a55
 *
Packit cd2a55
 * Arguments:
Packit cd2a55
 *	stream - stream to insert string into
Packit cd2a55
 *	value  - value to insert
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Inserts a 32 bit integer into the protocol stream.
Packit cd2a55
 */
Packit cd2a55
void
Packit cd2a55
_XEditResPut32(ProtocolStream *stream, unsigned long value)
Packit cd2a55
{
Packit cd2a55
    int i;
Packit cd2a55
Packit cd2a55
    for (i = 3; i >= 0; i--)
Packit cd2a55
	_XEditResPut8(stream, (value >> (XER_NBBY * i)) & BYTE_MASK);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResPutWidgetInfo
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - stream to insert widget info into
Packit cd2a55
 *	info   - info to insert
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Inserts the widget info into the protocol stream.
Packit cd2a55
 */
Packit cd2a55
void
Packit cd2a55
_XEditResPutWidgetInfo(ProtocolStream *stream, WidgetInfo *info)
Packit cd2a55
{
Packit cd2a55
    unsigned int i;
Packit cd2a55
Packit cd2a55
    _XEditResPut16(stream, info->num_widgets);
Packit cd2a55
    for (i = 0; i < info->num_widgets; i++)
Packit cd2a55
	_XEditResPut32(stream, info->ids[i]);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Code for retrieving values from the protocol stream
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResResetStream
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - stream to reset
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Resets the protocol stream.
Packit cd2a55
 */
Packit cd2a55
void
Packit cd2a55
_XEditResResetStream(ProtocolStream *stream)
Packit cd2a55
{
Packit cd2a55
    stream->current = stream->top;
Packit cd2a55
    stream->size = 0;
Packit cd2a55
    if (stream->real_top == NULL)
Packit cd2a55
    {
Packit cd2a55
	stream->real_top = (unsigned char *)
Packit cd2a55
	    XtRealloc((char *)stream->real_top, stream->alloc + HEADER_SIZE);
Packit cd2a55
	stream->top = stream->real_top + HEADER_SIZE;
Packit cd2a55
	stream->current = stream->top + stream->size;
Packit cd2a55
    }
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
Packit cd2a55
 *
Packit cd2a55
 * The only modified field if the "current" field
Packit cd2a55
 *
Packit cd2a55
 * The only fields that must be set correctly are the "current", "top"
Packit cd2a55
 * and "size" fields.
Packit cd2a55
 */
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResGetg8
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *	value  - a pointer to value to return
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Retrieves an unsigned 8 bit value from the protocol stream.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if sucessful
Packit cd2a55
 */
Packit cd2a55
Bool
Packit cd2a55
_XEditResGet8(ProtocolStream *stream, unsigned char *value)
Packit cd2a55
{
Packit cd2a55
    if (stream->size < (unsigned long)(stream->current - stream->top))
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    *value = *((stream->current)++);
Packit cd2a55
    return (True);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResGet16
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *	value  - pointer to return value
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Retrieves an unsigned 16 bit value from the protocol stream.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if sucessful
Packit cd2a55
 */
Packit cd2a55
Bool
Packit cd2a55
_XEditResGet16(ProtocolStream *stream, unsigned short *value)
Packit cd2a55
{
Packit cd2a55
    unsigned char temp1, temp2;
Packit cd2a55
Packit cd2a55
    if (!(_XEditResGet8(stream, &temp1) && _XEditResGet8(stream, &temp2)))
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    *value = ((unsigned short)temp1 << XER_NBBY) + (unsigned short)temp2;
Packit cd2a55
    return (True);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResGetSigned16
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *	value  - pointer to return value
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Retrieves an signed 16 bit value from the protocol stream.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if sucessful
Packit cd2a55
 */
Packit cd2a55
Bool
Packit cd2a55
_XEditResGetSigned16(ProtocolStream *stream, short *value)
Packit cd2a55
{
Packit cd2a55
    unsigned char temp1, temp2;
Packit cd2a55
Packit cd2a55
    if (!(_XEditResGet8(stream, &temp1) && _XEditResGet8(stream, &temp2)))
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    if (temp1 & (1 << (XER_NBBY - 1)))	/* If the sign bit is active */
Packit cd2a55
    {
Packit cd2a55
      *value = -1;			/* store all 1's */
Packit cd2a55
      *value &= (temp1 << XER_NBBY);	/* Now and in the MSB */
Packit cd2a55
      *value &= temp2;			/* and LSB */
Packit cd2a55
    }
Packit cd2a55
    else
Packit cd2a55
	*value = ((unsigned short)temp1 << XER_NBBY) + (unsigned short)temp2;
Packit cd2a55
Packit cd2a55
    return (True);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResGet32
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *	value  - pointer to return value
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Retrieves an unsigned 32 bit value from the protocol stream.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if sucessful
Packit cd2a55
 */
Packit cd2a55
Bool
Packit cd2a55
_XEditResGet32(ProtocolStream *stream, unsigned long *value)
Packit cd2a55
{
Packit cd2a55
    unsigned short temp1, temp2;
Packit cd2a55
Packit cd2a55
    if (!(_XEditResGet16(stream, &temp1) && _XEditResGet16(stream, &temp2)))
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    *value = ((unsigned short)temp1 << (XER_NBBY * 2)) + (unsigned short)temp2;
Packit cd2a55
    return (True);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/* Function:
Packit cd2a55
 *	_XEditResGetString8
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *	str    - string to retrieve
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Retrieves an 8 bit string value from the protocol stream.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if retrieval was successful
Packit cd2a55
 */
Packit cd2a55
Bool
Packit cd2a55
_XEditResGetString8(ProtocolStream *stream, char **str)
Packit cd2a55
{
Packit cd2a55
    unsigned short len;
Packit cd2a55
    register unsigned i;
Packit cd2a55
Packit cd2a55
    if (!_XEditResGet16(stream, &len))
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    *str = XtMalloc(sizeof(char) * (len + 1));
Packit cd2a55
Packit cd2a55
    for (i = 0; i < len; i++)
Packit cd2a55
    {
Packit cd2a55
	if (!_XEditResGet8(stream, (unsigned char *)*str + i))
Packit cd2a55
	{
Packit cd2a55
	    XtFree(*str);
Packit cd2a55
	    *str = NULL;
Packit cd2a55
	    return (False);
Packit cd2a55
	}
Packit cd2a55
    }
Packit cd2a55
    (*str)[i] = '\0';
Packit cd2a55
Packit cd2a55
    return (True);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditResGetWidgetInfo
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	stream - protocol stream
Packit cd2a55
 *	info   - widget info struct to store into
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	  Retrieves the list of widgets that follow and stores them in the
Packit cd2a55
 *	widget info structure provided.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if retrieval was successful
Packit cd2a55
 */
Packit cd2a55
Bool
Packit cd2a55
_XEditResGetWidgetInfo(ProtocolStream *stream, WidgetInfo *info)
Packit cd2a55
{
Packit cd2a55
    unsigned int i;
Packit cd2a55
Packit cd2a55
    if (!_XEditResGet16(stream, &info->num_widgets))
Packit cd2a55
	return (False);
Packit cd2a55
Packit cd2a55
    info->ids = (unsigned long *)XtMalloc(sizeof(long) * info->num_widgets);
Packit cd2a55
Packit cd2a55
    for (i = 0; i < info->num_widgets; i++)
Packit cd2a55
    {
Packit cd2a55
	if (!_XEditResGet32(stream, info->ids + i))
Packit cd2a55
	{
Packit cd2a55
	    XtFree((char *)info->ids);
Packit cd2a55
	    info->ids = NULL;
Packit cd2a55
	    return (False);
Packit cd2a55
	}
Packit cd2a55
#if defined(LONG64) || defined(WORD64)
Packit cd2a55
	info->ids[i] |= globals.base_address;
Packit cd2a55
#endif
Packit cd2a55
    }
Packit cd2a55
    return (True);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/************************************************************
Packit cd2a55
 * Code for Loading the EditresBlock resource
Packit cd2a55
 ************************************************************/
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	CvStringToBlock
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	dpy	       - display
Packit cd2a55
 *	args	       - unused
Packit cd2a55
 *	num_args       - unused
Packit cd2a55
 *	from_val       - value to convert
Packit cd2a55
 *	to_val	       - where to store
Packit cd2a55
 *	converter_data - unused
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	Converts a string to an editres block value.
Packit cd2a55
 *
Packit cd2a55
 * Returns:
Packit cd2a55
 *	True if conversion was sucessful
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static Boolean
Packit cd2a55
CvtStringToBlock(Display *dpy, XrmValue *args, Cardinal *num_args,
Packit cd2a55
		 XrmValue *from_val, XrmValue *to_val,
Packit cd2a55
		 XtPointer *converter_data)
Packit cd2a55
{
Packit cd2a55
    char ptr[16];
Packit cd2a55
    static EditresBlock block;
Packit cd2a55
Packit cd2a55
    XmuNCopyISOLatin1Lowered(ptr, from_val->addr, sizeof(ptr));
Packit cd2a55
Packit cd2a55
    if (streq(ptr, "none"))
Packit cd2a55
	block = BlockNone;
Packit cd2a55
    else if (streq(ptr, "setvalues"))
Packit cd2a55
	block = BlockSetValues;
Packit cd2a55
    else if (streq(ptr, "all"))
Packit cd2a55
	block = BlockAll;
Packit cd2a55
    else
Packit cd2a55
    {
Packit cd2a55
	Cardinal num_params = 1;
Packit cd2a55
	String params[1];
Packit cd2a55
Packit cd2a55
	params[0] = from_val->addr;
Packit cd2a55
	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
Packit cd2a55
			"CvtStringToBlock", "unknownValue", "EditresError",
Packit cd2a55
			"Could not convert string \"%s\" to EditresBlock.",
Packit cd2a55
			params, &num_params);
Packit cd2a55
	return FALSE;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    if (to_val->addr != NULL)
Packit cd2a55
    {
Packit cd2a55
	if (to_val->size < sizeof(EditresBlock))
Packit cd2a55
	{
Packit cd2a55
	    to_val->size = sizeof(EditresBlock);
Packit cd2a55
	    return FALSE;
Packit cd2a55
	}
Packit cd2a55
	*(EditresBlock *)(to_val->addr) = block;
Packit cd2a55
    }
Packit cd2a55
    else
Packit cd2a55
	to_val->addr = (XtPointer)block;
Packit cd2a55
Packit cd2a55
    to_val->size = sizeof(EditresBlock);
Packit cd2a55
    return TRUE;
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
#define XtREditresBlock		"EditresBlock"
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	LoadResources
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w - any widget in the tree
Packit cd2a55
 *
Packit cd2a55
 * Description:
Packit cd2a55
 *	  Loads a global resource the determines of this application should
Packit cd2a55
 *	allow Editres requests.
Packit cd2a55
 */
Packit cd2a55
static void
Packit cd2a55
LoadResources(Widget w)
Packit cd2a55
{
Packit cd2a55
    static XtResource resources[] = {
Packit cd2a55
        {"editresBlock", "EditresBlock", XtREditresBlock, sizeof(EditresBlock),
Packit cd2a55
	 XtOffsetOf(Globals, block), XtRImmediate, (XtPointer)BlockNone}
Packit cd2a55
    };
Packit cd2a55
Packit cd2a55
    for (; XtParent(w) != NULL; w = XtParent(w))
Packit cd2a55
	;
Packit cd2a55
Packit cd2a55
    XtAppSetTypeConverter(XtWidgetToApplicationContext(w),
Packit cd2a55
			  XtRString, XtREditresBlock, CvtStringToBlock,
Packit cd2a55
			  NULL, 0, XtCacheAll, NULL);
Packit cd2a55
Packit cd2a55
    XtGetApplicationResources(w, (XtPointer)&globals, resources,
Packit cd2a55
			      XtNumber(resources), NULL, 0);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * Function:
Packit cd2a55
 *	_XEditresGetStringValues
Packit cd2a55
 *
Packit cd2a55
 * Parameters:
Packit cd2a55
 *	w	- widget
Packit cd2a55
 *	warg	- where to store result
Packit cd2a55
 *	numargs	- unused
Packit cd2a55
 */
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
static void
Packit cd2a55
_XEditresGetStringValues(Widget w, Arg *warg, int numargs)
Packit cd2a55
{
Packit cd2a55
    static char buffer[32];
Packit cd2a55
    XtResourceList res_list;
Packit cd2a55
    Cardinal num_res;
Packit cd2a55
    XtResource *res = NULL;
Packit cd2a55
    long value;
Packit cd2a55
    Cardinal i;
Packit cd2a55
    char *string = "";
Packit cd2a55
    Arg args[1];
Packit cd2a55
    XrmValue to, from;
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * Look for the resource
Packit cd2a55
     */
Packit cd2a55
    XtGetResourceList(XtClass(w), &res_list, &num_res);
Packit cd2a55
    for (i = 0; i < num_res; i++)
Packit cd2a55
	if (strcmp(res_list[i].resource_name, warg->name) == 0)
Packit cd2a55
	{
Packit cd2a55
	    res = &res_list[i];
Packit cd2a55
	    break;
Packit cd2a55
	}
Packit cd2a55
Packit cd2a55
    if (res == NULL && XtParent(w) != NULL)
Packit cd2a55
    {
Packit cd2a55
	XtFree((char *)res_list);
Packit cd2a55
	XtGetConstraintResourceList(XtClass(XtParent(w)), &res_list, &num_res);
Packit cd2a55
	for (i = 0; i < num_res; i++)
Packit cd2a55
	    if (strcmp(res_list[i].resource_name, warg->name) == 0)
Packit cd2a55
	    {
Packit cd2a55
		res = &res_list[i];
Packit cd2a55
		break;
Packit cd2a55
	    }
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    if (res == NULL)
Packit cd2a55
    {
Packit cd2a55
	/* Couldn't find resource */
Packit cd2a55
Packit cd2a55
	XtFree((char *)res_list);
Packit cd2a55
	*(XtPointer *)warg->value = NULL;
Packit cd2a55
	return;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /* try to get the value in the proper size */
Packit cd2a55
    switch (res->resource_size)
Packit cd2a55
    {
Packit cd2a55
#ifdef LONG64
Packit cd2a55
	long v8;
Packit cd2a55
#endif
Packit cd2a55
	int v4;
Packit cd2a55
	short v2;
Packit cd2a55
	char v1;
Packit cd2a55
Packit cd2a55
    case 1:
Packit cd2a55
	XtSetArg(args[0], res->resource_name, &v1;;
Packit cd2a55
	XtGetValues(w, args, 1);
Packit cd2a55
	value = (int)v1;
Packit cd2a55
	break;
Packit cd2a55
    case 2:
Packit cd2a55
	XtSetArg(args[0], res->resource_name, &v2;;
Packit cd2a55
	XtGetValues(w, args, 1);
Packit cd2a55
	value = (int)v2;
Packit cd2a55
	break;
Packit cd2a55
    case 4:
Packit cd2a55
	XtSetArg(args[0], res->resource_name, &v4;;
Packit cd2a55
	XtGetValues(w, args, 1);
Packit cd2a55
	value = (int)v4;
Packit cd2a55
	break;
Packit cd2a55
#ifdef LONG64
Packit cd2a55
    case 8:
Packit cd2a55
	XtSetArg(args[0], res->resource_name, &v8;;
Packit cd2a55
	XtGetValues(w, args, 1);
Packit cd2a55
	value = (long)v8;
Packit cd2a55
	break;
Packit cd2a55
#endif
Packit cd2a55
    default:
Packit cd2a55
	fprintf(stderr, "_XEditresGetStringValues: bad size %d\n",
Packit cd2a55
		res->resource_size);
Packit cd2a55
	string = "bad size";
Packit cd2a55
	*(char **)(warg->value) = string;
Packit cd2a55
	XtFree((char *)res_list);
Packit cd2a55
	return;
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /*
Packit cd2a55
     * If the resource is already String, no conversion needed
Packit cd2a55
     */
Packit cd2a55
    if (strcmp(XtRString, res->resource_type) == 0)
Packit cd2a55
    {
Packit cd2a55
	if (value == 0)
Packit cd2a55
	    string = "(null)";
Packit cd2a55
	else
Packit cd2a55
	    string = (char *)value;
Packit cd2a55
    }
Packit cd2a55
    else
Packit cd2a55
    {
Packit cd2a55
	from.size = res->resource_size;
Packit cd2a55
	from.addr = (XPointer)&value;
Packit cd2a55
	to.addr = NULL;
Packit cd2a55
	to.size = 0;
Packit cd2a55
Packit cd2a55
	if (XtConvertAndStore(w,res->resource_type, &from, XtRString, &to))
Packit cd2a55
	    string = to.addr;
Packit cd2a55
	else
Packit cd2a55
	{
Packit cd2a55
	    string = buffer;
Packit cd2a55
	    /*
Packit cd2a55
	     * Conversion failed, fall back to representing it as integer
Packit cd2a55
	     */
Packit cd2a55
	    switch (res->resource_size)
Packit cd2a55
	    {
Packit cd2a55
	    case sizeof(char):
Packit cd2a55
		XmuSnprintf(buffer, sizeof(buffer), "%d", (int)(value & 0xff));
Packit cd2a55
		break;
Packit cd2a55
	    case sizeof(short):
Packit cd2a55
		XmuSnprintf(buffer, sizeof(buffer), "%d", (int)(value & 0xffff));
Packit cd2a55
		break;
Packit cd2a55
	    case sizeof(int):
Packit cd2a55
		XmuSnprintf(buffer, sizeof(buffer), "0x%08x", (int)value);
Packit cd2a55
		break;
Packit cd2a55
#ifdef LONG64
Packit cd2a55
	    case sizeof(long):
Packit cd2a55
		XmuSnprintf(buffer, sizeof(buffer), "0x%016lx", value);
Packit cd2a55
		break;
Packit cd2a55
#endif
Packit cd2a55
	    }
Packit cd2a55
	}
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    if (string == NULL)
Packit cd2a55
	string = "";
Packit cd2a55
Packit cd2a55
    *(char **)(warg->value) = string;
Packit cd2a55
    XtFree((char *)res_list);
Packit cd2a55
}