From d65b4c94a92498a770e3e5c2497bf5abb921c522 Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Thu, 5 Nov 2009 18:03:37 +0000
Subject: Added libXt-1.0.7

---
 libXt/src/ActionHook.c |  135 ++
 libXt/src/Alloc.c      |  494 +++++++
 libXt/src/ArgList.c    |   77 ++
 libXt/src/Callback.c   |  692 ++++++++++
 libXt/src/ClickTime.c  |   93 ++
 libXt/src/Composite.c  |  283 ++++
 libXt/src/Constraint.c |  133 ++
 libXt/src/Convert.c    | 1087 +++++++++++++++
 libXt/src/Converters.c | 1864 ++++++++++++++++++++++++++
 libXt/src/Core.c       |  398 ++++++
 libXt/src/Create.c     |  778 +++++++++++
 libXt/src/Destroy.c    |  374 ++++++
 libXt/src/Display.c    |  763 +++++++++++
 libXt/src/Error.c      |  636 +++++++++
 libXt/src/Event.c      | 1731 ++++++++++++++++++++++++
 libXt/src/EventUtil.c  |  221 ++++
 libXt/src/Functions.c  |  216 +++
 libXt/src/GCManager.c  |  353 +++++
 libXt/src/Geometry.c   |  817 ++++++++++++
 libXt/src/GetActKey.c  |  102 ++
 libXt/src/GetResList.c |  193 +++
 libXt/src/GetValues.c  |  251 ++++
 libXt/src/HookObj.c    |  137 ++
 libXt/src/Hooks.c      |  158 +++
 libXt/src/Initialize.c | 1054 +++++++++++++++
 libXt/src/Intrinsic.c  | 1600 +++++++++++++++++++++++
 libXt/src/Keyboard.c   |  851 ++++++++++++
 libXt/src/Makefile.am  |  105 ++
 libXt/src/Makefile.in  |  729 +++++++++++
 libXt/src/Manage.c     |  491 +++++++
 libXt/src/NextEvent.c  | 1617 +++++++++++++++++++++++
 libXt/src/Object.c     |  296 +++++
 libXt/src/PassivGrab.c | 1053 +++++++++++++++
 libXt/src/Pointer.c    |  115 ++
 libXt/src/Popup.c      |  198 +++
 libXt/src/PopupCB.c    |   84 ++
 libXt/src/RectObj.c    |  193 +++
 libXt/src/ResConfig.c  | 1023 +++++++++++++++
 libXt/src/Resources.c  | 1267 ++++++++++++++++++
 libXt/src/Selection.c  | 2295 ++++++++++++++++++++++++++++++++
 libXt/src/SetSens.c    |  128 ++
 libXt/src/SetValues.c  |  443 +++++++
 libXt/src/SetWMCW.c    |  173 +++
 libXt/src/Shell.c      | 3412 ++++++++++++++++++++++++++++++++++++++++++++++++
 libXt/src/TMaction.c   | 1056 +++++++++++++++
 libXt/src/TMgrab.c     |  336 +++++
 libXt/src/TMkey.c      |  718 ++++++++++
 libXt/src/TMparse.c    | 2136 ++++++++++++++++++++++++++++++
 libXt/src/TMprint.c    |  885 +++++++++++++
 libXt/src/TMstate.c    | 2349 +++++++++++++++++++++++++++++++++
 libXt/src/Threads.c    |  428 ++++++
 libXt/src/VarCreate.c  |  399 ++++++
 libXt/src/VarGet.c     |  317 +++++
 libXt/src/Varargs.c    |  519 ++++++++
 libXt/src/Vendor.c     |  159 +++
 libXt/src/sharedlib.c  |  236 ++++
 56 files changed, 38651 insertions(+)
 create mode 100644 libXt/src/ActionHook.c
 create mode 100644 libXt/src/Alloc.c
 create mode 100644 libXt/src/ArgList.c
 create mode 100644 libXt/src/Callback.c
 create mode 100644 libXt/src/ClickTime.c
 create mode 100644 libXt/src/Composite.c
 create mode 100644 libXt/src/Constraint.c
 create mode 100644 libXt/src/Convert.c
 create mode 100644 libXt/src/Converters.c
 create mode 100644 libXt/src/Core.c
 create mode 100644 libXt/src/Create.c
 create mode 100644 libXt/src/Destroy.c
 create mode 100644 libXt/src/Display.c
 create mode 100644 libXt/src/Error.c
 create mode 100644 libXt/src/Event.c
 create mode 100644 libXt/src/EventUtil.c
 create mode 100644 libXt/src/Functions.c
 create mode 100644 libXt/src/GCManager.c
 create mode 100644 libXt/src/Geometry.c
 create mode 100644 libXt/src/GetActKey.c
 create mode 100644 libXt/src/GetResList.c
 create mode 100644 libXt/src/GetValues.c
 create mode 100644 libXt/src/HookObj.c
 create mode 100644 libXt/src/Hooks.c
 create mode 100644 libXt/src/Initialize.c
 create mode 100644 libXt/src/Intrinsic.c
 create mode 100644 libXt/src/Keyboard.c
 create mode 100644 libXt/src/Makefile.am
 create mode 100644 libXt/src/Makefile.in
 create mode 100644 libXt/src/Manage.c
 create mode 100644 libXt/src/NextEvent.c
 create mode 100644 libXt/src/Object.c
 create mode 100644 libXt/src/PassivGrab.c
 create mode 100644 libXt/src/Pointer.c
 create mode 100644 libXt/src/Popup.c
 create mode 100644 libXt/src/PopupCB.c
 create mode 100644 libXt/src/RectObj.c
 create mode 100644 libXt/src/ResConfig.c
 create mode 100644 libXt/src/Resources.c
 create mode 100644 libXt/src/Selection.c
 create mode 100644 libXt/src/SetSens.c
 create mode 100644 libXt/src/SetValues.c
 create mode 100644 libXt/src/SetWMCW.c
 create mode 100644 libXt/src/Shell.c
 create mode 100644 libXt/src/TMaction.c
 create mode 100644 libXt/src/TMgrab.c
 create mode 100644 libXt/src/TMkey.c
 create mode 100644 libXt/src/TMparse.c
 create mode 100644 libXt/src/TMprint.c
 create mode 100644 libXt/src/TMstate.c
 create mode 100644 libXt/src/Threads.c
 create mode 100644 libXt/src/VarCreate.c
 create mode 100644 libXt/src/VarGet.c
 create mode 100644 libXt/src/Varargs.c
 create mode 100644 libXt/src/Vendor.c
 create mode 100644 libXt/src/sharedlib.c

(limited to 'libXt/src')

diff --git a/libXt/src/ActionHook.c b/libXt/src/ActionHook.c
new file mode 100644
index 000000000..6c2fe2bd0
--- /dev/null
+++ b/libXt/src/ActionHook.c
@@ -0,0 +1,135 @@
+/* $Xorg: ActionHook.c,v 1.4 2001/02/09 02:03:53 xorgcvs Exp $ */
+
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/ActionHook.c,v 1.2 2001/08/22 22:52:17 dawes Exp $ */
+
+/* 
+ * Contains XtAppAddActionHook, XtRemoveActionHook
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+
+/*ARGSUSED*/
+static void FreeActionHookList(
+    Widget widget,		/* unused (and invalid) */
+    XtPointer closure,		/* ActionHook* */
+    XtPointer call_data)	/* unused */
+{
+    ActionHook list = *(ActionHook*)closure;
+    while (list != NULL) {
+	ActionHook next = list->next;
+	XtFree( (XtPointer)list );
+	list = next;
+    }
+}
+
+
+XtActionHookId XtAppAddActionHook(
+    XtAppContext app,
+    XtActionHookProc proc,
+    XtPointer closure)
+{
+    ActionHook hook = XtNew(ActionHookRec);
+    LOCK_APP(app);
+    hook->next = app->action_hook_list;
+    hook->app = app;
+    hook->proc = proc;
+    hook->closure = closure;
+    if (app->action_hook_list == NULL) {
+	_XtAddCallback( &app->destroy_callbacks,
+		        FreeActionHookList,
+		        (XtPointer)&app->action_hook_list
+		      );
+    }
+    app->action_hook_list = hook;
+    UNLOCK_APP(app);
+    return (XtActionHookId)hook;
+}
+
+
+void XtRemoveActionHook(
+    XtActionHookId id)
+{
+    ActionHook *p, hook = (ActionHook)id;
+    XtAppContext app = hook->app;
+    LOCK_APP(app);
+    for (p = &app->action_hook_list; p != NULL && *p != hook; p = &(*p)->next);
+    if (p) {
+	*p = hook->next;
+	XtFree( (XtPointer)hook );
+	if (app->action_hook_list == NULL)
+	    _XtRemoveCallback(&app->destroy_callbacks, FreeActionHookList,
+			      (XtPointer) &app->action_hook_list);
+    }
+#ifdef DEBUG
+    else {
+	XtAppWarningMsg(app, "badId", "xtRemoveActionHook", XtCXtToolkitError,
+			"XtRemoveActionHook called with bad or old hook id",
+			(String*)NULL, (Cardinal*)NULL);
+    }
+#endif /*DEBUG*/
+    UNLOCK_APP(app);
+}
diff --git a/libXt/src/Alloc.c b/libXt/src/Alloc.c
new file mode 100644
index 000000000..1312db2ac
--- /dev/null
+++ b/libXt/src/Alloc.c
@@ -0,0 +1,494 @@
+/* $Xorg: Alloc.c,v 1.4 2001/02/09 02:03:53 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Alloc.c,v 1.9 2001/12/14 19:56:07 dawes Exp $ */
+
+/*
+ * X Toolkit Memory Allocation Routines
+ *
+ * Uses Xlib memory management, which is spec'd to be re-entrant.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "InitialI.h"
+#undef _XBCOPYFUNC
+
+#include <stdlib.h>
+
+#define Xmalloc(size) malloc((size))
+#define Xrealloc(ptr, size) realloc((ptr), (size))
+#define Xcalloc(nelem, elsize) calloc((nelem), (elsize))
+#define Xfree(ptr) free(ptr)
+
+#ifdef _XNEEDBCOPYFUNC
+void _XtBcopy(
+    char *src, char *dst,
+    int length)
+{
+    if (src < dst) {
+	dst += length;
+	src += length;
+	while (length--)
+	    *--dst = *--src;
+    } else {
+	while (length--)
+	    *dst++ = *src++;
+    }
+}
+#endif
+
+void _XtAllocError(
+    String type)
+{
+    Cardinal num_params = 1;
+    if (type == NULL) type = "local memory allocation";
+    XtErrorMsg("allocError", type, XtCXtToolkitError,
+	       "Cannot perform %s", &type, &num_params);
+}
+
+void _XtHeapInit(
+    Heap*	heap)
+{
+    heap->start = NULL;
+    heap->bytes_remaining = 0;
+}
+
+#ifndef XTTRACEMEMORY
+
+char *XtMalloc(
+    unsigned size)
+{
+    char *ptr;
+
+#if defined(MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
+    /* preserve this (broken) behavior until everyone fixes their apps */
+    if (!size) size = 1;
+#endif
+    if ((ptr = Xmalloc(size)) == NULL)
+        _XtAllocError("malloc");
+
+    return(ptr);
+}
+
+char *XtRealloc(
+    char     *ptr,
+    unsigned size)
+{
+   if (ptr == NULL) {
+#ifdef MALLOC_0_RETURNS_NULL
+	if (!size) size = 1;
+#endif
+	return(XtMalloc(size));
+   } else if ((ptr = Xrealloc(ptr, size)) == NULL
+#ifdef MALLOC_0_RETURNS_NULL
+		&& size
+#endif
+	)
+	_XtAllocError("realloc");
+
+   return(ptr);
+}
+
+char *XtCalloc(
+    unsigned num, unsigned size)
+{
+    char *ptr;
+
+#if defined(MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
+    /* preserve this (broken) behavior until everyone fixes their apps */
+    if (!size) num = size = 1;
+#endif
+    if ((ptr = Xcalloc(num, size)) == NULL)
+	_XtAllocError("calloc");
+
+    return(ptr);
+}
+
+void XtFree(
+    char *ptr)
+{
+    if (ptr != NULL) Xfree(ptr);
+}
+
+char* __XtMalloc(
+    unsigned size)
+{
+#ifdef MALLOC_0_RETURNS_NULL
+    if (!size) size = 1;
+#endif
+    return XtMalloc (size);
+}
+
+char* __XtCalloc(
+    unsigned num, unsigned size)
+{
+#ifdef MALLOC_0_RETURNS_NULL
+    if (!size) num = size = 1;
+#endif
+    return XtCalloc(num, size);
+}
+
+#ifndef HEAP_SEGMENT_SIZE
+#define HEAP_SEGMENT_SIZE 1492
+#endif
+
+char* _XtHeapAlloc(
+    Heap*	heap,
+    Cardinal	bytes)
+{
+    register char* heap_loc;
+    if (heap == NULL) return XtMalloc(bytes);
+    if (heap->bytes_remaining < (int)bytes) {
+	if ((bytes + sizeof(char*)) >= (HEAP_SEGMENT_SIZE>>1)) {
+	    /* preserve current segment; insert this one in front */
+#ifdef _TRACE_HEAP
+	    printf( "allocating large segment (%d bytes) on heap %#x\n",
+		    bytes, heap );
+#endif
+	    heap_loc = XtMalloc(bytes + sizeof(char*));
+	    if (heap->start) {
+		*(char**)heap_loc = *(char**)heap->start;
+		*(char**)heap->start = heap_loc;
+	    }
+	    else {
+		*(char**)heap_loc = NULL;
+		heap->start = heap_loc;
+	    }
+	    return heap_loc + sizeof(char*);
+	}
+	/* else discard remainder of this segment */
+#ifdef _TRACE_HEAP
+	printf( "allocating new segment on heap %#x\n", heap );
+#endif
+	heap_loc = XtMalloc((unsigned)HEAP_SEGMENT_SIZE);
+	*(char**)heap_loc = heap->start;
+	heap->start = heap_loc;
+	heap->current = heap_loc + sizeof(char*);
+	heap->bytes_remaining = HEAP_SEGMENT_SIZE - sizeof(char*);
+    }
+    bytes = (bytes + (sizeof(long) - 1)) & (~(sizeof(long) - 1));
+    heap_loc = heap->current;
+    heap->current += bytes;
+    heap->bytes_remaining -= bytes; /* can be negative, if rounded */
+    return heap_loc;
+}
+
+void _XtHeapFree(
+    Heap*	heap)
+{
+    char* segment = heap->start;
+    while (segment != NULL) {
+	char* next_segment = *(char**)segment;
+	XtFree(segment);
+	segment = next_segment;
+    }
+    heap->start = NULL;
+    heap->bytes_remaining = 0;
+}
+
+#else
+
+/*
+ * X Toolkit Memory Trace Allocation Routines
+ */
+
+#undef XtMalloc
+#undef XtRealloc
+#undef XtCalloc
+#undef XtFree
+
+typedef struct _Stats *StatsPtr;
+typedef struct _Stats {
+    StatsPtr prev, next;
+    char *file;
+    int line;
+    unsigned size;
+    unsigned long seq;
+    XtPointer heap;
+} Stats;
+
+static StatsPtr XtMemory = (StatsPtr)NULL;
+static unsigned long ActiveXtMemory = 0;
+static unsigned long XtSeqId = 0;
+static unsigned long XtSeqBreakpoint = ~0;
+
+#define StatsSize(n) ((((n) + (sizeof(long) - 1)) & ~(sizeof(long) - 1)) + sizeof(Stats))
+#define ToStats(ptr) ((StatsPtr)(ptr - sizeof(Stats)))
+#define ToMem(ptr) (((char *)ptr) + sizeof(Stats))
+
+#define CHAIN(ptr,len,hp) \
+    ptr->next = XtMemory; \
+    if (XtMemory) \
+        XtMemory->prev = ptr; \
+    XtMemory = ptr; \
+    ptr->prev = (StatsPtr)NULL; \
+    ptr->file = file; \
+    ptr->line = line; \
+    ptr->size = len; \
+    ptr->heap = hp; \
+    if (file) \
+	ActiveXtMemory += len; \
+    ptr->seq = XtSeqId; \
+    if (XtSeqId == XtSeqBreakpoint) \
+	_XtBreakpoint(ptr); \
+    XtSeqId++
+
+/*ARGUSED*/
+static void _XtBreakpoint(
+    StatsPtr mem)
+{
+    mem->seq = XtSeqId; /* avoid being optimized out of existence */
+}
+
+char *_XtMalloc(
+    unsigned size,
+    char *file,
+    int line)
+{
+    StatsPtr ptr;
+    unsigned newsize;
+    char* retval = NULL;
+
+    LOCK_PROCESS;
+    newsize = StatsSize(size);
+    if ((ptr = (StatsPtr)Xmalloc(newsize)) == NULL)
+        _XtAllocError("malloc");
+    CHAIN(ptr, size, NULL);
+    retval = (ToMem(ptr));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+char *XtMalloc(
+    unsigned size)
+{
+    return _XtMalloc(size, (char *)NULL, 0);
+}
+
+char *_XtRealloc(
+    char     *ptr,
+    unsigned size,
+    char *file,
+    int line)
+{
+   char *newptr;
+
+   LOCK_PROCESS;
+   newptr = _XtMalloc(size, file, line);
+   if (ptr) {
+       unsigned copysize = ToStats(ptr)->size;
+       if (copysize > size) copysize = size;
+       memmove(newptr, ptr, copysize);
+       _XtFree(ptr);
+   }
+   UNLOCK_PROCESS;
+   return(newptr);
+}
+
+char *XtRealloc(
+    char     *ptr,
+    unsigned size)
+{
+    return _XtRealloc(ptr, size, (char *)NULL, 0);
+}
+
+char *_XtCalloc(
+    unsigned num, unsigned size,
+    char *file,
+    int line)
+{
+    StatsPtr ptr;
+    unsigned total, newsize;
+    char* retval = NULL;
+
+    LOCK_PROCESS;
+    total = num * size;
+    newsize = StatsSize(total);
+    if ((ptr = (StatsPtr)Xcalloc(newsize, 1)) == NULL)
+        _XtAllocError("calloc");
+    CHAIN(ptr, total, NULL);
+    retval = (ToMem(ptr));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+char *XtCalloc(
+    unsigned num, unsigned size)
+{
+    return _XtCalloc(num, size, (char *)NULL, 0);
+}
+
+Boolean _XtIsValidPointer(
+    char *ptr)
+{
+    register StatsPtr mem;
+    register StatsPtr stp = ToStats(ptr);
+
+    LOCK_PROCESS;
+    for (mem = XtMemory; mem; mem = mem->next) {
+	if (mem == stp) {
+	    UNLOCK_PROCESS;
+	    return True;
+	}
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+Boolean _XtValidateMemory = False;
+
+void _XtFree(
+    char *ptr)
+{
+   register StatsPtr stp;
+
+   LOCK_PROCESS;
+   if (ptr) {
+       if (_XtValidateMemory && !_XtIsValidPointer(ptr))
+	   abort();
+       stp = ToStats(ptr);
+       if (stp->file)
+	   ActiveXtMemory -= stp->size;
+       if (stp->prev)
+	   stp->prev->next = stp->next;
+       else
+	   XtMemory = stp->next;
+       if (stp->next)
+	   stp->next->prev = stp->prev;
+       Xfree((char *)stp);
+   }
+   UNLOCK_PROCESS;
+}
+
+void XtFree(char *ptr)
+{
+   _XtFree(ptr);
+}
+
+char *_XtHeapMalloc(
+    Heap *heap,
+    Cardinal size,
+    char *file,
+    int line)
+{
+    StatsPtr ptr;
+    unsigned newsize;
+    XtPointer hp = (XtPointer) heap;
+    char* retval = NULL;
+
+    LOCK_PROCESS;
+    newsize = StatsSize(size);
+    if ((ptr = (StatsPtr)Xmalloc(newsize)) == NULL)
+        _XtAllocError("malloc");
+    CHAIN(ptr, size, hp);
+    retval = (ToMem(ptr));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+void _XtHeapFree(register XtPointer heap)
+{
+    register StatsPtr mem, next;
+
+    LOCK_PROCESS;
+    for (mem = XtMemory; mem; mem = next) {
+	next = mem->next;
+	if (mem->heap == heap) {
+	    if (mem->file)
+		ActiveXtMemory -= mem->size;
+	    if (mem->prev)
+		mem->prev->next = next;
+	    else
+		XtMemory = next;
+	    if (next)
+		next->prev = mem->prev;
+	    Xfree((char *)mem);
+	}
+    }
+    UNLOCK_PROCESS;
+}
+
+#include <stdio.h>
+
+void _XtPrintMemory(char * filename)
+{
+    register StatsPtr mem;
+    FILE *f;
+
+    if (filename == NULL)
+	f = stderr;
+    else 
+	f = fopen(filename, "w");
+    LOCK_PROCESS;
+    fprintf(f, "total size: %d\n", ActiveXtMemory);
+    for (mem = XtMemory; mem; mem = mem->next) {
+	if (mem->file)
+	    fprintf(f, "size: %6d  seq: %5d  %12s(%4d)  %s\n",
+		    mem->size, mem->seq,
+		    mem->file, mem->line, mem->heap ? "heap" : "");
+    }
+    UNLOCK_PROCESS;
+    if (filename) fclose(f);
+}
+
+#endif  /* XTTRACEMEMORY */
diff --git a/libXt/src/ArgList.c b/libXt/src/ArgList.c
new file mode 100644
index 000000000..622f31351
--- /dev/null
+++ b/libXt/src/ArgList.c
@@ -0,0 +1,77 @@
+/* $Xorg: ArgList.c,v 1.4 2001/02/09 02:03:53 xorgcvs Exp $ */
+
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include	"IntrinsicI.h"
+#include	<stdio.h>
+
+/*
+ * This routine merges two arglists. It does NOT check for duplicate entries.
+ */
+
+ArgList XtMergeArgLists(
+    ArgList args1,
+    Cardinal num_args1,
+    ArgList args2,
+    Cardinal num_args2)
+{
+    ArgList result, args;
+
+    result = (ArgList) __XtCalloc((unsigned) num_args1 + num_args2,
+				(unsigned) sizeof(Arg));
+
+    for (args = result; num_args1 != 0; num_args1--)
+    	*args++ = *args1++;
+    for (             ; num_args2 != 0; num_args2--)
+    	*args++ = *args2++;
+
+    return result;
+}
diff --git a/libXt/src/Callback.c b/libXt/src/Callback.c
new file mode 100644
index 000000000..03aae5274
--- /dev/null
+++ b/libXt/src/Callback.c
@@ -0,0 +1,692 @@
+/* $Xorg: Callback.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Callback.c,v 1.8 2001/12/14 19:56:08 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+static String XtNinvalidCallbackList = "invalidCallbackList";
+static String XtNxtAddCallback = "xtAddCallback";
+static String XtNxtRemoveCallback = "xtRemoveCallback";
+static String XtNxtRemoveAllCallback = "xtRemoveAllCallback";
+static String XtNxtCallCallback = "xtCallCallback";
+
+/* However it doesn't contain a final NULL record */
+#define ToList(p) ((XtCallbackList) ((p)+1))
+
+static InternalCallbackList* FetchInternalList(
+    Widget	widget,
+    _Xconst char *name)
+{
+    XrmQuark quark;
+    int n;
+    CallbackTable offsets;
+    InternalCallbackList* retval = NULL;
+
+    quark = StringToQuark(name);
+    LOCK_PROCESS;
+    offsets = (CallbackTable)
+	widget->core.widget_class->core_class.callback_private;
+
+    for (n = (int)(long) *(offsets++); --n >= 0; offsets++)
+	if (quark == (*offsets)->xrm_name) {
+	    retval = (InternalCallbackList *)
+		((char *) widget - (*offsets)->xrm_offset - 1);
+	    break;
+	}
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+
+void _XtAddCallback(
+    InternalCallbackList*   callbacks,
+    XtCallbackProc	    callback,
+    XtPointer		    closure)
+{
+    register InternalCallbackList icl;
+    register XtCallbackList cl;
+    register int count;
+
+    icl = *callbacks;
+    count = icl ? icl->count : 0;
+
+    if (icl && icl->call_state) {
+	icl->call_state |= _XtCBFreeAfterCalling;
+	icl = (InternalCallbackList)
+	    __XtMalloc(sizeof(InternalCallbackRec) +
+		     sizeof(XtCallbackRec) * (count + 1));
+	(void) memmove((char *)ToList(icl), (char *)ToList(*callbacks),
+		       sizeof(XtCallbackRec) * count);
+    } else {
+	icl = (InternalCallbackList)
+	    XtRealloc((char *) icl, sizeof(InternalCallbackRec) +
+		      sizeof(XtCallbackRec) * (count + 1));
+    }
+    *callbacks = icl;
+    icl->count = count + 1;
+    icl->is_padded = 0;
+    icl->call_state = 0;
+    cl = ToList(icl) + count;
+    cl->callback = callback;
+    cl->closure = closure;
+} /* _XtAddCallback */
+
+void _XtAddCallbackOnce(
+    register InternalCallbackList*callbacks,
+    XtCallbackProc	    callback,
+    XtPointer		    closure)
+{
+    register XtCallbackList cl = ToList(*callbacks);
+    register int i;
+
+    for (i=(*callbacks)->count; --i >= 0; cl++)
+	if (cl->callback == callback && cl->closure == closure)
+	    return;
+
+    _XtAddCallback(callbacks, callback, closure);
+} /* _XtAddCallbackOnce */
+
+void XtAddCallback(
+    Widget	    widget,
+    _Xconst char*   name,
+    XtCallbackProc  callback,
+    XtPointer	    closure
+    )
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+	XtAppWarningMsg(app,
+	       XtNinvalidCallbackList,XtNxtAddCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtAddCallback",
+	      (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+    _XtAddCallback(callbacks, callback, closure);
+    if (!_XtIsHookObject(widget)) {
+	hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+	if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	    XtChangeHookDataRec call_data;
+
+	    call_data.type = XtHaddCallback;
+	    call_data.widget = widget;
+	    call_data.event_data = (XtPointer) name;
+	    XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+	}
+    }
+    UNLOCK_APP(app);
+} /* XtAddCallback */
+
+/* ARGSUSED */
+static void AddCallbacks(
+    Widget		    widget,
+    InternalCallbackList   *callbacks,
+    XtCallbackList	    newcallbacks)
+{
+    register InternalCallbackList icl;
+    register int i, j;
+    register XtCallbackList cl;
+
+    icl = *callbacks;
+    i = icl ? icl->count : 0;
+    for (j=0, cl = newcallbacks; cl->callback; cl++, j++);
+    if (icl && icl->call_state) {
+	icl->call_state |= _XtCBFreeAfterCalling;
+	icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) +
+					      sizeof(XtCallbackRec) * (i+j));
+	(void) memmove((char *)ToList(*callbacks), (char *)ToList(icl),
+		       sizeof(XtCallbackRec) * i);
+    } else {
+	icl = (InternalCallbackList) XtRealloc((char *) icl,
+					       sizeof(InternalCallbackRec) +
+					       sizeof(XtCallbackRec) * (i+j));
+    }
+    *callbacks = icl;
+    icl->count = i+j;
+    icl->is_padded = 0;
+    icl->call_state = 0;
+    for (cl = ToList(icl) + i; --j >= 0; )
+	*cl++ = *newcallbacks++;
+} /* AddCallbacks */
+
+void XtAddCallbacks(
+    Widget	    widget,
+    _Xconst char*   name,
+    XtCallbackList  xtcallbacks
+    )
+{
+    InternalCallbackList* callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+	XtAppWarningMsg(app,
+	       XtNinvalidCallbackList,XtNxtAddCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtAddCallbacks",
+	      (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+    AddCallbacks(widget, callbacks, xtcallbacks);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHaddCallbacks;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer) name;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtAddCallbacks */
+
+void _XtRemoveCallback (
+    InternalCallbackList   *callbacks,
+    XtCallbackProc	    callback,
+    XtPointer		    closure)
+{
+    register InternalCallbackList icl;
+    register int i, j;
+    register XtCallbackList cl, ncl, ocl;
+
+    icl = *callbacks;
+    if (!icl) return;
+
+    cl = ToList(icl);
+    for (i=icl->count; --i >= 0; cl++) {
+	if (cl->callback == callback && cl->closure == closure) {
+	    if (icl->call_state) {
+		icl->call_state |= _XtCBFreeAfterCalling;
+		if (icl->count == 1) {
+		    *callbacks = NULL;
+		} else {
+		    j = icl->count - i - 1;
+		    ocl = ToList(icl);
+		    icl = (InternalCallbackList)
+			__XtMalloc(sizeof(InternalCallbackRec) +
+				 sizeof(XtCallbackRec) * (i + j));
+		    icl->count = i + j;
+		    icl->is_padded = 0;
+		    icl->call_state = 0;
+		    ncl = ToList(icl);
+		    while (--j >= 0)
+			*ncl++ = *ocl++;
+		    while (--i >= 0)
+			*ncl++ = *++cl;
+		    *callbacks = icl;
+		}
+	    } else {
+		if (--icl->count) {
+		    ncl = cl + 1;
+		    while (--i >= 0)
+			*cl++ = *ncl++;
+		    icl = (InternalCallbackList)
+			XtRealloc((char *) icl, sizeof(InternalCallbackRec)
+				  + sizeof(XtCallbackRec) * icl->count);
+		    icl->is_padded = 0;
+		    *callbacks = icl;
+		} else {
+		    XtFree((char *) icl);
+		    *callbacks = NULL;
+		}
+	    }
+	    return;
+	}
+    }
+} /* _XtRemoveCallback */
+
+void XtRemoveCallback (
+    Widget	    widget,
+    _Xconst char*   name,
+    XtCallbackProc  callback,
+    XtPointer	    closure
+    )
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+	XtAppWarningMsg(app,
+	       XtNinvalidCallbackList,XtNxtRemoveCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtRemoveCallback",
+	      (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+    _XtRemoveCallback(callbacks, callback, closure);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHremoveCallback;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer) name;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtRemoveCallback */
+
+
+void XtRemoveCallbacks (
+    Widget	    widget,
+    _Xconst char*   name,
+    XtCallbackList  xtcallbacks)
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    int i;
+    InternalCallbackList icl;
+    XtCallbackList cl, ccl, rcl;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+	XtAppWarningMsg(app,
+	       XtNinvalidCallbackList,XtNxtRemoveCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtRemoveCallbacks",
+	      (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+
+    icl = *callbacks;
+    if (!icl) {
+	UNLOCK_APP(app);
+	return;
+    }
+
+    i = icl->count;
+    cl = ToList(icl);
+    if (icl->call_state) {
+	icl->call_state |= _XtCBFreeAfterCalling;
+	icl = (InternalCallbackList)__XtMalloc(sizeof(InternalCallbackRec) +
+					     sizeof(XtCallbackRec) * i);
+	icl->count = i;
+	icl->call_state = 0;
+    }
+    ccl = ToList(icl);
+    while (--i >= 0) {
+	*ccl++ = *cl;
+	for (rcl=xtcallbacks; rcl->callback; rcl++) {
+	    if (cl->callback == rcl->callback && cl->closure == rcl->closure) {
+		ccl--;
+		icl->count--;
+		break;
+	    }
+	}
+	cl++;
+    }
+    if (icl->count) {
+	icl = (InternalCallbackList)
+	    XtRealloc((char *)icl, (sizeof(InternalCallbackRec) +
+				    sizeof(XtCallbackRec) * icl->count));
+	icl->is_padded = 0;
+	*callbacks = icl;
+    } else {
+	XtFree((char *)icl);
+	*callbacks = NULL;
+    }
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHremoveCallbacks;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer) name;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtRemoveCallbacks */
+
+
+void _XtRemoveAllCallbacks (
+    InternalCallbackList *callbacks)
+{
+    register InternalCallbackList icl = *callbacks;
+
+    if (icl) {
+	if (icl->call_state)
+	    icl->call_state |= _XtCBFreeAfterCalling;
+	else
+	    XtFree((char *) icl);
+	*callbacks = NULL;
+    }
+} /* _XtRemoveAllCallbacks */
+
+void XtRemoveAllCallbacks(
+    Widget widget,
+    _Xconst char* name)
+{
+    InternalCallbackList *callbacks;
+    Widget hookobj;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+	XtAppWarningMsg(app,
+	       XtNinvalidCallbackList,XtNxtRemoveAllCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtRemoveAllCallbacks",
+	      (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+    _XtRemoveAllCallbacks(callbacks);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHremoveAllCallbacks;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer) name;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtRemoveAllCallbacks */
+
+InternalCallbackList _XtCompileCallbackList(
+    XtCallbackList xtcallbacks)
+{
+    register int n;
+    register XtCallbackList xtcl, cl;
+    register InternalCallbackList callbacks;
+
+    for (n=0, xtcl=xtcallbacks; xtcl->callback; n++, xtcl++) {};
+    if (n == 0) return (InternalCallbackList) NULL;
+
+    callbacks = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) +
+						sizeof(XtCallbackRec) * n);
+    callbacks->count = n;
+    callbacks->is_padded = 0;
+    callbacks->call_state = 0;
+    cl = ToList(callbacks);
+    while (--n >= 0)
+	*cl++ = *xtcallbacks++;
+    return(callbacks);
+} /* _XtCompileCallbackList */
+
+
+XtCallbackList _XtGetCallbackList(
+    InternalCallbackList *callbacks)
+{
+    register int i;
+    register InternalCallbackList icl;
+    register XtCallbackList cl, ocl;
+
+    icl = *callbacks;
+    if (!icl) {
+	static XtCallbackRec emptyList[1] = { {NULL, NULL} };
+	return (XtCallbackList)emptyList;
+    }
+    if (icl->is_padded)
+	return ToList(icl);
+    i = icl->count;
+    if (icl->call_state) {
+	icl->call_state |= _XtCBFreeAfterCalling;
+	ocl = ToList(icl);
+	icl = (InternalCallbackList) __XtMalloc(sizeof(InternalCallbackRec) +
+					      sizeof(XtCallbackRec) * (i+1));
+	icl->count = i;
+	icl->call_state = 0;
+	cl = ToList(icl);
+	while (--i >= 0)
+	    *cl++ = *ocl++;
+    } else {
+	icl = (InternalCallbackList) XtRealloc((char *)icl,
+					       sizeof(InternalCallbackRec) +
+					       sizeof(XtCallbackRec) * (i+1));
+	cl = ToList(icl) + i;
+    }
+    icl->is_padded = 1;
+    cl->callback = (XtCallbackProc) NULL;
+    cl->closure = NULL;
+    *callbacks = icl;
+    return ToList(icl);
+}
+
+void XtCallCallbacks(
+    Widget   widget,
+    _Xconst char* name,
+    XtPointer call_data
+    )
+{
+    InternalCallbackList *callbacks;
+    InternalCallbackList icl;
+    XtCallbackList cl;
+    int i;
+    char ostate;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, name);
+    if (!callbacks) {
+	XtAppWarningMsg(app,
+	       XtNinvalidCallbackList,XtNxtCallCallback,XtCXtToolkitError,
+              "Cannot find callback list in XtCallCallbacks",
+	      (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+
+    icl = *callbacks;
+    if (!icl) {
+	UNLOCK_APP(app);
+	return;
+    }
+    cl = ToList(icl);
+    if (icl->count == 1) {
+	(*cl->callback) (widget, cl->closure, call_data);
+	UNLOCK_APP(app);
+	return;
+    }
+    ostate = icl->call_state;
+    icl->call_state = _XtCBCalling;
+    for (i = icl->count; --i >= 0; cl++)
+	(*cl->callback) (widget, cl->closure, call_data);
+    if (ostate)
+	icl->call_state |= ostate;
+    else if (icl->call_state & _XtCBFreeAfterCalling)
+	XtFree((char *)icl);
+    else
+	icl->call_state = ostate;
+    UNLOCK_APP(app);
+} /* XtCallCallbacks */
+
+
+XtCallbackStatus XtHasCallbacks(
+     Widget		widget,
+     _Xconst char*	callback_name
+     )
+{
+    InternalCallbackList *callbacks;
+    XtCallbackStatus retval = XtCallbackHasSome;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    callbacks = FetchInternalList(widget, callback_name);
+    if (!callbacks)
+	retval = XtCallbackNoList;
+    else if (!*callbacks)
+	retval = XtCallbackHasNone;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtHasCallbacks */
+
+
+void XtCallCallbackList(
+    Widget widget,
+    XtCallbackList callbacks,
+    XtPointer call_data)
+{
+    register InternalCallbackList icl;
+    register XtCallbackList cl;
+    register int i;
+    char ostate;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (!callbacks) {
+	UNLOCK_APP(app);
+	return;
+    }
+    icl = (InternalCallbackList)callbacks;
+    cl = ToList(icl);
+    if (icl->count == 1) {
+	(*cl->callback) (widget, cl->closure, call_data);
+	UNLOCK_APP(app);
+	return;
+    }
+    ostate = icl->call_state;
+    icl->call_state = _XtCBCalling;
+    for (i = icl->count; --i >= 0; cl++)
+	(*cl->callback) (widget, cl->closure, call_data);
+    if (ostate)
+	icl->call_state |= ostate;
+    else if (icl->call_state & _XtCBFreeAfterCalling)
+	XtFree((char *)icl);
+    else
+	icl->call_state = 0;
+    UNLOCK_APP(app);
+} /* XtCallCallbackList */
+
+void _XtPeekCallback(
+    Widget widget,
+    XtCallbackList callbacks,
+    XtCallbackProc *callback,
+    XtPointer *closure)
+{
+    register InternalCallbackList icl = (InternalCallbackList) callbacks;
+    register XtCallbackList cl;
+
+    if (!callbacks) {
+	*callback = (XtCallbackProc) NULL;
+	return;
+    }
+    cl = ToList(icl);
+    *callback = cl->callback;
+    *closure = cl->closure;
+    return;
+}
+
+void _XtCallConditionalCallbackList(
+    Widget widget,
+    XtCallbackList callbacks,
+    XtPointer call_data,
+    _XtConditionProc cond_proc)
+{
+    register InternalCallbackList icl;
+    register XtCallbackList cl;
+    register int i;
+    char ostate;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (!callbacks) {
+	UNLOCK_APP(app);
+	return;
+    }
+    icl = (InternalCallbackList)callbacks;
+    cl = ToList(icl);
+    if (icl->count == 1) {
+	(*cl->callback) (widget, cl->closure, call_data);
+	(void) (*cond_proc)(call_data);
+	UNLOCK_APP(app);
+	return;
+    }
+    ostate = icl->call_state;
+    icl->call_state = _XtCBCalling;
+    for (i = icl->count; --i >= 0; cl++) {
+	(*cl->callback) (widget, cl->closure, call_data);
+	if (! (*cond_proc)(call_data))
+	    break;
+    }
+    if (ostate)
+	icl->call_state |= ostate;
+    else if (icl->call_state & _XtCBFreeAfterCalling)
+	XtFree((char *)icl);
+    else
+	icl->call_state = 0;
+    UNLOCK_APP(app);
+}
diff --git a/libXt/src/ClickTime.c b/libXt/src/ClickTime.c
new file mode 100644
index 000000000..bfebd421f
--- /dev/null
+++ b/libXt/src/ClickTime.c
@@ -0,0 +1,93 @@
+/* $Xorg: ClickTime.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+/*
+ * Contains XtSetMultiClickTime, XtGetMultiClickTime
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+void XtSetMultiClickTime(
+    Display *dpy,
+    int time)
+{
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    _XtGetPerDisplay(dpy)->multi_click_time = time;
+    UNLOCK_APP(app);
+}
+
+
+int XtGetMultiClickTime(
+    Display *dpy)
+{
+    int retval;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    retval = _XtGetPerDisplay(dpy)->multi_click_time;
+    UNLOCK_APP(app);
+    return retval;
+}
diff --git a/libXt/src/Composite.c b/libXt/src/Composite.c
new file mode 100644
index 000000000..c5fbf125f
--- /dev/null
+++ b/libXt/src/Composite.c
@@ -0,0 +1,283 @@
+/* $Xorg: Composite.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital, or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Composite.c,v 1.5 2001/08/22 22:52:17 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static XtResource resources[] = {
+    {XtNchildren, XtCReadOnly, XtRWidgetList, sizeof(WidgetList),
+     XtOffsetOf(CompositeRec, composite.children), XtRImmediate, NULL},
+    {XtNnumChildren, XtCReadOnly, XtRCardinal, sizeof(Cardinal),
+     XtOffsetOf(CompositeRec, composite.num_children), XtRImmediate, NULL},
+    {XtNinsertPosition, XtCInsertPosition, XtRFunction, sizeof(XtOrderProc),
+     XtOffsetOf(CompositeRec, composite.insert_position), XtRImmediate, NULL},
+};
+
+static void CompositeClassPartInitialize(WidgetClass);
+static void CompositeInitialize(Widget, Widget, ArgList, Cardinal *);
+static void CompositeInsertChild(Widget);
+static void CompositeDeleteChild(Widget);
+static void CompositeDestroy(Widget);
+
+externaldef(compositeclassrec) CompositeClassRec compositeClassRec = {
+  { /******* CorePart *******/
+    /* superclass	    */	&widgetClassRec,
+    /* class_name	    */	"Composite",
+    /* widget_size	    */	sizeof(CompositeRec),
+    /* class_initialize     */  NULL,
+    /* class_part_initialize*/	CompositeClassPartInitialize,
+    /* class_inited	    */	FALSE,
+    /* initialize	    */	CompositeInitialize,
+    /* initialize_hook      */	NULL,
+    /* realize		    */	XtInheritRealize,
+    /* actions		    */	NULL,
+    /* num_actions	    */	0,
+    /* resources	    */	resources,
+    /* num_resources	    */	XtNumber(resources),
+    /* xrm_class	    */	NULLQUARK,
+    /* compress_motion      */	FALSE,
+    /* compress_exposure    */	TRUE,
+    /* compress_enterleave  */  FALSE,
+    /* visible_interest     */	FALSE,
+    /* destroy		    */	CompositeDestroy,
+    /* resize		    */	NULL,
+    /* expose		    */	NULL,
+    /* set_values	    */	NULL,
+    /* set_values_hook      */	NULL,
+    /* set_values_almost    */	XtInheritSetValuesAlmost,
+    /* get_values_hook      */	NULL,
+    /* accept_focus	    */	NULL,
+    /* version		    */	XtVersion,
+    /* callback_offsets     */  NULL,
+    /* tm_table		    */  NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */	NULL,
+    /* extension	    */  NULL
+  },
+  { /**** CompositePart *****/
+    /* geometry_handler     */  NULL,
+    /* change_managed       */  NULL,
+    /* insert_child	    */  CompositeInsertChild,
+    /* delete_child	    */  CompositeDeleteChild,
+    /* extension	    */  NULL
+    }
+};
+
+externaldef(compositewidgetclass) WidgetClass compositeWidgetClass = (WidgetClass) &compositeClassRec;
+
+static void InheritAllowsChangeManagedSet(
+    WidgetClass widget_class)
+{
+    CompositeWidgetClass cc = (CompositeWidgetClass) widget_class;
+    CompositeClassExtension ext, super_ext, new_ext;
+
+    ext = (CompositeClassExtension)
+	XtGetClassExtension(widget_class,
+		    XtOffsetOf(CompositeClassRec, composite_class.extension),
+			    NULLQUARK, 1L, 0);
+
+    if (ext && ext->version == XtCompositeExtensionVersion)
+	return;
+
+    super_ext = (CompositeClassExtension)
+	XtGetClassExtension(cc->core_class.superclass,
+		    XtOffsetOf(CompositeClassRec, composite_class.extension),
+			    NULLQUARK, 1L, 0);
+
+    LOCK_PROCESS;
+    if (super_ext && super_ext->version == XtCompositeExtensionVersion &&
+	super_ext->record_size == sizeof(CompositeClassExtensionRec) &&
+	super_ext->allows_change_managed_set) {
+
+	new_ext = (CompositeClassExtension)
+	    __XtCalloc(1, sizeof(CompositeClassExtensionRec));
+
+	/* Be careful to inherit only what is appropriate */
+	new_ext->next_extension = cc->composite_class.extension;
+	new_ext->record_type = NULLQUARK;
+	new_ext->version = XtCompositeExtensionVersion;
+	new_ext->record_size = sizeof(CompositeClassExtensionRec);
+	new_ext->accepts_objects = (ext ? ext->accepts_objects : False);
+	new_ext->allows_change_managed_set = True;
+	cc->composite_class.extension = (XtPointer) new_ext;
+    }
+    UNLOCK_PROCESS;
+}
+
+static void CompositeClassPartInitialize(
+	WidgetClass widgetClass)
+{
+    register CompositePartPtr wcPtr;
+    register CompositePartPtr superPtr = NULL;
+
+    wcPtr = (CompositePartPtr)
+	&(((CompositeWidgetClass)widgetClass)->composite_class);
+
+    if (widgetClass != compositeWidgetClass)
+	/* don't compute possible bogus pointer */
+	superPtr = (CompositePartPtr)&(((CompositeWidgetClass)widgetClass
+			->core_class.superclass)->composite_class);
+
+    /* We don't need to check for null super since we'll get to composite
+       eventually, and it had better define them!  */
+
+    LOCK_PROCESS;
+    if (wcPtr->geometry_manager == XtInheritGeometryManager) {
+	wcPtr->geometry_manager =
+		superPtr->geometry_manager;
+    }
+
+    if (wcPtr->change_managed == XtInheritChangeManaged) {
+	wcPtr->change_managed =
+		superPtr->change_managed;
+	InheritAllowsChangeManagedSet(widgetClass);
+    }
+
+    if (wcPtr->insert_child == XtInheritInsertChild) {
+	wcPtr->insert_child = superPtr->insert_child;
+    }
+
+    if (wcPtr->delete_child == XtInheritDeleteChild) {
+	wcPtr->delete_child = superPtr->delete_child;
+    }
+    UNLOCK_PROCESS;
+}
+
+static void CompositeDestroy(
+    Widget	w)
+{
+    register CompositeWidget cw = (CompositeWidget) w;
+
+    XtFree((char *) cw->composite.children);
+}
+
+static void CompositeInsertChild(
+    Widget	w)
+{
+    register Cardinal	     position;
+    register Cardinal        i;
+    register CompositeWidget cw;
+    register WidgetList      children;
+
+    cw = (CompositeWidget) w->core.parent;
+    children = cw->composite.children;
+
+    if (cw->composite.insert_position != NULL)
+	position = (*(cw->composite.insert_position))(w);
+    else
+	position = cw->composite.num_children;
+
+    if (cw->composite.num_children == cw->composite.num_slots) {
+	/* Allocate more space */
+	cw->composite.num_slots +=  (cw->composite.num_slots / 2) + 2;
+	cw->composite.children = children =
+	    (WidgetList) XtRealloc((XtPointer) children,
+	    (unsigned) (cw->composite.num_slots) * sizeof(Widget));
+    }
+    /* Ripple children up one space from "position" */
+    for (i = cw->composite.num_children; i > position; i--) {
+	children[i] = children[i-1];
+    }
+    children[position] = w;
+    cw->composite.num_children++;
+}
+
+static void CompositeDeleteChild(
+    Widget	w)
+{
+    register Cardinal	     position;
+    register Cardinal	     i;
+    register CompositeWidget cw;
+
+    cw = (CompositeWidget) w->core.parent;
+
+    for (position = 0; position < cw->composite.num_children; position++) {
+        if (cw->composite.children[position] == w) {
+	    break;
+	}
+    }
+    if (position == cw->composite.num_children) return;
+
+    /* Ripple children down one space from "position" */
+    cw->composite.num_children--;
+    for (i = position; i < cw->composite.num_children; i++) {
+        cw->composite.children[i] = cw->composite.children[i+1];
+    }
+}
+
+/* ARGSUSED */
+static void CompositeInitialize(
+    Widget   requested_widget,
+    Widget   new_widget,
+    ArgList args,
+    Cardinal *num_args)
+{
+    register CompositeWidget cw;
+
+    cw = (CompositeWidget) new_widget;
+    cw->composite.num_children = 0;
+    cw->composite.children = NULL;
+    cw->composite.num_slots = 0;
+}
diff --git a/libXt/src/Constraint.c b/libXt/src/Constraint.c
new file mode 100644
index 000000000..aeb6e3891
--- /dev/null
+++ b/libXt/src/Constraint.c
@@ -0,0 +1,133 @@
+/* $Xorg: Constraint.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Constraint.c,v 1.2 2001/08/22 22:52:17 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static void ConstraintPartInitialize(WidgetClass wc);
+externaldef(constraintclassrec) ConstraintClassRec constraintClassRec = {
+  { /******* CorePart *******/
+    /* superclass	    */	(WidgetClass) &compositeClassRec,
+    /* class_name	    */	"Constraint",
+    /* widget_size	    */	sizeof(ConstraintRec),
+    /* class_initialize     */  NULL,
+    /* class_part_initialize*/	ConstraintPartInitialize,
+    /* class_inited	    */	FALSE,
+    /* initialize	    */	NULL,
+    /* initialize_hook      */	NULL,
+    /* realize		    */	XtInheritRealize,
+    /* actions		    */	NULL,
+    /* num_actions	    */	0,
+    /* resources	    */	NULL,
+    /* num_resources	    */	0,
+    /* xrm_class	    */	NULLQUARK,
+    /* compress_motion      */	FALSE,
+    /* compress_exposure    */	TRUE,
+    /* compress_enterleave  */  FALSE,
+    /* visible_interest     */	FALSE,
+    /* destroy		    */	NULL,
+    /* resize		    */	NULL,
+    /* expose		    */	NULL,
+    /* set_values	    */	NULL,
+    /* set_values_hook      */	NULL,
+    /* set_values_almost    */	XtInheritSetValuesAlmost,
+    /* get_values_hook      */	NULL,
+    /* accept_focus	    */	NULL,
+    /* version		    */	XtVersion,
+    /* callback_offsets     */  NULL,
+    /* tm_table		    */  NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension	    */  NULL
+  },{ /**** CompositePart *****/
+    /* geometry_handler     */  NULL,
+    /* change_managed       */  NULL,
+    /* insert_child	    */  XtInheritInsertChild,
+    /* delete_child	    */  XtInheritDeleteChild,
+    /* extension	    */  NULL
+  },{ /**** ConstraintPart ****/
+    /* resources	    */  NULL,
+    /* num_resources	    */  0,
+    /* constraint_size      */  0,
+    /* initialize	    */  NULL,
+    /* destroy		    */  NULL,
+    /* set_values	    */  NULL,
+    /* extension	    */  NULL
+  }
+};
+
+externaldef(constraintwidgetclass) WidgetClass constraintWidgetClass =
+	(WidgetClass) &constraintClassRec;
+
+
+static void ConstraintPartInitialize(WidgetClass wc)
+{
+    ConstraintWidgetClass cwc = (ConstraintWidgetClass)wc;
+    if (cwc->constraint_class.resources)
+	_XtCompileResourceList(cwc->constraint_class.resources,
+			       cwc->constraint_class.num_resources);
+
+    _XtConstraintResDependencies((ConstraintWidgetClass)wc);
+}
diff --git a/libXt/src/Convert.c b/libXt/src/Convert.c
new file mode 100644
index 000000000..c3bb3c63a
--- /dev/null
+++ b/libXt/src/Convert.c
@@ -0,0 +1,1087 @@
+/* $Xorg: Convert.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Convert.c,v 3.7 2001/12/14 19:56:09 dawes Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include	"IntrinsicI.h"
+#include	"StringDefs.h"
+#include	"Intrinsic.h"
+
+/* Conversion procedure hash table */
+
+#define CONVERTHASHSIZE	((unsigned)256)
+#define CONVERTHASHMASK	255
+#define ProcHash(from_type, to_type) (2 * (from_type) + to_type)
+
+typedef struct _ConverterRec *ConverterPtr;
+typedef struct _ConverterRec {
+    ConverterPtr	next;
+    XrmRepresentation	from, to;
+    XtTypeConverter	converter;
+    XtDestructor	destructor;
+    unsigned short	num_args;
+    unsigned int	do_ref_count:1;
+    unsigned int	new_style:1;
+    unsigned int	global:1;
+    char		cache_type;
+} ConverterRec;
+
+#define ConvertArgs(p) ((XtConvertArgList)((p)+1))
+
+/* used for old-style type converter cache only */
+static Heap globalHeap = {NULL, NULL, 0};
+
+void _XtSetDefaultConverterTable(
+	ConverterTable *table)
+{
+    register ConverterTable globalConverterTable;
+
+    LOCK_PROCESS;
+    globalConverterTable = _XtGetProcessContext()->globalConverterTable;
+
+    *table = (ConverterTable)
+	__XtCalloc(CONVERTHASHSIZE, (unsigned)sizeof(ConverterPtr));
+    _XtAddDefaultConverters(*table);
+
+    if (globalConverterTable) {
+	ConverterPtr rec;
+	int i;
+	XtCacheType cache_type;
+	for (i = CONVERTHASHSIZE; --i >= 0; ) {
+	    for (rec = *globalConverterTable++; rec; rec = rec->next) {
+		cache_type = rec->cache_type;
+		if (rec->do_ref_count)
+		    cache_type |= XtCacheRefCount;
+	       _XtTableAddConverter(*table, rec->from, rec->to, rec->converter,
+				    ConvertArgs(rec), rec->num_args,
+				    rec->new_style, cache_type,
+				    rec->destructor, True);
+	    }
+  	}
+    }
+    UNLOCK_PROCESS;
+}
+
+void _XtFreeConverterTable(
+	ConverterTable table)
+{
+	register Cardinal i;
+	register ConverterPtr p;
+
+	for (i = 0; i < CONVERTHASHSIZE; i++) {
+	    for (p = table[i]; p; ) {
+		register ConverterPtr next = p->next;
+		XtFree((char*)p);
+		p = next;
+	    }
+	}
+	XtFree((char*)table);
+}
+
+/* Data cache hash table */
+
+typedef struct _CacheRec *CachePtr;
+
+typedef struct _CacheRec {
+    CachePtr	next;
+    XtPointer	tag;
+    int		hash;
+    XtTypeConverter converter;
+    unsigned short num_args;
+    unsigned int conversion_succeeded:1;
+    unsigned int has_ext:1;
+    unsigned int is_refcounted:1;
+    unsigned int must_be_freed:1;
+    unsigned int from_is_value:1;
+    unsigned int to_is_value:1;
+    XrmValue	from;
+    XrmValue	to;
+} CacheRec;
+
+typedef struct _CacheRecExt {
+    CachePtr	*prev;
+    XtDestructor destructor;
+    XtPointer	 closure;
+    long	 ref_count;
+} CacheRecExt;
+
+#define CEXT(p) ((CacheRecExt *)((p)+1))
+#define CARGS(p) ((p)->has_ext ? (XrmValue *)(CEXT(p)+1) : (XrmValue *)((p)+1))
+
+#define CACHEHASHSIZE	256
+#define CACHEHASHMASK	255
+typedef CachePtr CacheHashTable[CACHEHASHSIZE];
+
+static CacheHashTable	cacheHashTable;
+
+void _XtTableAddConverter(
+    ConverterTable	table,
+    XrmRepresentation   from_type,
+    XrmRepresentation   to_type,
+    XtTypeConverter	converter,
+    XtConvertArgList    convert_args,
+    Cardinal		num_args,
+    _XtBoolean		new_style,
+    XtCacheType		cache_type,
+    XtDestructor	destructor,
+    _XtBoolean		global)
+{
+    register ConverterPtr	*pp;
+    register ConverterPtr	p;
+    XtConvertArgList args;
+
+    pp= &table[ProcHash(from_type, to_type) & CONVERTHASHMASK];
+    while ((p = *pp) && (p->from != from_type || p->to != to_type))
+	pp = &p->next;
+
+    if (p) {
+	*pp = p->next;
+	XtFree((char *)p);
+    }
+
+    p = (ConverterPtr) __XtMalloc(sizeof(ConverterRec) +
+				sizeof(XtConvertArgRec) * num_args);
+    p->next	    = *pp;
+    *pp = p;
+    p->from	    = from_type;
+    p->to	    = to_type;
+    p->converter    = converter;
+    p->destructor   = destructor;
+    p->num_args     = num_args;
+    p->global       = global;
+    args = ConvertArgs(p);
+    while (num_args--)
+	*args++ = *convert_args++;
+    p->new_style    = new_style;
+    p->do_ref_count = False;
+    if (destructor || (cache_type & 0xff)) {
+	p->cache_type = cache_type & 0xff;
+	if (cache_type & XtCacheRefCount)
+	    p->do_ref_count = True;
+    } else {
+	p->cache_type = XtCacheNone;
+    }
+}
+
+void XtSetTypeConverter(
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtTypeConverter	converter,
+    XtConvertArgList    convert_args,
+    Cardinal		num_args,
+    XtCacheType		cache_type,
+    XtDestructor	destructor
+    )
+{
+    ProcessContext process;
+    XtAppContext app;
+    XrmRepresentation from;
+    XrmRepresentation to;
+
+    LOCK_PROCESS;
+    process = _XtGetProcessContext();
+    app = process->appContextList;
+    from = XrmStringToRepresentation(from_type);
+    to = XrmStringToRepresentation(to_type);
+
+    if (!process->globalConverterTable) {
+	process->globalConverterTable = (ConverterTable)
+	    __XtCalloc(CONVERTHASHSIZE, (unsigned)sizeof(ConverterPtr));
+    }
+    _XtTableAddConverter(process->globalConverterTable, from, to,
+			 converter, convert_args,
+			 num_args, True, cache_type, destructor, True);
+    while (app) {
+	_XtTableAddConverter(app->converterTable, from, to,
+			     converter, convert_args,
+			     num_args, True, cache_type, destructor, True);
+	app = app->next;
+    }
+    UNLOCK_PROCESS;
+}
+
+void XtAppSetTypeConverter(
+    XtAppContext	app,
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtTypeConverter	converter,
+    XtConvertArgList    convert_args,
+    Cardinal		num_args,
+    XtCacheType		cache_type,
+    XtDestructor	destructor
+    )
+{
+    LOCK_PROCESS;
+    _XtTableAddConverter(app->converterTable,
+	XrmStringToRepresentation(from_type),
+        XrmStringToRepresentation(to_type),
+	converter, convert_args, num_args,
+	True, cache_type, destructor, False);
+    UNLOCK_PROCESS;
+}
+
+/* old interface */
+void XtAddConverter(
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtConverter		converter,
+    XtConvertArgList    convert_args,
+    Cardinal		num_args
+    )
+{
+    ProcessContext process;
+    XtAppContext app;
+    XrmRepresentation from;
+    XrmRepresentation to;
+
+    LOCK_PROCESS;
+    process = _XtGetProcessContext();
+    app = process->appContextList;
+    from = XrmStringToRepresentation(from_type);
+    to = XrmStringToRepresentation(to_type);
+
+    if (!process->globalConverterTable) {
+	process->globalConverterTable = (ConverterTable)
+	    __XtCalloc(CONVERTHASHSIZE, (unsigned)sizeof(ConverterPtr));
+    }
+    _XtTableAddConverter(process->globalConverterTable, from, to,
+			 (XtTypeConverter)converter, convert_args, num_args,
+			 False, XtCacheAll, (XtDestructor)NULL, True);
+    while (app) {
+	_XtTableAddConverter(app->converterTable, from, to,
+			     (XtTypeConverter)converter, convert_args,
+			     num_args, False, XtCacheAll, (XtDestructor)NULL,
+			     True);
+	app = app->next;
+    }
+    UNLOCK_PROCESS;
+}
+
+/* old interface */
+void XtAppAddConverter(
+    XtAppContext	app,
+    register _Xconst char* from_type,
+    register _Xconst char* to_type,
+    XtConverter		converter,
+    XtConvertArgList    convert_args,
+    Cardinal		num_args
+    )
+{
+    LOCK_PROCESS;
+    _XtTableAddConverter(app->converterTable,
+	XrmStringToRepresentation(from_type),
+        XrmStringToRepresentation(to_type),
+	(XtTypeConverter)converter, convert_args, num_args,
+	False, XtCacheAll, (XtDestructor)NULL, False);
+    UNLOCK_PROCESS;
+}
+
+static CachePtr
+CacheEnter(
+    Heap*		    heap,
+    register XtTypeConverter converter,
+    register XrmValuePtr    args,
+    Cardinal		    num_args,
+    XrmValuePtr		    from,
+    XrmValuePtr		    to,
+    Boolean		    succeeded,
+    register int	    hash,
+    Boolean		    do_ref,
+    Boolean		    do_free,
+    XtDestructor	    destructor,
+    XtPointer		    closure)
+{
+    register	CachePtr *pHashEntry;
+    register	CachePtr p;
+    register    Cardinal i;
+
+    LOCK_PROCESS;
+    pHashEntry = &cacheHashTable[hash & CACHEHASHMASK];
+
+    if ((succeeded && destructor) || do_ref) {
+	p = (CachePtr) _XtHeapAlloc(heap, (sizeof(CacheRec) +
+					   sizeof(CacheRecExt) +
+					   num_args * sizeof(XrmValue)));
+	CEXT(p)->prev = pHashEntry;
+	CEXT(p)->destructor = succeeded ? destructor : NULL;
+	CEXT(p)->closure = closure;
+	CEXT(p)->ref_count = 1;
+	p->has_ext = True;
+    }
+    else {
+	p = (CachePtr)_XtHeapAlloc(heap, (sizeof(CacheRec) +
+					  num_args * sizeof(XrmValue)));
+	p->has_ext = False;
+    }
+    if (!to->addr)
+	succeeded = False;
+    p->conversion_succeeded = succeeded;
+    p->is_refcounted = do_ref;
+    p->must_be_freed = do_free;
+    p->next	    = *pHashEntry;
+    if (p->next && p->next->has_ext)
+	CEXT(p->next)->prev = &p->next;
+
+    *pHashEntry     = p;
+    p->tag	    = (XtPointer)heap;
+    p->hash	    = hash;
+    p->converter    = converter;
+    p->from.size    = from->size;
+    if (from->size <= sizeof(p->from.addr)) {
+	p->from_is_value = True;
+	XtMemmove(&p->from.addr, from->addr, from->size);
+    } else {
+	p->from_is_value = False;
+	p->from.addr = (XPointer)_XtHeapAlloc(heap, from->size);
+	(void) memmove((char *)p->from.addr, (char *)from->addr, from->size);
+    }
+    p->num_args = num_args;
+    if (num_args) {
+	XrmValue *pargs = CARGS(p);
+	for (i = 0; i < num_args; i++) {
+	    pargs[i].size = args[i].size;
+	    pargs[i].addr = (XPointer)_XtHeapAlloc(heap, args[i].size);
+	    XtMemmove(pargs[i].addr, args[i].addr, args[i].size);
+	}
+    }
+    p->to.size = to->size;
+    if (!succeeded) {
+	p->to_is_value = False;
+	p->to.addr = NULL;
+    } else if (to->size <= sizeof(p->to.addr)) {
+	p->to_is_value = True;
+	XtMemmove(&p->to.addr, to->addr, to->size);
+    } else {
+	p->to_is_value = False;
+	p->to.addr = (XPointer)_XtHeapAlloc(heap, to->size);
+	(void) memmove((char *)p->to.addr, (char *)to->addr, to->size);
+    }
+    UNLOCK_PROCESS;
+    return p;
+}
+
+static void FreeCacheRec(
+    XtAppContext app,
+    CachePtr p,
+    CachePtr *prev)
+{
+    LOCK_PROCESS;
+    if (p->has_ext) {
+	if (CEXT(p)->destructor) {
+	    Cardinal num_args = p->num_args;
+	    XrmValue *args = NULL;
+	    XrmValue toc;
+	    if (num_args)
+		args = CARGS(p);
+	    toc.size = p->to.size;
+	    if (p->to_is_value)
+		toc.addr = (XPointer)&p->to.addr;
+	    else
+		toc.addr = p->to.addr;
+	    (*CEXT(p)->destructor) (app, &toc, CEXT(p)->closure, args,
+				    &num_args);
+	}
+	*(CEXT(p)->prev) = p->next;
+	if (p->next && p->next->has_ext)
+	    CEXT(p->next)->prev = CEXT(p)->prev;
+    } else {
+	*prev = p->next;
+	if (p->next && p->next->has_ext)
+	    CEXT(p->next)->prev = prev;
+    }
+    if (p->must_be_freed) {
+	register int i;
+	if (!p->from_is_value)
+	    XtFree(p->from.addr);
+	if ((i = p->num_args)) {
+	    XrmValue *pargs = CARGS(p);
+	    while (i--)
+		XtFree(pargs[i].addr);
+	}
+	if (!p->to_is_value)
+	    XtFree(p->to.addr);
+	XtFree((char*)p);
+    }
+    /* else on private heap; will free entire heap later */
+    UNLOCK_PROCESS;
+}
+
+
+void _XtCacheFlushTag(
+    XtAppContext app,
+    XtPointer	tag)
+{
+    int i;
+    register CachePtr *prev;
+    register CachePtr rec;
+
+    LOCK_PROCESS;
+    for (i = CACHEHASHSIZE; --i >= 0;) {
+	prev = &cacheHashTable[i];
+	while ((rec = *prev)) {
+	    if (rec->tag == tag)
+		FreeCacheRec(app, rec, prev);
+	    else
+		prev = &rec->next;
+	}
+    }
+    UNLOCK_PROCESS;
+}
+
+#ifdef DEBUG
+#include	<stdio.h>
+
+void _XtConverterCacheStats(void)
+{
+    register Cardinal i;
+    register CachePtr p;
+    register Cardinal entries;
+
+    LOCK_PROCESS;
+    for (i = 0; i < CACHEHASHSIZE; i++) {
+	p = cacheHashTable[i];
+	if (p) {
+	    for (entries = 0; p; p = p->next) {
+		entries++;
+	    }
+	    (void) fprintf(stdout, "Index: %4d  Entries: %d\n", i, entries);
+	    for (p = cacheHashTable[i]; p; p = p->next) {
+		(void) fprintf(stdout, "    Size: %3d  Refs: %3d  '",
+			       p->from.size,
+			       p->has_ext ? CEXT(p)->ref_count : 0);
+		(void) fprintf(stdout, "'\n");
+	    }
+	    (void) fprintf(stdout, "\n");
+	}
+    }
+    UNLOCK_PROCESS;
+}
+#endif /*DEBUG*/
+
+static Boolean ResourceQuarkToOffset(
+    WidgetClass widget_class,
+    XrmName     name,
+    Cardinal    *offset)
+{
+    register WidgetClass     wc;
+    register Cardinal        i;
+    register XrmResourceList res, *resources;
+
+    for (wc = widget_class; wc; wc = wc->core_class.superclass) {
+	resources = (XrmResourceList*) wc->core_class.resources;
+	for (i = 0; i < wc->core_class.num_resources; i++, resources++) {
+	    res = *resources;
+	    if (res->xrm_name == name) {
+		*offset = -res->xrm_offset - 1;
+		return True;
+	    }
+	} /* for i in resources */
+    } /* for wc in widget classes */
+    (*offset) = 0;
+    return False;
+}
+
+
+static void ComputeArgs(
+    Widget		widget,
+    XtConvertArgList    convert_args,
+    Cardinal		num_args,
+    XrmValuePtr		args)
+{
+    register Cardinal   i;
+    Cardinal		offset;
+    String              params[1];
+    Cardinal		num_params = 1;
+    Widget		ancestor = NULL;
+
+    for (i = 0; i < num_args; i++) {
+	args[i].size = convert_args[i].size;
+	switch (convert_args[i].address_mode) {
+	case XtAddress:
+	    args[i].addr = convert_args[i].address_id;
+	    break;
+
+	case XtBaseOffset:
+	    args[i].addr =
+		(XPointer)((char *)widget + (long)convert_args[i].address_id);
+	    break;
+
+	case XtWidgetBaseOffset:
+	    if (!ancestor) {
+		if (XtIsWidget(widget))
+		    ancestor = widget;
+		else
+		    ancestor = _XtWindowedAncestor(widget);
+	    }
+
+	    args[i].addr =
+		(XPointer)((char *)ancestor + (long)convert_args[i].address_id);
+	    break;
+
+	case XtImmediate:
+	    args[i].addr = (XPointer) &(convert_args[i].address_id);
+	    break;
+
+	case XtProcedureArg:
+	    (*(XtConvertArgProc)convert_args[i].address_id)
+		(widget, &convert_args[i].size, &args[i]);
+	    break;
+
+	case XtResourceString:
+	    /* Convert in place for next usage */
+	    convert_args[i].address_mode = XtResourceQuark;
+	    convert_args[i].address_id =
+	       (XtPointer)(long)XrmStringToQuark((String)convert_args[i].address_id);
+	    /* Fall through */
+
+	case XtResourceQuark:
+	    if (! ResourceQuarkToOffset(widget->core.widget_class,
+		    (XrmQuark)(long) convert_args[i].address_id, &offset)) {
+		params[0]=
+                  XrmQuarkToString((XrmQuark)(long) convert_args[i].address_id);
+               XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		    "invalidResourceName","computeArgs",XtCXtToolkitError,
+		    "Cannot find resource name %s as argument to conversion",
+                     params,&num_params);
+		offset = 0;
+	    }
+	    args[i].addr = (XPointer)((char *)widget + offset);
+	    break;
+	default:
+	    params[0] = XtName(widget);
+	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"invalidAddressMode", "computeArgs", XtCXtToolkitError,
+		"Conversion arguments for widget '%s' contain an unsupported address mode",
+			params,&num_params);
+	    args[i].addr = NULL;
+	    args[i].size = 0;
+	} /* switch */
+    } /* for */
+} /* ComputeArgs */
+
+void XtDirectConvert(
+    XtConverter     converter,
+    XrmValuePtr     args,
+    Cardinal	    num_args,
+    register XrmValuePtr from,
+    XrmValuePtr     to)
+{
+    register CachePtr   p;
+    register int	hash;
+    register Cardinal   i;
+
+    LOCK_PROCESS;
+    /* Try to find cache entry for conversion */
+    hash = ((long) converter >> 2) + from->size + *((char *) from->addr);
+    if (from->size > 1) hash += ((char *) from->addr)[1];
+
+    for (p = cacheHashTable[hash & CACHEHASHMASK]; p; p = p->next) {
+	if ((p->hash == hash)
+	 && (p->converter == (XtTypeConverter)converter)
+	 && (p->from.size == from->size)
+	 && !(p->from_is_value ?
+	      XtMemcmp(&p->from.addr, from->addr, from->size) :
+	      memcmp((char *)p->from.addr, (char *)from->addr, from->size))
+         && (p->num_args == num_args)) {
+	    if ((i = num_args)) {
+		XrmValue *pargs = CARGS(p);
+		/* Are all args the same data ? */
+		while (i) {
+		    i--; /* do not move to while test, broken compilers */
+		    if (pargs[i].size != args[i].size ||
+			XtMemcmp(pargs[i].addr, args[i].addr, args[i].size)) {
+			i++;
+			break;
+		    }
+		}
+	    }
+	    if (!i) {
+		/* Perfect match */
+		to->size = p->to.size;
+		if (p->to_is_value)
+		    to->addr = (XPointer)&p->to.addr;
+		else
+		    to->addr = p->to.addr;
+		UNLOCK_PROCESS;
+		return;
+	    }
+	}
+    }
+
+    /* Didn't find it, call converter procedure and entry result in cache */
+    (*to).size = 0;
+    (*to).addr = NULL;
+    (*converter)(args, &num_args, from, to);
+    /* This memory can never be freed since we don't know the Display
+     * or app context from which to compute the persistance */
+    {
+	CacheEnter(&globalHeap, (XtTypeConverter)converter, args, num_args,
+		   from, to, (to->addr != NULL), hash, False, False,
+		   (XtDestructor)NULL, NULL);
+    }
+    UNLOCK_PROCESS;
+}
+
+
+static ConverterPtr GetConverterEntry(
+    XtAppContext app,
+    XtTypeConverter converter)
+{
+    Cardinal entry;
+    register ConverterPtr cP;
+    ConverterTable converterTable;
+
+    LOCK_PROCESS;
+    converterTable = app->converterTable;
+    cP = NULL;
+    for (entry = 0; (entry < CONVERTHASHSIZE) && !cP; entry++) {
+	cP = converterTable[entry];
+	while (cP && (cP->converter != converter)) cP = cP->next;
+    }
+    UNLOCK_PROCESS;
+    return cP;
+}
+
+
+static Boolean
+CallConverter(
+    Display*	    dpy,
+    XtTypeConverter converter,
+    XrmValuePtr     args,
+    Cardinal	    num_args,
+    register XrmValuePtr from,
+    XrmValuePtr     to,
+    XtCacheRef	    *cache_ref_return,
+    register ConverterPtr cP)
+{
+    CachePtr p;
+    int	hash;
+    Cardinal i;
+    Boolean retval;
+
+    if (!cP || ((cP->cache_type == XtCacheNone) && !cP->destructor)) {
+	XtPointer closure;
+	if (cache_ref_return) *cache_ref_return = NULL;
+	retval = (*(XtTypeConverter)converter)
+	    (dpy, args, &num_args, from, to, &closure);
+	return retval;
+    }
+
+    LOCK_PROCESS;
+    /* Try to find cache entry for conversion */
+    hash = ((long)(converter) >> 2) + from->size + *((char *) from->addr);
+    if (from->size > 1) hash += ((char *) from->addr)[1];
+
+    if (cP->cache_type != XtCacheNone) {
+	for (p = cacheHashTable[hash & CACHEHASHMASK]; p; p = p->next){
+	    if ((p->hash == hash)
+	     && (p->converter == converter)
+	     && (p->from.size == from->size)
+	     && !(p->from_is_value ?
+		  XtMemcmp(&p->from.addr, from->addr, from->size) :
+		  memcmp((char *)p->from.addr, (char *)from->addr, from->size))
+	     && (p->num_args == num_args)) {
+		if ((i = num_args)) {
+		    XrmValue *pargs = CARGS(p);
+		    /* Are all args the same data ? */
+		    while (i) {
+			i--; /* do not move to while test, broken compilers */
+			if (pargs[i].size != args[i].size ||
+			    XtMemcmp(pargs[i].addr, args[i].addr, args[i].size)){
+			    i++;
+			    break;
+			}
+		    }
+		}
+		if (!i) {
+		    /* Perfect match */
+		    if (p->conversion_succeeded) {
+			if (to->addr) {	/* new-style call */
+			    if (to->size < p->to.size) {
+				to->size = p->to.size;
+				UNLOCK_PROCESS;
+				return False;
+			    }
+			    to->size = p->to.size;
+			    if (p->to_is_value) {
+				XtMemmove(to->addr, &p->to.addr,
+					  to->size);
+			    } else {
+				(void) memmove((char *)to->addr,
+					       (char *)p->to.addr, to->size);
+			    }
+			} else {	/* old-style call */
+			    to->size = p->to.size;
+			    if (p->to_is_value)
+				to->addr = (XPointer)&p->to.addr;
+			    else
+				to->addr = p->to.addr;
+			}
+		    }
+		    if (p->is_refcounted) {
+			CEXT(p)->ref_count++;
+			if (cache_ref_return)
+			    *cache_ref_return = (XtCacheRef)p;
+			else
+			    p->is_refcounted = False;
+		    }
+		    else {
+			if (cache_ref_return)
+			    *cache_ref_return = NULL;
+		    }
+		    retval = (p->conversion_succeeded);
+		    UNLOCK_PROCESS;
+		    return retval;
+		}
+	    }
+	}
+    }
+
+    /* No cache entry, call converter procedure and enter result in cache */
+    {
+	Heap *heap;
+	XtPointer closure = NULL;
+	unsigned int supplied_size = to->size;
+	Boolean do_ref = cP->do_ref_count && cache_ref_return;
+	Boolean do_free = False;
+	Boolean retval =
+	    (*(XtTypeConverter)converter)(dpy, args, &num_args, from, to, &closure);
+
+	if (retval == False && supplied_size < to->size) {
+	    /* programmer error: caller must allocate sufficient storage */
+	    if (cache_ref_return)
+		*cache_ref_return = NULL;
+	    UNLOCK_PROCESS;
+	    return False;
+	}
+
+	if ((cP->cache_type == XtCacheNone) || do_ref) {
+	    heap = NULL;
+	    do_free = True;
+	}
+	else if (cP->cache_type == XtCacheByDisplay)
+	    heap = &_XtGetPerDisplay(dpy)->heap;
+	else if (cP->global)
+	    heap = &globalHeap;
+	else
+	    heap = &XtDisplayToApplicationContext(dpy)->heap;
+
+	p = CacheEnter(heap, converter, args, num_args, from, to, retval,
+		       hash, do_ref, do_free, cP->destructor, closure);
+	if (do_ref)
+	    *cache_ref_return = (XtCacheRef)p;
+	else if (cache_ref_return)
+	    *cache_ref_return = NULL;
+	UNLOCK_PROCESS;
+	return retval;
+    }
+}
+
+Boolean
+XtCallConverter(
+    Display*	    dpy,
+    XtTypeConverter converter,
+    XrmValuePtr     args,
+    Cardinal	    num_args,
+    register XrmValuePtr from,
+    XrmValuePtr     to,
+    XtCacheRef	    *cache_ref_return)
+{
+    ConverterPtr cP;
+    Boolean retval;
+    XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+    LOCK_APP(app);
+    if ((cP = GetConverterEntry(app, converter)) == NULL) {
+	XtAppSetTypeConverter(XtDisplayToApplicationContext(dpy),
+			      "_XtUnk1", "_XtUnk2",
+			      converter, NULL, 0,
+			      XtCacheAll, NULL);
+	cP = GetConverterEntry(app, converter);
+    }
+    retval = CallConverter(dpy, converter, args, num_args, from, to,
+			    cache_ref_return, cP);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+Boolean _XtConvert(
+             Widget		widget,
+    register XrmRepresentation	from_type,
+	     XrmValuePtr	from,
+    register XrmRepresentation	to_type,
+    register XrmValuePtr	to,
+    XtCacheRef			*cache_ref_return)
+{
+    XtAppContext	app = XtWidgetToApplicationContext(widget);
+    register ConverterPtr	p;
+    Cardinal		num_args;
+    XrmValue		*args;
+
+    /* Look for type converter */
+    LOCK_PROCESS;
+    p = app->converterTable[ProcHash(from_type, to_type) & CONVERTHASHMASK];
+    for (; p; p = p->next) {
+	if (from_type == p->from && to_type == p->to) {
+	    Boolean retval = False;
+	    /* Compute actual arguments from widget and arg descriptor */
+	    num_args = p->num_args;
+	    if (num_args != 0) {
+		args = (XrmValue*)
+		    ALLOCATE_LOCAL( num_args * sizeof (XrmValue) );
+		if (!args) _XtAllocError("alloca");
+		ComputeArgs(widget, ConvertArgs(p), num_args, args);
+	    } else args = NULL;
+	    if (p->new_style) {
+		retval =
+		    CallConverter(XtDisplayOfObject(widget),
+				     p->converter, args, num_args,
+				     from, to, cache_ref_return, p);
+	    }
+	    else { /* is old-style (non-display) converter */
+		XrmValue tempTo;
+		XtDirectConvert((XtConverter)p->converter, args, num_args,
+				from, &tempTo);
+		if (cache_ref_return)
+		    *cache_ref_return = NULL;
+		if (tempTo.addr) {
+		    if (to->addr) {	/* new-style caller */
+			if (to->size >= tempTo.size) {
+			    if (to_type == _XtQString)
+				*(String*)(to->addr) = tempTo.addr;
+			    else {
+				XtMemmove(to->addr, tempTo.addr,
+					  tempTo.size);
+			    }
+			    retval = True;
+			}
+			to->size = tempTo.size;
+		    } else {		/* old-style caller */
+			*to = tempTo;
+			retval = True;
+		    }
+		}
+	    }
+	    if (args) DEALLOCATE_LOCAL( (XtPointer)args );
+	    UNLOCK_PROCESS;
+	    return retval;
+	}
+    }
+
+    {
+	String params[2];
+	Cardinal num_params = 2;
+	params[0] = XrmRepresentationToString(from_type);
+	params[1] = XrmRepresentationToString(to_type);
+	XtAppWarningMsg(app, "typeConversionError", "noConverter", XtCXtToolkitError,
+	     "No type converter registered for '%s' to '%s' conversion.",
+             params, &num_params);
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+void XtConvert(
+    Widget	widget,
+    _Xconst char* from_type_str,
+    XrmValuePtr	from,
+    _Xconst char* to_type_str,
+    XrmValuePtr	to)
+{
+    XrmQuark    from_type, to_type;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    from_type = XrmStringToRepresentation(from_type_str);
+    to_type = XrmStringToRepresentation(to_type_str);
+    if (from_type != to_type) {
+	/*  It's not safe to ref count these resources, 'cause we
+	    don't know what older clients may have assumed about
+	    the resource lifetimes.
+	XtCacheRef ref;
+	*/
+	to->addr = NULL;
+	to->size = 0;
+	_XtConvert(widget, from_type, from, to_type, to, /*&ref*/ NULL);
+	/*
+	if (ref) {
+	    XtAddCallback( widget, XtNdestroyCallback,
+			   XtCallbackReleaseCacheRef, (XtPointer)ref );
+	}
+	*/
+    }
+    else
+	(*to) = *from;
+    UNLOCK_APP(app);
+}
+
+Boolean XtConvertAndStore(
+    Widget	object,
+    _Xconst char* from_type_str,
+    XrmValuePtr	from,
+    _Xconst char* to_type_str,
+    XrmValuePtr	to)
+{
+    XrmQuark    from_type, to_type;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    from_type = XrmStringToRepresentation(from_type_str);
+    to_type = XrmStringToRepresentation(to_type_str);
+    if (from_type != to_type) {
+	static XtPointer local_valueP = NULL;
+	static Cardinal local_valueS = 128;
+	XtCacheRef ref;
+	Boolean local = False;
+	do {
+	    if (!to->addr) {
+		if (!local_valueP)
+		    local_valueP = _XtHeapAlloc(&globalHeap, local_valueS);
+		to->addr = local_valueP;
+		to->size = local_valueS;
+		local = True;
+	    }
+	    if (!_XtConvert(object, from_type, from, to_type, to, &ref)) {
+		if (local && (to->size > local_valueS)) {
+		    to->addr =
+			local_valueP = _XtHeapAlloc(&globalHeap, to->size);
+		    local_valueS = to->size;
+		    continue;
+		} else {
+		    if (local) {
+			to->addr = NULL;
+			to->size = 0;
+		    }
+		    UNLOCK_PROCESS;
+		    UNLOCK_APP(app);
+		    return False;
+		}
+	    }
+	    if (ref) {
+		XtAddCallback( object, XtNdestroyCallback,
+			       XtCallbackReleaseCacheRef, (XtPointer)ref );
+	    }
+	    UNLOCK_PROCESS;
+	    UNLOCK_APP(app);
+	    return True;
+	} while (local /* && local_valueS < to->size */);
+    }
+    if (to->addr) {
+	if (to->size < from->size) {
+	    to->size = from->size;
+	    UNLOCK_PROCESS;
+	    UNLOCK_APP(app);
+	    return False;
+	}
+	(void) memmove(to->addr, from->addr, from->size );
+	to->size = from->size;
+    } else			/* from_type == to_type */
+	*to = *from;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return True;
+}
+
+void XtAppReleaseCacheRefs(
+    XtAppContext app,
+    XtCacheRef *refs)
+{
+    register CachePtr *r;
+    register CachePtr p;
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    for (r = (CachePtr*)refs; (p = *r); r++) {
+	if (p->is_refcounted && --(CEXT(p)->ref_count) == 0) {
+	    FreeCacheRec(app, p, NULL);
+	}
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+
+/* ARGSUSED */
+void XtCallbackReleaseCacheRefList(
+    Widget widget,		/* unused */
+    XtPointer closure,
+    XtPointer call_data)	/* unused */
+{
+    XtAppReleaseCacheRefs( XtWidgetToApplicationContext(widget),
+			   (XtCacheRef*)closure );
+    XtFree(closure);
+}
+
+
+/* ARGSUSED */
+void XtCallbackReleaseCacheRef(
+    Widget widget,		/* unused */
+    XtPointer closure,
+    XtPointer call_data)	/* unused */
+{
+    XtCacheRef cache_refs[2];
+    cache_refs[0] = (XtCacheRef)closure;
+    cache_refs[1] = NULL;
+    XtAppReleaseCacheRefs( XtWidgetToApplicationContext(widget), cache_refs );
+}
diff --git a/libXt/src/Converters.c b/libXt/src/Converters.c
new file mode 100644
index 000000000..a1f7f2b48
--- /dev/null
+++ b/libXt/src/Converters.c
@@ -0,0 +1,1864 @@
+/* $Xorg: Converters.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Converters.c,v 3.14tsi Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+/*LINTLIBRARY*/
+/* Conversion.c - implementations of resource type conversion procs */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include	"IntrinsicI.h"
+#include	"StringDefs.h"
+#include	"Shell.h"
+#include	<stdio.h>
+#include        <X11/cursorfont.h>
+#include	<X11/keysym.h>
+#include	<X11/Xlocale.h>
+#include	<errno.h>	/* for StringToDirectoryString */
+
+#ifdef __UNIXOS2__
+#define IsNewline(str) ((str) == '\n' || (str) == '\r')
+#define IsWhitespace(str) ((str)== ' ' || (str) == '\t' || (str) == '\r')
+#else
+#define IsNewline(str) ((str) == '\n')
+#define IsWhitespace(str) ((str)== ' ' || (str) == '\t')
+#endif
+
+static const String XtNwrongParameters = "wrongParameters";
+static const String XtNconversionError = "conversionError";
+static const String XtNmissingCharsetList = "missingCharsetList";
+
+/* Representation types */
+
+#define XtQAtom			XrmPermStringToQuark(XtRAtom)
+#define XtQCommandArgArray	XrmPermStringToQuark(XtRCommandArgArray)
+#define XtQCursor		XrmPermStringToQuark(XtRCursor)
+#define XtQDirectoryString	XrmPermStringToQuark(XtRDirectoryString)
+#define XtQDisplay		XrmPermStringToQuark(XtRDisplay)
+#define XtQFile			XrmPermStringToQuark(XtRFile)
+#define XtQFloat		XrmPermStringToQuark(XtRFloat)
+#define XtQInitialState		XrmPermStringToQuark(XtRInitialState)
+#define XtQPixmap		XrmPermStringToQuark(XtRPixmap)
+#define XtQRestartStyle 	XrmPermStringToQuark(XtRRestartStyle)
+#define XtQShort		XrmPermStringToQuark(XtRShort)
+#define XtQUnsignedChar		XrmPermStringToQuark(XtRUnsignedChar)
+#define XtQVisual		XrmPermStringToQuark(XtRVisual)
+
+static XrmQuark  XtQBool;
+static XrmQuark  XtQBoolean;
+static XrmQuark  XtQColor;
+static XrmQuark  XtQDimension;
+static XrmQuark  XtQFont;
+static XrmQuark  XtQFontSet;
+static XrmQuark  XtQFontStruct;
+static XrmQuark  XtQGravity;
+static XrmQuark  XtQInt;
+static XrmQuark  XtQPixel;
+static XrmQuark  XtQPosition;
+#ifdef __UNIXOS2__
+XrmQuark  _XtQString = 0;
+#else
+XrmQuark  _XtQString;
+#endif
+
+void _XtConvertInitialize(void)
+{
+    XtQBool		= XrmPermStringToQuark(XtRBool);
+    XtQBoolean		= XrmPermStringToQuark(XtRBoolean);
+    XtQColor		= XrmPermStringToQuark(XtRColor);
+    XtQDimension	= XrmPermStringToQuark(XtRDimension);
+    XtQFont		= XrmPermStringToQuark(XtRFont);
+    XtQFontSet		= XrmPermStringToQuark(XtRFontSet);
+    XtQFontStruct	= XrmPermStringToQuark(XtRFontStruct);
+    XtQGravity		= XrmPermStringToQuark(XtRGravity);
+    XtQInt		= XrmPermStringToQuark(XtRInt);
+    XtQPixel		= XrmPermStringToQuark(XtRPixel);
+    XtQPosition		= XrmPermStringToQuark(XtRPosition);
+    _XtQString		= XrmPermStringToQuark(XtRString);
+}
+
+#define	donestr(type, value, tstr) \
+	{							\
+	    if (toVal->addr != NULL) {				\
+		if (toVal->size < sizeof(type)) {		\
+		    toVal->size = sizeof(type);			\
+		    XtDisplayStringConversionWarning(dpy, 	\
+			(char*) fromVal->addr, tstr);		\
+		    return False;				\
+		}						\
+		*(type*)(toVal->addr) = (value);		\
+	    }							\
+	    else {						\
+		static type static_val;				\
+		static_val = (value);				\
+		toVal->addr = (XPointer)&static_val;		\
+	    }							\
+	    toVal->size = sizeof(type);				\
+	    return True;					\
+	}
+
+#define	done(type, value) \
+	{							\
+	    if (toVal->addr != NULL) {				\
+		if (toVal->size < sizeof(type)) {		\
+		    toVal->size = sizeof(type);			\
+		    return False;				\
+		}						\
+		*(type*)(toVal->addr) = (value);		\
+	    }							\
+	    else {						\
+		static type static_val;				\
+		static_val = (value);				\
+		toVal->addr = (XPointer)&static_val;		\
+	    }							\
+	    toVal->size = sizeof(type);				\
+	    return True;					\
+	}
+
+void XtDisplayStringConversionWarning(
+    Display* dpy,
+    _Xconst char* from,
+    _Xconst char* toType
+    )
+{
+#ifndef NO_MIT_HACKS
+    /* Allow suppression of conversion warnings. %%%  Not specified. */
+
+    static enum {Check, Report, Ignore} report_it = Check;
+    XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (report_it == Check) {
+	XrmDatabase rdb = XtDatabase(dpy);
+	XrmName xrm_name[2];
+	XrmClass xrm_class[2];
+	XrmRepresentation rep_type;
+	XrmValue value;
+	xrm_name[0] = XrmPermStringToQuark( "stringConversionWarnings" );
+	xrm_name[1] = 0;
+	xrm_class[0] = XrmPermStringToQuark( "StringConversionWarnings" );
+	xrm_class[1] = 0;
+	if (XrmQGetResource( rdb, xrm_name, xrm_class,
+			     &rep_type, &value ))
+	{
+	    if (rep_type == XtQBoolean)
+		report_it = *(Boolean*)value.addr ? Report : Ignore;
+	    else if (rep_type == _XtQString) {
+		XrmValue toVal;
+		Boolean report;
+		toVal.addr = (XPointer)&report;
+		toVal.size = sizeof(Boolean);
+		if (XtCallConverter(dpy, XtCvtStringToBoolean, (XrmValuePtr)NULL,
+				    (Cardinal)0, &value, &toVal,
+				    (XtCacheRef*)NULL))
+		    report_it = report ? Report : Ignore;
+	    }
+	    else report_it = Report;
+	}
+	else report_it = Report;
+    }
+
+    if (report_it == Report) {
+#endif /* ifndef NO_MIT_HACKS */
+	String params[2];
+	Cardinal num_params = 2;
+	params[0] = (String)from;
+	params[1] = (String)toType;
+	XtAppWarningMsg(app,
+		   XtNconversionError,"string",XtCXtToolkitError,
+		   "Cannot convert string \"%s\" to type %s",
+		    params,&num_params);
+#ifndef NO_MIT_HACKS
+    }
+#endif /* ifndef NO_MIT_HACKS */
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtStringConversionWarning(
+    _Xconst char* from,
+    _Xconst char* toType
+    )
+{
+	String params[2];
+	Cardinal num_params = 2;
+	params[0] = (String)from;
+	params[1] = (String)toType;
+	XtWarningMsg(XtNconversionError,"string",XtCXtToolkitError,
+		   "Cannot convert string \"%s\" to type %s",
+		    params,&num_params);
+}
+
+static int CompareISOLatin1(char *, char *);
+
+
+static Boolean IsInteger(
+    String string,
+    int *value)
+{
+    Boolean foundDigit = False;
+    Boolean isNegative = False;
+    Boolean isPositive = False;
+    int val = 0;
+    char ch;
+    /* skip leading whitespace */
+#ifndef __UNIXOS2__
+    while ((ch = *string) == ' ' || ch == '\t') string++;
+#else
+    while ((ch = *string) == ' ' || ch == '\t' || ch == '\r') string++;
+#endif
+    while ((ch = *string++)) {
+	if (ch >= '0' && ch <= '9') {
+	    val *= 10;
+	    val += ch - '0';
+	    foundDigit = True;
+	    continue;
+	}
+	if (IsWhitespace(ch)) {
+	    if (!foundDigit) return False;
+	    /* make sure only trailing whitespace */
+	    while ((ch = *string++)) {
+		if (!IsWhitespace(ch))
+		    return False;
+	    }
+	    break;
+	}
+	if (ch == '-' && !foundDigit && !isNegative && !isPositive) {
+	    isNegative = True;
+	    continue;
+	}
+	if (ch == '+' && !foundDigit && !isNegative && !isPositive) {
+	    isPositive = True;
+	    continue;
+	}
+	return False;
+    }
+    if (ch == '\0') {
+	if (isNegative)
+	    *value = -val;
+	else
+	    *value = val;
+	return True;
+    }
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtIntToBoolean(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtIntToBoolean",XtCXtToolkitError,
+                  "Integer to Boolean conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(Boolean, (*(int *)fromVal->addr != 0));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtIntToShort(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtIntToShort",XtCXtToolkitError,
+                  "Integer to Short conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(short, (*(int *)fromVal->addr));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToBoolean(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtStringToBoolean",XtCXtToolkitError,
+                  "String to Boolean conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+
+    if (   (CompareISOLatin1(str, "true") == 0)
+	|| (CompareISOLatin1(str, "yes") == 0)
+	|| (CompareISOLatin1(str, "on") == 0)
+	|| (CompareISOLatin1(str, "1") == 0))	donestr( Boolean, True, XtRBoolean );
+
+    if (   (CompareISOLatin1(str, "false") == 0)
+	|| (CompareISOLatin1(str, "no") == 0)
+	|| (CompareISOLatin1(str, "off") == 0)
+	|| (CompareISOLatin1(str, "0") == 0))	donestr( Boolean, False, XtRBoolean );
+
+    XtDisplayStringConversionWarning(dpy, str, XtRBoolean);
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtIntToBool(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtIntToBool",XtCXtToolkitError,
+                  "Integer to Bool conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(Bool, (*(int *)fromVal->addr != 0));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToBool(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		XtNwrongParameters,"cvtStringToBool",
+		XtCXtToolkitError,
+                 "String to Bool conversion needs no extra arguments",
+                  (String *)NULL, (Cardinal *)NULL);
+
+    if (   (CompareISOLatin1(str, "true") == 0)
+	|| (CompareISOLatin1(str, "yes") == 0)
+	|| (CompareISOLatin1(str, "on") == 0)
+	|| (CompareISOLatin1(str, "1") == 0))	donestr( Bool, True, XtRBool );
+
+    if (   (CompareISOLatin1(str, "false") == 0)
+	|| (CompareISOLatin1(str, "no") == 0)
+	|| (CompareISOLatin1(str, "off") == 0)
+	|| (CompareISOLatin1(str, "0") == 0))	donestr( Bool, False, XtRBool );
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRBool);
+    return False;
+}
+
+XtConvertArgRec const colorConvertArgs[] = {
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
+     sizeof(Screen *)},
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
+     sizeof(Colormap)}
+};
+
+
+/* ARGSUSED */
+Boolean XtCvtIntToColor(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    XColor	c;
+    Screen	*screen;
+    Colormap	colormap;
+
+    if (*num_args != 2) {
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	 XtNwrongParameters,"cvtIntOrPixelToXColor",XtCXtToolkitError,
+         "Pixel to color conversion needs screen and colormap arguments",
+          (String *)NULL, (Cardinal *)NULL);
+      return False;
+    }
+    screen = *((Screen **) args[0].addr);
+    colormap = *((Colormap *) args[1].addr);
+    c.pixel = *(int *)fromVal->addr;
+
+    XQueryColor(DisplayOfScreen(screen), colormap, &c);
+    done(XColor, c);
+}
+
+
+Boolean XtCvtStringToPixel(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    String	    str = (String)fromVal->addr;
+    XColor	    screenColor;
+    XColor	    exactColor;
+    Screen	    *screen;
+    XtPerDisplay    pd = _XtGetPerDisplay(dpy);
+    Colormap	    colormap;
+    Status	    status;
+    String          params[1];
+    Cardinal	    num_params=1;
+
+    if (*num_args != 2) {
+     XtAppWarningMsg(pd->appContext, XtNwrongParameters, "cvtStringToPixel",
+		     XtCXtToolkitError,
+	"String to pixel conversion needs screen and colormap arguments",
+        (String *)NULL, (Cardinal *)NULL);
+     return False;
+    }
+
+    screen = *((Screen **) args[0].addr);
+    colormap = *((Colormap *) args[1].addr);
+
+    if (CompareISOLatin1(str, XtDefaultBackground) == 0) {
+	*closure_ret = NULL;
+	if (pd->rv) donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel)
+	else	    donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel);
+    }
+    if (CompareISOLatin1(str, XtDefaultForeground) == 0) {
+	*closure_ret = NULL;
+	if (pd->rv) donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel)
+        else	    donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel);
+    }
+
+    status = XAllocNamedColor(DisplayOfScreen(screen), colormap,
+			      (char*)str, &screenColor, &exactColor);
+    if (status == 0) {
+	String msg, type;
+	params[0] = str;
+	/* Server returns a specific error code but Xlib discards it.  Ugh */
+	if (XLookupColor(DisplayOfScreen(screen), colormap, (char*)str,
+			 &exactColor, &screenColor)) {
+	    type = "noColormap";
+	    msg = "Cannot allocate colormap entry for \"%s\"";
+	}
+	else {
+	    type = "badValue";
+	    msg = "Color name \"%s\" is not defined";
+	}
+
+	XtAppWarningMsg(pd->appContext, type, "cvtStringToPixel",
+			XtCXtToolkitError, msg, params, &num_params);
+	*closure_ret = NULL;
+	return False;
+    } else {
+	*closure_ret = (char*)True;
+        donestr(Pixel, screenColor.pixel, XtRPixel);
+    }
+}
+
+/* ARGSUSED */
+static void FreePixel(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,
+    XrmValuePtr	args,
+    Cardinal	*num_args)
+{
+    Screen	    *screen;
+    Colormap	    colormap;
+
+    if (*num_args != 2) {
+     XtAppWarningMsg(app, XtNwrongParameters,"freePixel",XtCXtToolkitError,
+	"Freeing a pixel requires screen and colormap arguments",
+        (String *)NULL, (Cardinal *)NULL);
+     return;
+    }
+
+    screen = *((Screen **) args[0].addr);
+    colormap = *((Colormap *) args[1].addr);
+
+    if (closure) {
+	XFreeColors( DisplayOfScreen(screen), colormap,
+		     (unsigned long*)toVal->addr, 1, (unsigned long)0
+		    );
+    }
+}
+
+
+/* no longer used by Xt, but it's in the spec */
+XtConvertArgRec const screenConvertArg[] = {
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
+     sizeof(Screen *)}
+};
+
+/*ARGSUSED*/
+static void FetchDisplayArg(
+    Widget widget,
+    Cardinal *size,
+    XrmValue* value)
+{
+    if (widget == NULL)
+	XtErrorMsg("missingWidget", "fetchDisplayArg", XtCXtToolkitError,
+		   "FetchDisplayArg called without a widget to reference",
+		   (String*)NULL, (Cardinal*)NULL);
+        /* can't return any useful Display and caller will de-ref NULL,
+	   so aborting is the only useful option */
+
+    value->size = sizeof(Display*);
+    value->addr = (XPointer)&DisplayOfScreen(XtScreenOfObject(widget));
+}
+
+static XtConvertArgRec const displayConvertArg[] = {
+    {XtProcedureArg, (XtPointer)FetchDisplayArg, 0},
+};
+
+/*ARGSUSED*/
+Boolean XtCvtStringToCursor(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    static const struct _CursorName {
+	const char	*name;
+	unsigned int	shape;
+    } cursor_names[] = {
+			{"X_cursor",		XC_X_cursor},
+			{"arrow",		XC_arrow},
+			{"based_arrow_down",	XC_based_arrow_down},
+			{"based_arrow_up",	XC_based_arrow_up},
+			{"boat",		XC_boat},
+			{"bogosity",		XC_bogosity},
+			{"bottom_left_corner",	XC_bottom_left_corner},
+			{"bottom_right_corner",	XC_bottom_right_corner},
+			{"bottom_side",		XC_bottom_side},
+			{"bottom_tee",		XC_bottom_tee},
+			{"box_spiral",		XC_box_spiral},
+			{"center_ptr",		XC_center_ptr},
+			{"circle",		XC_circle},
+			{"clock",		XC_clock},
+			{"coffee_mug",		XC_coffee_mug},
+			{"cross",		XC_cross},
+			{"cross_reverse",	XC_cross_reverse},
+			{"crosshair",		XC_crosshair},
+			{"diamond_cross",	XC_diamond_cross},
+			{"dot",			XC_dot},
+			{"dotbox",		XC_dotbox},
+			{"double_arrow",	XC_double_arrow},
+			{"draft_large",		XC_draft_large},
+			{"draft_small",		XC_draft_small},
+			{"draped_box",		XC_draped_box},
+			{"exchange",		XC_exchange},
+			{"fleur",		XC_fleur},
+			{"gobbler",		XC_gobbler},
+			{"gumby",		XC_gumby},
+			{"hand1",		XC_hand1},
+			{"hand2",		XC_hand2},
+			{"heart",		XC_heart},
+			{"icon",		XC_icon},
+			{"iron_cross",		XC_iron_cross},
+			{"left_ptr",		XC_left_ptr},
+			{"left_side",		XC_left_side},
+			{"left_tee",		XC_left_tee},
+			{"leftbutton",		XC_leftbutton},
+			{"ll_angle",		XC_ll_angle},
+			{"lr_angle",		XC_lr_angle},
+			{"man",			XC_man},
+			{"middlebutton",	XC_middlebutton},
+			{"mouse",		XC_mouse},
+			{"pencil",		XC_pencil},
+			{"pirate",		XC_pirate},
+			{"plus",		XC_plus},
+			{"question_arrow",	XC_question_arrow},
+			{"right_ptr",		XC_right_ptr},
+			{"right_side",		XC_right_side},
+			{"right_tee",		XC_right_tee},
+			{"rightbutton",		XC_rightbutton},
+			{"rtl_logo",		XC_rtl_logo},
+			{"sailboat",		XC_sailboat},
+			{"sb_down_arrow",	XC_sb_down_arrow},
+			{"sb_h_double_arrow",	XC_sb_h_double_arrow},
+			{"sb_left_arrow",	XC_sb_left_arrow},
+			{"sb_right_arrow",	XC_sb_right_arrow},
+			{"sb_up_arrow",		XC_sb_up_arrow},
+			{"sb_v_double_arrow",	XC_sb_v_double_arrow},
+			{"shuttle",		XC_shuttle},
+			{"sizing",		XC_sizing},
+			{"spider",		XC_spider},
+			{"spraycan",		XC_spraycan},
+			{"star",		XC_star},
+			{"target",		XC_target},
+			{"tcross",		XC_tcross},
+			{"top_left_arrow",	XC_top_left_arrow},
+			{"top_left_corner",	XC_top_left_corner},
+			{"top_right_corner",	XC_top_right_corner},
+			{"top_side",		XC_top_side},
+			{"top_tee",		XC_top_tee},
+			{"trek",		XC_trek},
+			{"ul_angle",		XC_ul_angle},
+			{"umbrella",		XC_umbrella},
+			{"ur_angle",		XC_ur_angle},
+			{"watch",		XC_watch},
+			{"xterm",		XC_xterm},
+    };
+    const struct _CursorName *nP;
+    char *name = (char *)fromVal->addr;
+    register Cardinal i;
+
+    if (*num_args != 1) {
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	     XtNwrongParameters,"cvtStringToCursor",XtCXtToolkitError,
+             "String to cursor conversion needs display argument",
+              (String *)NULL, (Cardinal *)NULL);
+	return False;
+    }
+
+    for (i=0, nP=cursor_names; i < XtNumber(cursor_names); i++, nP++ ) {
+	if (strcmp(name, nP->name) == 0) {
+	    Display *display = *(Display**)args[0].addr;
+	    Cursor cursor = XCreateFontCursor(display, nP->shape );
+	    donestr(Cursor, cursor, XtRCursor);
+	}
+    }
+    XtDisplayStringConversionWarning(dpy, name, XtRCursor);
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeCursor(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,	/* unused */
+    XrmValuePtr	args,
+    Cardinal	*num_args)
+{
+    Display*	display;
+
+    if (*num_args != 1) {
+     XtAppWarningMsg(app,
+	     XtNwrongParameters,"freeCursor",XtCXtToolkitError,
+             "Free Cursor requires display argument",
+              (String *)NULL, (Cardinal *)NULL);
+     return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XFreeCursor( display, *(Cursor*)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToDisplay(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    Display	*d;
+
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtStringToDisplay",XtCXtToolkitError,
+                  "String to Display conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+
+    d = XOpenDisplay((char *)fromVal->addr);
+    if (d != NULL)
+	donestr(Display*, d, XtRDisplay);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDisplay);
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFile(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    FILE *f;
+
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		 XtNwrongParameters,"cvtStringToFile",XtCXtToolkitError,
+                 "String to File conversion needs no extra arguments",
+                 (String *) NULL, (Cardinal *)NULL);
+
+    f = fopen((char *)fromVal->addr, "r");
+    if (f != NULL)
+	donestr(FILE*, f, XtRFile);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFile);
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeFile(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,	/* unused */
+    XrmValuePtr	args,		/* unused */
+    Cardinal	*num_args)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(app,
+		 XtNwrongParameters,"freeFile",XtCXtToolkitError,
+                 "Free File requires no extra arguments",
+                 (String *) NULL, (Cardinal *)NULL);
+
+    fclose( *(FILE**)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToFloat(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtIntToFloat",XtCXtToolkitError,
+                  "Integer to Float conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(float, (*(int *)fromVal->addr));
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFloat(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    int ret;
+    float f, nan;
+
+#ifndef ISC /* On ISC this generates a core dump :-( at least with gs */
+    /* depending on the system this may or may not do anything useful */
+    (void) sscanf ("NaNS", "%g",
+		   toVal->addr != NULL ? (float*) toVal->addr : &nan);
+#endif
+
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		 XtNwrongParameters,"cvtStringToFloat",XtCXtToolkitError,
+                 "String to Float conversion needs no extra arguments",
+                 (String *) NULL, (Cardinal *)NULL);
+
+    ret = sscanf (fromVal->addr, "%g", &f);
+    if (ret == 0) {
+	if (toVal->addr != NULL && toVal->size == sizeof nan)
+	    *(float*)toVal->addr = nan;
+	XtDisplayStringConversionWarning (dpy, (char*) fromVal->addr, XtRFloat);
+	return False;
+    }
+    donestr(float, f, XtRFloat);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFont(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    Font	f;
+    Display*	display;
+
+    if (*num_args != 1) {
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	     XtNwrongParameters,"cvtStringToFont",XtCXtToolkitError,
+             "String to font conversion needs display argument",
+              (String *) NULL, (Cardinal *)NULL);
+	return False;
+    }
+
+    display = *(Display**)args[0].addr;
+
+    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) {
+	f = XLoadFont(display, (char *)fromVal->addr);
+	if (f != 0) {
+  Done:	    donestr( Font, f, XtRFont );
+	}
+	XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFont);
+    }
+    /* try and get the default font */
+
+    {
+	XrmName xrm_name[2];
+	XrmClass xrm_class[2];
+	XrmRepresentation rep_type;
+	XrmValue value;
+
+	xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont");
+	xrm_name[1] = 0;
+	xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont");
+	xrm_class[1] = 0;
+	if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
+			    &rep_type, &value)) {
+	    if (rep_type == _XtQString) {
+		f = XLoadFont(display, (char *)value.addr);
+		if (f != 0)
+		    goto Done;
+		else
+		    XtDisplayStringConversionWarning(dpy, (char *)value.addr,
+						     XtRFont);
+	    } else if (rep_type == XtQFont) {
+		f = *(Font*)value.addr;
+		goto Done;
+	    } else if (rep_type == XtQFontStruct) {
+		f = ((XFontStruct*)value.addr)->fid;
+		goto Done;
+	    }
+	}
+    }
+    /* Should really do XListFonts, but most servers support this */
+    f = XLoadFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*");
+    if (f != 0)
+	goto Done;
+
+    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		    "noFont","cvtStringToFont",XtCXtToolkitError,
+		    "Unable to load any usable ISO8859 font",
+		    (String *) NULL, (Cardinal *)NULL);
+
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeFont(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,	/* unused */
+    XrmValuePtr	args,
+    Cardinal	*num_args)
+{
+    Display *display;
+    if (*num_args != 1) {
+	XtAppWarningMsg(app,
+	     XtNwrongParameters,"freeFont",XtCXtToolkitError,
+             "Free Font needs display argument",
+              (String *) NULL, (Cardinal *)NULL);
+	return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XUnloadFont( display, *(Font*)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToFont(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	   XtNwrongParameters,"cvtIntToFont",XtCXtToolkitError,
+           "Integer to Font conversion needs no extra arguments",
+            (String *) NULL, (Cardinal *)NULL);
+    done(Font, *(int*)fromVal->addr);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToFontSet(
+    Display*    dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer   *closure_ret)
+{
+    XFontSet  f;
+    Display*  display;
+    char**    missing_charset_list;
+    int       missing_charset_count;
+    char*     def_string;
+
+    if (*num_args != 2) {
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+           XtNwrongParameters,"cvtStringToFontSet",XtCXtToolkitError,
+             "String to FontSet conversion needs display and locale arguments",
+              (String *) NULL, (Cardinal *)NULL);
+      return False;
+    }
+
+    display = *(Display**)args[0].addr;
+
+    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFontSet) != 0) {
+      f = XCreateFontSet(display, (char *)fromVal->addr,
+              &missing_charset_list, &missing_charset_count, &def_string);
+        /* Free any returned missing charset list */
+      if (missing_charset_count) {
+          XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+                 XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError,
+                 "Missing charsets in String to FontSet conversion",
+                 (String *) NULL, (Cardinal *)NULL);
+            XFreeStringList(missing_charset_list);
+      }
+      if (f != NULL) {
+  Done:           donestr( XFontSet, f, XtRFontSet );
+      }
+      XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRFontSet);
+    }
+    /* try and get the default fontset */
+
+    {
+      XrmName xrm_name[2];
+      XrmClass xrm_class[2];
+      XrmRepresentation rep_type;
+      XrmValue value;
+
+      xrm_name[0] = XrmPermStringToQuark ("xtDefaultFontSet");
+      xrm_name[1] = 0;
+      xrm_class[0] = XrmPermStringToQuark ("XtDefaultFontSet");
+      xrm_class[1] = 0;
+      if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
+                          &rep_type, &value)) {
+          if (rep_type == _XtQString) {
+
+              f = XCreateFontSet(display, (char *)value.addr,
+				 &missing_charset_list, &missing_charset_count,
+				 &def_string);
+                /* Free any returned missing charset list */
+              if (missing_charset_count) {
+                  XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+			 XtNmissingCharsetList,"cvtStringToFontSet",
+			 XtCXtToolkitError,
+			 "Missing charsets in String to FontSet conversion",
+                         (String *) NULL, (Cardinal *)NULL);
+		  XFreeStringList(missing_charset_list);
+              }
+              if (f != NULL)
+                  goto Done;
+              else
+                  XtDisplayStringConversionWarning(dpy, (char *)value.addr,
+                                                   XtRFontSet);
+          } else if (rep_type == XtQFontSet) {
+              f = *(XFontSet*)value.addr;
+              goto Done;
+          }
+      }
+  }
+
+    /* Should really do XListFonts, but most servers support this */
+    f = XCreateFontSet(display, "-*-*-*-R-*-*-*-120-*-*-*-*,*",
+          &missing_charset_list, &missing_charset_count, &def_string);
+
+    /* Free any returned missing charset list */
+    if (missing_charset_count) {
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+             XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError,
+             "Missing charsets in String to FontSet conversion",
+             (String *) NULL, (Cardinal *)NULL);
+        XFreeStringList(missing_charset_list);
+    }
+    if (f != NULL)
+      goto Done;
+
+    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+           "noFont","cvtStringToFontSet",XtCXtToolkitError,
+             "Unable to load any usable fontset",
+              (String *) NULL, (Cardinal *)NULL);
+
+    return False;
+}
+
+/*ARGSUSED*/
+static void FreeFontSet(
+    XtAppContext	app,
+    XrmValuePtr		toVal,
+    XtPointer		closure,        /* unused */
+    XrmValuePtr		args,
+    Cardinal		*num_args)
+{
+    Display *display;
+    if (*num_args != 2) {
+      XtAppWarningMsg(app,
+           XtNwrongParameters,"freeFontSet",XtCXtToolkitError,
+             "FreeFontSet needs display and locale arguments",
+              (String *) NULL, (Cardinal *)NULL);
+      return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XFreeFontSet( display, *(XFontSet*)toVal->addr );
+}
+
+/*ARGSUSED*/
+static void FetchLocaleArg(
+    Widget widget,	/* unused */
+    Cardinal *size,	/* unused */
+    XrmValue *value)
+{
+    static XrmString locale;
+
+    locale = XrmQuarkToString(XrmStringToQuark
+			      (setlocale(LC_CTYPE, (char*)NULL)));
+    value->size = sizeof(XrmString);
+    value->addr = (XPointer)&locale;
+}
+
+static XtConvertArgRec const localeDisplayConvertArgs[] = {
+    {XtProcedureArg, (XtPointer)FetchDisplayArg, 0},
+    {XtProcedureArg, (XtPointer)FetchLocaleArg, 0},
+};
+
+
+/*ARGSUSED*/
+Boolean
+XtCvtStringToFontStruct(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    XFontStruct	    *f;
+    Display*	display;
+
+    if (*num_args != 1) {
+     XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	     XtNwrongParameters,"cvtStringToFontStruct",XtCXtToolkitError,
+             "String to font conversion needs display argument",
+              (String *) NULL, (Cardinal *)NULL);
+     return False;
+    }
+
+    display = *(Display**)args[0].addr;
+
+    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) {
+	f = XLoadQueryFont(display, (char *)fromVal->addr);
+	if (f != NULL) {
+  Done:	    donestr( XFontStruct*, f, XtRFontStruct);
+	}
+
+	XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+					 XtRFontStruct);
+    }
+
+    /* try and get the default font */
+
+    {
+	XrmName xrm_name[2];
+	XrmClass xrm_class[2];
+	XrmRepresentation rep_type;
+	XrmValue value;
+
+	xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont");
+	xrm_name[1] = 0;
+	xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont");
+	xrm_class[1] = 0;
+	if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
+			    &rep_type, &value)) {
+	    if (rep_type == _XtQString) {
+		f = XLoadQueryFont(display, (char*)value.addr);
+		if (f != NULL)
+		    goto Done;
+		else
+		    XtDisplayStringConversionWarning(dpy, (char*)value.addr,
+						     XtRFontStruct);
+	    } else if (rep_type == XtQFont) {
+		f = XQueryFont(display, *(Font*)value.addr );
+		if (f != NULL) goto Done;
+	    } else if (rep_type == XtQFontStruct) {
+		f = (XFontStruct*)value.addr;
+		goto Done;
+	    }
+	}
+    }
+    /* Should really do XListFonts, but most servers support this */
+    f = XLoadQueryFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*");
+    if (f != NULL)
+	goto Done;
+
+    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	     "noFont","cvtStringToFontStruct",XtCXtToolkitError,
+             "Unable to load any usable ISO8859 font",
+              (String *) NULL, (Cardinal *)NULL);
+
+    return False;
+}
+
+/* ARGSUSED */
+static void FreeFontStruct(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,	/* unused */
+    XrmValuePtr	args,
+    Cardinal	*num_args)
+{
+    Display *display;
+    if (*num_args != 1) {
+     XtAppWarningMsg(app,
+	     XtNwrongParameters,"freeFontStruct",XtCXtToolkitError,
+             "Free FontStruct requires display argument",
+              (String *) NULL, (Cardinal *)NULL);
+     return;
+    }
+
+    display = *(Display**)args[0].addr;
+    XFreeFont( display, *(XFontStruct**)toVal->addr );
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToInt(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    int	i;
+
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtStringToInt",XtCXtToolkitError,
+                  "String to Integer conversion needs no extra arguments",
+                  (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i))
+	donestr(int, i, XtRInt);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRInt);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToShort(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    int i;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	  XtNwrongParameters,"cvtStringToShort",XtCXtToolkitError,
+          "String to Integer conversion needs no extra arguments",
+           (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i))
+        donestr(short, (short)i, XtRShort);
+
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRShort);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToDimension(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    int i;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	  XtNwrongParameters,"cvtStringToDimension",XtCXtToolkitError,
+          "String to Dimension conversion needs no extra arguments",
+           (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i)) {
+        if ( i < 0 )
+            XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+					     XtRDimension);
+        donestr(Dimension, (Dimension)i, XtRDimension);
+    }
+    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDimension);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToUnsignedChar(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtIntToUnsignedChar",XtCXtToolkitError,
+                  "Integer to UnsignedChar conversion needs no extra arguments",
+                   (String *)NULL, (Cardinal *)NULL);
+    done(unsigned char, (*(int *)fromVal->addr));
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToUnsignedChar(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    int i;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtStringToUnsignedChar",XtCXtToolkitError,
+                  "String to Integer conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    if (IsInteger((String)fromVal->addr, &i)) {
+        if ( i < 0 || i > 255 )
+            XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+					     XtRUnsignedChar);
+        donestr(unsigned char, i, XtRUnsignedChar);
+    }
+    XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
+				     XtRUnsignedChar);
+    return False;
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtColorToPixel(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtXColorToPixel",XtCXtToolkitError,
+                  "Color to Pixel conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    done(Pixel, ((XColor *)fromVal->addr)->pixel);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToPixel(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtIntToPixel",XtCXtToolkitError,
+                  "Integer to Pixel conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    done(Pixel, *(int*)fromVal->addr);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtIntToPixmap(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtIntToPixmap",XtCXtToolkitError,
+                  "Integer to Pixmap conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+    done(Pixmap, *(Pixmap*)fromVal->addr);
+}
+
+#ifdef MOTIFBC
+void LowerCase(register char  *source, register *dest)
+{
+    register char ch;
+    int i;
+
+    for (i = 0; (ch = *source) != 0 && i < 999; source++, dest++, i++) {
+    	if ('A' <= ch && ch <= 'Z')
+	    *dest = ch - 'A' + 'a';
+	else
+	    *dest = ch;
+    }
+    *dest = 0;
+}
+#endif
+
+static int CompareISOLatin1 (char *first, char *second)
+{
+    register unsigned char *ap, *bp;
+
+    for (ap = (unsigned char *) first, bp = (unsigned char *) second;
+	 *ap && *bp; ap++, bp++) {
+	register unsigned char a, b;
+
+	if ((a = *ap) != (b = *bp)) {
+	    /* try lowercasing and try again */
+
+	    if ((a >= XK_A) && (a <= XK_Z))
+	      a += (XK_a - XK_A);
+	    else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis))
+	      a += (XK_agrave - XK_Agrave);
+	    else if ((a >= XK_Ooblique) && (a <= XK_Thorn))
+	      a += (XK_oslash - XK_Ooblique);
+
+	    if ((b >= XK_A) && (b <= XK_Z))
+	      b += (XK_a - XK_A);
+	    else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis))
+	      b += (XK_agrave - XK_Agrave);
+	    else if ((b >= XK_Ooblique) && (b <= XK_Thorn))
+	      b += (XK_oslash - XK_Ooblique);
+
+	    if (a != b) break;
+	}
+    }
+    return (((int) *bp) - ((int) *ap));
+}
+
+static void CopyISOLatin1Lowered(char *dst, char *src)
+{
+    unsigned char *dest, *source;
+
+    dest = (unsigned char *) dst; source = (unsigned char *) src;
+
+    for ( ; *source; source++, dest++) {
+	if (*source >= XK_A  && *source <= XK_Z)
+	    *dest = *source + (XK_a - XK_A);
+	else if (*source >= XK_Agrave && *source <= XK_Odiaeresis)
+	    *dest = *source + (XK_agrave - XK_Agrave);
+	else if (*source >= XK_Ooblique && *source <= XK_Thorn)
+	    *dest = *source + (XK_oslash - XK_Ooblique);
+	else
+	    *dest = *source;
+    }
+    *dest = '\0';
+}
+
+/*ARGSUSED*/
+Boolean
+XtCvtStringToInitialState(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtStringToInitialState",XtCXtToolkitError,
+                  "String to InitialState conversion needs no extra arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+
+    if (CompareISOLatin1(str, "NormalState") == 0) donestr(int, NormalState, XtRInitialState);
+    if (CompareISOLatin1(str, "IconicState") == 0) donestr(int, IconicState, XtRInitialState);
+    {
+	int val;
+	if (IsInteger(str, &val)) donestr( int, val, XtRInitialState );
+    }
+    XtDisplayStringConversionWarning(dpy, str, XtRInitialState);
+    return False;
+}
+
+static XtConvertArgRec const visualConvertArgs[] = {
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
+     sizeof(Screen *)},
+    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.depth),
+     sizeof(Cardinal)}
+};
+
+/*ARGSUSED*/
+Boolean XtCvtStringToVisual(
+    Display*	dpy,
+    XrmValuePtr args,		/* Screen, depth */
+    Cardinal    *num_args,	/* 2 */
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)	/* unused */
+{
+    String str = (String)fromVal->addr;
+    int vc;
+    XVisualInfo vinfo;
+    if (*num_args != 2) {
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtStringToVisual",XtCXtToolkitError,
+                  "String to Visual conversion needs screen and depth arguments",
+                   (String *) NULL, (Cardinal *)NULL);
+	return False;
+    }
+
+         if (CompareISOLatin1(str, "StaticGray") == 0)	vc = StaticGray;
+    else if (CompareISOLatin1(str, "StaticColor") == 0)	vc = StaticColor;
+    else if (CompareISOLatin1(str, "TrueColor") == 0)	vc = TrueColor;
+    else if (CompareISOLatin1(str, "GrayScale") == 0)	vc = GrayScale;
+    else if (CompareISOLatin1(str, "PseudoColor") == 0)	vc = PseudoColor;
+    else if (CompareISOLatin1(str, "DirectColor") == 0)	vc = DirectColor;
+    else if (!IsInteger(str, &vc)) {
+	XtDisplayStringConversionWarning(dpy, str, "Visual class name");
+	return False;
+    }
+
+    if (XMatchVisualInfo( XDisplayOfScreen((Screen*)*(Screen**)args[0].addr),
+		     XScreenNumberOfScreen((Screen*)*(Screen**)args[0].addr),
+		     (int)*(int*)args[1].addr,
+		     vc,
+		     &vinfo) ) {
+	donestr( Visual*, vinfo.visual, XtRVisual );
+    }
+    else {
+	String params[2];
+	Cardinal num_params = 2;
+	params[0] = str;
+	params[1] =
+	    DisplayString(XDisplayOfScreen((Screen*)*(Screen**)args[0].addr));
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNconversionError, "stringToVisual", XtCXtToolkitError,
+                  "Cannot find Visual of class %s for display %s",
+		  params, &num_params );
+	return False;
+    }
+}
+
+
+/*ARGSUSED*/
+Boolean XtCvtStringToAtom(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr	fromVal,
+    XrmValuePtr	toVal,
+    XtPointer	*closure_ret)
+{
+    Atom atom;
+    if (*num_args != 1) {
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		  XtNwrongParameters,"cvtStringToAtom",XtCXtToolkitError,
+                  "String to Atom conversion needs Display argument",
+                   (String *) NULL, (Cardinal *)NULL);
+	return False;
+    }
+
+    atom =  XInternAtom( *(Display**)args->addr, (char*)fromVal->addr, False );
+    donestr(Atom, atom, XtRAtom);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToDirectoryString(
+    Display	*dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    String str;
+    char directory[PATH_MAX+1];
+
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+           XtNwrongParameters,"cvtStringToDirectoryString",XtCXtToolkitError,
+           "String to DirectoryString conversion needs no extra arguments",
+           (String *)NULL, (Cardinal *)NULL);
+
+    str = (String)fromVal->addr;
+    if (CompareISOLatin1(str, "XtCurrentDirectory") == 0) {
+	/* uglier, but does not depend on compiler knowing return type */
+#if !defined(X_NOT_POSIX) || defined(SYSV) || defined(WIN32)
+	if (getcwd(directory, PATH_MAX + 1))
+	    str = directory;
+#else
+	if (getwd(directory))
+	    str = directory;
+#endif
+	if (!str) {
+	    if (errno == EACCES)
+		errno = 0;	    /* reset errno */
+	    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr,
+					     XtRDirectoryString);
+	    return False;
+	}
+    }
+
+    /* Since memory from the resource database or from static buffers of
+     * system libraries may be freed or overwritten, allocate memory.
+     * The memory is freed when all cache references are released.
+     */
+    str = XtNewString(str);
+    donestr(String, str, XtRDirectoryString);
+}
+
+/*ARGSUSED*/
+static void FreeDirectoryString(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,	/* unused */
+    XrmValuePtr	args,
+    Cardinal	*num_args)
+{
+    if (*num_args != 0)
+	XtAppWarningMsg(app,
+		 XtNwrongParameters,"freeDirectoryString",XtCXtToolkitError,
+		 "Free Directory String requires no extra arguments",
+                 (String *) NULL, (Cardinal *) NULL);
+
+    XtFree((char *) toVal->addr);
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToRestartStyle(
+    Display	*dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    String str = (String)fromVal->addr;
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	      XtNwrongParameters,"cvtStringToRestartStyle",XtCXtToolkitError,
+              "String to RestartStyle conversion needs no extra arguments",
+              (String *)NULL, (Cardinal *)NULL);
+
+    if (CompareISOLatin1(str, "RestartIfRunning") == 0)
+	donestr(unsigned char, SmRestartIfRunning, XtRRestartStyle);
+    if (CompareISOLatin1(str, "RestartAnyway") == 0)
+	donestr(unsigned char, SmRestartAnyway, XtRRestartStyle);
+    if (CompareISOLatin1(str, "RestartImmediately") == 0)
+	donestr(unsigned char, SmRestartImmediately, XtRRestartStyle);
+    if (CompareISOLatin1(str, "RestartNever") == 0)
+	donestr(unsigned char, SmRestartNever, XtRRestartStyle);
+    XtDisplayStringConversionWarning(dpy, str, XtRRestartStyle);
+    return False;
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToCommandArgArray(
+    Display	*dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    String *strarray, *ptr;
+    char *src;
+    char *dst, *dst_str;
+    char *start;
+    int tokens, len;
+
+    if (*num_args != 0)
+	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+            XtNwrongParameters,"cvtStringToCommandArgArray",XtCXtToolkitError,
+            "String to CommandArgArray conversion needs no extra arguments",
+            (String *)NULL, (Cardinal *)NULL);
+
+    src = fromVal->addr;
+    dst = dst_str = __XtMalloc((unsigned) strlen(src) + 1);
+    tokens = 0;
+
+    while (*src != '\0') {
+	/* skip whitespace */
+	while (IsWhitespace(*src) || IsNewline(*src))
+	    src++;
+	/* test for end of string */
+	if (*src == '\0')
+	    break;
+
+	/* start new token */
+	tokens++;
+	start = src;
+	while (*src != '\0' && !IsWhitespace(*src) && !IsNewline(*src)) {
+	    if (*src == '\\' &&
+		(IsWhitespace(*(src+1)) || IsNewline(*(src+1)))) {
+		len = src - start;
+		if (len) {
+		    /* copy preceeding part of token */
+		    memcpy(dst, start, len);
+		    dst += len;
+		}
+		/* skip backslash */
+		src++;
+		/* next part of token starts at whitespace */
+		start = src;
+	    }
+	    src++;
+	}
+	len = src - start;
+	if (len) {
+	    /* copy last part of token */
+	    memcpy(dst, start, len);
+	    dst += len;
+	}
+	*dst = '\0';
+	if (*src != '\0')
+	    dst++;
+    }
+
+    ptr = strarray = (String*) __XtMalloc((Cardinal)(tokens+1) * sizeof(String));
+    src = dst_str;
+    while (--tokens >= 0) {
+	*ptr = src;
+	ptr++;
+	if (tokens) {
+	    len = strlen(src);
+	    src = src + len + 1;
+	}
+    }
+    *ptr = NULL;
+
+    *closure_ret = (XtPointer) strarray;
+    donestr(char**, strarray, XtRCommandArgArray)
+}
+
+/*ARGSUSED*/
+static void ArgArrayDestructor(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,
+    XrmValuePtr	args,
+    Cardinal	*num_args)
+{
+    String *strarray;
+
+    if (closure) {
+	strarray = (String*) closure;
+	XtFree(*strarray);
+	XtFree((char *) strarray);
+    }
+}
+
+/*ARGSUSED*/
+Boolean XtCvtStringToGravity (
+    Display* dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr fromVal,
+    XrmValuePtr toVal,
+    XtPointer	*closure_ret)
+{
+    static struct _namepair {
+	XrmQuark quark;
+	char *name;
+	int gravity;
+    } names[] = {
+	{ NULLQUARK, "forget",		ForgetGravity },
+	{ NULLQUARK, "northwest",	NorthWestGravity },
+	{ NULLQUARK, "north",		NorthGravity },
+	{ NULLQUARK, "northeast",	NorthEastGravity },
+	{ NULLQUARK, "west",		WestGravity },
+	{ NULLQUARK, "center",		CenterGravity },
+	{ NULLQUARK, "east",		EastGravity },
+	{ NULLQUARK, "southwest",	SouthWestGravity },
+	{ NULLQUARK, "south",		SouthGravity },
+	{ NULLQUARK, "southeast",	SouthEastGravity },
+	{ NULLQUARK, "static",		StaticGravity },
+	{ NULLQUARK, "unmap",		UnmapGravity },
+	{ NULLQUARK, "0",		ForgetGravity },
+	{ NULLQUARK, "1",		NorthWestGravity },
+	{ NULLQUARK, "2",		NorthGravity },
+	{ NULLQUARK, "3",		NorthEastGravity },
+	{ NULLQUARK, "4",		WestGravity },
+	{ NULLQUARK, "5",		CenterGravity },
+	{ NULLQUARK, "6",		EastGravity },
+	{ NULLQUARK, "7",		SouthWestGravity },
+	{ NULLQUARK, "8",		SouthGravity },
+	{ NULLQUARK, "9",		SouthEastGravity },
+	{ NULLQUARK, "10",		StaticGravity },
+	{ NULLQUARK, NULL,		ForgetGravity }
+    };
+    static Boolean haveQuarks = FALSE;
+    char lowerName[40];
+    XrmQuark q;
+    char *s;
+    struct _namepair *np;
+
+    if (*num_args != 0) {
+        XtAppWarningMsg(XtDisplayToApplicationContext (dpy),
+			"wrongParameters","cvtStringToGravity","XtToolkitError",
+			"String to Gravity conversion needs no extra arguments",
+			(String *) NULL, (Cardinal *)NULL);
+	return False;
+    }
+    if (!haveQuarks) {
+	for (np = names; np->name; np++) {
+	    np->quark = XrmPermStringToQuark (np->name);
+	}
+	haveQuarks = TRUE;
+    }
+    s = (char *) fromVal->addr;
+    if (strlen(s) < sizeof lowerName) {
+	CopyISOLatin1Lowered (lowerName, s);
+	q = XrmStringToQuark (lowerName);
+	for (np = names; np->name; np++)
+	    if (np->quark == q) donestr(int, np->gravity, XtRGravity);
+    }
+    XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRGravity);
+    return False;
+}
+
+void _XtAddDefaultConverters(
+    ConverterTable table)
+{
+#define Add(from, to, proc, convert_args, num_args, cache) \
+    _XtTableAddConverter(table, from, to, proc, \
+	    (XtConvertArgList) convert_args, (Cardinal)num_args, \
+	    True, cache, (XtDestructor)NULL, True)
+
+#define Add2(from, to, proc, convert_args, num_args, cache, destructor) \
+    _XtTableAddConverter(table, from, to, proc, \
+	    (XtConvertArgList) convert_args, (Cardinal)num_args, \
+	    True, cache, destructor, True)
+
+    Add(XtQColor, XtQPixel,       XtCvtColorToPixel,   NULL, 0, XtCacheNone);
+
+    Add(XtQInt,   XtQBool,	  XtCvtIntToBool,      NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQBoolean,     XtCvtIntToBoolean,   NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQColor,	  XtCvtIntToColor,
+	colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay);
+    Add(XtQInt,   XtQDimension,   XtCvtIntToShort,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQFloat,       XtCvtIntToFloat,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQFont,        XtCvtIntToFont,      NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQPixel,       XtCvtIntToPixel,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQPixmap,      XtCvtIntToPixmap,    NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQPosition,    XtCvtIntToShort,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQShort,       XtCvtIntToShort,     NULL, 0, XtCacheNone);
+    Add(XtQInt,   XtQUnsignedChar,XtCvtIntToUnsignedChar,NULL, 0, XtCacheNone);
+
+    Add(XtQPixel, XtQColor,	  XtCvtIntToColor,
+	colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay);
+
+    Add(_XtQString, XtQAtom,      XtCvtStringToAtom,
+	displayConvertArg, XtNumber(displayConvertArg), XtCacheNone);
+    Add(_XtQString, XtQBool,      XtCvtStringToBool,    NULL, 0, XtCacheNone);
+    Add(_XtQString, XtQBoolean,   XtCvtStringToBoolean, NULL, 0, XtCacheNone);
+   Add2(_XtQString, XtQCommandArgArray,  XtCvtStringToCommandArgArray,
+	NULL, 0, XtCacheNone | XtCacheRefCount, ArgArrayDestructor);
+   Add2(_XtQString, XtQCursor,    XtCvtStringToCursor,
+	displayConvertArg, XtNumber(displayConvertArg),
+	XtCacheByDisplay, FreeCursor);
+    Add(_XtQString, XtQDimension, XtCvtStringToDimension,NULL, 0, XtCacheNone);
+   Add2(_XtQString, XtQDirectoryString, XtCvtStringToDirectoryString, NULL, 0,
+	XtCacheNone | XtCacheRefCount, FreeDirectoryString);
+    Add(_XtQString, XtQDisplay,   XtCvtStringToDisplay, NULL, 0, XtCacheAll);
+   Add2(_XtQString, XtQFile,      XtCvtStringToFile,    NULL, 0,
+	XtCacheAll | XtCacheRefCount, FreeFile);
+    Add(_XtQString, XtQFloat,     XtCvtStringToFloat,   NULL, 0, XtCacheNone);
+
+   Add2(_XtQString, XtQFont,      XtCvtStringToFont,
+	displayConvertArg, XtNumber(displayConvertArg),
+	XtCacheByDisplay, FreeFont);
+   Add2(_XtQString, XtQFontSet,   XtCvtStringToFontSet,
+	localeDisplayConvertArgs, XtNumber(localeDisplayConvertArgs),
+	XtCacheByDisplay, FreeFontSet);
+   Add2(_XtQString, XtQFontStruct,XtCvtStringToFontStruct,
+	displayConvertArg, XtNumber(displayConvertArg),
+	XtCacheByDisplay, FreeFontStruct);
+
+    Add(_XtQString, XtQGravity,   XtCvtStringToGravity, NULL, 0, XtCacheNone);
+    Add(_XtQString, XtQInitialState, XtCvtStringToInitialState, NULL, 0,
+	XtCacheNone);
+    Add(_XtQString, XtQInt,	     XtCvtStringToInt,    NULL, 0, XtCacheAll);
+   Add2(_XtQString, XtQPixel,        XtCvtStringToPixel,
+	colorConvertArgs, XtNumber(colorConvertArgs),
+	XtCacheByDisplay, FreePixel);
+    Add(_XtQString, XtQPosition,     XtCvtStringToShort,  NULL, 0, XtCacheAll);
+    Add(_XtQString, XtQRestartStyle, XtCvtStringToRestartStyle, NULL, 0,
+	XtCacheNone);
+    Add(_XtQString, XtQShort,        XtCvtStringToShort,  NULL, 0, XtCacheAll);
+    Add(_XtQString, XtQUnsignedChar, XtCvtStringToUnsignedChar,
+	NULL, 0, XtCacheAll);
+   Add2(_XtQString, XtQVisual,       XtCvtStringToVisual,
+	visualConvertArgs, XtNumber(visualConvertArgs),
+	XtCacheByDisplay, NULL);
+
+   _XtAddTMConverters(table);
+}
diff --git a/libXt/src/Core.c b/libXt/src/Core.c
new file mode 100644
index 000000000..24b70444f
--- /dev/null
+++ b/libXt/src/Core.c
@@ -0,0 +1,398 @@
+/* $Xorg: Core.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicP.h"
+#include "EventI.h"
+#include "ConvertI.h"
+#include "TranslateI.h"
+#include "ResourceI.h"
+#include "RectObj.h"
+#include "RectObjP.h"
+#include "ThreadsI.h"
+#include "StringDefs.h"
+
+/******************************************************************
+ *
+ * CoreWidget Resources
+ *
+ ******************************************************************/
+
+externaldef(xtinherittranslations) int _XtInheritTranslations = 0;
+extern String XtCXtToolkitError; /* from IntrinsicI.h */
+static void XtCopyScreen(Widget, int, XrmValue *);
+
+static XtResource resources[] = {
+    {XtNscreen, XtCScreen, XtRScreen, sizeof(Screen*),
+      XtOffsetOf(CoreRec,core.screen), XtRCallProc, (XtPointer)XtCopyScreen},
+/*_XtCopyFromParent does not work for screen because the Display
+parameter is not passed through to the XtRCallProc routines */
+    {XtNdepth, XtCDepth, XtRInt,sizeof(int),
+         XtOffsetOf(CoreRec,core.depth),
+	 XtRCallProc, (XtPointer)_XtCopyFromParent},
+    {XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap),
+	 XtOffsetOf(CoreRec,core.colormap),
+	 XtRCallProc,(XtPointer)_XtCopyFromParent},
+    {XtNbackground, XtCBackground, XtRPixel,sizeof(Pixel),
+         XtOffsetOf(CoreRec,core.background_pixel),
+	 XtRString, (XtPointer)"XtDefaultBackground"},
+    {XtNbackgroundPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap),
+         XtOffsetOf(CoreRec,core.background_pixmap),
+	 XtRImmediate, (XtPointer)XtUnspecifiedPixmap},
+    {XtNborderColor, XtCBorderColor, XtRPixel,sizeof(Pixel),
+         XtOffsetOf(CoreRec,core.border_pixel),
+         XtRString,(XtPointer)"XtDefaultForeground"},
+    {XtNborderPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap),
+         XtOffsetOf(CoreRec,core.border_pixmap),
+	 XtRImmediate, (XtPointer)XtUnspecifiedPixmap},
+    {XtNmappedWhenManaged, XtCMappedWhenManaged, XtRBoolean, sizeof(Boolean),
+         XtOffsetOf(CoreRec,core.mapped_when_managed),
+	 XtRImmediate, (XtPointer)True},
+    {XtNtranslations, XtCTranslations, XtRTranslationTable,
+        sizeof(XtTranslations), XtOffsetOf(CoreRec,core.tm.translations),
+        XtRTranslationTable, (XtPointer)NULL},
+    {XtNaccelerators, XtCAccelerators, XtRAcceleratorTable,
+        sizeof(XtTranslations), XtOffsetOf(CoreRec,core.accelerators),
+        XtRTranslationTable, (XtPointer)NULL}
+    };
+
+static void CoreInitialize(Widget, Widget, ArgList, Cardinal *);
+static void CoreClassPartInitialize(WidgetClass);
+static void CoreDestroy(Widget);
+static void CoreRealize(Widget, XtValueMask *, XSetWindowAttributes *);
+static Boolean CoreSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void CoreSetValuesAlmost(Widget, Widget, XtWidgetGeometry *, XtWidgetGeometry *);
+
+static RectObjClassRec unNamedObjClassRec = {
+  {
+    /* superclass	  */	(WidgetClass)&rectObjClassRec,
+    /* class_name	  */	"UnNamedObj",
+    /* widget_size	  */	0,
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/	NULL,
+    /* class_inited       */	FALSE,
+    /* initialize	  */	NULL,
+    /* initialize_hook    */	NULL,
+    /* realize		  */	(XtProc)XtInheritRealize,
+    /* actions		  */	NULL,
+    /* num_actions	  */	0,
+    /* resources	  */	NULL,
+    /* num_resources	  */	0,
+    /* xrm_class	  */	NULLQUARK,
+    /* compress_motion	  */	FALSE,
+    /* compress_exposure  */	FALSE,
+    /* compress_enterleave*/ 	FALSE,
+    /* visible_interest	  */	FALSE,
+    /* destroy		  */	NULL,
+    /* resize		  */	NULL,
+    /* expose		  */	NULL,
+    /* set_values	  */	NULL,
+    /* set_values_hook    */	NULL,
+    /* set_values_almost  */	XtInheritSetValuesAlmost,
+    /* get_values_hook    */	NULL,
+    /* accept_focus	  */	NULL,
+    /* version		  */	XtVersion,
+    /* callback_offsets   */    NULL,
+    /* tm_table           */    NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */	NULL,
+    /* extension	    */  NULL
+  }
+};
+
+
+externaldef(widgetclassrec) WidgetClassRec widgetClassRec = {
+{
+    /* superclass         */    (WidgetClass)&unNamedObjClassRec,
+    /* class_name         */    "Core",
+    /* widget_size        */    sizeof(WidgetRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/  CoreClassPartInitialize,
+    /* class_inited       */    FALSE,
+    /* initialize         */    CoreInitialize,
+    /* initialize_hook    */    NULL,
+    /* realize            */    CoreRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    resources,
+    /* num_resources      */    XtNumber(resources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/    FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    CoreDestroy,
+    /* resize             */    NULL,
+    /* expose             */    NULL,
+    /* set_values         */    CoreSetValues,
+    /* set_values_hook    */    NULL,
+    /* set_values_almost  */    CoreSetValuesAlmost,
+    /* get_values_hook    */    NULL,
+    /* accept_focus       */    NULL,
+    /* version            */    XtVersion,
+    /* callback_offsets   */    NULL,
+    /* tm_table           */    NULL,
+    /* query_geometry       */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension            */  NULL
+  }
+};
+externaldef (WidgetClass) WidgetClass widgetClass = &widgetClassRec;
+
+externaldef (WidgetClass) WidgetClass coreWidgetClass = &widgetClassRec;
+
+
+/*ARGSUSED*/
+static void XtCopyScreen(
+    Widget      widget,
+    int		offset,
+    XrmValue    *value)
+{
+    value->addr = (XPointer)(&widget->core.screen);
+}
+
+/*
+ * Start of Core methods
+ */
+
+static void CoreClassPartInitialize(
+    register WidgetClass wc)
+{
+    /* We don't need to check for null super since we'll get to object
+       eventually, and it had better define them!  */
+
+    register WidgetClass super = wc->core_class.superclass;
+
+    LOCK_PROCESS;
+    if (wc->core_class.realize == XtInheritRealize) {
+	wc->core_class.realize = super->core_class.realize;
+    }
+
+    if (wc->core_class.accept_focus == XtInheritAcceptFocus) {
+	wc->core_class.accept_focus = super->core_class.accept_focus;
+    }
+
+    if (wc->core_class.display_accelerator == XtInheritDisplayAccelerator) {
+	wc->core_class.display_accelerator =
+		super->core_class.display_accelerator;
+    }
+
+    if (wc->core_class.tm_table == (char *) XtInheritTranslations) {
+	wc->core_class.tm_table =
+		wc->core_class.superclass->core_class.tm_table;
+    } else if (wc->core_class.tm_table != NULL) {
+	wc->core_class.tm_table =
+	      (String)XtParseTranslationTable(wc->core_class.tm_table);
+    }
+
+    if (wc->core_class.actions != NULL) {
+	Boolean inPlace;
+
+	if (wc->core_class.version == XtVersionDontCheck)
+	    inPlace = True;
+	else
+	    inPlace = (wc->core_class.version < XtVersion) ? False : True;
+
+	/* Compile the action table into a more efficient form */
+        wc->core_class.actions = (XtActionList) _XtInitializeActionData(
+	    wc->core_class.actions, wc->core_class.num_actions, inPlace);
+    }
+    UNLOCK_PROCESS;
+}
+/* ARGSUSED */
+static void CoreInitialize(
+    Widget   requested_widget,
+    register Widget new_widget,
+    ArgList args,
+    Cardinal *num_args)
+{
+    XtTranslations save1, save2;
+    new_widget->core.event_table = NULL;
+    new_widget->core.tm.proc_table = NULL;
+    new_widget->core.tm.lastEventTime = 0;
+    /* magic semi-resource fetched by GetResources */
+    save1 = (XtTranslations)new_widget->core.tm.current_state;
+    new_widget->core.tm.current_state = NULL;
+    save2 = new_widget->core.tm.translations;
+    LOCK_PROCESS;
+    new_widget->core.tm.translations =
+	(XtTranslations)new_widget->core.widget_class->core_class.tm_table;
+    UNLOCK_PROCESS;
+    if (save1)
+	_XtMergeTranslations(new_widget, save1, save1->operation);
+    if (save2)
+	_XtMergeTranslations(new_widget, save2, save2->operation);
+}
+
+static void CoreRealize(
+    Widget		 widget,
+    XtValueMask		 *value_mask,
+    XSetWindowAttributes *attributes)
+{
+    XtCreateWindow(widget, (unsigned int) InputOutput,
+	(Visual *) CopyFromParent, *value_mask, attributes);
+} /* CoreRealize */
+
+static void CoreDestroy (
+     Widget    widget)
+{
+    _XtFreeEventTable(&widget->core.event_table);
+    _XtDestroyTMData(widget);
+    XtUnregisterDrawable(XtDisplay(widget), widget->core.window);
+
+    if (widget->core.popup_list != NULL)
+        XtFree((char *)widget->core.popup_list);
+
+} /* CoreDestroy */
+
+/* ARGSUSED */
+static Boolean CoreSetValues(
+    Widget old, Widget reference, Widget new,
+    ArgList args,
+    Cardinal *num_args)
+{
+    Boolean redisplay;
+    Mask    window_mask;
+    XSetWindowAttributes attributes;
+    XtTranslations save;
+
+    redisplay = FALSE;
+    if  (old->core.tm.translations != new->core.tm.translations) {
+	save = new->core.tm.translations;
+	new->core.tm.translations = old->core.tm.translations;
+	_XtMergeTranslations(new, save, XtTableReplace);
+    }
+
+    /* Check everything that depends upon window being realized */
+    if (XtIsRealized(old)) {
+	window_mask = 0;
+	/* Check window attributes */
+	if (old->core.background_pixel != new->core.background_pixel
+	    && new->core.background_pixmap == XtUnspecifiedPixmap) {
+	   attributes.background_pixel  = new->core.background_pixel;
+	   window_mask |= CWBackPixel;
+	   redisplay = TRUE;
+	}
+	if (old->core.background_pixmap != new->core.background_pixmap) {
+	   if (new->core.background_pixmap == XtUnspecifiedPixmap) {
+	       window_mask |= CWBackPixel;
+	       attributes.background_pixel  = new->core.background_pixel;
+	   }
+	   else {
+	       attributes.background_pixmap = new->core.background_pixmap;
+	       window_mask &= ~CWBackPixel;
+	       window_mask |= CWBackPixmap;
+	   }
+	   redisplay = TRUE;
+	}
+	if (old->core.border_pixel != new->core.border_pixel
+	    && new->core.border_pixmap == XtUnspecifiedPixmap) {
+	   attributes.border_pixel  = new->core.border_pixel;
+	   window_mask |= CWBorderPixel;
+       }
+	if (old->core.border_pixmap != new->core.border_pixmap) {
+	   if (new->core.border_pixmap == XtUnspecifiedPixmap) {
+	       window_mask |= CWBorderPixel;
+	       attributes.border_pixel  = new->core.border_pixel;
+	   }
+	   else {
+	       attributes.border_pixmap = new->core.border_pixmap;
+	       window_mask &= ~CWBorderPixel;
+	       window_mask |= CWBorderPixmap;
+	   }
+       }
+	if (old->core.depth != new->core.depth) {
+	   XtAppWarningMsg(XtWidgetToApplicationContext(old),
+		    "invalidDepth","setValues",XtCXtToolkitError,
+               "Can't change widget depth", (String *)NULL, (Cardinal *)NULL);
+	   new->core.depth = old->core.depth;
+	}
+	if (old->core.colormap != new->core.colormap) {
+	    window_mask |= CWColormap;
+	    attributes.colormap = new->core.colormap;
+	}
+	if (window_mask != 0) {
+	    /* Actually change X window attributes */
+	    XChangeWindowAttributes(
+		XtDisplay(new), XtWindow(new), window_mask, &attributes);
+	}
+
+	if (old->core.mapped_when_managed != new->core.mapped_when_managed) {
+	    Boolean mapped_when_managed = new->core.mapped_when_managed;
+	    new->core.mapped_when_managed = !mapped_when_managed;
+	    XtSetMappedWhenManaged(new, mapped_when_managed);
+	}
+    } /* if realized */
+
+    return redisplay;
+} /* CoreSetValues */
+
+/*ARGSUSED*/
+static void CoreSetValuesAlmost(
+    Widget		old,
+    Widget		new,
+    XtWidgetGeometry    *request,
+    XtWidgetGeometry    *reply)
+{
+    *request = *reply;
+}
diff --git a/libXt/src/Create.c b/libXt/src/Create.c
new file mode 100644
index 000000000..ab98c3d4e
--- /dev/null
+++ b/libXt/src/Create.c
@@ -0,0 +1,778 @@
+/* $Xorg: Create.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Create.c,v 3.10 2002/12/17 04:50:58 dawes Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "ShellP.h"
+#include "CreateI.h"
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+#include "ResConfigP.h"
+#endif
+#include <stdio.h>
+
+static String XtNxtCreateWidget = "xtCreateWidget";
+static String XtNxtCreatePopupShell = "xtCreatePopupShell";
+
+static void
+CallClassPartInit(WidgetClass ancestor, WidgetClass wc)
+{
+    if (ancestor->core_class.superclass != NULL) {
+	CallClassPartInit(ancestor->core_class.superclass, wc);
+    }
+    if (ancestor->core_class.class_part_initialize != NULL) {
+	(*(ancestor->core_class.class_part_initialize)) (wc);
+    }
+}
+
+void
+XtInitializeWidgetClass(WidgetClass wc)
+{
+    XtEnum inited;
+    LOCK_PROCESS;
+    if (wc->core_class.class_inited) {
+	UNLOCK_PROCESS;
+	return;
+    }
+    inited = 0x01;
+    {
+	WidgetClass pc;
+#define LeaveIfClass(c, d) if (pc == c) { inited = d; break; }
+	for (pc = wc; pc; pc = pc->core_class.superclass) {
+	    LeaveIfClass(rectObjClass, 0x01 |
+			 RectObjClassFlag);
+	    LeaveIfClass(coreWidgetClass, 0x01 |
+			 RectObjClassFlag |
+			 WidgetClassFlag);
+	    LeaveIfClass(compositeWidgetClass, 0x01 |
+			 RectObjClassFlag |
+			 WidgetClassFlag |
+			 CompositeClassFlag);
+	    LeaveIfClass(constraintWidgetClass, 0x01 |
+			 RectObjClassFlag |
+			 WidgetClassFlag |
+			 CompositeClassFlag |
+			 ConstraintClassFlag);
+	    LeaveIfClass(shellWidgetClass, 0x01 |
+			 RectObjClassFlag |
+			 WidgetClassFlag |
+			 CompositeClassFlag |
+			 ShellClassFlag);
+	    LeaveIfClass(wmShellWidgetClass, 0x01 |
+			 RectObjClassFlag |
+			 WidgetClassFlag |
+			 CompositeClassFlag |
+			 ShellClassFlag |
+			 WMShellClassFlag);
+	    LeaveIfClass(topLevelShellWidgetClass, 0x01 |
+			 RectObjClassFlag |
+			 WidgetClassFlag |
+			 CompositeClassFlag |
+			 ShellClassFlag |
+			 WMShellClassFlag |
+			 TopLevelClassFlag);
+	}
+#undef LeaveIfClass
+    }
+    if (wc->core_class.version != XtVersion &&
+	wc->core_class.version != XtVersionDontCheck) {
+	String param[3];
+	String mismatch = "Widget class %s version mismatch (recompilation needed):\n  widget %d vs. intrinsics %d.";
+	String recompile = "Widget class %s must be re-compiled.";
+	Cardinal num_params;
+
+	param[0] = wc->core_class.class_name;
+	param[1] = (String) wc->core_class.version;
+	param[2] = (String) XtVersion;
+
+	if (wc->core_class.version == (11 * 1000 + 5) || /* MIT X11R5 */
+	    wc->core_class.version == (11 * 1000 + 4)) { /* MIT X11R4 */
+	    if ((inited & WMShellClassFlag) &&
+		(sizeof(Boolean) != sizeof(char) ||
+		 sizeof(Atom) != sizeof(Widget) ||
+		 sizeof(Atom) != sizeof(String))) {
+		num_params=3;
+		XtWarningMsg("versionMismatch","widget",XtCXtToolkitError,
+			     mismatch, param, &num_params);
+		num_params=1;
+		XtErrorMsg("R4orR5versionMismatch","widget",XtCXtToolkitError,
+			   recompile, param, &num_params);
+
+	    }
+	}
+	else if (wc->core_class.version == (11 * 1000 + 3)) { /* MIT X11R3 */
+	    if (inited & ShellClassFlag) {
+		num_params=1;
+		XtWarningMsg("r3versionMismatch","widget",XtCXtToolkitError,
+			     "Shell Widget class %s binary compiled for R3",
+			     param,&num_params);
+		XtErrorMsg("R3versionMismatch","widget",XtCXtToolkitError,
+			   recompile, param, &num_params);
+	    }
+	}
+	else {
+	    num_params=3;
+	    XtWarningMsg("versionMismatch","widget",XtCXtToolkitError,
+			 mismatch, param, &num_params);
+	    if (wc->core_class.version == (2 * 1000 + 2)) /* MIT X11R2 */ {
+		num_params=1;
+		XtErrorMsg("r2versionMismatch","widget",XtCXtToolkitError,
+			   recompile, param, &num_params);
+	    }
+	}
+    }
+
+    if ((wc->core_class.superclass != NULL)
+	    && (!(wc->core_class.superclass->core_class.class_inited)))
+ 	XtInitializeWidgetClass(wc->core_class.superclass);
+
+    if (wc->core_class.class_initialize != NULL)
+	(*(wc->core_class.class_initialize))();
+    CallClassPartInit(wc, wc);
+    wc->core_class.class_inited = inited;
+    UNLOCK_PROCESS;
+}
+
+static void
+CallInitialize (
+    WidgetClass class,
+    Widget      req_widget,
+    Widget      new_widget,
+    ArgList     args,
+    Cardinal    num_args)
+{
+    WidgetClass superclass;
+    XtInitProc initialize;
+    XtArgsProc initialize_hook;
+
+    LOCK_PROCESS;
+    superclass = class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass)
+        CallInitialize (superclass, req_widget, new_widget, args, num_args);
+    LOCK_PROCESS;
+    initialize = class->core_class.initialize;
+    UNLOCK_PROCESS;
+    if (initialize)
+	(*initialize) (req_widget, new_widget, args, &num_args);
+    LOCK_PROCESS;
+    initialize_hook = class->core_class.initialize_hook;
+    UNLOCK_PROCESS;
+    if (initialize_hook)
+	(*initialize_hook) (new_widget, args, &num_args);
+}
+
+static void
+CallConstraintInitialize (
+    ConstraintWidgetClass class,
+    Widget	req_widget,
+    Widget	new_widget,
+    ArgList	args,
+    Cardinal	num_args)
+{
+    WidgetClass superclass;
+    XtInitProc initialize;
+
+    LOCK_PROCESS;
+    superclass = class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass != constraintWidgetClass)
+	CallConstraintInitialize((ConstraintWidgetClass) superclass,
+		req_widget, new_widget, args, num_args);
+    LOCK_PROCESS;
+    initialize = class->constraint_class.initialize;
+    UNLOCK_PROCESS;
+    if (initialize)
+        (*initialize) (req_widget, new_widget, args, &num_args);
+}
+
+static Widget
+xtWidgetAlloc(
+    WidgetClass widget_class,
+    ConstraintWidgetClass parent_constraint_class,
+    Widget parent,
+    String name,
+    ArgList     args,		/* must be NULL if typed_args is non-NULL */
+    Cardinal    num_args,
+    XtTypedArgList typed_args,	/* must be NULL if args is non-NULL */
+    Cardinal	num_typed_args)
+{
+    Widget widget;
+    Cardinal                wsize, csize = 0;
+    ObjectClassExtension    ext;
+
+    LOCK_PROCESS;
+    if (! (widget_class->core_class.class_inited))
+	XtInitializeWidgetClass(widget_class);
+    ext = (ObjectClassExtension)
+	XtGetClassExtension(widget_class,
+			    XtOffsetOf(ObjectClassRec, object_class.extension),
+			    NULLQUARK, XtObjectExtensionVersion,
+			    sizeof(ObjectClassExtensionRec));
+    if (parent_constraint_class)
+	csize = parent_constraint_class->constraint_class.constraint_size;
+    if (ext && ext->allocate) {
+	XtAllocateProc allocate;
+	Cardinal extra = 0;
+	Cardinal nargs = num_args;
+	Cardinal ntyped = num_typed_args;
+	allocate = ext->allocate;
+	UNLOCK_PROCESS;
+	(*allocate)(widget_class, &csize, &extra, args, &nargs,
+		    typed_args, &ntyped, &widget, NULL);
+    } else {
+	wsize = widget_class->core_class.widget_size;
+	UNLOCK_PROCESS;
+	if (csize) {
+	    if (sizeof(struct {char a; double b;}) !=
+		(sizeof(struct {char a; unsigned long b;}) -
+		 sizeof(unsigned long) + sizeof(double))) {
+		if (csize && !(csize & (sizeof(double) - 1)))
+		    wsize = (wsize + sizeof(double) - 1) & ~(sizeof(double)-1);
+	    }
+	}
+	widget = (Widget) __XtMalloc((unsigned)(wsize + csize));
+	bzero(widget, wsize + csize);
+	widget->core.constraints =
+	    (csize ? (XtPointer)((char *)widget + wsize) : NULL);
+    }
+    widget->core.self = widget;
+    widget->core.parent = parent;
+    widget->core.widget_class = widget_class;
+    widget->core.xrm_name = StringToName((name != NULL) ? name : "");
+    widget->core.being_destroyed =
+	(parent != NULL ? parent->core.being_destroyed : FALSE);
+    return widget;
+}
+
+static void
+CompileCallbacks(
+    Widget widget)
+{
+    CallbackTable offsets;
+    InternalCallbackList* cl;
+    int i;
+
+    LOCK_PROCESS;
+    offsets = (CallbackTable)
+	widget->core.widget_class->core_class.callback_private;
+
+    for (i = (int)(long) *(offsets++); --i >= 0; offsets++) {
+	cl = (InternalCallbackList *)
+	    ((char *) widget - (*offsets)->xrm_offset - 1);
+	if (*cl)
+	    *cl = _XtCompileCallbackList((XtCallbackList) *cl);
+    }
+    UNLOCK_PROCESS;
+}
+
+static Widget
+xtCreate(
+    char        *name,
+    char        *class,
+    WidgetClass widget_class,
+    Widget      parent,
+    Screen*     default_screen, /* undefined when creating a nonwidget */
+    ArgList     args,		/* must be NULL if typed_args is non-NULL */
+    Cardinal    num_args,
+    XtTypedArgList typed_args,	/* must be NULL if args is non-NULL */
+    Cardinal	num_typed_args,
+    ConstraintWidgetClass parent_constraint_class,
+        /* NULL if not a subclass of Constraint or if child is popup shell */
+    XtWidgetProc post_proc)
+{
+    /* need to use strictest alignment rules possible in next two decls. */
+    double                  widget_cache[100];
+    double                  constraint_cache[20];
+    Widget                  req_widget;
+    XtPointer               req_constraints = NULL;
+    Cardinal                wsize, csize;
+    Widget	    	    widget;
+    XtCacheRef		    *cache_refs;
+    Cardinal		    i;
+    XtCreateHookDataRec     call_data;
+
+    widget = xtWidgetAlloc(widget_class, parent_constraint_class, parent,
+		name, args, num_args, typed_args, num_typed_args);
+
+    if (XtIsRectObj(widget)) {
+	widget->core.managed = FALSE;
+    }
+    if (XtIsWidget(widget)) {
+	widget->core.name = XrmNameToString(widget->core.xrm_name);
+        widget->core.screen = default_screen;
+        widget->core.tm.translations = NULL;
+	widget->core.window = (Window) 0;
+	widget->core.visible = TRUE;
+	widget->core.popup_list = NULL;
+	widget->core.num_popups = 0;
+    };
+    LOCK_PROCESS;
+    if (XtIsApplicationShell(widget)) {
+	ApplicationShellWidget a = (ApplicationShellWidget) widget;
+	if (class != NULL)
+	    a->application.xrm_class = StringToClass(class);
+	else
+	    a->application.xrm_class = widget_class->core_class.xrm_class;
+	a->application.class = XrmQuarkToString(a->application.xrm_class);
+    }
+    UNLOCK_PROCESS;
+
+    /* fetch resources */
+    cache_refs = _XtGetResources(widget, args, num_args,
+		typed_args, &num_typed_args);
+
+    /* Convert typed arg list to arg list */
+    if (typed_args != NULL && num_typed_args > 0) {
+	args = (ArgList)ALLOCATE_LOCAL(sizeof(Arg) * num_typed_args);
+	if (args == NULL) _XtAllocError(NULL);
+	for (i = 0; i < num_typed_args; i++) {
+	    args[i].name = typed_args[i].name;
+	    args[i].value = typed_args[i].value;
+	}
+	num_args = num_typed_args;
+    }
+
+    CompileCallbacks(widget);
+
+    if (cache_refs != NULL) {
+	XtAddCallback(widget, XtNdestroyCallback,
+		XtCallbackReleaseCacheRefList, (XtPointer)cache_refs );
+    }
+
+    wsize = widget_class->core_class.widget_size;
+    csize = 0;
+    req_widget = (Widget) XtStackAlloc(wsize, widget_cache);
+    (void) memmove ((char *) req_widget, (char *) widget, (int) wsize);
+    CallInitialize (XtClass(widget), req_widget, widget, args, num_args);
+    if (parent_constraint_class != NULL) {
+        csize = parent_constraint_class->constraint_class.constraint_size;
+	if (csize) {
+	    req_constraints = XtStackAlloc(csize, constraint_cache);
+	    (void) memmove((char*)req_constraints, widget->core.constraints,
+			(int)csize);
+	    req_widget->core.constraints = req_constraints;
+	} else req_widget->core.constraints = NULL;
+	CallConstraintInitialize(parent_constraint_class, req_widget, widget,
+		args, num_args);
+	if (csize) {
+	    XtStackFree(req_constraints, constraint_cache);
+	}
+    }
+    XtStackFree((XtPointer)req_widget, widget_cache);
+    if (post_proc != (XtWidgetProc) NULL) {
+	Widget hookobj;
+	(*post_proc)(widget);
+	hookobj = XtHooksOfDisplay((default_screen != (Screen*) NULL) ?
+		default_screen->display :
+		XtDisplayOfObject(parent));
+	if (XtHasCallbacks(hookobj, XtNcreateHook) == XtCallbackHasSome) {
+
+	    call_data.type = XtHcreate;
+	    call_data.widget = widget;
+	    call_data.args = args;
+	    call_data.num_args = num_args;
+	    XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.createhook_callbacks,
+		(XtPointer)&call_data);
+	}
+    }
+    if (typed_args != NULL) {
+	while (num_typed_args-- > 0) {
+
+	    /* In GetResources we may have dynamically alloc'd store to hold */
+	    /* a copy of a resource which was larger then sizeof(XtArgVal). */
+	    /* We must free this store now in order to prevent a memory leak */
+	    /* A typed arg that has a converted value in dynamic store has a */
+	    /* negated size field. */
+
+	    if (typed_args->type != NULL && typed_args->size < 0) {
+		XtFree((char*)typed_args->value);
+		typed_args->size = -(typed_args->size);
+	    }
+	    typed_args++;
+	}
+	DEALLOCATE_LOCAL((char*)args);
+    }
+    return (widget);
+}
+
+static void
+widgetPostProc(Widget w)
+{
+    XtWidgetProc insert_child;
+    Widget parent = XtParent(w);
+    String param = XtName(w);
+    Cardinal num_params = 1;
+
+    if (XtIsComposite(parent)) {
+	LOCK_PROCESS;
+	insert_child = ((CompositeWidgetClass) parent->core.widget_class)->
+	    composite_class.insert_child;
+	UNLOCK_PROCESS;
+    } else {
+	return;
+    }
+    if (insert_child == NULL) {
+	XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+		"nullProc","insertChild",XtCXtToolkitError,
+		"\"%s\" parent has NULL insert_child method",
+		&param, &num_params);
+    } else {
+	(*insert_child) (w);
+    }
+}
+
+Widget
+_XtCreateWidget(
+    String      name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args,
+    XtTypedArgList typed_args,
+    Cardinal	num_typed_args)
+{
+    register Widget	    widget;
+    ConstraintWidgetClass   cwc;
+    Screen*                 default_screen;
+    XtEnum		    class_inited;
+    String		    params[3];
+    Cardinal		    num_params;
+
+    params[0] = name;
+    num_params = 1;
+
+    if (parent == NULL) {
+	XtErrorMsg("invalidParent", XtNxtCreateWidget, XtCXtToolkitError,
+		   "XtCreateWidget \"%s\" requires non-NULL parent",
+		   params, &num_params);
+    } else if (widget_class == NULL) {
+	XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+		      "invalidClass", XtNxtCreateWidget, XtCXtToolkitError,
+		      "XtCreateWidget \"%s\" requires non-NULL widget class",
+		      params, &num_params);
+    }
+    LOCK_PROCESS;
+    if (!widget_class->core_class.class_inited)
+	XtInitializeWidgetClass(widget_class);
+    class_inited = widget_class->core_class.class_inited;
+    UNLOCK_PROCESS;
+    if ((class_inited & WidgetClassFlag) == 0) {
+	/* not a widget */
+	default_screen = NULL;
+	if (XtIsComposite(parent)) {
+	    CompositeClassExtension ext;
+	    ext = (CompositeClassExtension)
+		XtGetClassExtension(XtClass(parent),
+		      XtOffsetOf(CompositeClassRec, composite_class.extension),
+		      NULLQUARK, 1L, (Cardinal) 0);
+	    LOCK_PROCESS;
+	    if (ext &&
+		(ext->version > XtCompositeExtensionVersion ||
+		 ext->record_size > sizeof(CompositeClassExtensionRec))) {
+		params[1] = XtClass(parent)->core_class.class_name;
+		num_params = 2;
+		XtAppWarningMsg(XtWidgetToApplicationContext(parent),
+				"invalidExtension", XtNxtCreateWidget,
+				XtCXtToolkitError,
+	   "widget \"%s\" class %s has invalid CompositeClassExtension record",
+				params, &num_params);
+	    }
+	    if (!ext || !ext->accepts_objects) {
+		params[1] = XtName(parent);
+		num_params = 2;
+		XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+			      "nonWidget", XtNxtCreateWidget,XtCXtToolkitError,
+"attempt to add non-widget child \"%s\" to parent \"%s\" which supports only widgets",
+			      params, &num_params);
+	    }
+	    UNLOCK_PROCESS;
+	}
+    } else {
+	default_screen = parent->core.screen;
+    }
+
+    if (XtIsConstraint(parent)) {
+	cwc = (ConstraintWidgetClass) parent->core.widget_class;
+    } else {
+	cwc = NULL;
+    }
+    widget = xtCreate(name, (char *)NULL, widget_class, parent,
+		default_screen, args, num_args,
+		typed_args, num_typed_args, cwc, widgetPostProc);
+    return (widget);
+}
+
+Widget
+XtCreateWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget   	parent,
+    ArgList 	args,
+    Cardinal    num_args
+    )
+{
+    Widget retval;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    retval = _XtCreateWidget((String)name, widget_class, parent, args, num_args,
+		(XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+Widget
+XtCreateManagedWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args
+    )
+{
+    register Widget	    widget;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    XtCheckSubclass(parent, compositeWidgetClass, "in XtCreateManagedWidget");
+    widget = _XtCreateWidget((String)name, widget_class, parent, args,
+		num_args, (XtTypedArgList)NULL, (Cardinal) 0);
+    XtManageChild(widget);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+static void
+popupPostProc(Widget w)
+{
+    Widget parent = XtParent(w);
+
+    parent->core.popup_list =
+	(WidgetList) XtRealloc((char*) parent->core.popup_list,
+		(unsigned) (parent->core.num_popups+1) * sizeof(Widget));
+    parent->core.popup_list[parent->core.num_popups++] = w;
+}
+
+Widget
+_XtCreatePopupShell(
+    String      name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args,
+    XtTypedArgList      typed_args,
+    Cardinal            num_typed_args)
+{
+    register Widget widget;
+    Screen* default_screen;
+
+    if (parent == NULL) {
+	XtErrorMsg("invalidParent",XtNxtCreatePopupShell,XtCXtToolkitError,
+		"XtCreatePopupShell requires non-NULL parent",
+		(String *)NULL, (Cardinal *)NULL);
+    } else if (widget_class == NULL) {
+	XtAppErrorMsg(XtWidgetToApplicationContext(parent),
+		"invalidClass",XtNxtCreatePopupShell,XtCXtToolkitError,
+		"XtCreatePopupShell requires non-NULL widget class",
+		(String *)NULL, (Cardinal *)NULL);
+    }
+    XtCheckSubclass(parent, coreWidgetClass, "in XtCreatePopupShell");
+    default_screen = parent->core.screen;
+    widget = xtCreate(name, (char *)NULL, widget_class, parent,
+		default_screen, args, num_args, typed_args,
+		num_typed_args, (ConstraintWidgetClass)NULL,
+		popupPostProc);
+
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+    XtAddEventHandler (widget, (EventMask) PropertyChangeMask, FALSE,
+		(XtEventHandler) _XtResourceConfigurationEH, NULL);
+#endif
+    return(widget);
+}
+
+Widget
+XtCreatePopupShell(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget      parent,
+    ArgList     args,
+    Cardinal    num_args
+    )
+{
+    Widget retval;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    retval = _XtCreatePopupShell((String)name, widget_class, parent, args,
+		num_args, (XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+Widget
+_XtAppCreateShell(
+    String      name,
+    String      class,
+    WidgetClass widget_class,
+    Display*    display,
+    ArgList     args,
+    Cardinal    num_args,
+    XtTypedArgList typed_args,
+    Cardinal	num_typed_args)
+{
+    Widget shell;
+
+    if (widget_class == NULL) {
+	XtAppErrorMsg(XtDisplayToApplicationContext(display),
+		"invalidClass","xtAppCreateShell",XtCXtToolkitError,
+		"XtAppCreateShell requires non-NULL widget class",
+		(String *)NULL, (Cardinal *)NULL);
+    }
+    if (name == NULL)
+	name = XrmNameToString(_XtGetPerDisplay(display)->name);
+    shell = xtCreate(name, class, widget_class, (Widget)NULL,
+		(Screen*)DefaultScreenOfDisplay(display),
+		args, num_args, typed_args, num_typed_args,
+		(ConstraintWidgetClass) NULL, _XtAddShellToHookObj);
+
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+    XtAddEventHandler (shell, (EventMask) PropertyChangeMask, FALSE,
+		(XtEventHandler) _XtResourceConfigurationEH, NULL);
+#endif
+
+    return shell;
+}
+
+Widget
+XtAppCreateShell(
+    _Xconst char*       name,
+    _Xconst char*       class,
+    WidgetClass         widget_class,
+    Display             *display,
+    ArgList             args,
+    Cardinal            num_args
+    )
+{
+    Widget retval;
+    DPY_TO_APPCON(display);
+
+    LOCK_APP(app);
+    retval = _XtAppCreateShell((String)name, (String)class, widget_class,
+		display, args, num_args, (XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+/* ARGSUSED */
+Widget
+XtCreateApplicationShell(
+    _Xconst char* name,		/* unused in R3 and later */
+    WidgetClass widget_class,
+    ArgList     args,
+    Cardinal    num_args
+    )
+{
+    Widget retval;
+    Display* dpy;
+    XrmClass class;
+    XtAppContext app = _XtDefaultAppContext();
+
+    LOCK_APP(app);
+    dpy = app->list[0];
+    class = _XtGetPerDisplay(dpy)->class;
+
+    retval = _XtAppCreateShell((String)NULL, XrmQuarkToString((XrmQuark)class),
+		widget_class, dpy, args, num_args,
+		(XtTypedArgList)NULL, (Cardinal)0);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+Widget
+_XtCreateHookObj(Screen* screen)
+{
+    Widget req_widget;
+    double widget_cache[100];
+    Cardinal wsize = 0;
+    Widget hookobj = xtWidgetAlloc(hookObjectClass,
+		(ConstraintWidgetClass)NULL,
+		(Widget)NULL, "hooks",
+		(ArgList)NULL, (Cardinal)0,
+		(XtTypedArgList)NULL, (Cardinal)0);
+
+    ((HookObject)hookobj)->hooks.screen = screen;
+    (void) _XtGetResources(hookobj, (ArgList)NULL, 0,
+		(XtTypedArgList)NULL, &wsize);
+    CompileCallbacks(hookobj);
+    wsize = hookObjectClass->core_class.widget_size;
+    req_widget = (Widget) XtStackAlloc(wsize, widget_cache);
+    (void) memmove ((char *) req_widget, (char *) hookobj, (int) wsize);
+    CallInitialize (hookObjectClass, req_widget, hookobj,
+		(ArgList)NULL, (Cardinal) 0);
+    XtStackFree((XtPointer)req_widget, widget_cache);
+    return hookobj;
+}
diff --git a/libXt/src/Destroy.c b/libXt/src/Destroy.c
new file mode 100644
index 000000000..60f1b277f
--- /dev/null
+++ b/libXt/src/Destroy.c
@@ -0,0 +1,374 @@
+/* $Xorg: Destroy.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Destroy.c,v 1.2 2001/08/22 22:52:18 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+struct _DestroyRec {
+    int dispatch_level;
+    Widget widget;
+};
+
+static void Recursive(Widget widget, XtWidgetProc proc)
+{
+    register Cardinal i;
+    CompositePart   *cwp;
+
+    /* Recurse down normal children */
+    if (XtIsComposite(widget)) {
+	cwp = &(((CompositeWidget) widget)->composite);
+	for (i = 0; i < cwp->num_children; i++) {
+	    Recursive(cwp->children[i], proc);
+	}
+    }
+
+    /* Recurse down popup children */
+    if (XtIsWidget(widget)) {
+	for (i = 0; i < widget->core.num_popups; i++) {
+	    Recursive(widget->core.popup_list[i], proc);
+	}
+    }
+
+    /* Finally, apply procedure to this widget */
+    (*proc) (widget);
+} /* Recursive */
+
+static void Phase1Destroy (Widget widget)
+{
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+
+    widget->core.being_destroyed = TRUE;
+    if (XtHasCallbacks(hookobj, XtNdestroyHook) == XtCallbackHasSome) {
+	XtDestroyHookDataRec call_data;
+
+	call_data.type = XtHdestroy;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.destroyhook_callbacks,
+		(XtPointer) &call_data);
+    }
+} /* Phase1Destroy */
+
+static void Phase2Callbacks(Widget widget)
+{
+    if (widget->core.destroy_callbacks != NULL) {
+	XtCallCallbackList(widget,
+			   widget->core.destroy_callbacks, (XtPointer) NULL);
+    }
+} /* Phase2Callbacks */
+
+static void Phase2Destroy(register Widget widget)
+{
+    register WidgetClass	    class;
+    register ConstraintWidgetClass  cwClass;
+    ObjectClassExtension	    ext;
+
+    /* Call constraint destroy procedures */
+    if (XtParent(widget) != NULL && !XtIsShell(widget) && XtIsConstraint(XtParent(widget))) {
+	LOCK_PROCESS;
+	cwClass = (ConstraintWidgetClass)XtParent(widget)->core.widget_class;
+	UNLOCK_PROCESS;
+	for (;;) {
+	    XtWidgetProc destroy;
+
+	    LOCK_PROCESS;
+	    destroy = cwClass->constraint_class.destroy;
+	    UNLOCK_PROCESS;
+	    if (destroy)
+		(*destroy) (widget);
+            if (cwClass == (ConstraintWidgetClass)constraintWidgetClass) break;
+	    LOCK_PROCESS;
+	    cwClass = (ConstraintWidgetClass) cwClass->core_class.superclass;
+	    UNLOCK_PROCESS;
+	}
+    }
+
+    /* Call widget destroy procedures */
+    LOCK_PROCESS;
+    for (class = widget->core.widget_class;
+	 class != NULL;
+	 class = class->core_class.superclass) {
+	XtWidgetProc destroy;
+
+	destroy = class->core_class.destroy;
+	UNLOCK_PROCESS;
+	if (destroy)
+	    (*destroy) (widget);
+	LOCK_PROCESS;
+    }
+
+    /* Call widget deallocate procedure */
+    ext = (ObjectClassExtension)
+	XtGetClassExtension(widget->core.widget_class,
+			    XtOffsetOf(CoreClassPart, extension),
+			    NULLQUARK, XtObjectExtensionVersion,
+			    sizeof(ObjectClassExtensionRec));
+    if (ext && ext->deallocate) {
+	XtDeallocateProc deallocate;
+	deallocate = ext->deallocate;
+	UNLOCK_PROCESS;
+	(*deallocate)(widget, NULL);
+    } else {
+	UNLOCK_PROCESS;
+	XtFree((char *)widget);
+    }
+} /* Phase2Destroy */
+
+static Boolean IsDescendant(Widget widget, Widget root)
+{
+    while ((widget = XtParent(widget)) != root) {
+	if (widget == NULL) return False;
+    }
+    return True;
+}
+
+static void XtPhase2Destroy (Widget widget)
+{
+    Display	    *display = NULL;
+    Window	    window;
+    Widget          parent;
+    XtAppContext    app = XtWidgetToApplicationContext(widget);
+    Widget	    outerInPhase2Destroy = app->in_phase2_destroy;
+    int		    starting_count = app->destroy_count;
+    Boolean	    isPopup = False;
+
+    /* invalidate focus trace cache for this display */
+    _XtGetPerDisplay(XtDisplayOfObject(widget))->pdi.traceDepth = 0;
+
+    parent = widget->core.parent;
+
+    if (parent && XtIsWidget(parent) && parent->core.num_popups) {
+	Cardinal i;
+	for (i = 0; i < parent->core.num_popups; i++) {
+	    if (parent->core.popup_list[i] == widget) {
+		isPopup = True;
+		break;
+	    }
+	}
+    }
+
+    if (!isPopup && parent && XtIsComposite(parent)) {
+	XtWidgetProc delete_child;
+
+	LOCK_PROCESS;
+	delete_child =
+	    ((CompositeWidgetClass) parent->core.widget_class)->
+		composite_class.delete_child;
+	UNLOCK_PROCESS;
+        if (XtIsRectObj(widget)) {
+       	    XtUnmanageChild(widget);
+        }
+	if (delete_child == NULL) {
+	    String param;
+	    Cardinal num_params = 1;
+
+	    LOCK_PROCESS;
+	    param = parent->core.widget_class->core_class.class_name;
+	    UNLOCK_PROCESS;
+	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"invalidProcedure","deleteChild",XtCXtToolkitError,
+		"null delete_child procedure for class %s in XtDestroy",
+		&param, &num_params);
+	} else {
+	    (*delete_child) (widget);
+	}
+    }
+
+    /* widget is freed in Phase2Destroy, so retrieve window now.
+     * Shells destroy their own windows, to prevent window leaks in
+     * popups; this test is practical only when XtIsShell() is cheap.
+     */
+    if (XtIsShell(widget) || !XtIsWidget(widget)) {
+	window = 0;
+    }
+    else {
+	display = XtDisplay(widget);
+	window = widget->core.window;
+    }
+
+    Recursive(widget, Phase2Callbacks);
+    if (app->destroy_count > starting_count) {
+	int i = starting_count;
+	while (i < app->destroy_count) {
+
+	    DestroyRec * dr = app->destroy_list + i;
+	    if (IsDescendant(dr->widget, widget)) {
+		Widget descendant = dr->widget;
+		register int j;
+		app->destroy_count--;
+		for (j = app->destroy_count - i; --j >= 0; dr++)
+		    *dr = *(dr + 1);
+		XtPhase2Destroy(descendant);
+	    }
+	    else i++;
+	}
+    }
+
+    app->in_phase2_destroy = widget;
+    Recursive(widget, Phase2Destroy);
+    app->in_phase2_destroy = outerInPhase2Destroy;
+
+    if (isPopup) {
+	Cardinal i;
+	for (i = 0; i < parent->core.num_popups; i++)
+	    if (parent->core.popup_list[i] == widget) {
+		parent->core.num_popups--;
+		while (i < parent->core.num_popups) {
+		    parent->core.popup_list[i] = parent->core.popup_list[i+1];
+		    i++;
+		}
+		break;
+	    }
+    }
+
+    /* %%% the following parent test hides a more serious problem,
+       but it avoids breaking those who depended on the old bug
+       until we have time to fix it properly. */
+
+    if (window && (parent == NULL || !parent->core.being_destroyed))
+	XDestroyWindow(display, window);
+} /* XtPhase2Destroy */
+
+
+void _XtDoPhase2Destroy(XtAppContext app, int dispatch_level)
+{
+    /* Phase 2 must occur in fifo order.  List is not necessarily
+     * contiguous in dispatch_level.
+     */
+
+    int i = 0;
+    while (i < app->destroy_count) {
+
+	/* XtPhase2Destroy can result in calls to XtDestroyWidget,
+	 * and these could cause app->destroy_list to be reallocated.
+	 */
+
+	DestroyRec* dr = app->destroy_list + i;
+	if (dr->dispatch_level >= dispatch_level)  {
+	    Widget w = dr->widget;
+	    register int j;
+	    app->destroy_count--;
+	    for (j = app->destroy_count - i; --j >=0; dr++)
+		*dr = *(dr + 1);
+	    XtPhase2Destroy(w);
+	}
+	else i++;
+    }
+}
+
+
+void XtDestroyWidget (Widget widget)
+{
+    XtAppContext app;
+    DestroyRec *dr, *dr2;
+
+    app = XtWidgetToApplicationContext(widget);
+    LOCK_APP(app);
+    if (widget->core.being_destroyed) {
+	UNLOCK_APP(app);
+	return;
+    }
+    Recursive(widget, Phase1Destroy);
+
+    if (app->in_phase2_destroy &&
+	IsDescendant(widget, app->in_phase2_destroy))
+    {
+	XtPhase2Destroy(widget);
+	UNLOCK_APP(app);
+	return;
+    }
+
+    if (app->destroy_count == app->destroy_list_size) {
+	app->destroy_list_size += 10;
+	app->destroy_list = (DestroyRec*)
+	    XtRealloc( (char*)app->destroy_list,
+		       (unsigned)sizeof(DestroyRec)*app->destroy_list_size
+		      );
+    }
+    dr = app->destroy_list + app->destroy_count++;
+    dr->dispatch_level = app->dispatch_level;
+    dr->widget = widget;
+
+    if (app->dispatch_level > 1) {
+	int i;
+	for (i = app->destroy_count - 1; i;) {
+	    /* this handles only one case of nesting difficulties */
+ 	    dr = app->destroy_list + (--i);
+ 	    if (dr->dispatch_level < app->dispatch_level &&
+ 		IsDescendant(dr->widget, widget)) {
+ 	        dr2 = app->destroy_list + (app->destroy_count-1);
+ 		dr2->dispatch_level = dr->dispatch_level;
+  		break;
+  	    }
+  	}
+    }
+
+    if (_XtSafeToDestroy(app)) {
+	app->dispatch_level = 1; /* avoid nested _XtDoPhase2Destroy */
+	_XtDoPhase2Destroy(app, 0);
+	app->dispatch_level = 0;
+    }
+    UNLOCK_APP(app);
+
+} /* XtDestroyWidget */
diff --git a/libXt/src/Display.c b/libXt/src/Display.c
new file mode 100644
index 000000000..de57a6bf2
--- /dev/null
+++ b/libXt/src/Display.c
@@ -0,0 +1,763 @@
+/* $Xorg: Display.c,v 1.6 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Display.c,v 3.15 2002/09/18 01:25:01 dawes Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+#include "ResConfigP.h"
+#endif
+
+#include <stdlib.h>
+
+#ifdef XTHREADS
+void (*_XtProcessLock)(void) = NULL;
+void (*_XtProcessUnlock)(void) = NULL;
+void (*_XtInitAppLock)(XtAppContext) = NULL;
+#endif
+
+static String XtNnoPerDisplay = "noPerDisplay";
+
+ProcessContext _XtGetProcessContext(void)
+{
+    static ProcessContextRec processContextRec = {
+	(XtAppContext)NULL,
+	(XtAppContext)NULL,
+	(ConverterTable)NULL,
+	{(XtLanguageProc)NULL, (XtPointer)NULL}
+    };
+
+    return &processContextRec;
+}
+
+
+XtAppContext _XtDefaultAppContext(void)
+{
+    ProcessContext process = _XtGetProcessContext();
+    XtAppContext app;
+
+    LOCK_PROCESS;
+    if (process->defaultAppContext == NULL) {
+	process->defaultAppContext = XtCreateApplicationContext();
+    }
+    app = process->defaultAppContext;
+    UNLOCK_PROCESS;
+    return app;
+}
+
+static void AddToAppContext(
+	Display *d,
+	XtAppContext app)
+{
+#define DISPLAYS_TO_ADD 4
+
+	if (app->count >= app->max) {
+	    app->max += DISPLAYS_TO_ADD;
+	    app->list = (Display **) XtRealloc((char *)app->list,
+		    (unsigned) app->max * sizeof(Display *));
+	}
+
+	app->list[app->count++] = d;
+	app->rebuild_fdlist = TRUE;
+#ifndef USE_POLL
+	if (ConnectionNumber(d) + 1 > app->fds.nfds) {
+	    app->fds.nfds = ConnectionNumber(d) + 1;
+	}
+#else
+	app->fds.nfds++;
+#endif
+#undef DISPLAYS_TO_ADD
+}
+
+static void XtDeleteFromAppContext(
+	Display *d,
+	register XtAppContext app)
+{
+	register int i;
+
+	for (i = 0; i < app->count; i++) if (app->list[i] == d) break;
+
+	if (i < app->count) {
+	    if (i <= app->last && app->last > 0) app->last--;
+	    for (i++; i < app->count; i++) app->list[i-1] = app->list[i];
+	    app->count--;
+	}
+	app->rebuild_fdlist = TRUE;
+#ifndef USE_POLL
+	if ((ConnectionNumber(d) + 1) == app->fds.nfds)
+	    app->fds.nfds--;
+	else			/* Unnecessary, just to be fool-proof */
+	    FD_CLR(ConnectionNumber(d), &app->fds.rmask);
+#else
+	app->fds.nfds--;
+#endif
+}
+
+static XtPerDisplay NewPerDisplay(
+	Display *dpy)
+{
+	PerDisplayTablePtr pd;
+
+	pd = XtNew(PerDisplayTable);
+	LOCK_PROCESS;
+	pd->dpy = dpy;
+	pd->next = _XtperDisplayList;
+	_XtperDisplayList = pd;
+	UNLOCK_PROCESS;
+	return &(pd->perDpy);
+}
+
+static XtPerDisplay InitPerDisplay(
+    Display *dpy,
+    XtAppContext app,
+    _Xconst char * name,
+    _Xconst char * classname)
+{
+    XtPerDisplay pd;
+
+    AddToAppContext(dpy, app);
+
+    pd = NewPerDisplay(dpy);
+    _XtHeapInit(&pd->heap);
+    pd->destroy_callbacks = NULL;
+    pd->region = XCreateRegion();
+    pd->case_cvt = NULL;
+    pd->defaultKeycodeTranslator = XtTranslateKey;
+    pd->keysyms_serial = 0;
+    pd->keysyms = NULL;
+    XDisplayKeycodes(dpy, &pd->min_keycode, &pd->max_keycode);
+    pd->modKeysyms = NULL;
+    pd->modsToKeysyms = NULL;
+    pd->appContext = app;
+    pd->name = XrmStringToName(name);
+    pd->class = XrmStringToClass(classname);
+    pd->being_destroyed = False;
+    pd->GClist = NULL;
+    pd->pixmap_tab = NULL;
+    pd->language = NULL;
+    pd->rv = False;
+    pd->last_event.xany.serial = 0;
+    pd->last_timestamp = 0;
+    _XtAllocTMContext(pd);
+    pd->mapping_callbacks = NULL;
+
+    pd->pdi.grabList = NULL;
+    pd->pdi.trace = NULL;
+    pd->pdi.traceDepth = 0;
+    pd->pdi.traceMax = 0;
+    pd->pdi.focusWidget = NULL;
+    pd->pdi.activatingKey = 0;
+    pd->pdi.keyboard.grabType = XtNoServerGrab;
+    pd->pdi.pointer.grabType  = XtNoServerGrab;
+    _XtAllocWWTable(pd);
+    pd->per_screen_db = (XrmDatabase *)__XtCalloc(ScreenCount(dpy),
+						sizeof(XrmDatabase));
+    pd->cmd_db = (XrmDatabase)NULL;
+    pd->server_db = (XrmDatabase)NULL;
+    pd->dispatcher_list = NULL;
+    pd->ext_select_list = NULL;
+    pd->ext_select_count = 0;
+    pd->hook_object = NULL;
+#if 0
+    pd->hook_object = _XtCreate("hooks", "Hooks", hookObjectClass,
+	(Widget)NULL, (Screen*)DefaultScreenOfDisplay(dpy),
+	(ArgList)NULL, 0, (XtTypedArgList)NULL, 0,
+	(ConstraintWidgetClass)NULL);
+#endif
+
+#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
+    pd->rcm_init = XInternAtom (dpy, RCM_INIT, 0);
+    pd->rcm_data = XInternAtom (dpy, RCM_DATA, 0);
+#endif
+
+    return pd;
+}
+
+Display *XtOpenDisplay(
+	XtAppContext app,
+	_Xconst char* displayName,
+	_Xconst char* applName,
+	_Xconst char* className,
+	XrmOptionDescRec *urlist,
+	Cardinal num_urs,
+	int *argc,
+	String *argv)
+{
+	Display *d;
+	XrmDatabase db = NULL;
+	XtPerDisplay pd;
+	String language = NULL;
+
+	LOCK_APP(app);
+	LOCK_PROCESS;
+	/* parse the command line for name, display, and/or language */
+	db = _XtPreparseCommandLine(urlist, num_urs, *argc, argv,
+				(String *)&applName,
+				(String *)(displayName ? NULL : &displayName),
+				(app->process->globalLangProcRec.proc ?
+				&language : NULL));
+	UNLOCK_PROCESS;
+	d = XOpenDisplay(displayName);
+
+	if (! applName && !(applName = getenv("RESOURCE_NAME"))) {
+	    if (*argc > 0 && argv[0] && *argv[0]) {
+#ifdef WIN32
+		char *ptr = strrchr(argv[0], '\\');
+#else
+		char *ptr = strrchr(argv[0], '/');
+#endif
+#ifdef __UNIXOS2__
+		char *dot_ptr,*ptr2;
+		ptr2 = strrchr(argv[0],'\\');
+		if (ptr2 > ptr) ptr = ptr2;
+		dot_ptr = strrchr(argv[0],'.');
+		if (dot_ptr && (dot_ptr > ptr)) *dot_ptr='\0';
+#endif  /* This will remove the .exe suffix under OS/2 */
+
+		if (ptr) applName = ++ptr;
+		else applName = argv[0];
+	    } else
+		applName = "main";
+	}
+
+	if (d) {
+	    pd = InitPerDisplay(d, app, applName, className);
+	    pd->language = language;
+	    _XtDisplayInitialize(d, pd, applName, urlist, num_urs, argc, argv);
+	} else {
+	    int len;
+	    displayName = XDisplayName(displayName);
+	    len = strlen (displayName);
+	    app->display_name_tried = (String) __XtMalloc (len + 1);
+	    strncpy ((char*) app->display_name_tried, displayName, len + 1);
+	    app->display_name_tried[len] = '\0';
+	}
+	if (db) XrmDestroyDatabase(db);
+	UNLOCK_APP(app);
+	return d;
+}
+
+Display *
+_XtAppInit(
+	XtAppContext * app_context_return,
+	String application_class,
+	XrmOptionDescRec *options,
+	Cardinal num_options,
+	int *argc_in_out,
+	String **argv_in_out,
+	String * fallback_resources)
+{
+    String *saved_argv;
+    int i;
+    Display *dpy;
+
+/*
+ * Save away argv and argc so we can set the properties later
+ */
+
+    saved_argv = (String *)
+	__XtMalloc( (Cardinal)((*argc_in_out + 1) * sizeof(String)) );
+
+    for (i = 0 ; i < *argc_in_out ; i++) saved_argv[i] = (*argv_in_out)[i];
+    saved_argv[i] = NULL;	/* NULL terminate that sucker. */
+
+
+    *app_context_return = XtCreateApplicationContext();
+
+    LOCK_APP((*app_context_return));
+    if (fallback_resources) /* save a procedure call */
+	XtAppSetFallbackResources(*app_context_return, fallback_resources);
+
+    dpy = XtOpenDisplay(*app_context_return, (String) NULL, NULL,
+			application_class,
+			options, num_options, argc_in_out, *argv_in_out);
+
+    if (!dpy) {
+	String param = (*app_context_return)->display_name_tried;
+	Cardinal param_count = 1;
+	XtErrorMsg("invalidDisplay","xtInitialize",XtCXtToolkitError,
+                   "Can't open display: %s", &param, &param_count);
+	XtFree((char *) (*app_context_return)->display_name_tried);
+    }
+    *argv_in_out = saved_argv;
+    UNLOCK_APP((*app_context_return));
+    return dpy;
+}
+
+void
+XtDisplayInitialize(
+	XtAppContext app,
+	Display *dpy,
+	_Xconst char* name,
+	_Xconst char* classname,
+	XrmOptionDescRec *urlist,
+	Cardinal num_urs,
+	int *argc,
+	String *argv
+	)
+{
+    XtPerDisplay pd;
+    XrmDatabase db = NULL;
+
+    LOCK_APP(app);
+    pd = InitPerDisplay(dpy, app, name, classname);
+    LOCK_PROCESS;
+    if (app->process->globalLangProcRec.proc)
+	/* pre-parse the command line for the language resource */
+	db = _XtPreparseCommandLine(urlist, num_urs, *argc, argv, NULL, NULL,
+				    &pd->language);
+    UNLOCK_PROCESS;
+    _XtDisplayInitialize(dpy, pd, name, urlist, num_urs, argc, argv);
+    if (db) XrmDestroyDatabase(db);
+    UNLOCK_APP(app);
+}
+
+XtAppContext XtCreateApplicationContext(void)
+{
+	XtAppContext app = XtNew(XtAppStruct);
+#ifdef XTHREADS
+	app->lock_info = NULL;
+	app->lock = NULL;
+	app->unlock = NULL;
+	app->yield_lock = NULL;
+	app->restore_lock = NULL;
+	app->free_lock = NULL;
+#endif
+	INIT_APP_LOCK(app);
+	LOCK_APP(app);
+	LOCK_PROCESS;
+	app->process = _XtGetProcessContext();
+	app->next = app->process->appContextList;
+	app->process->appContextList = app;
+	app->langProcRec.proc = app->process->globalLangProcRec.proc;
+	app->langProcRec.closure = app->process->globalLangProcRec.closure;
+	app->destroy_callbacks = NULL;
+	app->list = NULL;
+	app->count = app->max = app->last = 0;
+	app->timerQueue = NULL;
+	app->workQueue = NULL;
+	app->signalQueue = NULL;
+	app->input_list = NULL;
+	app->outstandingQueue = NULL;
+	app->errorDB = NULL;
+	_XtSetDefaultErrorHandlers(&app->errorMsgHandler,
+		&app->warningMsgHandler, &app->errorHandler,
+		&app->warningHandler);
+	app->action_table = NULL;
+	_XtSetDefaultSelectionTimeout(&app->selectionTimeout);
+	_XtSetDefaultConverterTable(&app->converterTable);
+	app->sync = app->being_destroyed = app->error_inited = FALSE;
+	app->in_phase2_destroy = NULL;
+#ifndef USE_POLL
+	FD_ZERO(&app->fds.rmask);
+	FD_ZERO(&app->fds.wmask);
+	FD_ZERO(&app->fds.emask);
+#endif
+	app->fds.nfds = 0;
+	app->input_count = app->input_max = 0;
+	_XtHeapInit(&app->heap);
+	app->fallback_resources = NULL;
+	_XtPopupInitialize(app);
+	app->action_hook_list = NULL;
+	app->block_hook_list = NULL;
+	app->destroy_list_size = app->destroy_count = app->dispatch_level = 0;
+	app->destroy_list = NULL;
+#ifndef NO_IDENTIFY_WINDOWS
+	app->identify_windows = False;
+#endif
+	app->free_bindings = NULL;
+	app->display_name_tried = NULL;
+	app->dpy_destroy_count = 0;
+	app->dpy_destroy_list = NULL;
+	app->exit_flag = FALSE;
+	app->rebuild_fdlist = TRUE;
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+	return app;
+}
+
+void XtAppSetExitFlag (
+    XtAppContext app)
+{
+    LOCK_APP(app);
+    app->exit_flag = TRUE;
+    UNLOCK_APP(app);
+}
+
+Boolean XtAppGetExitFlag (
+    XtAppContext app)
+{
+    Boolean retval;
+    LOCK_APP(app);
+    retval = app->exit_flag;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+static void DestroyAppContext(XtAppContext app)
+{
+	XtAppContext* prev_app;
+
+	prev_app = &app->process->appContextList;
+	while (app->count-- > 0) XtCloseDisplay(app->list[app->count]);
+	if (app->list != NULL) XtFree((char *)app->list);
+	_XtFreeConverterTable(app->converterTable);
+	_XtCacheFlushTag(app, (XtPointer)&app->heap);
+	_XtFreeActions(app->action_table);
+	if (app->destroy_callbacks != NULL) {
+	    XtCallCallbackList((Widget) NULL,
+			       (XtCallbackList)app->destroy_callbacks,
+			       (XtPointer)app);
+	    _XtRemoveAllCallbacks(&app->destroy_callbacks);
+	}
+	while (app->timerQueue) XtRemoveTimeOut((XtIntervalId)app->timerQueue);
+	while (app->workQueue) XtRemoveWorkProc((XtWorkProcId)app->workQueue);
+	while (app->signalQueue) XtRemoveSignal((XtSignalId)app->signalQueue);
+	if (app->input_list) _XtRemoveAllInputs(app);
+	XtFree((char*)app->destroy_list);
+	_XtHeapFree(&app->heap);
+	while (*prev_app != app) prev_app = &(*prev_app)->next;
+	*prev_app = app->next;
+	if (app->process->defaultAppContext == app)
+	    app->process->defaultAppContext = NULL;
+	if (app->free_bindings) _XtDoFreeBindings (app);
+	FREE_APP_LOCK(app);
+	XtFree((char *)app);
+}
+
+static XtAppContext* appDestroyList = NULL;
+int _XtAppDestroyCount = 0;
+
+void XtDestroyApplicationContext(XtAppContext app)
+{
+	LOCK_APP(app);
+	if (app->being_destroyed) {
+	    UNLOCK_APP(app);
+	    return;
+	}
+
+	if (_XtSafeToDestroy(app)) {
+	    LOCK_PROCESS;
+	    DestroyAppContext(app);
+	    UNLOCK_PROCESS;
+	} else {
+	    app->being_destroyed = TRUE;
+	    LOCK_PROCESS;
+	    _XtAppDestroyCount++;
+	    appDestroyList =
+		    (XtAppContext *) XtRealloc((char *) appDestroyList,
+		    (unsigned) (_XtAppDestroyCount * sizeof(XtAppContext)));
+	    appDestroyList[_XtAppDestroyCount-1] = app;
+	    UNLOCK_PROCESS;
+	    UNLOCK_APP(app);
+	}
+}
+
+void _XtDestroyAppContexts(void)
+{
+	int i,ii;
+	XtAppContext apps[8];
+	XtAppContext* pApps;
+
+	pApps = XtStackAlloc (sizeof (XtAppContext) * _XtAppDestroyCount, apps);
+
+	for (i = ii = 0; i < _XtAppDestroyCount; i++) {
+	    if (_XtSafeToDestroy(appDestroyList[i]))
+		DestroyAppContext(appDestroyList[i]);
+	    else
+		pApps[ii++] = appDestroyList[i];
+	}
+	_XtAppDestroyCount = ii;
+	if (_XtAppDestroyCount == 0) {
+	    XtFree((char *) appDestroyList);
+	    appDestroyList = NULL;
+	} else {
+	    for (i = 0; i < ii; i++)
+		appDestroyList[i] = pApps[i];
+	}
+	XtStackFree ((XtPointer) pApps, apps);
+}
+
+XrmDatabase XtDatabase(Display *dpy)
+{
+    XrmDatabase retval;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    retval = XrmGetDatabase(dpy);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+PerDisplayTablePtr _XtperDisplayList = NULL;
+
+XtPerDisplay _XtSortPerDisplayList(Display *dpy)
+{
+	register PerDisplayTablePtr pd, opd = NULL;
+
+	LOCK_PROCESS;
+	for (pd = _XtperDisplayList;
+	     pd != NULL && pd->dpy != dpy;
+	     pd = pd->next) {
+	    opd = pd;
+	}
+
+	if (pd == NULL) {
+	    XtErrorMsg(XtNnoPerDisplay, "getPerDisplay", XtCXtToolkitError,
+		    "Couldn't find per display information",
+		    (String *) NULL, (Cardinal *)NULL);
+	}
+
+	if (pd != _XtperDisplayList) {	/* move it to the front */
+	    /* opd points to the previous one... */
+
+	    opd->next = pd->next;
+	    pd->next = _XtperDisplayList;
+	    _XtperDisplayList = pd;
+	}
+	UNLOCK_PROCESS;
+	return &(pd->perDpy);
+}
+
+XtAppContext XtDisplayToApplicationContext(Display *dpy)
+{
+	XtAppContext retval;
+
+	retval = _XtGetPerDisplay(dpy)->appContext;
+	return retval;
+}
+
+static void CloseDisplay(Display *dpy)
+{
+        register XtPerDisplay xtpd;
+	register PerDisplayTablePtr pd, opd = NULL;
+	XrmDatabase db;
+	int i;
+
+	XtDestroyWidget(XtHooksOfDisplay(dpy));
+
+	LOCK_PROCESS;
+	for (pd = _XtperDisplayList;
+	     pd != NULL && pd->dpy != dpy;
+	     pd = pd->next){
+	    opd = pd;
+	}
+
+	if (pd == NULL) {
+	    XtErrorMsg(XtNnoPerDisplay, "closeDisplay", XtCXtToolkitError,
+		    "Couldn't find per display information",
+		    (String *) NULL, (Cardinal *)NULL);
+	}
+
+	if (pd == _XtperDisplayList) _XtperDisplayList = pd->next;
+	else opd->next = pd->next;
+
+	xtpd = &(pd->perDpy);
+
+        if (xtpd != NULL) {
+	    if (xtpd->destroy_callbacks != NULL) {
+		XtCallCallbackList((Widget) NULL,
+				   (XtCallbackList)xtpd->destroy_callbacks,
+				   (XtPointer)xtpd);
+		_XtRemoveAllCallbacks(&xtpd->destroy_callbacks);
+	    }
+	    if (xtpd->mapping_callbacks != NULL)
+		_XtRemoveAllCallbacks(&xtpd->mapping_callbacks);
+	    XtDeleteFromAppContext(dpy, xtpd->appContext);
+	    if (xtpd->keysyms)
+		XFree((char *) xtpd->keysyms);
+            XtFree((char *) xtpd->modKeysyms);
+            XtFree((char *) xtpd->modsToKeysyms);
+            xtpd->keysyms_per_keycode = 0;
+            xtpd->being_destroyed = FALSE;
+            xtpd->keysyms = NULL;
+            xtpd->modKeysyms = NULL;
+            xtpd->modsToKeysyms = NULL;
+	    XDestroyRegion(xtpd->region);
+	    _XtCacheFlushTag(xtpd->appContext, (XtPointer)&xtpd->heap);
+	    _XtGClistFree(dpy, xtpd);
+	    XtFree((char*)xtpd->pdi.trace);
+	    _XtHeapFree(&xtpd->heap);
+	    _XtFreeWWTable(xtpd);
+	    xtpd->per_screen_db[DefaultScreen(dpy)] = (XrmDatabase)NULL;
+	    for (i = ScreenCount(dpy); --i >= 0; ) {
+		db = xtpd->per_screen_db[i];
+		if (db)
+		    XrmDestroyDatabase(db);
+	    }
+	    XtFree((char *)xtpd->per_screen_db);
+	    if ((db = XrmGetDatabase(dpy)))
+		XrmDestroyDatabase(db);
+	    if (xtpd->cmd_db)
+		XrmDestroyDatabase(xtpd->cmd_db);
+	    if (xtpd->server_db)
+		XrmDestroyDatabase(xtpd->server_db);
+	    XtFree(xtpd->language);
+	    if (xtpd->dispatcher_list != NULL)
+		XtFree((char *) xtpd->dispatcher_list);
+	    if (xtpd->ext_select_list != NULL)
+		XtFree((char *) xtpd->ext_select_list);
+        }
+	XtFree((char*)pd);
+	XrmSetDatabase(dpy, (XrmDatabase)NULL);
+	XCloseDisplay(dpy);
+	UNLOCK_PROCESS;
+}
+
+void XtCloseDisplay(Display *dpy)
+{
+	XtPerDisplay pd;
+	XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+	LOCK_APP(app);
+	pd = _XtGetPerDisplay(dpy);
+	if (pd->being_destroyed) {
+	    UNLOCK_APP(app);
+	    return;
+	}
+
+	if (_XtSafeToDestroy(app)) CloseDisplay(dpy);
+	else {
+	    pd->being_destroyed = TRUE;
+	    app->dpy_destroy_count++;
+	    app->dpy_destroy_list = (Display **)
+		XtRealloc((char *) app->dpy_destroy_list,
+		    (unsigned) (app->dpy_destroy_count * sizeof(Display *)));
+	    app->dpy_destroy_list[app->dpy_destroy_count-1] = dpy;
+	}
+	UNLOCK_APP(app);
+}
+
+void _XtCloseDisplays(XtAppContext app)
+{
+	int i;
+
+	LOCK_APP(app);
+	for (i = 0; i < app->dpy_destroy_count; i++) {
+	    CloseDisplay(app->dpy_destroy_list[i]);
+	}
+	app->dpy_destroy_count = 0;
+	XtFree((char *) app->dpy_destroy_list);
+	app->dpy_destroy_list = NULL;
+	UNLOCK_APP(app);
+}
+
+XtAppContext XtWidgetToApplicationContext(Widget w)
+{
+	XtAppContext retval;
+
+	retval = _XtGetPerDisplay(XtDisplayOfObject(w))->appContext;
+	return retval;
+}
+
+
+void XtGetApplicationNameAndClass(
+    Display *dpy,
+    String *name_return,
+    String *class_return)
+{
+    XtPerDisplay pd;
+
+    pd = _XtGetPerDisplay(dpy);
+    *name_return = XrmQuarkToString(pd->name);
+    *class_return = XrmQuarkToString(pd->class);
+}
+
+XtPerDisplay _XtGetPerDisplay (Display* display)
+{
+    XtPerDisplay retval;
+
+    LOCK_PROCESS;
+    retval = ((_XtperDisplayList != NULL &&
+	      _XtperDisplayList->dpy == display)
+	      ? &_XtperDisplayList->perDpy
+	      : _XtSortPerDisplayList(display));
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+XtPerDisplayInputRec* _XtGetPerDisplayInput(Display* display)
+{
+    XtPerDisplayInputRec* retval;
+    LOCK_PROCESS;
+    retval = ((_XtperDisplayList != NULL &&
+	      _XtperDisplayList->dpy == display)
+	      ? &_XtperDisplayList->perDpy.pdi
+	      : &_XtSortPerDisplayList(display)->pdi);
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+void XtGetDisplays(
+    XtAppContext app_context,
+    Display*** dpy_return,
+    Cardinal* num_dpy_return)
+{
+    int ii;
+    LOCK_APP(app_context);
+    *num_dpy_return = app_context->count;
+    *dpy_return = (Display**)__XtMalloc(app_context->count * sizeof(Display*));
+    for (ii = 0; ii < app_context->count; ii++)
+	(*dpy_return)[ii] = app_context->list[ii];
+    UNLOCK_APP(app_context);
+}
diff --git a/libXt/src/Error.c b/libXt/src/Error.c
new file mode 100644
index 000000000..b1badc970
--- /dev/null
+++ b/libXt/src/Error.c
@@ -0,0 +1,636 @@
+/* $Xorg: Error.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Error.c,v 3.13tsi Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+/* The error handlers in the application context aren't used since we can't
+   come up with a uniform way of using them.  If you can, define
+   GLOBALERRORS to be FALSE (or 0). */
+
+#ifndef GLOBALERRORS
+#define GLOBALERRORS 1
+#endif
+
+static void InitErrorHandling(XrmDatabase *);
+#if GLOBALERRORS
+static XrmDatabase errorDB = NULL;
+static Boolean error_inited = FALSE;
+void _XtDefaultErrorMsg(String, String, String, String, String*, Cardinal*);
+void _XtDefaultWarningMsg(String, String, String, String, String*, Cardinal*);
+void _XtDefaultError(String);
+void _XtDefaultWarning(String);
+static XtErrorMsgHandler errorMsgHandler = _XtDefaultErrorMsg;
+static XtErrorMsgHandler warningMsgHandler = _XtDefaultWarningMsg;
+static XtErrorHandler errorHandler = _XtDefaultError;
+static XtErrorHandler warningHandler = _XtDefaultWarning;
+#endif /* GLOBALERRORS */
+
+XrmDatabase *XtGetErrorDatabase(void)
+{
+    XrmDatabase* retval;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    retval = &errorDB;
+    UNLOCK_PROCESS;
+#else
+    retval = XtAppGetErrorDatabase(_XtDefaultAppContext());
+#endif /* GLOBALERRORS */
+    return retval;
+}
+
+XrmDatabase *XtAppGetErrorDatabase(
+	XtAppContext app)
+{
+    XrmDatabase* retval;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    retval = &errorDB;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    retval= &app->errorDB;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return retval;
+}
+
+void XtGetErrorDatabaseText(
+    register _Xconst char* name,
+    register _Xconst char* type,
+    register _Xconst char* class,
+    _Xconst char* defaultp,
+    String buffer,
+    int nbytes)
+{
+#if GLOBALERRORS
+    XtAppGetErrorDatabaseText(NULL,
+	    name,type,class,defaultp, buffer, nbytes, NULL);
+#else
+    XtAppGetErrorDatabaseText(_XtDefaultAppContext(),
+	    name,type,class,defaultp, buffer, nbytes, NULL);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppGetErrorDatabaseText(
+    XtAppContext app,
+    register _Xconst char* name,
+    register _Xconst char* type,
+    register _Xconst char* class,
+    _Xconst char* defaultp,
+    String buffer,
+    int nbytes,
+    XrmDatabase db)
+{
+    String str_class;
+    String type_str;
+    XrmValue result;
+    char *str_name = NULL;
+    char *temp = NULL;
+
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (error_inited == FALSE) {
+        InitErrorHandling (&errorDB);
+        error_inited = TRUE;
+    }
+#else
+    LOCK_APP(app);
+    if (app->error_inited == FALSE) {
+        InitErrorHandling (&app->errorDB);
+        app->error_inited = TRUE;
+    }
+#endif /* GLOBALERRORS */
+    if (!(str_name = ALLOCATE_LOCAL(strlen(name) + strlen(type) + 2)))
+	_XtAllocError(NULL);
+    (void) sprintf(str_name, "%s.%s", name, type);
+    /* XrmGetResource requires the name and class to be fully qualified
+     * and to have the same number of components. */
+    str_class = (char *)class;
+    if (! strchr(class, '.')) {
+	if (!(temp = ALLOCATE_LOCAL(2 * strlen(class) + 2)))
+	    _XtAllocError(NULL);
+	(void) sprintf(temp, "%s.%s", class, class);
+	str_class = temp;
+    }
+    if (db == NULL) {
+#if GLOBALERRORS
+	(void) XrmGetResource(errorDB, str_name, str_class, &type_str,
+			      &result);
+#else
+	(void) XrmGetResource(app->errorDB, str_name, str_class, &type_str,
+			      &result);
+#endif /* GLOBALERRORS */
+    } else (void) XrmGetResource(db, str_name, str_class, &type_str, &result);
+    if (result.addr) {
+        (void) strncpy (buffer, result.addr, nbytes);
+        if (result.size > (unsigned) nbytes) buffer[nbytes-1] = 0;
+    } else {
+	int len = strlen(defaultp);
+	if (len >= nbytes) len = nbytes-1;
+	(void) memmove(buffer, defaultp, len);
+	buffer[len] = '\0';
+    }
+    if (str_name)
+	DEALLOCATE_LOCAL(str_name);
+    if (temp)
+	DEALLOCATE_LOCAL(temp);
+#if GLOBALERRORS
+    UNLOCK_PROCESS;
+#else
+    UNLOCK_APP(app);
+#endif
+}
+
+static void InitErrorHandling (
+    XrmDatabase *db)
+{
+    XrmDatabase errordb;
+
+    errordb = XrmGetFileDatabase(ERRORDB);
+    XrmMergeDatabases(errordb, db);
+}
+
+static void DefaultMsg (
+    String name,
+    String type,
+    String class,
+    String defaultp,
+    String* params,
+    Cardinal* num_params,
+    Bool error,
+    void (*fn)(_Xconst _XtString))
+{
+#define BIGBUF 1024
+#ifdef notyet /* older versions don't, might want to wait until more do */
+#if defined(__linux__)  || defined(CSRG_BASED) /* everyone else needs to get with the program */
+#define USE_SNPRINTF
+#endif
+#endif
+    char buffer[BIGBUF];
+    char* message;
+    XtGetErrorDatabaseText(name,type,class,defaultp, buffer, BIGBUF);
+/*need better solution here, perhaps use lower level printf primitives? */
+    if (params == NULL || num_params == NULL || *num_params == 0)
+	(*fn)(buffer);
+#ifndef WIN32 /* and OS/2 */
+    else if ((getuid () != geteuid ()) || getuid() == 0) {
+	if ((error && errorHandler == _XtDefaultError) ||
+	    (!error && warningHandler == _XtDefaultWarning)) {
+	    /*
+	     * if it's just going to go to stderr anyway, then we'll
+	     * fprintf to stderr ourselves and skip the insecure sprintf.
+	     */
+	    Cardinal i = *num_params;
+	    String par[10];
+	    if (i > 10) i = 10;
+	    (void) memmove((char*)par, (char*)params, i * sizeof(String) );
+	    bzero( &par[i], (10-i) * sizeof(String) );
+	    (void) fprintf (stderr, "%s%s",
+			    error ? XTERROR_PREFIX : XTWARNING_PREFIX,
+			    error ? "Error: " : "Warning: ");
+	    (void) fprintf (stderr, buffer,
+			    par[0], par[1], par[2], par[3], par[4],
+			    par[5], par[6], par[7], par[8], par[9]);
+	    (void) fprintf (stderr, "%c", '\n');
+	    if (i != *num_params)
+		(*fn) ( "Some arguments in previous message were lost" );
+	    else if (error) exit (1);
+	} else {
+	    /*
+	     * can't tell what it might do, so we'll play it safe
+	     */
+	    XtWarning ("\
+This program is an suid-root program or is being run by the root user.\n\
+The full text of the error or warning message cannot be safely formatted\n\
+in this environment. You may get a more descriptive message by running the\n\
+program as a non-root user or by removing the suid bit on the executable.");
+	    (*fn)(buffer); /* if *fn is an ErrorHandler it should exit */
+	}
+    }
+#endif
+    else {
+	/*
+	 * If you have snprintf the worst thing that could happen is you'd
+	 * lose some information. Without snprintf you're probably going to
+	 * scramble your heap and perhaps SEGV -- sooner or later.
+	 * If it hurts when you go like this then don't go like this! :-)
+	 */
+	Cardinal i = *num_params;
+	String par[10];
+	if (i > 10) i = 10;
+	(void) memmove((char*)par, (char*)params, i * sizeof(String) );
+	bzero( &par[i], (10-i) * sizeof(String) );
+	if (i != *num_params)
+	    XtWarning( "Some arguments in following message were lost" );
+	/*
+	 * resist any temptation you might have to make `message' a
+	 * local buffer on the stack. Doing so is a security hole
+	 * in programs executing as root. Error and Warning
+	 * messages shouldn't be called frequently enough for this
+	 * to be a performance issue.
+	 */
+	if ((message = __XtMalloc (BIGBUF))) {
+#ifndef USE_SNPRINTF
+	    message[BIGBUF-1] = 0;
+	    (void) sprintf (message, buffer,
+#else
+	    (void) snprintf (message, BIGBUF, buffer,
+#endif
+			    par[0], par[1], par[2], par[3], par[4],
+			    par[5], par[6], par[7], par[8], par[9]);
+#ifndef USE_SNPRINTF
+	    if (message[BIGBUF-1] != '\0')
+		XtWarning ("Possible heap corruption in Xt{Error,Warning}MsgHandler");
+#endif
+	    (*fn)(message);
+	    XtFree(message);
+	} else {
+	    XtWarning ("Memory allocation failed, arguments in the following message were lost");
+	    (*fn)(buffer);
+	}
+    }
+}
+
+void _XtDefaultErrorMsg (
+    String name,
+    String type,
+    String class,
+    String defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+    DefaultMsg (name,type,class,defaultp,params,num_params,True,XtError);
+}
+
+void _XtDefaultWarningMsg (
+    String name,
+    String type,
+    String class,
+    String defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+    DefaultMsg (name,type,class,defaultp,params,num_params,False,XtWarning);
+}
+
+void XtErrorMsg(
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorMsgHandler)((String)name,(String)type,(String)class,
+		       (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    XtAppErrorMsg(_XtDefaultAppContext(),name,type,class,
+	    defaultp,params,num_params);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppErrorMsg(
+    XtAppContext app,
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorMsgHandler)((String)name,(String)type,(String)class,
+		       (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->errorMsgHandler)(name,type,class,defaultp,params,num_params);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtWarningMsg(
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningMsgHandler)((String)name,(String)type,(String)class,
+			 (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    XtAppWarningMsg(_XtDefaultAppContext(),name,type,class,
+	    defaultp,params,num_params);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppWarningMsg(
+    XtAppContext app,
+    _Xconst char* name,
+    _Xconst char* type,
+    _Xconst char* class,
+    _Xconst char* defaultp,
+    String* params,
+    Cardinal* num_params)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningMsgHandler)((String)name,(String)type,(String)class,
+			 (String)defaultp,params,num_params);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->warningMsgHandler)(name,type,class,defaultp,params,num_params);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtSetErrorMsgHandler(
+    XtErrorMsgHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) errorMsgHandler = handler;
+    else errorMsgHandler  = _XtDefaultErrorMsg;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetErrorMsgHandler(_XtDefaultAppContext(), handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorMsgHandler XtAppSetErrorMsgHandler(
+    XtAppContext app,
+    XtErrorMsgHandler handler)
+{
+    XtErrorMsgHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = errorMsgHandler;
+    if (handler != NULL) errorMsgHandler = handler;
+    else errorMsgHandler  = _XtDefaultErrorMsg;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->errorMsgHandler;
+    if (handler != NULL) app->errorMsgHandler = handler;
+    else app->errorMsgHandler  = _XtDefaultErrorMsg;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void XtSetWarningMsgHandler(
+    XtErrorMsgHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) warningMsgHandler  = handler;
+    else warningMsgHandler = _XtDefaultWarningMsg;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetWarningMsgHandler(_XtDefaultAppContext(),handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorMsgHandler XtAppSetWarningMsgHandler(
+    XtAppContext app,
+    XtErrorMsgHandler handler)
+{
+    XtErrorMsgHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = warningMsgHandler;
+    if (handler != NULL) warningMsgHandler  = handler;
+    else warningMsgHandler = _XtDefaultWarningMsg;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->warningMsgHandler;
+    if (handler != NULL) app->warningMsgHandler  = handler;
+    else app->warningMsgHandler = _XtDefaultWarningMsg;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void _XtDefaultError(String message)
+{
+    if (message && *message)
+	(void)fprintf(stderr, "%sError: %s\n", XTERROR_PREFIX, message);
+    exit(1);
+}
+
+void _XtDefaultWarning(String message)
+{
+    if (message && *message)
+       (void)fprintf(stderr, "%sWarning: %s\n", XTWARNING_PREFIX, message);
+    return;
+}
+
+void XtError(
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    XtAppError(_XtDefaultAppContext(),message);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppError(
+    XtAppContext app,
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*errorHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->errorHandler)(message);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtWarning(
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    XtAppWarning(_XtDefaultAppContext(),message);
+#endif /* GLOBALERRORS */
+}
+
+void XtAppWarning(
+    XtAppContext app,
+    _Xconst char* message)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    (*warningHandler)((String)message);
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    (*app->warningHandler)(message);
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+}
+
+void XtSetErrorHandler(XtErrorHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) errorHandler = handler;
+    else errorHandler  = _XtDefaultError;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetErrorHandler(_XtDefaultAppContext(),handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorHandler XtAppSetErrorHandler(
+    XtAppContext app,
+    XtErrorHandler handler)
+{
+    XtErrorHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = errorHandler;
+    if (handler != NULL) errorHandler = handler;
+    else errorHandler  = _XtDefaultError;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->errorHandler;
+    if (handler != NULL) app->errorHandler = handler;
+    else app->errorHandler  = _XtDefaultError;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void XtSetWarningHandler(XtErrorHandler handler)
+{
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    if (handler != NULL) warningHandler = handler;
+    else warningHandler = _XtDefaultWarning;
+    UNLOCK_PROCESS;
+#else
+    XtAppSetWarningHandler(_XtDefaultAppContext(),handler);
+#endif /* GLOBALERRORS */
+}
+
+XtErrorHandler XtAppSetWarningHandler(
+    XtAppContext app,
+    XtErrorHandler handler)
+{
+    XtErrorHandler old;
+#if GLOBALERRORS
+    LOCK_PROCESS;
+    old = warningHandler;
+    if (handler != NULL) warningHandler  = handler;
+    else warningHandler = _XtDefaultWarning;
+    UNLOCK_PROCESS;
+#else
+    LOCK_APP(app);
+    old = app->warningHandler;
+    if (handler != NULL) app->warningHandler  = handler;
+    else app->warningHandler = _XtDefaultWarning;
+    UNLOCK_APP(app);
+#endif /* GLOBALERRORS */
+    return old;
+}
+
+void _XtSetDefaultErrorHandlers(
+    XtErrorMsgHandler *errMsg,
+    XtErrorMsgHandler *warnMsg,
+    XtErrorHandler *err,
+    XtErrorHandler *warn)
+{
+#ifndef GLOBALERRORS
+    LOCK_PROCESS;
+    *errMsg = _XtDefaultErrorMsg;
+    *warnMsg = _XtDefaultWarningMsg;
+    *err = _XtDefaultError;
+    *warn = _XtDefaultWarning;
+    UNLOCK_PROCESS;
+#endif /* GLOBALERRORS */
+}
diff --git a/libXt/src/Event.c b/libXt/src/Event.c
new file mode 100644
index 000000000..1d564f970
--- /dev/null
+++ b/libXt/src/Event.c
@@ -0,0 +1,1731 @@
+/* $Xorg: Event.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Event.c,v 3.10 2001/12/14 19:56:11 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "Shell.h"
+#include "StringDefs.h"
+
+typedef struct _XtEventRecExt {
+    int type;
+    XtPointer select_data[1]; /* actual dimension is [mask] */
+} XtEventRecExt;
+
+#define EXT_TYPE(p) (((XtEventRecExt*) ((p)+1))->type)
+#define EXT_SELECT_DATA(p,n) (((XtEventRecExt*) ((p)+1))->select_data[n])
+
+#define NonMaskableMask ((EventMask)0x80000000L)
+
+/*
+ * These are definitions to make the code that handles exposure compresssion
+ * easier to read.
+ *
+ * COMP_EXPOSE      - The compression exposure field of "widget"
+ * COMP_EXPOSE_TYPE - The type of compression (lower 4 bits of COMP_EXPOSE.
+ * GRAPHICS_EXPOSE  - TRUE if the widget wants graphics expose events
+ *                    dispatched.
+ * NO_EXPOSE        - TRUE if the widget wants No expose events dispatched.
+ */
+
+#define COMP_EXPOSE   (widget->core.widget_class->core_class.compress_exposure)
+#define COMP_EXPOSE_TYPE (COMP_EXPOSE & 0x0f)
+#define GRAPHICS_EXPOSE  ((XtExposeGraphicsExpose & COMP_EXPOSE) || \
+			  (XtExposeGraphicsExposeMerged & COMP_EXPOSE))
+#define NO_EXPOSE        (XtExposeNoExpose & COMP_EXPOSE)
+
+EventMask XtBuildEventMask(
+    Widget widget)
+{
+    XtEventTable ev;
+    EventMask	mask = 0L;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    for (ev = widget->core.event_table; ev != NULL; ev = ev->next)
+	if (ev->select) {
+	    if (!ev->has_type_specifier)
+		mask |= ev->mask;
+	    else {
+		if (EXT_TYPE(ev) < LASTEvent) {
+		    Cardinal i;
+		    for (i = 0; i < ev->mask; i++)
+			if (EXT_SELECT_DATA(ev, i))
+			    mask |= *(EventMask*)EXT_SELECT_DATA(ev, i);
+		}
+	    }
+	}
+    LOCK_PROCESS;
+    if (widget->core.widget_class->core_class.expose != NULL)
+	mask |= ExposureMask;
+    if (widget->core.widget_class->core_class.visible_interest)
+	mask |= VisibilityChangeMask;
+    UNLOCK_PROCESS;
+    if (widget->core.tm.translations)
+	mask |= widget->core.tm.translations->eventMask;
+
+    mask =  mask & ~NonMaskableMask;
+    UNLOCK_APP(app);
+    return mask;
+}
+
+static void CallExtensionSelector(
+    Widget widget,
+    ExtSelectRec* rec,
+    Boolean forceCall)
+{
+    XtEventRec* p;
+    XtPointer* data;
+    int* types;
+    Cardinal i, count = 0;
+
+    for (p = widget->core.event_table; p != NULL; p = p->next)
+	if (p->has_type_specifier &&
+	    EXT_TYPE(p) >= rec->min && EXT_TYPE(p) <= rec->max)
+	    count += p->mask;
+
+    if (count == 0 && !forceCall) return;
+
+    data = (XtPointer *) ALLOCATE_LOCAL(count * sizeof (XtPointer));
+    types = (int *) ALLOCATE_LOCAL(count * sizeof (int));
+    count = 0;
+
+    for (p = widget->core.event_table; p != NULL; p = p->next)
+	if (p->has_type_specifier &&
+	    EXT_TYPE(p) >= rec->min && EXT_TYPE(p) <= rec->max)
+	    for (i =0; i < p->mask; i++) {
+		types[count] = EXT_TYPE(p);
+		data[count++] = EXT_SELECT_DATA(p, i);
+	    }
+
+    (*rec->proc)(widget, types, data, count, rec->client_data);
+    DEALLOCATE_LOCAL((char*) types);
+    DEALLOCATE_LOCAL((char*) data);
+}
+
+static void
+RemoveEventHandler(
+    Widget widget,
+    XtPointer select_data,
+    int type,
+    Boolean has_type_specifier,
+    Boolean other,
+    XtEventHandler proc,
+    XtPointer closure,
+    Boolean raw)
+{
+    XtEventRec *p, **pp;
+    EventMask eventMask, oldMask = XtBuildEventMask(widget);
+
+    if (raw) raw = 1;
+    pp = &widget->core.event_table;
+    while ((p = *pp) &&
+	   (p->proc != proc || p->closure != closure || p->select == raw ||
+	    has_type_specifier != p->has_type_specifier ||
+	    (has_type_specifier && EXT_TYPE(p) != type)))
+	pp = &p->next;
+    if (!p) return;
+
+    /* un-register it */
+    if (!has_type_specifier) {
+	eventMask = *(EventMask*)select_data;
+	eventMask &= ~NonMaskableMask;
+	if (other)
+	    eventMask |= NonMaskableMask;
+	p->mask &= ~eventMask;
+    } else {
+	Cardinal i;
+	/* p->mask specifies count of EXT_SELECT_DATA(p,i)
+	 * search through the list of selection data, if not found
+	 * dont remove this handler
+	 */
+	for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i);) i++;
+	if (i == p->mask) return;
+	if (p->mask == 1) p->mask = 0;
+	else {
+	    p->mask--;
+	    while (i < p->mask) {
+		EXT_SELECT_DATA(p,i) = EXT_SELECT_DATA(p, i+1);
+		i++;
+	    }
+	}
+    }
+
+    if (!p->mask) {        /* delete it entirely */
+        *pp = p->next;
+	XtFree((char *)p);
+    }
+
+    /* Reset select mask if realized and not raw. */
+    if ( !raw && XtIsRealized(widget) && !widget->core.being_destroyed) {
+	EventMask mask = XtBuildEventMask(widget);
+	Display* dpy = XtDisplay (widget);
+
+	if (oldMask != mask)
+	    XSelectInput(dpy, XtWindow(widget), mask);
+
+	if (has_type_specifier) {
+	    XtPerDisplay pd = _XtGetPerDisplay(dpy);
+	    int i;
+	    for (i = 0; i < pd->ext_select_count; i++) {
+		if (type >= pd->ext_select_list[i].min &&
+		    type <= pd->ext_select_list[i].max) {
+		    CallExtensionSelector(widget, pd->ext_select_list+i, TRUE);
+		    break;
+		}
+		if (type < pd->ext_select_list[i].min) break;
+	    }
+	}
+    }
+}
+
+/*	Function Name: AddEventHandler
+ *	Description: An Internal routine that does the actual work of
+ *                   adding the event handlers.
+ *	Arguments: widget - widget to register an event handler for.
+ *                 eventMask - events to mask for.
+ *                 other - pass non maskable events to this proceedure.
+ *                 proc - proceedure to register.
+ *                 closure - data to pass to the event hander.
+ *                 position - where to add this event handler.
+ *                 force_new_position - If the element is already in the
+ *                                      list, this will force it to the
+ *                                      beginning or end depending on position.
+ *                 raw - If FALSE call XSelectInput for events in mask.
+ *	Returns: none
+ */
+
+static void
+AddEventHandler(
+    Widget widget,
+    XtPointer select_data,
+    int type,
+    Boolean         has_type_specifier,
+    Boolean         other,
+    XtEventHandler  proc,
+    XtPointer	closure,
+    XtListPosition  position,
+    Boolean         force_new_position,
+    Boolean         raw)
+{
+    register XtEventRec *p, **pp;
+    EventMask oldMask = 0, eventMask = 0;
+
+    if (!has_type_specifier) {
+	eventMask = *(EventMask*)select_data & ~NonMaskableMask;
+	if (other) eventMask |= NonMaskableMask;
+	if (!eventMask) return;
+    } else if (!type) return;
+
+    if (XtIsRealized(widget) && !raw) oldMask = XtBuildEventMask(widget);
+
+    if (raw) raw = 1;
+    pp = &widget->core.event_table;
+    while ((p = *pp) &&
+	   (p->proc != proc || p->closure != closure || p->select == raw ||
+	    has_type_specifier != p->has_type_specifier ||
+	    (has_type_specifier && EXT_TYPE(p) != type)))
+	pp = &p->next;
+
+    if (!p) {		                /* New proc to add to list */
+	if (has_type_specifier) {
+	    p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec) +
+				       sizeof(XtEventRecExt));
+	    EXT_TYPE(p) = type;
+	    EXT_SELECT_DATA(p,0) = select_data;
+	    p->mask = 1;
+	    p->has_type_specifier = True;
+	} else {
+	    p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec));
+	    p->mask = eventMask;
+	    p->has_type_specifier = False;
+	}
+	p->proc = proc;
+	p->closure = closure;
+	p->select = ! raw;
+
+	if (position == XtListHead) {
+	    p->next = widget->core.event_table;
+	    widget->core.event_table = p;
+	    pp = &widget->core.event_table;
+	} else {
+	    *pp = p;
+	    p->next = NULL;
+	}
+    }
+    else {
+	if (force_new_position) {
+	    *pp = p->next;
+
+	    if (position == XtListHead) {
+		p->next = widget->core.event_table;
+		widget->core.event_table = p;
+	    } else {
+	       	/*
+		 * Find the last element in the list.
+		 */
+		while (*pp)
+		    pp = &(*pp)->next;
+		*pp = p;
+		p->next = NULL;
+	    }
+	}
+
+	if (!has_type_specifier)
+	    p->mask |= eventMask;
+	else {
+	    Cardinal i;
+	    /* p->mask specifies count of EXT_SELECT_DATA(p,i) */
+	    for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i); )
+		i++;
+	    if (i == p->mask) {
+		p = (XtEventRec*) XtRealloc((char*)p,
+					    sizeof(XtEventRec) +
+					    sizeof(XtEventRecExt) +
+					    p->mask * sizeof(XtPointer));
+		EXT_SELECT_DATA(p,i) = select_data;
+		p->mask++;
+		*pp = p;
+	    }
+	}
+    }
+
+    if (XtIsRealized(widget) && !raw) {
+	EventMask mask = XtBuildEventMask(widget);
+	Display* dpy = XtDisplay (widget);
+
+	if (oldMask != mask)
+	    XSelectInput(dpy, XtWindow(widget), mask);
+
+	if (has_type_specifier) {
+	    XtPerDisplay pd = _XtGetPerDisplay (dpy);
+	    int i;
+	    for (i = 0; i < pd->ext_select_count; i++) {
+		if (type >= pd->ext_select_list[i].min &&
+		    type <= pd->ext_select_list[i].max) {
+		    CallExtensionSelector(widget, pd->ext_select_list+i, FALSE);
+		    break;
+		}
+		if (type < pd->ext_select_list[i].min) break;
+	    }
+	}
+    }
+}
+
+void XtRemoveEventHandler(
+    Widget	    widget,
+    EventMask       eventMask,
+    _XtBoolean	    other,
+    XtEventHandler  proc,
+    XtPointer	    closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    RemoveEventHandler(widget, (XtPointer) &eventMask, 0, FALSE,
+		       other, proc, closure, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtAddEventHandler(
+    Widget	    widget,
+    EventMask       eventMask,
+    _XtBoolean      other,
+    XtEventHandler  proc,
+    XtPointer	    closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+		    proc, closure, XtListTail, FALSE, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtInsertEventHandler(
+    Widget	    widget,
+    EventMask       eventMask,
+    _XtBoolean      other,
+    XtEventHandler  proc,
+    XtPointer	    closure,
+    XtListPosition  position)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+		    proc, closure, position, TRUE, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtRemoveRawEventHandler(
+    Widget	    widget,
+    EventMask       eventMask,
+    _XtBoolean	    other,
+    XtEventHandler  proc,
+    XtPointer	    closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    RemoveEventHandler(widget, (XtPointer) &eventMask, 0, FALSE,
+		       other, proc, closure, TRUE);
+    UNLOCK_APP(app);
+}
+
+void XtInsertRawEventHandler(
+    Widget	    widget,
+    EventMask       eventMask,
+    _XtBoolean	    other,
+    XtEventHandler  proc,
+    XtPointer	    closure,
+    XtListPosition  position)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+		    proc, closure, position, TRUE, TRUE);
+    UNLOCK_APP(app);
+}
+
+void XtAddRawEventHandler(
+    Widget	    widget,
+    EventMask       eventMask,
+    _XtBoolean      other,
+    XtEventHandler  proc,
+    XtPointer	    closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, (XtPointer) &eventMask, 0, FALSE, other,
+		    proc, closure, XtListTail, FALSE, TRUE);
+    UNLOCK_APP(app);
+}
+
+void XtRemoveEventTypeHandler(
+    Widget	    widget,
+    int		    type,
+    XtPointer	    select_data,
+    XtEventHandler  proc,
+    XtPointer	    closure)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    RemoveEventHandler(widget, select_data, type, TRUE,
+		       FALSE, proc, closure, FALSE);
+    UNLOCK_APP(app);
+}
+
+void XtInsertEventTypeHandler(
+    Widget	    widget,
+    int		    type,
+    XtPointer	    select_data,
+    XtEventHandler  proc,
+    XtPointer	    closure,
+    XtListPosition  position)
+{
+    WIDGET_TO_APPCON(widget);
+    LOCK_APP(app);
+    AddEventHandler(widget, select_data, type, TRUE, FALSE,
+		    proc, closure, position, TRUE, FALSE);
+    UNLOCK_APP(app);
+}
+
+typedef struct _WWPair {
+    struct _WWPair *next;
+    Window window;
+    Widget widget;
+} *WWPair;
+
+typedef struct _WWTable {
+    unsigned int mask;		/* size of hash table - 1 */
+    unsigned int rehash;	/* mask - 2 */
+    unsigned int occupied;	/* number of occupied entries */
+    unsigned int fakes;		/* number occupied by WWfake */
+    Widget *entries;		/* the entries */
+    WWPair pairs;		/* bogus entries */
+} *WWTable;
+
+static const WidgetRec WWfake;	/* placeholder for deletions */
+
+#define WWHASH(tab,win) ((win) & tab->mask)
+#define WWREHASHVAL(tab,win) ((((win) % tab->rehash) + 2) | 1)
+#define WWREHASH(tab,idx,rehash) ((idx + rehash) & tab->mask)
+#define WWTABLE(display) (_XtGetPerDisplay(display)->WWtable)
+
+static void ExpandWWTable(WWTable);
+
+void XtRegisterDrawable(
+    Display* display,
+    Drawable drawable,
+    Widget widget)
+{
+    WWTable tab;
+    int idx, rehash;
+    Widget entry;
+    Window window = (Window) drawable;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    tab = WWTABLE(display);
+    if (window != XtWindow(widget)) {
+	WWPair pair;
+	pair = XtNew(struct _WWPair);
+	pair->next = tab->pairs;
+	pair->window = window;
+	pair->widget = widget;
+	tab->pairs = pair;
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+	return;
+    }
+    if ((tab->occupied + (tab->occupied >> 2)) > tab->mask)
+	ExpandWWTable(tab);
+
+    idx = WWHASH(tab, window);
+    if ((entry = tab->entries[idx]) && entry != &WWfake) {
+	rehash = WWREHASHVAL(tab, window);
+	do {
+	    idx = WWREHASH(tab, idx, rehash);
+	} while ((entry = tab->entries[idx]) && entry != &WWfake);
+    }
+    if (!entry)
+	tab->occupied++;
+    else if (entry == &WWfake)
+	tab->fakes--;
+    tab->entries[idx] = widget;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtUnregisterDrawable(
+    Display* display,
+    Drawable drawable)
+{
+    WWTable tab;
+    int idx, rehash;
+    Widget entry;
+    Window window = (Window) drawable;
+    Widget widget = XtWindowToWidget (display, window);
+    DPY_TO_APPCON(display);
+
+    if (widget == NULL) return;
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    tab = WWTABLE(display);
+    if (window != XtWindow(widget)) {
+	WWPair *prev, pair;
+
+	prev = &tab->pairs;
+	while ((pair = *prev) && pair->window != window)
+	    prev = &pair->next;
+	if (pair) {
+	    *prev = pair->next;
+	    XtFree((char *)pair);
+	}
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+	return;
+    }
+    idx = WWHASH(tab, window);
+    if ((entry = tab->entries[idx])) {
+	if (entry != widget) {
+	    rehash = WWREHASHVAL(tab, window);
+	    do {
+		idx = WWREHASH(tab, idx, rehash);
+		if (!(entry = tab->entries[idx])) {
+		    UNLOCK_PROCESS;
+		    UNLOCK_APP(app);
+		    return;
+		}
+	    } while (entry != widget);
+	}
+	tab->entries[idx] = (Widget)&WWfake;
+	tab->fakes++;
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+static void ExpandWWTable(
+    register WWTable tab)
+{
+    unsigned int oldmask;
+    register Widget *oldentries, *entries;
+    register Cardinal oldidx, newidx, rehash;
+    register Widget entry;
+
+    LOCK_PROCESS;
+    oldmask = tab->mask;
+    oldentries = tab->entries;
+    tab->occupied -= tab->fakes;
+    tab->fakes = 0;
+    if ((tab->occupied + (tab->occupied >> 2)) > tab->mask) {
+	tab->mask = (tab->mask << 1) + 1;
+	tab->rehash = tab->mask - 2;
+    }
+    entries = tab->entries = (Widget *) __XtCalloc(tab->mask+1, sizeof(Widget));
+    for (oldidx = 0; oldidx <= oldmask; oldidx++) {
+	if ((entry = oldentries[oldidx]) && entry != &WWfake) {
+	    newidx = WWHASH(tab, XtWindow(entry));
+	    if (entries[newidx]) {
+		rehash = WWREHASHVAL(tab, XtWindow(entry));
+		do {
+		    newidx = WWREHASH(tab, newidx, rehash);
+		} while (entries[newidx]);
+	    }
+	    entries[newidx] = entry;
+	}
+    }
+    XtFree((char *)oldentries);
+    UNLOCK_PROCESS;
+}
+
+Widget XtWindowToWidget(
+    register Display *display,
+    register Window window)
+{
+    register WWTable tab;
+    register int idx, rehash;
+    register Widget entry;
+    WWPair pair;
+    DPY_TO_APPCON(display);
+
+    if (!window) return NULL;
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    tab = WWTABLE(display);
+    idx = WWHASH(tab, window);
+    if ((entry = tab->entries[idx]) && XtWindow(entry) != window) {
+	rehash = WWREHASHVAL(tab, window);
+	do {
+	    idx = WWREHASH(tab, idx, rehash);
+	} while ((entry = tab->entries[idx]) && XtWindow(entry) != window);
+    }
+    if (entry) {
+    	UNLOCK_PROCESS;
+    	UNLOCK_APP(app);
+	return entry;
+    }
+    for (pair = tab->pairs; pair; pair = pair->next) {
+	if (pair->window == window) {
+	    entry = pair->widget;
+	    UNLOCK_PROCESS;
+    	    UNLOCK_APP(app);
+	    return entry;
+	}
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return NULL;
+}
+
+void _XtAllocWWTable(
+    XtPerDisplay pd)
+{
+    register WWTable tab;
+
+    tab = (WWTable) __XtMalloc(sizeof(struct _WWTable));
+    tab->mask = 0x7f;
+    tab->rehash = tab->mask - 2;
+    tab->entries = (Widget *) __XtCalloc(tab->mask+1, sizeof(Widget));
+    tab->occupied = 0;
+    tab->fakes = 0;
+    tab->pairs = NULL;
+    pd->WWtable = tab;
+}
+
+void _XtFreeWWTable(
+    register XtPerDisplay pd)
+{
+    register WWPair pair, next;
+
+    for (pair = pd->WWtable->pairs; pair; pair = next) {
+	next = pair->next;
+	XtFree((char *)pair);
+    }
+    XtFree((char *)pd->WWtable->entries);
+    XtFree((char *)pd->WWtable);
+}
+
+#define EHMAXSIZE 25 /* do not make whopping big */
+
+static Boolean CallEventHandlers(
+    Widget     widget,
+    XEvent    *event,
+    EventMask  mask)
+{
+    register XtEventRec *p;
+    XtEventHandler *proc;
+    XtPointer *closure;
+    XtEventHandler procs[EHMAXSIZE];
+    XtPointer closures[EHMAXSIZE];
+    Boolean cont_to_disp = True;
+    int i, numprocs;
+
+    /* Have to copy the procs into an array, because one of them might
+     * call XtRemoveEventHandler, which would break our linked list. */
+
+    numprocs = 0;
+    for (p=widget->core.event_table; p; p = p->next) {
+	if ((!p->has_type_specifier && (mask & p->mask)) ||
+	    (p->has_type_specifier && event->type == EXT_TYPE(p)))
+	    numprocs++;
+    }
+    if (numprocs > EHMAXSIZE) {
+	proc = (XtEventHandler *)__XtMalloc(numprocs * (sizeof(XtEventHandler) +
+						      sizeof(XtPointer)));
+	closure = (XtPointer *)(proc + numprocs);
+    } else {
+	proc = procs;
+	closure = closures;
+    }
+    numprocs = 0;
+    for (p=widget->core.event_table; p; p = p->next) {
+	if ((!p->has_type_specifier && (mask & p->mask)) ||
+	    (p->has_type_specifier && event->type == EXT_TYPE(p))) {
+	    proc[numprocs] = p->proc;
+	    closure[numprocs] = p->closure;
+	    numprocs++;
+	}
+    }
+/* FUNCTIONS CALLED THROUGH POINTER proc:
+		Selection.c:ReqCleanup,
+		"Shell.c":EventHandler,
+		PassivGrab.c:ActiveHandler,
+		PassivGrab.c:RealizeHandler,
+		Keyboard.c:QueryEventMask,
+		_XtHandleFocus,
+		Selection.c:HandleSelectionReplies,
+		Selection.c:HandleGetIncrement,
+		Selection.c:HandleIncremental,
+		Selection.c:HandlePropertyGone,
+		Selection.c:HandleSelectionEvents
+		*/
+    for (i = 0; i < numprocs && cont_to_disp; i++)
+	(*(proc[i]))(widget, closure[i], event, &cont_to_disp);
+    if (numprocs > EHMAXSIZE)
+	XtFree((char *)proc);
+    return cont_to_disp;
+}
+
+static void CompressExposures(XEvent *, Widget);
+
+#define KnownButtons (Button1MotionMask|Button2MotionMask|Button3MotionMask|\
+		      Button4MotionMask|Button5MotionMask)
+
+/* keep this SMALL to avoid blowing stack cache! */
+/* because some compilers allocate all local locals on procedure entry */
+#define EHSIZE 4
+
+Boolean XtDispatchEventToWidget(
+    Widget widget,
+    XEvent* event)
+{
+    register XtEventRec *p;
+    Boolean was_dispatched = False;
+    Boolean call_tm = False;
+    Boolean cont_to_disp;
+    EventMask mask;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+
+    mask = _XtConvertTypeToMask(event->type);
+    if (event->type == MotionNotify)
+	mask |= (event->xmotion.state & KnownButtons);
+
+    LOCK_PROCESS;
+    if ( (mask == ExposureMask) ||
+	 ((event->type == NoExpose) && NO_EXPOSE) ||
+	 ((event->type == GraphicsExpose) && GRAPHICS_EXPOSE) ) {
+
+	if (widget->core.widget_class->core_class.expose != NULL ) {
+
+	    /* We need to mask off the bits that could contain the information
+	     * about whether or not we desire Graphics and NoExpose events.  */
+
+	    if ( (COMP_EXPOSE_TYPE == XtExposeNoCompress) ||
+		 (event->type == NoExpose) )
+
+		(*widget->core.widget_class->core_class.expose)
+		    (widget, event, (Region)NULL);
+	    else {
+		CompressExposures(event, widget);
+	    }
+	    was_dispatched = True;
+	}
+    }
+
+    if ((mask == VisibilityChangeMask) &&
+        XtClass(widget)->core_class.visible_interest) {
+	    was_dispatched = True;
+	    /* our visibility just changed... */
+	    switch (((XVisibilityEvent *)event)->state) {
+		case VisibilityUnobscured:
+		    widget->core.visible = TRUE;
+		    break;
+
+		case VisibilityPartiallyObscured:
+		    /* what do we want to say here? */
+		    /* well... some of us is visible */
+		    widget->core.visible = TRUE;
+		    break;
+
+		case VisibilityFullyObscured:
+		    widget->core.visible = FALSE;
+		    /* do we want to mark our children obscured? */
+		    break;
+	    }
+	}
+    UNLOCK_PROCESS;
+
+    /* to maintain "copy" semantics we check TM now but call later */
+    if (widget->core.tm.translations &&
+	(mask & widget->core.tm.translations->eventMask))
+	call_tm = True;
+
+    cont_to_disp = True;
+    p=widget->core.event_table;
+    if (p) {
+	if (p->next) {
+	    XtEventHandler proc[EHSIZE];
+	    XtPointer closure[EHSIZE];
+	    int numprocs = 0;
+
+	    /* Have to copy the procs into an array, because one of them might
+	     * call XtRemoveEventHandler, which would break our linked list. */
+
+	    for (; p; p = p->next) {
+		if ((!p->has_type_specifier && (mask & p->mask)) ||
+		    (p->has_type_specifier && event->type == EXT_TYPE(p))) {
+		    if (numprocs >= EHSIZE)
+			break;
+		    proc[numprocs] = p->proc;
+		    closure[numprocs] = p->closure;
+		    numprocs++;
+		}
+	    }
+	    if (numprocs) {
+		if (p) {
+		    cont_to_disp = CallEventHandlers(widget, event, mask);
+		} else {
+		    int i;
+		    for (i = 0; i < numprocs && cont_to_disp; i++)
+			(*(proc[i]))(widget, closure[i], event, &cont_to_disp);
+/* FUNCTIONS CALLED THROUGH POINTER proc:
+		Selection.c:ReqCleanup,
+		"Shell.c":EventHandler,
+		PassivGrab.c:ActiveHandler,
+		PassivGrab.c:RealizeHandler,
+		Keyboard.c:QueryEventMask,
+		_XtHandleFocus,
+		Selection.c:HandleSelectionReplies,
+		Selection.c:HandleGetIncrement,
+		Selection.c:HandleIncremental,
+		Selection.c:HandlePropertyGone,
+		Selection.c:HandleSelectionEvents
+		*/
+		}
+		was_dispatched = True;
+	    }
+	} else if ((!p->has_type_specifier && (mask & p->mask)) ||
+		   (p->has_type_specifier && event->type == EXT_TYPE(p))) {
+	    (*p->proc)(widget, p->closure, event, &cont_to_disp);
+	    was_dispatched = True;
+	}
+    }
+    if (call_tm && cont_to_disp)
+	_XtTranslateEvent(widget, event);
+    UNLOCK_APP(app);
+    return (was_dispatched|call_tm);
+}
+
+/*
+ * This structure is passed into the check exposure proc.
+ */
+
+typedef struct _CheckExposeInfo {
+    int type1, type2;		/* Types of events to check for. */
+    Boolean maximal;		/* Ignore non-exposure events? */
+    Boolean non_matching;	/* Was there an event that did not
+				   match either type? */
+    Window window;		/* Window to match. */
+} CheckExposeInfo;
+
+#define GetCount(ev) (((XExposeEvent *)(ev))->count)
+
+static void SendExposureEvent(XEvent *, Widget, XtPerDisplay);
+static Bool CheckExposureEvent(Display *, XEvent *, char *);
+static void AddExposureToRectangularRegion(XEvent *, Region);
+
+/*	Function Name: CompressExposures
+ *	Description: Handles all exposure compression
+ *	Arguments: event - the xevent that is to be dispatched
+ *                 widget - the widget that this event occured in.
+ *	Returns: none.
+ *
+ *      NOTE: Event must be of type Expose or GraphicsExpose.
+ */
+
+static void
+CompressExposures(
+XEvent * event,
+Widget widget)
+{
+    CheckExposeInfo info;
+    int count;
+    Display* dpy = XtDisplay (widget);
+    XtPerDisplay pd = _XtGetPerDisplay(dpy);
+    XtEnum comp_expose;
+    XtEnum comp_expose_type;
+    Boolean no_region;
+
+    LOCK_PROCESS;
+    comp_expose = COMP_EXPOSE;
+    UNLOCK_PROCESS;
+    comp_expose_type = comp_expose & 0x0f;
+    no_region = ((comp_expose & XtExposeNoRegion) ? True : False);
+
+    if (no_region)
+	AddExposureToRectangularRegion(event, pd->region);
+    else
+	XtAddExposureToRegion(event, pd->region);
+
+    if ( GetCount(event) != 0 )
+ 	return;
+
+    if ((comp_expose_type == XtExposeCompressSeries) ||
+	(XEventsQueued(dpy, QueuedAfterReading) == 0)) {
+	SendExposureEvent(event, widget, pd);
+	return;
+    }
+
+    if (comp_expose & XtExposeGraphicsExposeMerged) {
+	info.type1 = Expose;
+	info.type2 = GraphicsExpose;
+    }
+    else {
+	info.type1 = event->type;
+	info.type2 = 0;
+    }
+    info.maximal = (comp_expose_type == XtExposeCompressMaximal);
+    info.non_matching = FALSE;
+    info.window = XtWindow(widget);
+
+/*
+ * We have to be very careful here not to hose down the processor
+ * when blocking until count gets to zero.
+ *
+ * First, check to see if there are any events in the queue for this
+ * widget, and of the correct type.
+ *
+ * Once we cannot find any more events, check to see that count is zero.
+ * If it is not then block until we get another exposure event.
+ *
+ * If we find no more events, and count on the last one we saw was zero we
+ * we can be sure that all events have been processed.
+ *
+ * Unfortunately, we wind up having to look at the entire queue
+ * event if we're not doing Maximal compression, due to the
+ * semantics of XCheckIfEvent (we can't abort without re-ordering
+ * the event queue as a side-effect).
+ */
+
+    count = 0;
+    while (TRUE) {
+	XEvent event_return;
+
+	if (XCheckIfEvent(dpy, &event_return,
+			  CheckExposureEvent, (char *) &info)) {
+
+	    count = GetCount(&event_return);
+ 	    if (no_region)
+		AddExposureToRectangularRegion(&event_return, pd->region);
+ 	    else
+		XtAddExposureToRegion(&event_return, pd->region);
+	}
+	else if (count != 0) {
+	    XIfEvent(dpy, &event_return,
+		     CheckExposureEvent, (char *) &info);
+	    count = GetCount(&event_return);
+ 	    if (no_region)
+		AddExposureToRectangularRegion(&event_return, pd->region);
+ 	    else
+		XtAddExposureToRegion(&event_return, pd->region);
+	}
+	else /* count == 0 && XCheckIfEvent Failed. */
+	    break;
+    }
+
+    SendExposureEvent(event, widget, pd);
+}
+
+void XtAddExposureToRegion(
+    XEvent   *event,
+    Region   region)
+{
+    XRectangle rect;
+    XExposeEvent *ev = (XExposeEvent *) event;
+    /* These Expose and GraphicsExpose fields are at identical offsets */
+
+    if (event->type == Expose || event->type == GraphicsExpose) {
+	rect.x = ev->x;
+	rect.y = ev->y;
+	rect.width = ev->width;
+	rect.height = ev->height;
+	XUnionRectWithRegion(&rect, region, region);
+    }
+}
+
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+static void AddExposureToRectangularRegion(
+     XEvent *event, /* when called internally, type is always appropriate */
+     Region  region)
+{
+    XRectangle rect;
+    XExposeEvent *ev = (XExposeEvent *) event;
+    /* These Expose and GraphicsExpose fields are at identical offsets */
+
+    rect.x = ev->x;
+    rect.y = ev->y;
+    rect.width = ev->width;
+    rect.height = ev->height;
+
+    if (XEmptyRegion(region)) {
+	XUnionRectWithRegion(&rect, region, region);
+    } else {
+	XRectangle merged, bbox;
+
+	XClipBox(region, &bbox);
+	merged.x = MIN(rect.x, bbox.x);
+	merged.y = MIN(rect.y, bbox.y);
+	merged.width = MAX(rect.x + rect.width,
+			   bbox.x + bbox.width) - merged.x;
+	merged.height = MAX(rect.y + rect.height,
+			    bbox.y + bbox.height) - merged.y;
+	XUnionRectWithRegion(&merged, region, region);
+    }
+}
+
+static Region nullRegion;
+/* READ-ONLY VARIABLES: nullRegion */
+
+void _XtEventInitialize(void)
+{
+#ifndef __lock_lint
+    nullRegion = XCreateRegion();
+#endif
+}
+
+/*	Function Name: SendExposureEvent
+ *	Description: Sets the x, y, width, and height of the event
+ *                   to be the clip box of Expose Region.
+ *	Arguments: event  - the X Event to mangle; Expose or GraphicsExpose.
+ *                 widget - the widget that this event occured in.
+ *                 pd     - the per display information for this widget.
+ *	Returns: none.
+ */
+
+static void
+SendExposureEvent(
+XEvent * event,
+Widget widget,
+XtPerDisplay pd)
+{
+    XtExposeProc expose;
+    XRectangle rect;
+    XtEnum comp_expose;
+    XExposeEvent *ev = (XExposeEvent *) event;
+
+    XClipBox(pd->region, &rect);
+    ev->x = rect.x;
+    ev->y = rect.y;
+    ev->width = rect.width;
+    ev->height = rect.height;
+
+    LOCK_PROCESS;
+    comp_expose = COMP_EXPOSE;
+    expose = widget->core.widget_class->core_class.expose;
+    UNLOCK_PROCESS;
+    if (comp_expose & XtExposeNoRegion)
+	(*expose)(widget, event, NULL);
+    else
+	(*expose)(widget, event, pd->region);
+    (void) XIntersectRegion(nullRegion, pd->region, pd->region);
+}
+
+/*	Function Name: CheckExposureEvent
+ *	Description: Checks the event queue for an expose event
+ *	Arguments: display - the display connection.
+ *                 event - the event to check.
+ *                 arg - a pointer to the exposure info structure.
+ *	Returns: TRUE if we found an event of the correct type
+ *               with the right window.
+ *
+ * NOTE: The only valid types (info.type1 and info.type2) are Expose
+ *       and GraphicsExpose.
+ */
+
+/* ARGSUSED */
+static Bool
+CheckExposureEvent(
+Display * disp,
+XEvent * event,
+char * arg)
+{
+    CheckExposeInfo * info = ((CheckExposeInfo *) arg);
+
+    if ( (info->type1 == event->type) || (info->type2 == event->type)) {
+	if (!info->maximal && info->non_matching) return FALSE;
+	if (event->type == GraphicsExpose)
+	    return(event->xgraphicsexpose.drawable == info->window);
+	return(event->xexpose.window == info->window);
+    }
+    info->non_matching = TRUE;
+    return(FALSE);
+}
+
+static EventMask const masks[] = {
+	0,			    /* Error, should never see  */
+	0,			    /* Reply, should never see  */
+	KeyPressMask,		    /* KeyPress			*/
+	KeyReleaseMask,		    /* KeyRelease		*/
+	ButtonPressMask,	    /* ButtonPress		*/
+	ButtonReleaseMask,	    /* ButtonRelease		*/
+	PointerMotionMask	    /* MotionNotify		*/
+		| ButtonMotionMask,
+	EnterWindowMask,	    /* EnterNotify		*/
+	LeaveWindowMask,	    /* LeaveNotify		*/
+	FocusChangeMask,	    /* FocusIn			*/
+	FocusChangeMask,	    /* FocusOut			*/
+	KeymapStateMask,	    /* KeymapNotify		*/
+	ExposureMask,		    /* Expose			*/
+	NonMaskableMask,	    /* GraphicsExpose, in GC    */
+	NonMaskableMask,	    /* NoExpose, in GC		*/
+	VisibilityChangeMask,       /* VisibilityNotify		*/
+	SubstructureNotifyMask,     /* CreateNotify		*/
+	StructureNotifyMask	    /* DestroyNotify		*/
+		| SubstructureNotifyMask,
+	StructureNotifyMask	    /* UnmapNotify		*/
+		| SubstructureNotifyMask,
+	StructureNotifyMask	    /* MapNotify		*/
+		| SubstructureNotifyMask,
+	SubstructureRedirectMask,   /* MapRequest		*/
+	StructureNotifyMask	    /* ReparentNotify		*/
+		| SubstructureNotifyMask,
+	StructureNotifyMask	    /* ConfigureNotify		*/
+		| SubstructureNotifyMask,
+	SubstructureRedirectMask,   /* ConfigureRequest		*/
+	StructureNotifyMask	    /* GravityNotify		*/
+		| SubstructureNotifyMask,
+	ResizeRedirectMask,	    /* ResizeRequest		*/
+	StructureNotifyMask	    /* CirculateNotify		*/
+		| SubstructureNotifyMask,
+	SubstructureRedirectMask,   /* CirculateRequest		*/
+	PropertyChangeMask,	    /* PropertyNotify		*/
+	NonMaskableMask,	    /* SelectionClear		*/
+	NonMaskableMask,	    /* SelectionRequest		*/
+	NonMaskableMask,	    /* SelectionNotify		*/
+	ColormapChangeMask,	    /* ColormapNotify		*/
+	NonMaskableMask,	    /* ClientMessage		*/
+	NonMaskableMask		    /* MappingNotify		*/
+};
+
+EventMask _XtConvertTypeToMask (
+    int		eventType)
+{
+    if ((Cardinal) eventType < XtNumber(masks))
+	return masks[eventType];
+    else
+	return NoEventMask;
+}
+
+Boolean _XtOnGrabList(
+    register Widget widget,
+    XtGrabRec  *grabList)
+{
+    register XtGrabRec* gl;
+    for (; widget != NULL; widget = (Widget)widget->core.parent) {
+	for (gl = grabList; gl != NULL; gl = gl->next) {
+	    if (gl->widget == widget) return TRUE;
+	    if (gl->exclusive) break;
+	}
+    }
+    return FALSE;
+}
+
+static Widget LookupSpringLoaded(
+    XtGrabList	grabList)
+{
+    XtGrabList	gl;
+
+    for (gl = grabList; gl != NULL; gl = gl->next) {
+	if (gl->spring_loaded) {
+	  if (XtIsSensitive(gl->widget))
+	    return gl->widget;
+	  else
+	    return NULL;
+	}
+	if (gl->exclusive) break;
+    }
+    return NULL;
+}
+
+static Boolean DispatchEvent(
+    XEvent* event,
+    Widget widget)
+{
+
+    if (event->type == EnterNotify &&
+	event->xcrossing.mode == NotifyNormal &&
+	widget->core.widget_class->core_class.compress_enterleave) {
+	if (XPending(event->xcrossing.display)) {
+	    XEvent nextEvent;
+	    XPeekEvent(event->xcrossing.display, &nextEvent);
+	    if (nextEvent.type == LeaveNotify &&
+		event->xcrossing.window == nextEvent.xcrossing.window &&
+		nextEvent.xcrossing.mode == NotifyNormal &&
+		((event->xcrossing.detail != NotifyInferior &&
+		 nextEvent.xcrossing.detail != NotifyInferior) ||
+		 (event->xcrossing.detail == NotifyInferior &&
+		 nextEvent.xcrossing.detail == NotifyInferior))) {
+		/* skip the enter/leave pair */
+		XNextEvent(event->xcrossing.display, &nextEvent);
+		return False;
+	    }
+	}
+    }
+
+    if (event->type == MotionNotify &&
+	    widget->core.widget_class->core_class.compress_motion) {
+	while (XPending(event->xmotion.display)) {
+	    XEvent nextEvent;
+	    XPeekEvent(event->xmotion.display, &nextEvent);
+	    if (nextEvent.type == MotionNotify &&
+		    event->xmotion.window == nextEvent.xmotion.window &&
+		    event->xmotion.subwindow == nextEvent.xmotion.subwindow) {
+		/* replace the current event with the next one */
+		XNextEvent(event->xmotion.display, event);
+	    } else break;
+	}
+    }
+
+    return XtDispatchEventToWidget(widget, event);
+}
+
+typedef enum _GrabType {pass, ignore, remap} GrabType;
+
+#if !defined(AIXV3) || !defined(AIXSHLIB)
+static /* AIX shared libraries are broken */
+#endif
+Boolean _XtDefaultDispatcher(
+    XEvent  *event)
+{
+    register    Widget widget;
+    GrabType    grabType;
+    XtPerDisplayInput pdi;
+    XtGrabList  grabList;
+    Boolean	was_dispatched = False;
+    DPY_TO_APPCON(event->xany.display);
+
+    /* the default dispatcher discards all extension events */
+    if (event->type >= LASTEvent)
+	return False;
+
+    LOCK_APP(app);
+
+    switch (event->type) {
+      case KeyPress:
+      case KeyRelease:
+      case ButtonPress:
+      case ButtonRelease:	grabType = remap;	break;
+      case MotionNotify:
+      case EnterNotify:		grabType = ignore;	break;
+      default:			grabType = pass;	break;
+    }
+
+    widget = XtWindowToWidget (event->xany.display, event->xany.window);
+    pdi = _XtGetPerDisplayInput(event->xany.display);
+    grabList = *_XtGetGrabList(pdi);
+
+    if (widget == NULL) {
+	if (grabType == remap
+	    && (widget = LookupSpringLoaded(grabList)) != NULL) {
+	    /* event occurred in a non-widget window, but we've promised also
+	       to dispatch it to the nearest accessible spring_loaded widget */
+	    was_dispatched = (XFilterEvent(event, XtWindow(widget))
+			      || XtDispatchEventToWidget(widget, event));
+	}
+	else was_dispatched = XFilterEvent(event, None);
+    }
+    else if (grabType == pass) {
+	if (event->type == LeaveNotify ||
+	    event->type == FocusIn ||
+	    event->type == FocusOut) {
+		if (XtIsSensitive (widget))
+		    was_dispatched = (XFilterEvent(event, XtWindow(widget)) ||
+				      XtDispatchEventToWidget(widget, event));
+	    } else was_dispatched = (XFilterEvent(event, XtWindow(widget)) ||
+				     XtDispatchEventToWidget(widget, event));
+    }
+    else if (grabType == ignore) {
+	if ((grabList == NULL || _XtOnGrabList(widget, grabList))
+	    && XtIsSensitive(widget)) {
+	    was_dispatched = (XFilterEvent(event, XtWindow(widget))
+			      || DispatchEvent(event, widget));
+	}
+    }
+    else if (grabType == remap) {
+	EventMask	mask = _XtConvertTypeToMask(event->type);
+	Widget		dspWidget;
+	Boolean		was_filtered = False;
+
+	dspWidget = _XtFindRemapWidget(event, widget, mask, pdi);
+
+	if ((grabList == NULL ||_XtOnGrabList(dspWidget, grabList))
+	    && XtIsSensitive(dspWidget)) {
+	    if ((was_filtered = XFilterEvent(event, XtWindow(dspWidget)))) {
+		/* If this event activated a device grab, release it. */
+		_XtUngrabBadGrabs(event, widget, mask, pdi);
+		was_dispatched = True;
+	    } else
+		was_dispatched = XtDispatchEventToWidget(dspWidget, event);
+	}
+	else _XtUngrabBadGrabs(event, widget, mask, pdi);
+
+	if (!was_filtered) {
+	    /* Also dispatch to nearest accessible spring_loaded. */
+	    /* Fetch this afterward to reflect modal list changes */
+	    grabList = *_XtGetGrabList(pdi);
+	    widget = LookupSpringLoaded(grabList);
+	    if (widget != NULL && widget != dspWidget) {
+		was_dispatched = (XFilterEvent(event, XtWindow(widget))
+				  || XtDispatchEventToWidget(widget, event)
+				  || was_dispatched);
+	    }
+	}
+    }
+    UNLOCK_APP(app);
+    return was_dispatched;
+}
+
+Boolean XtDispatchEvent (
+    XEvent  *event)
+{
+    Boolean was_dispatched, safe;
+    int dispatch_level;
+    int starting_count;
+    XtPerDisplay pd;
+    Time	time = 0;
+    XtEventDispatchProc dispatch = _XtDefaultDispatcher;
+    XtAppContext app = XtDisplayToApplicationContext(event->xany.display);
+
+    LOCK_APP(app);
+    dispatch_level = ++app->dispatch_level;
+    starting_count = app->destroy_count;
+
+    switch (event->type) {
+      case KeyPress:
+      case KeyRelease:	   time = event->xkey.time;		break;
+      case ButtonPress:
+      case ButtonRelease:  time = event->xbutton.time;		break;
+      case MotionNotify:   time = event->xmotion.time;		break;
+      case EnterNotify:
+      case LeaveNotify:	   time = event->xcrossing.time;	break;
+      case PropertyNotify: time = event->xproperty.time;	break;
+      case SelectionClear: time = event->xselectionclear.time;	break;
+
+      case MappingNotify:  _XtRefreshMapping(event, True);	break;
+    }
+    pd = _XtGetPerDisplay(event->xany.display);
+    if (time) pd->last_timestamp = time;
+    pd->last_event = *event;
+
+    if (pd->dispatcher_list) {
+	dispatch = pd->dispatcher_list[event->type];
+	if (dispatch == NULL) dispatch = _XtDefaultDispatcher;
+    }
+    was_dispatched = (*dispatch)(event);
+
+    /*
+     * To make recursive XtDispatchEvent work, we need to do phase 2 destroys
+     * only on those widgets destroyed by this particular dispatch.
+     *
+     */
+
+    if (app->destroy_count > starting_count)
+	_XtDoPhase2Destroy(app, dispatch_level);
+
+    app->dispatch_level = dispatch_level - 1;
+
+    if ((safe = _XtSafeToDestroy(app))) {
+	if (app->dpy_destroy_count != 0) _XtCloseDisplays(app);
+	if (app->free_bindings) _XtDoFreeBindings(app);
+    }
+    UNLOCK_APP(app);
+    LOCK_PROCESS;
+    if (_XtAppDestroyCount != 0 && safe) _XtDestroyAppContexts();
+    UNLOCK_PROCESS;
+    return was_dispatched;
+}
+
+/* ARGSUSED */
+static void GrabDestroyCallback(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    /* Remove widget from grab list if it destroyed */
+    XtRemoveGrab(widget);
+}
+
+static XtGrabRec *NewGrabRec(
+    Widget  widget,
+    Boolean exclusive,
+    Boolean spring_loaded)
+{
+    register XtGrabList    gl;
+
+    gl		      = XtNew(XtGrabRec);
+    gl->next	      = NULL;
+    gl->widget        = widget;
+    gl->exclusive     = exclusive;
+    gl->spring_loaded = spring_loaded;
+
+    return gl;
+}
+
+void XtAddGrab(
+    Widget  widget,
+    _XtBoolean exclusive,
+    _XtBoolean spring_loaded)
+{
+    register    XtGrabList gl;
+    XtGrabList	*grabListPtr;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    grabListPtr = _XtGetGrabList(_XtGetPerDisplayInput(XtDisplay(widget)));
+
+    if (spring_loaded && !exclusive) {
+	XtAppWarningMsg(app,
+		"grabError", "xtAddGrab", XtCXtToolkitError,
+		"XtAddGrab requires exclusive grab if spring_loaded is TRUE",
+		(String *) NULL, (Cardinal *) NULL);
+	exclusive = TRUE;
+    }
+
+    gl = NewGrabRec(widget, exclusive, spring_loaded);
+    gl->next = *grabListPtr;
+    *grabListPtr = gl;
+
+    XtAddCallback (widget, XtNdestroyCallback,
+	    GrabDestroyCallback, (XtPointer) NULL);
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtRemoveGrab(
+    Widget  widget)
+{
+    register XtGrabList gl;
+    register Boolean done;
+    XtGrabList	*grabListPtr;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+
+    grabListPtr = _XtGetGrabList(_XtGetPerDisplayInput(XtDisplay(widget)));
+
+    for (gl = *grabListPtr; gl != NULL; gl = gl->next) {
+	if (gl->widget == widget) break;
+    }
+
+    if (gl == NULL) {
+	    XtAppWarningMsg(app,
+		       "grabError","xtRemoveGrab",XtCXtToolkitError,
+		       "XtRemoveGrab asked to remove a widget not on the list",
+		       (String *)NULL, (Cardinal *)NULL);
+	    UNLOCK_PROCESS;
+    	    UNLOCK_APP(app);
+	    return;
+	}
+
+    do {
+	gl = *grabListPtr;
+	done = (gl->widget == widget);
+	*grabListPtr = gl->next;
+	XtRemoveCallback(gl->widget, XtNdestroyCallback,
+		GrabDestroyCallback, (XtPointer)NULL);
+	XtFree((char *)gl);
+    } while (! done);
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return;
+}
+
+void XtMainLoop(void)
+{
+	XtAppMainLoop(_XtDefaultAppContext());
+}
+
+void XtAppMainLoop(
+	XtAppContext app)
+{
+    XEvent event;
+
+    LOCK_APP(app);
+    do {
+    	XtAppNextEvent(app, &event);
+#ifdef XTHREADS
+	/* assert(app == XtDisplayToApplicationContext(event.xany.display)); */
+#endif
+	XtDispatchEvent(&event);
+    } while(app->exit_flag == FALSE);
+    UNLOCK_APP(app);
+}
+
+void _XtFreeEventTable(
+    XtEventTable *event_table)
+{
+    register XtEventTable event;
+
+    event = *event_table;
+    while (event != NULL) {
+	register XtEventTable next = event->next;
+	XtFree((char *) event);
+	event = next;
+    }
+}
+
+Time XtLastTimestampProcessed(
+    Display *dpy)
+{
+    Time time;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    time =  _XtGetPerDisplay(dpy)->last_timestamp;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return(time);
+}
+
+XEvent* XtLastEventProcessed(
+    Display* dpy)
+{
+    XEvent* le = NULL;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    le = &_XtGetPerDisplay(dpy)->last_event;
+    if (!le->xany.serial)
+	le =  NULL;
+    UNLOCK_APP(app);
+    return le;
+}
+
+void _XtSendFocusEvent(
+    Widget child,
+    int type)
+{
+    child = XtIsWidget(child) ? child : _XtWindowedAncestor(child);
+    if (XtIsSensitive(child) && !child->core.being_destroyed
+	&& XtIsRealized(child)
+	&& (XtBuildEventMask(child) & FocusChangeMask))
+    {
+	XFocusChangeEvent event;
+	Display* dpy = XtDisplay (child);
+
+	event.type = type;
+	event.serial = LastKnownRequestProcessed(dpy);
+	event.send_event = True;
+	event.display = dpy;
+	event.window = XtWindow(child);
+	event.mode = NotifyNormal;
+	event.detail = NotifyAncestor;
+	if (XFilterEvent((XEvent*)&event, XtWindow(child)))
+	    return;
+	XtDispatchEventToWidget(child, (XEvent*)&event);
+    }
+}
+
+static XtEventDispatchProc* NewDispatcherList(void)
+{
+    XtEventDispatchProc* l =
+	(XtEventDispatchProc*) __XtCalloc((Cardinal) 128,
+					(Cardinal)sizeof(XtEventDispatchProc));
+    return l;
+}
+
+XtEventDispatchProc XtSetEventDispatcher(
+    Display		*dpy,
+    int			event_type,
+    XtEventDispatchProc	proc)
+{
+    XtEventDispatchProc *list;
+    XtEventDispatchProc old_proc;
+    register XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(dpy);
+
+    list = pd->dispatcher_list;
+    if (!list) {
+	if (proc) list = pd->dispatcher_list = NewDispatcherList();
+	else return _XtDefaultDispatcher;
+    }
+    old_proc = list[event_type];
+    list[event_type] = proc;
+    if (old_proc == NULL) old_proc = _XtDefaultDispatcher;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return old_proc;
+}
+
+void XtRegisterExtensionSelector(
+    Display		*dpy,
+    int			min_event_type,
+    int			max_event_type,
+    XtExtensionSelectProc	proc,
+    XtPointer 		client_data)
+{
+    ExtSelectRec *e;
+    XtPerDisplay pd;
+    int i;
+    DPY_TO_APPCON(dpy);
+
+    if (dpy == NULL) XtErrorMsg("nullDisplay",
+		"xtRegisterExtensionSelector", XtCXtToolkitError,
+		"XtRegisterExtensionSelector requires a non-NULL display",
+		(String *) NULL, (Cardinal *) NULL);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(dpy);
+
+    for (i = 0; i < pd->ext_select_count; i++) {
+	e = &pd->ext_select_list[i];
+	if (e->min == min_event_type && e->max == max_event_type) {
+	    e->proc = proc;
+	    e->client_data = client_data;
+	    return;
+	}
+	if ((min_event_type >= e->min && min_event_type <= e->max) ||
+	    (max_event_type >= e->min && max_event_type <= e->max)) {
+	    XtErrorMsg("rangeError", "xtRegisterExtensionSelector",
+		       XtCXtToolkitError,
+	"Attempt to register multiple selectors for one extension event type",
+		       (String *) NULL, (Cardinal *) NULL);
+	    UNLOCK_PROCESS;
+	    UNLOCK_APP(app);
+	    return;
+	}
+    }
+    pd->ext_select_count++;
+    pd->ext_select_list =
+	    (ExtSelectRec *) XtRealloc((char *) pd->ext_select_list,
+		       pd->ext_select_count * sizeof(ExtSelectRec));
+    for (i = pd->ext_select_count - 1; i > 0; i--) {
+	if (pd->ext_select_list[i-1].min > min_event_type) {
+	    pd->ext_select_list[i] = pd->ext_select_list[i-1];
+	} else break;
+    }
+    pd->ext_select_list[i].min = min_event_type;
+    pd->ext_select_list[i].max = max_event_type;
+    pd->ext_select_list[i].proc = proc;
+    pd->ext_select_list[i].client_data = client_data;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void _XtExtensionSelect(
+    Widget widget)
+{
+    int i;
+    XtPerDisplay pd;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+
+    pd = _XtGetPerDisplay(XtDisplay(widget));
+
+    for (i = 0; i < pd->ext_select_count; i++) {
+	CallExtensionSelector(widget, pd->ext_select_list+i, FALSE);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
diff --git a/libXt/src/EventUtil.c b/libXt/src/EventUtil.c
new file mode 100644
index 000000000..929d83dc1
--- /dev/null
+++ b/libXt/src/EventUtil.c
@@ -0,0 +1,221 @@
+/* $Xorg: EventUtil.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard, Digital, or Sun  not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/EventUtil.c,v 1.6 2001/12/14 19:56:13 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "PassivGraI.h"
+#include "StringDefs.h"
+#include "EventI.h"
+
+static XContext 	perWidgetInputContext = 0;
+
+void _XtFreePerWidgetInput(
+    Widget 		w,
+    XtPerWidgetInput	pwi)
+{
+    LOCK_PROCESS;
+    XDeleteContext(XtDisplay(w),
+		   (Window)w,
+		   perWidgetInputContext);
+
+    XtFree((char *)pwi);
+    UNLOCK_PROCESS;
+}
+
+/*
+ * This routine gets the passive list associated with the widget
+ * from the context manager.
+ */
+XtPerWidgetInput _XtGetPerWidgetInput(
+    Widget	widget,
+    _XtBoolean	create)
+{
+    XtPerWidgetInput	pwi = NULL;
+    Display		*dpy = widget->core.screen->display;
+
+    LOCK_PROCESS;
+    if (! perWidgetInputContext)
+      perWidgetInputContext = XUniqueContext();
+
+    if (XFindContext(dpy,
+		     (Window)widget,
+		     perWidgetInputContext,
+		     (XPointer *)&pwi) &&
+	create)
+      {
+	  pwi = (XtPerWidgetInput)
+	    __XtMalloc((unsigned) sizeof(XtPerWidgetInputRec));
+
+	  pwi->focusKid = NULL;
+	  pwi->queryEventDescendant = NULL;
+	  pwi->focalPoint = XtUnrelated;
+	  pwi->keyList =
+	    pwi->ptrList = NULL;
+
+	  pwi->haveFocus =
+	      pwi->map_handler_added =
+		  pwi->realize_handler_added =
+		      pwi->active_handler_added = FALSE;
+
+	  XtAddCallback(widget, XtNdestroyCallback,
+			_XtDestroyServerGrabs, (XtPointer)pwi);
+
+	  (void) XSaveContext(dpy,
+			      (Window)widget,
+			      perWidgetInputContext,
+			      (char *) pwi);
+      }
+    UNLOCK_PROCESS;
+    return pwi;
+}
+
+
+void _XtFillAncestorList(
+    Widget	**listPtr,
+    int		*maxElemsPtr,
+    int		*numElemsPtr,
+    Widget	start,
+    Widget	breakWidget)
+{
+#define CACHESIZE 16
+    Cardinal	i;
+    Widget	w;
+    Widget	*trace = *listPtr;
+
+    /* First time in, allocate the ancestor list */
+    if (trace == NULL)
+      {
+	  trace = (Widget *) __XtMalloc(CACHESIZE * sizeof(Widget));
+	  *maxElemsPtr = CACHESIZE;
+      }
+    /* First fill in the ancestor list */
+
+    trace[0] = start;
+
+    for (i = 1, w = XtParent(start);
+	 w != NULL && !XtIsShell(trace[i-1]) && trace[i-1] != breakWidget;
+	 w = XtParent(w), i++) {
+	if (i == (Cardinal) *maxElemsPtr) {
+	    /* This should rarely happen, but if it does it'll probably
+	       happen again, so grow the ancestor list */
+	    *maxElemsPtr += CACHESIZE;
+	    trace = (Widget *) XtRealloc((char*)trace,
+					 sizeof(Widget) * (*maxElemsPtr));
+	}
+	trace[i] = w;
+    }
+    *listPtr = trace;
+    *numElemsPtr = i;
+#undef CACHESIZE
+}
+
+
+Widget _XtFindRemapWidget(
+    XEvent	*event,
+    Widget	widget,
+    EventMask	mask,
+    XtPerDisplayInput pdi)
+{
+    Widget		dspWidget = widget;
+
+    if (!pdi->traceDepth || !(widget == pdi->trace[0]))
+      {
+	  _XtFillAncestorList(&pdi->trace, &pdi->traceMax,
+			      &pdi->traceDepth, widget, NULL);
+	  pdi->focusWidget = NULL; /* invalidate the focus
+				      cache */
+      }
+    if (mask & (KeyPressMask | KeyReleaseMask))
+	  dspWidget = _XtProcessKeyboardEvent((XKeyEvent*)event, widget, pdi);
+    else if (mask &(ButtonPressMask | ButtonReleaseMask))
+	  dspWidget = _XtProcessPointerEvent((XButtonEvent*)event, widget,pdi);
+
+    return dspWidget;
+}
+
+void _XtUngrabBadGrabs(
+    XEvent	*event,
+    Widget	widget,
+    EventMask	mask,
+    XtPerDisplayInput pdi)
+{
+    XKeyEvent	* ke = (XKeyEvent *) event;
+
+    if (mask & (KeyPressMask | KeyReleaseMask))
+      {
+	  if (IsServerGrab(pdi->keyboard.grabType) &&
+	      !_XtOnGrabList(pdi->keyboard.grab.widget,
+			     pdi->grabList))
+	    XtUngrabKeyboard(widget, ke->time);
+
+      }
+    else
+      {
+	  if (IsServerGrab(pdi->pointer.grabType) &&
+	      !_XtOnGrabList(pdi->pointer.grab.widget,
+			     pdi->grabList))
+	    XtUngrabPointer(widget, ke->time);
+      }
+}
diff --git a/libXt/src/Functions.c b/libXt/src/Functions.c
new file mode 100644
index 000000000..074a60f4c
--- /dev/null
+++ b/libXt/src/Functions.c
@@ -0,0 +1,216 @@
+/* $Xorg: Functions.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/*
+
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+/*
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <X11/Shell.h>
+#include <X11/Vendor.h>
+
+/*
+ * This file defines functional equivalents to all macros defined
+ * in Intrinsic.h
+ *
+ */
+
+#undef XtIsRectObj
+Boolean XtIsRectObj(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x02);
+}
+
+
+#undef XtIsWidget
+Boolean XtIsWidget(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x04);
+}
+
+
+#undef XtIsComposite
+Boolean XtIsComposite(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x08);
+}
+
+
+#undef XtIsConstraint
+Boolean XtIsConstraint(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x10);
+}
+
+
+#undef XtIsShell
+Boolean XtIsShell(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x20);
+}
+
+
+#undef XtIsOverrideShell
+Boolean XtIsOverrideShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)overrideShellWidgetClass,
+			   (WidgetClass)shellWidgetClass, 0x20);
+}
+
+
+#undef XtIsWMShell
+Boolean XtIsWMShell(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x40);
+}
+
+
+#undef XtIsVendorShell
+Boolean XtIsVendorShell(Widget object)
+{
+    Boolean retval;
+
+    LOCK_PROCESS;
+    retval = _XtIsSubclassOf(object,
+#ifdef notdef
+/*
+ * We don't refer to vendorShell directly, because some shared libraries
+ * bind local references tightly.
+ */
+			   (WidgetClass)vendorShellWidgetClass,
+#endif
+			   transientShellWidgetClass->core_class.superclass,
+			   (WidgetClass)wmShellWidgetClass, 0x40);
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+
+#undef XtIsTransientShell
+Boolean XtIsTransientShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)transientShellWidgetClass,
+			   (WidgetClass)wmShellWidgetClass, 0x40);
+}
+
+
+#undef XtIsTopLevelShell
+Boolean XtIsTopLevelShell(Widget object)
+{
+    return _XtCheckSubclassFlag(object, 0x80);
+}
+
+
+#undef XtIsApplicationShell
+Boolean XtIsApplicationShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)applicationShellWidgetClass,
+			   (WidgetClass)topLevelShellWidgetClass, 0x80);
+}
+
+#undef XtIsSessionShell
+Boolean XtIsSessionShell(Widget object)
+{
+    return _XtIsSubclassOf(object, (WidgetClass)sessionShellWidgetClass,
+			   (WidgetClass)topLevelShellWidgetClass, 0x80);
+}
+
+#undef XtMapWidget
+void XtMapWidget(Widget w)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(w);
+
+    LOCK_APP(app);
+    XMapWindow(XtDisplay(w), XtWindow(w));
+    hookobj = XtHooksOfDisplay(XtDisplay(w));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHmapWidget;
+	call_data.widget = w;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+}
+
+
+#undef XtUnmapWidget
+void XtUnmapWidget(Widget w)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(w);
+
+    LOCK_APP(app);
+    XUnmapWindow(XtDisplay(w), XtWindow(w));
+    hookobj = XtHooksOfDisplay(XtDisplay(w));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHunmapWidget;
+	call_data.widget = w;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+}
+
+
+#undef XtNewString
+String XtNewString(String str)
+{
+    if (str == NULL)
+	return NULL;
+    else
+	return strcpy(__XtMalloc((unsigned)strlen(str) + 1), str);
+}
diff --git a/libXt/src/GCManager.c b/libXt/src/GCManager.c
new file mode 100644
index 000000000..c09cb229b
--- /dev/null
+++ b/libXt/src/GCManager.c
@@ -0,0 +1,353 @@
+/* $Xorg: GCManager.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988, 1990 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1990, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/GCManager.c,v 1.5 2001/08/22 22:52:18 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+
+typedef struct _GCrec {
+    unsigned char screen;	/* Screen for GC */
+    unsigned char depth;	/* Depth for GC */
+    char	  dashes;	/* Dashes value */
+    Pixmap	  clip_mask;	/* Clip_mask value */
+    Cardinal	  ref_count;    /* # of shareholders */
+    GC		  gc;		/* The GC itself. */
+    XtGCMask	  dynamic_mask;	/* Writable values */
+    XtGCMask	  unused_mask;	/* Unused values */
+    struct _GCrec *next;	/* Next GC for this widgetkind. */
+} GCrec, *GCptr;
+
+#define GCVAL(bit,mask,val,default) ((bit&mask) ? val : default)
+
+#define CHECK(bit,comp,default) \
+    if ((checkMask & bit) && \
+	(GCVAL(bit,valueMask,v->comp,default) != gcv.comp)) return False
+
+#define ALLGCVALS (GCFunction | GCPlaneMask | GCForeground | \
+		   GCBackground | GCLineWidth | GCLineStyle | \
+		   GCCapStyle | GCJoinStyle | GCFillStyle | \
+		   GCFillRule | GCTile | GCStipple | \
+		   GCTileStipXOrigin | GCTileStipYOrigin | \
+		   GCFont | GCSubwindowMode | GCGraphicsExposures | \
+		   GCClipXOrigin | GCClipYOrigin | GCDashOffset | \
+		   GCArcMode)
+
+static Bool Matches(
+    Display *dpy,
+    GCptr ptr,
+    register XtGCMask valueMask,
+    register XGCValues *v,
+    XtGCMask readOnlyMask,
+    XtGCMask dynamicMask)
+{
+    XGCValues gcv;
+    register XtGCMask checkMask;
+
+    if (readOnlyMask & ptr->dynamic_mask)
+	return False;
+    if (((ptr->dynamic_mask|ptr->unused_mask) & dynamicMask) != dynamicMask)
+	return False;
+    if (!XGetGCValues(dpy, ptr->gc, ALLGCVALS, &gcv))
+	return False;
+    checkMask = readOnlyMask & ~ptr->unused_mask;
+    CHECK(GCForeground, foreground, 0);
+    CHECK(GCBackground, background, 1);
+    CHECK(GCFont, font, ~0UL);
+    CHECK(GCFillStyle, fill_style, FillSolid);
+    CHECK(GCLineWidth, line_width, 0);
+    CHECK(GCFunction, function, GXcopy);
+    CHECK(GCGraphicsExposures, graphics_exposures, True);
+    CHECK(GCTile, tile, ~0UL);
+    CHECK(GCSubwindowMode, subwindow_mode, ClipByChildren);
+    CHECK(GCPlaneMask, plane_mask, AllPlanes);
+    CHECK(GCLineStyle, line_style, LineSolid);
+    CHECK(GCCapStyle, cap_style, CapButt);
+    CHECK(GCJoinStyle, join_style, JoinMiter);
+    CHECK(GCFillRule, fill_rule, EvenOddRule);
+    CHECK(GCArcMode, arc_mode, ArcPieSlice);
+    CHECK(GCStipple, stipple, ~0UL);
+    CHECK(GCTileStipXOrigin, ts_x_origin, 0);
+    CHECK(GCTileStipYOrigin, ts_y_origin, 0);
+    CHECK(GCClipXOrigin, clip_x_origin, 0);
+    CHECK(GCClipYOrigin, clip_y_origin, 0);
+    CHECK(GCDashOffset, dash_offset, 0);
+    gcv.clip_mask = ptr->clip_mask;
+    CHECK(GCClipMask, clip_mask, None);
+    gcv.dashes = ptr->dashes;
+    CHECK(GCDashList, dashes, 4);
+    valueMask &= ptr->unused_mask | dynamicMask;
+    if (valueMask) {
+	XChangeGC(dpy, ptr->gc, valueMask, v);
+	if (valueMask & GCDashList)
+	    ptr->dashes = v->dashes;
+	if (valueMask & GCClipMask)
+	    ptr->clip_mask = v->clip_mask;
+    }
+    ptr->unused_mask &= ~(dynamicMask | readOnlyMask);
+    ptr->dynamic_mask |= dynamicMask;
+    return True;
+} /* Matches */
+
+/* Called by CloseDisplay to free the per-display GC list */
+void _XtGClistFree(
+    Display *dpy,
+    register XtPerDisplay pd)
+{
+    register GCptr GClist, next;
+    register int i;
+
+    GClist = pd->GClist;
+    while (GClist) {
+	next = GClist->next;
+	XtFree((char*)GClist);
+	GClist = next;
+    }
+    if (pd->pixmap_tab) {
+	for (i = ScreenCount(dpy); --i >= 0; ) {
+	    if (pd->pixmap_tab[i])
+		XtFree((char *)pd->pixmap_tab[i]);
+	}
+	XtFree((char *)pd->pixmap_tab);
+    }
+}
+
+
+/*
+ * Return a GC with the given values and characteristics.
+ */
+
+GC XtAllocateGC(
+    register Widget widget,
+    Cardinal	    depth,
+    XtGCMask        valueMask,
+    XGCValues       *values,
+    XtGCMask        dynamicMask,
+    XtGCMask        unusedMask)
+{
+    register GCptr *prev;
+    register GCptr cur;
+    Screen *screen;
+    register Display *dpy;
+    register XtPerDisplay pd;
+    Drawable drawable;
+    Drawable *pixmaps;
+    XtGCMask readOnlyMask;
+    GC retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (!XtIsWidget(widget))
+	widget = _XtWindowedAncestor(widget);
+    if (!depth)
+	depth = widget->core.depth;
+    screen = XtScreen(widget);
+    dpy = DisplayOfScreen(screen);
+    pd = _XtGetPerDisplay(dpy);
+    unusedMask &= ~valueMask;
+    readOnlyMask = ~(dynamicMask | unusedMask);
+
+    /* Search for existing GC that matches exactly */
+    for (prev = &pd->GClist; (cur = *prev); prev = &cur->next) {
+	if (cur->depth == depth &&
+	    ScreenOfDisplay(dpy, cur->screen) == screen &&
+	    Matches(dpy, cur, valueMask, values, readOnlyMask, dynamicMask)) {
+            cur->ref_count++;
+	    /* Move this GC to front of list */
+	    *prev = cur->next;
+	    cur->next = pd->GClist;
+	    pd->GClist = cur;
+	    retval = cur->gc;
+	    UNLOCK_PROCESS;
+	    UNLOCK_APP(app);
+	    return retval;
+	}
+    }
+
+    /* No matches, have to create a new one */
+    cur = XtNew(GCrec);
+    cur->screen = XScreenNumberOfScreen(screen);
+    cur->depth = depth;
+    cur->ref_count = 1;
+    cur->dynamic_mask = dynamicMask;
+    cur->unused_mask = (unusedMask & ~dynamicMask);
+    cur->dashes = GCVAL(GCDashList, valueMask, values->dashes, 4);
+    cur->clip_mask = GCVAL(GCClipMask, valueMask, values->clip_mask, None);
+    drawable = 0;
+    if (depth == widget->core.depth)
+	drawable = XtWindow(widget);
+    if (!drawable && depth == (Cardinal) DefaultDepthOfScreen(screen))
+	drawable = RootWindowOfScreen(screen);
+    if (!drawable) {
+	if (!pd->pixmap_tab) {
+	    int n;
+	    pd->pixmap_tab = (Drawable **)__XtMalloc((unsigned)ScreenCount(dpy) *
+						   sizeof(Drawable *));
+	    for (n = 0; n < ScreenCount(dpy); n++)
+		pd->pixmap_tab[n] = NULL;
+	}
+	pixmaps = pd->pixmap_tab[cur->screen];
+	if (!pixmaps) {
+	    int max, n, *depths;
+	    depths = XListDepths(dpy, cur->screen, &n);
+	    n--;
+	    max = depths[n];
+	    while (n--) {
+		if (depths[n] > max)
+		    max = depths[n];
+	    }
+	    XFree((char *)depths);
+	    pixmaps = (Drawable *)__XtCalloc((unsigned)max, sizeof(Drawable));
+	    pd->pixmap_tab[cur->screen] = pixmaps;
+	}
+	drawable = pixmaps[cur->depth - 1];
+	if (!drawable) {
+	    drawable = XCreatePixmap(dpy, RootWindowOfScreen(screen), 1, 1,
+				     cur->depth);
+	    pixmaps[cur->depth - 1] = drawable;
+	}
+    }
+    cur->gc = XCreateGC(dpy, drawable, valueMask, values);
+    cur->next = pd->GClist;
+    pd->GClist = cur;
+    retval = cur->gc;
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtAllocateGC */
+
+/*
+ * Return a read-only GC with the given values.
+ */
+
+GC XtGetGC(
+    register Widget widget,
+    XtGCMask        valueMask,
+    XGCValues       *values)
+{
+    return XtAllocateGC(widget, 0, valueMask, values, 0, 0);
+} /* XtGetGC */
+
+void  XtReleaseGC(
+    Widget      widget,
+    register GC gc)
+{
+    register GCptr cur, *prev;
+    Display* dpy;
+    XtPerDisplay pd;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    dpy = XtDisplayOfObject(widget);
+    pd = _XtGetPerDisplay(dpy);
+
+    for (prev = &pd->GClist; (cur = *prev); prev = &cur->next) {
+	if (cur->gc == gc) {
+	    if (--(cur->ref_count) == 0) {
+		*prev = cur->next;
+		XFreeGC(dpy, gc);
+		XtFree((char *) cur);
+	    }
+	    break;
+	}
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+} /* XtReleaseGC */
+
+/*  The following interface is broken and supplied only for backwards
+ *  compatibility.  It will work properly in all cases only if there
+ *  is exactly 1 Display created by the application.
+ */
+
+void XtDestroyGC(register GC gc)
+{
+    GCptr cur, *prev;
+    XtAppContext app;
+
+    LOCK_PROCESS;
+    app = _XtGetProcessContext()->appContextList;
+    /* This is awful; we have to search through all the lists
+       to find the GC. */
+    for (; app; app = app->next) {
+	int i;
+	for (i = app->count; i ;) {
+	    Display *dpy = app->list[--i];
+	    XtPerDisplay pd = _XtGetPerDisplay(dpy);
+	    for (prev = &pd->GClist; (cur = *prev); prev = &cur->next) {
+		if (cur->gc == gc) {
+		    if (--(cur->ref_count) == 0) {
+			*prev = cur->next;
+			XFreeGC(dpy, gc);
+			XtFree((char *) cur);
+		    }
+		    UNLOCK_PROCESS;
+		    return;
+		}
+	    }
+	}
+    }
+    UNLOCK_PROCESS;
+} /* XtDestroyGC */
diff --git a/libXt/src/Geometry.c b/libXt/src/Geometry.c
new file mode 100644
index 000000000..b183bfd76
--- /dev/null
+++ b/libXt/src/Geometry.c
@@ -0,0 +1,817 @@
+/* $Xorg: Geometry.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Geometry.c,v 1.12 2001/12/14 19:56:15 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "ShellP.h"
+#include "ShellI.h"
+
+static void ClearRectObjAreas(
+    RectObj r,
+    XWindowChanges* old)
+{
+    Widget pw = _XtWindowedAncestor((Widget)r);
+    int bw2;
+
+    bw2 = old->border_width << 1;
+    XClearArea( XtDisplay(pw), XtWindow(pw),
+		old->x, old->y,
+		old->width + bw2, old->height + bw2,
+		TRUE );
+
+    bw2 = r->rectangle.border_width << 1;
+    XClearArea( XtDisplay(pw), XtWindow(pw),
+		(int)r->rectangle.x, (int)r->rectangle.y,
+		(unsigned int)(r->rectangle.width + bw2),
+	        (unsigned int)(r->rectangle.height + bw2),
+		TRUE );
+}
+
+/*
+ * Internal function used by XtMakeGeometryRequest and XtSetValues.
+ * Returns more data than the public interface.  Does not convert
+ * XtGeometryDone to XtGeometryYes.
+ *
+ * clear_rect_obj - *** RETURNED ***
+ *		    TRUE if the rect obj has been cleared, false otherwise.
+ */
+
+XtGeometryResult
+_XtMakeGeometryRequest (
+    Widget widget,
+    XtWidgetGeometry *request,
+    XtWidgetGeometry *reply,
+    Boolean * clear_rect_obj)
+{
+    XtWidgetGeometry    junk;
+    XtGeometryHandler manager = (XtGeometryHandler) NULL;
+    XtGeometryResult returnCode;
+    Widget parent = widget->core.parent;
+    Boolean managed, parentRealized, rgm = False;
+    XtConfigureHookDataRec req;
+    Widget hookobj;
+
+    *clear_rect_obj = FALSE;
+
+    CALLGEOTAT(_XtGeoTrace(widget,
+	"\"%s\" is making a %sgeometry request to its parent \"%s\".\n",
+		   XtName(widget),
+		   ((request->request_mode & XtCWQueryOnly))? "query only ":"",
+		   (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+    CALLGEOTAT(_XtGeoTab(1));
+
+    if (XtIsShell(widget)) {
+	ShellClassExtension ext;
+	LOCK_PROCESS;
+	for (ext = (ShellClassExtension)((ShellWidgetClass)XtClass(widget))
+		   ->shell_class.extension;
+	     ext != NULL && ext->record_type != NULLQUARK;
+	     ext = (ShellClassExtension)ext->next_extension);
+
+	if (ext != NULL) {
+	    if (  ext->version == XtShellExtensionVersion
+		  && ext->record_size == sizeof(ShellClassExtensionRec)) {
+		manager = ext->root_geometry_manager;
+		rgm = True;
+	    } else {
+		String params[1];
+		Cardinal num_params = 1;
+		params[0] = XtClass(widget)->core_class.class_name;
+		XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+		     "invalidExtension", "xtMakeGeometryRequest",
+		     XtCXtToolkitError,
+		     "widget class %s has invalid ShellClassExtension record",
+		     params, &num_params);
+	    }
+	} else {
+	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+			  "internalError", "xtMakeGeometryRequest",
+			  XtCXtToolkitError,
+			  "internal error; ShellClassExtension is NULL",
+			  NULL, NULL);
+	}
+	managed = True;
+	parentRealized = TRUE;
+	UNLOCK_PROCESS;
+    } else /* not shell */ {
+	if (parent == NULL)
+	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+			  "invalidParent","xtMakeGeometryRequest",
+			  XtCXtToolkitError,
+			  "non-shell has no parent in XtMakeGeometryRequest",
+			  (String *)NULL, (Cardinal *)NULL);
+
+	managed = XtIsManaged(widget);
+	parentRealized = XtIsRealized(parent);
+	if (XtIsComposite(parent))
+	{
+	    LOCK_PROCESS;
+	    manager = ((CompositeWidgetClass) (parent->core.widget_class))
+		      ->composite_class.geometry_manager;
+	    UNLOCK_PROCESS;
+	}
+    }
+
+#if 0
+    /*
+     * The Xt spec says that these conditions must generate
+     * error messages (not warnings), but many Xt applications
+     * and toolkits (including parts of Xaw, Motif and Netscape)
+     * depend on the previous Xt behaviour.  Thus, these tests
+     * should probably remain disabled.
+     */
+    if (parentRealized && managed) {
+	if (parent && !XtIsComposite(parent))
+	{
+	    /*
+	     * This shouldn't ever happen, we only test for this to pass
+	     * VSW5.  Normally managing the widget will catch this, but VSW5
+	     * does some really screwy stuff to get here.
+	     */
+	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+			  "invalidParent", "xtMakeGeometryRequest",
+			  XtCXtToolkitError,
+			  "XtMakeGeometryRequest - parent not composite",
+			  (String *)NULL, (Cardinal *)NULL);
+	}
+	else if (manager == (XtGeometryHandler) NULL)
+	{
+	    XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+			  "invalidGeometryManager","xtMakeGeometryRequest",
+			  XtCXtToolkitError,
+			  "XtMakeGeometryRequest - parent has no geometry manager",
+			  (String *)NULL, (Cardinal *)NULL);
+	}
+    }
+#else
+    if (!manager)
+	managed = False;
+#endif
+
+    if (widget->core.being_destroyed) {
+	CALLGEOTAT(_XtGeoTab(-1));
+	CALLGEOTAT(_XtGeoTrace(widget,
+		       "It is being destroyed, just return XtGeometryNo.\n"));
+	return XtGeometryNo;
+    }
+
+    /* see if requesting anything to change */
+    req.changeMask = 0;
+    if (request->request_mode & CWStackMode
+	&& request->stack_mode != XtSMDontChange) {
+	    req.changeMask |= CWStackMode;
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				   "Asking for a change in StackMode!\n"));
+	    if (request->request_mode & CWSibling) {
+		XtCheckSubclass(request->sibling, rectObjClass,
+				"XtMakeGeometryRequest");
+		req.changeMask |= CWSibling;
+	    }
+    }
+    if (request->request_mode & CWX
+	&& widget->core.x != request->x) {
+	CALLGEOTAT(_XtGeoTrace(widget,
+			       "Asking for a change in x: from %d to %d.\n",
+			       widget->core.x, request->x));
+	req.changeMask |= CWX;
+    }
+    if (request->request_mode & CWY
+	&& widget->core.y != request->y) {
+	CALLGEOTAT(_XtGeoTrace(widget,
+			       "Asking for a change in y: from %d to %d.\n",
+			       widget->core.y, request->y));
+	req.changeMask |= CWY;
+    }
+    if (request->request_mode & CWWidth
+	&& widget->core.width != request->width) {
+	CALLGEOTAT(_XtGeoTrace(widget,"Asking for a change in width: from %d to %d.\n",
+		       widget->core.width, request->width));
+	req.changeMask |= CWWidth;
+    }
+    if (request->request_mode & CWHeight
+	&& widget->core.height != request->height) {
+	CALLGEOTAT(_XtGeoTrace(widget,
+			    "Asking for a change in height: from %d to %d.\n",
+			       widget->core.height, request->height));
+	req.changeMask |= CWHeight;
+    }
+    if (request->request_mode & CWBorderWidth
+	&& widget->core.border_width != request->border_width){
+	CALLGEOTAT(_XtGeoTrace(widget,
+		       "Asking for a change in border_width: from %d to %d.\n",
+		       widget->core.border_width, request->border_width));
+	req.changeMask |= CWBorderWidth;
+    }
+    if (! req.changeMask) {
+	CALLGEOTAT(_XtGeoTrace(widget,
+		       "Asking for nothing new,\n"));
+	CALLGEOTAT(_XtGeoTab(-1));
+	CALLGEOTAT(_XtGeoTrace(widget,
+		       "just return XtGeometryYes.\n"));
+	return XtGeometryYes;
+    }
+    req.changeMask |= (request->request_mode & XtCWQueryOnly);
+
+    if ( !(req.changeMask & XtCWQueryOnly) && XtIsRealized(widget) ) {
+	/* keep record of the current geometry so we know what's changed */
+	req.changes.x = widget->core.x ;
+	req.changes.y = widget->core.y ;
+	req.changes.width = widget->core.width ;
+	req.changes.height = widget->core.height ;
+	req.changes.border_width = widget->core.border_width ;
+    }
+
+    if (!managed || !parentRealized) {
+	CALLGEOTAT(_XtGeoTrace(widget,
+			       "Not Managed or Parent not realized.\n"));
+	/* Don't get parent's manager involved--assume the answer is yes */
+	if (req.changeMask & XtCWQueryOnly) {
+	    /* He was just asking, don't change anything, just tell him yes */
+	    CALLGEOTAT(_XtGeoTrace(widget,"QueryOnly request\n"));
+	    CALLGEOTAT(_XtGeoTab(-1));
+	    CALLGEOTAT(_XtGeoTrace(widget,"just return XtGeometryYes.\n"));
+	    return XtGeometryYes;
+	} else {
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				   "Copy values from request to widget.\n"));
+	    /* copy values from request to widget */
+	    if (request->request_mode & CWX)
+		widget->core.x = request->x;
+	    if (request->request_mode & CWY)
+		widget->core.y = request->y;
+	    if (request->request_mode & CWWidth)
+		widget->core.width = request->width;
+	    if (request->request_mode & CWHeight)
+		widget->core.height = request->height;
+	    if (request->request_mode & CWBorderWidth)
+		widget->core.border_width = request->border_width;
+	    if (!parentRealized) {
+		CALLGEOTAT(_XtGeoTab(-1));
+		CALLGEOTAT(_XtGeoTrace(widget,"and return XtGeometryYes.\n"));
+		return XtGeometryYes;
+	    }
+	    else returnCode = XtGeometryYes;
+	}
+    } else {
+	/* go ask the widget's geometry manager */
+	CALLGEOTAT(_XtGeoTrace(widget,
+			       "Go ask the parent geometry manager.\n"));
+	if (reply == (XtWidgetGeometry *) NULL) {
+	    returnCode = (*manager)(widget, request, &junk);
+	} else {
+	    returnCode = (*manager)(widget, request, reply);
+	}
+    }
+
+    /*
+     * If Unrealized, not a XtGeometryYes, or a query-only then we are done.
+     */
+
+    if ((returnCode != XtGeometryYes) ||
+	(req.changeMask & XtCWQueryOnly) || !XtIsRealized(widget)) {
+
+#ifdef XT_GEO_TATTLER
+	switch(returnCode){
+	case XtGeometryNo:
+	    CALLGEOTAT(_XtGeoTab(-1));
+	    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryNo.\n",
+			  (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+            /* check for no change */
+            break ;
+	case XtGeometryDone:
+	    CALLGEOTAT(_XtGeoTab(-1));
+	    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryDone.\n",
+		        (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+            /* check for no change in queryonly */
+            break ;
+	case XtGeometryAlmost:
+	    CALLGEOTAT(_XtGeoTab(-1));
+	    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryAlmost.\n",
+			 (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+	    CALLGEOTAT(_XtGeoTab(1));
+	    CALLGEOTAT(_XtGeoTrace(widget,"Proposal: width %d height %d.\n",
+			   (reply)?reply->width:junk.width,
+			   (reply)?reply->height:junk.height));
+	    CALLGEOTAT(_XtGeoTab(-1));
+
+            /* check for no change */
+            break ;
+	case XtGeometryYes:
+	    if (req.changeMask & XtCWQueryOnly) {
+		CALLGEOTAT(_XtGeoTrace(widget,
+				"QueryOnly specified, no configuration.\n"));
+	    }
+            if (!XtIsRealized(widget)) {
+		CALLGEOTAT(_XtGeoTrace(widget,
+				 "\"%s\" not realized, no configuration.\n",
+				 XtName(widget)));
+	    }
+	    CALLGEOTAT(_XtGeoTab(-1));
+            CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryYes.\n",
+                         (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+	    break ;
+	}
+#endif
+	return returnCode;
+    }
+
+    CALLGEOTAT(_XtGeoTab(-1));
+    CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" returns XtGeometryYes.\n",
+		   (XtParent(widget))?XtName(XtParent(widget)):"Root"));
+
+    if (XtIsWidget(widget)) {	/* reconfigure the window (if needed) */
+
+	if (rgm) return returnCode;
+
+	if (req.changes.x != widget->core.x) {
+ 	    req.changeMask |= CWX;
+ 	    req.changes.x = widget->core.x;
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				   "x changing to %d\n",widget->core.x));
+ 	}
+ 	if (req.changes.y != widget->core.y) {
+ 	    req.changeMask |= CWY;
+ 	    req.changes.y = widget->core.y;
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				   "y changing to %d\n",widget->core.y));
+ 	}
+ 	if (req.changes.width != widget->core.width) {
+ 	    req.changeMask |= CWWidth;
+ 	    req.changes.width = widget->core.width;
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				 "width changing to %d\n",widget->core.width));
+ 	}
+ 	if (req.changes.height != widget->core.height) {
+ 	    req.changeMask |= CWHeight;
+ 	    req.changes.height = widget->core.height;
+	    CALLGEOTAT(_XtGeoTrace(widget,
+                               "height changing to %d\n",widget->core.height));
+ 	}
+ 	if (req.changes.border_width != widget->core.border_width) {
+ 	    req.changeMask |= CWBorderWidth;
+ 	    req.changes.border_width = widget->core.border_width;
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				   "border_width changing to %d\n",
+				   widget->core.border_width));
+ 	}
+	if (req.changeMask & CWStackMode) {
+	    req.changes.stack_mode = request->stack_mode;
+	    CALLGEOTAT(_XtGeoTrace(widget,"stack_mode changing\n"));
+	    if (req.changeMask & CWSibling) {
+		if (XtIsWidget(request->sibling))
+		    req.changes.sibling = XtWindow(request->sibling);
+		else
+		    req.changeMask &= ~(CWStackMode | CWSibling);
+	    }
+	}
+
+#ifdef XT_GEO_TATTLER
+        if (req.changeMask) {
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				   "XConfigure \"%s\"'s window.\n",
+				   XtName(widget)));
+	} else {
+	    CALLGEOTAT(_XtGeoTrace(widget,
+			     "No window configuration needed for \"%s\".\n",
+			     XtName(widget)));
+	}
+#endif
+
+	XConfigureWindow(XtDisplay(widget), XtWindow(widget),
+			 req.changeMask, &req.changes);
+    }
+    else {			/* RectObj child of realized Widget */
+	*clear_rect_obj = TRUE;
+	CALLGEOTAT(_XtGeoTrace(widget,
+			       "ClearRectObj on \"%s\".\n",XtName(widget)));
+
+	ClearRectObjAreas((RectObj)widget, &req.changes);
+    }
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));;
+    if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
+	req.type = XtHconfigure;
+	req.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.confighook_callbacks,
+		(XtPointer)&req);
+    }
+
+    return returnCode;
+} /* _XtMakeGeometryRequest */
+
+
+/* Public routines */
+
+XtGeometryResult XtMakeGeometryRequest (
+    Widget         widget,
+    XtWidgetGeometry *request,
+    XtWidgetGeometry *reply)
+{
+    Boolean junk;
+    XtGeometryResult r;
+    XtGeometryHookDataRec call_data;
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
+	call_data.type = XtHpreGeometry;
+	call_data.widget = widget;
+	call_data.request = request;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.geometryhook_callbacks,
+		(XtPointer)&call_data);
+	call_data.result = r =
+	    _XtMakeGeometryRequest(widget, request, reply, &junk);
+	call_data.type = XtHpostGeometry;
+	call_data.reply = reply;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.geometryhook_callbacks,
+		(XtPointer)&call_data);
+    } else {
+	r = _XtMakeGeometryRequest(widget, request, reply, &junk);
+    }
+    UNLOCK_APP(app);
+
+    return ((r == XtGeometryDone) ? XtGeometryYes : r);
+}
+
+XtGeometryResult
+XtMakeResizeRequest(
+    Widget	widget,
+    _XtDimension width,
+    _XtDimension height,
+    Dimension	*replyWidth,
+    Dimension	*replyHeight)
+{
+    XtWidgetGeometry request, reply;
+    XtGeometryResult r;
+    XtGeometryHookDataRec call_data;
+    Boolean junk;
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    request.request_mode = CWWidth | CWHeight;
+    request.width = width;
+    request.height = height;
+
+    if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
+	call_data.type = XtHpreGeometry;
+	call_data.widget = widget;
+	call_data.request = &request;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.geometryhook_callbacks,
+		(XtPointer)&call_data);
+	call_data.result = r =
+	    _XtMakeGeometryRequest(widget, &request, &reply, &junk);
+	call_data.type = XtHpostGeometry;
+	call_data.reply = &reply;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.geometryhook_callbacks,
+		(XtPointer)&call_data);
+    } else {
+	r = _XtMakeGeometryRequest(widget, &request, &reply, &junk);
+    }
+    if (replyWidth != NULL) {
+	if (r == XtGeometryAlmost && reply.request_mode & CWWidth)
+	    *replyWidth = reply.width;
+	else
+	    *replyWidth = width;
+    }
+    if (replyHeight != NULL) {
+	if (r == XtGeometryAlmost && reply.request_mode & CWHeight)
+	    *replyHeight = reply.height;
+	else
+	    *replyHeight = height;
+    }
+    UNLOCK_APP(app);
+    return ((r == XtGeometryDone) ? XtGeometryYes : r);
+} /* XtMakeResizeRequest */
+
+void XtResizeWindow(
+    Widget w)
+{
+    XtConfigureHookDataRec req;
+    Widget hookobj;
+    WIDGET_TO_APPCON(w);
+
+    LOCK_APP(app);
+    if (XtIsRealized(w)) {
+	req.changes.width = w->core.width;
+	req.changes.height = w->core.height;
+	req.changes.border_width = w->core.border_width;
+	req.changeMask = CWWidth | CWHeight | CWBorderWidth;
+	XConfigureWindow(XtDisplay(w), XtWindow(w),
+	    (unsigned) req.changeMask, &req.changes);
+	hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));;
+	if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
+	    req.type = XtHconfigure;
+	    req.widget = w;
+	    XtCallCallbackList(hookobj,
+			((HookObject)hookobj)->hooks.confighook_callbacks,
+			(XtPointer)&req);
+	}
+    }
+    UNLOCK_APP(app);
+} /* XtResizeWindow */
+
+void XtResizeWidget(
+    Widget w,
+    _XtDimension width,
+    _XtDimension height,
+    _XtDimension borderWidth)
+{
+    XtConfigureWidget(w, w->core.x, w->core.y, width, height, borderWidth);
+} /* XtResizeWidget */
+
+void XtConfigureWidget(
+    Widget w,
+    _XtPosition x,
+    _XtPosition y,
+    _XtDimension width,
+    _XtDimension height,
+    _XtDimension borderWidth)
+{
+    XtConfigureHookDataRec req;
+    Widget hookobj;
+    XWindowChanges old;
+    WIDGET_TO_APPCON(w);
+
+    CALLGEOTAT(_XtGeoTrace(w,
+                   "\"%s\" is being configured by its parent \"%s\"\n",
+		   XtName(w),
+		   (XtParent(w))?XtName(XtParent(w)):"Root"));
+    CALLGEOTAT(_XtGeoTab(1));
+
+    LOCK_APP(app);
+    req.changeMask = 0;
+    if ((old.x = w->core.x) != x) {
+	CALLGEOTAT(_XtGeoTrace(w,"x move from %d to %d\n",w->core.x, x));
+	req.changes.x = w->core.x = x;
+	req.changeMask |= CWX;
+    }
+
+    if ((old.y = w->core.y) != y) {
+	CALLGEOTAT(_XtGeoTrace(w,"y move from %d to %d\n",w->core.y, y));
+	req.changes.y = w->core.y = y;
+	req.changeMask |= CWY;
+    }
+
+    if ((old.width = w->core.width) != width) {
+	CALLGEOTAT(_XtGeoTrace(w,
+			 "width move from %d to %d\n",w->core.width, width));
+	req.changes.width = w->core.width = width;
+	req.changeMask |= CWWidth;
+    }
+
+    if ((old.height = w->core.height) != height) {
+	CALLGEOTAT(_XtGeoTrace(w,
+		       "height move from %d to %d\n",w->core.height, height));
+	req.changes.height = w->core.height = height;
+	req.changeMask |= CWHeight;
+    }
+
+    if ((old.border_width = w->core.border_width) != borderWidth) {
+	CALLGEOTAT(_XtGeoTrace(w,"border_width move from %d to %d\n",
+		    w->core.border_width,borderWidth ));
+	req.changes.border_width = w->core.border_width = borderWidth;
+	req.changeMask |= CWBorderWidth;
+    }
+
+    if (req.changeMask != 0) {
+	if (XtIsRealized(w)) {
+	    if (XtIsWidget(w)) {
+		CALLGEOTAT(_XtGeoTrace(w,
+                                  "XConfigure \"%s\"'s window\n",XtName(w)));
+		XConfigureWindow(XtDisplay(w), XtWindow(w),
+				 req.changeMask, &req.changes);
+	    } else {
+		CALLGEOTAT(_XtGeoTrace(w,
+			       "ClearRectObj called on \"%s\"\n",XtName(w)));
+		ClearRectObjAreas((RectObj)w, &old);
+	    }
+	}
+	hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));;
+	if (XtHasCallbacks(hookobj, XtNconfigureHook) == XtCallbackHasSome) {
+	    req.type = XtHconfigure;
+	    req.widget = w;
+	    XtCallCallbackList(hookobj,
+			((HookObject)hookobj)->hooks.confighook_callbacks,
+			(XtPointer)&req);
+	}
+	{
+	XtWidgetProc resize;
+
+	LOCK_PROCESS;
+	resize = XtClass(w)->core_class.resize;
+	UNLOCK_PROCESS;
+	if ((req.changeMask & (CWWidth | CWHeight)) &&
+	    resize != (XtWidgetProc) NULL) {
+	    CALLGEOTAT(_XtGeoTrace(w,"Resize proc is called.\n"));
+	    (*resize)(w);
+	 }
+	}
+    } else {
+	CALLGEOTAT(_XtGeoTrace(w,"No change in configuration\n"));
+    }
+
+    CALLGEOTAT(_XtGeoTab(-1));
+    UNLOCK_APP(app);
+} /* XtConfigureWidget */
+
+void XtMoveWidget(
+    Widget w,
+    _XtPosition x,
+    _XtPosition y)
+{
+    XtConfigureWidget(w, x, y, w->core.width, w->core.height,
+		      w->core.border_width);
+} /* XtMoveWidget */
+
+void XtTranslateCoords(
+    register Widget w,
+    _XtPosition x,
+    _XtPosition y,
+    register Position *rootx,	/* return */
+    register Position *rooty)	/* return */
+{
+    Position garbagex, garbagey;
+    XtAppContext app = XtWidgetToApplicationContext(w);
+
+    LOCK_APP(app);
+    if (rootx == NULL) rootx = &garbagex;
+    if (rooty == NULL) rooty = &garbagey;
+
+    *rootx = x;
+    *rooty = y;
+
+    for (; w != NULL && ! XtIsShell(w); w = w->core.parent) {
+	*rootx += w->core.x + w->core.border_width;
+	*rooty += w->core.y + w->core.border_width;
+    }
+
+    if (w == NULL)
+        XtAppWarningMsg(app,
+		"invalidShell","xtTranslateCoords",XtCXtToolkitError,
+                "Widget has no shell ancestor",
+		(String *)NULL, (Cardinal *)NULL);
+    else {
+	Position x, y;
+	_XtShellGetCoordinates( w, &x, &y );
+	*rootx += x + w->core.border_width;
+	*rooty += y + w->core.border_width;
+    }
+    UNLOCK_APP(app);
+}
+
+XtGeometryResult XtQueryGeometry(
+    Widget widget,
+    register XtWidgetGeometry *intended, /* parent's changes; may be NULL */
+    XtWidgetGeometry *reply)	/* child's preferred geometry; never NULL */
+{
+    XtWidgetGeometry null_intended;
+    XtGeometryHandler query;
+    XtGeometryResult result;
+    WIDGET_TO_APPCON(widget);
+
+    CALLGEOTAT(_XtGeoTrace(widget,
+		     "\"%s\" is asking its preferred geometry to \"%s\".\n",
+		     (XtParent(widget))?XtName(XtParent(widget)):"Root",
+		     XtName(widget)));
+    CALLGEOTAT(_XtGeoTab(1));
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    query = XtClass(widget)->core_class.query_geometry;
+    UNLOCK_PROCESS;
+    reply->request_mode = 0;
+    if (query != NULL) {
+	if (intended == NULL) {
+	    null_intended.request_mode = 0;
+	    intended = &null_intended;
+#ifdef XT_GEO_TATTLER
+	    CALLGEOTAT(_XtGeoTrace(widget,"without any constraint.\n"));
+	} else {
+	    CALLGEOTAT(_XtGeoTrace(widget,
+				   "with the following constraints:\n"));
+
+	    if (intended->request_mode & CWX) {
+		CALLGEOTAT(_XtGeoTrace(widget," x = %d\n",intended->x));
+	    }
+	    if (intended->request_mode & CWY) {
+		CALLGEOTAT(_XtGeoTrace(widget," y = %d\n",intended->y));
+	    }
+	    if (intended->request_mode & CWWidth) {
+		CALLGEOTAT(_XtGeoTrace(widget,
+				       " width = %d\n",intended->width));
+	    }
+	    if (intended->request_mode & CWHeight) {
+		CALLGEOTAT(_XtGeoTrace(widget,
+				       " height = %d\n",intended->height));
+	    }
+	    if (intended->request_mode & CWBorderWidth) {
+		CALLGEOTAT(_XtGeoTrace(widget,
+			       " border_width = %d\n",intended->border_width));
+	    }
+#endif
+	}
+
+	result = (*query) (widget, intended, reply);
+    }
+    else {
+	CALLGEOTAT(_XtGeoTrace(widget,"\"%s\" has no QueryGeometry proc, return the current state\n",XtName(widget)));
+
+	result = XtGeometryYes;
+    }
+
+#ifdef XT_GEO_TATTLER
+#define FillIn(mask, field) \
+	if (!(reply->request_mode & mask)) {\
+	      reply->field = widget->core.field;\
+	      _XtGeoTrace(widget," using core %s = %d.\n","field",\
+			                               widget->core.field);\
+	} else {\
+	      _XtGeoTrace(widget," replied %s = %d\n","field",\
+			                           reply->field);\
+	}
+#else
+#define FillIn(mask, field) \
+	if (!(reply->request_mode & mask)) reply->field = widget->core.field;
+#endif
+
+    FillIn(CWX, x);
+    FillIn(CWY, y);
+    FillIn(CWWidth, width);
+    FillIn(CWHeight, height);
+    FillIn(CWBorderWidth, border_width);
+
+    CALLGEOTAT(_XtGeoTab(-1));
+#undef FillIn
+
+    if (!(reply->request_mode & CWStackMode))
+	reply->stack_mode = XtSMDontChange;
+    UNLOCK_APP(app);
+    return result;
+}
diff --git a/libXt/src/GetActKey.c b/libXt/src/GetActKey.c
new file mode 100644
index 000000000..20cae5efe
--- /dev/null
+++ b/libXt/src/GetActKey.c
@@ -0,0 +1,102 @@
+/* $Xorg: GetActKey.c,v 1.4 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+KeySym XtGetActionKeysym(
+    XEvent *event,
+    Modifiers *modifiers_return)
+{
+    TMKeyContext tm_context;
+    Modifiers modifiers;
+    KeySym keysym, retval;
+
+    LOCK_PROCESS;
+    tm_context= _XtGetPerDisplay(event->xany.display)->tm_context;
+    if (event->xany.type != KeyPress && event->xany.type != KeyRelease) {
+	UNLOCK_PROCESS;
+	return NoSymbol;
+    }
+    if (tm_context != NULL
+	&& event == tm_context->event
+	&& event->xany.serial == tm_context->serial ) {
+
+	if (modifiers_return != NULL)
+	    *modifiers_return = tm_context->modifiers;
+	retval = tm_context->keysym;
+	UNLOCK_PROCESS;
+	return retval;
+    }
+
+    XtTranslateKeycode( event->xany.display, (KeyCode)event->xkey.keycode,
+		        event->xkey.state, &modifiers, &keysym );
+
+    if (modifiers_return != NULL)
+	*modifiers_return = event->xkey.state & modifiers;
+
+    UNLOCK_PROCESS;
+    return keysym;
+}
diff --git a/libXt/src/GetResList.c b/libXt/src/GetResList.c
new file mode 100644
index 000000000..8f99398d7
--- /dev/null
+++ b/libXt/src/GetResList.c
@@ -0,0 +1,193 @@
+/* $Xorg: GetResList.c,v 1.4 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/GetResList.c,v 3.5 2001/08/22 22:52:18 dawes Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "Intrinsic.h"
+
+/*
+ * XtGetResourceList(), XtGetConstraintResourceList()
+ */
+
+#define	TOXRMQUARK(p) ((XrmQuark)(long)(p))	/* avoid LP64 warnings */
+
+void XtGetResourceList(
+	WidgetClass widget_class,
+	XtResourceList *resources,
+	Cardinal *num_resources)
+{
+	int size;
+	register Cardinal i, dest = 0;
+	register XtResourceList *list, dlist;
+
+	LOCK_PROCESS;
+	size = widget_class->core_class.num_resources * sizeof(XtResource);
+	*resources = (XtResourceList) __XtMalloc((unsigned) size);
+
+	if (!widget_class->core_class.class_inited) {
+	    /* Easy case */
+
+	    (void) memmove((char *) *resources,
+			   (char *)widget_class->core_class.resources, size);
+	    *num_resources = widget_class->core_class.num_resources;
+	    UNLOCK_PROCESS;
+	    return;
+	}
+
+	/* Nope, it's the hard case */
+
+	list = (XtResourceList *) widget_class->core_class.resources;
+	dlist = *resources;
+	for (i = 0; i < widget_class->core_class.num_resources; i++) {
+	    if (list[i] != NULL) {
+		dlist[dest].resource_name = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->resource_name));
+		dlist[dest].resource_class = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->resource_class));
+		dlist[dest].resource_type = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->resource_type));
+		dlist[dest].resource_size = list[i]->resource_size;
+		/* trust that resource_offset isn't that big */
+		dlist[dest].resource_offset = (Cardinal)
+			-((int)(list[i]->resource_offset + 1));
+		dlist[dest].default_type = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->default_type));
+		dlist[dest].default_addr = list[i]->default_addr;
+		dest++;
+	    }
+	}
+	*num_resources = dest;
+	UNLOCK_PROCESS;
+}
+
+
+static Boolean ClassIsSubclassOf(WidgetClass class, WidgetClass superclass)
+{
+    for (; class != NULL; class = class->core_class.superclass) {
+	if (class == superclass) return True;
+    }
+    return False;
+}
+
+void XtGetConstraintResourceList(
+	WidgetClass widget_class,
+	XtResourceList *resources,
+	Cardinal *num_resources)
+{
+	int size;
+	register Cardinal i, dest = 0;
+	register XtResourceList *list, dlist;
+	ConstraintWidgetClass class = (ConstraintWidgetClass)widget_class;
+
+	LOCK_PROCESS;
+	if (   (class->core_class.class_inited &&
+		!(class->core_class.class_inited & ConstraintClassFlag))
+	    || (!class->core_class.class_inited &&
+		!ClassIsSubclassOf(widget_class, constraintWidgetClass))
+	    || class->constraint_class.num_resources == 0) {
+
+	    *resources = NULL;
+	    *num_resources = 0;
+	    UNLOCK_PROCESS;
+	    return;
+	}
+
+	size = class->constraint_class.num_resources * sizeof(XtResource);
+	*resources = (XtResourceList) __XtMalloc((unsigned) size);
+
+	if (!class->core_class.class_inited) {
+	    /* Easy case */
+
+	    (void) memmove((char *) *resources,
+			   (char *)class->constraint_class.resources, size);
+	    *num_resources = class->constraint_class.num_resources;
+	    UNLOCK_PROCESS;
+	    return;
+	}
+
+	/* Nope, it's the hard case */
+
+	list = (XtResourceList *) class->constraint_class.resources;
+	dlist = *resources;
+	for (i = 0; i < class->constraint_class.num_resources; i++) {
+	    if (list[i] != NULL) {
+		dlist[dest].resource_name = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->resource_name));
+		dlist[dest].resource_class = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->resource_class));
+		dlist[dest].resource_type = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->resource_type));
+		dlist[dest].resource_size = list[i]->resource_size;
+		/* trust that resource_offset isn't that big */
+		dlist[dest].resource_offset = (Cardinal)
+			-((int)(list[i]->resource_offset + 1));
+		dlist[dest].default_type = (String)
+			XrmQuarkToString(TOXRMQUARK(list[i]->default_type));
+		dlist[dest].default_addr = list[i]->default_addr;
+		dest++;
+	    }
+	}
+	*num_resources = dest;
+	UNLOCK_PROCESS;
+}
diff --git a/libXt/src/GetValues.c b/libXt/src/GetValues.c
new file mode 100644
index 000000000..f6b8e1f3b
--- /dev/null
+++ b/libXt/src/GetValues.c
@@ -0,0 +1,251 @@
+/* $Xorg: GetValues.c,v 1.4 2001/02/09 02:03:55 xorgcvs Exp $ */
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/GetValues.c,v 1.2 2001/08/22 22:52:18 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static int GetValues(
+  char*			base,		/* Base address to fetch values from */
+  XrmResourceList*      res,		/* The current resource values.      */
+  register Cardinal	num_resources,	/* number of items in resources      */
+  ArgList 		args,		/* The resource values requested     */
+  Cardinal		num_args)	/* number of items in arg list       */
+{
+    register ArgList		arg;
+    register Cardinal 		i;
+    register XrmName		argName;
+    register XrmResourceList*   xrmres;
+    int				translation_arg_num = -1;
+    static XrmQuark QCallback = NULLQUARK;
+    static XrmQuark QTranslationTable = NULLQUARK;
+
+    LOCK_PROCESS;
+    if (QCallback == NULLQUARK) {
+	QCallback = XrmPermStringToQuark(XtRCallback);
+	QTranslationTable = XrmPermStringToQuark(XtRTranslationTable);
+    }
+    UNLOCK_PROCESS;
+
+    /* Resource lists should be in compiled form already  */
+
+    for (arg = args ; num_args != 0; num_args--, arg++) {
+	argName = StringToName(arg->name);
+	for (xrmres = res, i = 0; i < num_resources; i++, xrmres++) {
+	    if (argName == (*xrmres)->xrm_name) {
+		/* hack; do special cases here instead of a get_values_hook
+		 * because get_values_hook looses info as to
+		 * whether arg->value == NULL for ancient compatibility
+		 * mode in _XtCopyToArg.  It helps performance, too...
+		 */
+		if ((*xrmres)->xrm_type == QCallback) {
+		    XtCallbackList callback = _XtGetCallbackList(
+			      (InternalCallbackList *)
+			      (base - (*xrmres)->xrm_offset - 1));
+		    _XtCopyToArg(
+			      (char*)&callback, &arg->value,
+			      (*xrmres)->xrm_size);
+		}
+		else if ((*xrmres)->xrm_type == QTranslationTable)
+		    translation_arg_num = (int) (arg - args);
+		else {
+		    _XtCopyToArg(
+			      base - (*xrmres)->xrm_offset - 1,
+			      &arg->value,
+			      (*xrmres)->xrm_size);
+		}
+		break;
+	    }
+	}
+    }
+    return translation_arg_num;
+} /* GetValues */
+
+static void CallGetValuesHook(
+    WidgetClass	  widget_class,
+    Widget	  w,
+    ArgList	  args,
+    Cardinal	  num_args)
+{
+    WidgetClass superclass;
+    XtArgsProc get_values_hook;
+
+    LOCK_PROCESS;
+    superclass = widget_class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass != NULL)
+	CallGetValuesHook (superclass, w, args, num_args);
+
+    LOCK_PROCESS;
+    get_values_hook = widget_class->core_class.get_values_hook;
+    UNLOCK_PROCESS;
+    if (get_values_hook != NULL)
+	(*get_values_hook) (w, args, &num_args);
+}
+
+
+
+static void CallConstraintGetValuesHook(
+    WidgetClass	  widget_class,
+    Widget	  w,
+    ArgList	  args,
+    Cardinal	  num_args)
+{
+    ConstraintClassExtension ext;
+
+    LOCK_PROCESS;
+    if (widget_class->core_class.superclass
+	->core_class.class_inited & ConstraintClassFlag) {
+	CallConstraintGetValuesHook
+	    (widget_class->core_class.superclass, w, args, num_args);
+    }
+
+    for (ext = (ConstraintClassExtension)((ConstraintWidgetClass)widget_class)
+		 ->constraint_class.extension;
+	 ext != NULL && ext->record_type != NULLQUARK;
+	 ext = (ConstraintClassExtension)ext->next_extension);
+
+    if (ext != NULL) {
+	if (  ext->version == XtConstraintExtensionVersion
+	      && ext->record_size == sizeof(ConstraintClassExtensionRec)) {
+	    if (ext->get_values_hook != NULL)
+		(*(ext->get_values_hook)) (w, args, &num_args);
+	} else {
+	    String params[1];
+	    Cardinal num_params = 1;
+	    params[0] = widget_class->core_class.class_name;
+	    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+		 "invalidExtension", "xtCreateWidget", XtCXtToolkitError,
+		 "widget class %s has invalid ConstraintClassExtension record",
+		 params, &num_params);
+	}
+    }
+    UNLOCK_PROCESS;
+}
+
+
+void XtGetValues(
+    register Widget   w,
+    register ArgList  args,
+    register Cardinal num_args)
+{
+    WidgetClass wc;
+    int targ;
+    XtAppContext app = XtWidgetToApplicationContext(w);
+
+    if (num_args == 0) return;
+    if ((args == NULL) && (num_args != 0)) {
+	XtAppErrorMsg(app,
+		"invalidArgCount","xtGetValues",XtCXtToolkitError,
+            "Argument count > 0 on NULL argument list in XtGetValues",
+              (String *)NULL, (Cardinal *)NULL);
+    }
+
+    LOCK_APP(app);
+    wc = XtClass(w);
+    LOCK_PROCESS;
+    /* Get widget values */
+    targ = GetValues((char*)w, (XrmResourceList *) wc->core_class.resources,
+	wc->core_class.num_resources, args, num_args);
+    UNLOCK_PROCESS;
+    if (targ != -1 && XtIsWidget(w)) {
+	XtTranslations translations = _XtGetTranslationValue(w);
+	_XtCopyToArg((char*)&translations, &args[targ].value,
+		     sizeof(XtTranslations));
+    }
+
+    /* Get constraint values if necessary */
+    /* constraints may be NULL if constraint_size==0 */
+    if (XtParent(w) != NULL && !XtIsShell(w) && XtIsConstraint(XtParent(w)) &&
+	w->core.constraints) {
+	ConstraintWidgetClass cwc
+	    = (ConstraintWidgetClass) XtClass(XtParent(w));
+	LOCK_PROCESS;
+	GetValues((char*)w->core.constraints,
+		  (XrmResourceList *)(cwc->constraint_class.resources),
+		  cwc->constraint_class.num_resources, args, num_args);
+	UNLOCK_PROCESS;
+    }
+    /* Notify any class procedures that we have performed get_values */
+    CallGetValuesHook(wc, w, args, num_args);
+
+    /* Notify constraint get_values if necessary */
+    if (XtParent(w) != NULL && !XtIsShell(w) && XtIsConstraint(XtParent(w)))
+	CallConstraintGetValuesHook(XtClass(XtParent(w)), w, args,num_args);
+    UNLOCK_APP(app);
+} /* XtGetValues */
+
+void XtGetSubvalues(
+  XtPointer	    base,           /* Base address to fetch values from */
+  XtResourceList    resources,      /* The current resource values.      */
+  Cardinal	    num_resources,  /* number of items in resources      */
+  ArgList	    args,           /* The resource values requested     */
+  Cardinal	    num_args)       /* number of items in arg list       */
+{
+    XrmResourceList* xrmres;
+    xrmres = _XtCreateIndirectionTable(resources, num_resources);
+    GetValues((char*)base, xrmres, num_resources, args, num_args);
+    XtFree((char *)xrmres);
+}
diff --git a/libXt/src/HookObj.c b/libXt/src/HookObj.c
new file mode 100644
index 000000000..f4ac749b2
--- /dev/null
+++ b/libXt/src/HookObj.c
@@ -0,0 +1,137 @@
+/* $Xorg: HookObj.c,v 1.4 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/HookObj.c,v 1.2 2001/08/22 22:52:18 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+/******************************************************************
+ *
+ * Hook Object Resources
+ *
+ ******************************************************************/
+
+static XtResource resources[] = {
+  { XtNcreateHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.createhook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNchangeHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.changehook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNconfigureHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.confighook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNgeometryHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.geometryhook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNdestroyHook, XtCCallback, XtRCallback, sizeof(XtPointer),
+    XtOffsetOf(HookObjRec, hooks.destroyhook_callbacks),
+    XtRCallback, (XtPointer)NULL},
+  { XtNshells, XtCReadOnly, XtRWidgetList, sizeof(WidgetList),
+    XtOffsetOf(HookObjRec, hooks.shells), XtRImmediate, (XtPointer) NULL },
+  { XtNnumShells, XtCReadOnly, XtRCardinal, sizeof(Cardinal),
+    XtOffsetOf(HookObjRec, hooks.num_shells), XtRImmediate, (XtPointer) 0 }
+};
+
+static void GetValuesHook(Widget widget, ArgList args, Cardinal *num_args);
+static void Initialize(Widget req, Widget new, ArgList args,
+			Cardinal *num_args);
+
+externaldef(hookobjclassrec) HookObjClassRec hookObjClassRec = {
+  { /* Object Class Part */
+    /* superclass	  */	(WidgetClass)&objectClassRec,
+    /* class_name	  */	"Hook",
+    /* widget_size	  */	sizeof(HookObjRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/	NULL,
+    /* class_inited       */	FALSE,
+    /* initialize	  */	Initialize,
+    /* initialize_hook    */	NULL,
+    /* realize		  */	NULL,
+    /* actions		  */	NULL,
+    /* num_actions	  */	0,
+    /* resources	  */	resources,
+    /* num_resources	  */	XtNumber(resources),
+    /* xrm_class	  */	NULLQUARK,
+    /* compress_motion	  */	FALSE,
+    /* compress_exposure  */	TRUE,
+    /* compress_enterleave*/ 	FALSE,
+    /* visible_interest	  */	FALSE,
+    /* destroy		  */	NULL,
+    /* resize		  */	NULL,
+    /* expose		  */	NULL,
+    /* set_values	  */	NULL,
+    /* set_values_hook    */	NULL,
+    /* set_values_almost  */	NULL,
+    /* get_values_hook    */	GetValuesHook,
+    /* accept_focus	  */	NULL,
+    /* version		  */	XtVersion,
+    /* callback_offsets   */    NULL,
+    /* tm_table           */    NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */	NULL,
+    /* extension	    */  NULL
+  },
+  { /* HookObj Class Part */
+    /* unused               */	0
+  }
+};
+
+externaldef(hookObjectClass) WidgetClass hookObjectClass =
+	(WidgetClass)&hookObjClassRec;
+
+static void FreeShellList(
+    Widget w,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    HookObject h = (HookObject)w;
+    if (h->hooks.shells != NULL)
+	XtFree((char*)h->hooks.shells);
+}
+
+static void Initialize(
+    Widget req,
+    Widget new,
+    ArgList args,
+    Cardinal* num_args)
+{
+    HookObject w = (HookObject) new;
+    w->hooks.max_shells = 0;
+    XtAddCallback (new, XtNdestroyCallback, FreeShellList, (XtPointer) NULL);
+}
+
+static void GetValuesHook(
+    Widget widget,
+    ArgList args,
+    Cardinal* num_args)
+{
+    /* get the XtNshells and XtNnumShells pseudo-resources */
+}
diff --git a/libXt/src/Hooks.c b/libXt/src/Hooks.c
new file mode 100644
index 000000000..05b67ce05
--- /dev/null
+++ b/libXt/src/Hooks.c
@@ -0,0 +1,158 @@
+/* $Xorg: Hooks.c,v 1.4 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Hooks.c,v 1.3 2001/12/14 19:56:18 dawes Exp $ */
+
+/*LINTLIBRARY*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "CreateI.h"
+
+static void FreeBlockHookList(
+    Widget widget,		/* unused (and invalid) */
+    XtPointer closure,		/* ActionHook* */
+    XtPointer call_data)	/* unused */
+{
+    BlockHook list = *(BlockHook*)closure;
+    while (list != NULL) {
+	BlockHook next = list->next;
+	XtFree( (XtPointer)list );
+	list = next;
+    }
+}
+
+
+XtBlockHookId XtAppAddBlockHook(
+    XtAppContext app,
+    XtBlockHookProc proc,
+    XtPointer closure)
+{
+    BlockHook hook = XtNew(BlockHookRec);
+    LOCK_APP(app);
+    hook->next = app->block_hook_list;
+    hook->app = app;
+    hook->proc = proc;
+    hook->closure = closure;
+    if (app->block_hook_list == NULL) {
+	_XtAddCallback( &app->destroy_callbacks,
+		        FreeBlockHookList,
+		        (XtPointer)&app->block_hook_list
+		      );
+    }
+    app->block_hook_list = hook;
+    UNLOCK_APP(app);
+    return (XtBlockHookId)hook;
+}
+
+
+void XtRemoveBlockHook(
+    XtBlockHookId id)
+{
+    BlockHook *p, hook = (BlockHook)id;
+    XtAppContext app = hook->app;
+    LOCK_APP(app);
+    for (p = &app->block_hook_list; p != NULL && *p != hook; p = &(*p)->next);
+    if (p == NULL) {
+#ifdef DEBUG
+	XtAppWarningMsg(app, "badId", "xtRemoveBlockHook", XtCXtToolkitError,
+			"XtRemoveBlockHook called with bad or old hook id",
+			(String*)NULL, (Cardinal*)NULL);
+#endif /*DEBUG*/
+	UNLOCK_APP(app);
+	return;
+    }
+    *p = hook->next;
+    XtFree( (XtPointer)hook );
+    UNLOCK_APP(app);
+}
+
+static void DeleteShellFromHookObj(
+    Widget shell,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    /* app_con is locked when this function is called */
+    Cardinal ii, jj;
+    HookObject ho = (HookObject) closure;
+
+    for (ii = 0; ii < ho->hooks.num_shells; ii++)
+	if (ho->hooks.shells[ii] == shell) {
+	    /* collapse the list */
+	    for (jj = ii; jj < ho->hooks.num_shells; jj++) {
+		if ((jj+1) < ho->hooks.num_shells)
+		    ho->hooks.shells[jj] = ho->hooks.shells[jj+1];
+	    }
+	    break;
+	}
+    ho->hooks.num_shells--;
+}
+
+#define SHELL_INCR 4
+
+void _XtAddShellToHookObj(
+    Widget shell)
+{
+    /* app_con is locked when this function is called */
+    HookObject ho = (HookObject) XtHooksOfDisplay(XtDisplay(shell));
+
+    if (ho->hooks.num_shells == ho->hooks.max_shells) {
+	ho->hooks.max_shells += SHELL_INCR;
+	ho->hooks.shells =
+	    (WidgetList)XtRealloc((char*)ho->hooks.shells,
+		ho->hooks.max_shells * sizeof (Widget));
+    }
+    ho->hooks.shells[ho->hooks.num_shells++] = shell;
+
+    XtAddCallback(shell, XtNdestroyCallback, DeleteShellFromHookObj,
+		  (XtPointer)ho);
+}
+
+Boolean _XtIsHookObject(
+    Widget widget)
+{
+    return (widget->core.widget_class == hookObjectClass);
+}
+
+Widget XtHooksOfDisplay(
+    Display* dpy)
+{
+    Widget retval;
+    XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    if (pd->hook_object == NULL)
+	pd->hook_object =
+	    _XtCreateHookObj((Screen*)DefaultScreenOfDisplay(dpy));
+    retval = pd->hook_object;
+    UNLOCK_APP(app);
+    return retval;
+}
diff --git a/libXt/src/Initialize.c b/libXt/src/Initialize.c
new file mode 100644
index 000000000..f2c9c683d
--- /dev/null
+++ b/libXt/src/Initialize.c
@@ -0,0 +1,1054 @@
+/* $Xorg: Initialize.c,v 1.8 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Initialize.c,v 3.21 2003/04/21 16:34:27 herrb Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+/* Make sure all wm properties can make it out of the resource manager */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "CoreP.h"
+#include "ShellP.h"
+#include <stdio.h>
+#include <X11/Xlocale.h>
+#ifdef XTHREADS
+#include <X11/Xthreads.h>
+#endif
+#ifndef WIN32
+#define X_INCLUDE_PWD_H
+#define XOS_USE_XT_LOCKING
+#include <X11/Xos_r.h>
+#endif
+
+#include <stdlib.h>
+
+#if (defined(SUNSHLIB) || defined(AIXSHLIB)) && defined(SHAREDCODE)
+/*
+ * If used as a shared library, generate code under a different name so that
+ * the stub routines in sharedlib.c get loaded into the application binary.
+ */
+#define XtToolkitInitialize _XtToolkitInitialize
+#define XtOpenApplication _XtOpenApplication
+#define XtAppInitialize _XtAppInitialize
+#define XtInitialize _XtInitialize
+#endif /* (SUNSHLIB || AIXSHLIB) && SHAREDCODE */
+
+/*
+ * hpux
+ * Hand-patched versions of HP-UX prior to version 7.0 can usefully add
+ * -DUSE_UNAME in the appropriate config file to get long hostnames.
+ */
+
+#ifdef USG
+#define USE_UNAME
+#endif
+
+#ifdef USE_UNAME
+#include <sys/utsname.h>
+#endif
+
+/* some unspecified magic number of expected search levels for Xrm */
+#define SEARCH_LIST_SIZE 1000
+
+/*
+ This is a set of default records describing the command line arguments that
+ Xlib will parse and set into the resource data base.
+
+ This list is applied before the users list to enforce these defaults.  This is
+ policy, which the toolkit avoids but I hate differing programs at this level.
+*/
+
+static XrmOptionDescRec const opTable[] = {
+{"+rv",		"*reverseVideo", XrmoptionNoArg,	(XtPointer) "off"},
+{"+synchronous","*synchronous",	XrmoptionNoArg,		(XtPointer) "off"},
+{"-background",	"*background",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-bd",		"*borderColor",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-bg",		"*background",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-bordercolor","*borderColor",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-borderwidth",".borderWidth",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-bw",		".borderWidth",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-display",	".display",     XrmoptionSepArg,	(XtPointer) NULL},
+{"-fg",		"*foreground",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-fn",		"*font",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-font",	"*font",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-foreground",	"*foreground",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-geometry",	".geometry",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-iconic",	".iconic",	XrmoptionNoArg,		(XtPointer) "on"},
+{"-name",	".name",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-reverse",	"*reverseVideo", XrmoptionNoArg,	(XtPointer) "on"},
+{"-rv",		"*reverseVideo", XrmoptionNoArg,	(XtPointer) "on"},
+{"-selectionTimeout",
+		".selectionTimeout", XrmoptionSepArg,	(XtPointer) NULL},
+{"-synchronous","*synchronous",	XrmoptionNoArg,		(XtPointer) "on"},
+{"-title",	".title",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-xnllanguage",".xnlLanguage",	XrmoptionSepArg,	(XtPointer) NULL},
+{"-xrm",	NULL,		XrmoptionResArg,	(XtPointer) NULL},
+{"-xtsessionID",".sessionID",	XrmoptionSepArg,	(XtPointer) NULL},
+};
+
+
+/*
+ * GetHostname - emulates gethostname() on non-bsd systems.
+ */
+
+static void GetHostname (
+    char *buf,
+    int maxlen)
+{
+#ifdef USE_UNAME
+    int len;
+    struct utsname name;
+
+    if (maxlen <= 0 || buf == NULL)
+	return;
+
+    uname (&name);
+    len = strlen (name.nodename);
+    if (len >= maxlen) len = maxlen;
+    (void) strncpy (buf, name.nodename, len-1);
+    buf[len-1] = '\0';
+#else
+    if (maxlen <= 0 || buf == NULL)
+	return;
+
+    buf[0] = '\0';
+    (void) gethostname (buf, maxlen);
+    buf [maxlen - 1] = '\0';
+#endif
+}
+
+
+#ifdef SUNSHLIB
+void _XtInherit(void)
+{
+    extern void __XtInherit();
+    __XtInherit();
+}
+#define _XtInherit __XtInherit
+#endif
+
+
+#if defined (WIN32) || defined(__CYGWIN__)
+/*
+ * The Symbol _XtInherit is used in two different manners.
+ * First it could be used as a generic function and second
+ * as an absolute address reference, which will be used to
+ * check the initialisation process of several other libraries.
+ * Because of this the symbol must be accessable by all
+ * client dll's and applications.  In unix environments
+ * this is no problem, because the used shared libraries
+ * format (elf) supports this immediatly.  Under Windows
+ * this isn't true, because a functions address in a dll
+ * is different from the same function in another dll or
+ * applications, because the used Portable Executable
+ * File adds a code stub to each client to provide the
+ * exported symbol name.  This stub uses an indirect
+ * pointer to get the original symbol address, which is
+ * then jumped to, like in this example:
+ *
+ * --- client ---                                     --- dll ----
+ *  ...
+ *  call foo
+ *
+ * foo: jmp (*_imp_foo)               ---->           foo: ....
+ *      nop
+ *      nop
+ *
+ * _imp_foo: .long <index of foo in dll export table, is
+ *		    set to the real address by the runtime linker>
+ *
+ * Now it is clear why the clients symbol foo isn't the same
+ * as in the dll and we can think about how to deal which
+ * this two above mentioned requirements, to export this
+ * symbol to all clients and to allow calling this symbol
+ * as a function.  The solution I've used exports the
+ * symbol _XtInherit as data symbol, because global data
+ * symbols are exported to all clients.  But how to deal
+ * with the second requirement, that this symbol should
+ * be used as function.  The Trick is to build a little
+ * code stub in the data section in the exact manner as
+ * above explained.  This is done with the assembler code
+ * below.
+ *
+ * Ralf Habacker
+ *
+ * References:
+ * msdn          http://msdn.microsoft.com/msdnmag/issues/02/02/PE/PE.asp
+ * cygwin-xfree: http://www.cygwin.com/ml/cygwin-xfree/2003-10/msg00000.html
+ */
+
+asm (".data\n\
+ .globl __XtInherit        \n\
+ __XtInherit:      jmp *_y \n\
+  _y: .long ___XtInherit   \n\
+    .text                 \n");
+
+#define _XtInherit __XtInherit
+#endif
+
+
+void _XtInherit(void)
+{
+    XtErrorMsg("invalidProcedure","inheritanceProc",XtCXtToolkitError,
+            "Unresolved inheritance operation",
+              (String *)NULL, (Cardinal *)NULL);
+}
+
+
+void XtToolkitInitialize(void)
+{
+    static Boolean initialized = False;
+
+    LOCK_PROCESS;
+    if (initialized) {
+	UNLOCK_PROCESS;
+	return;
+    }
+    initialized = True;
+    UNLOCK_PROCESS;
+    /* Resource management initialization */
+    XrmInitialize();
+    _XtResourceListInitialize();
+
+    /* Other intrinsic intialization */
+    _XtConvertInitialize();
+    _XtEventInitialize();
+    _XtTranslateInitialize();
+
+    /* Some apps rely on old (broken) XtAppPeekEvent behavior */
+    if(getenv("XTAPPPEEKEVENT_SKIPTIMER"))
+	XtAppPeekEvent_SkipTimer = True;
+    else
+	XtAppPeekEvent_SkipTimer = False;
+}
+
+
+String _XtGetUserName(
+    String dest,
+    int len)
+{
+#ifdef WIN32
+    String ptr = NULL;
+
+    if ((ptr = getenv("USERNAME"))) {
+	(void) strncpy (dest, ptr, len-1);
+	dest[len-1] = '\0';
+    } else
+	*dest = '\0';
+#else
+#ifdef X_NEEDS_PWPARAMS
+    _Xgetpwparams pwparams;
+#endif
+    struct passwd *pw;
+    char* ptr;
+
+    if ((ptr = getenv("USER"))) {
+	(void) strncpy (dest, ptr, len-1);
+	dest[len-1] = '\0';
+    } else {
+	if ((pw = _XGetpwuid(getuid(),pwparams)) != NULL) {
+	    (void) strncpy (dest, pw->pw_name, len-1);
+	    dest[len-1] = '\0';
+	} else
+	    *dest = '\0';
+    }
+#endif
+    return dest;
+}
+
+
+static String GetRootDirName(
+    String dest,
+    int len)
+{
+#ifdef WIN32
+    register char *ptr1;
+    register char *ptr2 = NULL;
+    int len1 = 0, len2 = 0;
+
+    if (ptr1 = getenv("HOME")) {	/* old, deprecated */
+	len1 = strlen (ptr1);
+    } else if ((ptr1 = getenv("HOMEDRIVE")) && (ptr2 = getenv("HOMEDIR"))) {
+	len1 = strlen (ptr1);
+	len2 = strlen (ptr2);
+    } else if (ptr2 = getenv("USERNAME")) {
+	len1 = strlen (ptr1 = "/users/");
+	len2 = strlen (ptr2);
+    }
+    if ((len1 + len2 + 1) < len)
+	sprintf (dest, "%s%s", ptr1, (ptr2) ? ptr2 : "");
+    else
+	*dest = '\0';
+#else
+#ifdef X_NEEDS_PWPARAMS
+    _Xgetpwparams pwparams;
+#endif
+    struct passwd *pw;
+    static char *ptr;
+
+    if (len <= 0 || dest == NULL)
+	return NULL;
+
+    if ((ptr = getenv("HOME"))) {
+	(void) strncpy (dest, ptr, len-1);
+	dest[len-1] = '\0';
+    } else {
+	if ((ptr = getenv("USER")))
+	    pw = _XGetpwnam(ptr,pwparams);
+	else
+ 	    pw = _XGetpwuid(getuid(),pwparams);
+	if (pw != NULL) {
+	    (void) strncpy (dest, pw->pw_dir, len-1);
+	    dest[len-1] = '\0';
+	} else
+	    *dest = '\0';
+    }
+#endif
+    return dest;
+}
+
+static void CombineAppUserDefaults(
+    Display *dpy,
+    XrmDatabase *pdb)
+{
+    char* filename;
+    char* path;
+    Boolean deallocate = False;
+
+    if (!(path = getenv("XUSERFILESEARCHPATH"))) {
+#if !defined(WIN32) || !defined(__MINGW32__)
+	char *old_path;
+	char homedir[PATH_MAX];
+	GetRootDirName(homedir, PATH_MAX);
+	if (!(old_path = getenv("XAPPLRESDIR"))) {
+	    char *path_default = "%s/%%L/%%N%%C:%s/%%l/%%N%%C:%s/%%N%%C:%s/%%L/%%N:%s/%%l/%%N:%s/%%N";
+	    if (!(path =
+		  ALLOCATE_LOCAL(6*strlen(homedir) + strlen(path_default))))
+		_XtAllocError(NULL);
+	    sprintf( path, path_default,
+		    homedir, homedir, homedir, homedir, homedir, homedir );
+	} else {
+	    char *path_default = "%s/%%L/%%N%%C:%s/%%l/%%N%%C:%s/%%N%%C:%s/%%N%%C:%s/%%L/%%N:%s/%%l/%%N:%s/%%N:%s/%%N";
+	    if (!(path =
+		  ALLOCATE_LOCAL( 6*strlen(old_path) + 2*strlen(homedir)
+				 + strlen(path_default))))
+		_XtAllocError(NULL);
+	    sprintf(path, path_default, old_path, old_path, old_path, homedir,
+		    old_path, old_path, old_path, homedir );
+	}
+	deallocate = True;
+#endif
+    }
+
+    filename = XtResolvePathname(dpy, NULL, NULL, NULL, path, NULL, 0, NULL);
+    if (filename) {
+	(void)XrmCombineFileDatabase(filename, pdb, False);
+	XtFree(filename);
+    }
+
+    if (deallocate) DEALLOCATE_LOCAL(path);
+}
+
+static void CombineUserDefaults(
+    Display *dpy,
+    XrmDatabase *pdb)
+{
+#ifdef __MINGW32__
+    char *slashDotXdefaults = "/Xdefaults";
+#else
+    char *slashDotXdefaults = "/.Xdefaults";
+#endif
+    char *dpy_defaults = XResourceManagerString(dpy);
+
+    if (dpy_defaults) {
+	XrmCombineDatabase(XrmGetStringDatabase(dpy_defaults), pdb, False);
+    } else {
+	char filename[PATH_MAX];
+	(void) GetRootDirName(filename,
+			PATH_MAX - strlen (slashDotXdefaults) - 1);
+	(void) strcat(filename, slashDotXdefaults);
+	(void)XrmCombineFileDatabase(filename, pdb, False);
+    }
+}
+
+/*ARGSUSED*/
+static Bool StoreDBEntry(
+    XrmDatabase		*db,
+    XrmBindingList      bindings,
+    XrmQuarkList	quarks,
+    XrmRepresentation   *type,
+    XrmValuePtr		value,
+    XPointer		data)
+{
+    XrmQPutResource((XrmDatabase *)data, bindings, quarks, *type, value);
+    return False;
+}
+
+static XrmDatabase CopyDB(XrmDatabase db)
+{
+    XrmDatabase copy = NULL;
+    XrmQuark empty = NULLQUARK;
+
+    XrmEnumerateDatabase(db, &empty, &empty, XrmEnumAllLevels,
+			 StoreDBEntry, (XPointer)&copy);
+    return copy;
+}
+
+/*ARGSUSED*/
+static String _XtDefaultLanguageProc(
+    Display   *dpy,	/* unused */
+    String     xnl,
+    XtPointer  closure)	/* unused */
+{
+    if (! setlocale(LC_ALL, xnl))
+	XtWarning("locale not supported by C library, locale unchanged");
+
+    if (! XSupportsLocale()) {
+	XtWarning("locale not supported by Xlib, locale set to C");
+	setlocale(LC_ALL, "C");
+    }
+    if (! XSetLocaleModifiers(""))
+	XtWarning("X locale modifiers not supported, using default");
+
+    return setlocale(LC_ALL, NULL); /* re-query in case overwritten */
+}
+
+XtLanguageProc XtSetLanguageProc(
+    XtAppContext      app,
+    XtLanguageProc    proc,
+    XtPointer         closure)
+{
+    XtLanguageProc    old;
+
+    if (!proc) {
+	proc = _XtDefaultLanguageProc;
+	closure = NULL;
+    }
+
+    if (app) {
+	LOCK_APP(app);
+	LOCK_PROCESS;
+	/* set langProcRec only for this application context */
+        old = app->langProcRec.proc;
+        app->langProcRec.proc = proc;
+        app->langProcRec.closure = closure;
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+    } else {
+	/* set langProcRec for all application contexts */
+        ProcessContext process;
+
+	LOCK_PROCESS;
+        process = _XtGetProcessContext();
+        old = process->globalLangProcRec.proc;
+	process->globalLangProcRec.proc = proc;
+	process->globalLangProcRec.closure = closure;
+        app = process->appContextList;
+        while (app) {
+            app->langProcRec.proc = proc;
+            app->langProcRec.closure = closure;
+	    app = app->next;
+        }
+	UNLOCK_PROCESS;
+    }
+    return (old ? old : _XtDefaultLanguageProc);
+}
+
+XrmDatabase XtScreenDatabase(
+    Screen *screen)
+{
+    int scrno;
+    Bool doing_def;
+    XrmDatabase db, olddb;
+    XtPerDisplay pd;
+    Status do_fallback;
+    char *scr_resources;
+    Display *dpy = DisplayOfScreen(screen);
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (screen == DefaultScreenOfDisplay(dpy)) {
+	scrno = DefaultScreen(dpy);
+	doing_def = True;
+    } else {
+	scrno = XScreenNumberOfScreen(screen);
+	doing_def = False;
+    }
+    pd = _XtGetPerDisplay(dpy);
+    if ((db = pd->per_screen_db[scrno])) {
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+	return (doing_def ? XrmGetDatabase(dpy) : db);
+    }
+    scr_resources = XScreenResourceString(screen);
+
+    if (ScreenCount(dpy) == 1) {
+	db = pd->cmd_db;
+	pd->cmd_db = NULL;
+    } else {
+	db = CopyDB(pd->cmd_db);
+    }
+    {   /* Environment defaults */
+	char	filenamebuf[PATH_MAX];
+	char	*filename;
+
+	if (!(filename = getenv("XENVIRONMENT"))) {
+	    int len;
+#ifdef __MINGW32__
+	    char *slashDotXdefaultsDash = "/Xdefaults-";
+#else
+	    char *slashDotXdefaultsDash = "/.Xdefaults-";
+#endif
+
+	    (void) GetRootDirName(filename = filenamebuf,
+			PATH_MAX - strlen (slashDotXdefaultsDash) - 1);
+	    (void) strcat(filename, slashDotXdefaultsDash);
+	    len = strlen(filename);
+	    GetHostname (filename+len, PATH_MAX-len);
+	}
+	(void)XrmCombineFileDatabase(filename, &db, False);
+    }
+    if (scr_resources)
+    {   /* Screen defaults */
+	XrmCombineDatabase(XrmGetStringDatabase(scr_resources), &db, False);
+	XFree(scr_resources);
+    }
+    /* Server or host defaults */
+    if (!pd->server_db)
+	CombineUserDefaults(dpy, &db);
+    else {
+	(void) XrmCombineDatabase(pd->server_db, &db, False);
+	pd->server_db = NULL;
+    }
+
+    if (!db)
+	db = XrmGetStringDatabase("");
+    pd->per_screen_db[scrno] = db;
+    olddb = XrmGetDatabase(dpy);
+    /* set database now, for XtResolvePathname to use */
+    XrmSetDatabase(dpy, db);
+    CombineAppUserDefaults(dpy, &db);
+    do_fallback = 1;
+    {   /* System app-defaults */
+	char	*filename;
+
+	if ((filename = XtResolvePathname(dpy, "app-defaults",
+					 NULL, NULL, NULL, NULL, 0, NULL))) {
+	    do_fallback = !XrmCombineFileDatabase(filename, &db, False);
+	    XtFree(filename);
+	}
+    }
+    /* now restore old database, if need be */
+    if (!doing_def)
+	XrmSetDatabase(dpy, olddb);
+    if (do_fallback && pd->appContext->fallback_resources)
+    {   /* Fallback defaults */
+        XrmDatabase fdb = NULL;
+	String *res;
+
+	for (res = pd->appContext->fallback_resources; *res; res++)
+	    XrmPutLineResource(&fdb, *res);
+	(void)XrmCombineDatabase(fdb, &db, False);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return db;
+}
+
+/*
+ * Merge two option tables, allowing the second to over-ride the first,
+ * so that ambiguous abbreviations can be noticed.  The merge attempts
+ * to make the resulting table lexicographically sorted, but succeeds
+ * only if the first source table is sorted.  Though it _is_ recommended
+ * (for optimizations later in XrmParseCommand), it is not required
+ * that either source table be sorted.
+ *
+ * Caller is responsible for freeing the returned option table.
+ */
+
+static void _MergeOptionTables(
+    const XrmOptionDescRec *src1,
+    Cardinal num_src1,
+    const XrmOptionDescRec *src2,
+    Cardinal num_src2,
+    XrmOptionDescRec **dst,
+    Cardinal *num_dst)
+{
+    XrmOptionDescRec *table, *endP;
+    register XrmOptionDescRec *opt1, *whereP, *dstP;
+    register const XrmOptionDescRec *opt2;
+    int i1;
+    Cardinal i2;
+    int dst_len, order;
+    Boolean found;
+    enum {Check, NotSorted, IsSorted} sort_order = Check;
+
+    *dst = table = (XrmOptionDescRec*)
+	__XtMalloc( sizeof(XrmOptionDescRec) * (num_src1 + num_src2) );
+
+    (void) memmove(table, src1, sizeof(XrmOptionDescRec) * num_src1 );
+    if (num_src2 == 0) {
+	*num_dst = num_src1;
+	return;
+    }
+    endP = &table[dst_len = num_src1];
+    for (opt2 = src2, i2= 0; i2 < num_src2; opt2++, i2++) {
+	found = False;
+	whereP = endP-1;	/* assume new option goes at the end */
+	for (opt1 = table, i1 = 0; i1 < dst_len; opt1++, i1++) {
+	    /* have to walk the entire new table so new list is ordered
+	       (if src1 was ordered) */
+	    if (sort_order == Check && i1 > 0
+		&& strcmp(opt1->option, (opt1-1)->option) < 0)
+		sort_order = NotSorted;
+	    if ((order = strcmp(opt1->option, opt2->option)) == 0) {
+		/* same option names; just overwrite opt1 with opt2 */
+		*opt1 = *opt2;
+		found = True;
+		break;
+		}
+	    /* else */
+	    if (sort_order == IsSorted && order > 0) {
+		/* insert before opt1 to preserve order */
+		/* shift rest of table forward to make room for new entry */
+		for (dstP = endP++; dstP > opt1; dstP--)
+		    *dstP = *(dstP-1);
+		*opt1 = *opt2;
+		dst_len++;
+		found = True;
+		break;
+	    }
+	    /* else */
+	    if (order < 0)
+		/* opt2 sorts after opt1, so remember this position */
+		whereP = opt1;
+	}
+	if (sort_order == Check && i1 == dst_len)
+	    sort_order = IsSorted;
+	if (!found) {
+	   /* when we get here, whereP points to the last entry in the
+	      destination that sorts before "opt2".  Shift rest of table
+	      forward and insert "opt2" after whereP. */
+	    whereP++;
+	    for (dstP = endP++; dstP > whereP; dstP--)
+		*dstP = *(dstP-1);
+	    *whereP = *opt2;
+	    dst_len++;
+	}
+    }
+    *num_dst = dst_len;
+}
+
+
+/* NOTE: name, class, and type must be permanent strings */
+static Boolean _GetResource(
+    Display *dpy,
+    XrmSearchList list,
+    String name,
+    String class,
+    String type,
+    XrmValue* value)
+{
+    XrmRepresentation db_type;
+    XrmValue db_value;
+    XrmName Qname = XrmPermStringToQuark(name);
+    XrmClass Qclass = XrmPermStringToQuark(class);
+    XrmRepresentation Qtype = XrmPermStringToQuark(type);
+
+    if (XrmQGetSearchResource(list, Qname, Qclass, &db_type, &db_value)) {
+	if (db_type == Qtype) {
+	    if (Qtype == _XtQString)
+		*(String*)value->addr = db_value.addr;
+	    else
+		(void) memmove(value->addr, db_value.addr, value->size );
+	    return True;
+	} else {
+	    WidgetRec widget; /* hack, hack */
+	    bzero( &widget, sizeof(widget) );
+	    widget.core.self = &widget;
+	    widget.core.widget_class = coreWidgetClass;
+	    widget.core.screen = (Screen*)DefaultScreenOfDisplay(dpy);
+	    XtInitializeWidgetClass(coreWidgetClass);
+	    if (_XtConvert(&widget,db_type,&db_value,Qtype,value,NULL)) {
+		return True;
+	    }
+	}
+    }
+    return False;
+}
+
+XrmDatabase _XtPreparseCommandLine(
+    XrmOptionDescRec *urlist,
+    Cardinal num_urs,
+    int argc,
+    String *argv,
+    /* return */
+    String *applName,
+    String *displayName,
+    String *language)
+{
+    XrmDatabase db = NULL;
+    XrmOptionDescRec *options;
+    Cardinal num_options;
+    XrmName name_list[3];
+    XrmName class_list[3];
+    XrmRepresentation type;
+    XrmValue val;
+    String *targv;
+    int targc = argc;
+
+    targv = (String *) __XtMalloc(sizeof(char *) * argc);
+    (void) memmove(targv, argv, sizeof(char *) * argc);
+    _MergeOptionTables(opTable, XtNumber(opTable), urlist, num_urs,
+		       &options, &num_options);
+    name_list[0] = class_list[0] = XrmPermStringToQuark(".");
+    name_list[2] = class_list[2] = NULLQUARK;
+    XrmParseCommand(&db, options, num_options, ".", &targc, targv);
+    if (applName) {
+	name_list[1] = XrmPermStringToQuark("name");
+	if (XrmQGetResource(db, name_list, name_list, &type, &val) &&
+	    type == _XtQString)
+	    *applName = val.addr;
+    }
+    if (displayName) {
+	name_list[1] = XrmPermStringToQuark("display");
+	if (XrmQGetResource(db, name_list, name_list, &type, &val) &&
+	    type == _XtQString)
+	    *displayName = val.addr;
+    }
+    if (language) {
+	name_list[1] = XrmPermStringToQuark("xnlLanguage");
+	class_list[1] = XrmPermStringToQuark("XnlLanguage");
+	if (XrmQGetResource(db, name_list, class_list, &type, &val) &&
+	    type == _XtQString)
+	    *language = val.addr;
+    }
+
+    XtFree((char *)targv);
+    XtFree((char *)options);
+    return db;
+}
+
+
+static void GetLanguage(
+    Display *dpy,
+    XtPerDisplay pd)
+{
+    XrmRepresentation type;
+    XrmValue value;
+    XrmName name_list[3];
+    XrmName class_list[3];
+
+    LOCK_PROCESS;
+    if (! pd->language) {
+	name_list[0] = pd->name;
+	name_list[1] = XrmPermStringToQuark("xnlLanguage");
+	class_list[0] = pd->class;
+	class_list[1] = XrmPermStringToQuark("XnlLanguage");
+	name_list[2] = class_list[2] = NULLQUARK;
+	if (!pd->server_db)
+	    CombineUserDefaults(dpy, &pd->server_db);
+	if (pd->server_db &&
+	    XrmQGetResource(pd->server_db,name_list,class_list, &type, &value)
+	    && type == _XtQString)
+	    pd->language = (char *) value.addr;
+    }
+
+    if (pd->appContext->langProcRec.proc) {
+	if (! pd->language) pd->language = "";
+	pd->language = (*pd->appContext->langProcRec.proc)
+	    (dpy, pd->language, pd->appContext->langProcRec.closure);
+    }
+    else if (! pd->language || pd->language[0] == '\0') /* R4 compatibility */
+	pd->language = getenv("LANG");
+
+    if (pd->language) pd->language = XtNewString(pd->language);
+    UNLOCK_PROCESS;
+}
+
+static void ProcessInternalConnection (
+    XtPointer client_data,
+    int* fd,
+    XtInputId* id)
+{
+    XProcessInternalConnection ((Display *) client_data, *fd);
+}
+
+static void ConnectionWatch (
+    Display* dpy,
+    XPointer client_data,
+    int fd,
+    Bool opening,
+    XPointer* watch_data)
+{
+    XtInputId* iptr;
+    XtAppContext app = XtDisplayToApplicationContext(dpy);
+
+    if (opening) {
+	iptr = (XtInputId *) __XtMalloc(sizeof(XtInputId));
+	*iptr = XtAppAddInput(app, fd, (XtPointer) XtInputReadMask,
+			      ProcessInternalConnection, client_data);
+	*watch_data = (XPointer) iptr;
+    } else {
+	iptr = (XtInputId *) *watch_data;
+	XtRemoveInput(*iptr);
+        (void) XtFree(*watch_data);
+    }
+}
+
+void _XtDisplayInitialize(
+	Display *dpy,
+        XtPerDisplay pd,
+	_Xconst char* name,
+	XrmOptionDescRec *urlist,
+	Cardinal num_urs,
+	int *argc,
+	char **argv)
+{
+	Boolean tmp_bool;
+	XrmValue value;
+	XrmOptionDescRec *options;
+	Cardinal num_options;
+	XrmDatabase db;
+	XrmName name_list[2];
+	XrmClass class_list[2];
+	XrmHashTable* search_list;
+	int search_list_size = SEARCH_LIST_SIZE;
+
+	GetLanguage(dpy, pd);
+
+	/* Parse the command line and remove Xt arguments from argv */
+	_MergeOptionTables( opTable, XtNumber(opTable), urlist, num_urs,
+			    &options, &num_options );
+	XrmParseCommand(&pd->cmd_db, options, num_options, name, argc, argv);
+
+	db = XtScreenDatabase(DefaultScreenOfDisplay(dpy));
+
+	if (!(search_list = (XrmHashTable*)
+		       ALLOCATE_LOCAL( SEARCH_LIST_SIZE*sizeof(XrmHashTable))))
+	    _XtAllocError(NULL);
+	name_list[0] = pd->name;
+	class_list[0] = pd->class;
+	name_list[1] = NULLQUARK;
+	class_list[1] = NULLQUARK;
+
+	while (!XrmQGetSearchList(db, name_list, class_list,
+				  search_list, search_list_size)) {
+	    XrmHashTable* old = search_list;
+	    Cardinal size = (search_list_size*=2)*sizeof(XrmHashTable);
+	    if (!(search_list = (XrmHashTable*)ALLOCATE_LOCAL(size)))
+		_XtAllocError(NULL);
+	    (void) memmove((char*)search_list, (char*)old, (size>>1) );
+	    DEALLOCATE_LOCAL(old);
+	}
+
+	value.size = sizeof(tmp_bool);
+	value.addr = (XtPointer)&tmp_bool;
+	if (_GetResource(dpy, search_list, "synchronous", "Synchronous",
+			 XtRBoolean, &value)) {
+	    int i;
+	    Display **dpyP = pd->appContext->list;
+	    pd->appContext->sync = tmp_bool;
+	    for (i = pd->appContext->count; i; dpyP++, i--) {
+		(void) XSynchronize(*dpyP, (Bool)tmp_bool);
+	    }
+	} else {
+	    (void) XSynchronize(dpy, (Bool)pd->appContext->sync);
+	}
+
+	if (_GetResource(dpy, search_list, "reverseVideo", "ReverseVideo",
+			 XtRBoolean, &value)
+	        && tmp_bool) {
+	    pd->rv = True;
+	}
+
+	value.size = sizeof(pd->multi_click_time);
+	value.addr = (XtPointer)&pd->multi_click_time;
+	if (!_GetResource(dpy, search_list,
+			  "multiClickTime", "MultiClickTime",
+			  XtRInt, &value)) {
+	    pd->multi_click_time = 200;
+	}
+
+	value.size = sizeof(pd->appContext->selectionTimeout);
+	value.addr = (XtPointer)&pd->appContext->selectionTimeout;
+	(void)_GetResource(dpy, search_list,
+			   "selectionTimeout", "SelectionTimeout",
+			   XtRInt, &value);
+
+#ifndef NO_IDENTIFY_WINDOWS
+	value.size = sizeof(pd->appContext->identify_windows);
+	value.addr = (XtPointer)&pd->appContext->identify_windows;
+	(void)_GetResource(dpy, search_list,
+			   "xtIdentifyWindows", "XtDebug",
+			   XtRBoolean, &value);
+#endif
+
+	XAddConnectionWatch(dpy, ConnectionWatch, (XPointer) dpy);
+
+	XtFree( (XtPointer)options );
+	DEALLOCATE_LOCAL( search_list );
+}
+
+/*	Function Name: XtAppSetFallbackResources
+ *	Description: Sets the fallback resource list that will be loaded
+ *                   at display initialization time.
+ *	Arguments: app_context - the app context.
+ *                 specification_list - the resource specification list.
+ *	Returns: none.
+ */
+
+void
+XtAppSetFallbackResources(
+    XtAppContext app_context,
+    String *specification_list)
+{
+    LOCK_APP(app_context);
+    app_context->fallback_resources = specification_list;
+    UNLOCK_APP(app_context);
+}
+
+
+Widget XtOpenApplication(XtAppContext *app_context_return,
+			 _Xconst char *application_class,
+			 XrmOptionDescRec *options, Cardinal num_options,
+			 int *argc_in_out, String *argv_in_out,
+			 String *fallback_resources, WidgetClass widget_class,
+			 ArgList args_in, Cardinal num_args_in)
+{
+    XtAppContext app_con;
+    Display * dpy;
+    register int saved_argc = *argc_in_out;
+    Widget root;
+    Arg args[3], *merged_args;
+    Cardinal num = 0;
+
+    XtToolkitInitialize(); /* cannot be moved into _XtAppInit */
+
+    dpy = _XtAppInit(&app_con, (String)application_class, options, num_options,
+		     argc_in_out, &argv_in_out, fallback_resources);
+
+    LOCK_APP(app_con);
+    XtSetArg(args[num], XtNscreen, DefaultScreenOfDisplay(dpy)); num++;
+    XtSetArg(args[num], XtNargc, saved_argc);	                 num++;
+    XtSetArg(args[num], XtNargv, argv_in_out);	                 num++;
+
+    merged_args = XtMergeArgLists(args_in, num_args_in, args, num);
+    num += num_args_in;
+
+    root = XtAppCreateShell(NULL, application_class, widget_class, dpy,
+			    merged_args, num);
+
+    if (app_context_return)
+	*app_context_return = app_con;
+
+    XtFree((XtPointer)merged_args);
+    XtFree((XtPointer)argv_in_out);
+    UNLOCK_APP(app_con);
+    return root;
+}
+
+
+Widget
+XtAppInitialize(
+    XtAppContext * app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ArgList args_in,
+    Cardinal num_args_in)
+{
+    return XtOpenApplication(app_context_return, application_class,
+			     options, num_options,
+			     argc_in_out, argv_in_out, fallback_resources,
+			     applicationShellWidgetClass,
+			     args_in, num_args_in);
+}
+
+
+/*ARGSUSED*/
+Widget
+XtInitialize(
+    _Xconst char* name,
+    _Xconst char* classname,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc,
+    String *argv)
+{
+    Widget root;
+    XtAppContext app_con;
+    register ProcessContext process = _XtGetProcessContext();
+
+    root = XtAppInitialize(&app_con, classname, options, num_options,
+			   argc, argv, NULL, NULL, (Cardinal) 0);
+
+    LOCK_PROCESS;
+    process->defaultAppContext = app_con;
+    UNLOCK_PROCESS;
+    return root;
+}
diff --git a/libXt/src/Intrinsic.c b/libXt/src/Intrinsic.c
new file mode 100644
index 000000000..c3b6f5d98
--- /dev/null
+++ b/libXt/src/Intrinsic.c
@@ -0,0 +1,1600 @@
+/* $Xorg: Intrinsic.c,v 1.4 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Intrinsic.c,v 3.22 2003/01/12 03:55:46 tsi Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#define INTRINSIC_C
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"        /* for geoTattler */
+#ifndef NO_IDENTIFY_WINDOWS
+#include <X11/Xatom.h>
+#endif
+#ifndef VMS
+#include <sys/stat.h>
+#endif /* VMS */
+
+#include <stdlib.h>
+
+String XtCXtToolkitError = "XtToolkitError";
+
+Boolean XtIsSubclass(
+    Widget    widget,
+    WidgetClass widgetClass)
+{
+    register WidgetClass w;
+    Boolean retval = FALSE;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    for (w = widget->core.widget_class; w != NULL; w = w->core_class.superclass)
+	if (w == widgetClass) {
+	    retval = TRUE;
+	    break;
+	}
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtIsSubclass */
+
+
+Boolean _XtCheckSubclassFlag(
+    Widget object,
+    _XtXtEnum flag)
+{
+    Boolean retval;
+
+    LOCK_PROCESS;
+    if (object->core.widget_class->core_class.class_inited & flag)
+	retval = TRUE;
+    else
+	retval = FALSE;
+    UNLOCK_PROCESS;
+    return retval;
+} /*_XtVerifySubclass */
+
+
+Boolean _XtIsSubclassOf(
+    Widget object,
+    WidgetClass widgetClass,
+    WidgetClass superClass,
+    _XtXtEnum flag)
+{
+    LOCK_PROCESS;
+    if (!(object->core.widget_class->core_class.class_inited & flag)) {
+	UNLOCK_PROCESS;
+	return False;
+    } else {
+	register WidgetClass c = object->core.widget_class;
+	while (c != superClass) {
+	    if (c == widgetClass) {
+		UNLOCK_PROCESS;
+		return True;
+	    }
+	    c = c->core_class.superclass;
+	}
+	UNLOCK_PROCESS;
+	return False;
+    }
+} /*_XtIsSubclassOf */
+
+
+XtPointer XtGetClassExtension(
+    WidgetClass	object_class,
+    Cardinal	byte_offset,
+    XrmQuark	type,
+    long	version,
+    Cardinal	record_size)
+{
+    ObjectClassExtension ext;
+    LOCK_PROCESS;
+
+    ext = *(ObjectClassExtension *)((char *)object_class + byte_offset);
+    while (ext && (ext->record_type != type || ext->version < version
+		   || ext->record_size < record_size)) {
+	ext = (ObjectClassExtension) ext->next_extension;
+    }
+
+    UNLOCK_PROCESS;
+    return (XtPointer) ext;
+}
+
+
+static void ComputeWindowAttributes(
+    Widget		 widget,
+    XtValueMask		 *value_mask,
+    XSetWindowAttributes *values)
+{
+    XtExposeProc expose;
+
+    *value_mask = CWEventMask | CWColormap;
+    (*values).event_mask = XtBuildEventMask(widget);
+    (*values).colormap = widget->core.colormap;
+    if (widget->core.background_pixmap != XtUnspecifiedPixmap) {
+	*value_mask |= CWBackPixmap;
+	(*values).background_pixmap = widget->core.background_pixmap;
+    } else {
+	*value_mask |= CWBackPixel;
+	(*values).background_pixel = widget->core.background_pixel;
+    }
+    if (widget->core.border_pixmap != XtUnspecifiedPixmap) {
+	*value_mask |= CWBorderPixmap;
+	(*values).border_pixmap = widget->core.border_pixmap;
+    } else {
+	*value_mask |= CWBorderPixel;
+	(*values).border_pixel = widget->core.border_pixel;
+    }
+    LOCK_PROCESS;
+    expose = widget->core.widget_class->core_class.expose;
+    UNLOCK_PROCESS;
+    if (expose == (XtExposeProc) NULL) {
+	/* Try to avoid redisplay upon resize by making bit_gravity the same
+	   as the default win_gravity */
+	*value_mask |= CWBitGravity;
+	(*values).bit_gravity = NorthWestGravity;
+    }
+} /* ComputeWindowAttributes */
+
+static void CallChangeManaged(
+    register Widget		widget)
+{
+    register Cardinal		i;
+    XtWidgetProc		change_managed;
+    register WidgetList		children;
+    int    			managed_children = 0;
+
+    register CompositePtr cpPtr;
+    register CompositePartPtr clPtr;
+
+    if (XtIsComposite (widget)) {
+	cpPtr = (CompositePtr)&((CompositeWidget) widget)->composite;
+        clPtr = (CompositePartPtr)&((CompositeWidgetClass)
+                   widget->core.widget_class)->composite_class;
+    } else return;
+
+    children = cpPtr->children;
+    LOCK_PROCESS;
+    change_managed = clPtr->change_managed;
+    UNLOCK_PROCESS;
+
+    /* CallChangeManaged for all children */
+    for (i = cpPtr->num_children; i != 0; --i) {
+	CallChangeManaged (children[i-1]);
+	if (XtIsManaged(children[i-1])) managed_children++;
+    }
+
+    if (change_managed != NULL && managed_children != 0) {
+	CALLGEOTAT(_XtGeoTrace(widget,"Call \"%s\"[%d,%d]'s changemanaged\n",
+		       XtName(widget),
+		       widget->core.width, widget->core.height));
+	(*change_managed) (widget);
+    }
+} /* CallChangeManaged */
+
+
+static void MapChildren(
+    CompositePart *cwp)
+{
+    Cardinal i;
+    WidgetList children;
+    register Widget child;
+
+    children = cwp->children;
+    for (i = 0; i <  cwp->num_children; i++) {
+	child = children[i];
+	if (XtIsWidget (child)){
+	    if (child->core.managed && child->core.mapped_when_managed) {
+		XtMapWidget (children[i]);
+	    }
+	}
+    }
+} /* MapChildren */
+
+
+static Boolean ShouldMapAllChildren(
+    CompositePart *cwp)
+{
+    Cardinal i;
+    WidgetList children;
+    register Widget child;
+
+    children = cwp->children;
+    for (i = 0; i < cwp->num_children; i++) {
+	child = children[i];
+	if (XtIsWidget(child)) {
+	    if (XtIsRealized(child) && (! (child->core.managed
+					  && child->core.mapped_when_managed))){
+		    return False;
+	    }
+	}
+    }
+
+    return True;
+} /* ShouldMapAllChildren */
+
+
+static void RealizeWidget(
+    Widget			widget)
+{
+    XtValueMask			value_mask;
+    XSetWindowAttributes	values;
+    XtRealizeProc		realize;
+    Window			window;
+    Display*			display;
+    String			class_name;
+    Widget			hookobj;
+
+    if (!XtIsWidget(widget) || XtIsRealized(widget)) return;
+    display = XtDisplay(widget);
+    _XtInstallTranslations(widget);
+
+    ComputeWindowAttributes (widget, &value_mask, &values);
+    LOCK_PROCESS;
+    realize = widget->core.widget_class->core_class.realize;
+    class_name = widget->core.widget_class->core_class.class_name;
+    UNLOCK_PROCESS;
+    if (realize == NULL)
+	XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+		      "invalidProcedure","realizeProc",XtCXtToolkitError,
+		      "No realize class procedure defined",
+		      (String *)NULL, (Cardinal *)NULL);
+    else {
+	CALLGEOTAT(_XtGeoTrace(widget,"Call \"%s\"[%d,%d]'s realize proc\n",
+		       XtName(widget),
+		       widget->core.width, widget->core.height));
+	(*realize) (widget, &value_mask, &values);
+    }
+    window = XtWindow(widget);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj,XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHrealizeWidget;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+#ifndef NO_IDENTIFY_WINDOWS
+    if (_XtGetPerDisplay(display)->appContext->identify_windows) {
+	int len_nm, len_cl;
+	char *s;
+
+	len_nm = widget->core.name ? strlen(widget->core.name) : 0;
+	len_cl = strlen(class_name);
+	s = __XtMalloc((unsigned) (len_nm + len_cl + 2));
+	s[0] = '\0';
+	if (len_nm)
+	    strcpy(s, widget->core.name);
+	strcpy(s + len_nm + 1, class_name);
+	XChangeProperty(display, window,
+			XInternAtom(display, "_MIT_OBJ_CLASS",
+				    False),
+			XA_STRING, 8, PropModeReplace, (unsigned char *) s,
+			len_nm + len_cl + 2);
+	XtFree(s);
+    }
+#endif
+#ifdef notdef
+    _XtRegisterAsyncHandlers(widget);
+#endif
+    /* (re)register any grabs extant in the translations */
+    _XtRegisterGrabs(widget);
+    /* reregister any grabs added with XtGrab{Button,Key} */
+    _XtRegisterPassiveGrabs(widget);
+    XtRegisterDrawable (display, window, widget);
+    _XtExtensionSelect(widget);
+
+    if (XtIsComposite (widget)) {
+	Cardinal		i;
+	CompositePart *cwp = &(((CompositeWidget)widget)->composite);
+	WidgetList children = cwp->children;
+	/* Realize all children */
+	for (i = cwp->num_children; i != 0; --i) {
+	    RealizeWidget (children[i-1]);
+	}
+	/* Map children that are managed and mapped_when_managed */
+
+	if (cwp->num_children != 0) {
+	    if (ShouldMapAllChildren(cwp)) {
+		XMapSubwindows (display, window);
+	    } else {
+		MapChildren(cwp);
+	    }
+	}
+    }
+
+    /* If this is the application's popup shell, map it */
+    if (widget->core.parent == NULL && widget->core.mapped_when_managed) {
+	XtMapWidget (widget);
+    }
+} /* RealizeWidget */
+
+void XtRealizeWidget (
+    Widget		widget)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (XtIsRealized (widget)) {
+	UNLOCK_APP(app);
+	return;
+    }
+    CallChangeManaged(widget);
+    RealizeWidget(widget);
+    UNLOCK_APP(app);
+} /* XtRealizeWidget */
+
+
+static void UnrealizeWidget(
+    Widget		widget)
+{
+    CompositeWidget	cw;
+    Cardinal		i;
+    WidgetList		children;
+
+    if (!XtIsWidget(widget) || !XtIsRealized(widget)) return;
+
+    /* If this is the application's popup shell, unmap it? */
+    /* no, the window is being destroyed */
+
+    /* Recurse on children */
+    if (XtIsComposite (widget)) {
+	cw = (CompositeWidget) widget;
+	children = cw->composite.children;
+	/* Unrealize all children */
+	for (i = cw->composite.num_children; i != 0; --i) {
+	    UnrealizeWidget (children[i-1]);
+	}
+	/* Unmap children that are managed and mapped_when_managed? */
+	/* No, it's ok to be managed and unrealized as long as your parent */
+	/* is unrealized. XtUnrealize widget makes sure the "top" widget */
+	/* is unmanaged, we can ignore all descendents */
+    }
+
+    if (XtHasCallbacks(widget, XtNunrealizeCallback) == XtCallbackHasSome)
+	XtCallCallbacks(widget, XtNunrealizeCallback, NULL);
+
+    /* Unregister window */
+    XtUnregisterDrawable(XtDisplay(widget), XtWindow(widget));
+
+    /* Remove Event Handlers */
+    /* remove grabs. Happens automatically when window is destroyed. */
+
+    /* Destroy X Window, done at outer level with one request */
+    widget->core.window = None;
+
+    /* Removing the event handler here saves having to keep track if
+     * the translation table is changed while the widget is unrealized.
+     */
+    _XtRemoveTranslations(widget);
+} /* UnrealizeWidget */
+
+
+void XtUnrealizeWidget (
+    Widget		widget)
+{
+    Window window;
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    window = XtWindow(widget);
+    if (! XtIsRealized (widget)) {
+	UNLOCK_APP(app);
+	return;
+    }
+    if (widget->core.managed && widget->core.parent != NULL)
+	XtUnmanageChild(widget);
+    UnrealizeWidget(widget);
+    if (window != None)
+	XDestroyWindow(XtDisplay(widget), window);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHunrealizeWidget;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtUnrealizeWidget */
+
+
+void XtCreateWindow(
+    Widget		 widget,
+    unsigned int	 window_class,
+    Visual		 *visual,
+    XtValueMask		 value_mask,
+    XSetWindowAttributes *attributes)
+{
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    if (widget->core.window == None) {
+	if (widget->core.width == 0 || widget->core.height == 0) {
+	    Cardinal count = 1;
+	    XtAppErrorMsg(app,
+		       "invalidDimension", "xtCreateWindow", XtCXtToolkitError,
+		       "Widget %s has zero width and/or height",
+		       &widget->core.name, &count);
+	}
+	widget->core.window =
+	    XCreateWindow (
+		XtDisplay (widget),
+		(widget->core.parent ?
+		    widget->core.parent->core.window :
+		    widget->core.screen->root),
+		(int)widget->core.x, (int)widget->core.y,
+		(unsigned)widget->core.width, (unsigned)widget->core.height,
+		(unsigned)widget->core.border_width, (int) widget->core.depth,
+		window_class, visual, value_mask, attributes);
+    }
+    UNLOCK_APP(app);
+} /* XtCreateWindow */
+
+
+/* ---------------- XtNameToWidget ----------------- */
+
+static Widget NameListToWidget(
+    Widget root,
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    int in_depth, int *out_depth, int *found_depth);
+
+typedef Widget (*NameMatchProc)(XrmNameList,
+    XrmBindingList,
+    WidgetList, Cardinal, int, int *, int *);
+
+static Widget MatchExactChildren(
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    register WidgetList children,
+    register Cardinal num,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    register Cardinal   i;
+    register XrmName    name = *names;
+    Widget w, result = NULL;
+    int d, min = 10000;
+
+    for (i = 0; i < num; i++) {
+	if (name == children[i]->core.xrm_name) {
+	    w = NameListToWidget(children[i], &names[1], &bindings[1],
+		    in_depth+1, &d, found_depth);
+	    if (w != NULL && d < min) {result = w; min = d;}
+	}
+    }
+    *out_depth = min;
+    return result;
+}
+
+static Widget MatchWildChildren(
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    register WidgetList children,
+    register Cardinal num,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    register Cardinal   i;
+    Widget w, result = NULL;
+    int d, min = 10000;
+
+    for (i = 0; i < num; i++) {
+	w = NameListToWidget(children[i], names, bindings,
+		in_depth+1, &d, found_depth);
+	if (w != NULL && d < min) {result = w; min = d;}
+    }
+    *out_depth = min;
+    return result;
+}
+
+static Widget SearchChildren(
+    Widget root,
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    NameMatchProc matchproc,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    Widget w1 = NULL, w2;
+    int d1, d2;
+
+    if (XtIsComposite(root)) {
+	w1 = (*matchproc)(names, bindings,
+		((CompositeWidget) root)->composite.children,
+		((CompositeWidget) root)->composite.num_children,
+		in_depth, &d1, found_depth);
+    } else d1 = 10000;
+    w2 = (*matchproc)(names, bindings, root->core.popup_list,
+	    root->core.num_popups, in_depth, &d2, found_depth);
+    *out_depth = (d1 < d2 ? d1 : d2);
+    return (d1 < d2 ? w1 : w2);
+}
+
+static Widget NameListToWidget(
+    register Widget root,
+    XrmNameList     names,
+    XrmBindingList  bindings,
+    int in_depth, int *out_depth, int *found_depth)
+{
+    Widget w1, w2;
+    int d1, d2;
+
+    if (in_depth >= *found_depth) {
+	*out_depth = 10000;
+	return NULL;
+    }
+
+    if (names[0] == NULLQUARK) {
+	*out_depth = *found_depth = in_depth;
+	return root;
+    }
+
+    if (! XtIsWidget(root)) {
+	*out_depth = 10000;
+	return NULL;
+    }
+
+    if (*bindings == XrmBindTightly) {
+	return SearchChildren(root, names, bindings, MatchExactChildren,
+		in_depth, out_depth, found_depth);
+
+    } else {	/* XrmBindLoosely */
+	w1 = SearchChildren(root, names, bindings, MatchExactChildren,
+		in_depth, &d1, found_depth);
+	w2 = SearchChildren(root, names, bindings, MatchWildChildren,
+		in_depth, &d2, found_depth);
+	*out_depth = (d1 < d2 ? d1 : d2);
+	return (d1 < d2 ? w1 : w2);
+    }
+} /* NameListToWidget */
+
+Widget XtNameToWidget(
+    Widget root,
+    _Xconst char* name)
+{
+    XrmName *names;
+    XrmBinding *bindings;
+    int len, depth, found = 10000;
+    Widget result;
+    WIDGET_TO_APPCON(root);
+
+    len = strlen(name);
+    if (len == 0) return NULL;
+
+    LOCK_APP(app);
+    names = (XrmName *) ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmName));
+    bindings = (XrmBinding *)
+	ALLOCATE_LOCAL((unsigned) (len+1) * sizeof(XrmBinding));
+    if (names == NULL || bindings == NULL) _XtAllocError(NULL);
+
+    XrmStringToBindingQuarkList(name, bindings, names);
+    if (names[0] == NULLQUARK) {
+	DEALLOCATE_LOCAL((char *) bindings);
+	DEALLOCATE_LOCAL((char *) names);
+	UNLOCK_APP(app);
+	return NULL;
+    }
+
+    result = NameListToWidget(root, names, bindings, 0, &depth, &found);
+
+    DEALLOCATE_LOCAL((char *) bindings);
+    DEALLOCATE_LOCAL((char *) names);
+    UNLOCK_APP(app);
+    return result;
+} /* XtNameToWidget */
+
+/* Define user versions of intrinsics macros */
+
+#undef XtDisplayOfObject
+Display *XtDisplayOfObject(
+     Widget object)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    if (XtIsSubclass(object, hookObjectClass))
+	return DisplayOfScreen(((HookObject)object)->hooks.screen);
+    return XtDisplay(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
+}
+
+#undef XtDisplay
+Display *XtDisplay(
+	Widget widget)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return DisplayOfScreen(widget->core.screen);
+}
+
+#undef XtScreenOfObject
+Screen *XtScreenOfObject(
+     Widget object)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    if (XtIsSubclass(object, hookObjectClass))
+	return ((HookObject)object)->hooks.screen;
+    return XtScreen(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
+}
+
+#undef XtScreen
+Screen *XtScreen(
+	Widget widget)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return widget->core.screen;
+}
+
+#undef XtWindowOfObject
+Window XtWindowOfObject(
+     Widget object)
+{
+    return XtWindow(XtIsWidget(object) ? object : _XtWindowedAncestor(object));
+}
+
+
+#undef XtWindow
+Window XtWindow(
+	Widget widget)
+{
+    return widget->core.window;
+}
+
+#undef XtSuperclass
+WidgetClass XtSuperclass(
+    Widget widget)
+{
+    WidgetClass retval;
+
+    LOCK_PROCESS;
+    retval = XtClass(widget)->core_class.superclass;
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+#undef XtClass
+WidgetClass XtClass(
+    Widget widget)
+{
+    WidgetClass retval;
+
+    LOCK_PROCESS;
+    retval = widget->core.widget_class;
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+#undef XtIsManaged
+Boolean XtIsManaged(
+	Widget object)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    if (XtIsRectObj(object))
+	retval = object->core.managed;
+    else
+	retval = False;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+#undef XtIsRealized
+Boolean XtIsRealized (
+    Widget   object)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    retval = XtWindowOfObject(object) != None;
+    UNLOCK_APP(app);
+    return retval;
+} /* XtIsRealized */
+
+#undef XtIsSensitive
+Boolean XtIsSensitive(
+	Widget	object)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(object);
+
+    LOCK_APP(app);
+    if (XtIsRectObj(object))
+	retval = object->core.sensitive && object->core.ancestor_sensitive;
+    else
+	retval = False;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+/*
+ * Internal routine; must be called only after XtIsWidget returns false
+ */
+Widget _XtWindowedAncestor(
+    register Widget object)
+{
+    Widget obj = object;
+    for (object = XtParent(object); object && !XtIsWidget(object);)
+	object = XtParent(object);
+
+    if (object == NULL) {
+	String params = XtName(obj);
+	Cardinal num_params = 1;
+	XtErrorMsg("noWidgetAncestor", "windowedAncestor", XtCXtToolkitError,
+		   "Object \"%s\" does not have windowed ancestor",
+		   &params, &num_params);
+    }
+
+    return object;
+}
+
+#undef XtParent
+Widget XtParent(
+    Widget widget)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return widget->core.parent;
+}
+
+#undef XtName
+String XtName(
+     Widget object)
+{
+    /* Attempts to LockApp() here will generate endless recursive loops */
+    return XrmQuarkToString(object->core.xrm_name);
+}
+
+
+Boolean XtIsObject(
+    Widget object)
+{
+    WidgetClass wc;
+    String class_name;
+
+    /* perform basic sanity checks */
+    if (object->core.self != object || object->core.xrm_name == NULLQUARK)
+	return False;
+
+    LOCK_PROCESS;
+    wc = object->core.widget_class;
+    if (wc->core_class.class_name == NULL ||
+	wc->core_class.xrm_class == NULLQUARK ||
+	(class_name = XrmClassToString(wc->core_class.xrm_class)) == NULL ||
+	strcmp(wc->core_class.class_name, class_name) != 0) {
+	    UNLOCK_PROCESS;
+	    return False;
+	}
+    UNLOCK_PROCESS;
+
+    if (XtIsWidget(object)) {
+	if (object->core.name == NULL ||
+	    (class_name = XrmNameToString(object->core.xrm_name)) == NULL ||
+	    strcmp(object->core.name, class_name) != 0)
+	    return False;
+    }
+    return True;
+}
+
+#if defined(WIN32)
+static int access_file (
+    char* path,
+    char* pathbuf,
+    int len_pathbuf,
+    char** pathret)
+{
+    if (access (path, F_OK) == 0) {
+	if (strlen (path) < len_pathbuf)
+	    *pathret = pathbuf;
+	else
+	    *pathret = XtMalloc (strlen (path));
+	if (*pathret) {
+	    strcpy (*pathret, path);
+	    return 1;
+	}
+    }
+    return 0;
+}
+
+static int AccessFile (
+    char* path,
+    char* pathbuf,
+    int len_pathbuf,
+    char** pathret)
+{
+    unsigned long drives;
+    int i, len;
+    char* drive;
+    char buf[MAX_PATH];
+    char* bufp;
+
+    /* just try the "raw" name first and see if it works */
+    if (access_file (path, pathbuf, len_pathbuf, pathret))
+	return 1;
+
+#if defined(WIN32) && defined(__MINGW32__)
+    /* don't try others */
+    return 0;
+#endif
+
+    /* try the places set in the environment */
+    drive = getenv ("_XBASEDRIVE");
+#ifdef __UNIXOS2__
+    if (!drive)
+	drive = getenv ("X11ROOT");
+#endif
+    if (!drive)
+	drive = "C:";
+    len = strlen (drive) + strlen (path);
+    bufp = XtStackAlloc (len + 1, buf);
+    strcpy (bufp, drive);
+    strcat (bufp, path);
+    if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+	XtStackFree (bufp, buf);
+	return 1;
+    }
+
+#ifndef __UNIXOS2__
+    /* one last place to look */
+    drive = getenv ("HOMEDRIVE");
+    if (drive) {
+	len = strlen (drive) + strlen (path);
+	bufp = XtStackAlloc (len + 1, buf);
+	strcpy (bufp, drive);
+	strcat (bufp, path);
+	if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+	    XtStackFree (bufp, buf);
+	    return 1;
+	}
+    }
+
+    /* does OS/2 (with or with gcc-emx) have getdrives()? */
+    /* tried everywhere else, go fishing */
+    drives = _getdrives ();
+#define C_DRIVE ('C' - 'A')
+#define Z_DRIVE ('Z' - 'A')
+    for (i = C_DRIVE; i <= Z_DRIVE; i++) { /* don't check on A: or B: */
+	if ((1 << i) & drives) {
+	    len = 2 + strlen (path);
+	    bufp = XtStackAlloc (len + 1, buf);
+	    *bufp = 'A' + i;
+	    *(bufp + 1) = ':';
+	    *(bufp + 2) = '\0';
+	    strcat (bufp, path);
+	    if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+		XtStackFree (bufp, buf);
+		return 1;
+	    }
+	}
+    }
+#endif
+    return 0;
+}
+#endif
+
+static Boolean TestFile(
+    String path)
+{
+#ifndef VMS
+    int ret = 0;
+    struct stat status;
+#if defined(WIN32)
+    char buf[MAX_PATH];
+    char* bufp;
+    int len;
+    UINT olderror = SetErrorMode (SEM_FAILCRITICALERRORS);
+
+    if (AccessFile (path, buf, MAX_PATH, &bufp))
+	path = bufp;
+
+    (void) SetErrorMode (olderror);
+#endif
+    ret = (access(path, R_OK) == 0 &&		/* exists and is readable */
+	    stat(path, &status) == 0 &&		/* get the status */
+#ifndef X_NOT_POSIX
+	    S_ISDIR(status.st_mode) == 0);	/* not a directory */
+#else
+	    (status.st_mode & S_IFMT) != S_IFDIR);	/* not a directory */
+#endif /* X_NOT_POSIX else */
+    return ret;
+#else /* VMS */
+    return TRUE;	/* Who knows what to do here? */
+#endif /* VMS */
+}
+
+/* return of TRUE = resolved string fit, FALSE = didn't fit.  Not
+   null-terminated and not collapsed if it didn't fit */
+
+static Boolean Resolve(
+    register _Xconst char *source,	/* The source string */
+    register int len,		/* The length in bytes of *source */
+    Substitution sub,	/* Array of string values to substitute */
+    Cardinal num,	/* Number of substitution entries */
+    char *buf,		/* Where to put the resolved string; */
+    char collapse)	/* Character to collapse */
+{
+    register int bytesLeft = PATH_MAX;
+    register char* bp = buf;
+#ifndef DONT_COLLAPSE
+    Boolean atBeginning = TRUE;
+    Boolean prevIsCollapse = FALSE;
+
+#define PUT(ch) \
+    { \
+	if (--bytesLeft == 0) return FALSE; \
+        if (prevIsCollapse) \
+	    if ((*bp = ch) != collapse) { \
+		prevIsCollapse = FALSE; \
+		bp++; \
+	    } \
+	    else bytesLeft++; \
+        else if ((*bp++ = ch) == collapse && !atBeginning) \
+	    prevIsCollapse = TRUE; \
+    }
+#else /* DONT_COLLAPSE */
+
+#define PUT(ch) \
+    { \
+	if (--bytesLeft == 0) return FALSE; \
+	*bp++ = ch; \
+    }
+#endif /* DONT_COLLAPSE */
+#define escape '%'
+
+    while (len--) {
+#ifndef DONT_COLLAPSE
+	if (*source == collapse) {
+	    PUT(*source);
+	    source++;
+	    continue;
+	}
+	else
+#endif /* DONT_COLLAPSE */
+	    if (*source != escape) {
+		PUT(*source);
+	}
+	else {
+	    source++;
+	    if (len-- == 0) {
+		PUT(escape);
+		break;
+	    }
+
+	    if (*source == ':' || *source == escape)
+		PUT(*source)
+	    else {
+		/* Match the character against the match array */
+		register Cardinal j;
+
+		for (j = 0; j < num && sub[j].match != *source; j++) {}
+
+		/* Substitute the substitution string */
+
+		if (j >= num) PUT(*source)
+		else if (sub[j].substitution != NULL) {
+		    char *sp = sub[j].substitution;
+		    while (*sp) {
+			PUT(*sp);
+			sp++;
+		    }
+		}
+	    }
+	}
+	source++;
+#ifndef DONT_COLLAPSE
+	atBeginning = FALSE;
+#endif /* DONT_COLLAPSE */
+    }
+    PUT('\0');
+
+    return TRUE;
+#undef PUT
+#undef escape
+}
+
+
+String XtFindFile(
+    _Xconst char* path,
+    Substitution substitutions,
+    Cardinal num_substitutions,
+    XtFilePredicate predicate)
+{
+    char *buf, *buf1, *buf2, *colon;
+    int len;
+    Boolean firstTime = TRUE;
+
+    buf = buf1 = __XtMalloc((unsigned)PATH_MAX);
+    buf2 = __XtMalloc((unsigned)PATH_MAX);
+
+    if (predicate == NULL) predicate = TestFile;
+
+    while (1) {
+	colon = (String)path;
+	/* skip leading colons */
+	while (*colon) {
+	    if (*colon != ':') break;
+	    colon++;
+	    path++;
+	}
+	/* now look for an un-escaped colon */
+	for ( ; *colon ; colon++) {
+	    if (*colon == '%' && *(path+1)) {
+		colon++;	/* bump it an extra time to skip %. */
+		continue;
+	    }
+	    if (*colon == ':')
+#ifdef __UNIXOS2__
+	      if (colon > (path+1))
+#endif
+		break;
+	}
+	len = colon - path;
+	if (Resolve(path, len, substitutions, num_substitutions,
+		    buf, '/')) {
+	    if (firstTime || strcmp(buf1,buf2) != 0) {
+#ifdef __UNIXOS2__
+		{
+			char *bufx = (char*)__XOS2RedirRoot(buf);
+			strcpy(buf,bufx);
+		}
+#endif
+#ifdef XNL_DEBUG
+		printf("Testing file %s\n", buf);
+#endif /* XNL_DEBUG */
+		/* Check out the file */
+		if ((*predicate) (buf)) {
+		    /* We've found it, return it */
+#ifdef XNL_DEBUG
+		    printf("File found.\n");
+#endif /* XNL_DEBUG */
+		    if (buf == buf1) XtFree(buf2);
+		    else XtFree(buf1);
+		    return buf;
+		}
+		if (buf == buf1)
+		    buf = buf2;
+		else
+		    buf = buf1;
+		firstTime = FALSE;
+	    }
+	}
+
+	/* Nope...any more paths? */
+
+	if (*colon == '\0') break;
+	path = colon+1;
+    }
+
+    /* No file found */
+
+    XtFree(buf1);
+    XtFree(buf2);
+    return NULL;
+}
+
+
+/* The implementation of this routine is operating system dependent */
+/* Should match the code in Xlib _XlcMapOSLocaleName */
+
+static char *ExtractLocaleName(
+    String	lang)
+{
+
+#if defined(hpux) || defined(CSRG_BASED) || defined(sun) || defined(SVR4) || defined(sgi) || defined(__osf__) || defined(AIXV3) || defined(ultrix) || defined(WIN32) || defined(__UNIXOS2__) || defined (linux)
+# ifdef hpux
+/*
+ * We need to discriminated between HPUX 9 and HPUX 10. The equivalent
+ * code in Xlib in SetLocale.c does include locale.h via X11/Xlocale.h.
+ */
+#  include <locale.h>
+#  ifndef _LastCategory
+   /* HPUX 9 and earlier */
+#   define SKIPCOUNT 2
+#   define STARTCHAR ':'
+#   define ENDCHAR ';'
+#  else
+    /* HPUX 10 */
+#   define ENDCHAR ' '
+#  endif
+# else
+#  ifdef ultrix
+#   define SKIPCOUNT 2
+#   define STARTCHAR '\001'
+#   define ENDCHAR '\001'
+#  else
+#   if defined(WIN32) || defined(__UNIXOS2__)
+#    define SKIPCOUNT 1
+#    define STARTCHAR '='
+#    define ENDCHAR ';'
+#    define WHITEFILL
+#   else
+#    if defined(__osf__) || (defined(AIXV3) && !defined(AIXV4))
+#     define STARTCHAR ' '
+#     define ENDCHAR ' '
+#    else
+#     if defined(linux)
+#      define STARTSTR "LC_CTYPE="
+#      define ENDCHAR ';'
+#     else
+#      if !defined(sun) || defined(SVR4)
+#       define STARTCHAR '/'
+#       define ENDCHAR '/'
+#      endif
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+    char           *start;
+    char           *end;
+    int             len;
+# ifdef SKIPCOUNT
+    int		    n;
+# endif
+    static char*    buf = NULL;
+
+    start = lang;
+# ifdef SKIPCOUNT
+    for (n = SKIPCOUNT;
+	 --n >= 0 && start && (start = strchr (start, STARTCHAR));
+	 start++)
+	;
+    if (!start)
+	start = lang;
+# endif
+# ifdef STARTCHAR
+    if (start && (start = strchr (start, STARTCHAR)))
+# elif  defined (STARTSTR)
+    if (start && (start = strstr (start,STARTSTR)))
+# endif
+    {
+# ifdef STARTCHAR
+	start++;
+# elif defined (STARTSTR)
+	start += strlen(STARTSTR);
+# endif
+
+	if ((end = strchr (start, ENDCHAR))) {
+	    len = end - start;
+	    if (buf != NULL) XtFree (buf);
+	    buf = XtMalloc (len + 1);
+	    if (buf == NULL) return NULL;
+	    strncpy(buf, start, len);
+	    *(buf + len) = '\0';
+# ifdef WHITEFILL
+	    for (start = buf; start = strchr(start, ' '); )
+		*start++ = '-';
+# endif
+	    return buf;
+	} else  /* if no ENDCHAR is found we are at the end of the line */
+	    return start;
+    }
+# ifdef WHITEFILL
+    if (strchr(lang, ' ')) {
+	if (buf != NULL) XtFree (buf);
+	else buf = XtMalloc (strlen (lang) + 1);
+	if (buf == NULL) return NULL;
+	strcpy(buf, lang);
+	for (start = buf; start = strchr(start, ' '); )
+	    *start++ = '-';
+	return buf;
+    }
+# endif
+# undef STARTCHAR
+# undef ENDCHAR
+# undef WHITEFILL
+#endif
+
+    return lang;
+}
+
+static void FillInLangSubs(
+    Substitution subs,
+    XtPerDisplay pd)
+{
+    int len;
+    char *string, *p1, *p2, *p3;
+    char **rest;
+    char *ch;
+
+    if (pd->language == NULL ||
+	(pd->language != NULL && pd->language[0] == '\0')) {
+	subs[0].substitution = subs[1].substitution =
+		subs[2].substitution = subs[3].substitution = NULL;
+	return;
+    }
+
+    string = ExtractLocaleName(pd->language);
+
+    if (string == NULL ||
+	(string != NULL && string[0] == '\0')) {
+	subs[0].substitution = subs[1].substitution =
+		subs[2].substitution = subs[3].substitution = NULL;
+	return;
+    }
+
+    len = strlen(string) + 1;
+    subs[0].substitution = string;
+    p1 = subs[1].substitution = __XtMalloc((Cardinal) 3*len);
+    p2 = subs[2].substitution = subs[1].substitution + len;
+    p3 = subs[3].substitution = subs[2].substitution + len;
+
+    /* Everything up to the first "_" goes into p1.  From "_" to "." in
+       p2.  The rest in p3.  If no delimiters, all goes into p1.  We
+       assume p1, p2, and p3 are large enough. */
+
+    *p1 = *p2 = *p3 = '\0';
+
+    ch = strchr(string, '_');
+    if (ch != NULL) {
+	len = ch - string;
+	(void) strncpy(p1, string, len);
+	p1[len] = '\0';
+	string = ch + 1;
+	rest = &p2;
+    } else rest = &p1;
+
+    /* Rest points to where we put the first part */
+
+    ch = strchr(string, '.');
+    if (ch != NULL) {
+	len = ch - string;
+	strncpy(*rest, string, len);
+	(*rest)[len] = '\0';
+	(void) strcpy(p3, ch+1);
+    } else (void) strcpy(*rest, string);
+}
+
+/*
+ * default path used if environment variable XFILESEARCHPATH
+ * is not defined.  Also substitued for %D.
+ * The exact value should be documented in the implementation
+ * notes for any Xt implementation.
+ */
+static char *implementation_default_path(void)
+{
+#if defined(WIN32)
+    static char xfilesearchpath[] = "";
+
+    return xfilesearchpath;
+#elif defined(__UNIXOS2__)
+    /* if you know how to pass % thru the compiler let me know */
+    static char xfilesearchpath[] = XFILESEARCHPATHDEFAULT;
+    static Bool fixed;
+    char *ch;
+
+    if (!fixed) {
+	for (ch = xfilesearchpath; ch = strchr(ch, ';'); ch++)
+	    *ch = '%';
+	fixed = True;
+    }
+    return xfilesearchpath;
+#else
+    return XFILESEARCHPATHDEFAULT;
+#endif
+}
+
+
+static SubstitutionRec defaultSubs[] = {
+    {'N', NULL},
+    {'T', NULL},
+    {'S', NULL},
+    {'C', NULL},
+    {'L', NULL},
+    {'l', NULL},
+    {'t', NULL},
+    {'c', NULL}
+};
+
+
+String XtResolvePathname(
+    Display *dpy,
+    _Xconst char* type,
+    _Xconst char* filename,
+    _Xconst char* suffix,
+    _Xconst char* path,
+    Substitution substitutions,
+    Cardinal num_substitutions,
+    XtFilePredicate predicate)
+{
+    XtPerDisplay pd;
+    static char *defaultPath = NULL;
+    char *impl_default = implementation_default_path();
+    int idef_len = strlen(impl_default);
+    char *massagedPath;
+    int bytesAllocd, bytesLeft;
+    char *ch, *result;
+    Substitution merged_substitutions;
+    XrmRepresentation db_type;
+    XrmValue value;
+    XrmName name_list[3];
+    XrmClass class_list[3];
+    Boolean pathMallocd = False;
+
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(dpy);
+    if (path == NULL) {
+#ifndef VMS
+	if (defaultPath == NULL) {
+	    defaultPath = getenv("XFILESEARCHPATH");
+	    if (defaultPath == NULL)
+		defaultPath = impl_default;
+	}
+	path = defaultPath;
+#endif /* VMS */
+    }
+
+    if (path == NULL)
+	path = "";	/* NULL would kill us later */
+
+    if (filename == NULL) {
+	filename = XrmClassToString(pd->class);
+    }
+
+    bytesAllocd = bytesLeft = 1000;
+    massagedPath = ALLOCATE_LOCAL(bytesAllocd);
+    if (massagedPath == NULL) _XtAllocError(NULL);
+
+    if (path[0] == ':') {
+	strcpy(massagedPath, "%N%S");
+	ch = &massagedPath[4];
+	bytesLeft -= 4;
+    } else ch = massagedPath;
+
+    /* Insert %N%S between adjacent colons
+     * and default path for %D.
+     * Default path should not have any adjacent colons of its own.
+     */
+
+    while (*path != '\0') {
+	if (bytesLeft < idef_len) {
+	    int bytesUsed = bytesAllocd - bytesLeft;
+	    char *new;
+	    bytesAllocd +=1000;
+	    new = __XtMalloc((Cardinal) bytesAllocd);
+	    strncpy( new, massagedPath, bytesUsed );
+	    ch = new + bytesUsed;
+	    if (pathMallocd)
+		XtFree(massagedPath);
+	    else
+		DEALLOCATE_LOCAL(massagedPath);
+	    pathMallocd = True;
+	    massagedPath = new;
+	    bytesLeft = bytesAllocd - bytesUsed;
+	}
+	if (*path == '%' && *(path+1) == ':') {
+	    *ch++ = '%';
+	    *ch++ = ':';
+	    path += 2;
+	    bytesLeft -= 2;
+	    continue;
+	}
+	if (*path == ':' && *(path+1) == ':') {
+	    strcpy(ch, ":%N%S:");
+	    ch += 6;
+	    bytesLeft -= 6;
+	    while (*path == ':') path++;
+	    continue;
+	}
+	if (*path == '%' && *(path+1) == 'D') {
+	    strcpy(ch, impl_default);
+	    ch += idef_len;
+	    bytesLeft -= idef_len;
+	    path += 2;
+	    continue;
+	}
+	*ch++ = *path++;
+	bytesLeft--;
+    }
+    *ch = '\0';
+#ifdef XNL_DEBUG
+    printf("Massaged path: %s\n", massagedPath);
+#endif /* XNL_DEBUG */
+
+    if (num_substitutions == 0)
+	merged_substitutions = defaultSubs;
+    else {
+	int i = XtNumber(defaultSubs);
+	Substitution sub, def;
+	merged_substitutions = sub = (Substitution)
+	    ALLOCATE_LOCAL((unsigned)(num_substitutions+i)*sizeof(SubstitutionRec));
+	if (sub == NULL) _XtAllocError(NULL);
+	for (def = defaultSubs; i--; sub++, def++) sub->match = def->match;
+	for (i = num_substitutions; i--; ) *sub++ = *substitutions++;
+    }
+    merged_substitutions[0].substitution = (String)filename;
+    merged_substitutions[1].substitution = (String)type;
+    merged_substitutions[2].substitution = (String)suffix;
+    name_list[0] = pd->name;
+    name_list[1] = XrmPermStringToQuark("customization");
+    name_list[2] = NULLQUARK;
+    class_list[0] = pd->class;
+    class_list[1] = XrmPermStringToQuark("Customization");
+    class_list[2] = NULLQUARK;
+    if (XrmQGetResource(XrmGetDatabase(dpy), name_list, class_list,
+			&db_type, &value) &&
+	db_type == _XtQString)
+	merged_substitutions[3].substitution = (char *)value.addr;
+    else
+	merged_substitutions[3].substitution = NULL;
+    FillInLangSubs(&merged_substitutions[4], pd);
+
+    result = XtFindFile(massagedPath, merged_substitutions,
+			num_substitutions + XtNumber(defaultSubs),
+			predicate);
+
+    if (merged_substitutions[5].substitution != NULL)
+	XtFree( (XtPointer)merged_substitutions[5].substitution );
+
+    if (merged_substitutions != defaultSubs)
+	DEALLOCATE_LOCAL(merged_substitutions);
+
+    if (pathMallocd)
+	XtFree(massagedPath);
+    else
+	DEALLOCATE_LOCAL(massagedPath);
+
+    UNLOCK_PROCESS;
+    return result;
+}
+
+
+Boolean XtCallAcceptFocus(
+    Widget widget,
+    Time *time)
+{
+    XtAcceptFocusProc ac;
+    Boolean retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    ac = XtClass(widget)->core_class.accept_focus;
+    UNLOCK_PROCESS;
+
+    if (ac != NULL)
+	retval = (*ac) (widget, time);
+    else
+	retval = FALSE;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+#ifdef XT_GEO_TATTLER
+/**************************************************************************
+ GeoTattler:  This is used to debug Geometry management in Xt.
+
+  It uses a pseudo resource XtNgeotattler.
+
+  E.G. if those lines are found in the resource database:
+
+    myapp*draw.XmScale.geoTattler: ON
+    *XmScrollBar.geoTattler:ON
+    *XmRowColumn.exit_button.geoTattler:ON
+
+   then:
+
+    all the XmScale children of the widget named draw,
+    all the XmScrollBars,
+    the widget named exit_button in any XmRowColumn
+
+   will return True to the function IsTattled(), and will generate
+   outlined trace to stdout.
+
+*************************************************************************/
+
+#define XtNgeoTattler "geoTattler"
+#define XtCGeoTattler "GeoTattler"
+
+typedef struct { Boolean   geo_tattler ;} GeoDataRec ;
+
+static XtResource geo_resources[] = {
+    { XtNgeoTattler, XtCGeoTattler, XtRBoolean, sizeof(Boolean),
+      XtOffsetOf(GeoDataRec, geo_tattler),
+      XtRImmediate, (XtPointer) False }
+};
+
+/************************************************************************
+  This function uses XtGetSubresources to find out if a widget
+  needs to be geo-spied by the caller. */
+static Boolean IsTattled (Widget widget)
+{
+    GeoDataRec geo_data ;
+
+    XtGetSubresources(widget, (XtPointer)&geo_data,
+                      (String)NULL, (String)NULL,
+		      geo_resources, XtNumber(geo_resources),
+		      NULL, 0);
+
+    return geo_data.geo_tattler;
+
+}  /* IsTattled */
+
+static int n_tab = 0 ;  /* not MT for now */
+
+void
+_XtGeoTab (int direction)  /* +1 or -1 */
+{
+    n_tab += direction ;
+}
+
+
+void
+_XtGeoTrace (Widget widget, ...)
+{
+    va_list args;
+    char *fmt;
+    int i ;
+    if (IsTattled(widget)) {
+	va_start(args, widget);
+	fmt = va_arg(args, char *);
+	for (i=0; i<n_tab; i++) printf("     ");
+	(void) vprintf(fmt, args);
+	va_end(args);
+    }
+}
+
+#endif /* XT_GEO_TATTLER */
+
diff --git a/libXt/src/Keyboard.c b/libXt/src/Keyboard.c
new file mode 100644
index 000000000..6c4a62a18
--- /dev/null
+++ b/libXt/src/Keyboard.c
@@ -0,0 +1,851 @@
+/* $Xorg: Keyboard.c,v 1.5 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard, Digital, or Sun not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Keyboard.c,v 3.3 2001/08/22 22:52:19 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+#include "PassivGraI.h"
+#include "EventI.h"
+
+#define _GetWindowedAncestor(w) (XtIsWidget(w) ? w : _XtWindowedAncestor(w))
+
+/* InActiveSubtree cache of the current focus source and its ancestors */
+static Widget	*pathTrace = NULL;
+static int	pathTraceDepth = 0;
+static int	pathTraceMax = 0;
+
+/* FindKeyDestination cache of focus destination and ancestors up to source */
+static Widget	*pseudoTrace = NULL;
+static int	pseudoTraceDepth = 0;
+static int	pseudoTraceMax = 0;
+
+void _XtClearAncestorCache(Widget widget)
+{
+    /* the caller must lock the process lock */
+    if (pathTraceDepth && pathTrace[0] == widget)
+	pathTraceDepth = 0;
+}
+
+static XtServerGrabPtr CheckServerGrabs(
+    XEvent	*event,
+    Widget	*trace,
+    Cardinal	traceDepth)
+{
+    XtServerGrabPtr 	grab;
+    Cardinal		i;
+
+    for (i = traceDepth;  i > 0; i--)
+      {
+	 if ((grab = _XtCheckServerGrabsOnWidget(event, trace[i-1], KEYBOARD)))
+	   return (grab);
+     }
+    return (XtServerGrabPtr)0;
+}
+
+static Boolean IsParent(Widget a, Widget b)
+{
+    for (b = XtParent(b); b; b = XtParent(b)) {
+      if (b == a) return TRUE;
+      if (XtIsShell(b)) return FALSE;
+    }
+    return FALSE;
+}
+
+#define RelRtn(lca, type) {*relTypeRtn = type; return lca;}
+
+static Widget CommonAncestor(
+    register Widget a,
+    register Widget b,
+    XtGeneology  * relTypeRtn)
+{
+    if (a == b)
+      {
+	  RelRtn(a, XtMySelf)
+	}
+    else if (IsParent(a, b))
+      {
+	  RelRtn(a, XtMyAncestor)
+	}
+    else if (IsParent(b, a))
+      {
+	  RelRtn(b, XtMyDescendant)
+	}
+    else
+      for (b = XtParent(b);
+	   b && !XtIsShell(b);
+	   b = XtParent(b))
+	if (IsParent(b, a))
+	  {
+	      RelRtn(b, XtMyCousin)
+	    }
+    RelRtn(NULL, XtUnrelated)
+}
+#undef RelRtn
+
+
+
+
+
+static Widget _FindFocusWidget(
+    Widget 	widget,
+    Widget	*trace,
+    int		traceDepth,
+    Boolean	activeCheck,
+    Boolean	*isTarget)
+{
+    int src;
+    Widget dst;
+    XtPerWidgetInput	pwi = NULL;
+
+    /* For each ancestor, starting at the top, see if it's forwarded */
+
+
+    /* first check the trace list till done or we go to branch */
+    for (src = traceDepth-1, dst = widget; src > 0;)
+      {
+	  if ((pwi = _XtGetPerWidgetInput(trace[src], FALSE)))
+	    {
+		if (pwi->focusKid)
+		  {
+		      dst = pwi->focusKid;
+		      for (src--; src > 0 && trace[src] != dst; src--) {}
+		  }
+		else dst = trace[--src];
+	    }
+	  else dst = trace[--src];
+      }
+
+    if (isTarget) {
+	if (pwi && pwi->focusKid == widget)
+	    *isTarget = TRUE;
+	else
+	    *isTarget = FALSE;
+    }
+
+    if (!activeCheck)
+      while (XtIsWidget(dst)
+	     && (pwi = _XtGetPerWidgetInput(dst, FALSE))
+	     && pwi->focusKid)
+	dst = pwi->focusKid;
+
+    return dst;
+}
+
+
+static Widget FindFocusWidget(
+    Widget		widget,
+    XtPerDisplayInput 	pdi)
+{
+    if (pdi->focusWidget)
+      return  pdi->focusWidget;
+    else
+      return _FindFocusWidget(widget, pdi->trace, pdi->traceDepth, FALSE, NULL);
+}
+
+Widget XtGetKeyboardFocusWidget(Widget widget)
+{
+    XtPerDisplayInput pdi;
+    Widget retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    retval = FindFocusWidget(widget, pdi);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+static Boolean IsOutside(
+    XKeyEvent	*e,
+    Widget	w)
+{
+    Position left, right, top, bottom;
+
+    /*
+     * if the pointer is outside the shell or inside
+     * the window try to see if it would recieve the
+     * focus
+     */
+    XtTranslateCoords(w, 0, 0, &left, &top);
+    /* We need to take borders into consideration */
+    left = left - w->core.border_width;
+    top =  top - w->core.border_width;
+    right = left +  w->core.width + w->core.border_width;
+    bottom = top +  w->core.height + w->core.border_width;
+
+    if (
+	(e->x_root < left) || (e->y_root < top) ||
+        (e->x_root > right) || (e->y_root > bottom))
+      return TRUE;
+    else
+      return FALSE;
+}
+
+static Widget 	FindKeyDestination(
+    Widget		widget,
+    XKeyEvent		*event,
+    XtServerGrabPtr	prevGrab,
+    XtServerGrabType 	prevGrabType,
+    XtServerGrabPtr	devGrab,
+    XtServerGrabType	devGrabType,
+    XtPerDisplayInput	pdi)
+{
+
+    Widget		dspWidget;
+    Widget		focusWidget;
+
+    LOCK_PROCESS;
+    dspWidget =
+      focusWidget =
+	pdi->focusWidget =
+	  _GetWindowedAncestor(FindFocusWidget(widget, pdi));
+
+
+    /*
+     * If a grab is active from a previous activation then dispatch
+     * based on owner_events ala protocol but with focus being
+     * determined by XtSetKeyboardFocus.
+     */
+    if 	(IsAnyGrab(prevGrabType))
+      {
+	  if (prevGrab->ownerEvents)
+	    dspWidget = focusWidget;
+	  else
+	    dspWidget = prevGrab->widget;
+      }
+    else
+      {
+	  /*
+           * If the focus widget is the event widget or a descendant
+	   * then we can avoid the rest of this. Else ugh...
+	   */
+	  if (focusWidget != widget)
+	    {
+		XtGeneology 	ewRelFw; /* relationship of event widget to
+					    focusWidget */
+		Widget		lca;
+
+		lca = CommonAncestor(widget, focusWidget, &ewRelFw);
+
+		/*
+		 * if the event widget is an ancestor of focus due to the pointer
+		 * and/or the grab being in an ancestor and it's a passive grab
+		 * send to grab widget.
+		 * we are also dispatching to widget if ownerEvents and the event
+		 * is outside the client
+		 */
+		if ((ewRelFw == XtMyAncestor) &&
+		    (devGrabType == XtPassiveServerGrab))
+		     {
+			 if (IsOutside(event, widget) ||
+			     event->type ==KeyPress
+			     )
+			   dspWidget = devGrab->widget;
+		     }
+		else
+		  {
+		      /*
+		       * if the grab widget is not an ancestor of the focus
+		       * release the grab in order to avoid locking. There
+		       * is a possible case  in that ownerEvents true will fall
+		       * through and if synch is set and the event widget
+		       * could turn it off we'll lock. check for it ? why not
+		       */
+		      if ((ewRelFw != XtMyAncestor)
+			  && (devGrabType == XtPassiveServerGrab)
+			  && (!IsAnyGrab(prevGrabType))
+			  )
+			{
+			    XtUngrabKeyboard(devGrab->widget,
+					     event->time);
+			    devGrabType = XtNoServerGrab;
+			}
+		      /*
+		       * if there isn't a grab with then check
+		       * for a logical grab that would have been activated
+		       * if the server was using Xt focus instead of server
+		       * focus
+		       */
+		      if (
+			  (event->type != KeyPress) ||
+			  (event->keycode == 0) /* Xlib XIM composed input */
+			  )
+			dspWidget = focusWidget;
+		      else
+			{
+			    XtServerGrabPtr	grab;
+
+			    if (!pseudoTraceDepth ||
+				!(focusWidget == pseudoTrace[0]) ||
+				!(lca == pseudoTrace[pseudoTraceDepth]))
+			      {
+				  /*
+				   * fill ancestor list from lca
+				   * (non-inclusive)to focusWidget by
+				   * passing in lca as breakWidget
+				   */
+				  _XtFillAncestorList(&pseudoTrace,
+						   &pseudoTraceMax,
+						   &pseudoTraceDepth,
+						   focusWidget,
+						   lca);
+				  /* ignore lca */
+				  pseudoTraceDepth--;
+			      }
+			    if ((grab = CheckServerGrabs((XEvent*)event,
+							pseudoTrace,
+							pseudoTraceDepth)))
+			      {
+				  XtDevice device = &pdi->keyboard;
+
+				  device->grabType = XtPseudoPassiveServerGrab;
+				  pdi->activatingKey = event->keycode;
+				  device->grab = *grab;
+
+				  if (grab
+				      )
+				    dspWidget = grab->widget;
+				  else
+				    dspWidget = focusWidget;
+			      }
+			}
+		  }
+	    }
+      }
+    UNLOCK_PROCESS;
+    return dspWidget;
+}
+
+Widget _XtProcessKeyboardEvent(
+    XKeyEvent  *event,
+    Widget widget,
+    XtPerDisplayInput pdi)
+{
+    XtDevice		device = &pdi->keyboard;
+    XtServerGrabPtr	newGrab, devGrab = &device->grab;
+    XtServerGrabRec	prevGrabRec;
+    XtServerGrabType	prevGrabType = device->grabType;
+    Widget		dspWidget = NULL;
+    Boolean		deactivateGrab = FALSE;
+
+    prevGrabRec = *devGrab;
+
+    switch (event->type)
+      {
+	case KeyPress:
+	  {
+	      if (event->keycode != 0 && /* Xlib XIM composed input */
+		  !IsServerGrab(device->grabType) &&
+		  (newGrab = CheckServerGrabs((XEvent*)event,
+					      pdi->trace,
+					      pdi->traceDepth)))
+		{
+		    /*
+		     * honor pseudo-grab from prior event by X
+		     * unlocking keyboard. Not Xt Unlock !
+		     */
+		    if (IsPseudoGrab(prevGrabType))
+		      XUngrabKeyboard(XtDisplay(newGrab->widget),
+				      event->time);
+		    else
+		      {
+			  /* Activate the grab */
+			  device->grab = *newGrab;
+			  pdi->activatingKey = event->keycode;
+			  device->grabType = XtPassiveServerGrab;
+		      }
+		}
+	    }
+	  break;
+
+	case KeyRelease:
+	  {
+	      if (IsEitherPassiveGrab(device->grabType) &&
+		  (event->keycode == pdi->activatingKey))
+		deactivateGrab = TRUE;
+	  }
+	  break;
+      }
+    dspWidget = FindKeyDestination(widget, event,
+				   &prevGrabRec, prevGrabType,
+				   devGrab, device->grabType,
+				   pdi);
+    if (deactivateGrab)
+      {
+	  /* Deactivate the grab */
+	  device->grabType = XtNoServerGrab;
+	  pdi->activatingKey = 0;
+      }
+    return dspWidget;
+}
+
+static Widget GetShell(Widget widget)
+{
+    Widget	shell;
+
+    for (shell = widget;
+	 shell && !XtIsShell(shell);
+	 shell = XtParent(shell)){}
+    return shell;
+}
+
+
+/*
+ * Check that widget really has Xt focus due to it having recieved an
+ * event
+ */
+typedef enum {NotActive = 0, IsActive, IsTarget} ActiveType;
+static ActiveType InActiveSubtree(Widget widget)
+{
+    Boolean		isTarget;
+    ActiveType		retval;
+
+    LOCK_PROCESS;
+    if (!pathTraceDepth || widget != pathTrace[0]) {
+	_XtFillAncestorList(&pathTrace,
+			    &pathTraceMax,
+			    &pathTraceDepth,
+			    widget,
+			    NULL);
+    }
+    if (widget == _FindFocusWidget(widget,
+				   pathTrace,
+				   pathTraceDepth,
+				   TRUE,
+				   &isTarget))
+	retval = (isTarget ? IsTarget : IsActive);
+    else
+	retval = NotActive;
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+
+
+
+/* ARGSUSED */
+void _XtHandleFocus(
+    Widget widget,
+    XtPointer client_data,	/* child who wants focus */
+    XEvent *event,
+    Boolean *cont)		/* unused */
+{
+    XtPerDisplayInput 	pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    XtPerWidgetInput	pwi = (XtPerWidgetInput)client_data;
+    XtGeneology		oldFocalPoint = pwi->focalPoint;
+    XtGeneology		newFocalPoint = pwi->focalPoint;
+
+    switch( event->type ) {
+
+      case KeyPress:
+      case KeyRelease:
+	/*
+	 * We're getting the keyevents used to guarantee propagating
+         * child interest ala ForwardEvent in R3
+	 */
+	return;
+
+      case EnterNotify:
+      case LeaveNotify:
+
+	/*
+	 * If operating in a focus driven model, then enter and
+	 * leave events do not affect the keyboard focus.
+	 */
+	if ((event->xcrossing.detail != NotifyInferior)
+	    &&	(event->xcrossing.focus))
+	  {
+	      switch (oldFocalPoint)
+		{
+		  case XtMyAncestor:
+		    if (event->type == LeaveNotify)
+		      newFocalPoint = XtUnrelated;
+		    break;
+		  case XtUnrelated:
+		    if (event->type == EnterNotify)
+		      newFocalPoint = XtMyAncestor;
+		    break;
+		  case XtMySelf:
+		    break;
+		  case XtMyDescendant:
+		    break;
+
+		}
+	  }
+	break;
+      case FocusIn:
+	switch (event->xfocus.detail)
+	  {
+	    case NotifyNonlinear:
+	    case NotifyAncestor:
+	    case NotifyInferior:
+	      newFocalPoint = XtMySelf;
+	      break;
+	    case NotifyNonlinearVirtual:
+	    case NotifyVirtual:
+	      newFocalPoint = XtMyDescendant;
+	      break;
+	    case NotifyPointer:
+	      newFocalPoint = XtMyAncestor;
+	      break;
+	  }
+	break;
+      case FocusOut:
+	switch (event->xfocus.detail)
+	  {
+	    case NotifyPointer:
+	    case NotifyNonlinear:
+	    case NotifyAncestor:
+	    case NotifyNonlinearVirtual:
+	    case NotifyVirtual:
+	      newFocalPoint = XtUnrelated;
+	      break;
+	    case NotifyInferior:
+	      newFocalPoint = XtMyDescendant;
+	      return;
+	      break;
+	  }
+	break;
+    }
+
+    if (newFocalPoint != oldFocalPoint)
+      {
+	  Boolean 	add;
+	  Widget	descendant = pwi->focusKid;
+
+	  pwi->focalPoint = newFocalPoint;
+
+	  if ((oldFocalPoint == XtUnrelated) &&
+	      InActiveSubtree(widget) != NotActive)
+	    {
+		pdi->focusWidget = NULL; /* invalidate the cache */
+		pwi->haveFocus = TRUE;
+		add = TRUE;
+	    }
+	  else if (newFocalPoint == XtUnrelated)
+	    {
+		pdi->focusWidget = NULL; /* invalidate the cache */
+		pwi->haveFocus = FALSE;
+		add = FALSE;
+	    }
+	  else
+	    return;
+
+	  if (descendant)
+	    {
+		if (add)
+		  {
+		      _XtSendFocusEvent(descendant, FocusIn);
+		  }
+		else
+		  {
+		      _XtSendFocusEvent(descendant, FocusOut);
+		  }
+	    }
+      }
+}
+
+
+static void AddFocusHandler(
+    Widget widget,
+    Widget descendant,
+    XtPerWidgetInput pwi,
+    XtPerWidgetInput psi,
+    XtPerDisplayInput pdi,
+    EventMask oldEventMask)
+{
+    EventMask	 	eventMask, targetEventMask;
+    Widget		target;
+
+    /*
+     * widget must now select for key events if the descendant is
+     * interested in them.
+     *
+     * shell borders are not occluded by the child, they're occluded
+     * by reparenting window managers. !!!
+     */
+    target = descendant ? _GetWindowedAncestor(descendant) : NULL;
+    targetEventMask = XtBuildEventMask(target);
+    eventMask = targetEventMask & (KeyPressMask | KeyReleaseMask);
+    eventMask |= FocusChangeMask | EnterWindowMask | LeaveWindowMask;
+
+    if (oldEventMask) {
+	oldEventMask &= KeyPressMask | KeyReleaseMask;
+	oldEventMask |= FocusChangeMask | EnterWindowMask | LeaveWindowMask;
+
+	if (oldEventMask != eventMask)
+	    XtRemoveEventHandler(widget, (oldEventMask & ~eventMask),
+				 False, _XtHandleFocus, (XtPointer)pwi);
+    }
+
+    if (oldEventMask != eventMask)
+	XtAddEventHandler(widget, eventMask, False,
+			  _XtHandleFocus, (XtPointer)pwi);
+
+    /* What follows is too much grief to go through if the
+     * target doesn't actually care about focus change events,
+     * so just invalidate the focus cache & refill it when
+     * the next input event actually arrives.
+     */
+
+    if (!(targetEventMask & FocusChangeMask)) {
+	pdi->focusWidget = NULL;
+	return;
+    }
+
+    if (XtIsRealized(widget) && !pwi->haveFocus) {
+	if (psi->haveFocus) {
+	    Window root, child;
+	    int root_x, root_y, win_x, win_y;
+	    int left, right, top, bottom;
+	    unsigned int modMask;
+	    ActiveType act;
+
+	    /*
+	     * If the shell has the focus but the source widget
+	     * doesn't, it may only be because the source widget
+	     * wasn't previously tracking focus or crossing events.
+	     * If the target wants focus events, we have to
+	     * now determine whether the source has the focus.
+	     */
+
+	    if ((act = InActiveSubtree(widget)) == IsTarget)
+		pwi->haveFocus = TRUE;
+	    else if (act == IsActive) {
+		/*
+		 * An ancestor contains the focus, so if source
+		 * contains the pointer, then source has the focus.
+		 */
+
+		if (XQueryPointer(XtDisplay(widget), XtWindow(widget),
+				  &root, &child,
+				  &root_x, &root_y, &win_x, &win_y, &modMask))
+		{
+		    /* We need to take borders into consideration */
+		    left = top = -((int) widget->core.border_width);
+		    right = (int) (widget->core.width + (widget->core.border_width << 1));
+		    bottom = (int) (widget->core.height + (widget->core.border_width << 1));
+
+		    if (win_x >= left && win_x < right &&
+			win_y >= top && win_y < bottom)
+			pwi->haveFocus = TRUE;
+		}
+	    }
+	}
+    }
+    if (pwi->haveFocus) {
+	  pdi->focusWidget = NULL; /* invalidate the cache */
+	  _XtSendFocusEvent(target, FocusIn);
+    }
+}
+
+
+/* ARGSUSED */
+static void QueryEventMask(
+    Widget widget,		/* child who gets focus */
+    XtPointer client_data,	/* ancestor giving it */
+    XEvent *event,
+    Boolean *cont)		/* unused */
+{
+    /* widget was once the target of an XtSetKeyboardFocus but
+     * was unrealized at the time.   Make sure ancestor still wants
+     * focus set here then install the handler now that we know the
+     * complete event mask.
+     */
+    Widget ancestor = (Widget)client_data;
+    XtPerWidgetInput pwi = _XtGetPerWidgetInput(ancestor, FALSE);
+    Widget target = pwi->queryEventDescendant;
+
+    /* use of 'target' is non-standard hackery; allows focus to non-widget */
+    if (pwi && (pwi->focusKid == target)) {
+	AddFocusHandler(ancestor, target, pwi,
+			_XtGetPerWidgetInput(GetShell(ancestor), TRUE),
+			_XtGetPerDisplayInput(XtDisplay(ancestor)),
+			(EventMask)0);
+    }
+    XtRemoveEventHandler(widget, XtAllEvents, True,
+			 QueryEventMask, client_data);
+    pwi->map_handler_added = FALSE;
+}
+
+
+/* ARGSUSED */
+static void FocusDestroyCallback(
+    Widget  widget,
+    XtPointer closure,		/* Widget */
+    XtPointer call_data)
+{
+    XtSetKeyboardFocus((Widget)closure, NULL);
+}
+
+void XtSetKeyboardFocus(
+    Widget widget,
+    Widget descendant)
+{
+    XtPerDisplayInput pdi;
+    XtPerWidgetInput pwi;
+    Widget oldDesc, oldTarget, target, hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    pwi = _XtGetPerWidgetInput(widget, TRUE);
+    oldDesc = pwi->focusKid;
+
+    if (descendant == widget) descendant = (Widget)None;
+
+    target = descendant ? _GetWindowedAncestor(descendant) : NULL;
+    oldTarget = oldDesc ? _GetWindowedAncestor(oldDesc) : NULL;
+
+    if (descendant != oldDesc) {
+
+	/* update the forward path */
+	pwi->focusKid = descendant;
+
+
+	/* all the rest handles focus ins and focus outs and misc gunk */
+
+	if (oldDesc) {
+	    /* invalidate FindKeyDestination's ancestor list */
+	    if (pseudoTraceDepth && oldTarget == pseudoTrace[0])
+		pseudoTraceDepth = 0;
+
+	    XtRemoveCallback(oldDesc, XtNdestroyCallback,
+			     FocusDestroyCallback, (XtPointer)widget);
+
+	    if (!oldTarget->core.being_destroyed) {
+		if (pwi->map_handler_added) {
+		    XtRemoveEventHandler(oldTarget, XtAllEvents, True,
+					 QueryEventMask, (XtPointer)widget);
+		    pwi->map_handler_added = FALSE;
+		}
+		if (pwi->haveFocus) {
+		    _XtSendFocusEvent( oldTarget, FocusOut);
+		}
+	    }
+	    else if (pwi->map_handler_added) {
+		pwi->map_handler_added = FALSE;
+	    }
+
+	    if (pwi->haveFocus)
+		pdi->focusWidget = NULL; /* invalidate cache */
+
+	    /*
+	     * If there was a forward path then remove the handler if
+	     * the path is being set to null and it isn't a shell.
+	     * shells always have a handler for tracking focus for the
+	     * hierarchy.
+	     *
+	     * Keep the pwi record on the assumption that the client
+	     * will continue to dynamically assign focus for this widget.
+	     */
+	    if (!XtIsShell(widget) && !descendant) {
+	      XtRemoveEventHandler(widget, XtAllEvents, True,
+				   _XtHandleFocus, (XtPointer)pwi);
+	      pwi->haveFocus = FALSE;
+	  }
+	}
+
+	if (descendant) {
+	    Widget shell = GetShell(widget);
+	    XtPerWidgetInput psi = _XtGetPerWidgetInput(shell, TRUE);
+	    XtAddCallback (descendant, XtNdestroyCallback,
+			   FocusDestroyCallback, (XtPointer) widget);
+
+	    AddFocusHandler(widget, descendant, pwi, psi, pdi,
+			    oldTarget ? XtBuildEventMask(oldTarget) : 0);
+
+	    if (widget != shell)
+		XtAddEventHandler(
+			shell,
+			FocusChangeMask | EnterWindowMask | LeaveWindowMask,
+			False,
+			_XtHandleFocus,
+			(XtPointer)psi
+		       );
+
+	    if (! XtIsRealized(target)) {
+		XtAddEventHandler(target, (EventMask)StructureNotifyMask,
+				  False, QueryEventMask, (XtPointer)widget);
+		pwi->map_handler_added = TRUE;
+		pwi->queryEventDescendant = descendant;
+	    }
+	}
+    }
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHsetKeyboardFocus;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer) descendant;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
diff --git a/libXt/src/Makefile.am b/libXt/src/Makefile.am
new file mode 100644
index 000000000..a43fb2283
--- /dev/null
+++ b/libXt/src/Makefile.am
@@ -0,0 +1,105 @@
+lib_LTLIBRARIES = libXt.la
+
+BUILT_SOURCES = $(BUILT_FILES)
+CLEANFILES = $(BUILT_SOURCES)
+
+SRCH_DEFINES = -DXFILESEARCHPATHDEFAULT=\"$(XFILESEARCHPATHDEFAULT)\"
+ERRORDB_DEFINES = -DERRORDB=\"$(libdir)/X11/XtErrorDB\"
+
+AM_CFLAGS = $(CWARNFLAGS) $(XT_CFLAGS) $(SRCH_DEFINES) $(ERRORDB_DEFINES) \
+	$(XTMALLOC_ZERO_CFLAGS)
+
+INCLUDES = -I$(top_srcdir)/include/ -I$(top_srcdir)/include/X11 \
+	   -I$(top_builddir)/include -I$(top_builddir)/include/X11
+
+nodist_libXt_la_SOURCES = StringDefs.c
+
+libXt_la_SOURCES = \
+	ActionHook.c \
+	Alloc.c \
+	ArgList.c \
+	Callback.c \
+	ClickTime.c \
+	Composite.c \
+	Constraint.c \
+	Convert.c \
+	Converters.c \
+	Core.c \
+	Create.c \
+	Destroy.c \
+	Display.c \
+	Error.c \
+	Event.c \
+	EventUtil.c \
+	Functions.c \
+	GCManager.c \
+	Geometry.c \
+	GetActKey.c \
+	GetResList.c \
+	GetValues.c \
+	HookObj.c \
+	Hooks.c \
+	Initialize.c \
+	Intrinsic.c \
+	Keyboard.c \
+	Manage.c \
+	NextEvent.c \
+	Object.c \
+	PassivGrab.c \
+	Pointer.c \
+	Popup.c \
+	PopupCB.c \
+	RectObj.c \
+	ResConfig.c \
+	Resources.c \
+	Selection.c \
+	SetSens.c \
+	SetValues.c \
+	SetWMCW.c \
+	Shell.c \
+	TMaction.c \
+	TMgrab.c \
+	TMkey.c \
+	TMparse.c \
+	TMprint.c \
+	TMstate.c \
+	Threads.c \
+	VarCreate.c \
+	VarGet.c \
+	Varargs.c \
+	Vendor.c \
+	sharedlib.c
+
+DISTCLEANFILES = StringDefs.c
+
+libXt_la_LIBADD = @XT_LIBS@
+
+libXt_la_LDFLAGS = -version-number 6:0:0 -no-undefined
+
+#
+# The util directory contains a program that builds some of the sources. 
+# The input to this program is given in files. Unfortunately those input
+# files refers to things like
+# 
+# 	util/foo
+# 
+# so the generating program must be run from the top directory.
+# 
+
+BUILT_SOURCE = StringDefs.c 
+BUILT_HEADER = $(top_builddir)/include/X11/StringDefs.h $(top_builddir)/include/X11/Shell.h
+BUILT_FILES = $(BUILT_SOURCE) $(BUILT_HEADER)
+
+STRING_LIST = $(top_srcdir)/util/string.list
+
+all-local: $(BUILT_FILES)
+
+$(BUILT_HEADER): $(BUILT_SOURCE)
+
+$(BUILT_SOURCE):
+	$(top_builddir)/util/makestrs -i $(top_srcdir) $(STRINGSABIOPTIONS) < $(STRING_LIST) > StringDefs.c
+	mkdir -p $(top_builddir)/src
+	mkdir -p $(top_builddir)/include/X11
+	cp StringDefs.h $(top_builddir)/include/X11
+	cp Shell.h $(top_builddir)/include/X11
+	rm StringDefs.h Shell.h
diff --git a/libXt/src/Makefile.in b/libXt/src/Makefile.in
new file mode 100644
index 000000000..acd2983d9
--- /dev/null
+++ b/libXt/src/Makefile.in
@@ -0,0 +1,729 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libXt_la_DEPENDENCIES =
+am_libXt_la_OBJECTS = ActionHook.lo Alloc.lo ArgList.lo Callback.lo \
+	ClickTime.lo Composite.lo Constraint.lo Convert.lo \
+	Converters.lo Core.lo Create.lo Destroy.lo Display.lo Error.lo \
+	Event.lo EventUtil.lo Functions.lo GCManager.lo Geometry.lo \
+	GetActKey.lo GetResList.lo GetValues.lo HookObj.lo Hooks.lo \
+	Initialize.lo Intrinsic.lo Keyboard.lo Manage.lo NextEvent.lo \
+	Object.lo PassivGrab.lo Pointer.lo Popup.lo PopupCB.lo \
+	RectObj.lo ResConfig.lo Resources.lo Selection.lo SetSens.lo \
+	SetValues.lo SetWMCW.lo Shell.lo TMaction.lo TMgrab.lo \
+	TMkey.lo TMparse.lo TMprint.lo TMstate.lo Threads.lo \
+	VarCreate.lo VarGet.lo Varargs.lo Vendor.lo sharedlib.lo
+nodist_libXt_la_OBJECTS = StringDefs.lo
+libXt_la_OBJECTS = $(am_libXt_la_OBJECTS) $(nodist_libXt_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libXt_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libXt_la_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libXt_la_SOURCES) $(nodist_libXt_la_SOURCES)
+DIST_SOURCES = $(libXt_la_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADMIN_MAN_DIR = @ADMIN_MAN_DIR@
+ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APP_MAN_DIR = @APP_MAN_DIR@
+APP_MAN_SUFFIX = @APP_MAN_SUFFIX@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+CHANGELOG_CMD = @CHANGELOG_CMD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CWARNFLAGS = @CWARNFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DRIVER_MAN_DIR = @DRIVER_MAN_DIR@
+DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@
+DSYMUTIL = @DSYMUTIL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FILE_MAN_DIR = @FILE_MAN_DIR@
+FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_MAN_DIR = @LIB_MAN_DIR@
+LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MALLOC_ZERO_CFLAGS = @MALLOC_ZERO_CFLAGS@
+MISC_MAN_DIR = @MISC_MAN_DIR@
+MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@
+MKDIR_P = @MKDIR_P@
+NMEDIT = @NMEDIT@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+RAWCPP = @RAWCPP@
+RAWCPPFLAGS = @RAWCPPFLAGS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRINGSABIOPTIONS = @STRINGSABIOPTIONS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XFILESEARCHPATHDEFAULT = @XFILESEARCHPATHDEFAULT@
+XMALLOC_ZERO_CFLAGS = @XMALLOC_ZERO_CFLAGS@
+XTMALLOC_ZERO_CFLAGS = @XTMALLOC_ZERO_CFLAGS@
+XT_CFLAGS = @XT_CFLAGS@
+XT_LIBS = @XT_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+appdefaultdir = @appdefaultdir@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+distcleancheck_listfiles = @distcleancheck_listfiles@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+lib_LTLIBRARIES = libXt.la
+BUILT_SOURCES = $(BUILT_FILES)
+CLEANFILES = $(BUILT_SOURCES)
+SRCH_DEFINES = -DXFILESEARCHPATHDEFAULT=\"$(XFILESEARCHPATHDEFAULT)\"
+ERRORDB_DEFINES = -DERRORDB=\"$(libdir)/X11/XtErrorDB\"
+AM_CFLAGS = $(CWARNFLAGS) $(XT_CFLAGS) $(SRCH_DEFINES) $(ERRORDB_DEFINES) \
+	$(XTMALLOC_ZERO_CFLAGS)
+
+INCLUDES = -I$(top_srcdir)/include/ -I$(top_srcdir)/include/X11 \
+	   -I$(top_builddir)/include -I$(top_builddir)/include/X11
+
+nodist_libXt_la_SOURCES = StringDefs.c
+libXt_la_SOURCES = \
+	ActionHook.c \
+	Alloc.c \
+	ArgList.c \
+	Callback.c \
+	ClickTime.c \
+	Composite.c \
+	Constraint.c \
+	Convert.c \
+	Converters.c \
+	Core.c \
+	Create.c \
+	Destroy.c \
+	Display.c \
+	Error.c \
+	Event.c \
+	EventUtil.c \
+	Functions.c \
+	GCManager.c \
+	Geometry.c \
+	GetActKey.c \
+	GetResList.c \
+	GetValues.c \
+	HookObj.c \
+	Hooks.c \
+	Initialize.c \
+	Intrinsic.c \
+	Keyboard.c \
+	Manage.c \
+	NextEvent.c \
+	Object.c \
+	PassivGrab.c \
+	Pointer.c \
+	Popup.c \
+	PopupCB.c \
+	RectObj.c \
+	ResConfig.c \
+	Resources.c \
+	Selection.c \
+	SetSens.c \
+	SetValues.c \
+	SetWMCW.c \
+	Shell.c \
+	TMaction.c \
+	TMgrab.c \
+	TMkey.c \
+	TMparse.c \
+	TMprint.c \
+	TMstate.c \
+	Threads.c \
+	VarCreate.c \
+	VarGet.c \
+	Varargs.c \
+	Vendor.c \
+	sharedlib.c
+
+DISTCLEANFILES = StringDefs.c
+libXt_la_LIBADD = @XT_LIBS@
+libXt_la_LDFLAGS = -version-number 6:0:0 -no-undefined
+
+#
+# The util directory contains a program that builds some of the sources. 
+# The input to this program is given in files. Unfortunately those input
+# files refers to things like
+# 
+# 	util/foo
+# 
+# so the generating program must be run from the top directory.
+# 
+BUILT_SOURCE = StringDefs.c 
+BUILT_HEADER = $(top_builddir)/include/X11/StringDefs.h $(top_builddir)/include/X11/Shell.h
+BUILT_FILES = $(BUILT_SOURCE) $(BUILT_HEADER)
+STRING_LIST = $(top_srcdir)/util/string.list
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libXt.la: $(libXt_la_OBJECTS) $(libXt_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libXt_la_LINK) -rpath $(libdir) $(libXt_la_OBJECTS) $(libXt_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ActionHook.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Alloc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ArgList.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Callback.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ClickTime.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Composite.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Constraint.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Convert.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Converters.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Core.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Create.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Destroy.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Display.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Event.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EventUtil.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Functions.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GCManager.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Geometry.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetActKey.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetResList.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetValues.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HookObj.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Hooks.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Initialize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Intrinsic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Keyboard.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Manage.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NextEvent.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Object.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PassivGrab.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Pointer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Popup.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PopupCB.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RectObj.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ResConfig.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Resources.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Selection.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SetSens.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SetValues.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SetWMCW.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Shell.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StringDefs.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TMaction.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TMgrab.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TMkey.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TMparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TMprint.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TMstate.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Threads.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VarCreate.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VarGet.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Varargs.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Vendor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sharedlib.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) all-local
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
+	clean-generic clean-libLTLIBRARIES clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-libLTLIBRARIES install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-libLTLIBRARIES
+
+
+all-local: $(BUILT_FILES)
+
+$(BUILT_HEADER): $(BUILT_SOURCE)
+
+$(BUILT_SOURCE):
+	$(top_builddir)/util/makestrs -i $(top_srcdir) $(STRINGSABIOPTIONS) < $(STRING_LIST) > StringDefs.c
+	mkdir -p $(top_builddir)/src
+	mkdir -p $(top_builddir)/include/X11
+	cp StringDefs.h $(top_builddir)/include/X11
+	cp Shell.h $(top_builddir)/include/X11
+	rm StringDefs.h Shell.h
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libXt/src/Manage.c b/libXt/src/Manage.c
new file mode 100644
index 000000000..05957a2fa
--- /dev/null
+++ b/libXt/src/Manage.c
@@ -0,0 +1,491 @@
+/* $Xorg: Manage.c,v 1.4 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Manage.c,v 3.10tsi Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+static String XtNinvalidChild = "invalidChild";
+static String XtNxtUnmanageChildren = "xtUnmanageChildren";
+static String XtNxtManageChildren = "xtManageChildren";
+static String XtNxtChangeManagedSet = "xtChangeManagedSet";
+
+static void UnmanageChildren(
+    WidgetList children,
+    Cardinal num_children,
+    Widget parent,
+    Cardinal* num_unique_children,
+    Boolean call_change_managed,
+    String caller_func)
+{
+    Widget		child;
+    Cardinal		i;
+    XtWidgetProc	change_managed = NULL;
+    Bool		parent_realized = False;
+
+    *num_unique_children = 0;
+
+    if (XtIsComposite((Widget) parent)) {
+	LOCK_PROCESS;
+        change_managed = ((CompositeWidgetClass) parent->core.widget_class)
+		    ->composite_class.change_managed;
+	UNLOCK_PROCESS;
+	parent_realized = XtIsRealized((Widget)parent);
+    } else {
+        XtAppErrorMsg(XtWidgetToApplicationContext((Widget)parent),
+		      "invalidParent",caller_func, XtCXtToolkitError,
+		   "Attempt to unmanage a child when parent is not Composite",
+		      (String *) NULL, (Cardinal *) NULL);
+    }
+
+    for (i = 0; i < num_children; i++) {
+	child = children[i];
+	if (child == NULL) {
+	    XtAppWarningMsg(XtWidgetToApplicationContext(parent),
+		  XtNinvalidChild,caller_func,XtCXtToolkitError,
+                  "Null child passed to XtUnmanageChildren",
+		  (String *)NULL, (Cardinal *)NULL);
+	    return;
+	}
+        if (child->core.parent != parent) {
+	   XtAppWarningMsg(XtWidgetToApplicationContext(parent),
+		   "ambiguousParent",caller_func,XtCXtToolkitError,
+           "Not all children have same parent in UnmanageChildren",
+             (String *)NULL, (Cardinal *)NULL);
+	} else
+        if (child->core.managed) {
+            (*num_unique_children)++;
+	    CALLGEOTAT(_XtGeoTrace(child,"Child \"%s\" is marked unmanaged\n",
+			   XtName(child)));
+	    child->core.managed = FALSE;
+            if (XtIsWidget(child)
+		&& XtIsRealized(child)
+		&& child->core.mapped_when_managed)
+                    XtUnmapWidget(child);
+            else
+	    { /* RectObj child */
+		Widget pw = child->core.parent;
+		RectObj r = (RectObj) child;
+		while ((pw!=NULL) && (!XtIsWidget(pw))) pw = pw->core.parent;
+		if ((pw!=NULL) && XtIsRealized (pw))
+		    XClearArea (XtDisplay (pw), XtWindow (pw),
+			r->rectangle.x, r->rectangle.y,
+			r->rectangle.width + (r->rectangle.border_width << 1),
+			r->rectangle.height + (r->rectangle.border_width << 1),
+			TRUE);
+	    }
+
+        }
+    }
+    if (call_change_managed && *num_unique_children != 0 &&
+	change_managed != NULL && parent_realized) {
+	CALLGEOTAT(_XtGeoTrace((Widget)parent,
+		       "Call parent: \"%s\"[%d,%d]'s changemanaged proc\n",
+		       XtName((Widget)parent),
+		       parent->core.width,parent->core.height));
+	(*change_managed) (parent);
+    }
+} /* UnmanageChildren */
+
+void XtUnmanageChildren (
+    WidgetList children,
+    Cardinal num_children)
+{
+    Widget parent, hookobj;
+    Cardinal ii;
+#ifdef XTHREADS
+    XtAppContext app;
+#endif
+
+    if (num_children == 0) return;
+    if (children[0] == NULL) {
+	XtWarningMsg(XtNinvalidChild,XtNxtUnmanageChildren,XtCXtToolkitError,
+		     "Null child found in argument list to unmanage",
+		     (String *)NULL, (Cardinal *)NULL);
+	return;
+    }
+#ifdef XTHREADS
+    app = XtWidgetToApplicationContext(children[0]);
+#endif
+    LOCK_APP(app);
+    parent = children[0]->core.parent;
+    if (parent->core.being_destroyed) {
+	UNLOCK_APP(app);
+	return;
+    }
+    UnmanageChildren(children, num_children, parent, &ii,
+		     (Boolean)True, XtNxtUnmanageChildren);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(children[0]));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHunmanageChildren;
+	call_data.widget = parent;
+	call_data.event_data = (XtPointer) children;
+	call_data.num_event_data = num_children;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtUnmanageChildren */
+
+void XtUnmanageChild(
+    Widget child)
+{
+    XtUnmanageChildren(&child, (Cardinal)1);
+} /* XtUnmanageChild */
+
+
+static void ManageChildren(
+    WidgetList  children,
+    Cardinal    num_children,
+    Widget	parent,
+    Boolean	call_change_managed,
+    String	caller_func)
+{
+#define MAXCHILDREN 100
+    Widget		child;
+    Cardinal		num_unique_children, i;
+    XtWidgetProc	change_managed = NULL;
+    WidgetList		unique_children;
+    Widget		cache[MAXCHILDREN];
+    Bool		parent_realized = False;
+
+    if (XtIsComposite((Widget) parent)) {
+	LOCK_PROCESS;
+        change_managed = ((CompositeWidgetClass) parent->core.widget_class)
+		    ->composite_class.change_managed;
+	UNLOCK_PROCESS;
+	parent_realized = XtIsRealized((Widget)parent);
+    } else {
+	XtAppErrorMsg(XtWidgetToApplicationContext((Widget)parent),
+		"invalidParent",caller_func, XtCXtToolkitError,
+	    "Attempt to manage a child when parent is not Composite",
+	    (String *) NULL, (Cardinal *) NULL);
+    }
+
+    /* Construct new list of children that really need to be operated upon. */
+    if (num_children <= MAXCHILDREN) {
+	unique_children = cache;
+    } else {
+	unique_children = (WidgetList) __XtMalloc(num_children * sizeof(Widget));
+    }
+    num_unique_children = 0;
+    for (i = 0; i < num_children; i++) {
+	child = children[i];
+	if (child == NULL) {
+	    XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
+		XtNinvalidChild,caller_func,XtCXtToolkitError,
+		"null child passed to ManageChildren",
+		(String *)NULL, (Cardinal *)NULL);
+	    if (unique_children != cache) XtFree((char *) unique_children);
+	    return;
+	}
+#ifdef DEBUG
+	if (!XtIsRectObj(child)) {
+	    String params[2];
+	    Cardinal num_params = 2;
+	    params[0] = XtName(child);
+	    params[1] = child->core.widget_class->core_class.class_name;
+	    XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
+			    "notRectObj",caller_func,XtCXtToolkitError,
+			    "child \"%s\", class %s is not a RectObj",
+			    params, &num_params);
+	    continue;
+	}
+#endif /*DEBUG*/
+        if (child->core.parent != parent) {
+	    XtAppWarningMsg(XtWidgetToApplicationContext((Widget)parent),
+		    "ambiguousParent",caller_func,XtCXtToolkitError,
+		"Not all children have same parent in XtManageChildren",
+		(String *)NULL, (Cardinal *)NULL);
+	} else if (! child->core.managed && !child->core.being_destroyed) {
+	    unique_children[num_unique_children++] = child;
+	    CALLGEOTAT(_XtGeoTrace(child,
+			   "Child \"%s\"[%d,%d] is marked managed\n",
+			   XtName(child),
+			   child->core.width,child->core.height));
+	    child->core.managed = TRUE;
+	}
+    }
+
+    if ((call_change_managed || num_unique_children != 0) && parent_realized) {
+	/* Compute geometry of new managed set of children. */
+	if (change_managed != NULL) {
+	    CALLGEOTAT(_XtGeoTrace((Widget)parent,
+			   "Call parent: \"%s\"[%d,%d]'s changemanaged\n",
+			   XtName((Widget)parent),
+			   parent->core.width,parent->core.height));
+	    (*change_managed) ((Widget)parent);
+	}
+
+	/* Realize each child if necessary, then map if necessary */
+	for (i = 0; i < num_unique_children; i++) {
+	    child = unique_children[i];
+	    if (XtIsWidget(child)) {
+		if (! XtIsRealized(child)) XtRealizeWidget(child);
+		if (child->core.mapped_when_managed) XtMapWidget(child);
+	    } else { /* RectObj child */
+		Widget pw = child->core.parent;
+		RectObj r = (RectObj) child;
+		while ((pw!=NULL) && (!XtIsWidget(pw)))
+		    pw = pw->core.parent;
+		if (pw != NULL)
+		    XClearArea (XtDisplay (pw), XtWindow (pw),
+		    r->rectangle.x, r->rectangle.y,
+		    r->rectangle.width + (r->rectangle.border_width << 1),
+		    r->rectangle.height + (r->rectangle.border_width << 1),
+		    TRUE);
+            }
+        }
+    }
+
+    if (unique_children != cache) XtFree((char *) unique_children);
+} /* ManageChildren */
+
+void XtManageChildren(
+    WidgetList children,
+    Cardinal num_children)
+{
+    Widget parent, hookobj;
+#ifdef XTHREADS
+    XtAppContext app;
+#endif
+
+    if (num_children == 0) return;
+    if (children[0] == NULL) {
+	XtWarningMsg(XtNinvalidChild, XtNxtManageChildren, XtCXtToolkitError,
+		     "null child passed to XtManageChildren",
+		     (String*)NULL, (Cardinal*)NULL);
+	return;
+    }
+#ifdef XTHREADS
+    app = XtWidgetToApplicationContext(children[0]);
+#endif
+    LOCK_APP(app);
+    parent = children[0]->core.parent;
+    if (parent->core.being_destroyed) {
+	UNLOCK_APP(app);
+	return;
+    }
+    ManageChildren(children, num_children, parent, (Boolean)False,
+		   XtNxtManageChildren);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(children[0]));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHmanageChildren;
+	call_data.widget = parent;
+	call_data.event_data = (XtPointer) children;
+	call_data.num_event_data = num_children;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtManageChildren */
+
+void XtManageChild(
+    Widget child)
+{
+    XtManageChildren(&child, (Cardinal) 1);
+} /* XtManageChild */
+
+
+void XtSetMappedWhenManaged(
+    Widget widget,
+    _XtBoolean mapped_when_managed)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (widget->core.mapped_when_managed == mapped_when_managed) {
+	UNLOCK_APP(app);
+	return;
+    }
+    widget->core.mapped_when_managed = mapped_when_managed;
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHsetMappedWhenManaged;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer) (unsigned long) mapped_when_managed;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+
+    if (! XtIsManaged(widget)) {
+	UNLOCK_APP(app);
+	return;
+    }
+
+    if (mapped_when_managed) {
+	/* Didn't used to be mapped when managed.		*/
+	if (XtIsRealized(widget)) XtMapWidget(widget);
+    } else {
+	/* Used to be mapped when managed.			*/
+	if (XtIsRealized(widget)) XtUnmapWidget(widget);
+    }
+    UNLOCK_APP(app);
+} /* XtSetMappedWhenManaged */
+
+
+void XtChangeManagedSet(
+    WidgetList unmanage_children,
+    Cardinal num_unmanage,
+    XtDoChangeProc do_change_proc,
+    XtPointer client_data,
+    WidgetList manage_children,
+    Cardinal num_manage)
+{
+    WidgetList childp;
+    Widget parent;
+    int i;
+    Cardinal some_unmanaged;
+    Boolean call_out;
+    CompositeClassExtension ext;
+    XtAppContext app;
+    Widget hookobj;
+    XtChangeHookDataRec call_data;
+
+    if (num_unmanage == 0 && num_manage == 0)
+	return;
+
+    /* specification doesn't state that library will check for NULL in list */
+
+    childp = num_unmanage ? unmanage_children : manage_children;
+    app = XtWidgetToApplicationContext(*childp);
+    LOCK_APP(app);
+
+    parent = XtParent(*childp);
+    childp = unmanage_children;
+    for (i = num_unmanage; --i >= 0 && XtParent(*childp) == parent; childp++);
+    call_out = (i >= 0);
+    childp = manage_children;
+    for (i = num_manage;   --i >= 0 && XtParent(*childp) == parent; childp++);
+    if (call_out || i >= 0) {
+	XtAppWarningMsg(app, "ambiguousParent", XtNxtChangeManagedSet,
+			XtCXtToolkitError, "Not all children have same parent",
+			(String *)NULL, (Cardinal *)NULL);
+    }
+    if (! XtIsComposite(parent)) {
+	UNLOCK_APP(app);
+	XtAppErrorMsg(app, "invalidParent", XtNxtChangeManagedSet,
+		      XtCXtToolkitError,
+		      "Attempt to manage a child when parent is not Composite",
+		      (String *) NULL, (Cardinal *) NULL);
+    }
+    if (parent->core.being_destroyed) {
+	UNLOCK_APP(app);
+	return;
+    }
+
+    call_out = False;
+    if (do_change_proc) {
+	ext = (CompositeClassExtension)
+	    XtGetClassExtension(parent->core.widget_class,
+				XtOffsetOf(CompositeClassRec,
+					   composite_class.extension),
+				NULLQUARK, XtCompositeExtensionVersion,
+				sizeof(CompositeClassExtensionRec));
+	if (!ext || !ext->allows_change_managed_set)
+	    call_out = True;
+    }
+
+    UnmanageChildren(unmanage_children, num_unmanage, parent,
+		     &some_unmanaged, call_out, XtNxtChangeManagedSet);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(parent));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	call_data.type = XtHunmanageSet;
+	call_data.widget = parent;
+	call_data.event_data = (XtPointer) unmanage_children;
+	call_data.num_event_data = num_unmanage;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer) &call_data);
+    }
+
+    if (do_change_proc)
+	(*do_change_proc)(parent, unmanage_children, &num_unmanage,
+			  manage_children, &num_manage, client_data);
+
+    call_out = (some_unmanaged && !call_out);
+    ManageChildren(manage_children, num_manage, parent, call_out,
+		   XtNxtChangeManagedSet);
+
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	call_data.type = XtHmanageSet;
+	call_data.event_data = (XtPointer) manage_children;
+	call_data.num_event_data = num_manage;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer) &call_data);
+    }
+    UNLOCK_APP(app);
+} /* XtChangeManagedSet */
diff --git a/libXt/src/NextEvent.c b/libXt/src/NextEvent.c
new file mode 100644
index 000000000..c696af336
--- /dev/null
+++ b/libXt/src/NextEvent.c
@@ -0,0 +1,1617 @@
+/* $Xorg: NextEvent.c,v 1.8 2001/02/09 02:03:55 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998, 2001  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/NextEvent.c,v 3.26 2002/06/04 21:55:42 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <stdio.h>
+#include <errno.h>
+
+#ifdef __UNIXOS2__
+#include <sys/time.h>
+#endif
+
+static TimerEventRec* freeTimerRecs;
+static WorkProcRec* freeWorkRecs;
+static SignalEventRec* freeSignalRecs;
+
+/* Some systems running NTP daemons are known to return strange usec
+ * values from gettimeofday.
+ */
+
+#ifndef NEEDS_NTPD_FIXUP
+# if defined(sun) || defined(MOTOROLA) || (defined(__osf__) && defined(__alpha))
+#  define NEEDS_NTPD_FIXUP 1
+# else
+#  define NEEDS_NTPD_FIXUP 0
+# endif
+#endif
+
+#if NEEDS_NTPD_FIXUP
+#define FIXUP_TIMEVAL(t) { \
+	while ((t).tv_usec >= 1000000) { \
+	    (t).tv_usec -= 1000000; \
+	    (t).tv_sec++; \
+	} \
+	while ((t).tv_usec < 0) { \
+	    if ((t).tv_sec > 0) { \
+		(t).tv_usec += 1000000; \
+		(t).tv_sec--; \
+	    } else { \
+		(t).tv_usec = 0; \
+		break; \
+	    } \
+	}}
+#else
+#define FIXUP_TIMEVAL(t)
+#endif /*NEEDS_NTPD_FIXUP*/
+
+/*
+ * Private routines
+ */
+#define ADD_TIME(dest, src1, src2) { \
+	if(((dest).tv_usec = (src1).tv_usec + (src2).tv_usec) >= 1000000) {\
+	      (dest).tv_usec -= 1000000;\
+	      (dest).tv_sec = (src1).tv_sec + (src2).tv_sec + 1 ; \
+	} else { (dest).tv_sec = (src1).tv_sec + (src2).tv_sec ; \
+	   if(((dest).tv_sec >= 1) && (((dest).tv_usec <0))) { \
+	    (dest).tv_sec --;(dest).tv_usec += 1000000; } } }
+
+
+#define TIMEDELTA(dest, src1, src2) { \
+	if(((dest).tv_usec = (src1).tv_usec - (src2).tv_usec) < 0) {\
+	      (dest).tv_usec += 1000000;\
+	      (dest).tv_sec = (src1).tv_sec - (src2).tv_sec - 1;\
+	} else 	(dest).tv_sec = (src1).tv_sec - (src2).tv_sec;  }
+
+#define IS_AFTER(t1, t2) (((t2).tv_sec > (t1).tv_sec) \
+	|| (((t2).tv_sec == (t1).tv_sec)&& ((t2).tv_usec > (t1).tv_usec)))
+
+#define IS_AT_OR_AFTER(t1, t2) (((t2).tv_sec > (t1).tv_sec) \
+	|| (((t2).tv_sec == (t1).tv_sec)&& ((t2).tv_usec >= (t1).tv_usec)))
+
+#ifdef USE_POLL
+#ifndef XT_DEFAULT_FDLIST_SIZE
+#define XT_DEFAULT_FDLIST_SIZE 32
+#endif
+#endif
+
+static void AdjustHowLong (
+	unsigned long *howlong,
+	struct timeval *start_time)
+{
+	struct timeval new_time, time_spent, lstart_time;
+
+	lstart_time = *start_time;
+	X_GETTIMEOFDAY (&new_time);
+	FIXUP_TIMEVAL(new_time);
+	TIMEDELTA(time_spent, new_time, lstart_time);
+	if(*howlong <= (unsigned long)(time_spent.tv_sec*1000+time_spent.tv_usec/1000))
+	    *howlong = (unsigned long)0;  /* Timed out */
+	else
+	    *howlong -= (time_spent.tv_sec*1000+time_spent.tv_usec/1000);
+}
+
+typedef struct {
+    struct timeval cur_time;
+    struct timeval start_time;
+    struct timeval wait_time;
+    struct timeval new_time;
+    struct timeval time_spent;
+    struct timeval max_wait_time;
+#ifndef USE_POLL
+    struct timeval *wait_time_ptr;
+#else
+    int poll_wait;
+#endif
+} wait_times_t, *wait_times_ptr_t;
+
+static struct timeval  zero_time = { 0 , 0};
+#ifndef USE_POLL
+static fd_set zero_fd;
+#else
+#define X_BLOCK -1
+#define X_DONT_BLOCK 0
+#endif
+
+static void InitTimes (
+    Boolean block,
+    unsigned long* howlong,
+    wait_times_ptr_t wt)
+{
+    if (block) {
+	X_GETTIMEOFDAY (&wt->cur_time);
+	FIXUP_TIMEVAL(wt->cur_time);
+	wt->start_time = wt->cur_time;
+	if(howlong == NULL) { /* special case for ever */
+#ifndef USE_POLL
+	    wt->wait_time_ptr = NULL;
+#else
+	    wt->poll_wait = X_BLOCK;
+#endif
+	} else { /* block until at most */
+	    wt->max_wait_time.tv_sec = *howlong/1000;
+	    wt->max_wait_time.tv_usec = (*howlong %1000)*1000;
+#ifndef USE_POLL
+	    wt->wait_time_ptr = &wt->max_wait_time;
+#else
+	    wt->poll_wait = *howlong;
+#endif
+	}
+    } else {  /* don't block */
+	wt->max_wait_time = zero_time;
+#ifndef USE_POLL
+	wt->wait_time_ptr = &wt->max_wait_time;
+#else
+	wt->poll_wait = X_DONT_BLOCK;
+#endif
+    }
+}
+
+typedef struct {
+#ifndef USE_POLL
+    fd_set rmask, wmask, emask;
+    int nfds;
+#else
+    struct pollfd* fdlist;
+    struct pollfd* stack;
+    int fdlistlen, num_dpys;
+#endif
+} wait_fds_t, *wait_fds_ptr_t;
+
+static void InitFds (
+    XtAppContext app,
+    Boolean ignoreEvents,
+    Boolean ignoreInputs,
+    wait_fds_ptr_t wf)
+{
+    int ii;
+    app->rebuild_fdlist = FALSE;
+#ifndef USE_POLL
+    wf->nfds = app->fds.nfds;
+    if( !ignoreInputs ) {
+	wf->rmask = app->fds.rmask;
+	wf->wmask = app->fds.wmask;
+	wf->emask = app->fds.emask;
+     } else
+	wf->rmask = wf->wmask = wf->emask = zero_fd;
+
+     if (!ignoreEvents)
+	for (ii = 0; ii < app->count; ii++) {
+	    FD_SET (ConnectionNumber(app->list[ii]), &wf->rmask);
+	}
+#else
+#ifndef POLLRDNORM
+#define POLLRDNORM 0
+#endif
+
+#ifndef POLLRDBAND
+#define POLLRDBAND 0
+#endif
+
+#ifndef POLLWRNORM
+#define POLLWRNORM 0
+#endif
+
+#ifndef POLLWRBAND
+#define POLLWRBAND 0
+#endif
+
+#define XPOLL_READ (POLLIN|POLLRDNORM|POLLPRI|POLLRDBAND)
+#define XPOLL_WRITE (POLLOUT|POLLWRNORM|POLLWRBAND)
+#define XPOLL_EXCEPT 0
+
+    if (!ignoreEvents)
+	wf->fdlistlen = wf->num_dpys = app->count;
+    else
+	wf->fdlistlen = wf->num_dpys = 0;
+
+    if (!ignoreInputs && app->input_list != NULL) {
+	int ii;
+	for (ii = 0; ii < (int) app->input_max; ii++)
+	    if (app->input_list[ii] != NULL)
+		wf->fdlistlen++;
+    }
+
+    if (!wf->fdlist || wf->fdlist == wf->stack) {
+	wf->fdlist = (struct pollfd*)
+	    XtStackAlloc (sizeof (struct pollfd) * wf->fdlistlen, wf->stack);
+    } else {
+	wf->fdlist = (struct pollfd*)
+	    XtRealloc ((char*) wf->fdlist,
+		       sizeof (struct pollfd) * wf->fdlistlen);
+    }
+
+    if (wf->fdlistlen) {
+	struct pollfd* fdlp = wf->fdlist;
+	InputEvent* iep;
+
+	if (!ignoreEvents)
+	    for (ii = 0 ; ii < wf->num_dpys; ii++, fdlp++) {
+		fdlp->fd = ConnectionNumber (app->list[ii]);
+		fdlp->events = POLLIN;
+	    }
+	if (!ignoreInputs && app->input_list != NULL)
+	    for (ii = 0; ii < app->input_max; ii++)
+		if (app->input_list[ii] != NULL) {
+		    iep = app->input_list[ii];
+		    fdlp->fd = ii;
+		    fdlp->events = 0;
+		    for ( ; iep; iep = iep->ie_next) {
+			if (iep->ie_condition & XtInputReadMask)
+			    fdlp->events |= XPOLL_READ;
+			if (iep->ie_condition & XtInputWriteMask)
+			    fdlp->events |= XPOLL_WRITE;
+			if (iep->ie_condition & XtInputExceptMask)
+			    fdlp->events |= XPOLL_EXCEPT;
+		    }
+		    fdlp++;
+		}
+    }
+#endif
+}
+
+static void AdjustTimes (
+    XtAppContext app,
+    Boolean block,
+    unsigned long* howlong,
+    Boolean ignoreTimers,
+    wait_times_ptr_t wt)
+{
+    if (app->timerQueue != NULL && !ignoreTimers && block) {
+	if (IS_AFTER (wt->cur_time, app->timerQueue->te_timer_value)) {
+	    TIMEDELTA (wt->wait_time, app->timerQueue->te_timer_value, wt->cur_time);
+	    if (howlong == NULL || IS_AFTER (wt->wait_time, wt->max_wait_time))
+#ifndef USE_POLL
+		wt->wait_time_ptr = &wt->wait_time;
+	    else
+		wt->wait_time_ptr = &wt->max_wait_time;
+	} else
+	    wt->wait_time_ptr = &zero_time;
+    }
+#else
+		wt->poll_wait = wt->wait_time.tv_sec * 1000 + wt->wait_time.tv_usec / 1000;
+	    else
+		wt->poll_wait = wt->max_wait_time.tv_sec * 1000 + wt->max_wait_time.tv_usec / 1000;
+	} else
+	    wt->poll_wait = X_DONT_BLOCK;
+    }
+#endif
+}
+
+
+static int IoWait (
+    wait_times_ptr_t wt,
+    wait_fds_ptr_t wf)
+{
+#ifndef USE_POLL
+    return Select (wf->nfds, &wf->rmask, &wf->wmask, &wf->emask,
+		   wt->wait_time_ptr);
+#else
+    return poll (wf->fdlist, wf->fdlistlen, wt->poll_wait);
+#endif
+}
+
+
+static void FindInputs (
+    XtAppContext app,
+    wait_fds_ptr_t wf,
+    int nfds,
+    Boolean ignoreEvents,
+    Boolean ignoreInputs,
+    int* dpy_no,
+    int* found_input)
+{
+    XtInputMask condition;
+    InputEvent *ep;
+    int ii;
+#ifndef USE_POLL /* { check ready file descriptors block */
+#ifdef XTHREADS
+    fd_set rmask;
+#endif
+    int dd;
+    *dpy_no = -1;
+    *found_input = False;
+
+#ifdef XTHREADS
+    rmask = app->fds.rmask;
+    for (dd = app->count; dd-- > 0; )
+	FD_SET (ConnectionNumber (app->list[dd]), &rmask);
+#endif
+
+    for (ii = 0; ii < wf->nfds && nfds > 0; ii++) {
+	condition = 0;
+	if (FD_ISSET (ii, &wf->rmask)
+#ifdef XTHREADS
+	    && FD_ISSET (ii, &rmask)
+#endif
+	) {
+	    nfds--;
+	    if (!ignoreEvents) {
+		for (dd = 0; dd < app->count; dd++) {
+		    if (ii == ConnectionNumber (app->list[dd])) {
+			if (*dpy_no == -1) {
+			    if (XEventsQueued (app->list[dd], QueuedAfterReading ))
+				*dpy_no = dd;
+				/*
+				 * An error event could have arrived
+				 * without any real events, or events
+				 * could have been swallowed by Xlib,
+				 * or the connection may be broken.
+				 * We can't tell the difference, so
+				 * assume Xlib will eventually discover
+				 * a broken connection.
+				 */
+			}
+			goto ENDILOOP;
+		    }
+		}
+	    }
+	    condition = XtInputReadMask;
+	}
+	if (FD_ISSET (ii, &wf->wmask)
+#ifdef XTHREADS
+	    && FD_ISSET (ii, &app->fds.wmask)
+#endif
+	) {
+	    condition |= XtInputWriteMask;
+	    nfds--;
+	}
+	if (FD_ISSET (ii, &wf->emask)
+#ifdef XTHREADS
+	    && FD_ISSET (ii, &app->fds.emask)
+#endif
+	) {
+	    condition |= XtInputExceptMask;
+	    nfds--;
+	}
+	if (condition) {
+	    for (ep = app->input_list[ii]; ep; ep = ep->ie_next)
+		if (condition & ep->ie_condition) {
+		    /* make sure this input isn't already marked outstanding */
+		    InputEvent	*oq;
+		    for (oq = app->outstandingQueue; oq; oq = oq->ie_oq)
+			if (oq == ep)
+			    break;
+		    if (!oq)
+		    {
+			ep->ie_oq = app->outstandingQueue;
+			app->outstandingQueue = ep;
+		    }
+		}
+	    *found_input = True;
+	}
+ENDILOOP:   ;
+    } /* endfor */
+#else /* }{ */
+    struct pollfd* fdlp;
+
+    *dpy_no = -1;
+    *found_input = False;
+
+    if (!ignoreEvents) {
+	fdlp = wf->fdlist;
+	for (ii = 0; ii < wf->num_dpys; ii++, fdlp++) {
+	    if (*dpy_no == -1 && fdlp->revents & (POLLIN|POLLHUP|POLLERR) &&
+#ifdef XTHREADS
+		!(fdlp->revents & POLLNVAL) &&
+#endif
+		XEventsQueued (app->list[ii], QueuedAfterReading)) {
+		*dpy_no = ii;
+		break;
+	    }
+	}
+    }
+
+    if (!ignoreInputs) {
+	fdlp = &wf->fdlist[wf->num_dpys];
+	for (ii = wf->num_dpys; ii < wf->fdlistlen; ii++, fdlp++) {
+	    condition = 0;
+	    if (fdlp->revents) {
+		if (fdlp->revents & (XPOLL_READ|POLLHUP|POLLERR)
+#ifdef XTHREADS
+		    && !(fdlp->revents & POLLNVAL)
+#endif
+		)
+		    condition = XtInputReadMask;
+		if (fdlp->revents & XPOLL_WRITE)
+		    condition |= XtInputWriteMask;
+		if (fdlp->revents & XPOLL_EXCEPT)
+		    condition |= XtInputExceptMask;
+	    }
+	    if (condition) {
+		*found_input = True;
+		for (ep = app->input_list[fdlp->fd]; ep; ep = ep->ie_next)
+		    if (condition & ep->ie_condition) {
+			InputEvent	*oq;
+			/* make sure this input isn't already marked outstanding */
+			for (oq = app->outstandingQueue; oq; oq = oq->ie_oq)
+			    if (oq == ep)
+				break;
+			if (!oq)
+			{
+			    ep->ie_oq = app->outstandingQueue;
+			    app->outstandingQueue = ep;
+			}
+		    }
+	    }
+	}
+    }
+#endif /* } */
+}
+
+/*
+ * Routine to block in the toolkit.  This should be the only call to select.
+ *
+ * This routine returns when there is something to be done.
+ *
+ * Before calling this with ignoreInputs==False, app->outstandingQueue should
+ * be checked; this routine will not verify that an alternate input source
+ * has not already been enqueued.
+ *
+ *
+ * _XtWaitForSomething( appContext,
+ *                      ignoreEvent, ignoreTimers, ignoreInputs, ignoreSignals,
+ *			block, drop_lock, howlong)
+ * XtAppContext app;	     (Displays to check wait on)
+ *
+ * Boolean ignoreEvents;     (Don't return if XEvents are available
+ *                              Also implies forget XEvents exist)
+ *
+ * Boolean ignoreTimers;     (Ditto for timers)
+ *
+ * Boolean ignoreInputs;     (Ditto for input callbacks )
+ *
+ * Boolean ignoreSignals;    (Ditto for signals)
+ *
+ * Boolean block;	     (Okay to block)
+ *
+ * Boolean drop_lock         (drop lock before going into select/poll)
+ *
+ * TimeVal howlong;	     (howlong to wait for if blocking and not
+ *				doing Timers... Null means forever.
+ *				Maybe should mean shortest of both)
+ * Returns display for which input is available, if any
+ * and if ignoreEvents==False, else returns -1
+ *
+ * if ignoring everything && block=True && howlong=NULL, you'll have
+ * lots of time for coffee; better not try it!  In fact, it probably
+ * makes little sense to do this regardless of the value of howlong
+ * (bottom line is, we don't bother checking here).
+ *
+ * If drop_lock is FALSE, the app->lock->mutex is not unlocked before
+ * entering select/poll. It is illegal for drop_lock to be FALSE if
+ * ignoreTimers, ignoreInputs, or ignoreSignals is FALSE.
+ */
+int _XtWaitForSomething(
+    XtAppContext app,
+    _XtBoolean ignoreEvents,
+    _XtBoolean ignoreTimers,
+    _XtBoolean ignoreInputs,
+    _XtBoolean ignoreSignals,
+    _XtBoolean block,
+#ifdef XTHREADS
+    _XtBoolean drop_lock,
+#endif
+    unsigned long *howlong)
+{
+    wait_times_t wt;
+    wait_fds_t wf;
+    int nfds, dpy_no, found_input, dd;
+#ifdef XTHREADS
+    Boolean push_thread = TRUE;
+    Boolean pushed_thread = FALSE;
+    int level = 0;
+#endif
+#ifdef USE_POLL
+    struct pollfd fdlist[XT_DEFAULT_FDLIST_SIZE];
+#endif
+
+#ifdef XTHREADS
+    /* assert ((ignoreTimers && ignoreInputs && ignoreSignals) || drop_lock); */
+    /* If not multi-threaded, never drop lock */
+    if (app->lock == (ThreadAppProc) NULL)
+	drop_lock = FALSE;
+#endif
+
+    InitTimes (block, howlong, &wt);
+
+#ifdef USE_POLL
+    wf.fdlist = NULL;
+    wf.stack = fdlist;
+    wf.fdlistlen = wf.num_dpys = 0;
+#endif
+
+WaitLoop:
+    app->rebuild_fdlist = TRUE;
+
+    while (1) {
+	AdjustTimes (app, block, howlong, ignoreTimers, &wt);
+
+	if (block && app->block_hook_list) {
+	    BlockHook hook;
+	    for (hook = app->block_hook_list;
+		 hook != NULL;
+		 hook = hook->next)
+		(*hook->proc) (hook->closure);
+
+	    if (!ignoreEvents)
+		/* see if the hook(s) generated any protocol */
+		for (dd = 0; dd < app->count; dd++)
+		    if (XEventsQueued(app->list[dd], QueuedAlready)) {
+#ifdef USE_POLL
+			XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+			return dd;
+		    }
+	}
+
+	if (app->rebuild_fdlist)
+	    InitFds (app, ignoreEvents, ignoreInputs, &wf);
+
+#ifdef XTHREADS /* { */
+	if (drop_lock) {
+	    YIELD_APP_LOCK(app, &push_thread, &pushed_thread, &level);
+	    nfds = IoWait (&wt, &wf);
+	    RESTORE_APP_LOCK(app, level, &pushed_thread);
+	} else
+#endif /* } */
+	nfds = IoWait (&wt, &wf);
+	if (nfds == -1) {
+	    /*
+	     *  interrupt occured recalculate time value and wait again.
+	     */
+	    if (errno == EINTR || errno == EAGAIN) {
+		if (errno == EAGAIN) {
+		    errno = 0;  /* errno is not self reseting */
+		    continue;
+		}
+	        errno = 0;  /* errno is not self reseting */
+
+		/* was it interrupted by a signal that we care about? */
+		if (!ignoreSignals && app->signalQueue != NULL) {
+		    SignalEventRec *se_ptr = app->signalQueue;
+		    while (se_ptr != NULL) {
+			if (se_ptr->se_notice) {
+			    if (block && howlong != NULL)
+				AdjustHowLong (howlong, &wt.start_time);
+#ifdef USE_POLL
+			    XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+			    return -1;
+			}
+			se_ptr = se_ptr->se_next;
+		    }
+		}
+
+		if (!ignoreEvents)
+		    /* get Xlib to detect a bad connection */
+		    for (dd = 0; dd < app->count; dd++)
+			if (XEventsQueued(app->list[dd], QueuedAfterReading)) {
+#ifdef USE_POLL
+			    XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+			    return dd;
+			}
+
+		if (block) {
+#ifndef USE_POLL
+		    if (wt.wait_time_ptr == NULL)
+#else
+		    if (wt.poll_wait == X_BLOCK)
+#endif
+			continue;
+		    X_GETTIMEOFDAY (&wt.new_time);
+		    FIXUP_TIMEVAL (wt.new_time);
+		    TIMEDELTA (wt.time_spent, wt.new_time, wt.cur_time);
+		    wt.cur_time = wt.new_time;
+#ifndef USE_POLL
+		    if (IS_AFTER (wt.time_spent, *wt.wait_time_ptr)) {
+			TIMEDELTA (wt.wait_time, *wt.wait_time_ptr, wt.time_spent);
+			wt.wait_time_ptr = &wt.wait_time;
+			continue;
+		    } else
+#else
+		    if ((wt.time_spent.tv_sec * 1000 + wt.time_spent.tv_usec / 1000) < wt.poll_wait) {
+			wt.poll_wait -= (wt.time_spent.tv_sec * 1000 + wt.time_spent.tv_usec / 1000);
+			continue;
+		    } else
+#endif
+			nfds = 0;
+		}
+	    } else {
+		char Errno[12];
+		String param = Errno;
+		Cardinal param_count = 1;
+
+		sprintf( Errno, "%d", errno);
+		XtAppWarningMsg(app, "communicationError","select",
+			XtCXtToolkitError,"Select failed; error code %s",
+			&param, &param_count);
+		continue;
+	    }
+	} /* timed out or input available */
+	break;
+    }
+
+    if (nfds == 0) {
+	/* Timed out */
+	if (howlong)
+	    *howlong = (unsigned long)0;
+#ifdef USE_POLL
+	XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+	return -1;
+    }
+
+    if (block && howlong != NULL)
+	AdjustHowLong (howlong, &wt.start_time);
+
+    if (ignoreInputs && ignoreEvents) {
+#ifdef USE_POLL
+	XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+	return -1;
+    } else
+	FindInputs (app, &wf, nfds,
+		    ignoreEvents, ignoreInputs,
+		    &dpy_no, &found_input);
+
+    if (dpy_no >= 0 || found_input) {
+#ifdef USE_POLL
+	XtStackFree ((XtPointer) wf.fdlist, fdlist);
+#endif
+	return dpy_no;
+    }
+    goto WaitLoop;
+}
+
+#define IeCallProc(ptr) \
+    (*ptr->ie_proc) (ptr->ie_closure, &ptr->ie_source, (XtInputId*)&ptr);
+
+#define TeCallProc(ptr) \
+    (*ptr->te_proc) (ptr->te_closure, (XtIntervalId*)&ptr);
+
+#define SeCallProc(ptr) \
+    (*ptr->se_proc) (ptr->se_closure, (XtSignalId*)&ptr);
+
+/*
+ * Public Routines
+ */
+
+XtIntervalId XtAddTimeOut(
+	unsigned long interval,
+	XtTimerCallbackProc proc,
+	XtPointer closure)
+{
+	return XtAppAddTimeOut(_XtDefaultAppContext(),
+		interval, proc, closure);
+}
+
+static void QueueTimerEvent(
+    XtAppContext app,
+    TimerEventRec *ptr)
+{
+        TimerEventRec *t,**tt;
+        tt = &app->timerQueue;
+        t  = *tt;
+        while (t != NULL &&
+                IS_AFTER(t->te_timer_value, ptr->te_timer_value)) {
+          tt = &t->te_next;
+          t  = *tt;
+         }
+         ptr->te_next = t;
+         *tt = ptr;
+}
+
+XtIntervalId XtAppAddTimeOut(
+	XtAppContext app,
+	unsigned long interval,
+	XtTimerCallbackProc proc,
+	XtPointer closure)
+{
+	TimerEventRec *tptr;
+	struct timeval current_time;
+
+	LOCK_APP(app);
+	LOCK_PROCESS;
+	if (freeTimerRecs) {
+	    tptr = freeTimerRecs;
+	    freeTimerRecs = tptr->te_next;
+	}
+	else tptr = XtNew(TimerEventRec);
+	UNLOCK_PROCESS;
+
+	tptr->te_next = NULL;
+	tptr->te_closure = closure;
+	tptr->te_proc = proc;
+	tptr->app = app;
+	tptr->te_timer_value.tv_sec = interval/1000;
+	tptr->te_timer_value.tv_usec = (interval%1000)*1000;
+        X_GETTIMEOFDAY (&current_time);
+	FIXUP_TIMEVAL(current_time);
+        ADD_TIME(tptr->te_timer_value,tptr->te_timer_value,current_time);
+	QueueTimerEvent(app, tptr);
+	UNLOCK_APP(app);
+	return( (XtIntervalId) tptr);
+}
+
+void  XtRemoveTimeOut(
+	XtIntervalId id)
+{
+	TimerEventRec *t, *last, *tid = (TimerEventRec *) id;
+	XtAppContext app = tid->app;
+
+	/* find it */
+	LOCK_APP(app);
+	for(t = app->timerQueue, last = NULL;
+	    t != NULL && t != tid;
+	    t = t->te_next) last = t;
+
+	if (t == NULL) {
+	    UNLOCK_APP(app);
+	    return; /* couldn't find it */
+	}
+	if(last == NULL) { /* first one on the list */
+	    app->timerQueue = t->te_next;
+	} else last->te_next = t->te_next;
+
+	LOCK_PROCESS;
+	t->te_next = freeTimerRecs;
+	freeTimerRecs = t;
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+}
+
+XtWorkProcId XtAddWorkProc(
+	XtWorkProc proc,
+	XtPointer closure)
+{
+	return XtAppAddWorkProc(_XtDefaultAppContext(), proc, closure);
+}
+
+XtWorkProcId XtAppAddWorkProc(
+	XtAppContext app,
+	XtWorkProc proc,
+	XtPointer closure)
+{
+	WorkProcRec *wptr;
+
+	LOCK_APP(app);
+	LOCK_PROCESS;
+	if (freeWorkRecs) {
+	    wptr = freeWorkRecs;
+	    freeWorkRecs = wptr->next;
+	} else wptr = XtNew(WorkProcRec);
+	UNLOCK_PROCESS;
+	wptr->next = app->workQueue;
+	wptr->closure = closure;
+	wptr->proc = proc;
+	wptr->app = app;
+	app->workQueue = wptr;
+	UNLOCK_APP(app);
+	return (XtWorkProcId) wptr;
+}
+
+void  XtRemoveWorkProc(
+	XtWorkProcId id)
+{
+	WorkProcRec *wid= (WorkProcRec *) id, *w, *last;
+	XtAppContext app = wid->app;
+
+	LOCK_APP(app);
+	/* find it */
+	for(w = app->workQueue, last = NULL;
+	    w != NULL && w != wid; w = w->next) last = w;
+
+	if (w == NULL) {
+	    UNLOCK_APP(app);
+	    return; /* couldn't find it */
+	}
+
+	if(last == NULL) app->workQueue = w->next;
+	else last->next = w->next;
+	LOCK_PROCESS;
+	w->next = freeWorkRecs;
+	freeWorkRecs = w;
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+}
+
+XtSignalId XtAddSignal(
+	XtSignalCallbackProc proc,
+	XtPointer closure)
+{
+	return XtAppAddSignal(_XtDefaultAppContext(), proc, closure);
+}
+
+XtSignalId XtAppAddSignal(
+	XtAppContext app,
+	XtSignalCallbackProc proc,
+	XtPointer closure)
+{
+	SignalEventRec *sptr;
+
+	LOCK_APP(app);
+	LOCK_PROCESS;
+	if (freeSignalRecs) {
+	    sptr = freeSignalRecs;
+	    freeSignalRecs = sptr->se_next;
+	} else
+	    sptr = XtNew(SignalEventRec);
+	UNLOCK_PROCESS;
+	sptr->se_next = app->signalQueue;
+	sptr->se_closure = closure;
+	sptr->se_proc = proc;
+	sptr->app = app;
+	sptr->se_notice = FALSE;
+	app->signalQueue = sptr;
+	UNLOCK_APP(app);
+	return (XtSignalId) sptr;
+}
+
+void XtRemoveSignal(
+	XtSignalId id)
+{
+	SignalEventRec *sid = (SignalEventRec*) id, *s, *last = NULL;
+	XtAppContext app = sid->app;
+
+	LOCK_APP(app);
+	for (s = app->signalQueue; s != NULL && s != sid; s = s->se_next)
+	    last = s;
+	if (s == NULL) {
+	    UNLOCK_APP(app);
+	    return;
+	}
+	if (last == NULL)
+	    app->signalQueue = s->se_next;
+	else
+	    last->se_next = s->se_next;
+	LOCK_PROCESS;
+	s->se_next = freeSignalRecs;
+	freeSignalRecs = s;
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+}
+
+void XtNoticeSignal(
+	XtSignalId id)
+{
+	/*
+	 * It would be overkill to lock the app to set this flag.
+	 * In the worst case, 2..n threads would be modifying this
+	 * flag. The last one wins. Since signals occur asynchronously
+	 * anyway, this can occur with or without threads.
+	 *
+	 * The other issue is that thread t1 sets the flag in a
+	 * signalrec that has been deleted in thread t2. We rely
+	 * on a detail of the implementation, i.e. free'd signalrecs
+	 * aren't really free'd, they're just moved to a list of
+	 * free recs, so deref'ing one won't hurt anything.
+	 *
+	 * Lastly, and perhaps most importantly, since POSIX threads
+	 * says that the handling of asynchronous signals in a synchronous
+	 * threads environment is undefined. Therefor it would be an
+	 * error for both signals and threads to be in use in the same
+	 * program.
+	 */
+	SignalEventRec *sid = (SignalEventRec*) id;
+	sid->se_notice = TRUE;
+}
+
+XtInputId XtAddInput(
+	int source,
+	XtPointer Condition,
+	XtInputCallbackProc proc,
+	XtPointer closure)
+{
+	return XtAppAddInput(_XtDefaultAppContext(),
+		source, Condition, proc, closure);
+}
+
+XtInputId XtAppAddInput(
+	XtAppContext app,
+	int source,
+	XtPointer Condition,
+	XtInputCallbackProc proc,
+	XtPointer closure)
+{
+	InputEvent* sptr;
+	XtInputMask condition = (XtInputMask) Condition;
+
+	LOCK_APP(app);
+	if (!condition ||
+	    condition & ~(XtInputReadMask|XtInputWriteMask|XtInputExceptMask))
+	    XtAppErrorMsg(app,"invalidParameter","xtAddInput",XtCXtToolkitError,
+			  "invalid condition passed to XtAppAddInput",
+			  (String *)NULL, (Cardinal *)NULL);
+
+	if (app->input_max <= source) {
+	    Cardinal n = source + 1;
+	    int ii;
+	    app->input_list = (InputEvent**)XtRealloc((char*) app->input_list,
+						      n * sizeof(InputEvent*));
+	    for (ii = app->input_max; ii < (int) n; ii++)
+		app->input_list[ii] = (InputEvent*) NULL;
+	    app->input_max = n;
+	}
+	sptr = XtNew(InputEvent);
+	sptr->ie_proc = proc;
+	sptr->ie_closure = closure;
+	sptr->app = app;
+	sptr->ie_oq = NULL;
+	sptr->ie_source = source;
+	sptr->ie_condition = condition;
+	sptr->ie_next = app->input_list[source];
+	app->input_list[source] = sptr;
+
+#ifndef USE_POLL
+	if (condition & XtInputReadMask)   FD_SET(source, &app->fds.rmask);
+	if (condition & XtInputWriteMask)  FD_SET(source, &app->fds.wmask);
+	if (condition & XtInputExceptMask) FD_SET(source, &app->fds.emask);
+
+	if (app->fds.nfds < (source+1)) app->fds.nfds = source+1;
+#else
+	if (sptr->ie_next == NULL)
+	    app->fds.nfds++;
+#endif
+	app->input_count++;
+	app->rebuild_fdlist = TRUE;
+	UNLOCK_APP(app);
+	return((XtInputId)sptr);
+}
+
+void XtRemoveInput(
+	register XtInputId  id)
+{
+  	register InputEvent *sptr, *lptr;
+	XtAppContext app = ((InputEvent *)id)->app;
+	register int source = ((InputEvent *)id)->ie_source;
+	Boolean found = False;
+
+	LOCK_APP(app);
+	sptr = app->outstandingQueue;
+	lptr = NULL;
+	for (; sptr != NULL; sptr = sptr->ie_oq) {
+	    if (sptr == (InputEvent *)id) {
+		if (lptr == NULL) app->outstandingQueue = sptr->ie_oq;
+		else lptr->ie_oq = sptr->ie_oq;
+	    }
+	    lptr = sptr;
+	}
+
+	if(app->input_list && (sptr = app->input_list[source]) != NULL) {
+		for( lptr = NULL ; sptr; sptr = sptr->ie_next ){
+			if(sptr == (InputEvent *) id) {
+#ifndef USE_POLL
+				XtInputMask condition = 0;
+#endif
+				if(lptr == NULL) {
+				    app->input_list[source] = sptr->ie_next;
+				} else {
+				    lptr->ie_next = sptr->ie_next;
+				}
+#ifndef USE_POLL
+				for (lptr = app->input_list[source];
+				     lptr; lptr = lptr->ie_next)
+				    condition |= lptr->ie_condition;
+				if ((sptr->ie_condition & XtInputReadMask) &&
+				    !(condition & XtInputReadMask))
+				   FD_CLR(source, &app->fds.rmask);
+				if ((sptr->ie_condition & XtInputWriteMask) &&
+				    !(condition & XtInputWriteMask))
+				   FD_CLR(source, &app->fds.wmask);
+				if ((sptr->ie_condition & XtInputExceptMask) &&
+				    !(condition & XtInputExceptMask))
+				   FD_CLR(source, &app->fds.emask);
+#endif
+				XtFree((char *) sptr);
+				found = True;
+				break;
+			}
+			lptr = sptr;
+		}
+	}
+
+	if (found) {
+	    app->input_count--;
+#ifdef USE_POLL
+	    if (app->input_list[source] == NULL)
+		app->fds.nfds--;
+#endif
+	    app->rebuild_fdlist = TRUE;
+	} else
+	    XtAppWarningMsg(app, "invalidProcedure","inputHandler",
+			    XtCXtToolkitError,
+			    "XtRemoveInput: Input handler not found",
+			    (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+}
+
+void _XtRemoveAllInputs(
+    XtAppContext app)
+{
+    int i;
+    for (i = 0; i < app->input_max; i++) {
+	InputEvent* ep = app->input_list[i];
+	while (ep) {
+	    InputEvent *next = ep->ie_next;
+	    XtFree( (char*)ep );
+	    ep = next;
+	}
+    }
+    XtFree((char *) app->input_list);
+}
+
+/* Do alternate input and timer callbacks if there are any */
+
+static void DoOtherSources(
+	XtAppContext app)
+{
+	TimerEventRec *te_ptr;
+	InputEvent *ie_ptr;
+	struct timeval  cur_time;
+
+#define DrainQueue() \
+	for (ie_ptr = app->outstandingQueue; ie_ptr != NULL;) { \
+	    app->outstandingQueue = ie_ptr->ie_oq;		\
+	    ie_ptr ->ie_oq = NULL;				\
+	    IeCallProc(ie_ptr);					\
+	    ie_ptr = app->outstandingQueue;			\
+	}
+/*enddef*/
+	DrainQueue();
+	if (app->input_count > 0) {
+	    /* Call _XtWaitForSomething to get input queued up */
+	    (void) _XtWaitForSomething (app,
+					TRUE, TRUE, FALSE, TRUE,
+					FALSE,
+#ifdef XTHREADS
+					TRUE,
+#endif
+					(unsigned long *)NULL);
+	    DrainQueue();
+	}
+	if (app->timerQueue != NULL) {	/* check timeout queue */
+	    X_GETTIMEOFDAY (&cur_time);
+	    FIXUP_TIMEVAL(cur_time);
+	    while(IS_AT_OR_AFTER (app->timerQueue->te_timer_value, cur_time)) {
+		te_ptr = app->timerQueue;
+		app->timerQueue = te_ptr->te_next;
+		te_ptr->te_next = NULL;
+		if (te_ptr->te_proc != NULL)
+		    TeCallProc(te_ptr);
+		LOCK_PROCESS;
+		te_ptr->te_next = freeTimerRecs;
+		freeTimerRecs = te_ptr;
+		UNLOCK_PROCESS;
+		if (app->timerQueue == NULL) break;
+	    }
+	}
+	if (app->signalQueue != NULL) {
+	    SignalEventRec *se_ptr = app->signalQueue;
+	    while (se_ptr != NULL) {
+		if (se_ptr->se_notice) {
+		    se_ptr->se_notice = FALSE;
+		    if (se_ptr->se_proc != NULL)
+			SeCallProc(se_ptr);
+		}
+		se_ptr = se_ptr->se_next;
+	    }
+	}
+#undef DrainQueue
+}
+
+/* If there are any work procs, call them.  Return whether we did so */
+
+static Boolean CallWorkProc(
+	XtAppContext app)
+{
+	register WorkProcRec *w = app->workQueue;
+	Boolean delete;
+
+	if (w == NULL) return FALSE;
+
+	app->workQueue = w->next;
+
+	delete = (*(w->proc)) (w->closure);
+
+	if (delete) {
+	    LOCK_PROCESS;
+	    w->next = freeWorkRecs;
+	    freeWorkRecs = w;
+	    UNLOCK_PROCESS;
+	}
+	else {
+	    w->next = app->workQueue;
+	    app->workQueue = w;
+	}
+	return TRUE;
+}
+
+/*
+ * XtNextEvent()
+ * return next event;
+ */
+
+void XtNextEvent(
+	XEvent *event)
+{
+	XtAppNextEvent(_XtDefaultAppContext(), event);
+}
+
+void _XtRefreshMapping(
+    XEvent* event,
+    _XtBoolean dispatch)
+{
+    XtPerDisplay pd;
+
+    LOCK_PROCESS;
+    pd = _XtGetPerDisplay(event->xmapping.display);
+    if (event->xmapping.request != MappingPointer &&
+	pd && pd->keysyms && (event->xmapping.serial >= pd->keysyms_serial))
+	_XtBuildKeysymTables( event->xmapping.display, pd );
+    XRefreshKeyboardMapping(&event->xmapping);
+    if (dispatch && pd && pd->mapping_callbacks)
+	XtCallCallbackList((Widget) NULL,
+			   (XtCallbackList)pd->mapping_callbacks,
+			   (XtPointer)event );
+    UNLOCK_PROCESS;
+}
+
+void XtAppNextEvent(
+	XtAppContext app,
+	XEvent *event)
+{
+    int i, d;
+
+    LOCK_APP(app);
+    for (;;) {
+	if (app->count == 0)
+	    DoOtherSources(app);
+	else {
+	    for (i = 1; i <= app->count; i++) {
+		d = (i + app->last) % app->count;
+		if (d == 0) DoOtherSources(app);
+		if (XEventsQueued(app->list[d], QueuedAfterReading))
+		    goto GotEvent;
+	    }
+	    for (i = 1; i <= app->count; i++) {
+		d = (i + app->last) % app->count;
+		if (XEventsQueued(app->list[d], QueuedAfterFlush))
+		    goto GotEvent;
+	    }
+	}
+
+	/* We're ready to wait...if there is a work proc, call it */
+	if (CallWorkProc(app)) continue;
+
+	d = _XtWaitForSomething (app,
+				 FALSE, FALSE, FALSE, FALSE,
+				 TRUE,
+#ifdef XTHREADS
+				 TRUE,
+#endif
+				 (unsigned long *) NULL);
+
+	if (d != -1) {
+	  GotEvent:
+	    XNextEvent (app->list[d], event);
+#ifdef XTHREADS
+	    /* assert(app->list[d] == event->xany.display); */
+#endif
+	    app->last = d;
+	    if (event->xany.type == MappingNotify)
+		_XtRefreshMapping(event, False);
+	    UNLOCK_APP(app);
+	    return;
+	}
+
+    } /* for */
+}
+
+void XtProcessEvent(
+	XtInputMask mask)
+{
+	XtAppProcessEvent(_XtDefaultAppContext(), mask);
+}
+
+void XtAppProcessEvent(
+	XtAppContext app,
+	XtInputMask mask)
+{
+	int i, d;
+	XEvent event;
+	struct timeval cur_time;
+
+	LOCK_APP(app);
+	if (mask == 0) {
+	    UNLOCK_APP(app);
+	    return;
+	}
+
+	for (;;) {
+
+	    if (mask & XtIMSignal && app->signalQueue != NULL) {
+		SignalEventRec *se_ptr = app->signalQueue;
+		while (se_ptr != NULL) {
+		    if (se_ptr->se_notice) {
+			se_ptr->se_notice = FALSE;
+			SeCallProc(se_ptr);
+			UNLOCK_APP(app);
+			return;
+		    }
+		    se_ptr = se_ptr->se_next;
+		}
+	    }
+
+	    if (mask & XtIMTimer && app->timerQueue != NULL) {
+		X_GETTIMEOFDAY (&cur_time);
+		FIXUP_TIMEVAL(cur_time);
+		if (IS_AT_OR_AFTER(app->timerQueue->te_timer_value, cur_time)){
+		    TimerEventRec *te_ptr = app->timerQueue;
+		    app->timerQueue = app->timerQueue->te_next;
+		    te_ptr->te_next = NULL;
+                    if (te_ptr->te_proc != NULL)
+		        TeCallProc(te_ptr);
+		    LOCK_PROCESS;
+		    te_ptr->te_next = freeTimerRecs;
+		    freeTimerRecs = te_ptr;
+		    UNLOCK_PROCESS;
+		    UNLOCK_APP(app);
+		    return;
+		}
+	    }
+
+	    if (mask & XtIMAlternateInput) {
+		if (app->input_count > 0 && app->outstandingQueue == NULL) {
+		    /* Call _XtWaitForSomething to get input queued up */
+		    (void) _XtWaitForSomething (app,
+						TRUE, TRUE, FALSE, TRUE,
+						FALSE,
+#ifdef XTHREADS
+						TRUE,
+#endif
+						(unsigned long *)NULL);
+		}
+		if (app->outstandingQueue != NULL) {
+		    InputEvent *ie_ptr = app->outstandingQueue;
+		    app->outstandingQueue = ie_ptr->ie_oq;
+		    ie_ptr->ie_oq = NULL;
+		    IeCallProc(ie_ptr);
+		    UNLOCK_APP(app);
+		    return;
+		}
+	    }
+
+	    if (mask & XtIMXEvent) {
+		for (i = 1; i <= app->count; i++) {
+		    d = (i + app->last) % app->count;
+		    if (XEventsQueued(app->list[d], QueuedAfterReading))
+			goto GotEvent;
+		}
+		for (i = 1; i <= app->count; i++) {
+		    d = (i + app->last) % app->count;
+		    if (XEventsQueued(app->list[d], QueuedAfterFlush))
+			goto GotEvent;
+		}
+	    }
+
+	    /* Nothing to do...wait for something */
+
+	    if (CallWorkProc(app)) continue;
+
+	    d = _XtWaitForSomething (app,
+				    (mask & XtIMXEvent ? FALSE : TRUE),
+				    (mask & XtIMTimer ? FALSE : TRUE),
+				    (mask & XtIMAlternateInput ? FALSE : TRUE),
+				    (mask & XtIMSignal ? FALSE : TRUE),
+				    TRUE,
+#ifdef XTHREADS
+				    TRUE,
+#endif
+				    (unsigned long *) NULL);
+
+	    if (mask & XtIMXEvent && d != -1) {
+	      GotEvent:
+		XNextEvent(app->list[d], &event);
+#ifdef XTHREADS
+		/* assert(app->list[d] == event.xany.display); */
+#endif
+		app->last = d;
+		if (event.xany.type == MappingNotify) {
+		    _XtRefreshMapping(&event, False);
+		}
+		XtDispatchEvent(&event);
+		UNLOCK_APP(app);
+		return;
+	    }
+
+	}
+}
+
+Boolean XtPending(void)
+{
+	return (XtAppPending(_XtDefaultAppContext()) != 0);
+}
+
+XtInputMask XtAppPending(
+	XtAppContext app)
+{
+	struct timeval cur_time;
+	int d;
+	XtInputMask ret = 0;
+
+/*
+ * Check for pending X events
+ */
+	LOCK_APP(app);
+	for (d = 0; d < app->count; d++) {
+	    if (XEventsQueued(app->list[d], QueuedAfterReading)) {
+		ret = XtIMXEvent;
+		break;
+	    }
+	}
+	if (ret == 0) {
+	    for (d = 0; d < app->count; d++) {
+		if (XEventsQueued(app->list[d], QueuedAfterFlush)) {
+		    ret = XtIMXEvent;
+		    break;
+		}
+	    }
+	}
+
+	if (app->signalQueue != NULL) {
+	    SignalEventRec *se_ptr = app->signalQueue;
+	    while (se_ptr != NULL) {
+		if (se_ptr->se_notice) {
+		    ret |= XtIMSignal;
+		    break;
+		}
+		se_ptr = se_ptr->se_next;
+	    }
+	}
+
+/*
+ * Check for pending alternate input
+ */
+	if (app->timerQueue != NULL) {	/* check timeout queue */
+	    X_GETTIMEOFDAY (&cur_time);
+	    FIXUP_TIMEVAL(cur_time);
+	    if ((IS_AT_OR_AFTER(app->timerQueue->te_timer_value, cur_time))  &&
+                (app->timerQueue->te_proc != NULL)) {
+		ret |= XtIMTimer;
+	    }
+	}
+
+	if (app->outstandingQueue != NULL) ret |= XtIMAlternateInput;
+	else {
+	    /* This won't cause a wait, but will enqueue any input */
+
+	    if(_XtWaitForSomething (app,
+				    FALSE, TRUE, FALSE, TRUE,
+				    FALSE,
+#ifdef XTHREADS
+				    TRUE,
+#endif
+				    (unsigned long *) NULL) != -1)
+		ret |= XtIMXEvent;
+	    if (app->outstandingQueue != NULL) ret |= XtIMAlternateInput;
+	}
+	UNLOCK_APP(app);
+	return ret;
+}
+
+/* Peek at alternate input and timer callbacks if there are any */
+
+static Boolean PeekOtherSources(
+	XtAppContext app)
+{
+	struct timeval  cur_time;
+
+	if (app->outstandingQueue != NULL) return TRUE;
+
+	if (app->signalQueue != NULL) {
+	    SignalEventRec *se_ptr = app->signalQueue;
+	    while (se_ptr != NULL) {
+		if (se_ptr->se_notice)
+		    return TRUE;
+		se_ptr = se_ptr->se_next;
+	    }
+	}
+
+	if (app->input_count > 0) {
+	    /* Call _XtWaitForSomething to get input queued up */
+	    (void) _XtWaitForSomething (app,
+					TRUE, TRUE, FALSE, TRUE,
+					FALSE,
+#ifdef XTHREADS
+					TRUE,
+#endif
+					(unsigned long *)NULL);
+	    if (app->outstandingQueue != NULL) return TRUE;
+	}
+
+	if (app->timerQueue != NULL) {	/* check timeout queue */
+	    X_GETTIMEOFDAY (&cur_time);
+	    FIXUP_TIMEVAL(cur_time);
+	    if (IS_AT_OR_AFTER (app->timerQueue->te_timer_value, cur_time))
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+Boolean XtPeekEvent(
+	XEvent *event)
+{
+	return XtAppPeekEvent(_XtDefaultAppContext(), event);
+}
+
+Boolean XtAppPeekEvent_SkipTimer;
+
+Boolean XtAppPeekEvent(
+	XtAppContext app,
+	XEvent *event)
+{
+	int i, d;
+	Boolean foundCall = FALSE;
+
+	LOCK_APP(app);
+	for (i = 1; i <= app->count; i++) {
+	    d = (i + app->last) % app->count;
+	    if (d == 0) foundCall = PeekOtherSources(app);
+	    if (XEventsQueued(app->list[d], QueuedAfterReading))
+		goto GotEvent;
+	}
+	for (i = 1; i <= app->count; i++) {
+	    d = (i + app->last) % app->count;
+	    if (XEventsQueued(app->list[d], QueuedAfterFlush))
+		goto GotEvent;
+	}
+
+	if (foundCall) {
+	    event->xany.type = 0;
+	    event->xany.display = NULL;
+	    event->xany.window = 0;
+	    UNLOCK_APP(app);
+	    return FALSE;
+	}
+
+	while (1) {
+		d = _XtWaitForSomething (app,
+			FALSE, FALSE, FALSE, FALSE,
+			TRUE,
+#ifdef XTHREADS
+			TRUE,
+#endif
+			(unsigned long *) NULL);
+
+		if (d != -1) {  /* event */
+			GotEvent:
+			XPeekEvent(app->list[d], event);
+			app->last = (d == 0 ? app->count : d) - 1;
+			UNLOCK_APP(app);
+			return TRUE;
+		}
+		else {  /* input or timer or signal */
+			/*
+			 * Check to see why a -1 was returned, if a timer expired,
+			 * call it and block some more
+			 */
+			if ((app->timerQueue != NULL) && ! XtAppPeekEvent_SkipTimer) {  /* timer */
+				struct timeval cur_time;
+				Bool did_timer = False;
+
+				X_GETTIMEOFDAY (&cur_time);
+				FIXUP_TIMEVAL(cur_time);
+				while (IS_AT_OR_AFTER(app->timerQueue->te_timer_value, cur_time)) {
+					TimerEventRec *te_ptr = app->timerQueue;
+					app->timerQueue = app->timerQueue->te_next;
+					te_ptr->te_next = NULL;
+					if (te_ptr->te_proc != NULL) {
+					    TeCallProc(te_ptr);
+					    did_timer = True;
+					}
+					LOCK_PROCESS;
+					te_ptr->te_next = freeTimerRecs;
+					freeTimerRecs = te_ptr;
+					UNLOCK_PROCESS;
+					if (app->timerQueue == NULL) break;
+				}
+				if (did_timer)
+				{
+				    for (d = 0; d < app->count; d++)
+				    /* the timer's procedure may have caused an event */
+					    if (XEventsQueued(app->list[d], QueuedAfterFlush)) {
+						    goto GotEvent;
+					    }
+				    continue;  /* keep blocking */
+				}
+			}
+			/*
+			 * spec is vague here; we'll assume signals also return FALSE,
+			 * of course to determine whether a signal is pending requires
+			 * walking the signalQueue looking for se_notice flags which
+			 * this code doesn't do.
+			 */
+#if 0
+			if (app->signalQueue != NULL) {  /* signal */
+				event->xany.type = 0;
+				event->xany.display = NULL;
+				event->xany.window = 0;
+				UNLOCK_APP(app);
+				return FALSE;
+			}
+			else
+#endif
+			{  /* input */
+				event->xany.type = 0;
+				event->xany.display = NULL;
+				event->xany.window = 0;
+				UNLOCK_APP(app);
+				return FALSE;
+			}
+		}
+	} /* end while */
+}
diff --git a/libXt/src/Object.c b/libXt/src/Object.c
new file mode 100644
index 000000000..777fd68ae
--- /dev/null
+++ b/libXt/src/Object.c
@@ -0,0 +1,296 @@
+/* $Xorg: Object.c,v 1.4 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Object.c,v 1.5 2001/01/17 19:43:06 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+static XtResource resources[] = {
+        {XtNdestroyCallback, XtCCallback, XtRCallback,sizeof(XtPointer),
+         XtOffsetOf(ObjectRec,object.destroy_callbacks),
+	 XtRCallback, (XtPointer)NULL}
+    };
+
+static void ObjectClassPartInitialize(WidgetClass);
+static Boolean ObjectSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void ObjectDestroy(Widget);
+
+externaldef(objectclassrec) ObjectClassRec objectClassRec = {
+  {
+    /* superclass	  */	NULL,
+    /* class_name	  */	"Object",
+    /* widget_size	  */	sizeof(ObjectRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/	ObjectClassPartInitialize,
+    /* class_inited       */	FALSE,
+    /* initialize	  */	NULL,
+    /* initialize_hook    */	NULL,
+    /* pad                */    NULL,
+    /* pad		  */	NULL,
+    /* pad       	  */	0,
+    /* resources	  */	resources,
+    /* num_resources	  */    XtNumber(resources),
+    /* xrm_class	  */	NULLQUARK,
+    /* pad                */    FALSE,
+    /* pad                */    FALSE,
+    /* pad                */    FALSE,
+    /* pad                */    FALSE,
+    /* destroy		  */	ObjectDestroy,
+    /* pad		  */	NULL,
+    /* pad		  */	NULL,
+    /* set_values	  */	ObjectSetValues,
+    /* set_values_hook    */	NULL,
+    /* pad                */    NULL,
+    /* get_values_hook    */	NULL,
+    /* pad                */    NULL,
+    /* version		  */	XtVersion,
+    /* callback_offsets   */    NULL,
+    /* pad                */    NULL,
+    /* pad                */    NULL,
+    /* pad                */    NULL,
+    /* extension	    */  NULL
+}
+};
+
+externaldef(objectClass) WidgetClass objectClass
+                          = (WidgetClass)&objectClassRec;
+
+/*
+ * Start of object routines.
+ */
+
+
+static void ConstructCallbackOffsets(
+    WidgetClass widgetClass)
+{
+    static XrmQuark QCallback = NULLQUARK;
+    register int i;
+    register int tableSize;
+    register CallbackTable newTable;
+    register CallbackTable superTable;
+    register XrmResourceList resourceList;
+    ObjectClass objectClass = (ObjectClass)widgetClass;
+
+    /*
+      This function builds an array of pointers to the resource
+      structures which describe the callbacks for this widget class.
+      This array is special in that the 0th entry is the number of
+      callback pointers.
+     */
+
+    if (QCallback == NULLQUARK)
+	QCallback = XrmPermStringToQuark(XtRCallback);
+
+    if (objectClass->object_class.superclass != NULL) {
+	superTable = (CallbackTable)
+	    ((ObjectClass) objectClass->object_class.superclass)->
+		object_class.callback_private;
+	tableSize = (int)(long) superTable[0];
+    } else {
+	superTable = (CallbackTable) NULL;
+	tableSize = 0;
+    }
+
+    /* Count the number of callbacks */
+    resourceList = (XrmResourceList) objectClass->object_class.resources;
+    for (i = objectClass->object_class.num_resources; --i >= 0; resourceList++)
+	if (resourceList->xrm_type == QCallback)
+	    tableSize++;
+
+    /*
+     * Allocate and load the table.  Make sure that the new callback
+     * offsets occur in the table ahead of the superclass callback
+     * offsets so that resource overrides work.
+     */
+    newTable = (CallbackTable)
+	__XtMalloc(sizeof(XrmResource *) * (tableSize + 1));
+
+    newTable[0] = (XrmResource *)(long) tableSize;
+
+    if (superTable)
+	tableSize -= (int)(long) superTable[0];
+    resourceList = (XrmResourceList) objectClass->object_class.resources;
+    for (i=1; tableSize > 0; resourceList++)
+	if (resourceList->xrm_type == QCallback) {
+	    newTable[i++] = resourceList;
+	    tableSize--;
+	}
+
+    if (superTable)
+	for (tableSize = (int)(long) *superTable++;
+	    --tableSize >= 0; superTable++)
+	    newTable[i++] = *superTable;
+
+    objectClass->object_class.callback_private = (XtPointer) newTable;
+}
+
+static void InheritObjectExtensionMethods(
+    WidgetClass widget_class)
+{
+    ObjectClass oc = (ObjectClass) widget_class;
+    ObjectClassExtension ext, super_ext = NULL;
+
+    ext = (ObjectClassExtension)
+	XtGetClassExtension(widget_class,
+		    XtOffsetOf(ObjectClassRec, object_class.extension),
+			    NULLQUARK, XtObjectExtensionVersion,
+			    sizeof(ObjectClassExtensionRec));
+
+    if (oc->object_class.superclass)
+	super_ext = (ObjectClassExtension)
+	    XtGetClassExtension(oc->object_class.superclass,
+			XtOffsetOf(ObjectClassRec, object_class.extension),
+				NULLQUARK, XtObjectExtensionVersion,
+				sizeof(ObjectClassExtensionRec));
+    LOCK_PROCESS;
+    if (ext) {
+	if (ext->allocate == XtInheritAllocate)
+	    ext->allocate = (super_ext ? super_ext->allocate : NULL);
+	if (ext->deallocate == XtInheritDeallocate)
+	    ext->deallocate = (super_ext ? super_ext->deallocate : NULL);
+    } else if (super_ext) {
+	/* Be careful to inherit only what is appropriate */
+	ext = (ObjectClassExtension)
+	    __XtCalloc(1, sizeof(ObjectClassExtensionRec));
+	ext->next_extension = oc->object_class.extension;
+	ext->record_type = NULLQUARK;
+	ext->version = XtObjectExtensionVersion;
+	ext->record_size = sizeof(ObjectClassExtensionRec);
+	ext->allocate = super_ext->allocate;
+	ext->deallocate = super_ext->deallocate;
+	oc->object_class.extension = (XtPointer) ext;
+    }
+    UNLOCK_PROCESS;
+}
+
+static void ObjectClassPartInitialize(
+    register WidgetClass wc)
+{
+   ObjectClass oc = (ObjectClass)wc;
+
+   oc->object_class.xrm_class =
+       XrmPermStringToQuark(oc->object_class.class_name);
+
+   if (oc->object_class.resources)
+       _XtCompileResourceList(oc->object_class.resources,
+			      oc->object_class.num_resources);
+
+   ConstructCallbackOffsets(wc);
+   _XtResourceDependencies(wc);
+   InheritObjectExtensionMethods(wc);
+}
+
+
+/*ARGSUSED*/
+static Boolean ObjectSetValues(
+    Widget	old,
+    Widget	request,
+    Widget	widget,
+    ArgList	args,
+    Cardinal *	num_args)
+{
+    register CallbackTable offsets;
+    register int i;
+    register InternalCallbackList *ol, *nl;
+
+    LOCK_PROCESS;
+    /* Compile any callback lists into internal form */
+    offsets = (CallbackTable) XtClass(widget)->core_class.callback_private;
+
+    for (i= (int)(long) *(offsets++); --i >= 0; offsets++) {
+	ol = (InternalCallbackList *)
+	    ((char *) old - (*offsets)->xrm_offset - 1);
+	nl = (InternalCallbackList *)
+	    ((char *) widget - (*offsets)->xrm_offset - 1);
+	if (*ol != *nl) {
+	    if (*ol != NULL)
+		XtFree((char *) *ol);
+	    if (*nl != NULL)
+		*nl = _XtCompileCallbackList((XtCallbackList) *nl);
+	}
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+
+static void ObjectDestroy (
+    register Widget    widget)
+{
+    register CallbackTable offsets;
+    register int i;
+    register InternalCallbackList cl;
+
+    /* Remove all callbacks associated with widget */
+    LOCK_PROCESS;
+    offsets = (CallbackTable)
+	widget->core.widget_class->core_class.callback_private;
+
+    for (i = (int)(long) *(offsets++); --i >= 0; offsets++) {
+	cl = *(InternalCallbackList *)
+	    ((char *) widget - (*offsets)->xrm_offset - 1);
+	if (cl) XtFree((char *) cl);
+    }
+    UNLOCK_PROCESS;
+} /* ObjectDestroy */
diff --git a/libXt/src/PassivGrab.c b/libXt/src/PassivGrab.c
new file mode 100644
index 000000000..377efdcd5
--- /dev/null
+++ b/libXt/src/PassivGrab.c
@@ -0,0 +1,1053 @@
+/* $Xorg: PassivGrab.c,v 1.5 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989,1990 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard, Digital, or Sun not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+/* $XFree86$ */
+
+/*
+
+Copyright 1987, 1988, 1989, 1990, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "PassivGraI.h"
+
+/* typedef unsigned long Mask; */
+#define BITMASK(i) (((Mask)1) << ((i) & 31))
+#define MASKIDX(i) ((i) >> 5)
+#define MASKWORD(buf, i) buf[MASKIDX(i)]
+#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i)
+#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
+#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))
+#define MasksPerDetailMask 8
+
+#define pDisplay(grabPtr) (((grabPtr)->widget)->core.screen->display)
+#define pWindow(grabPtr) (((grabPtr)->widget)->core.window)
+
+
+/***************************************************************************/
+/*********************** Internal Support Routines *************************/
+/***************************************************************************/
+
+/*
+ * Turn off (clear) the bit in the specified detail mask which is associated
+ * with the detail.
+ */
+
+static void DeleteDetailFromMask(
+    Mask **ppDetailMask,
+    unsigned short detail)
+{
+    Mask *pDetailMask = *ppDetailMask;
+
+    if (!pDetailMask) {
+	int i;
+	pDetailMask = (Mask *)__XtMalloc(sizeof(Mask) * MasksPerDetailMask);
+	for (i = MasksPerDetailMask; --i >= 0; )
+	    pDetailMask[i] = ~0;
+	*ppDetailMask = pDetailMask;
+    }
+    BITCLEAR((pDetailMask), detail);
+}
+
+
+/*
+ * Make an exact copy of the specified detail mask.
+ */
+
+static Mask *CopyDetailMask(
+    Mask *pOriginalDetailMask)
+{
+    Mask *pTempMask;
+    int i;
+
+    if (!pOriginalDetailMask)
+	return NULL;
+
+    pTempMask = (Mask *)__XtMalloc(sizeof(Mask) * MasksPerDetailMask);
+
+    for ( i = 0; i < MasksPerDetailMask; i++)
+      pTempMask[i]= pOriginalDetailMask[i];
+
+    return pTempMask;
+}
+
+
+/*
+ * Allocate a new grab entry, and fill in all of the fields using the
+ * specified parameters.
+ */
+
+static XtServerGrabPtr CreateGrab(
+    Widget	widget,
+    Boolean	ownerEvents,
+    Modifiers	modifiers,
+    KeyCode 	keybut,
+    int		pointer_mode,
+    int		keyboard_mode,
+    Mask	event_mask,
+    Window 	confine_to,
+    Cursor 	cursor,
+    Boolean	need_ext)
+{
+    XtServerGrabPtr grab;
+
+    if (confine_to || cursor)
+	need_ext = True;
+    grab = (XtServerGrabPtr)__XtMalloc(sizeof(XtServerGrabRec) +
+				     (need_ext ? sizeof(XtServerGrabExtRec)
+				      : 0));
+    grab->next = NULL;
+    grab->widget = widget;
+    grab->ownerEvents = ownerEvents;
+    grab->pointerMode = pointer_mode;
+    grab->keyboardMode = keyboard_mode;
+    grab->eventMask = event_mask;
+    grab->hasExt = need_ext;
+    grab->confineToIsWidgetWin = (XtWindow (widget) == confine_to);
+    grab->modifiers = modifiers;
+    grab->keybut = keybut;
+    if (need_ext) {
+	XtServerGrabExtPtr ext = GRABEXT(grab);
+	ext->pModifiersMask = NULL;
+	ext->pKeyButMask = NULL;
+	ext->confineTo = confine_to;
+	ext->cursor = cursor;
+    }
+    return grab;
+}
+
+
+/*
+ * Free up the space occupied by a grab entry.
+ */
+
+static void FreeGrab(
+    XtServerGrabPtr pGrab)
+{
+    if (pGrab->hasExt) {
+	XtServerGrabExtPtr ext = GRABEXT(pGrab);
+	if (ext->pModifiersMask)
+	    XtFree((char *)ext->pModifiersMask);
+	if (ext->pKeyButMask)
+	    XtFree((char *)ext->pKeyButMask);
+    }
+    XtFree((char *)pGrab);
+}
+
+typedef struct _DetailRec {
+    unsigned short 	exact;
+    Mask  		*pMask;
+} DetailRec, *DetailPtr;
+
+/*
+ * If the first detail is set to 'exception' and the second detail
+ * is contained in the mask of the first, then TRUE is returned.
+ */
+
+static Bool IsInGrabMask(
+    register DetailPtr firstDetail,
+    register DetailPtr secondDetail,
+    unsigned short exception)
+{
+    if (firstDetail->exact == exception) {
+	if (!firstDetail->pMask)
+	    return TRUE;
+
+	/* (at present) never called with two non-null pMasks */
+	if (secondDetail->exact == exception)
+	    return FALSE;
+
+	if (GETBIT(firstDetail->pMask, secondDetail->exact))
+	    return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/*
+ * If neither of the details is set to 'exception', and they match
+ * exactly, then TRUE is returned.
+ */
+
+static Bool IdenticalExactDetails(
+    unsigned short firstExact,
+    unsigned short secondExact,
+    unsigned short exception)
+{
+    if ((firstExact == exception) || (secondExact == exception))
+	return FALSE;
+
+    if (firstExact == secondExact)
+	return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * If the first detail is set to 'exception', and its mask has the bit
+ * enabled which corresponds to the second detail, OR if neither of the
+ * details is set to 'exception' and the details match exactly, then
+ * TRUE is returned.
+ */
+
+static Bool DetailSupersedesSecond(
+    register DetailPtr firstDetail,
+    register DetailPtr secondDetail,
+    unsigned short exception)
+{
+    if (IsInGrabMask(firstDetail, secondDetail, exception))
+	return TRUE;
+
+    if (IdenticalExactDetails(firstDetail->exact, secondDetail->exact,
+			      exception))
+	return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * If the two grab events match exactly, or if the first grab entry
+ * 'encompasses' the second grab entry, then TRUE is returned.
+ */
+
+static Bool GrabSupersedesSecond(
+    register XtServerGrabPtr pFirstGrab,
+    register XtServerGrabPtr pSecondGrab)
+{
+    DetailRec first, second;
+
+    first.exact = pFirstGrab->modifiers;
+    if (pFirstGrab->hasExt)
+	first.pMask = GRABEXT(pFirstGrab)->pModifiersMask;
+    else
+	first.pMask = NULL;
+    second.exact = pSecondGrab->modifiers;
+    if (pSecondGrab->hasExt)
+	second.pMask = GRABEXT(pSecondGrab)->pModifiersMask;
+    else
+	second.pMask = NULL;
+    if (!DetailSupersedesSecond(&first, &second, (unsigned short)AnyModifier))
+      return FALSE;
+
+    first.exact = pFirstGrab->keybut;
+    if (pFirstGrab->hasExt)
+	first.pMask = GRABEXT(pFirstGrab)->pKeyButMask;
+    else
+	first.pMask = NULL;
+    second.exact = pSecondGrab->keybut;
+    if (pSecondGrab->hasExt)
+	second.pMask = GRABEXT(pSecondGrab)->pKeyButMask;
+    else
+	second.pMask = NULL;
+    if (DetailSupersedesSecond(&first, &second, (unsigned short)AnyKey))
+      return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * Two grabs are considered to be matching if either of the following are true:
+ *
+ * 1) The two grab entries match exactly, or the first grab entry
+ *    encompasses the second grab entry.
+ * 2) The second grab entry encompasses the first grab entry.
+ * 3) The keycodes match exactly, and one entry's modifiers encompasses
+ *    the others.
+ * 4) The keycode for one entry encompasses the other, and the detail
+ *    for the other entry encompasses the first.
+ */
+
+static Bool GrabMatchesSecond(
+    register XtServerGrabPtr pFirstGrab,
+    register XtServerGrabPtr pSecondGrab)
+{
+    DetailRec firstD, firstM, secondD, secondM;
+
+    if (pDisplay(pFirstGrab) != pDisplay(pSecondGrab))
+	return FALSE;
+
+    if (GrabSupersedesSecond(pFirstGrab, pSecondGrab))
+	return TRUE;
+
+    if (GrabSupersedesSecond(pSecondGrab, pFirstGrab))
+	return TRUE;
+
+    firstD.exact = pFirstGrab->keybut;
+    firstM.exact = pFirstGrab->modifiers;
+    if (pFirstGrab->hasExt) {
+	firstD.pMask = GRABEXT(pFirstGrab)->pKeyButMask;
+	firstM.pMask = GRABEXT(pFirstGrab)->pModifiersMask;
+    } else {
+	firstD.pMask = NULL;
+	firstM.pMask = NULL;
+    }
+    secondD.exact = pSecondGrab->keybut;
+    secondM.exact = pSecondGrab->modifiers;
+    if (pSecondGrab->hasExt) {
+	secondD.pMask = GRABEXT(pSecondGrab)->pKeyButMask;
+	secondM.pMask = GRABEXT(pSecondGrab)->pModifiersMask;
+    } else {
+	secondD.pMask = NULL;
+	secondM.pMask = NULL;
+    }
+
+    if (DetailSupersedesSecond(&secondD, &firstD, (unsigned short)AnyKey) &&
+	DetailSupersedesSecond(&firstM, &secondM, (unsigned short)AnyModifier))
+	return TRUE;
+
+    if (DetailSupersedesSecond(&firstD, &secondD, (unsigned short)AnyKey) &&
+	DetailSupersedesSecond(&secondM, &firstM, (unsigned short)AnyModifier))
+	return TRUE;
+
+    return FALSE;
+}
+
+
+/*
+ * Delete a grab combination from the passive grab list.  Each entry will
+ * be checked to see if it is affected by the grab being deleted.  This
+ * may result in multiple entries being modified/deleted.
+ */
+
+static void DeleteServerGrabFromList(
+    XtServerGrabPtr 	*passiveListPtr,
+    XtServerGrabPtr 	pMinuendGrab)
+{
+    register XtServerGrabPtr *next;
+    register XtServerGrabPtr grab;
+    register XtServerGrabExtPtr ext;
+
+    for (next = passiveListPtr; (grab = *next); )
+    {
+	if (GrabMatchesSecond(grab, pMinuendGrab) &&
+	    (pDisplay(grab) == pDisplay(pMinuendGrab)))
+	{
+	    if (GrabSupersedesSecond(pMinuendGrab, grab))
+	    {
+		/*
+		 * The entry being deleted encompasses the list entry,
+		 * so delete the list entry.
+		 */
+		*next = grab->next;
+		FreeGrab(grab);
+		continue;
+	    }
+
+	    if (!grab->hasExt) {
+		grab = (XtServerGrabPtr)
+		    XtRealloc((char *)grab, (sizeof(XtServerGrabRec) +
+					     sizeof(XtServerGrabExtRec)));
+		*next = grab;
+		grab->hasExt = True;
+		ext = GRABEXT(grab);
+		ext->pKeyButMask = NULL;
+		ext->pModifiersMask = NULL;
+		ext->confineTo = None;
+		ext->cursor = None;
+	    } else
+		ext = GRABEXT(grab);
+	    if ((grab->keybut == AnyKey) && (grab->modifiers != AnyModifier))
+	    {
+		/*
+		 * If the list entry has the key detail of AnyKey, and
+		 * a modifier detail not set to AnyModifier, then we
+		 * simply need to turn off the key detail bit in the
+		 * list entry's key detail mask.
+		 */
+		DeleteDetailFromMask(&ext->pKeyButMask, pMinuendGrab->keybut);
+	    } else if ((grab->modifiers == AnyModifier) &&
+		       (grab->keybut != AnyKey)) {
+		/*
+		 * The list entry has a specific key detail, but its
+		 * modifier detail is set to AnyModifier; so, we only
+		 * need to turn off the specified modifier combination
+		 * in the list entry's modifier mask.
+		 */
+		DeleteDetailFromMask(&ext->pModifiersMask,
+				     pMinuendGrab->modifiers);
+	    } else if ((pMinuendGrab->keybut != AnyKey) &&
+		       (pMinuendGrab->modifiers != AnyModifier)) {
+		/*
+		 * The list entry has a key detail of AnyKey and a
+		 * modifier detail of AnyModifier; the entry being
+		 * deleted has a specific key and a specific modifier
+		 * combination.  Therefore, we need to mask off the
+		 * keycode from the list entry, and also create a
+		 * new entry for this keycode, which has a modifier
+		 * mask set to AnyModifier & ~(deleted modifiers).
+		 */
+		XtServerGrabPtr pNewGrab;
+
+		DeleteDetailFromMask(&ext->pKeyButMask, pMinuendGrab->keybut);
+		pNewGrab = CreateGrab(grab->widget,
+				      (Boolean)grab->ownerEvents,
+				      (Modifiers)AnyModifier,
+				      pMinuendGrab->keybut,
+				      (int)grab->pointerMode,
+				      (int)grab->keyboardMode,
+				      (Mask)0, (Window)0, (Cursor)0, True);
+		GRABEXT(pNewGrab)->pModifiersMask =
+		    CopyDetailMask(ext->pModifiersMask);
+
+		DeleteDetailFromMask(&GRABEXT(pNewGrab)->pModifiersMask,
+				     pMinuendGrab->modifiers);
+
+		pNewGrab->next = *passiveListPtr;
+		*passiveListPtr = pNewGrab;
+	    } else if (pMinuendGrab->keybut == AnyKey) {
+		/*
+		 * The list entry has keycode AnyKey and modifier
+		 * AnyModifier; the entry being deleted has
+		 * keycode AnyKey and specific modifiers.  So we
+		 * simply need to mask off the specified modifier
+		 * combination.
+		 */
+		DeleteDetailFromMask(&ext->pModifiersMask,
+				     pMinuendGrab->modifiers);
+	    } else {
+		/*
+		 * The list entry has keycode AnyKey and modifier
+		 * AnyModifier; the entry being deleted has a
+		 * specific keycode and modifier AnyModifier.  So
+		 * we simply need to mask off the specified
+		 * keycode.
+		 */
+		DeleteDetailFromMask(&ext->pKeyButMask, pMinuendGrab->keybut);
+	    }
+	}
+	next = &(*next)->next;
+    }
+}
+
+static void DestroyPassiveList(
+    XtServerGrabPtr	*passiveListPtr)
+{
+    XtServerGrabPtr	next, grab;
+
+    for (next = *passiveListPtr; next; ) {
+	grab = next;
+	next = grab->next;
+
+	/* not necessary to explicitly ungrab key or button;
+	 * window is being destroyed so server will take care of it.
+	 */
+
+	FreeGrab(grab);
+    }
+}
+
+
+/*
+ * This function is called at widget destroy time to clean up
+ */
+/*ARGSUSED*/
+void _XtDestroyServerGrabs(
+    Widget		w,
+    XtPointer		closure,
+    XtPointer		call_data) /* unused */
+{
+    XtPerWidgetInput	pwi = (XtPerWidgetInput)closure;
+    XtPerDisplayInput	pdi;
+
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(w));
+    _XtClearAncestorCache(w);
+    UNLOCK_PROCESS;
+
+    /* Remove the active grab, if necessary */
+    if ((pdi->keyboard.grabType != XtNoServerGrab) &&
+	(pdi->keyboard.grab.widget == w)) {
+	pdi->keyboard.grabType = XtNoServerGrab;
+	pdi->activatingKey = (KeyCode)0;
+    }
+    if ((pdi->pointer.grabType != XtNoServerGrab) &&
+	(pdi->pointer.grab.widget == w))
+	pdi->pointer.grabType = XtNoServerGrab;
+
+    DestroyPassiveList(&pwi->keyList);
+    DestroyPassiveList(&pwi->ptrList);
+
+    _XtFreePerWidgetInput(w, pwi);
+}
+
+/*
+ * If the incoming event is on the passive grab list, then activate
+ * the grab.  The grab will remain in effect until the key is released.
+ */
+
+XtServerGrabPtr _XtCheckServerGrabsOnWidget (
+    XEvent 		*event,
+    Widget		widget,
+    _XtBoolean		isKeyboard)
+{
+    register XtServerGrabPtr grab;
+    XtServerGrabRec 	tempGrab;
+    XtServerGrabPtr	*passiveListPtr;
+    XtPerWidgetInput	pwi;
+
+    LOCK_PROCESS;
+    pwi = _XtGetPerWidgetInput(widget, FALSE);
+    UNLOCK_PROCESS;
+    if (!pwi)
+	return (XtServerGrabPtr)NULL;
+    if (isKeyboard)
+	passiveListPtr = &pwi->keyList;
+    else
+	passiveListPtr = &pwi->ptrList;
+
+    /*
+     * if either there is no entry in the context manager or the entry
+     * is empty, or the keyboard is grabed, then no work to be done
+     */
+    if (!*passiveListPtr)
+	return (XtServerGrabPtr)NULL;
+
+    /* Take only the lower thirteen bits as modifier state.  The X Keyboard
+     * Extension may be representing keyboard group state in two upper bits.
+     */
+    tempGrab.widget = widget;
+    tempGrab.keybut = event->xkey.keycode; /* also xbutton.button */
+    tempGrab.modifiers = event->xkey.state & 0x1FFF; /*also xbutton.state*/
+    tempGrab.hasExt = False;
+
+    for (grab = *passiveListPtr; grab; grab = grab->next) {
+	if (GrabMatchesSecond(&tempGrab, grab))
+	    return (grab);
+    }
+    return (XtServerGrabPtr)NULL;
+}
+
+/*
+ * This handler is needed to guarantee that we see releases on passive
+ * button grabs for widgets that haven't selected for button release.
+ */
+
+/*ARGSUSED*/
+static void  ActiveHandler (
+    Widget 		widget,
+    XtPointer		pdi,
+    XEvent 		*event,
+    Boolean		*cont)
+{
+    /* nothing */
+}
+
+
+/*
+ *	MakeGrab
+ */
+static void  MakeGrab(
+    XtServerGrabPtr	grab,
+    XtServerGrabPtr	*passiveListPtr,
+    Boolean		isKeyboard,
+    XtPerDisplayInput	pdi,
+    XtPerWidgetInput	pwi)
+{
+    if (!isKeyboard && !pwi->active_handler_added) {
+	XtAddEventHandler(grab->widget, ButtonReleaseMask, FALSE,
+			  ActiveHandler, (XtPointer)pdi);
+	pwi->active_handler_added = TRUE;
+    }
+
+    if (isKeyboard) {
+	XGrabKey(pDisplay(grab),
+		 grab->keybut, grab->modifiers,
+		 pWindow(grab), grab->ownerEvents,
+		 grab->pointerMode, grab->keyboardMode);
+    } else {
+	Window confineTo = None;
+	Cursor cursor = None;
+
+	if (grab->hasExt) {
+	    if (grab->confineToIsWidgetWin)
+		confineTo = XtWindow (grab->widget);
+	    else
+		confineTo = GRABEXT(grab)->confineTo;
+	    cursor = GRABEXT(grab)->cursor;
+	}
+	XGrabButton(pDisplay(grab),
+		    grab->keybut, grab->modifiers,
+		    pWindow(grab), grab->ownerEvents, grab->eventMask,
+		    grab->pointerMode, grab->keyboardMode,
+		    confineTo, cursor);
+    }
+
+    /* Add the new grab entry to the passive key grab list */
+    grab->next = *passiveListPtr;
+    *passiveListPtr = grab;
+}
+
+static void MakeGrabs(
+    XtServerGrabPtr	*passiveListPtr,
+    Boolean		isKeyboard,
+    XtPerDisplayInput	pdi)
+{
+    XtServerGrabPtr	next = *passiveListPtr;
+    XtServerGrabPtr	grab;
+    XtPerWidgetInput	pwi;
+    /*
+     * make MakeGrab build a new list that has had the merge
+     * processing done on it. Start with an empty list
+     * (passiveListPtr).
+     */
+    LOCK_PROCESS;
+    *passiveListPtr = NULL;
+    while (next)
+      {
+	  grab = next;
+	  next = grab->next;
+	  pwi = _XtGetPerWidgetInput(grab->widget, FALSE);
+	  MakeGrab(grab, passiveListPtr, isKeyboard, pdi, pwi);
+      }
+    UNLOCK_PROCESS;
+}
+
+/*
+ * This function is the event handler attached to the associated widget
+ * when grabs need to be added, but the widget is not yet realized.  When
+ * it is first mapped, this handler will be invoked, and it will add all
+ * needed grabs.
+ */
+
+/*ARGSUSED*/
+static void  RealizeHandler (
+    Widget 		widget,
+    XtPointer		closure,
+    XEvent 		*event,	/* unused */
+    Boolean		*cont)	/* unused */
+{
+    XtPerWidgetInput	pwi = (XtPerWidgetInput)closure;
+    XtPerDisplayInput	pdi;
+
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    MakeGrabs(&pwi->keyList, KEYBOARD, pdi);
+    MakeGrabs(&pwi->ptrList, POINTER, pdi);
+
+    XtRemoveEventHandler(widget, XtAllEvents, True,
+			 RealizeHandler, (XtPointer)pwi);
+    pwi->realize_handler_added = FALSE;
+}
+
+/***************************************************************************/
+/**************************** Global Routines ******************************/
+/***************************************************************************/
+
+
+/*
+ * Routine used by an application to set up a passive grab for a key/modifier
+ * combination.
+ */
+
+static
+void GrabKeyOrButton (
+    Widget	widget,
+    KeyCode	keyOrButton,
+    Modifiers	modifiers,
+    Boolean	owner_events,
+    int 	pointer_mode,
+    int 	keyboard_mode,
+    Mask	event_mask,
+    Window 	confine_to,
+    Cursor 	cursor,
+    Boolean	isKeyboard)
+{
+    XtServerGrabPtr	*passiveListPtr;
+    XtServerGrabPtr 	newGrab;
+    XtPerWidgetInput	pwi;
+    XtPerDisplayInput	pdi;
+
+
+    XtCheckSubclass(widget, coreWidgetClass, "in XtGrabKey or XtGrabButton");
+    LOCK_PROCESS;
+    pwi = _XtGetPerWidgetInput(widget, TRUE);
+    if (isKeyboard)
+      passiveListPtr = &pwi->keyList;
+    else
+      passiveListPtr = &pwi->ptrList;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    newGrab = CreateGrab(widget, owner_events, modifiers,
+			 keyOrButton, pointer_mode, keyboard_mode,
+			 event_mask, confine_to, cursor, False);
+    /*
+     *  if the widget is realized then process the entry into the grab
+     * list. else if the list is empty (i.e. first time) then add the
+     * event handler. then add the raw entry to the list for processing
+     * in the handler at realize time.
+     */
+    if (XtIsRealized(widget))
+      MakeGrab(newGrab, passiveListPtr, isKeyboard, pdi, pwi);
+    else {
+	if (!pwi->realize_handler_added)
+	    {
+		XtAddEventHandler(widget, StructureNotifyMask, FALSE,
+				  RealizeHandler,
+				  (XtPointer)pwi);
+		pwi->realize_handler_added = TRUE;
+	    }
+
+	while (*passiveListPtr)
+	    passiveListPtr = &(*passiveListPtr)->next;
+	*passiveListPtr = newGrab;
+    }
+}
+
+
+static
+void   UngrabKeyOrButton (
+    Widget	widget,
+    int		keyOrButton,
+    Modifiers	modifiers,
+    Boolean	isKeyboard)
+{
+    XtServerGrabRec 	tempGrab;
+    XtPerWidgetInput	pwi;
+
+    XtCheckSubclass(widget, coreWidgetClass,
+		    "in XtUngrabKey or XtUngrabButton");
+
+    /* Build a temporary grab list entry */
+    tempGrab.widget = widget;
+    tempGrab.modifiers = modifiers;
+    tempGrab.keybut = keyOrButton;
+    tempGrab.hasExt = False;
+
+    LOCK_PROCESS;
+    pwi = _XtGetPerWidgetInput(widget, FALSE);
+    UNLOCK_PROCESS;
+    /*
+     * if there is no entry in the context manager then somethings wrong
+     */
+    if (!pwi)
+      {
+	  XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		       "invalidGrab", "ungrabKeyOrButton", XtCXtToolkitError,
+		       "Attempt to remove nonexistent passive grab",
+		       (String *)NULL, (Cardinal *)NULL);
+	  return;
+      }
+
+    if (XtIsRealized(widget))
+      {
+	  if (isKeyboard)
+	    XUngrabKey(widget->core.screen->display,
+		       keyOrButton, (unsigned int)modifiers,
+		       widget->core.window);
+	  else
+	    XUngrabButton(widget->core.screen->display,
+			  keyOrButton, (unsigned int)modifiers,
+			  widget->core.window);
+      }
+
+
+    /* Delete all entries which are encompassed by the specified grab. */
+    DeleteServerGrabFromList(isKeyboard ? &pwi->keyList : &pwi->ptrList,
+			     &tempGrab);
+}
+
+void  XtGrabKey (
+    Widget	widget,
+    _XtKeyCode	keycode,
+    Modifiers	modifiers,
+    _XtBoolean	owner_events,
+    int 	pointer_mode,
+    int 	keyboard_mode)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    GrabKeyOrButton(widget, (KeyCode)keycode, modifiers, owner_events,
+		    pointer_mode, keyboard_mode,
+		    (Mask)0, (Window)None, (Cursor)None, KEYBOARD);
+    UNLOCK_APP(app);
+}
+
+void  XtGrabButton(
+    Widget	widget,
+    int		button,
+    Modifiers	modifiers,
+    _XtBoolean	owner_events,
+    unsigned int event_mask,
+    int 	pointer_mode,
+    int 	keyboard_mode,
+    Window 	confine_to,
+    Cursor 	cursor)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    GrabKeyOrButton(widget, (KeyCode)button, modifiers, owner_events,
+		    pointer_mode, keyboard_mode,
+		    (Mask)event_mask, confine_to, cursor, POINTER);
+    UNLOCK_APP(app);
+}
+
+
+/*
+ * Routine used by an application to clear a passive grab for a key/modifier
+ * combination.
+ */
+
+void   XtUngrabKey (
+    Widget	widget,
+    _XtKeyCode	keycode,
+    Modifiers	modifiers)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabKeyOrButton(widget, (int)keycode, modifiers, KEYBOARD);
+    UNLOCK_APP(app);
+}
+
+void   XtUngrabButton (
+    Widget	widget,
+    unsigned int button,
+    Modifiers	modifiers)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabKeyOrButton(widget, (KeyCode)button, modifiers, POINTER);
+    UNLOCK_APP(app);
+}
+
+/*
+ * Active grab of Device. clear any client side grabs so we dont lock
+ */
+static int GrabDevice (
+    Widget	widget,
+    Boolean	owner_events,
+    int 	pointer_mode,
+    int 	keyboard_mode,
+    Mask	event_mask,
+    Window 	confine_to,
+    Cursor 	cursor,
+    Time	time,
+    Boolean	isKeyboard)
+{
+    XtPerDisplayInput	pdi;
+    int			returnVal;
+
+    XtCheckSubclass(widget, coreWidgetClass,
+		    "in XtGrabKeyboard or XtGrabPointer");
+    if (!XtIsRealized(widget))
+	return GrabNotViewable;
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    if (!isKeyboard)
+      returnVal = XGrabPointer(XtDisplay(widget), XtWindow(widget),
+			       owner_events, event_mask,
+			       pointer_mode, keyboard_mode,
+			       confine_to, cursor, time);
+    else
+      returnVal = XGrabKeyboard(XtDisplay(widget), XtWindow(widget),
+				owner_events, pointer_mode,
+				keyboard_mode, time);
+
+    if (returnVal == GrabSuccess) {
+	  XtDevice		device;
+
+	  device = isKeyboard ? &pdi->keyboard : &pdi->pointer;
+	  /* fill in the server grab rec */
+	  device->grab.widget = widget;
+	  device->grab.modifiers = 0;
+	  device->grab.keybut = 0;
+	  device->grab.ownerEvents = owner_events;
+	  device->grab.pointerMode = pointer_mode;
+	  device->grab.keyboardMode = keyboard_mode;
+	  device->grab.hasExt = False;
+	  device->grabType = XtActiveServerGrab;
+	  pdi->activatingKey = (KeyCode)0;
+      }
+    return returnVal;
+}
+
+static void   UngrabDevice(
+    Widget	widget,
+    Time	time,
+    Boolean	isKeyboard)
+{
+    XtPerDisplayInput pdi;
+    XtDevice device;
+
+    LOCK_PROCESS;
+    pdi = _XtGetPerDisplayInput(XtDisplay(widget));
+    UNLOCK_PROCESS;
+    device = isKeyboard ? &pdi->keyboard : &pdi->pointer;
+    XtCheckSubclass(widget, coreWidgetClass,
+		    "in XtUngrabKeyboard or XtUngrabPointer");
+
+    if (device->grabType != XtNoServerGrab) {
+
+	if (device->grabType != XtPseudoPassiveServerGrab
+	    && XtIsRealized(widget)) {
+	    if (isKeyboard)
+		XUngrabKeyboard(XtDisplay(widget), time);
+	    else
+		XUngrabPointer(XtDisplay(widget), time);
+	}
+	device->grabType = XtNoServerGrab;
+	pdi->activatingKey = (KeyCode)0;
+    }
+}
+
+
+/*
+ * Active grab of keyboard. clear any client side grabs so we dont lock
+ */
+int XtGrabKeyboard (
+    Widget	widget,
+    _XtBoolean	owner_events,
+    int 	pointer_mode,
+    int 	keyboard_mode,
+    Time	time)
+{
+    int retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = GrabDevice (widget, owner_events,
+			pointer_mode, keyboard_mode,
+			(Mask)0, (Window)None, (Cursor)None, time, KEYBOARD);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+/*
+ * Ungrab the keyboard
+ */
+
+void   XtUngrabKeyboard(
+    Widget	widget,
+    Time	time)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabDevice(widget, time, KEYBOARD);
+    UNLOCK_APP(app);
+}
+
+
+
+
+/*
+ * grab the pointer
+ */
+int XtGrabPointer (
+    Widget	widget,
+    _XtBoolean	owner_events,
+    unsigned int event_mask,
+    int 	pointer_mode,
+    int 	keyboard_mode,
+    Window 	confine_to,
+    Cursor 	cursor,
+    Time	time)
+{
+    int retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = GrabDevice (widget, owner_events,
+			pointer_mode, keyboard_mode,
+			(Mask)event_mask, confine_to,
+			cursor, time, POINTER);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+/*
+ * Ungrab the pointer
+ */
+
+void   XtUngrabPointer(
+    Widget	widget,
+    Time	time)
+{
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    UngrabDevice(widget, time, POINTER);
+    UNLOCK_APP(app);
+}
+
+
+void _XtRegisterPassiveGrabs (
+    Widget	widget)
+{
+    XtPerWidgetInput	pwi = _XtGetPerWidgetInput (widget, FALSE);
+
+    if (pwi != NULL && !pwi->realize_handler_added) {
+	XtAddEventHandler(widget, StructureNotifyMask, FALSE,
+			  RealizeHandler,
+			  (XtPointer)pwi);
+	pwi->realize_handler_added = TRUE;
+    }
+}
diff --git a/libXt/src/Pointer.c b/libXt/src/Pointer.c
new file mode 100644
index 000000000..bbcb13371
--- /dev/null
+++ b/libXt/src/Pointer.c
@@ -0,0 +1,115 @@
+/* $Xorg: Pointer.c,v 1.4 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/********************************************************
+
+Copyright 1988 by Hewlett-Packard Company
+Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission
+notice appear in supporting documentation, and that the names of
+Hewlett-Packard or Digital not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "PassivGraI.h"
+
+
+#define AllButtonsMask (Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask)
+
+Widget _XtProcessPointerEvent(
+    XButtonEvent  	*event,
+    Widget 		widget,
+    XtPerDisplayInput 	pdi)
+{
+    XtDevice		device = &pdi->pointer;
+    XtServerGrabPtr	newGrab = NULL, devGrab = &device->grab;
+    Widget		dspWidget = NULL;
+    Boolean		deactivateGrab = FALSE;
+
+    switch (event->type)
+      {
+	case ButtonPress:
+	  {
+	      if (!IsServerGrab(device->grabType))
+		{
+		    Cardinal		i;
+
+		    for (i = pdi->traceDepth;
+			 i > 0 && !newGrab;
+			 i--)
+		      newGrab = _XtCheckServerGrabsOnWidget((XEvent*)event,
+							    pdi->trace[i-1],
+							    POINTER);
+		}
+	      if (newGrab)
+		{
+		    /* Activate the grab */
+		    device->grab = *newGrab;
+		    device->grabType = XtPassiveServerGrab;
+		}
+	  }
+	  break;
+
+	case ButtonRelease:
+	  {
+	      if ((device->grabType == XtPassiveServerGrab) &&
+		  !(event->state & ~(Button1Mask << (event->button - 1)) &
+		    AllButtonsMask))
+		deactivateGrab = TRUE;
+	  }
+	  break;
+      }
+
+    if (IsServerGrab(device->grabType) && !(devGrab)->ownerEvents)
+      dspWidget = (devGrab)->widget;
+    else
+      dspWidget = widget;
+
+    if (deactivateGrab)
+      device->grabType = XtNoServerGrab;
+
+    return dspWidget;
+}
diff --git a/libXt/src/Popup.c b/libXt/src/Popup.c
new file mode 100644
index 000000000..aac712da1
--- /dev/null
+++ b/libXt/src/Popup.c
@@ -0,0 +1,198 @@
+/* $Xorg: Popup.c,v 1.4 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/* $XFree86$ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "ShellP.h"
+
+void _XtPopup(
+    Widget      widget,
+    XtGrabKind  grab_kind,
+    _XtBoolean  spring_loaded)
+{
+    register ShellWidget shell_widget = (ShellWidget) widget;
+
+    if (! XtIsShell(widget)) {
+	XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+		"invalidClass","xtPopup",XtCXtToolkitError,
+                "XtPopup requires a subclass of shellWidgetClass",
+                  (String *)NULL, (Cardinal *)NULL);
+    }
+
+    if (! shell_widget->shell.popped_up) {
+	XtGrabKind call_data = grab_kind;
+	XtCallCallbacks(widget, XtNpopupCallback, (XtPointer)&call_data);
+	shell_widget->shell.popped_up = TRUE;
+	shell_widget->shell.grab_kind = grab_kind;
+	shell_widget->shell.spring_loaded = spring_loaded;
+	if (shell_widget->shell.create_popup_child_proc != NULL) {
+	    (*(shell_widget->shell.create_popup_child_proc))(widget);
+	}
+	if (grab_kind == XtGrabExclusive) {
+	    XtAddGrab(widget, TRUE, spring_loaded);
+	} else if (grab_kind == XtGrabNonexclusive) {
+	    XtAddGrab(widget, FALSE, spring_loaded);
+	}
+	XtRealizeWidget(widget);
+	XMapRaised(XtDisplay(widget), XtWindow(widget));
+    } else
+	XRaiseWindow(XtDisplay(widget), XtWindow(widget));
+
+} /* _XtPopup */
+
+void XtPopup (Widget widget, XtGrabKind grab_kind)
+{
+    Widget hookobj;
+
+    switch (grab_kind) {
+
+      case XtGrabNone:
+      case XtGrabExclusive:
+      case XtGrabNonexclusive:
+	break;
+
+      default:
+	XtAppWarningMsg(
+		XtWidgetToApplicationContext(widget),
+		"invalidGrabKind","xtPopup",XtCXtToolkitError,
+		"grab kind argument has invalid value; XtGrabNone assumed",
+		(String *)NULL, (Cardinal *)NULL);
+	grab_kind = XtGrabNone;
+    }
+
+    _XtPopup(widget, grab_kind, FALSE);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHpopup;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer)grab_kind;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+} /* XtPopup */
+
+void XtPopupSpringLoaded (
+    Widget widget)
+{
+    Widget hookobj;
+
+    _XtPopup(widget, XtGrabExclusive, True);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHpopupSpringLoaded;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+}
+
+void XtPopdown(
+    Widget  widget)
+{
+    /* Unmap a shell widget if it is mapped, and remove from grab list */
+    Widget hookobj;
+    ShellWidget shell_widget = (ShellWidget) widget;
+    XtGrabKind grab_kind;
+
+    if (! XtIsShell(widget)) {
+	XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+		"invalidClass","xtPopdown",XtCXtToolkitError,
+            "XtPopdown requires a subclass of shellWidgetClass",
+              (String *)NULL, (Cardinal *)NULL);
+    }
+
+#ifndef X_NO_XT_POPDOWN_CONFORMANCE
+    if (!shell_widget->shell.popped_up)
+        return;
+#endif
+
+    grab_kind = shell_widget->shell.grab_kind;
+    XWithdrawWindow(XtDisplay(widget), XtWindow(widget),
+		    XScreenNumberOfScreen(XtScreen(widget)));
+    if (grab_kind != XtGrabNone)
+	XtRemoveGrab(widget);
+    shell_widget->shell.popped_up = FALSE;
+    XtCallCallbacks(widget, XtNpopdownCallback, (XtPointer)&grab_kind);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHpopdown;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+} /* XtPopdown */
+
+/* ARGSUSED */
+void XtCallbackPopdown(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    register XtPopdownID id = (XtPopdownID) closure;
+
+    XtPopdown(id->shell_widget);
+    if (id->enable_widget != NULL) {
+	XtSetSensitive(id->enable_widget, TRUE);
+    }
+} /* XtCallbackPopdown */
diff --git a/libXt/src/PopupCB.c b/libXt/src/PopupCB.c
new file mode 100644
index 000000000..be5fd8502
--- /dev/null
+++ b/libXt/src/PopupCB.c
@@ -0,0 +1,84 @@
+/* $Xorg: PopupCB.c,v 1.4 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+/* ARGSUSED */
+void XtCallbackNone(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    XtSetSensitive(widget, FALSE);
+    _XtPopup((Widget) closure, XtGrabNone, FALSE);
+} /* XtCallbackNone */
+
+/* ARGSUSED */
+void XtCallbackNonexclusive(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+
+    XtSetSensitive(widget, FALSE);
+    _XtPopup((Widget) closure, XtGrabNonexclusive, FALSE);
+} /* XtCallbackNonexclusive */
+
+/* ARGSUSED */
+void XtCallbackExclusive(
+    Widget  widget,
+    XtPointer closure,
+    XtPointer call_data)
+{
+    XtSetSensitive(widget, FALSE);
+    _XtPopup((Widget) closure, XtGrabExclusive, FALSE);
+} /* XtCallbackExclusive */
diff --git a/libXt/src/RectObj.c b/libXt/src/RectObj.c
new file mode 100644
index 000000000..0835d5b47
--- /dev/null
+++ b/libXt/src/RectObj.c
@@ -0,0 +1,193 @@
+/* $Xorg: RectObj.c,v 1.4 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/RectObj.c,v 1.2 2001/08/22 22:52:19 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "CreateI.h"
+
+/******************************************************************
+ *
+ * Rectangle Object Resources
+ *
+ ******************************************************************/
+
+static void XtCopyAncestorSensitive(Widget, int, XrmValue *);
+
+static XtResource resources[] = {
+
+    {XtNancestorSensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
+      XtOffsetOf(RectObjRec,rectangle.ancestor_sensitive),XtRCallProc,
+      (XtPointer)XtCopyAncestorSensitive},
+    {XtNx, XtCPosition, XtRPosition, sizeof(Position),
+         XtOffsetOf(RectObjRec,rectangle.x), XtRImmediate, (XtPointer)0},
+    {XtNy, XtCPosition, XtRPosition, sizeof(Position),
+         XtOffsetOf(RectObjRec,rectangle.y), XtRImmediate, (XtPointer)0},
+    {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension),
+         XtOffsetOf(RectObjRec,rectangle.width), XtRImmediate, (XtPointer)0},
+    {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension),
+         XtOffsetOf(RectObjRec,rectangle.height), XtRImmediate, (XtPointer)0},
+    {XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension),
+         XtOffsetOf(RectObjRec,rectangle.border_width), XtRImmediate,
+	 (XtPointer)1},
+    {XtNsensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
+         XtOffsetOf(RectObjRec,rectangle.sensitive), XtRImmediate,
+	 (XtPointer)True}
+    };
+
+static void RectClassPartInitialize(WidgetClass);
+static void RectSetValuesAlmost(Widget, Widget, XtWidgetGeometry *, XtWidgetGeometry *);
+
+externaldef(rectobjclassrec) RectObjClassRec rectObjClassRec = {
+  {
+    /* superclass	  */	(WidgetClass)&objectClassRec,
+    /* class_name	  */	"Rect",
+    /* widget_size	  */	sizeof(RectObjRec),
+    /* class_initialize   */    NULL,
+    /* class_part_initialize*/	RectClassPartInitialize,
+    /* class_inited       */	FALSE,
+    /* initialize	  */	NULL,
+    /* initialize_hook    */	NULL,
+    /* realize		  */	NULL,
+    /* actions		  */	NULL,
+    /* num_actions	  */	0,
+    /* resources	  */	resources,
+    /* num_resources	  */	XtNumber(resources),
+    /* xrm_class	  */	NULLQUARK,
+    /* compress_motion	  */	FALSE,
+    /* compress_exposure  */	TRUE,
+    /* compress_enterleave*/ 	FALSE,
+    /* visible_interest	  */	FALSE,
+    /* destroy		  */	NULL,
+    /* resize		  */	NULL,
+    /* expose		  */	NULL,
+    /* set_values	  */	NULL,
+    /* set_values_hook    */	NULL,
+    /* set_values_almost  */	RectSetValuesAlmost,
+    /* get_values_hook    */	NULL,
+    /* accept_focus	  */	NULL,
+    /* version		  */	XtVersion,
+    /* callback_offsets   */    NULL,
+    /* tm_table           */    NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */	NULL,
+    /* extension	    */  NULL
+  }
+};
+
+externaldef(rectObjClass)
+WidgetClass rectObjClass = (WidgetClass)&rectObjClassRec;
+
+/*ARGSUSED*/
+static void XtCopyAncestorSensitive(
+    Widget      widget,
+    int		offset,
+    XrmValue    *value)
+{
+    static Boolean  sensitive;
+    Widget parent = widget->core.parent;
+
+    sensitive = (parent->core.ancestor_sensitive & parent->core.sensitive);
+    value->addr = (XPointer)(&sensitive);
+}
+
+
+/*
+ * Start of rectangle object methods
+ */
+
+
+static void RectClassPartInitialize(
+    register WidgetClass wc)
+{
+    register RectObjClass roc = (RectObjClass)wc;
+    register RectObjClass super = ((RectObjClass)roc->rect_class.superclass);
+
+    /* We don't need to check for null super since we'll get to object
+       eventually, and it had better define them!  */
+
+
+    if (roc->rect_class.resize == XtInheritResize) {
+	roc->rect_class.resize = super->rect_class.resize;
+    }
+
+    if (roc->rect_class.expose == XtInheritExpose) {
+	roc->rect_class.expose = super->rect_class.expose;
+    }
+
+    if (roc->rect_class.set_values_almost == XtInheritSetValuesAlmost) {
+	roc->rect_class.set_values_almost = super->rect_class.set_values_almost;
+    }
+
+
+    if (roc->rect_class.query_geometry == XtInheritQueryGeometry) {
+	roc->rect_class.query_geometry = super->rect_class.query_geometry;
+    }
+}
+
+/*
+ * Why there isn't an Initialize Method:
+ *
+ * Initialization of the RectObj non-Resource field is done by the
+ * intrinsics in _XtCreateWidget in order that the field is initialized
+ * for use by converters during instance resource resolution.
+ */
+
+/*ARGSUSED*/
+static void RectSetValuesAlmost(
+    Widget		old,
+    Widget		new,
+    XtWidgetGeometry    *request,
+    XtWidgetGeometry    *reply)
+{
+    *request = *reply;
+}
diff --git a/libXt/src/ResConfig.c b/libXt/src/ResConfig.c
new file mode 100644
index 000000000..fd6d057c9
--- /dev/null
+++ b/libXt/src/ResConfig.c
@@ -0,0 +1,1023 @@
+/* $Xorg: ResConfig.c,v 1.5 2001/02/09 02:03:56 xorgcvs Exp $ */
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/*****************************************************************
+
+(C) COPYRIGHT International Business Machines Corp. 1992,1997
+    All Rights Reserved
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE IBM CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the IBM Corporation shall
+not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from the IBM
+Corporation.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/ResConfig.c,v 3.7 2001/08/22 22:52:19 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Intrinsic.h"
+#include "IntrinsicI.h"
+#include "Core.h"
+#include "CoreP.h"
+#include "ShellP.h"
+#include "StringDefs.h"
+#include "ResConfigP.h"
+#include <X11/Xatom.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_BUFFER 512
+
+static void _search_child(Widget, char *, char *, char *, char *, char, char *);
+static void _set_and_search(Widget, char *, char *, char *, char *, char , char *);
+static int _locate_children(Widget, Widget **);
+
+#if defined(sun) && !defined(SVR4)
+# define Strtoul(a,b,c) (unsigned long)strtol(a,b,c)
+#else
+# define Strtoul(a,b,c) strtoul(a,b,c)
+#endif
+
+
+/*
+ * NAME: _set_resource_values
+ *
+ * FUNCTION:
+ *	This function sets the value on the widget.  It must first determine
+ *	if the last part is a valid resource for that widget.  (eg.
+ *	labelString is a valid resource for label but not for bulletin board)
+ *	It must also add the resource to the application's resource database
+ *	and then query it out using specific resource strings that it builds
+ *	from the widget information.  This ensures that a customizing tool
+ *	on-the-fly paradigm is followed:  an application that is
+ *	instantaneously updated should look the same as one that is restarted
+ *	and uses the .Xdefaults file.
+ *
+ * PARAMETERS:
+ *	w		the widget to match
+ *	resource	the resource string to be matched
+ *	value		the value to be set
+ *	last_part	the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: void
+ *
+ * ERRORS: none
+ */
+static void
+_set_resource_values (
+	Widget w,
+	char *resource,
+	char *value,
+	char *last_part)
+{
+	XrmDatabase 	db = NULL;
+	char		*resource_name = NULL;
+	char		*resource_class = NULL;
+	char		*return_type;
+	XrmValue	return_value;
+	char		*resource_value;
+	Widget		cur = w;
+	char		*temp;
+	XtResourceList	resources_return = NULL;
+	Cardinal 	num_resources_return = 0;
+	Cardinal	res_index;
+	Boolean		found_resource = False;
+	Display		*dpy;
+	XrmDatabase	tmp_db;
+
+	if (!XtIsWidget (w))
+		dpy = XtDisplay (w->core.parent);
+	else
+		dpy = XtDisplay (w);
+	tmp_db = XtDatabase(dpy);
+
+	/*
+	 * get a list of all the valid resources for this widget
+	 */
+	XtGetResourceList (w->core.widget_class,
+		&resources_return, &num_resources_return);
+
+	/*
+	 * try to match the last_part of the resource string with
+	 * a resource in this resource list
+	 */
+	for (res_index=0; res_index<num_resources_return; res_index++) {
+		if ((strcmp (last_part,
+			resources_return[res_index].resource_name) == 0) ||
+		    (strcmp (last_part,
+			resources_return[res_index].resource_class) == 0)) {
+			found_resource = True;
+			break;
+		}
+	}
+
+	/*
+	 * if resource is not a valid resource for this widget
+	 * or the resource name or class are NULL
+	 * then exit this function
+	 */
+	if (!found_resource
+		|| !resources_return[res_index].resource_name
+		|| !resources_return[res_index].resource_class) {
+		XtFree ((char *) resources_return);
+		return;
+	}
+
+	/*
+	 * build the full resource name and class specifications so
+	 * that you can query the resource database
+	 * 	eg: .app.button1.foreground
+	 * 	    .App.XmPushButton.Foreground
+	 */
+	while (cur != NULL) {
+		/*
+		 * create resource name string
+		 */
+		if (resource_name) {
+			temp = XtMalloc (sizeof(char) *
+				(2 + strlen(cur->core.name)
+			   	+ strlen(resource_name)));
+			sprintf (temp, ".%s%s", cur->core.name, resource_name);
+			XtFree (resource_name);
+		} else if (!XtIsWidget (cur) || !cur->core.name) {
+			cur = XtParent(cur);
+			continue;
+		} else {
+			temp = XtMalloc (sizeof(char) *
+				(2 + strlen(cur->core.name)));
+			sprintf (temp, ".%s", cur->core.name);
+		}
+		resource_name = temp;
+
+		/*
+		 * create resource class string
+		 */
+		if ((XtIsTopLevelShell (cur)) && (XtParent (cur) == NULL)) {
+			ApplicationShellWidget	top =
+				(ApplicationShellWidget) (cur);
+
+			if (resource_class) {
+				temp = XtMalloc (sizeof(char) *
+					(2 + strlen(top->application.class)
+					+ strlen(resource_class)));
+				sprintf (temp, ".%s%s",
+					top->application.class, resource_class);
+			} else {
+				temp = XtMalloc (sizeof(char) *
+					(2 + strlen(top->application.class)));
+				sprintf (temp, ".%s",
+					top->application.class);
+			}
+		} else {
+			if (resource_class) {
+				temp = XtMalloc (sizeof(char) *
+					(2 + strlen(
+					cur->core.widget_class->core_class.class_name)
+					+ strlen(resource_class)));
+				sprintf (temp, ".%s%s",
+					cur->core.widget_class->core_class.class_name,
+					resource_class);
+			} else {
+				temp = XtMalloc (sizeof(char) *
+					(2 + strlen(
+					cur->core.widget_class->core_class.class_name)));
+				sprintf (temp, ".%s",
+					cur->core.widget_class->core_class.class_name);
+			}
+		}
+		if (resource_class != NULL)
+			XtFree (resource_class);
+		resource_class = temp;
+
+		cur = XtParent(cur);
+	}
+
+	/*
+	 * add the resource name to the end of the resource name string
+	 */
+	temp = XtMalloc (2 + strlen(resource_name) +
+		strlen(resources_return[res_index].resource_name));
+	sprintf (temp, "%s.%s", resource_name,
+		resources_return[res_index].resource_name);
+	if (resource_name != NULL)
+		XtFree (resource_name);
+	resource_name = temp;
+
+	/*
+	 * add the resource class to the end of the resource class string
+	 */
+	temp = XtMalloc (2 + strlen(resource_class) +
+		strlen(resources_return[res_index].resource_class));
+	sprintf (temp, "%s.%s", resource_class,
+		resources_return[res_index].resource_class);
+	if (resource_class != NULL)
+		XtFree (resource_class);
+	resource_class = temp;
+
+#ifdef DEBUG
+	fprintf (stderr, "resource_name = %s\n", resource_name);
+	fprintf (stderr, "resource_class = %s\n", resource_class);
+#endif
+
+	/*
+	 * put the resource and its value in a resource database and
+	 * then query it back out again using the specific name and
+	 * class resource strings that were built above.  This is
+	 * necessary to maintain a precedence similar to the .Xdefaults
+	 * file
+	 */
+	XrmPutStringResource (&db, resource, value);
+	XrmMergeDatabases (db, &tmp_db);
+	XrmGetResource (tmp_db, resource_name, resource_class,
+		&return_type, &return_value);
+	if (return_type)
+		resource_value = XtNewString (return_value.addr);
+	else
+		resource_value = XtNewString (value);
+
+#ifdef DEBUG
+	fprintf (stderr,
+		"Apply:\n\twidget = %s\n\tlast_part = %s\n\tvalue = %s\n",
+		(w->core.name == NULL) ? "NULL" : w->core.name,
+		resources_return[res_index].resource_name,
+		resource_value);
+#endif
+	/*
+	 * use XtVaSetValues with XtVaTypedArg to convert the value of
+	 * type String the the same type as the resource (last_part).
+	 * Then set the value.
+	 */
+	XtVaSetValues (w,
+		XtVaTypedArg, resources_return[res_index].resource_name,
+		XtRString, resource_value,
+		strlen (resource_value) + 1,
+		NULL);
+
+	XtFree ((char *) resources_return);
+	XtFree (resource_name);
+	XtFree (resource_class);
+	XtFree (resource_value);
+}
+
+/*
+ * NAME: _apply_values_to_children
+ *
+ * FUNCTION:
+ *	Once the resource string matches the value must be applied to
+ *	all children if applicable. (eg. App*Form.background must apply
+ *	background to all children of the Form widget)
+ *
+ * PARAMETERS:
+ *	w		the widget to match
+ *	remainder	the part of the resource string left over
+ *	resource	the resource string to be matched
+ *	value		the value to be set
+ *	last_token	the last * or . before the final resoruce part
+ *	last_part	the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: void
+ *
+ * ERRORS: none
+ */
+static void
+_apply_values_to_children (
+	Widget w,
+	char *remainder,
+	char *resource,
+	char *value,
+	char last_token,
+	char *last_part)
+{
+	int 	i;
+	int	num_children;
+	Widget	*children;
+
+	/*
+	 * Recursively search through the children
+	 */
+	num_children = _locate_children (w, &children);
+
+	for (i=0; i<num_children; i++) {
+
+#ifdef DEBUG
+		if (XtIsWidget (children[i]) && XtIsWidget (w))
+			fprintf (stderr, "searching child %s of parent %s\n",
+				children[i]->core.name, w->core.name);
+		else
+			fprintf (stderr,"searching child (NULL) of parent %s\n",
+				w->core.name);
+		if (!XtIsWidget (children[i]))
+			fprintf (stderr, "children[%d] is NOT a widget\n", i);
+		if (!XtIsWidget (w))
+			fprintf (stderr, "w is NOT a widget\n");
+#endif
+
+		_set_resource_values (children[i], resource, value, last_part);
+		_apply_values_to_children (children[i], remainder,
+				resource, value, last_token, last_part);
+	}
+
+	XtFree ((char *)children);
+}
+
+/*
+ * NAME: _search_child
+ *
+ * FUNCTION:
+ *	descends through each child of the tree
+ *
+ * PARAMETERS:
+ *	w		the widget whose children are to be searched
+ *	indx		index into the resource string
+ *	remainder	the remaining part of the resource string
+ *	resource	the resource string to be matched
+ *	value		the value to be applied
+ *	last_token	the last * or . before the final resoruce part
+ *	last_part	the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ */
+static void
+_search_child (
+	Widget w,
+	char *indx,
+	char *remainder,
+	char *resource,
+	char *value,
+	char last_token,
+	char *last_part)
+{
+	int 	i;
+	int	num_children;
+	Widget	*children;
+
+	/*
+	 * Recursively search through the children
+	 */
+	num_children = _locate_children (w, &children);
+	for (i=0; i<num_children; i++) {
+		_set_and_search (children[i], indx, remainder, resource,
+			value, last_token, last_part);
+	}
+
+	XtFree ((char *)children);
+}
+
+/*
+ * NAME: _get_part
+ *
+ * FUNCTION:
+ * 	This routine will return the token and following part of the resource
+ * 	when given the current index it will update the index accordingly
+ *
+ * PARAMETERS:
+ *	remainder	the part of the resource string left over
+ *	indx		the index into the resource string
+ *	part		the parsed off part of the resource string
+ *
+ * RETURN VALUES:
+ *	char		the token (* or . or ?) preceding the resource part
+ *	indx		the index into the resource string
+ *	part		the parsed off part of the resource string
+ *
+ * ERRORS: none
+ */
+/* ARGSUSED */
+static char
+_get_part (
+	char *remainder,
+	char **indx,
+	char **part)
+{
+	char	buffer[MAX_BUFFER];
+	char	*buf_ptr;
+	char	token = **indx;
+	int	i = 0;
+
+	/*
+	 * copy the remainder part into the buffer
+	 */
+	buf_ptr = buffer;
+	(*indx)++;			/* get rid of the token		*/
+	while (**indx && (**indx != '.') && (**indx != '*')) {
+		*buf_ptr++ = *(*indx)++;
+		if (++i >= MAX_BUFFER - 1)
+			break;
+	}
+	*buf_ptr = '\0';
+
+	*part = XtNewString (buffer);	/* return a new string to part	*/
+
+	if (strcmp (*indx, "") == 0)
+		*indx = NULL;
+
+	return (token);			/* return the token		*/
+}
+
+/*
+ * NAME: _match_resource_to_widget
+ *
+ * FUNCTION:
+ *	This function matches the resource part to the widget name or class
+ *
+ * PARAMETERS:
+ *	w		the widget to match
+ *	part		the parsed off part of the resource string
+ *
+ * RETURN VALUES:
+ *	Boolean		true if a match occurs
+ *
+ * ERRORS: none
+ */
+static Boolean
+_match_resource_to_widget (
+	Widget w,
+	char *part)
+{
+	/*
+	 * Match any widget at this level if the ? is used
+	 */
+	if (strcmp (part, "?") == 0)
+		return (True);
+
+	/*
+	 * if the object is really a widget then its name can be matched
+	 * otherwise only use its class.  Note that if you try to reference
+	 * a widget name when the object is not a widget, you may get a
+	 * core dump from an invalid pointer reference.
+	 */
+	if (XtIsWidget (w)) {
+		if ((strcmp (w->core.name, part) == 0) ||
+		    (strcmp (w->core.widget_class->core_class.class_name,
+							part) == 0))
+			return (True);
+		else
+			return (False);
+	} else {
+		if ((strcmp (w->core.widget_class->core_class.class_name,
+							part) == 0))
+			return (True);
+		else
+			return (False);
+	}
+}
+
+/*
+ * NAME: _set_and_search
+ *
+ * FUNCTION:
+ * 	The algorithm to search the widget tree and apply a resource string
+ *
+ * PARAMETERS:
+ *	w		the widget to match
+ *	indx		the index into the resource string
+ *	remainder	the part of the resource string left over
+ *	resource	the resource string to be matched
+ *	value		the value to be set
+ *	last_token	the last * or . before the final resoruce part
+ *	last_part	the last resource part (e.g. *background)
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ *
+ * ALGORITHM:
+ * loop (look at all children)
+ * 	if (resource segment and current widget match)
+ *		if '.'
+ *			if at end of resource string
+ *				set values (	.=over all children
+ *						*=this widget only)
+ *			else
+ *				descend the widget tree
+ *				and parse off resource segment
+ *			exit the loop
+ *		if '*'
+ *			if at end of resource string
+ *				set values (	.=over all children
+ *						*=this widget only)
+ *			descend and parse
+ *	else
+ *		if '.'
+ *			continue looping
+ *		if '*'
+ *			descend but don't parse
+ *			continue looping
+ * end loop
+ *
+ * NOTE:  the _set_resource_values routine will not allow a value to be
+ *	set on a resource against the rules of the resource database manager
+ */
+static void
+_set_and_search (
+	Widget w,
+	char *indx,
+	char *remainder,
+	char *resource,
+	char *value,
+	char last_token,
+	char *last_part)
+{
+	char	*part;
+	char	*local_index = indx;
+	char	token;
+
+	/*
+	 * parse off one part, return token and the new index
+	 */
+	token = _get_part (remainder, &local_index, &part);
+
+	if (_match_resource_to_widget (w, part)) {
+		if (token == '.') {
+			if (local_index == NULL) {
+				if (last_token == '.') {
+					_set_resource_values (w, resource,
+						value, last_part);
+				} else if (last_token == '*') {
+					_set_resource_values (w, resource,
+						value, last_part);
+					_apply_values_to_children (w,
+						remainder, resource, value,
+						last_token, last_part);
+				}
+			} else
+				_search_child (w, local_index, remainder,
+					resource, value, last_token, last_part);
+			return;
+		}
+		if (token == '*') {
+			if (local_index == NULL) {
+				if (last_token == '.') {
+					_set_resource_values (w, resource,
+						value, last_part);
+				} else if (last_token == '*') {
+					_set_resource_values (w, resource,
+						value, last_part);
+					_apply_values_to_children ( w,
+						remainder, resource, value,
+						last_token, last_part);
+				}
+			} else
+				_search_child (w, local_index, remainder,
+					resource, value, last_token, last_part);
+		}
+	} else {/* if the widget name and class don't match the part */
+		/* if (token == '.') just continue looping */
+
+		if (token == '*') {
+			_search_child (w, indx, remainder, resource, value,
+				last_token, last_part);
+		}
+	}
+
+	XtFree (part);
+}
+
+/*
+ * NAME: _get_last_part
+ *
+ * FUNCTION:
+ * 	This routine will parse off the last segment of a resource string
+ * 	and its token and return them.  the remainder of resource is also
+ * 	returned.  strcoll is used to guarantee no problems with
+ *	international strings.
+ *
+ * PARAMETERS:
+ *	remainder	the part of the resource string left over
+ *	part		the parsed off part of the resource string
+ *
+ * RETURN VALUES:
+ *	char		the token (* or . or ?) preceding the resource part
+ *	remainder	the part of the resource string left over
+ *	part		the parsed off part of the resource string
+ *
+ * ERRORS: none
+ */
+static char
+_get_last_part (
+	char *remainder,
+	char **part)
+{
+	char	*loose, *tight;
+
+	loose = strrchr (remainder, '*');
+	tight = strrchr (remainder, '.');
+
+	if ((loose == NULL) && (tight == NULL)) {
+		*part = XtNewString (remainder);
+		return ('.');
+	}
+	if ((loose == NULL) || (tight && (strcoll (loose, tight) < 0))) {
+		*tight++ = '\0';	/* shorten the remainder string */
+		*part = XtNewString (tight);
+		return ('.');
+	}
+	if ((tight == NULL) || (loose && (strcoll (tight, loose) < 0))) {
+		*loose++ = '\0';
+		*part = XtNewString (loose);
+		return ('*');
+	}
+	*part = NULL;
+
+	return ('0');	/* error - return 0 */
+}
+
+/*
+ * NAME: _search_widget_tree
+ *
+ * FUNCTION:
+ *	This function tries to match a resource string to the widgets
+ *	it applies to.  The functions it invokes to do this then set
+ *	the value for that resource to each widget.
+ *
+ *	The resource string has to be parsed into the following format:
+ *		resource = App*Form*button1.background
+ *		remainder = *Form*button1
+ *		last_part = background		last_token = .
+ *	As the widget tree is recursively descended, these variables are
+ *	passed.  The remainder is parsed at each level in the widget
+ *	tree as the _set_and_search function attempts to match
+ *	the resource part (eg. part = Form  token = *) to a widget.  When
+ *	the entire resource string has been matched, the _set_resource_values
+ *	functions is called to apply the value to the widget or widgets.
+ *
+ * PARAMETERS:
+ *	w		a widget from whose toplevel shell ancestor
+ *			the search will start
+ *	resource	the resource string to match
+ *	value		the value to apply
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ */
+static void
+_search_widget_tree (
+	Widget w,
+	char *resource,
+	char *value)
+{
+	Widget	parent = w;
+	char	*last_part;
+	char	*remainder = NULL;
+	char	last_token;
+	char	*indx, *copy;
+	char	*loose, *tight;
+	int	loose_len, tight_len;
+
+	/*
+	 * Find the root of the tree given any widget
+	 */
+	while (XtParent(parent) != NULL) {
+		parent = XtParent(parent);
+	}
+#ifdef DEBUG
+	if (XtIsWidget (w) && XtIsWidget (parent))
+		fprintf (stderr, "widget = %s parent = %s\n",
+			w->core.name, parent->core.name);
+	else
+		fprintf (stderr, "widget = NULL parent = NULL\n");
+#endif
+
+	/*
+	 * parse off the Class name that was prepended to this string in
+	 * a customizing tool
+	 */
+	loose = strchr (resource, '*');
+	tight = strchr (resource, '.');
+	if ((loose == NULL) && (tight == NULL))
+		return;
+
+	loose_len = (loose) ? strlen (loose) : 0;
+	tight_len = (tight) ? strlen (tight) : 0;
+
+	if ((loose == NULL) || (tight_len > loose_len))
+		remainder = XtNewString (tight);
+	else if ((tight == NULL) || (loose_len > tight_len))
+		remainder = XtNewString (loose);
+
+	/*
+	 * Parse last segment off of resource string, (eg. background, font,
+	 * etc.)
+	 */
+	last_token = _get_last_part (remainder, &last_part);
+	/*
+	 * this case covers resources of only one level (eg. *background)
+	 */
+	if (strcmp (remainder, "") == 0) {
+		_set_resource_values (w, resource, value, last_part);
+		if (last_token == '*')
+			_apply_values_to_children (parent, remainder, resource,
+				value, last_token, last_part);
+	/*
+	 * all other resource strings are recursively applied to the widget tree.
+	 * Prepend a '.' to the remainder string if there is no leading token.
+	 */
+	} else {
+		if (remainder[0] != '*' && remainder[0] != '.') {
+			copy = XtMalloc (strlen(remainder) + 2);
+			sprintf (copy, ".%s", remainder);
+			XtFree (remainder);
+			remainder = copy;
+		}
+		indx = remainder;
+		_set_and_search (parent, indx, remainder, resource, value,
+			last_token, last_part);
+	}
+
+	XtFree (remainder);
+	XtFree (last_part);
+}
+
+/*
+ * NAME: _locate_children
+ *
+ * FUNCTION:
+ *	returns a list of all of a widget's children
+ *
+ * PARAMETERS:
+ *	w		the parent to search for its children
+ *	children	the list of children that is created
+ *	normal		flag for normal children
+ *	popup		flag for popup children
+ *
+ * RETURN VALUES:
+ *	int		the number of children
+ *	children	the list of children found
+ *
+ * ERRORS: none
+ */
+static int
+_locate_children (
+	Widget parent,
+	Widget **children)
+{
+	CompositeWidget comp = (CompositeWidget) parent;
+	Cardinal	i;
+	int	num_children = 0;
+	int	current = 0;
+
+	/*
+	 * count the number of children
+	 */
+	if (XtIsWidget (parent))
+		num_children += parent->core.num_popups;
+	if (XtIsComposite (parent))
+		num_children += comp->composite.num_children;
+	if (num_children == 0) {
+		*children = NULL;
+		return (0);
+	}
+
+	*children = (Widget *)
+		XtMalloc ((Cardinal) sizeof(Widget) * num_children);
+
+	if (XtIsComposite (parent)) {
+		for (i=0; i<comp->composite.num_children; i++) {
+			(*children)[current] = comp->composite.children[i];
+			current++;
+		}
+	}
+
+	if (XtIsWidget (parent)) {
+		for (i=0; i<parent->core.num_popups; i++) {
+			(*children)[current] = comp->core.popup_list[i];
+			current++;
+		}
+	}
+
+	return (num_children);
+}
+
+#ifdef DEBUG
+/*
+ * NAME: dump_widget_tree
+ *
+ * FUNCTION:
+ *	recursively printout entire widget tree
+ *
+ * PARAMETERS:
+ *	w		the widget to match
+ *	indent		the amount to indent each line
+ *
+ * RETURN VALUES: void
+ *
+ * ERRORS: none
+ */
+static void
+dump_widget_tree (
+	Widget w,
+	int	indent)
+{
+	int 	i,j;
+	int	num_children;
+	Widget	*children;
+
+	/*
+	 * Recursively search through the children
+	 */
+	num_children = _locate_children (w, &children);
+	indent += 2;
+	for (i=0; i<num_children; i++) {
+		if (children[i] != NULL) {
+			for (j=0; j<indent; j++)
+				fprintf (stderr, " ");
+			if (XtIsWidget (children[i])) {
+				fprintf (stderr, "(%s)\t",children[i]->core.name);
+				fprintf (stderr, "(%s)\n",
+			children[i]->core.widget_class->core_class.class_name);
+			} else {
+				fprintf (stderr, "(NULL)\t");
+				fprintf (stderr, "(%s)\n",
+			children[i]->core.widget_class->core_class.class_name);
+			}
+		}
+		dump_widget_tree (children[i], indent);
+	}
+
+	XtFree ((char *)children);
+}
+#endif
+
+/*
+ * NAME: _XtResourceConfiguationEH
+ *
+ * FUNCTION:
+ *	This function is the event handler for the on-the-fly communication
+ *	with a resource customization tool.  This event handler must be
+ *      registered for the toplevel shell of each app.  This is best done
+ *      in the _XtCreatePopupShell and _XtAppCreateShell functions in Xt's
+ *	Create.c source file.
+ *
+ * 	The property used to communicate with a customizing tool is
+ *	placed on the toplevel shell window of the application.  The
+ *	customizing tool places a property on this window which causes
+ *	this event handler to be invoked via the PropertyNotify event.
+ *	This event handler reads the property and then deletes it from
+ *	the server.  The contents of the property are a resource string
+ *	and value.  The event handler then calls functions to walk the
+ *	applications widget tree, determining which widgets are affected
+ *	by the resource string, and then applying the value with XtSetValues.
+ *
+ * PARAMETERS:
+ *	w		the widget that invoked this event handler
+ *	client_data	not used
+ *	event		the event structure
+ *
+ * RETURN VALUES: none
+ *
+ * ERRORS: none
+ */
+/* ARGSUSED */
+void
+_XtResourceConfigurationEH (
+	Widget w,
+	XtPointer client_data,
+	XEvent *event)
+{
+	Atom		actual_type;
+	int		actual_format;
+	unsigned long	nitems;
+	unsigned long	leftover;
+	unsigned char	*data = NULL;
+	unsigned long	resource_len;
+	char		*data_ptr;
+	char		*resource;
+	char		*value;
+#ifdef DEBUG
+	int		indent = 0;
+#endif
+	XtPerDisplay	pd;
+
+#ifdef DEBUG
+	fprintf (stderr, "in _XtResourceConfiguationEH atom = %d\n",event->xproperty.atom);
+	fprintf (stderr, "    window = %x\n", XtWindow (w));
+	if (XtIsWidget (w))
+		fprintf (stderr, "    widget = %x   name = %s\n", w, w->core.name);
+#endif
+
+	pd = _XtGetPerDisplay (XtDisplay (w));
+
+	/*
+	 * The window on which a customizing tool places the property
+	 * is determined at this point.  It should be the applications
+	 * toplevel shell window.
+	 *
+	 * A customizing tool sends a "ping" to the application on
+	 * the RCM_INIT property.  The application answers the ping
+	 * by deleting the property.
+	 */
+	if (event->xproperty.atom == pd->rcm_init) {
+		XDeleteProperty (XtDisplay(w), XtWindow (w), pd->rcm_init);
+
+#ifdef DEBUG
+		if (XtIsWidget (w))
+			fprintf (stderr, "%s\n", w->core.name);
+		else
+			fprintf (stderr, "NULL name\n");
+		dump_widget_tree(w, indent);
+
+		fprintf (stderr, "answer ping\n");
+#endif
+	}
+
+	/*
+	 * This event handler ignores any property notify events that
+	 * are not RCM_INIT or RCM_DATA
+	 */
+	if (event->xproperty.atom != pd->rcm_data)
+		return;
+
+	/*
+	 * Retrieve the data from the property
+	 */
+#ifdef DEBUG
+	fprintf (stderr, "receiving RCM_DATA property\n");
+#endif
+	if (XGetWindowProperty (XtDisplay(w),
+		XtWindow (w),
+		pd->rcm_data, 0L, 8192L,
+		TRUE, XA_STRING,
+		&actual_type, &actual_format, &nitems, &leftover,
+		&data ) == Success && actual_type == XA_STRING
+			   && actual_format == 8) {
+	/*
+	 *      data format is:
+	 *
+	 *      resource_length, resource, value
+	 *
+	 *      convert the resource_length to a long, skip over it, put a
+	 *      zero byte at the end of the resource, and pick off the
+	 *      resource and value fields.
+	 */
+		if (data) {
+			resource_len = Strtoul ((void *)data, &data_ptr, 10);
+			data_ptr++;
+
+			data_ptr[resource_len] = '\0';
+
+			resource = XtNewString (data_ptr);
+			value = XtNewString (&data_ptr[resource_len + 1]);
+#ifdef DEBUG
+			fprintf (stderr, "resource_len=%d\n",resource_len);
+			fprintf (stderr, "resource = %s\t value = %s\n",
+					resource, value);
+#endif
+			/*
+			 * descend the application widget tree and
+			 * apply the value to the appropriate widgets
+			 */
+			_search_widget_tree (w, resource, value);
+
+			XtFree (resource);
+			XtFree (value);
+		}
+	}
+
+	if (data)
+		XFree ((char *)data);
+}
diff --git a/libXt/src/Resources.c b/libXt/src/Resources.c
new file mode 100644
index 000000000..8e56b864f
--- /dev/null
+++ b/libXt/src/Resources.c
@@ -0,0 +1,1267 @@
+/* $Xorg: Resources.c,v 1.4 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+/* $XFree86: xc/lib/Xt/Resources.c,v 1.11tsi Exp $ */
+
+/*LINTLIBRARY*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "Shell.h"
+#include "ShellP.h"
+#include "StringDefs.h"
+#include <stdio.h>
+
+static XrmClass	QBoolean, QString, QCallProc, QImmediate;
+static XrmName QinitialResourcesPersistent, QInitialResourcesPersistent;
+static XrmClass QTranslations, QTranslationTable;
+static XrmName Qtranslations, QbaseTranslations;
+static XrmName Qscreen;
+static XrmClass QScreen;
+
+#ifdef CRAY
+void Cjump();
+char *Cjumpp = (char *) Cjump;
+void Cjump() {}
+#endif
+
+void _XtCopyFromParent(
+    Widget      widget,
+    int		offset,
+    XrmValue    *value)
+{
+    if (widget->core.parent == NULL) {
+	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"invalidParent","xtCopyFromParent",XtCXtToolkitError,
+                  "CopyFromParent must have non-NULL parent",
+		  (String *)NULL, (Cardinal *)NULL);
+        value->addr = NULL;
+        return;
+    }
+    value->addr = (XPointer)(((char *)widget->core.parent) + offset);
+} /* _XtCopyFromParent */
+
+
+/* If the alignment characteristics of your machine are right, these may be
+   faster */
+
+#ifdef UNALIGNED
+
+void _XtCopyFromArg(
+    XtArgVal src,
+    char* dst,
+    register unsigned int size)
+{
+    if	    (size == sizeof(long))	*(long *)dst = (long)src;
+    else if (size == sizeof(short))	*(short *)dst = (short)src;
+    else if (size == sizeof(char))	*(char *)dst = (char)src;
+    else if (size == sizeof(XtPointer))	*(XtPointer *)dst = (XtPointer)src;
+    else if (size == sizeof(char*))	*(char **)dst = (char*)src;
+    else if (size == sizeof(XtArgVal))	*(XtArgVal *)dst = src;
+    else if (size > sizeof(XtArgVal))
+	(void) memmove((char *) dst, (char *)  src, (int) size);
+    else
+	(void) memmove((char *) dst, (char *) &src, (int) size);
+} /* _XtCopyFromArg */
+
+void _XtCopyToArg(
+    char* src,
+    XtArgVal *dst,
+    register unsigned int size)
+{
+    if (! (*dst)) {
+#ifdef GETVALUES_BUG
+	/* old GetValues semantics (storing directly into arglists) are bad,
+	 * but preserve for compatibility as long as arglist contains NULL.
+	 */
+        if	(size == sizeof(long))	   *dst = (XtArgVal)*(long*)src;
+	else if (size == sizeof(short))    *dst = (XtArgVal)*(short*)src;
+	else if (size == sizeof(char))	   *dst = (XtArgVal)*(char*)src;
+	else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src;
+	else if (size == sizeof(char*))    *dst = (XtArgVal)*(char**)src;
+	else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src;
+	else (void) memmove((char*)dst, (char*)src, (int)size);
+#else
+	XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError,
+	    "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL);
+#endif
+    }
+    else {
+	/* proper GetValues semantics: argval is pointer to destination */
+	if	(size == sizeof(long))	   *((long*)*dst) = *(long*)src;
+	else if (size == sizeof(short))    *((short*)*dst) = *(short*)src;
+	else if (size == sizeof(char))	   *((char*)*dst) = *(char*)src;
+	else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src;
+	else if (size == sizeof(char*))    *((char**)*dst) = *(char**)src;
+	else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src;
+	else (void) memmove((char*)*dst, (char*)src, (int)size);
+    }
+} /* _XtCopyToArg */
+
+static void CopyToArg(
+    char* src,
+    XtArgVal *dst,
+    register unsigned int size)
+{
+    if (! (*dst)) {
+	/* old GetValues semantics (storing directly into arglists) are bad,
+	 * but preserve for compatibility as long as arglist contains NULL.
+	 */
+        if	(size == sizeof(long))	   *dst = (XtArgVal)*(long*)src;
+	else if (size == sizeof(short))    *dst = (XtArgVal)*(short*)src;
+	else if (size == sizeof(char))	   *dst = (XtArgVal)*(char*)src;
+	else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src;
+	else if (size == sizeof(char*))    *dst = (XtArgVal)*(char**)src;
+	else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src;
+	else (void) memmove((char*)dst, (char*)src, (int)size);
+    }
+    else {
+	/* proper GetValues semantics: argval is pointer to destination */
+	if	(size == sizeof(long))	   *((long*)*dst) = *(long*)src;
+	else if (size == sizeof(short))    *((short*)*dst) = *(short*)src;
+	else if (size == sizeof(char))	   *((char*)*dst) = *(char*)src;
+	else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src;
+	else if (size == sizeof(char*))    *((char**)*dst) = *(char**)src;
+	else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src;
+	else (void) memmove((char*)*dst, (char*)src, (int)size);
+    }
+} /* CopyToArg */
+
+#else
+void _XtCopyFromArg(
+    XtArgVal src,
+    char* dst,
+    register unsigned int size)
+{
+    if (size > sizeof(XtArgVal))
+	(void) memmove((char *) dst, (char *)  src, (int) size);
+    else {
+	union {
+	    long	longval;
+#ifdef LONG64
+	    int		intval;
+#endif
+	    short	shortval;
+	    char	charval;
+	    char*	charptr;
+	    XtPointer	ptr;
+	} u;
+	char *p = (char*)&u;
+	if	(size == sizeof(long))	    u.longval = (long)src;
+#ifdef LONG64
+	else if (size == sizeof(int))	    u.intval = (int)src;
+#endif
+	else if (size == sizeof(short))	    u.shortval = (short)src;
+	else if (size == sizeof(char))	    u.charval = (char)src;
+	else if (size == sizeof(XtPointer)) u.ptr = (XtPointer)src;
+	else if (size == sizeof(char*))	    u.charptr = (char*)src;
+	else				    p = (char*)&src;
+
+	(void) memmove(dst, p, (int) size);
+    }
+} /* _XtCopyFromArg */
+
+void _XtCopyToArg(
+    char* src,
+    XtArgVal *dst,
+    register unsigned int size)
+{
+    if (!*dst) {
+#ifdef GETVALUES_BUG
+	/* old GetValues semantics (storing directly into arglists) are bad,
+	 * but preserve for compatibility as long as arglist contains NULL.
+	 */
+	union {
+	    long	longval;
+#ifdef LONG64
+	    int		intval;
+#endif
+	    short	shortval;
+	    char	charval;
+	    char*	charptr;
+	    XtPointer	ptr;
+	} u;
+	if (size <= sizeof(XtArgVal)) {
+	    (void) memmove((char*)&u, (char*)src, (int)size );
+	    if	    (size == sizeof(long)) 	*dst = (XtArgVal)u.longval;
+#ifdef LONG64
+	    else if (size == sizeof(int))	*dst = (XtArgVal)u.intval;
+#endif
+	    else if (size == sizeof(short))	*dst = (XtArgVal)u.shortval;
+	    else if (size == sizeof(char))	*dst = (XtArgVal)u.charval;
+	    else if (size == sizeof(char*))	*dst = (XtArgVal)u.charptr;
+	    else if (size == sizeof(XtPointer))	*dst = (XtArgVal)u.ptr;
+	    else (void) memmove((char*)dst, (char*)src, (int)size );
+	}
+	else
+	    (void) memmove((char*)dst, (char*)src, (int)size );
+#else
+	XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError,
+	    "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL);
+#endif
+    }
+    else {
+	/* proper GetValues semantics: argval is pointer to destination */
+	(void) memmove((char*)*dst, (char*)src, (int)size );
+    }
+} /* _XtCopyToArg */
+
+static void CopyToArg(
+    char* src,
+    XtArgVal *dst,
+    register unsigned int size)
+{
+    if (!*dst) {
+	/* old GetValues semantics (storing directly into arglists) are bad,
+	 * but preserve for compatibility as long as arglist contains NULL.
+	 */
+	union {
+	    long	longval;
+#ifdef LONG64
+	    int		intval;
+#endif
+	    short	shortval;
+	    char	charval;
+	    char*	charptr;
+	    XtPointer	ptr;
+	} u;
+	if (size <= sizeof(XtArgVal)) {
+	    (void) memmove((char*)&u, (char*)src, (int)size );
+	    if	    (size == sizeof(long)) 	*dst = (XtArgVal)u.longval;
+#ifdef LONG64
+	    else if (size == sizeof(int))	*dst = (XtArgVal)u.intval;
+#endif
+	    else if (size == sizeof(short))	*dst = (XtArgVal)u.shortval;
+	    else if (size == sizeof(char))	*dst = (XtArgVal)u.charval;
+	    else if (size == sizeof(char*))	*dst = (XtArgVal)u.charptr;
+	    else if (size == sizeof(XtPointer))	*dst = (XtArgVal)u.ptr;
+	    else (void) memmove((char*)dst, (char*)src, (int)size );
+	}
+	else
+	    (void) memmove((char*)dst, (char*)src, (int)size );
+    }
+    else {
+	/* proper GetValues semantics: argval is pointer to destination */
+	(void) memmove((char*)*dst, (char*)src, (int)size );
+    }
+} /* CopyToArg */
+
+#endif
+
+static Cardinal CountTreeDepth(
+    Widget w)
+{
+    Cardinal count;
+
+    for (count = 1; w != NULL; w = (Widget) w->core.parent) 
+	count++;
+
+    return count;
+}
+
+static void GetNamesAndClasses(
+    register Widget	  w,
+    register XrmNameList  names,
+    register XrmClassList classes)
+{
+    register Cardinal length, j;
+    register XrmQuark t;
+    WidgetClass class;
+
+    /* Return null-terminated quark arrays, with length the number of
+       quarks (not including NULL) */
+
+    LOCK_PROCESS;
+    for (length = 0; w != NULL; w = (Widget) w->core.parent) {
+	names[length] = w->core.xrm_name;
+	class = XtClass(w);
+	/* KLUDGE KLUDGE KLUDGE KLUDGE */
+	if (w->core.parent == NULL && XtIsApplicationShell(w)) {
+	    classes[length] =
+		((ApplicationShellWidget) w)->application.xrm_class;
+	} else classes[length] = class->core_class.xrm_class;
+	length++;
+     }
+    UNLOCK_PROCESS;
+    /* They're in backwards order, flop them around */
+    for (j = 0; j < length/2; j++) {
+	t = names[j];
+	names[j] = names[length-j-1];
+	names[length-j-1] = t;
+        t = classes[j];
+	classes[j] = classes[length-j-1];
+	classes[length-j-1] = t;
+    }
+    names[length] = NULLQUARK;
+    classes[length] = NULLQUARK;
+} /* GetNamesAndClasses */
+
+
+/* Spiffy fast compiled form of resource list.				*/
+/* XtResourceLists are compiled in-place into XrmResourceLists		*/
+/* All atoms are replaced by quarks, and offsets are -offset-1 to	*/
+/* indicate that this list has been compiled already			*/
+
+void _XtCompileResourceList(
+    register XtResourceList resources,
+    	     Cardinal       num_resources)
+{
+    register Cardinal count;
+
+#define xrmres  ((XrmResourceList) resources)
+#define PSToQ   XrmPermStringToQuark
+
+    for (count = 0; count < num_resources; resources++, count++) {
+    	xrmres->xrm_name	 = PSToQ(resources->resource_name);
+    	xrmres->xrm_class	 = PSToQ(resources->resource_class);
+    	xrmres->xrm_type	 = PSToQ(resources->resource_type);
+        xrmres->xrm_offset	 = (Cardinal)
+		(-(int)resources->resource_offset - 1);
+    	xrmres->xrm_default_type = PSToQ(resources->default_type);
+    }
+#undef PSToQ
+#undef xrmres
+} /* _XtCompileResourceList */
+
+/* Like _XtCompileResourceList, but strings are not permanent */
+static void  XrmCompileResourceListEphem(
+    register XtResourceList resources,
+    	     Cardinal       num_resources)
+{
+    register Cardinal count;
+
+#define xrmres  ((XrmResourceList) resources)
+
+    for (count = 0; count < num_resources; resources++, count++) {
+    	xrmres->xrm_name	 = StringToName(resources->resource_name);
+    	xrmres->xrm_class	 = StringToClass(resources->resource_class);
+    	xrmres->xrm_type	 = StringToQuark(resources->resource_type);
+        xrmres->xrm_offset	 = (Cardinal)
+		(-(int)resources->resource_offset - 1);
+    	xrmres->xrm_default_type = StringToQuark(resources->default_type);
+    }
+#undef xrmres
+} /* XrmCompileResourceListEphem */
+
+static void BadSize(
+    Cardinal size,
+    XrmQuark name)
+{
+    String params[2];
+    Cardinal num_params = 2;
+
+    params[0] = (String)(long) size;
+    params[1] = XrmQuarkToString(name);
+    XtWarningMsg("invalidSizeOverride", "xtDependencies", XtCXtToolkitError,
+	"Representation size %d must match superclass's to override %s",
+	params, &num_params);
+} /* BadType */
+
+/*
+ * Create a new resource list, with the class resources following the
+ * superclass's resources.  If a resource in the class list overrides
+ * a superclass resource, then just replace the superclass entry in place.
+ *
+ * At the same time, add a level of indirection to the XtResourceList to
+ * create and XrmResourceList.
+ */
+void _XtDependencies(
+    XtResourceList  *class_resp,	/* VAR */
+    Cardinal	    *class_num_resp,    /* VAR */
+    XrmResourceList *super_res,
+    Cardinal	    super_num_res,
+    Cardinal	    super_widget_size)
+{
+    register XrmResourceList *new_res;
+	     Cardinal	     new_num_res;
+	     XrmResourceList class_res = (XrmResourceList) *class_resp;
+	     Cardinal        class_num_res = *class_num_resp;
+    register Cardinal	     i, j;
+	     Cardinal        new_next;
+
+    if (class_num_res == 0) {
+	/* Just point to superclass resource list */
+	*class_resp = (XtResourceList) super_res;
+	*class_num_resp = super_num_res;
+	return;
+    }
+
+    /* Allocate and initialize new_res with superclass resource pointers */
+    new_num_res = super_num_res + class_num_res;
+    new_res = (XrmResourceList *) __XtMalloc(new_num_res*sizeof(XrmResourceList));
+    if (super_num_res > 0)
+	XtMemmove(new_res, super_res, super_num_res * sizeof(XrmResourceList));
+    
+    /* Put pointers to class resource entries into new_res */
+    new_next = super_num_res;
+    for (i = 0; i < class_num_res; i++) {
+	if ((Cardinal)(-class_res[i].xrm_offset-1) < super_widget_size) {
+	    /* Probably an override of superclass resources--look for overlap */
+	    for (j = 0; j < super_num_res; j++) {
+		if (class_res[i].xrm_offset == new_res[j]->xrm_offset) {
+		    /* Spec is silent on what fields subclass can override.
+		     * The only two of real concern are type & size.
+		     * Although allowing type to be over-ridden introduces
+		     * the possibility of errors, it's at present the only
+		     * reasonable way to allow a subclass to force a private
+		     * converter to be invoked for a subset of fields.
+		     */
+		    /* We do insist that size be identical to superclass */
+		    if (class_res[i].xrm_size != new_res[j]->xrm_size) {
+			BadSize(class_res[i].xrm_size,
+				(XrmQuark) class_res[i].xrm_name);
+			class_res[i].xrm_size = new_res[j]->xrm_size;
+		    }
+		    new_res[j] = &(class_res[i]);
+		    new_num_res--;
+		    goto NextResource;
+		}
+	    } /* for j */
+	}
+	/* Not an overlap, add an entry to new_res */
+	new_res[new_next++] = &(class_res[i]);
+NextResource:;
+    } /* for i */
+
+    /* Okay, stuff new resources back into class record */
+    *class_resp = (XtResourceList) new_res;
+    *class_num_resp = new_num_res;
+} /* _XtDependencies */
+
+
+void _XtResourceDependencies(
+    WidgetClass wc)
+{
+    WidgetClass sc;
+
+    sc = wc->core_class.superclass;
+    if (sc == NULL) {
+	_XtDependencies(&(wc->core_class.resources),
+			&(wc->core_class.num_resources),
+			(XrmResourceList *) NULL, (unsigned)0, (unsigned)0);
+    } else {
+	_XtDependencies(&(wc->core_class.resources),
+			&(wc->core_class.num_resources),
+			(XrmResourceList *) sc->core_class.resources,
+			sc->core_class.num_resources,
+			sc->core_class.widget_size);
+    }
+} /* _XtResourceDependencies */
+
+void _XtConstraintResDependencies(
+    ConstraintWidgetClass wc)
+{
+    ConstraintWidgetClass sc;
+
+    if (wc == (ConstraintWidgetClass) constraintWidgetClass) {
+	_XtDependencies(&(wc->constraint_class.resources),
+			&(wc->constraint_class.num_resources),
+			(XrmResourceList *)NULL, (unsigned)0, (unsigned)0);
+    } else {
+	sc = (ConstraintWidgetClass) wc->core_class.superclass;
+	_XtDependencies(&(wc->constraint_class.resources),
+			&(wc->constraint_class.num_resources),
+			(XrmResourceList *) sc->constraint_class.resources,
+			sc->constraint_class.num_resources,
+			sc->constraint_class.constraint_size);
+    }
+} /* _XtConstraintResDependencies */
+
+
+
+    
+XrmResourceList* _XtCreateIndirectionTable (
+    XtResourceList  resources,
+    Cardinal	    num_resources)
+{
+    register Cardinal idx;
+    XrmResourceList* table;
+
+    table = (XrmResourceList*)__XtMalloc(num_resources * sizeof(XrmResourceList));
+    for (idx = 0; idx < num_resources; idx++)
+        table[idx] = (XrmResourceList)(&(resources[idx]));
+    return table;
+}
+
+static XtCacheRef *GetResources(
+    Widget	    widget,	    /* Widget resources are associated with */
+    char*	    base,	    /* Base address of memory to write to   */
+    XrmNameList     names,	    /* Full inheritance name of widget      */
+    XrmClassList    classes,	    /* Full inheritance class of widget     */
+    XrmResourceList*  table,	    /* The list of resources required.      */
+    unsigned	    num_resources,  /* number of items in resource list     */
+    XrmQuarkList    quark_args,     /* Arg names quarkified		    */
+    ArgList	    args,	    /* ArgList to override resources	    */
+    unsigned	    num_args,       /* number of items in arg list	    */
+    XtTypedArgList  typed_args,	    /* Typed arg list to override resources */
+    Cardinal*	    pNumTypedArgs,  /* number of items in typed arg list    */
+    Boolean	    tm_hack)	    /* do baseTranslations		    */
+{
+/*
+ * assert: *pNumTypedArgs == 0 if num_args > 0
+ * assert: num_args == 0 if *pNumTypedArgs > 0
+ */
+#define SEARCHLISTLEN 100
+#define MAXRESOURCES  400
+
+    XrmValue	    value;
+    XrmQuark	    rawType;
+    XrmValue	    convValue;
+    XrmHashTable    stackSearchList[SEARCHLISTLEN];
+    XrmHashTable    *searchList = stackSearchList;
+    unsigned int    searchListSize = SEARCHLISTLEN;
+    Boolean	    found[MAXRESOURCES];
+    int		    typed[MAXRESOURCES];
+    XtCacheRef	    cache_ref[MAXRESOURCES];
+    XtCacheRef      *cache_ptr, *cache_base;
+    Boolean	    persistent_resources = True;
+    Boolean	    found_persistence = False;
+    int		    num_typed_args = *pNumTypedArgs;
+    XrmDatabase     db;
+    Boolean	    do_tm_hack = False;
+
+    if ((args == NULL) && (num_args != 0)) {
+    	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"invalidArgCount","getResources",XtCXtToolkitError,
+                 "argument count > 0 on NULL argument list",
+                   (String *)NULL, (Cardinal *)NULL);
+	num_args = 0;
+    }
+    if (num_resources == 0) {
+	return NULL;
+    } else if (num_resources >= MAXRESOURCES) {
+    	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"invalidResourceCount","getResources",XtCXtToolkitError,
+              "too many resources",
+	      (String *)NULL, (Cardinal *)NULL);
+	return NULL;
+    } else if (table == NULL) {
+    	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"invalidResourceCount","getResources",XtCXtToolkitError,
+              "resource count > 0 on NULL resource list",
+	      (String *)NULL, (Cardinal *)NULL);
+	return NULL;
+    }
+
+    /* Mark each resource as not found on arg list */
+    bzero((char *) found, (int) (num_resources * sizeof(Boolean)));
+    bzero((char *) typed, (int) (num_resources * sizeof(int)));
+
+    /* Copy the args into the resources, mark each as found */
+    {
+	register ArgList	    arg;
+	register XtTypedArgList	    typed_arg;
+	register XrmName	    argName;
+	register Cardinal	    j;
+	register int	    i;
+	register XrmResourceList rx;
+	register XrmResourceList *res;
+	for (arg = args, i = 0; (Cardinal)i < num_args; i++, arg++) {
+	    argName = quark_args[i];
+	    if (argName == QinitialResourcesPersistent) {
+		persistent_resources = (Boolean)arg->value;
+		found_persistence = True;
+		continue;
+	    }
+	    for (j = 0, res = table; j < num_resources; j++, res++) {
+		rx = *res;
+		if (argName == rx->xrm_name) {
+		    _XtCopyFromArg(
+			arg->value,
+			base - rx->xrm_offset - 1,
+			rx->xrm_size);
+		    found[j] = TRUE;
+		    break;
+		}
+	    }
+	}
+	for (typed_arg = typed_args, i = 0; i < num_typed_args;
+	     i++, typed_arg++) {
+	    register XrmRepresentation argType;
+	    argName = quark_args[i];
+	    argType = (typed_arg->type == NULL) ? NULLQUARK 
+		: XrmStringToRepresentation(typed_arg->type);
+	    if (argName == QinitialResourcesPersistent) {
+		persistent_resources = (Boolean)typed_arg->value;
+		found_persistence = True;   
+		break;
+	    }
+	    for (j = 0, res = table; j < num_resources; j++, res++) {
+		rx = *res;
+		if (argName == rx->xrm_name) {
+		    if (argType != NULLQUARK && argType != rx->xrm_type) {
+			typed[j] = i + 1;
+		    } else {
+			_XtCopyFromArg(
+				       typed_arg->value,
+				       base - rx->xrm_offset - 1,
+				       rx->xrm_size);
+		    }
+		    found[j] = TRUE;
+		    break;
+		}   
+	    }
+	}
+    }
+
+    /* Ask resource manager for a list of database levels that we can
+       do a single-level search on each resource */
+
+    db = XtScreenDatabase(XtScreenOfObject(widget));
+    while (!XrmQGetSearchList(db, names, classes,
+			      searchList, searchListSize)) {
+	if (searchList == stackSearchList)
+	    searchList = NULL;
+	searchList = (XrmHashTable*)XtRealloc((char*)searchList,
+					      sizeof(XrmHashTable) *
+					      (searchListSize *= 2));
+    }
+    
+    if (persistent_resources)
+	cache_base = NULL;
+    else
+	cache_base = cache_ref;
+    /* geez, this is an ugly mess */
+    if (XtIsShell(widget)) {
+	register XrmResourceList  *res;
+	register Cardinal	  j;
+	Screen *oldscreen = widget->core.screen;
+
+	/* look up screen resource first, since real rdb depends on it */
+	for (res = table, j = 0; j < num_resources; j++, res++) {
+	    if ((*res)->xrm_name != Qscreen)
+		continue;
+	    if (typed[j]) {
+		register XtTypedArg* arg = typed_args + typed[j] - 1;
+		XrmQuark from_type;
+		XrmValue from_val, to_val;
+
+		from_type = StringToQuark(arg->type);
+		from_val.size = arg->size;
+		if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal)))
+		    from_val.addr = (XPointer)arg->value;
+		else
+		    from_val.addr = (XPointer)&arg->value;
+		to_val.size = sizeof(Screen*);
+		to_val.addr = (XPointer)&widget->core.screen;
+		found[j] = _XtConvert(widget, from_type, &from_val,
+				      QScreen, &to_val, cache_base);
+		if (cache_base && *cache_base)
+		    cache_base++;
+	    }
+	    if (!found[j]) {
+		if (XrmQGetSearchResource(searchList, Qscreen, QScreen,
+				      &rawType, &value)) {
+		    if (rawType != QScreen) {
+			convValue.size = sizeof(Screen*);
+			convValue.addr = (XPointer)&widget->core.screen;
+			(void)_XtConvert(widget, rawType, &value,
+					 QScreen, &convValue, cache_base);
+			if (cache_base && *cache_base)
+			    cache_base++;
+		    } else {
+			widget->core.screen = *((Screen **)value.addr);
+		    }
+		}
+	    }
+	    break;
+	}
+	/* now get the database to use for the rest of the resources */
+	if (widget->core.screen != oldscreen) {
+	    db = XtScreenDatabase(widget->core.screen);
+	    while (!XrmQGetSearchList(db, names, classes,
+				      searchList, searchListSize)) {
+		if (searchList == stackSearchList)
+		    searchList = NULL;
+		searchList = (XrmHashTable*)XtRealloc((char*)searchList,
+						      sizeof(XrmHashTable) *
+						      (searchListSize *= 2));
+	    }
+	}
+    }
+
+    /* go to the resource manager for those resources not found yet */
+    /* if it's not in the resource database use the default value   */
+
+    {
+	register XrmResourceList  rx;
+	register XrmResourceList  *res;
+	register Cardinal	  j;
+	register XrmRepresentation xrm_type;
+	register XrmRepresentation xrm_default_type;
+	char	char_val;
+	short	short_val;
+	int	int_val;
+	long	long_val;
+	char*	char_ptr;
+
+	if (!found_persistence) {
+	    if (XrmQGetSearchResource(searchList, QinitialResourcesPersistent,
+			QInitialResourcesPersistent, &rawType, &value)) {
+		if (rawType != QBoolean) {
+		    convValue.size = sizeof(Boolean);
+		    convValue.addr = (XPointer)&persistent_resources;
+		    (void)_XtConvert(widget, rawType, &value, QBoolean,
+				     &convValue, NULL);
+		}
+		else
+		    persistent_resources = *(Boolean*)value.addr;
+	    }
+	}
+	if (persistent_resources)
+	    cache_ptr = NULL;
+	else if (cache_base)
+	    cache_ptr = cache_base;
+	else
+	    cache_ptr = cache_ref;
+
+	for (res = table, j = 0; j < num_resources; j++, res++) {
+	    rx = *res;
+	    xrm_type = rx->xrm_type;
+	    if (typed[j]) {
+		register XtTypedArg* arg = typed_args + typed[j] - 1;
+
+		/*
+                 * This resource value has been specified as a typed arg and 
+		 * has to be converted. Typed arg conversions are done here 
+		 * to correctly interpose them with normal resource conversions.
+                 */
+		XrmQuark	    from_type;
+		XrmValue            from_val, to_val;
+		Boolean		    converted;
+                 
+		from_type = StringToQuark(arg->type);
+    		from_val.size = arg->size;
+		if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal)))
+        	    from_val.addr = (XPointer)arg->value;
+	        else
+            	    from_val.addr = (XPointer)&arg->value;
+		to_val.size = rx->xrm_size;
+		to_val.addr = base - rx->xrm_offset - 1;
+		converted = _XtConvert(widget, from_type, &from_val,
+				       xrm_type, &to_val, cache_ptr);
+		if (converted) {
+
+		    /* Copy the converted value back into the typed argument.
+		     * normally the data should be <= sizeof(XtArgVal) and
+		     * is stored directly into the 'value' field .... BUT
+		     * if the resource size is greater than sizeof(XtArgVal)
+		     * then we dynamically alloc a block of store to hold the
+		     * data and zap a copy in there !!! .... freeing it later
+		     * the size field in the typed arg is negated to indicate
+		     * that the store pointed to by the value field is
+		     * dynamic .......
+		     * "freeing" happens in the case of _XtCreate after the
+		     * CallInitialize ..... other clients of GetResources
+		     * using typed args should be aware of the need to free
+		     * this store .....
+		     */
+
+		    if(rx->xrm_size > sizeof(XtArgVal)) {
+			arg->value = (XtArgVal) __XtMalloc(rx->xrm_size);
+			arg->size = -(arg->size);
+		    } else { /* will fit - copy directly into value field */
+			arg->value = (XtArgVal) NULL;
+		    }
+		    CopyToArg((char *)(base - rx->xrm_offset - 1),
+				 &arg->value, rx->xrm_size);
+
+		} else {
+		   /* Conversion failed. Get default value. */
+		   found[j] = False;
+		}
+
+		if (cache_ptr && *cache_ptr)
+		    cache_ptr++;
+	    }
+
+	    if (!found[j]) {
+		Boolean	already_copied = False;
+		Boolean have_value = False;
+
+		if (XrmQGetSearchResource(searchList,
+			rx->xrm_name, rx->xrm_class, &rawType, &value)) {
+		    if (rawType != xrm_type) {
+			convValue.size = rx->xrm_size;
+			convValue.addr = (XPointer)(base - rx->xrm_offset - 1);
+			already_copied = have_value =
+			    _XtConvert(widget, rawType, &value,
+				       xrm_type, &convValue, cache_ptr);
+			if (cache_ptr && *cache_ptr)
+			    cache_ptr++;
+		    } else have_value = True;
+		    if (have_value && rx->xrm_name == Qtranslations)
+			do_tm_hack = True;
+		}
+		LOCK_PROCESS;
+		if (!have_value
+		    && ((rx->xrm_default_type == QImmediate)
+			|| (rx->xrm_default_type == xrm_type)
+			|| (rx->xrm_default_addr != NULL))) {
+		    /* Convert default value to proper type */
+		    xrm_default_type = rx->xrm_default_type;
+		    if (xrm_default_type == QCallProc) {
+#ifdef CRAY
+ 			if ( (int) Cjumpp != (int) Cjump)
+ 			    (*(XtResourceDefaultProc)
+			      (((int)(rx->xrm_default_addr))<<2))(
+ 				 widget,-(rx->xrm_offset+1), &value);
+			else
+#endif
+			(*(XtResourceDefaultProc)(rx->xrm_default_addr))(
+			      widget,-(rx->xrm_offset+1), &value);
+
+		    } else if (xrm_default_type == QImmediate) {
+			/* XtRImmediate == XtRString for type XtRString */
+			if (xrm_type == QString) {
+			    value.addr = rx->xrm_default_addr;
+			} else if (rx->xrm_size == sizeof(int)) {
+			    int_val = (int)(long)rx->xrm_default_addr;
+			    value.addr = (XPointer) &int_val;
+			} else if (rx->xrm_size == sizeof(short)) {
+			    short_val = (short)(long)rx->xrm_default_addr;
+			    value.addr = (XPointer) &short_val;
+			} else if (rx->xrm_size == sizeof(char)) {
+			    char_val = (char)(long)rx->xrm_default_addr;
+			    value.addr = (XPointer) &char_val;
+			} else if (rx->xrm_size == sizeof(long)) {
+			    long_val = (long)rx->xrm_default_addr;
+			    value.addr = (XPointer) &long_val;
+			} else if (rx->xrm_size == sizeof(char*)) {
+			    char_ptr = (char*)rx->xrm_default_addr;
+			    value.addr = (XPointer) &char_ptr;
+			} else {
+			    value.addr = (XPointer) &(rx->xrm_default_addr);
+			}
+		    } else if (xrm_default_type == xrm_type) {
+			value.addr = rx->xrm_default_addr;
+		    } else {
+			value.addr = rx->xrm_default_addr;
+			if (xrm_default_type == QString) {
+			    value.size = strlen((char *)value.addr) + 1;
+			} else {
+			    value.size = sizeof(XtPointer);
+			}
+			convValue.size = rx->xrm_size;
+			convValue.addr = (XPointer)(base - rx->xrm_offset - 1);
+			already_copied =
+			    _XtConvert(widget, xrm_default_type, &value,
+				       xrm_type, &convValue, cache_ptr);
+			if (!already_copied)
+			    value.addr = NULL;
+			if (cache_ptr && *cache_ptr)
+			    cache_ptr++;
+		    }
+		}
+		if (!already_copied) {
+		    if (xrm_type == QString) {
+			*((String*)(base - rx->xrm_offset - 1)) = value.addr;
+		    } else {
+			if (value.addr != NULL) {
+			    XtMemmove(base - rx->xrm_offset - 1,
+				      value.addr, rx->xrm_size);
+			} else {
+			    /* didn't get value, initialize to NULL... */
+			    XtBZero(base - rx->xrm_offset - 1, rx->xrm_size);
+			}
+		    }
+		}
+		UNLOCK_PROCESS;
+
+		if (typed[j]) {
+		    /*
+		     * This resource value was specified as a typed arg.
+		     * However, the default value is being used here since
+		     * type type conversion failed, so we compress the list.
+		     */
+		    register XtTypedArg* arg = typed_args + typed[j] - 1;
+		    register int i;
+
+		    for (i = num_typed_args - typed[j]; i; i--, arg++) {
+			*arg = *(arg+1);
+		    }
+		    num_typed_args--;
+		}
+	    } 
+	}
+	if (tm_hack)
+	    widget->core.tm.current_state = NULL;
+	if (tm_hack &&
+	    (!widget->core.tm.translations ||
+	     (do_tm_hack &&
+	      widget->core.tm.translations->operation != XtTableReplace)) &&
+	    XrmQGetSearchResource(searchList, QbaseTranslations,
+				  QTranslations, &rawType, &value)) {
+	    if (rawType != QTranslationTable) {
+		convValue.size = sizeof(XtTranslations);
+		convValue.addr = (XPointer)&widget->core.tm.current_state;
+		(void)_XtConvert(widget, rawType, &value,
+				 QTranslationTable, &convValue, cache_ptr);
+		if (cache_ptr && *cache_ptr)
+		    cache_ptr++;
+	    } else {
+		*((XtTranslations *)&widget->core.tm.current_state) =
+		    *((XtTranslations *)value.addr);
+	    }
+	}
+    }
+    if ((Cardinal)num_typed_args != *pNumTypedArgs) *pNumTypedArgs = num_typed_args;
+    if (searchList != stackSearchList) XtFree((char*)searchList);
+    if (!cache_ptr)
+	cache_ptr = cache_base;
+    if (cache_ptr && cache_ptr != cache_ref) {
+	int cache_ref_size = cache_ptr - cache_ref;
+	XtCacheRef *refs = (XtCacheRef*)
+	    __XtMalloc((unsigned)sizeof(XtCacheRef)*(cache_ref_size + 1));
+	(void) memmove(refs, cache_ref, sizeof(XtCacheRef)*cache_ref_size );
+	refs[cache_ref_size] = NULL;
+	return refs;
+    }
+    return (XtCacheRef*)NULL;
+}
+
+
+
+static void CacheArgs(
+    ArgList	    args,
+    Cardinal	    num_args,
+    XtTypedArgList  typed_args,
+    Cardinal	    num_typed_args,
+    XrmQuarkList    quark_cache,
+    Cardinal	    num_quarks,
+    XrmQuarkList    *pQuarks)       /* RETURN */
+{
+    register XrmQuarkList   quarks;
+    register Cardinal       i;
+    register Cardinal       count;
+
+    count = (args != NULL) ? num_args : num_typed_args;
+
+    if (num_quarks < count) {
+	quarks = (XrmQuarkList) __XtMalloc(count * sizeof(XrmQuark));
+    } else {
+	quarks = quark_cache;
+    }
+    *pQuarks = quarks;
+
+    if (args != NULL) {
+	for (i = count; i; i--)
+	    *quarks++ = StringToQuark((args++)->name);
+    }
+    else {
+	for (i = count; i; i--)
+	    *quarks++ = StringToQuark((typed_args++)->name);
+    }
+}
+
+#define FreeCache(cache, pointer) \
+	  if (cache != pointer) XtFree((char *)pointer)
+
+
+XtCacheRef *_XtGetResources(
+    register 	Widget	  	w,
+    		ArgList	  	args,
+    		Cardinal  	num_args,
+		XtTypedArgList	typed_args,
+		Cardinal*	num_typed_args)
+{
+    XrmName	    *names, names_s[50];
+    XrmClass	    *classes, classes_s[50];
+    XrmQuark	    quark_cache[100];
+    XrmQuarkList    quark_args;
+    WidgetClass     wc;
+    ConstraintWidgetClass   cwc;
+    XtCacheRef	    *cache_refs, *cache_refs_core;
+    Cardinal	    count;
+
+    wc = XtClass(w);
+
+    count = CountTreeDepth(w);
+    names = (XrmName*) XtStackAlloc (count * sizeof(XrmName), names_s);
+    classes = (XrmClass*) XtStackAlloc (count * sizeof(XrmClass), classes_s);
+    if (names == NULL || classes == NULL) _XtAllocError(NULL);
+
+    /* Get names, classes for widget and ancestors */
+    GetNamesAndClasses(w, names, classes);
+   
+    /* Compile arg list into quarks */
+    CacheArgs(args, num_args, typed_args, *num_typed_args, quark_cache,
+	      XtNumber(quark_cache), &quark_args);
+
+    /* Get normal resources */
+    LOCK_PROCESS;
+    cache_refs = GetResources(w, (char*)w, names, classes,
+	(XrmResourceList *) wc->core_class.resources,
+	wc->core_class.num_resources, quark_args, args, num_args,
+	typed_args, num_typed_args, XtIsWidget(w));
+
+    if (w->core.constraints != NULL) {
+	cwc = (ConstraintWidgetClass) XtClass(w->core.parent);
+	cache_refs_core =
+	    GetResources(w, (char*)w->core.constraints, names, classes,
+	    (XrmResourceList *) cwc->constraint_class.resources,
+	    cwc->constraint_class.num_resources,
+	    quark_args, args, num_args, typed_args, num_typed_args, False);
+	if (cache_refs_core) {
+	    XtFree((char *)cache_refs_core);
+	}
+    }
+    FreeCache(quark_cache, quark_args);
+    UNLOCK_PROCESS;
+    XtStackFree((XtPointer)names, names_s);
+    XtStackFree((XtPointer)classes, classes_s);
+    return cache_refs;
+} /* _XtGetResources */
+
+
+void _XtGetSubresources (
+    Widget	  w,			/* Widget "parent" of subobject   */
+    XtPointer	  base,			/* Base address to write to       */
+    const char*   name,			/* name of subobject		    */
+    const char*   class,		/* class of subobject		    */
+    XtResourceList resources,		/* resource list for subobject    */
+    Cardinal	  num_resources,	                                    
+    ArgList	  args,			/* arg list to override resources */
+    Cardinal	  num_args,
+    XtTypedArgList typed_args,
+    Cardinal      num_typed_args)
+{
+    XrmName	  *names, names_s[50];
+    XrmClass	  *classes, classes_s[50];
+    XrmQuark	  quark_cache[100];
+    XrmQuarkList  quark_args;
+    XrmResourceList* table;
+    Cardinal	  count, ntyped_args = num_typed_args;
+    XtCacheRef    *Resrc = NULL;
+    WIDGET_TO_APPCON(w);
+
+    if (num_resources == 0) return;
+
+    LOCK_APP(app);
+    count = CountTreeDepth(w);
+    count++;	/* make sure there's enough room for name and class */
+    names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s);
+    classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s);
+    if (names == NULL || classes == NULL) _XtAllocError(NULL);
+
+    /* Get full name, class of subobject */
+    GetNamesAndClasses(w, names, classes);
+    count -= 2;
+    names[count] = StringToName(name);
+    classes[count] = StringToClass(class);
+    count++;
+    names[count] = NULLQUARK;
+    classes[count] = NULLQUARK;
+
+    /* Compile arg list into quarks */
+    CacheArgs(args, num_args, typed_args, num_typed_args,
+	      quark_cache, XtNumber(quark_cache), &quark_args);
+
+    /* Compile resource list if needed */
+    if (((int) resources->resource_offset) >= 0) {
+	XrmCompileResourceListEphem(resources, num_resources);
+    }
+    table = _XtCreateIndirectionTable(resources, num_resources); 
+    Resrc = GetResources(w, (char*)base, names, classes, table, num_resources,
+			quark_args, args, num_args,
+			typed_args, &ntyped_args, False);
+    FreeCache(quark_cache, quark_args);
+    XtFree((char *)table);
+    XtFree((char *)Resrc);
+    XtStackFree((XtPointer)names, names_s);
+    XtStackFree((XtPointer)classes, classes_s);
+    UNLOCK_APP(app);
+}
+
+void XtGetSubresources (
+    Widget	  w,			/* Widget "parent" of subobject   */
+    XtPointer	  base,			/* Base address to write to       */
+    _Xconst char* name,			/* name of subobject		    */
+    _Xconst char* class,		/* class of subobject		    */
+    XtResourceList resources,		/* resource list for subobject    */
+    Cardinal	  num_resources,	                                    
+    ArgList	  args,			/* arg list to override resources */
+    Cardinal	  num_args)
+{
+    _XtGetSubresources (w, base, name, class, resources, num_resources, args, num_args, NULL, 0);
+}
+
+
+void _XtGetApplicationResources (
+    Widget	    w,		  /* Application shell widget       */
+    XtPointer	    base,	  /* Base address to write to       */
+    XtResourceList  resources,	  /* resource list for subobject    */
+    Cardinal	    num_resources,
+    ArgList	    args,	  /* arg list to override resources */
+    Cardinal	    num_args,
+    XtTypedArgList  typed_args,
+    Cardinal	    num_typed_args)
+{
+    XrmName	    *names, names_s[50];
+    XrmClass	    *classes, classes_s[50];
+    XrmQuark	    quark_cache[100];
+    XrmQuarkList    quark_args;
+    XrmResourceList* table;
+    Cardinal        count, ntyped_args = num_typed_args;
+#ifdef XTHREADS
+    XtAppContext    app;
+#endif
+    XtCacheRef	    *Resrc = NULL;
+
+    if (num_resources == 0) return;
+
+#ifdef XTHREADS
+    if (w == NULL) app = _XtDefaultAppContext();
+    else app = XtWidgetToApplicationContext(w);
+#endif
+
+    LOCK_APP(app);
+    /* Get full name, class of application */
+    if (w == NULL) {
+	/* hack for R2 compatibility */
+	XtPerDisplay pd = _XtGetPerDisplay(_XtDefaultAppContext()->list[0]);
+	names = (XrmName*) XtStackAlloc (2 * sizeof(XrmName), names_s);
+	classes = (XrmClass*) XtStackAlloc (2 * sizeof(XrmClass), classes_s);
+	names[0] = pd->name;
+	names[1] = NULLQUARK;
+	classes[0] = pd->class;
+	classes[1] = NULLQUARK;
+    }
+    else {
+	count = CountTreeDepth(w);
+        names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s);
+        classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s);
+	if (names == NULL || classes == NULL) _XtAllocError(NULL);
+	GetNamesAndClasses(w, names, classes);
+    }
+
+    /* Compile arg list into quarks */
+    CacheArgs(args, num_args, typed_args, num_typed_args,  quark_cache, 
+	XtNumber(quark_cache), &quark_args);
+    /* Compile resource list if needed */
+    if (((int) resources->resource_offset) >= 0) {
+#ifdef	CRAY2
+ 	if (base == 0) {	/* this client is non-portable, but... */
+ 	    int count;
+	    XtResourceList  res = resources;
+	    for (count = 0; count < num_resources; res++, count++) {
+ 		res->resource_offset *= sizeof(long);
+ 	    }
+ 	}
+#endif	/* CRAY2 */
+	XrmCompileResourceListEphem(resources, num_resources);
+    }
+    table = _XtCreateIndirectionTable(resources,num_resources);
+
+    Resrc = GetResources(w, (char*)base, names, classes, table, num_resources,
+			quark_args, args, num_args,
+			typed_args, &ntyped_args, False);
+    FreeCache(quark_cache, quark_args);
+    XtFree((char *)table);
+    XtFree((char *)Resrc);
+    if (w != NULL) {
+	XtStackFree((XtPointer)names, names_s);
+	XtStackFree((XtPointer)classes, classes_s);
+    }
+    UNLOCK_APP(app);
+}
+
+void XtGetApplicationResources (
+    Widget	    w,		  /* Application shell widget       */
+    XtPointer	    base,	  /* Base address to write to       */
+    XtResourceList  resources,	  /* resource list for subobject    */
+    Cardinal	    num_resources,
+    ArgList	    args,	  /* arg list to override resources */
+    Cardinal	    num_args)
+{
+    _XtGetApplicationResources(w, base, resources, num_resources, args, num_args, NULL, 0);
+}
+
+static Boolean initialized = FALSE;
+
+void _XtResourceListInitialize(void)
+{
+    LOCK_PROCESS;
+    if (initialized) {
+	XtWarningMsg("initializationError","xtInitialize",XtCXtToolkitError,
+                  "Initializing Resource Lists twice",
+		  (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_PROCESS;
+    	return;
+    }
+    initialized = TRUE;
+    UNLOCK_PROCESS;
+
+    QBoolean = XrmPermStringToQuark(XtCBoolean);
+    QString = XrmPermStringToQuark(XtCString);
+    QCallProc = XrmPermStringToQuark(XtRCallProc);
+    QImmediate = XrmPermStringToQuark(XtRImmediate);
+    QinitialResourcesPersistent = XrmPermStringToQuark(XtNinitialResourcesPersistent);
+    QInitialResourcesPersistent = XrmPermStringToQuark(XtCInitialResourcesPersistent);
+    Qtranslations = XrmPermStringToQuark(XtNtranslations);
+    QbaseTranslations = XrmPermStringToQuark("baseTranslations");
+    QTranslations = XrmPermStringToQuark(XtCTranslations);
+    QTranslationTable = XrmPermStringToQuark(XtRTranslationTable);
+    Qscreen = XrmPermStringToQuark(XtNscreen);
+    QScreen = XrmPermStringToQuark(XtCScreen);
+}
diff --git a/libXt/src/Selection.c b/libXt/src/Selection.c
new file mode 100644
index 000000000..aea4914a6
--- /dev/null
+++ b/libXt/src/Selection.c
@@ -0,0 +1,2295 @@
+/* $Xorg: Selection.c,v 1.4 2001/02/09 02:03:56 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Selection.c,v 3.9 2001/12/14 19:56:29 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "SelectionI.h"
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+void _XtSetDefaultSelectionTimeout(
+	unsigned long *timeout)
+{
+	*timeout = 5000; /* default to 5 seconds */
+}
+
+void XtSetSelectionTimeout(
+	unsigned long timeout)
+{
+	XtAppSetSelectionTimeout(_XtDefaultAppContext(), timeout);
+}
+
+void XtAppSetSelectionTimeout(
+	XtAppContext app,
+	unsigned long timeout)
+{
+	LOCK_APP(app);
+	app->selectionTimeout = timeout;
+	UNLOCK_APP(app);
+}
+
+unsigned long XtGetSelectionTimeout(void)
+{
+	return XtAppGetSelectionTimeout(_XtDefaultAppContext());
+}
+
+unsigned long XtAppGetSelectionTimeout(
+	XtAppContext app)
+{
+	unsigned long retval;
+
+	LOCK_APP(app);
+	retval = app->selectionTimeout;
+	UNLOCK_APP(app);
+	return retval;
+}
+
+
+/* General utilities */
+
+static void HandleSelectionReplies(Widget, XtPointer, XEvent *, Boolean *);
+static void ReqTimedOut(XtPointer, XtIntervalId *);
+static void HandlePropertyGone(Widget, XtPointer, XEvent *, Boolean *);
+static void HandleGetIncrement(Widget, XtPointer, XEvent *, Boolean *);
+static void HandleIncremental(Display *, Widget, Atom, CallBackInfo, unsigned long);
+
+static XContext selectPropertyContext = 0;
+static XContext paramPropertyContext = 0;
+static XContext multipleContext = 0;
+
+/* Multiple utilities */
+static void AddSelectionRequests(Widget, Atom, int, Atom *, XtSelectionCallbackProc *, int, XtPointer *, Boolean *, Atom *);
+static Boolean IsGatheringRequest(Widget, Atom);
+
+#define PREALLOCED 32
+
+/* Parameter utilities */
+static void AddParamInfo(Widget, Atom, Atom);
+static void RemoveParamInfo(Widget, Atom);
+static Atom GetParamInfo(Widget, Atom);
+
+static int StorageSize[3] = {1, sizeof(short), sizeof(long)};
+#define BYTELENGTH(length, format) ((length) * StorageSize[(format)>>4])
+#define NUMELEM(bytelength, format) ((bytelength) / StorageSize[(format)>>4])
+
+/* Xlib and Xt are permitted to have different memory allocators, and in the
+ * XtSelectionCallbackProc the client is instructed to free the selection
+ * value with XtFree, so the selection value received from XGetWindowProperty
+ * should be copied to memory allocated through Xt.  But copying is
+ * undesirable since the selection value may be large, and, under normal
+ * library configuration copying is unnecessary.
+ */
+#ifdef XTTRACEMEMORY
+#define XT_COPY_SELECTION	1
+#endif
+
+/*ARGSUSED*/
+static void FreePropList(
+ Widget w,			/* unused */
+ XtPointer closure,
+ XtPointer callData)		/* unused */
+{
+    PropList sarray = (PropList)closure;
+    LOCK_PROCESS;
+    XDeleteContext(sarray->dpy, DefaultRootWindow(sarray->dpy),
+		   selectPropertyContext);
+    UNLOCK_PROCESS;
+    XtFree((char*)sarray->list);
+    XtFree((char*)closure);
+}
+
+
+static PropList GetPropList(
+    Display *dpy)
+{
+    PropList sarray;
+    Atom atoms[4];
+    static char* names[] = {
+	"INCR",
+	"MULTIPLE",
+	"TIMESTAMP",
+	"_XT_SELECTION_0" };
+
+    LOCK_PROCESS;
+    if (selectPropertyContext == 0)
+	selectPropertyContext = XUniqueContext();
+    if (XFindContext(dpy, DefaultRootWindow(dpy), selectPropertyContext,
+		     (XPointer *)&sarray)) {
+	XtPerDisplay pd = _XtGetPerDisplay(dpy);
+	sarray = (PropList) __XtMalloc((unsigned) sizeof(PropListRec));
+	sarray->dpy = dpy;
+	XInternAtoms(dpy, names, 4, FALSE, atoms);
+	sarray->incr_atom = atoms[0];
+	sarray->indirect_atom = atoms[1];
+	sarray->timestamp_atom = atoms[2];
+	sarray->propCount = 1;
+	sarray->list =
+	    (SelectionProp)__XtMalloc((unsigned) sizeof(SelectionPropRec));
+	sarray->list[0].prop = atoms[3];
+	sarray->list[0].avail = TRUE;
+	(void) XSaveContext(dpy, DefaultRootWindow(dpy), selectPropertyContext,
+			    (char *) sarray);
+	_XtAddCallback( &pd->destroy_callbacks,
+			FreePropList, (XtPointer)sarray );
+    }
+    UNLOCK_PROCESS;
+    return sarray;
+}
+
+
+static Atom GetSelectionProperty(
+    Display *dpy)
+{
+ SelectionProp p;
+ int propCount;
+ char propname[80];
+ PropList sarray = GetPropList(dpy);
+
+ for (p = sarray->list, propCount=sarray->propCount;
+	propCount;
+	p++, propCount--) {
+   if (p->avail) {
+      p->avail = FALSE;
+      return(p->prop);
+   }
+ }
+ propCount = sarray->propCount++;
+ sarray->list = (SelectionProp) XtRealloc((XtPointer)sarray->list,
+  		(unsigned)(sarray->propCount*sizeof(SelectionPropRec)));
+ (void) sprintf(propname, "%s%d", "_XT_SELECTION_", propCount);
+ sarray->list[propCount].prop = XInternAtom(dpy, propname, FALSE);
+ sarray->list[propCount].avail = FALSE;
+ return(sarray->list[propCount].prop);
+}
+
+static void FreeSelectionProperty(
+    Display *dpy,
+    Atom prop)
+{
+ SelectionProp p;
+ PropList sarray;
+ if (prop == None) return;
+ LOCK_PROCESS;
+ if (XFindContext(dpy, DefaultRootWindow(dpy), selectPropertyContext,
+		  (XPointer *)&sarray))
+    XtAppErrorMsg(XtDisplayToApplicationContext(dpy),
+	    "noSelectionProperties", "freeSelectionProperty", XtCXtToolkitError,
+		"internal error: no selection property context for display",
+		 (String *)NULL,  (Cardinal *)NULL );
+ UNLOCK_PROCESS;
+ for (p = sarray->list; p; p++)
+   if (p->prop == prop) {
+      p->avail = TRUE;
+      return;
+      }
+}
+
+static void FreeInfo(
+    CallBackInfo info)
+{
+    XtFree((char*)info->incremental);
+    XtFree((char*)info->callbacks);
+    XtFree((char*)info->req_closure);
+    XtFree((char*)info->target);
+    XtFree((char*)info);
+}
+
+static CallBackInfo MakeInfo(
+    Select ctx,
+    XtSelectionCallbackProc *callbacks,
+    XtPointer *closures,
+    int count,
+    Widget widget,
+    Time time,
+    Boolean *incremental,
+    Atom *properties)
+{
+    	CallBackInfo info = XtNew(CallBackInfoRec);
+
+	info->ctx = ctx;
+	info->callbacks = (XtSelectionCallbackProc *)
+	    __XtMalloc((unsigned) (count * sizeof(XtSelectionCallbackProc)));
+	(void) memmove((char*)info->callbacks, (char*)callbacks,
+		       count * sizeof(XtSelectionCallbackProc));
+	info->req_closure =
+	    (XtPointer*)__XtMalloc((unsigned) (count * sizeof(XtPointer)));
+	(void) memmove((char*)info->req_closure, (char*)closures,
+		       count * sizeof(XtPointer));
+	if (count == 1 && properties != NULL && properties[0] != None)
+	    info->property = properties[0];
+	else {
+	    info->property = GetSelectionProperty(XtDisplay(widget));
+	    XDeleteProperty(XtDisplay(widget), XtWindow(widget),
+			    info->property);
+	}
+	info->proc = HandleSelectionReplies;
+	info->widget = widget;
+	info->time = time;
+	info->incremental = (Boolean*) __XtMalloc(count * sizeof(Boolean));
+	(void) memmove((char*)info->incremental, (char*) incremental,
+		       count * sizeof(Boolean));
+	info->current = 0;
+	info->value = NULL;
+	return (info);
+}
+
+static void RequestSelectionValue(
+    CallBackInfo info,
+    Atom selection,
+    Atom target)
+{
+#ifndef DEBUG_WO_TIMERS
+    XtAppContext app = XtWidgetToApplicationContext(info->widget);
+	info->timeout = XtAppAddTimeOut(app,
+			 app->selectionTimeout, ReqTimedOut, (XtPointer)info);
+#endif
+	XtAddEventHandler(info->widget, (EventMask)0, TRUE,
+			  HandleSelectionReplies, (XtPointer)info);
+	XConvertSelection(info->ctx->dpy, selection, target,
+			  info->property, XtWindow(info->widget), info->time);
+}
+
+
+static XContext selectContext = 0;
+
+static Select NewContext(
+    Display *dpy,
+    Atom selection)
+{
+    /* assert(selectContext != 0) */
+    Select ctx = XtNew(SelectRec);
+    ctx->dpy = dpy;
+    ctx->selection = selection;
+    ctx->widget = NULL;
+    ctx->prop_list = GetPropList(dpy);
+    ctx->ref_count = 0;
+    ctx->free_when_done = FALSE;
+    ctx->was_disowned = FALSE;
+    LOCK_PROCESS;
+    (void)XSaveContext(dpy, (Window)selection, selectContext, (char *)ctx);
+    UNLOCK_PROCESS;
+    return ctx;
+}
+
+static Select FindCtx(
+    Display *dpy,
+    Atom selection)
+{
+    Select ctx;
+
+    LOCK_PROCESS;
+    if (selectContext == 0)
+	selectContext = XUniqueContext();
+    if (XFindContext(dpy, (Window)selection, selectContext, (XPointer *)&ctx))
+	ctx = NewContext(dpy, selection);
+    UNLOCK_PROCESS;
+    return ctx;
+}
+
+/*ARGSUSED*/
+static void WidgetDestroyed(
+    Widget widget,
+    XtPointer closure, XtPointer data)
+{
+    Select ctx = (Select) closure;
+    if (ctx->widget == widget) {
+	if (ctx->free_when_done)
+	    XtFree((char*)ctx);
+	else
+	    ctx->widget = NULL;
+    }
+}
+
+/* Selection Owner code */
+
+static void HandleSelectionEvents(Widget, XtPointer, XEvent *, Boolean *);
+
+static Boolean LoseSelection(
+    Select ctx,
+    Widget widget,
+    Atom selection,
+    Time time)
+{
+    if ((ctx->widget == widget) &&
+	(ctx->selection == selection) && /* paranoia */
+	!ctx->was_disowned &&
+	((time == CurrentTime) || (time >= ctx->time)))
+    {
+	XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+			     HandleSelectionEvents, (XtPointer)ctx);
+	XtRemoveCallback(widget, XtNdestroyCallback,
+			 WidgetDestroyed, (XtPointer)ctx);
+	ctx->was_disowned = TRUE; /* widget officially loses ownership */
+	/* now inform widget */
+	if (ctx->loses) {
+	    if (ctx->incremental)
+	       (*(XtLoseSelectionIncrProc)ctx->loses)
+		   (widget, &ctx->selection, ctx->owner_closure);
+	    else  (*ctx->loses)(widget, &ctx->selection);
+	}
+	return(TRUE);
+    }
+    else return(FALSE);
+}
+
+static XContext selectWindowContext = 0;
+
+/* %%% Xlib.h should make this public! */
+typedef int (*xErrorHandler)(Display*, XErrorEvent*);
+
+static xErrorHandler oldErrorHandler = NULL;
+static unsigned long firstProtectRequest;
+static Window errorWindow;
+
+static int LocalErrorHandler (
+    Display *dpy,
+    XErrorEvent *error)
+{
+    int retval;
+
+    /* If BadWindow error on selection requestor, nothing to do but let
+     * the transfer timeout.  Otherwise, invoke saved error handler. */
+
+    LOCK_PROCESS;
+
+    if (error->error_code == BadWindow && error->resourceid == errorWindow &&
+	error->serial >= firstProtectRequest) {
+	UNLOCK_PROCESS;
+	return 0;
+    }
+
+    if (oldErrorHandler == NULL) {
+	UNLOCK_PROCESS;
+	return 0;  /* should never happen */
+    }
+
+    retval = (*oldErrorHandler)(dpy, error);
+    UNLOCK_PROCESS;
+    return retval;
+}
+
+static void StartProtectedSection(
+    Display *dpy,
+    Window window)
+{
+    /* protect ourselves against request window being destroyed
+     * before completion of transfer */
+
+    LOCK_PROCESS;
+    oldErrorHandler = XSetErrorHandler(LocalErrorHandler);
+    firstProtectRequest = NextRequest(dpy);
+    errorWindow = window;
+    UNLOCK_PROCESS;
+}
+
+static void EndProtectedSection(
+    Display *dpy)
+{
+    /* flush any generated errors on requestor and
+     * restore original error handler */
+
+    XSync(dpy, False);
+
+    LOCK_PROCESS;
+    XSetErrorHandler(oldErrorHandler);
+    oldErrorHandler = NULL;
+    UNLOCK_PROCESS;
+}
+
+static void AddHandler(
+    Request req,
+    EventMask mask,
+    XtEventHandler proc,
+    XtPointer closure)
+{
+    Display *dpy = req->ctx->dpy;
+    Window window = req->requestor;
+    Widget widget = XtWindowToWidget(dpy, window);
+
+    if (widget != NULL) req->widget = widget;
+    else widget = req->widget;
+
+    if (XtWindow(widget) == window)
+	XtAddEventHandler(widget, mask, False, proc, closure);
+    else {
+	RequestWindowRec *requestWindowRec;
+	LOCK_PROCESS;
+	if (selectWindowContext == 0)
+	    selectWindowContext = XUniqueContext();
+	if (XFindContext(dpy, window, selectWindowContext,
+			 (XPointer *)&requestWindowRec)) {
+	    requestWindowRec = XtNew(RequestWindowRec);
+	    requestWindowRec->active_transfer_count = 0;
+	    (void)XSaveContext(dpy, window, selectWindowContext,
+			       (char *)requestWindowRec);
+	}
+	UNLOCK_PROCESS;
+	if (requestWindowRec->active_transfer_count++ == 0) {
+	    XtRegisterDrawable(dpy, window, widget);
+	    XSelectInput(dpy, window, mask);
+	}
+	XtAddRawEventHandler(widget, mask, FALSE, proc, closure);
+    }
+}
+
+static void RemoveHandler(
+    Request req,
+    EventMask mask,
+    XtEventHandler proc,
+    XtPointer closure)
+{
+    Display *dpy = req->ctx->dpy;
+    Window window = req->requestor;
+    Widget widget = req->widget;
+
+    if ((XtWindowToWidget(dpy, window) == widget) &&
+        (XtWindow(widget) != window)) {
+	/* we had to hang this window onto our widget; take it off */
+	RequestWindowRec* requestWindowRec;
+	XtRemoveRawEventHandler(widget, mask, TRUE, proc, closure);
+	LOCK_PROCESS;
+	(void)XFindContext(dpy, window, selectWindowContext,
+			   (XPointer *)&requestWindowRec);
+	UNLOCK_PROCESS;
+	if (--requestWindowRec->active_transfer_count == 0) {
+	    XtUnregisterDrawable(dpy, window);
+	    StartProtectedSection(dpy, window);
+	    XSelectInput(dpy, window, 0L);
+	    EndProtectedSection(dpy);
+	    LOCK_PROCESS;
+	    (void)XDeleteContext(dpy, window, selectWindowContext);
+	    UNLOCK_PROCESS;
+	    XtFree((char*)requestWindowRec);
+	}
+    } else {
+        XtRemoveEventHandler(widget, mask, TRUE,  proc, closure);
+    }
+}
+
+/* ARGSUSED */
+static void OwnerTimedOut(
+    XtPointer closure,
+    XtIntervalId   *id)
+{
+    Request req = (Request)closure;
+    Select ctx = req->ctx;
+
+    if (ctx->incremental && (ctx->owner_cancel != NULL)) {
+	(*ctx->owner_cancel)(ctx->widget, &ctx->selection,
+			     &req->target, (XtRequestId*)&req,
+			     ctx->owner_closure);
+    } else {
+	if (ctx->notify == NULL)
+	    XtFree((char*)req->value);
+	else {
+	    /* the requestor hasn't deleted the property, but
+	     * the owner needs to free the value.
+	     */
+	    if (ctx->incremental)
+		(*(XtSelectionDoneIncrProc)ctx->notify)
+			      (ctx->widget, &ctx->selection, &req->target,
+			       (XtRequestId*)&req, ctx->owner_closure);
+	    else
+		(*ctx->notify)(ctx->widget, &ctx->selection, &req->target);
+	}
+    }
+
+    RemoveHandler(req, (EventMask)PropertyChangeMask,
+		  HandlePropertyGone, closure);
+    XtFree((char*)req);
+    if (--ctx->ref_count == 0 && ctx->free_when_done)
+	XtFree((char*)ctx);
+}
+
+static void SendIncrement(
+    Request incr)
+{
+    Display *dpy = incr->ctx->dpy;
+
+    unsigned long incrSize = MAX_SELECTION_INCR(dpy);
+    if (incrSize > incr->bytelength - incr->offset)
+        incrSize = incr->bytelength - incr->offset;
+    StartProtectedSection(dpy, incr->requestor);
+    XChangeProperty(dpy, incr->requestor, incr->property,
+    	    incr->type, incr->format, PropModeReplace,
+	    (unsigned char *)incr->value + incr->offset,
+	    NUMELEM((int)incrSize, incr->format));
+    EndProtectedSection(dpy);
+    incr->offset += incrSize;
+}
+
+static void AllSent(
+    Request req)
+{
+    Select ctx = req->ctx;
+    StartProtectedSection(ctx->dpy, req->requestor);
+    XChangeProperty(ctx->dpy, req->requestor,
+		    req->property, req->type,  req->format,
+		    PropModeReplace, (unsigned char *) NULL, 0);
+    EndProtectedSection(ctx->dpy);
+    req->allSent = TRUE;
+
+    if (ctx->notify == NULL) XtFree((char*)req->value);
+}
+
+/*ARGSUSED*/
+static void HandlePropertyGone(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    XPropertyEvent *event = (XPropertyEvent *) ev;
+    Request req = (Request)closure;
+    Select ctx = req->ctx;
+
+    if ((event->type != PropertyNotify) ||
+        (event->state != PropertyDelete) ||
+	(event->atom != req->property) ||
+	(event->window != req->requestor))
+      return;
+#ifndef DEBUG_WO_TIMERS
+    XtRemoveTimeOut(req->timeout);
+#endif
+    if (req->allSent) {
+	if (ctx->notify) {
+	    if (ctx->incremental) {
+		(*(XtSelectionDoneIncrProc)ctx->notify)
+			      (ctx->widget, &ctx->selection, &req->target,
+			       (XtRequestId*)&req, ctx->owner_closure);
+	    }
+	    else (*ctx->notify)(ctx->widget, &ctx->selection, &req->target);
+	}
+	RemoveHandler(req, (EventMask)PropertyChangeMask,
+		      HandlePropertyGone, closure);
+	XtFree((char*)req);
+	if (--ctx->ref_count == 0 && ctx->free_when_done)
+	    XtFree((char*)ctx);
+    } else  { /* is this part of an incremental transfer? */
+	if (ctx->incremental) {
+	     if (req->bytelength == 0)
+		AllSent(req);
+	     else {
+		unsigned long size = MAX_SELECTION_INCR(ctx->dpy);
+    		SendIncrement(req);
+		(*(XtConvertSelectionIncrProc)ctx->convert)
+			   (ctx->widget, &ctx->selection, &req->target,
+			    &req->type, &req->value,
+			    &req->bytelength, &req->format,
+			    &size, ctx->owner_closure, (XtPointer*)&req);
+		if (req->bytelength)
+		    req->bytelength = BYTELENGTH(req->bytelength, req->format);
+		req->offset = 0;
+	    }
+	} else {
+	    if (req->offset < req->bytelength)
+		SendIncrement(req);
+	    else AllSent(req);
+	}
+#ifndef DEBUG_WO_TIMERS
+	{
+	  XtAppContext app = XtWidgetToApplicationContext(req->widget);
+	  req->timeout = XtAppAddTimeOut(app,
+			 app->selectionTimeout, OwnerTimedOut, (XtPointer)req);
+	}
+#endif
+    }
+}
+
+static void PrepareIncremental(
+    Request req,
+    Widget widget,
+    Window window,
+    Atom property,
+    Atom target,
+    Atom targetType,
+    XtPointer value,
+    unsigned long length,
+    int format)
+{
+	req->type = targetType;
+	req->value = value;
+	req->bytelength = BYTELENGTH(length,format);
+	req->format = format;
+	req->offset = 0;
+	req->target = target;
+	req->widget = widget;
+	req->allSent = FALSE;
+#ifndef DEBUG_WO_TIMERS
+	{
+	XtAppContext app = XtWidgetToApplicationContext(widget);
+	req->timeout = XtAppAddTimeOut(app,
+			 app->selectionTimeout, OwnerTimedOut, (XtPointer)req);
+	}
+#endif
+	AddHandler(req, (EventMask)PropertyChangeMask,
+		   HandlePropertyGone, (XtPointer)req);
+/* now send client INCR property */
+	XChangeProperty(req->ctx->dpy, window, req->property,
+			req->ctx->prop_list->incr_atom,
+			32, PropModeReplace,
+			(unsigned char *)&req->bytelength, 1);
+}
+
+static Boolean GetConversion(
+    Select ctx,			/* logical owner */
+    XSelectionRequestEvent* event,
+    Atom target,
+    Atom property,		/* requestor's property */
+    Widget widget)		/* physical owner (receives events) */
+{
+    XtPointer value = NULL;
+    unsigned long length;
+    int format;
+    Atom targetType;
+    Request req = XtNew(RequestRec);
+    Boolean timestamp_target = (target == ctx->prop_list->timestamp_atom);
+
+    req->ctx = ctx;
+    req->event = *event;
+    req->property = property;
+    req->requestor = event->requestor;
+
+    if (timestamp_target) {
+	value = __XtMalloc(sizeof(long));
+	*(long*)value = ctx->time;
+	targetType = XA_INTEGER;
+	length = 1;
+	format = 32;
+    }
+    else {
+	ctx->ref_count++;
+	if (ctx->incremental == TRUE) {
+	     unsigned long size = MAX_SELECTION_INCR(ctx->dpy);
+	     if ((*(XtConvertSelectionIncrProc)ctx->convert)
+			       (ctx->widget, &event->selection, &target,
+				&targetType, &value, &length, &format,
+				&size, ctx->owner_closure, (XtRequestId*)&req)
+		     == FALSE) {
+		 XtFree((char*)req);
+		 ctx->ref_count--;
+		 return(FALSE);
+	     }
+	     StartProtectedSection(ctx->dpy, event->requestor);
+	     PrepareIncremental(req, widget, event->requestor, property,
+				target, targetType, value, length, format);
+	     return(TRUE);
+	}
+	ctx->req = req;
+	if ((*ctx->convert)(ctx->widget, &event->selection, &target,
+			    &targetType, &value, &length, &format) == FALSE) {
+	    XtFree((char*)req);
+	    ctx->req = NULL;
+	    ctx->ref_count--;
+	    return(FALSE);
+	}
+	ctx->req = NULL;
+    }
+    StartProtectedSection(ctx->dpy, event->requestor);
+    if (BYTELENGTH(length,format) <= (unsigned long) MAX_SELECTION_INCR(ctx->dpy)) {
+	if (! timestamp_target) {
+	    if (ctx->notify != NULL) {
+		  req->target = target;
+		  req->widget = widget;
+		  req->allSent = TRUE;
+#ifndef DEBUG_WO_TIMERS
+		  {
+		  XtAppContext app = XtWidgetToApplicationContext(req->widget);
+		  req->timeout = XtAppAddTimeOut(app,
+			 app->selectionTimeout, OwnerTimedOut, (XtPointer)req);
+		  }
+#endif
+	          AddHandler(req, (EventMask)PropertyChangeMask,
+			     HandlePropertyGone, (XtPointer)req);
+	      }
+	      else ctx->ref_count--;
+        }
+	XChangeProperty(ctx->dpy, event->requestor, property,
+			targetType, format, PropModeReplace,
+			(unsigned char *)value, (int)length);
+	/* free storage for client if no notify proc */
+	if (timestamp_target || ctx->notify == NULL) {
+	    XtFree((char*)value);
+	    XtFree((char*)req);
+	}
+    } else {
+	 PrepareIncremental(req, widget, event->requestor, property,
+			    target, targetType, value, length, format);
+    }
+    return(TRUE);
+}
+
+/*ARGSUSED*/
+static void HandleSelectionEvents(
+    Widget widget,
+    XtPointer closure,
+    XEvent *event,
+    Boolean *cont)
+{
+    Select ctx;
+    XSelectionEvent ev;
+    Atom target;
+    int count;
+    Boolean writeback = FALSE;
+
+    ctx = (Select) closure;
+    switch (event->type) {
+      case SelectionClear:
+	/* if this event is not for the selection we registered for,
+	 * don't do anything */
+	if (ctx->selection != event->xselectionclear.selection ||
+	    ctx->serial > event->xselectionclear.serial)
+	    break;
+	(void) LoseSelection(ctx, widget, event->xselectionclear.selection,
+			event->xselectionclear.time);
+	break;
+      case SelectionRequest:
+	/* if this event is not for the selection we registered for,
+	 * don't do anything */
+	if (ctx->selection != event->xselectionrequest.selection)
+	    break;
+	ev.type = SelectionNotify;
+	ev.display = event->xselectionrequest.display;
+	ev.requestor = event->xselectionrequest.requestor;
+	ev.selection = event->xselectionrequest.selection;
+	ev.time = event->xselectionrequest.time;
+	ev.target = event->xselectionrequest.target;
+	if (event->xselectionrequest.property == None) /* obsolete requestor */
+	   event->xselectionrequest.property = event->xselectionrequest.target;
+	if (ctx->widget != widget || ctx->was_disowned
+	   || ((event->xselectionrequest.time != CurrentTime)
+	        && (event->xselectionrequest.time < ctx->time)))
+	    ev.property = None;
+         else {
+	   if (ev.target == ctx->prop_list->indirect_atom) {
+	      IndirectPair *p;
+	      int format;
+	      unsigned long bytesafter, length;
+	      unsigned char *value;
+	      ev.property = event->xselectionrequest.property;
+	      StartProtectedSection(ev.display, ev.requestor);
+	      (void) XGetWindowProperty(ev.display, ev.requestor,
+			event->xselectionrequest.property, 0L, 1000000,
+			False,(Atom)AnyPropertyType, &target, &format, &length,
+			&bytesafter, &value);
+	      count = BYTELENGTH(length, format) / sizeof(IndirectPair);
+	      for (p = (IndirectPair *)value; count; p++, count--) {
+		  EndProtectedSection(ctx->dpy);
+		  if (!GetConversion(ctx, (XSelectionRequestEvent*)event,
+				     p->target, p->property, widget)) {
+
+			p->target = None;
+			writeback = TRUE;
+			StartProtectedSection(ctx->dpy, ev.requestor);
+		  }
+	      }
+	      if (writeback)
+		XChangeProperty(ev.display, ev.requestor,
+			event->xselectionrequest.property, target,
+			format, PropModeReplace, value, (int)length);
+	      XFree((char *)value);
+	  } else /* not multiple */ {
+	       if (GetConversion(ctx, (XSelectionRequestEvent*)event,
+				 event->xselectionrequest.target,
+				 event->xselectionrequest.property,
+				 widget))
+		   ev.property = event->xselectionrequest.property;
+	       else {
+		   ev.property = None;
+		   StartProtectedSection(ctx->dpy, ev.requestor);
+	       }
+	   }
+      }
+      (void) XSendEvent(ctx->dpy, ev.requestor, False, (unsigned long)NULL,
+		   (XEvent *) &ev);
+
+      EndProtectedSection(ctx->dpy);
+
+      break;
+    }
+}
+
+static Boolean OwnSelection(
+    Widget widget,
+    Atom selection,
+    Time time,
+    XtConvertSelectionProc convert,
+    XtLoseSelectionProc lose,
+    XtSelectionDoneProc notify,
+    XtCancelConvertSelectionProc cancel,
+    XtPointer closure,
+    Boolean incremental)
+{
+    Select ctx;
+    Select oldctx = NULL;
+
+    if (!XtIsRealized(widget)) return False;
+
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (ctx->widget != widget || ctx->time != time ||
+	ctx->ref_count || ctx->was_disowned)
+    {
+	Boolean replacement = FALSE;
+	Window window = XtWindow(widget);
+	unsigned long serial = XNextRequest(ctx->dpy);
+        XSetSelectionOwner(ctx->dpy, selection, window, time);
+        if (XGetSelectionOwner(ctx->dpy, selection) != window)
+	    return FALSE;
+	if (ctx->ref_count) {	/* exchange is in-progress */
+#ifdef DEBUG_ACTIVE
+	    printf( "Active exchange for widget \"%s\"; selection=0x%lx, ref_count=%d\n",
+		    XtName(widget), (long)selection, ctx->ref_count );
+#endif
+	    if (ctx->widget != widget ||
+		ctx->convert != convert ||
+		ctx->loses != lose ||
+		ctx->notify != notify ||
+		ctx->owner_cancel != cancel ||
+		ctx->incremental != incremental ||
+		ctx->owner_closure != closure)
+	    {
+		if (ctx->widget == widget) {
+		    XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+					HandleSelectionEvents, (XtPointer)ctx);
+		    XtRemoveCallback(widget, XtNdestroyCallback,
+				     WidgetDestroyed, (XtPointer)ctx);
+		    replacement = TRUE;
+		}
+		else if (!ctx->was_disowned) {
+		    oldctx = ctx;
+		}
+		ctx->free_when_done = TRUE;
+		ctx = NewContext(XtDisplay(widget), selection);
+	    }
+	    else if (!ctx->was_disowned) { /* current owner is new owner */
+		ctx->time = time;
+		return TRUE;
+	    }
+	}
+    	if (ctx->widget != widget || ctx->was_disowned || replacement) {
+	    if (ctx->widget && !ctx->was_disowned && !replacement) {
+		oldctx = ctx;
+		oldctx->free_when_done = TRUE;
+		ctx = NewContext(XtDisplay(widget), selection);
+	    }
+	    XtAddEventHandler(widget, (EventMask)0, TRUE,
+			      HandleSelectionEvents, (XtPointer)ctx);
+	    XtAddCallback(widget, XtNdestroyCallback,
+			  WidgetDestroyed, (XtPointer)ctx);
+	}
+	ctx->widget = widget;	/* Selection offically changes hands. */
+	ctx->time = time;
+	ctx->serial = serial;
+    }
+    ctx->convert = convert;
+    ctx->loses = lose;
+    ctx->notify = notify;
+    ctx->owner_cancel = cancel;
+    ctx->incremental = incremental;
+    ctx->owner_closure = closure;
+    ctx->was_disowned = FALSE;
+
+    /* Defer calling the previous selection owner's lose selection procedure
+     * until the new selection is established, to allow the previous
+     * selection owner to ask for the new selection to be converted in
+     * the lose selection procedure.  The context pointer is the closure
+     * of the event handler and the destroy callback, so the old context
+     * pointer and the record contents must be preserved for LoseSelection.
+     */
+    if (oldctx) {
+	(void) LoseSelection(oldctx, oldctx->widget, selection, oldctx->time);
+	if (!oldctx->ref_count && oldctx->free_when_done)
+	    XtFree((char*)oldctx);
+    }
+    return TRUE;
+}
+
+
+Boolean XtOwnSelection(
+    Widget widget,
+    Atom selection,
+    Time time,
+    XtConvertSelectionProc convert,
+    XtLoseSelectionProc lose,
+    XtSelectionDoneProc notify)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = OwnSelection(widget, selection, time, convert, lose, notify,
+			(XtCancelConvertSelectionProc)NULL,
+			(XtPointer)NULL, FALSE);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+Boolean XtOwnSelectionIncremental(
+    Widget widget,
+    Atom selection,
+    Time time,
+    XtConvertSelectionIncrProc convert,
+    XtLoseSelectionIncrProc lose,
+    XtSelectionDoneIncrProc notify,
+    XtCancelConvertSelectionProc cancel,
+    XtPointer closure)
+{
+    Boolean retval;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    retval = OwnSelection(widget, selection, time,
+			(XtConvertSelectionProc)convert,
+			(XtLoseSelectionProc)lose,
+			(XtSelectionDoneProc)notify,
+			cancel, closure, TRUE);
+    UNLOCK_APP(app);
+    return retval;
+}
+
+
+void XtDisownSelection(
+    Widget widget,
+    Atom selection,
+    Time time)
+{
+    Select ctx;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (LoseSelection(ctx, widget, selection, time))
+	XSetSelectionOwner(XtDisplay(widget), selection, None, time);
+    UNLOCK_APP(app);
+}
+
+/* Selection Requestor code */
+
+static Boolean IsINCRtype(
+    CallBackInfo info,
+    Window window,
+    Atom prop)
+{
+    unsigned long bytesafter;
+    unsigned long length;
+    int format;
+    Atom type;
+    unsigned char *value;
+
+    if (prop == None) return False;
+
+    (void)XGetWindowProperty(XtDisplay(info->widget), window, prop, 0L, 0L,
+			     False, info->ctx->prop_list->incr_atom,
+			     &type, &format, &length, &bytesafter, &value);
+
+    return (type == info->ctx->prop_list->incr_atom);
+}
+
+/*ARGSUSED*/
+static void ReqCleanup(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    CallBackInfo info = (CallBackInfo)closure;
+    unsigned long bytesafter, length;
+    char *value;
+    int format;
+    Atom target;
+
+    if (ev->type == SelectionNotify) {
+	XSelectionEvent *event = (XSelectionEvent *) ev;
+	if (!MATCH_SELECT(event, info)) return; /* not really for us */
+         XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+			   ReqCleanup, (XtPointer) info );
+	if (IsINCRtype(info, XtWindow(widget), event->property)) {
+	    info->proc = HandleGetIncrement;
+	    XtAddEventHandler(info->widget, (EventMask) PropertyChangeMask,
+			      FALSE, ReqCleanup, (XtPointer) info);
+	} else {
+	   if (event->property != None)
+		XDeleteProperty(event->display, XtWindow(widget),
+				event->property);
+           FreeSelectionProperty(XtDisplay(widget), info->property);
+	   FreeInfo(info);
+	}
+    } else if ((ev->type == PropertyNotify) &&
+		(ev->xproperty.state == PropertyNewValue) &&
+	        (ev->xproperty.atom == info->property)) {
+	XPropertyEvent *event = (XPropertyEvent *) ev;
+        (void) XGetWindowProperty(event->display, XtWindow(widget),
+			   event->atom, 0L, 1000000, True, AnyPropertyType,
+			   &target, &format, &length, &bytesafter,
+			   (unsigned char **) &value);
+	XFree(value);
+	if (length == 0) {
+           XtRemoveEventHandler(widget, (EventMask) PropertyChangeMask, FALSE,
+			   ReqCleanup, (XtPointer) info );
+           FreeSelectionProperty(XtDisplay(widget), info->property);
+	   XtFree(info->value);	/* requestor never got this, so free now */
+	   FreeInfo(info);
+	}
+    }
+}
+
+/* ARGSUSED */
+static void ReqTimedOut(
+    XtPointer closure,
+    XtIntervalId   *id)
+{
+    XtPointer value = NULL;
+    unsigned long length = 0;
+    int format = 8;
+    Atom resulttype = XT_CONVERT_FAIL;
+    CallBackInfo info = (CallBackInfo)closure;
+    unsigned long bytesafter;
+    unsigned long proplength;
+    Atom type;
+    IndirectPair *pairs;
+    XtPointer *c;
+    int i;
+
+    if (*info->target == info->ctx->prop_list->indirect_atom) {
+        (void) XGetWindowProperty(XtDisplay(info->widget),
+			   XtWindow(info->widget), info->property, 0L,
+			   10000000, True, AnyPropertyType, &type, &format,
+			   &proplength, &bytesafter, (unsigned char **) &pairs);
+       XFree((char*)pairs);
+       for (proplength = proplength / IndirectPairWordSize, i = 0, c = info->req_closure;
+	           proplength; proplength--, c++, i++)
+	    (*info->callbacks[i])(info->widget, *c,
+   	          &info->ctx->selection, &resulttype, value, &length, &format);
+    } else {
+	(*info->callbacks[0])(info->widget, *info->req_closure,
+	    &info->ctx->selection, &resulttype, value, &length, &format);
+    }
+
+    /* change event handlers for straggler events */
+    if (info->proc == (XtEventHandler)HandleSelectionReplies) {
+        XtRemoveEventHandler(info->widget, (EventMask)0,
+			TRUE, info->proc, (XtPointer) info);
+	XtAddEventHandler(info->widget, (EventMask)0, TRUE,
+		ReqCleanup, (XtPointer) info);
+    } else {
+        XtRemoveEventHandler(info->widget,(EventMask) PropertyChangeMask,
+			FALSE, info->proc, (XtPointer) info);
+	XtAddEventHandler(info->widget, (EventMask) PropertyChangeMask,
+		FALSE, ReqCleanup, (XtPointer) info);
+    }
+
+}
+
+/*ARGSUSED*/
+static void HandleGetIncrement(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    XPropertyEvent *event = (XPropertyEvent *) ev;
+    CallBackInfo info = (CallBackInfo) closure;
+    Select ctx = info->ctx;
+    char *value;
+    unsigned long bytesafter;
+    unsigned long length;
+    int bad;
+    int n = info->current;
+
+    if ((event->state != PropertyNewValue) || (event->atom != info->property))
+	 return;
+
+    bad = XGetWindowProperty(event->display, XtWindow(widget),
+			     event->atom, 0L,
+			     10000000, True, AnyPropertyType, &info->type,
+			     &info->format, &length, &bytesafter,
+			     (unsigned char **) &value);
+    if (bad)
+      return;
+#ifndef DEBUG_WO_TIMERS
+    XtRemoveTimeOut(info->timeout);
+#endif
+    if (length == 0) {
+       unsigned long u_offset = NUMELEM(info->offset, info->format);
+       (*info->callbacks[n])(widget, *info->req_closure, &ctx->selection,
+			     &info->type,
+			     (info->offset == 0 ? value : info->value),
+			     &u_offset, &info->format);
+       /* assert ((info->offset != 0) == (info->incremental[n]) */
+       if (info->offset != 0) XFree(value);
+       XtRemoveEventHandler(widget, (EventMask) PropertyChangeMask, FALSE,
+		HandleGetIncrement, (XtPointer) info);
+       FreeSelectionProperty(event->display, info->property);
+       FreeInfo(info);
+    } else { /* add increment to collection */
+      if (info->incremental[n]) {
+#ifdef XT_COPY_SELECTION
+	  int size = BYTELENGTH(length, info->format) + 1;
+	  char *tmp = __XtMalloc((Cardinal) size);
+	  (void) memmove(tmp, value, size);
+	  XFree(value);
+	  value = tmp;
+#endif
+        (*info->callbacks[n])(widget, *info->req_closure, &ctx->selection,
+			      &info->type, value, &length, &info->format);
+      } else {
+	  int size = BYTELENGTH(length, info->format);
+	  if (info->offset + size > info->bytelength) {
+	      /* allocate enough for this and the next increment */
+	      info->bytelength = info->offset + size * 2;
+	      info->value = XtRealloc(info->value,
+				      (Cardinal) info->bytelength);
+	  }
+	  (void) memmove(&info->value[info->offset], value, size);
+	  info->offset += size;
+	  XFree(value);
+      }
+     /* reset timer */
+#ifndef DEBUG_WO_TIMERS
+     {
+     XtAppContext app = XtWidgetToApplicationContext(info->widget);
+     info->timeout = XtAppAddTimeOut(app,
+			 app->selectionTimeout, ReqTimedOut, (XtPointer) info);
+     }
+#endif
+   }
+}
+
+
+static void HandleNone(
+    Widget widget,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Atom selection)
+{
+    unsigned long length = 0;
+    int format = 8;
+    Atom type = None;
+
+    (*callback)(widget, closure, &selection,
+		&type, NULL, &length, &format);
+}
+
+
+static long IncrPropSize(
+     Widget widget,
+     unsigned char* value,
+     int format,
+     unsigned long length)
+{
+    unsigned long size;
+    if (format == 32) {
+	size = ((long*)value)[length-1]; /* %%% what order for longs? */
+	return size;
+    }
+    else {
+	XtAppWarningMsg( XtWidgetToApplicationContext(widget),
+			"badFormat","xtGetSelectionValue",XtCXtToolkitError,
+	"Selection owner returned type INCR property with format != 32",
+			(String*)NULL, (Cardinal*)NULL );
+	return 0;
+    }
+}
+
+
+static
+Boolean HandleNormal(
+    Display *dpy,
+    Widget widget,
+    Atom property,
+    CallBackInfo info,
+    XtPointer closure,
+    Atom selection)
+{
+    unsigned long bytesafter;
+    unsigned long length;
+    int format;
+    Atom type;
+    unsigned char *value;
+    int number = info->current;
+
+    (void) XGetWindowProperty(dpy, XtWindow(widget), property, 0L,
+			      10000000, False, AnyPropertyType,
+			      &type, &format, &length, &bytesafter, &value);
+
+    if (type == info->ctx->prop_list->incr_atom) {
+	unsigned long size = IncrPropSize(widget, value, format, length);
+	XFree((char *)value);
+	if (info->property != property) {
+	    /* within MULTIPLE */
+	    CallBackInfo ninfo;
+	    ninfo = MakeInfo(info->ctx, &info->callbacks[number],
+			     &info->req_closure[number], 1, widget,
+			     info->time, &info->incremental[number], &property);
+	    ninfo->target = (Atom *) __XtMalloc((unsigned) sizeof(Atom));
+	    *ninfo->target = info->target[number + 1];
+	    info = ninfo;
+	}
+	HandleIncremental(dpy, widget, property, info, size);
+	return FALSE;
+    }
+
+    XDeleteProperty(dpy, XtWindow(widget), property);
+#ifdef XT_COPY_SELECTION
+    if (value) {   /* it could have been deleted after the SelectionNotify */
+	int size = BYTELENGTH(length, info->format) + 1;
+	char *tmp = __XtMalloc((Cardinal) size);
+	(void) memmove(tmp, value, size);
+	XFree(value);
+	value = (unsigned char *) tmp;
+    }
+#endif
+    (*info->callbacks[number])(widget, closure, &selection,
+			       &type, (XtPointer)value, &length, &format);
+
+    if (info->incremental[number]) {
+	/* let requestor know the whole thing has been received */
+	value = (unsigned char*)__XtMalloc((unsigned)1);
+	length = 0;
+	(*info->callbacks[number])(widget, closure, &selection,
+				   &type, (XtPointer)value, &length, &format);
+    }
+    return TRUE;
+}
+
+static void HandleIncremental(
+    Display *dpy,
+    Widget widget,
+    Atom property,
+    CallBackInfo info,
+    unsigned long size)
+{
+    XtAddEventHandler(widget, (EventMask) PropertyChangeMask, FALSE,
+		      HandleGetIncrement, (XtPointer) info);
+
+    /* now start the transfer */
+    XDeleteProperty(dpy, XtWindow(widget), property);
+    XFlush(dpy);
+
+    info->bytelength = size;
+    if (info->incremental[info->current]) /* requestor wants incremental too */
+	info->value = NULL;	/* so no need for buffer to assemble value */
+    else
+	info->value = (char *) __XtMalloc((unsigned) info->bytelength);
+    info->offset = 0;
+
+    /* reset the timer */
+    info->proc = HandleGetIncrement;
+#ifndef DEBUG_WO_TIMERS
+    {
+    XtAppContext app = XtWidgetToApplicationContext(info->widget);
+    info->timeout = XtAppAddTimeOut(app,
+			 app->selectionTimeout, ReqTimedOut, (XtPointer) info);
+    }
+#endif
+}
+
+/*ARGSUSED*/
+static void HandleSelectionReplies(
+    Widget widget,
+    XtPointer closure,
+    XEvent *ev,
+    Boolean *cont)
+{
+    XSelectionEvent *event = (XSelectionEvent *) ev;
+    Display *dpy = event->display;
+    CallBackInfo info = (CallBackInfo) closure;
+    Select ctx = info->ctx;
+    IndirectPair *pairs, *p;
+    unsigned long bytesafter;
+    unsigned long length;
+    int format;
+    Atom type;
+    XtPointer *c;
+
+    if (event->type != SelectionNotify) return;
+    if (!MATCH_SELECT(event, info)) return; /* not really for us */
+#ifndef DEBUG_WO_TIMERS
+    XtRemoveTimeOut(info->timeout);
+#endif
+    XtRemoveEventHandler(widget, (EventMask)0, TRUE,
+		HandleSelectionReplies, (XtPointer) info );
+    if (event->target == ctx->prop_list->indirect_atom) {
+        (void) XGetWindowProperty(dpy, XtWindow(widget), info->property, 0L,
+			   10000000, True, AnyPropertyType, &type, &format,
+			   &length, &bytesafter, (unsigned char **) &pairs);
+       for (length = length / IndirectPairWordSize, p = pairs,
+	    c = info->req_closure;
+	    length; length--, p++, c++, info->current++) {
+	    if (event->property == None || format != 32 || p->target == None
+		|| /* bug compatibility */ p->property == None) {
+		HandleNone(widget, info->callbacks[info->current],
+			   *c, event->selection);
+		if (p->property != None)
+                    FreeSelectionProperty(XtDisplay(widget), p->property);
+	    } else {
+		if (HandleNormal(dpy, widget, p->property, info, *c,
+				 event->selection)) {
+		    FreeSelectionProperty(XtDisplay(widget), p->property);
+		}
+	    }
+       }
+       XFree((char*)pairs);
+       FreeSelectionProperty(dpy, info->property);
+       FreeInfo(info);
+    } else if (event->property == None) {
+	HandleNone(widget, info->callbacks[0], *info->req_closure, event->selection);
+        FreeSelectionProperty(XtDisplay(widget), info->property);
+	FreeInfo(info);
+    } else {
+	if (HandleNormal(dpy, widget, event->property, info,
+			 *info->req_closure, event->selection)) {
+	    FreeSelectionProperty(XtDisplay(widget), info->property);
+	    FreeInfo(info);
+	}
+    }
+}
+
+static void DoLocalTransfer(
+    Request req,
+    Atom selection,
+    Atom target,
+    Widget widget,		/* The widget requesting the value. */
+    XtSelectionCallbackProc callback,
+    XtPointer closure,	/* the closure for the callback, not the conversion */
+    Boolean incremental,
+    Atom property)
+{
+    Select ctx = req->ctx;
+    XtPointer value = NULL, temp, total = NULL;
+    unsigned long length;
+    int format;
+    Atom resulttype;
+    unsigned long totallength = 0;
+
+        req->event.type = 0;
+        req->event.target = target;
+        req->event.property = req->property = property;
+        req->event.requestor = req->requestor = XtWindow(widget);
+
+	if (ctx->incremental) {
+	   unsigned long size = MAX_SELECTION_INCR(ctx->dpy);
+	   if (!(*(XtConvertSelectionIncrProc)ctx->convert)
+			   (ctx->widget, &selection, &target,
+			    &resulttype, &value, &length, &format,
+			    &size, ctx->owner_closure, (XtRequestId*)&req)) {
+	       HandleNone(widget, callback, closure, selection);
+	   }
+	   else {
+		if (incremental) {
+		  Boolean allSent = FALSE;
+	          while (!allSent) {
+	    	      if (ctx->notify && (value != NULL)) {
+              	        int bytelength = BYTELENGTH(length,format);
+	                /* both sides think they own this storage */
+	                temp = __XtMalloc((unsigned)bytelength);
+	                (void) memmove(temp, value, bytelength);
+	                value = temp;
+	              }
+		      /* use care; older clients were never warned that
+		       * they must return a value even if length==0
+		       */
+		     if (value == NULL) value = __XtMalloc((unsigned)1);
+		     (*callback)(widget, closure, &selection,
+			&resulttype, value, &length, &format);
+		     if (length) {
+			 /* should owner be notified on end-of-piece?
+			  * Spec is unclear, but non-local transfers don't.
+			  */
+			 (*(XtConvertSelectionIncrProc)ctx->convert)
+					(ctx->widget, &selection, &target,
+					 &resulttype, &value, &length, &format,
+					 &size, ctx->owner_closure,
+					 (XtRequestId*)&req);
+		     }
+		     else allSent = TRUE;
+		  }
+	        } else {
+	          while (length) {
+		    int bytelength = BYTELENGTH(length, format);
+		    total = XtRealloc(total,
+			    (unsigned) (totallength += bytelength));
+		    (void) memmove((char*)total + totallength - bytelength,
+			    value,
+			    bytelength);
+		    (*(XtConvertSelectionIncrProc)ctx->convert)
+			   (ctx->widget, &selection, &target,
+			    &resulttype, &value, &length, &format,
+			    &size, ctx->owner_closure, (XtRequestId*)&req);
+		  }
+		  if (total == NULL) total = __XtMalloc(1);
+		  totallength = NUMELEM(totallength, format);
+		  (*callback)(widget, closure, &selection, &resulttype,
+		    total,  &totallength, &format);
+	      }
+	      if (ctx->notify)
+		  (*(XtSelectionDoneIncrProc)ctx->notify)
+				(ctx->widget, &selection, &target,
+				 (XtRequestId*)&req, ctx->owner_closure);
+	      else XtFree((char*)value);
+	  }
+	} else { /* not incremental owner */
+	  if (!(*ctx->convert)(ctx->widget, &selection, &target,
+			     &resulttype, &value, &length, &format)) {
+	    HandleNone(widget, callback, closure, selection);
+	  } else {
+	      if (ctx->notify && (value != NULL)) {
+                int bytelength = BYTELENGTH(length,format);
+	        /* both sides think they own this storage; better copy */
+	        temp = __XtMalloc((unsigned)bytelength);
+	        (void) memmove(temp, value, bytelength);
+	        value = temp;
+	      }
+	      if (value == NULL) value = __XtMalloc((unsigned)1);
+	      (*callback)(widget, closure, &selection, &resulttype,
+			  value, &length, &format);
+	      if (ctx->notify)
+	         (*ctx->notify)(ctx->widget, &selection, &target);
+	  }
+      }
+}
+
+static void GetSelectionValue(
+    Widget widget,
+    Atom selection,
+    Atom target,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Time time,
+    Boolean incremental,
+    Atom property)
+{
+    Select ctx;
+    CallBackInfo info;
+    Atom properties[1];
+
+    properties[0] = property;
+
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (ctx->widget && !ctx->was_disowned) {
+	RequestRec req;
+	ctx->req = &req;
+	req.ctx = ctx;
+	req.event.time = time;
+	ctx->ref_count++;
+	DoLocalTransfer(&req, selection, target, widget,
+			callback, closure, incremental, property);
+	if (--ctx->ref_count == 0 && ctx->free_when_done)
+	    XtFree((char*)ctx);
+	else
+	    ctx->req = NULL;
+    }
+    else {
+	info = MakeInfo(ctx, &callback, &closure, 1, widget,
+			time, &incremental, properties);
+	info->target = (Atom *)__XtMalloc((unsigned) sizeof(Atom));
+	 *(info->target) = target;
+	RequestSelectionValue(info, selection, target);
+    }
+}
+
+
+void XtGetSelectionValue(
+    Widget widget,
+    Atom selection,
+    Atom target,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Time time)
+{
+    Atom property;
+    Boolean incr = False;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    property = GetParamInfo(widget, selection);
+    RemoveParamInfo(widget, selection);
+
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, 1, &target, &callback, 1,
+			   &closure, &incr, &property);
+    } else {
+      GetSelectionValue(widget, selection, target, callback,
+			closure, time, FALSE, property);
+    }
+    UNLOCK_APP(app);
+}
+
+
+void XtGetSelectionValueIncremental(
+    Widget widget,
+    Atom selection,
+    Atom target,
+    XtSelectionCallbackProc callback,
+    XtPointer closure,
+    Time time)
+{
+    Atom property;
+    Boolean incr = TRUE;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    property = GetParamInfo(widget, selection);
+    RemoveParamInfo(widget, selection);
+
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, 1, &target, &callback, 1,
+			   &closure, &incr, &property);
+    } else {
+      GetSelectionValue(widget, selection, target, callback,
+			closure, time, TRUE, property);
+    }
+
+    UNLOCK_APP(app);
+}
+
+
+static void GetSelectionValues(
+    Widget widget,
+    Atom selection,
+    Atom *targets,
+    int count,
+    XtSelectionCallbackProc *callbacks,
+    int num_callbacks,
+    XtPointer *closures,
+    Time time,
+    Boolean *incremental,
+    Atom *properties)
+{
+    Select ctx;
+    CallBackInfo info;
+    IndirectPair *pairs, *p;
+    Atom *t;
+
+    if (count == 0) return;
+    ctx = FindCtx(XtDisplay(widget), selection);
+    if (ctx->widget && !ctx->was_disowned) {
+        int j, i;
+	RequestRec req;
+	ctx->req = &req;
+	req.ctx = ctx;
+	req.event.time = time;
+	ctx->ref_count++;
+	for (i = 0, j = 0; count; count--, i++, j++ ) {
+	  if (j >= num_callbacks) j = 0;
+
+	  DoLocalTransfer(&req, selection, targets[i], widget,
+			  callbacks[j], closures[i], incremental[i],
+			  properties ? properties[i] : None);
+
+	}
+	if (--ctx->ref_count == 0 && ctx->free_when_done)
+	    XtFree((char*)ctx);
+	else
+	    ctx->req = NULL;
+    } else {
+        XtSelectionCallbackProc *passed_callbacks;
+	XtSelectionCallbackProc stack_cbs[32];
+        int i = 0, j = 0;
+
+	passed_callbacks = (XtSelectionCallbackProc *)
+	  XtStackAlloc(sizeof(XtSelectionCallbackProc) * count, stack_cbs);
+
+	/* To deal with the old calls from XtGetSelectionValues* we
+	   will repeat however many callbacks have been passed into
+	   the array */
+	for(i = 0; i < count; i++) {
+	  if (j >= num_callbacks) j = 0;
+	  passed_callbacks[i] = callbacks[j];
+	  j++;
+	}
+	info = MakeInfo(ctx, passed_callbacks, closures, count, widget,
+			time, incremental, properties);
+	XtStackFree((XtPointer) passed_callbacks, stack_cbs);
+
+	info->target = (Atom *)__XtMalloc((unsigned) ((count+1) * sizeof(Atom)));
+        (*info->target) = ctx->prop_list->indirect_atom;
+	(void) memmove((char *) info->target+sizeof(Atom), (char *) targets,
+		       count * sizeof(Atom));
+	pairs = (IndirectPair*)__XtMalloc((unsigned)(count*sizeof(IndirectPair)));
+	for (p = &pairs[count-1], t = &targets[count-1], i = count - 1;
+	     p >= pairs;  p--, t--, i--) {
+	   p->target = *t;
+	   if (properties == NULL || properties[i] == None) {
+	     p->property = GetSelectionProperty(XtDisplay(widget));
+	     XDeleteProperty(XtDisplay(widget), XtWindow(widget),
+			     p->property);
+	   } else {
+	     p->property = properties[i];
+	   }
+	}
+	XChangeProperty(XtDisplay(widget), XtWindow(widget),
+			info->property, info->property,
+			32, PropModeReplace, (unsigned char *) pairs,
+			count * IndirectPairWordSize);
+	XtFree((char*)pairs);
+	RequestSelectionValue(info, selection, ctx->prop_list->indirect_atom);
+    }
+}
+
+
+void XtGetSelectionValues(
+    Widget widget,
+    Atom selection,
+    Atom *targets,
+    int count,
+    XtSelectionCallbackProc callback,
+    XtPointer *closures,
+    Time time)
+{
+    Boolean incremental_values[32];
+    Boolean *incremental;
+    int i;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    incremental = XtStackAlloc(count * sizeof(Boolean), incremental_values);
+    for(i = 0; i < count; i++) incremental[i] = FALSE;
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, count, targets, &callback,
+			   1, closures, incremental, NULL);
+    } else {
+      GetSelectionValues(widget, selection, targets, count, &callback, 1,
+			 closures, time, incremental, NULL);
+    }
+    XtStackFree((XtPointer) incremental, incremental_values);
+    UNLOCK_APP(app);
+}
+
+
+void XtGetSelectionValuesIncremental(
+    Widget widget,
+    Atom selection,
+    Atom *targets,
+    int count,
+    XtSelectionCallbackProc callback,
+    XtPointer *closures,
+    Time time)
+{
+    Boolean incremental_values[32];
+    Boolean *incremental;
+    int i;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    incremental = XtStackAlloc(count * sizeof(Boolean), incremental_values);
+    for(i = 0; i < count; i++) incremental[i] = TRUE;
+    if (IsGatheringRequest(widget, selection)) {
+      AddSelectionRequests(widget, selection, count, targets, &callback,
+			   1, closures, incremental, NULL);
+    } else {
+      GetSelectionValues(widget, selection, targets, count,
+			 &callback, 1, closures, time, incremental, NULL);
+    }
+    XtStackFree((XtPointer) incremental, incremental_values);
+    UNLOCK_APP(app);
+}
+
+
+static Request GetRequestRecord(
+    Widget widget,
+    Atom selection,
+    XtRequestId id)
+{
+    Request req = (Request)id;
+    Select ctx = NULL;
+
+    if (   (req == NULL
+	    && ((ctx = FindCtx( XtDisplay(widget), selection )) == NULL
+		|| ctx->req == NULL
+		|| ctx->selection != selection
+		|| ctx->widget == NULL))
+	|| (req != NULL
+	    && (req->ctx == NULL
+		|| req->ctx->selection != selection
+		|| req->ctx->widget != widget)))
+    {
+	String params = XtName(widget);
+	Cardinal num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+			 "notInConvertSelection", "xtGetSelectionRequest",
+			 XtCXtToolkitError,
+			 "XtGetSelectionRequest or XtGetSelectionParameters called for widget \"%s\" outside of ConvertSelection proc",
+			 &params, &num_params
+		       );
+	return NULL;
+    }
+
+    if (req == NULL) {
+	/* non-incremental owner; only one request can be
+	 * outstanding at a time, so it's safe to keep ptr in ctx */
+	req = ctx->req;
+    }
+    return req;
+}
+
+XSelectionRequestEvent *XtGetSelectionRequest(
+    Widget widget,
+    Atom selection,
+    XtRequestId id)
+{
+    Request req = (Request)id;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+
+    req = GetRequestRecord(widget, selection, id);
+
+    if (! req) {
+	UNLOCK_APP(app);
+	return (XSelectionRequestEvent*) NULL;
+    }
+
+    if (req->event.type == 0) {
+	/* owner is local; construct the remainder of the event */
+	req->event.type = SelectionRequest;
+	req->event.serial = LastKnownRequestProcessed(XtDisplay(widget));
+	req->event.send_event = True;
+	req->event.display = XtDisplay(widget);
+	req->event.owner = XtWindow(req->ctx->widget);
+	req->event.selection = selection;
+    }
+    UNLOCK_APP(app);
+    return &req->event;
+}
+
+/* Property atom access */
+Atom XtReservePropertyAtom(
+     Widget w)
+{
+  return(GetSelectionProperty(XtDisplay(w)));
+}
+
+void XtReleasePropertyAtom(
+     Widget w,
+     Atom atom)
+{
+  FreeSelectionProperty(XtDisplay(w), atom);
+}
+
+
+/* Multiple utilities */
+
+/* All requests are put in a single list per widget.  It is
+   very unlikely anyone will be gathering multiple MULTIPLE
+   requests at the same time,  so the loss in efficiency for
+   this case is acceptable */
+
+/* Queue one or more requests to the one we're gathering */
+static void AddSelectionRequests(
+     Widget wid,
+     Atom sel,
+     int count,
+     Atom *targets,
+     XtSelectionCallbackProc *callbacks,
+     int num_cb,
+     XtPointer *closures,
+     Boolean *incrementals,
+     Atom *properties)
+{
+  QueuedRequestInfo qi;
+  Window window = XtWindow(wid);
+  Display *dpy = XtDisplay(wid);
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  qi = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &qi);
+
+  if (qi != NULL) {
+    QueuedRequest *req = qi->requests;
+    int start = qi->count;
+    int i = 0;
+    int j = 0;
+
+    qi->count += count;
+    req = (QueuedRequest*) XtRealloc((char*) req,
+				     (start + count) *
+				     sizeof(QueuedRequest));
+    while(i < count) {
+      QueuedRequest newreq = (QueuedRequest)
+	__XtMalloc(sizeof(QueuedRequestRec));
+      newreq->selection = sel;
+      newreq->target = targets[i];
+      if (properties != NULL)
+	newreq->param = properties[i];
+      else {
+	newreq->param = GetSelectionProperty(dpy);
+	XDeleteProperty(dpy, window, newreq->param);
+      }
+      newreq->callback = callbacks[j];
+      newreq->closure = closures[i];
+      newreq->incremental = incrementals[i];
+
+      req[start] = newreq;
+      start++;
+      i++;
+      j++;
+      if (j > num_cb) j = 0;
+    }
+
+    qi->requests = req;
+  } else {
+    /* Impossible */
+  }
+
+  UNLOCK_PROCESS;
+}
+
+/* Only call IsGatheringRequest when we have a lock already */
+
+static Boolean IsGatheringRequest(
+     Widget wid,
+     Atom sel)
+{
+  QueuedRequestInfo qi;
+  Window window = XtWindow(wid);
+  Display *dpy = XtDisplay(wid);
+  Boolean found = False;
+  int i;
+
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  qi = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &qi);
+
+  if (qi != NULL) {
+    i = 0;
+    while(qi->selections[i] != None) {
+      if (qi->selections[i] == sel) {
+	found = True;
+	break;
+      }
+      i++;
+    }
+  }
+
+  return(found);
+}
+
+/* Cleanup request scans the request queue and releases any
+   properties queued, and removes any requests queued */
+static void CleanupRequest(
+     Display *dpy,
+     QueuedRequestInfo qi,
+     Atom sel)
+{
+  int i, j, n;
+
+  i = 0;
+
+  /* Remove this selection from the list */
+  n = 0;
+  while(qi->selections[n] != sel &&
+	qi->selections[n] != None) n++;
+  if (qi->selections[n] == sel) {
+    while(qi->selections[n] != None) {
+      qi->selections[n] = qi->selections[n + 1];
+      n++;
+    }
+  }
+
+  while(i < qi->count) {
+    QueuedRequest req = qi->requests[i];
+
+    if (req->selection == sel) {
+      /* Match */
+      if (req->param != None)
+	FreeSelectionProperty(dpy, req->param);
+      qi->count--;
+
+      for(j = i; j < qi->count; j++)
+	qi->requests[j] = qi->requests[j + 1];
+
+      XtFree((char*) req);
+    } else {
+      i++;
+    }
+  }
+}
+
+void XtCreateSelectionRequest(
+    Widget widget,
+    Atom selection)
+{
+  QueuedRequestInfo queueInfo;
+  Window window = XtWindow(widget);
+  Display *dpy = XtDisplay(widget);
+  int n;
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  queueInfo = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &queueInfo);
+
+  /* If there is one,  then cancel it */
+  if (queueInfo != NULL)
+    CleanupRequest(dpy, queueInfo, selection);
+  else {
+    /* Create it */
+    queueInfo = (QueuedRequestInfo) __XtMalloc(sizeof(QueuedRequestInfoRec));
+    queueInfo->count = 0;
+    queueInfo->selections = (Atom*) __XtMalloc(sizeof(Atom) * 2);
+    queueInfo->selections[0] = None;
+    queueInfo->requests = (QueuedRequest *)
+      __XtMalloc(sizeof(QueuedRequest));
+  }
+
+  /* Append this selection to list */
+  n = 0;
+  while(queueInfo->selections[n] != None) n++;
+  queueInfo->selections =
+    (Atom*) XtRealloc((char*) queueInfo->selections,
+		      (n + 2) * sizeof(Atom));
+  queueInfo->selections[n] = selection;
+  queueInfo->selections[n + 1] = None;
+
+  (void) XSaveContext(dpy, window, multipleContext, (char*) queueInfo);
+  UNLOCK_PROCESS;
+}
+
+void XtSendSelectionRequest(
+    Widget widget,
+    Atom selection,
+    Time time)
+{
+  QueuedRequestInfo queueInfo;
+  Window window = XtWindow(widget);
+  Display *dpy = XtDisplay(widget);
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  queueInfo = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &queueInfo);
+  if (queueInfo != NULL) {
+    int count = 0;
+    int i;
+    QueuedRequest *req = queueInfo->requests;
+
+    /* Construct the requests and send it using
+       GetSelectionValues */
+    for(i = 0; i < queueInfo->count; i++)
+      if (req[i]->selection == selection) count++;
+
+    if (count > 0) {
+      if (count == 1) {
+	for(i = 0; i < queueInfo->count; i++)
+	  if (req[i]->selection == selection) break;
+
+	/* special case a multiple which isn't needed */
+	GetSelectionValue(widget, selection, req[i]->target,
+			  req[i]->callback, req[i]->closure, time,
+			  req[i]->incremental, req[i]->param);
+      } else {
+	Atom *targets;
+	Atom t[PREALLOCED];
+	XtSelectionCallbackProc *cbs;
+	XtSelectionCallbackProc c[PREALLOCED];
+	XtPointer *closures;
+	XtPointer cs[PREALLOCED];
+	Boolean *incrs;
+	Boolean ins[PREALLOCED];
+	Atom *props;
+	Atom p[PREALLOCED];
+	int i = 0;
+	int j = 0;
+
+	/* Allocate */
+	targets = (Atom *) XtStackAlloc(count * sizeof(Atom), t);
+	cbs = (XtSelectionCallbackProc *)
+	  XtStackAlloc(count * sizeof(XtSelectionCallbackProc), c);
+	closures = (XtPointer *) XtStackAlloc(count * sizeof(XtPointer), cs);
+	incrs = (Boolean *) XtStackAlloc(count * sizeof(Boolean), ins);
+	props = (Atom *) XtStackAlloc(count * sizeof(Atom), p);
+
+	/* Copy */
+	for(i = 0; i < queueInfo->count; i++) {
+	  if (req[i]->selection == selection) {
+	    targets[j] = req[i]->target;
+	    cbs[j] = req[i]->callback;
+	    closures[j] = req[i]->closure;
+	    incrs[j] = req[i]->incremental;
+	    props[j] = req[i]->param;
+	    j++;
+	  }
+	}
+
+	/* Make the request */
+	GetSelectionValues(widget, selection, targets, count,
+			   cbs, count, closures, time, incrs, props);
+
+	/* Free */
+	XtStackFree((XtPointer) targets, t);
+	XtStackFree((XtPointer) cbs, c);
+	XtStackFree((XtPointer) closures, cs);
+	XtStackFree((XtPointer) incrs, ins);
+	XtStackFree((XtPointer) props, p);
+      }
+    }
+  }
+
+  CleanupRequest(dpy, queueInfo, selection);
+  UNLOCK_PROCESS;
+}
+
+void XtCancelSelectionRequest(
+    Widget widget,
+    Atom selection)
+{
+  QueuedRequestInfo queueInfo;
+  Window window = XtWindow(widget);
+  Display *dpy = XtDisplay(widget);
+
+  LOCK_PROCESS;
+  if (multipleContext == 0) multipleContext = XUniqueContext();
+
+  queueInfo = NULL;
+  (void) XFindContext(dpy, window, multipleContext, (XPointer*) &queueInfo);
+  /* If there is one,  then cancel it */
+  if (queueInfo != NULL)
+    CleanupRequest(dpy, queueInfo, selection);
+  UNLOCK_PROCESS;
+}
+
+/* Parameter utilities */
+
+/* Parameters on a selection request */
+/* Places data on allocated parameter atom,  then records the
+   parameter atom data for use in the next call to one of
+   the XtGetSelectionValue functions. */
+void XtSetSelectionParameters(
+    Widget requestor,
+    Atom selection,
+    Atom type,
+    XtPointer value,
+    unsigned long length,
+    int format)
+{
+  Display *dpy = XtDisplay(requestor);
+  Window window = XtWindow(requestor);
+  Atom property = GetParamInfo(requestor, selection);
+
+  if (property == None) {
+    property = GetSelectionProperty(dpy);
+    AddParamInfo(requestor, selection, property);
+  }
+
+  XChangeProperty(dpy, window, property,
+		  type, format, PropModeReplace,
+		  (unsigned char *) value, length);
+}
+
+/* Retrieves data passed in a parameter. Data for this is stored
+   on the originator's window */
+void XtGetSelectionParameters(
+    Widget owner,
+    Atom selection,
+    XtRequestId request_id,
+    Atom* type_return,
+    XtPointer* value_return,
+    unsigned long* length_return,
+    int* format_return)
+{
+    Request req;
+    Display *dpy = XtDisplay(owner);
+    WIDGET_TO_APPCON(owner);
+
+    *value_return = NULL;
+    *length_return = *format_return = 0;
+    *type_return = None;
+
+    LOCK_APP(app);
+
+    req = GetRequestRecord(owner, selection, request_id);
+
+    if (req && req->property) {
+	unsigned long bytes_after;	/* unused */
+	StartProtectedSection(dpy, req->requestor);
+	XGetWindowProperty(dpy, req->requestor, req->property, 0L, 10000000,
+			   False, AnyPropertyType, type_return, format_return,
+			   length_return, &bytes_after,
+			   (unsigned char**) value_return);
+	EndProtectedSection(dpy);
+#ifdef XT_COPY_SELECTION
+	if (*value_return) {
+	    int size = BYTELENGTH(*length_return, *format_return) + 1;
+	    char *tmp = __XtMalloc((Cardinal) size);
+	    (void) memmove(tmp, *value_return, size);
+	    XFree(*value_return);
+	    *value_return = tmp;
+	}
+#endif
+    }
+    UNLOCK_APP(app);
+}
+
+/*  Parameters are temporarily stashed in an XContext.  A list is used because
+ *  there may be more than one selection request in progress.  The context
+ *  data is deleted when the list is empty.  In the future, the parameter
+ *  context could be merged with other contexts used during selections.
+ */
+
+static void AddParamInfo(
+    Widget w,
+    Atom selection,
+    Atom param_atom)
+{
+    int n;
+    Param p;
+    ParamInfo pinfo;
+
+    LOCK_PROCESS;
+    if (paramPropertyContext == 0)
+	paramPropertyContext = XUniqueContext();
+
+    if (XFindContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+		     (XPointer *) &pinfo)) {
+	pinfo = (ParamInfo) __XtMalloc(sizeof(ParamInfoRec));
+	pinfo->count = 1;
+	pinfo->paramlist = XtNew(ParamRec);
+	p = pinfo->paramlist;
+	(void) XSaveContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+			    (char *)pinfo);
+    }
+    else {
+	for (n = pinfo->count, p = pinfo->paramlist; n; n--, p++) {
+	    if (p->selection == None || p->selection == selection)
+		break;
+	}
+	if (n == 0) {
+	    pinfo->count++;
+	    pinfo->paramlist = (Param)
+		XtRealloc((char*) pinfo->paramlist,
+			  pinfo->count * sizeof(ParamRec));
+	    p = &pinfo->paramlist[pinfo->count - 1];
+	    (void) XSaveContext(XtDisplay(w), XtWindow(w),
+				paramPropertyContext, (char *)pinfo);
+	}
+    }
+    p->selection = selection;
+    p->param = param_atom;
+    UNLOCK_PROCESS;
+}
+
+static void RemoveParamInfo(
+    Widget w,
+    Atom selection)
+{
+    int n;
+    Param p;
+    ParamInfo pinfo;
+    Boolean retain = False;
+
+    LOCK_PROCESS;
+    if (paramPropertyContext
+	&& (XFindContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+			 (XPointer *) &pinfo) == 0)) {
+
+	/* Find and invalidate the parameter data. */
+	for (n = pinfo->count, p = pinfo->paramlist; n; n--, p++) {
+	    if (p->selection != None) {
+		if (p->selection == selection)
+		    p->selection = None;
+		else
+		    retain = True;
+	    }
+	}
+	/* If there's no valid data remaining, release the context entry. */
+	if (! retain) {
+	    XtFree((char*) pinfo->paramlist);
+	    XtFree((char*) pinfo);
+	    XDeleteContext(XtDisplay(w), XtWindow(w), paramPropertyContext);
+	}
+    }
+    UNLOCK_PROCESS;
+}
+
+static Atom GetParamInfo(
+    Widget w,
+    Atom selection)
+{
+    int n;
+    Param p;
+    ParamInfo pinfo;
+    Atom atom = None;
+
+    LOCK_PROCESS;
+    if (paramPropertyContext
+	&& (XFindContext(XtDisplay(w), XtWindow(w), paramPropertyContext,
+			 (XPointer *) &pinfo) == 0)) {
+
+	for (n = pinfo->count, p = pinfo->paramlist; n; n--, p++)
+	    if (p->selection == selection) {
+		atom = p->param;
+		break;
+	    }
+    }
+    UNLOCK_PROCESS;
+    return atom;
+}
diff --git a/libXt/src/SetSens.c b/libXt/src/SetSens.c
new file mode 100644
index 000000000..ad2b6f489
--- /dev/null
+++ b/libXt/src/SetSens.c
@@ -0,0 +1,128 @@
+/* $Xorg: SetSens.c,v 1.4 2001/02/09 02:03:58 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/SetSens.c,v 1.3 2001/12/14 19:56:29 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+/*
+ *	XtSetSensitive()
+ */
+
+static void SetAncestorSensitive(
+    register Widget widget,
+    Boolean	    ancestor_sensitive)
+{
+    Arg			args[1];
+    register Cardinal   i;
+    register WidgetList children;
+
+    if (widget->core.ancestor_sensitive == ancestor_sensitive) return;
+
+    XtSetArg(args[0], XtNancestorSensitive, ancestor_sensitive);
+    XtSetValues(widget, args, XtNumber(args));
+
+    /* If widget's sensitive is TRUE, propagate new ancestor_sensitive to
+       children's ancestor_sensitive; else do nothing as children's
+       ancestor_sensitive is already FALSE */
+    
+    if (widget->core.sensitive && XtIsComposite(widget)) {
+	children = ((CompositeWidget) widget)->composite.children;
+	for (i=0; i < ((CompositeWidget)widget)->composite.num_children; i++) {
+	    SetAncestorSensitive (children[i], ancestor_sensitive);
+	}
+    }
+} /* SetAncestorSensitive */
+
+
+void XtSetSensitive(
+    register Widget widget,
+    _XtBoolean	    sensitive)
+{
+    Arg			args[1];
+    register Cardinal   i;
+    register WidgetList children;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (widget->core.sensitive == sensitive) {
+	UNLOCK_APP(app);
+	return;
+    }
+
+    XtSetArg(args[0], XtNsensitive, sensitive);
+    XtSetValues(widget, args, XtNumber(args));
+
+    /* If widget's ancestor_sensitive is TRUE, propagate new sensitive to
+       children's ancestor_sensitive; else do nothing as children's
+       ancestor_sensitive is already FALSE */
+    
+    if (widget->core.ancestor_sensitive && XtIsComposite (widget)) {
+	children = ((CompositeWidget) widget)->composite.children;
+	for (i = 0; i < ((CompositeWidget)widget)->composite.num_children; i++){
+	    SetAncestorSensitive (children[i], sensitive);
+	}
+    }
+    UNLOCK_APP(app);
+} /* XtSetSensitive */
diff --git a/libXt/src/SetValues.c b/libXt/src/SetValues.c
new file mode 100644
index 000000000..8695ede38
--- /dev/null
+++ b/libXt/src/SetValues.c
@@ -0,0 +1,443 @@
+/* $Xorg: SetValues.c,v 1.4 2001/02/09 02:03:58 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/SetValues.c,v 1.2 2001/08/22 22:52:19 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+/*
+ *	XtSetValues(), XtSetSubvalues()
+ */
+
+
+static void SetValues(
+  char*			base,		/* Base address to write values to   */
+  XrmResourceList*	res,		/* The current resource values.      */
+  register Cardinal	num_resources,	/* number of items in resources      */
+  ArgList 		args,		/* The resource values to set        */
+  Cardinal		num_args)	/* number of items in arg list       */
+{
+    register ArgList		arg;
+    register Cardinal 	        i;
+    register XrmName		argName;
+    register XrmResourceList*   xrmres;
+
+    /* Resource lists are assumed to be in compiled form already via the
+       initial XtGetResources, XtGetSubresources calls */
+
+    for (arg = args ; num_args != 0; num_args--, arg++) {
+	argName = StringToName(arg->name);
+	for (xrmres = res, i = 0; i < num_resources; i++, xrmres++) {
+	    if (argName == (*xrmres)->xrm_name) {
+		_XtCopyFromArg(arg->value,
+		    base - (*xrmres)->xrm_offset - 1,
+		    (*xrmres)->xrm_size);
+		break;
+	    }
+	}
+    }
+} /* SetValues */
+
+static Boolean CallSetValues (
+    WidgetClass class,
+    Widget      current,
+    Widget      request,
+    Widget      new,
+    ArgList     args,
+    Cardinal    num_args)
+{
+    Boolean redisplay = FALSE;
+    WidgetClass superclass;
+    XtArgsFunc set_values_hook;
+    XtSetValuesFunc set_values;
+
+    LOCK_PROCESS;
+    superclass = class->core_class.superclass;
+    UNLOCK_PROCESS;
+    if (superclass)
+        redisplay =
+	    CallSetValues(superclass, current, request, new, args, num_args);
+
+    LOCK_PROCESS;
+    set_values = class->core_class.set_values;
+    UNLOCK_PROCESS;
+    if (set_values)
+        redisplay |= (*set_values) (current, request, new, args, &num_args);
+
+    LOCK_PROCESS;
+    set_values_hook = class->core_class.set_values_hook;
+    UNLOCK_PROCESS;
+    if (set_values_hook)
+	redisplay |= (*set_values_hook) (new, args, &num_args);
+    return (redisplay);
+}
+
+static Boolean
+CallConstraintSetValues (
+    ConstraintWidgetClass class,
+    Widget      current,
+    Widget      request,
+    Widget      new,
+    ArgList     args,
+    Cardinal    num_args)
+{
+    Boolean redisplay = FALSE;
+    XtSetValuesFunc set_values;
+    ConstraintWidgetClass superclass;
+
+    if ((WidgetClass)class != constraintWidgetClass) {
+	if (class == NULL)
+	    XtAppErrorMsg(XtWidgetToApplicationContext(current),
+		    "invalidClass","constraintSetValue",XtCXtToolkitError,
+                 "Subclass of Constraint required in CallConstraintSetValues",
+                  (String *)NULL, (Cardinal *)NULL);
+	LOCK_PROCESS;
+	superclass = (ConstraintWidgetClass) class->core_class.superclass;
+	UNLOCK_PROCESS;
+	redisplay =
+	   CallConstraintSetValues(superclass,
+				   current, request, new, args, num_args);
+    }
+    LOCK_PROCESS;
+    set_values = class->constraint_class.set_values;
+    UNLOCK_PROCESS;
+    if (set_values)
+        redisplay |= (*set_values) (current, request, new, args, &num_args);
+    return (redisplay);
+}
+
+void XtSetSubvalues(
+  XtPointer             base,           /* Base address to write values to   */
+  register XtResourceList resources,    /* The current resource values.      */
+  register Cardinal     num_resources,  /* number of items in resources      */
+  ArgList               args,           /* The resource values to set        */
+  Cardinal              num_args)       /* number of items in arg list       */
+{
+      register XrmResourceList*   xrmres;
+      xrmres = _XtCreateIndirectionTable (resources, num_resources);
+      SetValues((char*)base,xrmres,num_resources, args, num_args);
+      XtFree((char *)xrmres);
+}
+
+
+void XtSetValues(
+    register Widget   w,
+	     ArgList  args,
+	     Cardinal num_args)
+{
+    register Widget oldw, reqw;
+    /* need to use strictest alignment rules possible in next two decls. */
+    double	    oldwCache[100], reqwCache[100];
+    double	    oldcCache[20], reqcCache[20];
+    Cardinal	    widgetSize, constraintSize;
+    Boolean	    redisplay, cleared_rect_obj = False;
+    XtGeometryResult result;
+    XtWidgetGeometry geoReq, geoReply;
+    WidgetClass     wc;
+    ConstraintWidgetClass cwc = NULL;
+    Boolean	    hasConstraints;
+    XtAlmostProc set_values_almost;
+    XtAppContext app = XtWidgetToApplicationContext(w);
+    Widget hookobj = XtHooksOfDisplay(XtDisplayOfObject(w));
+
+    LOCK_APP(app);
+    wc = XtClass(w);
+    if ((args == NULL) && (num_args != 0)) {
+        XtAppErrorMsg(app,
+		"invalidArgCount","xtSetValues",XtCXtToolkitError,
+                "Argument count > 0 on NULL argument list in XtSetValues",
+                 (String *)NULL, (Cardinal *)NULL);
+    }
+
+    /* Allocate and copy current widget into old widget */
+
+    LOCK_PROCESS;
+    widgetSize = wc->core_class.widget_size;
+    UNLOCK_PROCESS;
+    oldw = (Widget) XtStackAlloc(widgetSize, oldwCache);
+    reqw = (Widget) XtStackAlloc (widgetSize, reqwCache);
+    (void) memmove((char *) oldw, (char *) w, (int) widgetSize);
+
+    /* Set resource values */
+
+    LOCK_PROCESS;
+    SetValues((char*)w, (XrmResourceList *) wc->core_class.resources,
+	wc->core_class.num_resources, args, num_args);
+    UNLOCK_PROCESS;
+
+    (void) memmove ((char *) reqw, (char *) w, (int) widgetSize);
+
+    hasConstraints = (XtParent(w) != NULL && !XtIsShell(w) && XtIsConstraint(XtParent(w)));
+
+    /* Some widget sets apparently do ugly things by freeing the
+     * constraints on some children, thus the extra test here */
+    if (hasConstraints) {
+	cwc = (ConstraintWidgetClass) XtClass(w->core.parent);
+	if (w->core.constraints) {
+	    LOCK_PROCESS;
+	    constraintSize = cwc->constraint_class.constraint_size;
+	    UNLOCK_PROCESS;
+	} else constraintSize = 0;
+    } else constraintSize = 0;
+
+    if (constraintSize) {
+	/* Allocate and copy current constraints into oldw */
+	oldw->core.constraints = XtStackAlloc(constraintSize, oldcCache);
+	reqw->core.constraints = XtStackAlloc(constraintSize, reqcCache);
+	(void) memmove((char *) oldw->core.constraints,
+		       (char *) w->core.constraints, (int) constraintSize);
+
+	/* Set constraint values */
+	LOCK_PROCESS;
+	SetValues((char*)w->core.constraints,
+	    (XrmResourceList *)(cwc->constraint_class.resources),
+	    cwc->constraint_class.num_resources, args, num_args);
+	UNLOCK_PROCESS;
+	(void) memmove((char *) reqw->core.constraints,
+		       (char *) w->core.constraints, (int) constraintSize);
+    }
+
+    /* Inform widget of changes, then inform parent of changes */
+    redisplay = CallSetValues (wc, oldw, reqw, w, args, num_args);
+    if (hasConstraints) {
+	redisplay |= CallConstraintSetValues(cwc, oldw, reqw, w, args, num_args);
+    }
+
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+	XtChangeHookSetValuesDataRec set_val;
+
+	set_val.old = oldw;
+	set_val.req = reqw;
+	set_val.args = args;
+	set_val.num_args = num_args;
+	call_data.type = XtHsetValues;
+	call_data.widget = w;
+	call_data.event_data = (XtPointer) &set_val;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+
+    if (XtIsRectObj(w)) {
+	/* Now perform geometry request if needed */
+	geoReq.request_mode = 0;
+	if (oldw->core.x	!= w->core.x) {
+	    geoReq.x		= w->core.x;
+	    w->core.x		= oldw->core.x;
+	    geoReq.request_mode |= CWX;
+	}
+	if (oldw->core.y	!= w->core.y) {
+	    geoReq.y		= w->core.y;
+	    w->core.y		= oldw->core.y;
+	    geoReq.request_mode |= CWY;
+	}
+	if (oldw->core.width	!= w->core.width) {
+	    geoReq.width	= w->core.width;
+	    w->core.width	= oldw->core.width;
+	    geoReq.request_mode |= CWWidth;
+	}
+	if (oldw->core.height	!= w->core.height) {
+	    geoReq.height	= w->core.height;
+	    w->core.height	= oldw->core.height;
+	    geoReq.request_mode |= CWHeight;
+	}
+	if (oldw->core.border_width != w->core.border_width) {
+	    geoReq.border_width	    = w->core.border_width;
+	    w->core.border_width    = oldw->core.border_width;
+	    geoReq.request_mode	    |= CWBorderWidth;
+	}
+
+	if (geoReq.request_mode != 0) {
+	    /* Pass on any requests for unchanged geometry values */
+	    if (geoReq.request_mode !=
+		(CWX | CWY | CWWidth | CWHeight | CWBorderWidth)) {
+		for ( ; num_args != 0; num_args--, args++) {
+		    if (! (geoReq.request_mode & CWX) &&
+			strcmp(XtNx, args->name) == 0) {
+			geoReq.x = w->core.x;
+			geoReq.request_mode |= CWX;
+		    } else if (! (geoReq.request_mode & CWY) &&
+			       strcmp(XtNy, args->name) == 0) {
+			geoReq.y = w->core.y;
+			geoReq.request_mode |= CWY;
+		    } else if (! (geoReq.request_mode & CWWidth) &&
+			       strcmp(XtNwidth, args->name) == 0) {
+			geoReq.width = w->core.width;
+			geoReq.request_mode |= CWWidth;
+		    } else if (! (geoReq.request_mode & CWHeight) &&
+			       strcmp(XtNheight, args->name) == 0) {
+			geoReq.height = w->core.height;
+			geoReq.request_mode |= CWHeight;
+		    } else if (! (geoReq.request_mode & CWBorderWidth) &&
+			       strcmp(XtNborderWidth, args->name) == 0) {
+			geoReq.border_width = w->core.border_width;
+			geoReq.request_mode |= CWBorderWidth;
+		    }
+		}
+	    }
+	    CALLGEOTAT(_XtGeoTrace(w,
+		     "\nXtSetValues sees some geometry changes for \"%s\".\n",
+			   XtName(w)));
+	    CALLGEOTAT(_XtGeoTab(1));
+	    do {
+		XtGeometryHookDataRec call_data;
+
+		if (XtHasCallbacks(hookobj, XtNgeometryHook) == XtCallbackHasSome) {
+		    call_data.type = XtHpreGeometry;
+		    call_data.widget = w;
+		    call_data.request = &geoReq;
+		    XtCallCallbackList(hookobj,
+			((HookObject)hookobj)->hooks.geometryhook_callbacks,
+			(XtPointer)&call_data);
+		    call_data.result = result =
+			_XtMakeGeometryRequest(w, &geoReq, &geoReply,
+					       &cleared_rect_obj);
+		    call_data.type = XtHpostGeometry;
+		    call_data.reply = &geoReply;
+		    XtCallCallbackList(hookobj,
+			((HookObject)hookobj)->hooks.geometryhook_callbacks,
+			(XtPointer)&call_data);
+		} else {
+		    result = _XtMakeGeometryRequest(w, &geoReq, &geoReply,
+						    &cleared_rect_obj);
+		}
+		if (result == XtGeometryYes || result == XtGeometryDone)
+		    break;
+
+		/* An Almost or No reply.  Call widget and let it munge
+		   request, reply */
+		LOCK_PROCESS;
+		set_values_almost = wc->core_class.set_values_almost;
+		UNLOCK_PROCESS;
+		if (set_values_almost == NULL) {
+		    XtAppWarningMsg(app,
+			    "invalidProcedure","set_values_almost",
+			  XtCXtToolkitError,
+			  "set_values_almost procedure shouldn't be NULL",
+			  (String *)NULL, (Cardinal *)NULL);
+		    break;
+		}
+		if (result == XtGeometryNo) geoReply.request_mode = 0;
+		CALLGEOTAT(_XtGeoTrace(w,"calling SetValuesAlmost.\n"));
+		(*set_values_almost) (oldw, w, &geoReq, &geoReply);
+	    } while (geoReq.request_mode != 0);
+	    /* call resize proc if we changed size and parent
+	     * didn't already invoke resize */
+	    {
+	    XtWidgetProc resize;
+	    LOCK_PROCESS;
+	    resize = wc->core_class.resize;
+	    UNLOCK_PROCESS;
+	    if ((w->core.width != oldw->core.width ||
+		 w->core.height != oldw->core.height)
+		&& result != XtGeometryDone
+		&& resize != (XtWidgetProc) NULL) {
+		CALLGEOTAT(_XtGeoTrace(w,
+				 "XtSetValues calls \"%s\"'s resize proc.\n",
+			       XtName(w)));
+		(*resize)(w);
+	      }
+	    }
+	    CALLGEOTAT(_XtGeoTab(-1));
+	}
+	/* Redisplay if needed.  No point in clearing if the window is
+	 * about to disappear, as the Expose event will just go straight
+	 * to the bit bucket. */
+        if (XtIsWidget(w)) {
+            /* widgets can distinguish between redisplay and resize, since
+             the server will cause an expose on resize */
+            if (redisplay && XtIsRealized(w) && !w->core.being_destroyed) {
+                CALLGEOTAT(_XtGeoTrace(w,
+				 "XtSetValues calls ClearArea on \"%s\".\n",
+			       XtName(w)));
+		XClearArea (XtDisplay(w), XtWindow(w), 0, 0, 0, 0, TRUE);
+	    }
+        } else { /*non-window object */
+	  if (redisplay && ! cleared_rect_obj ) {
+	      Widget pw = _XtWindowedAncestor(w);
+	      if (XtIsRealized(pw) && !pw->core.being_destroyed) {
+		  RectObj r = (RectObj)w;
+		  int bw2 = r->rectangle.border_width << 1;
+		  CALLGEOTAT(_XtGeoTrace(w,
+		   "XtSetValues calls ClearArea on \"%s\"'s parent \"%s\".\n",
+				 XtName(w),XtName(pw)));
+		  XClearArea (XtDisplay (pw), XtWindow (pw),
+			      r->rectangle.x, r->rectangle.y,
+			      r->rectangle.width + bw2,
+			      r->rectangle.height + bw2,TRUE);
+	      }
+	  }
+        }
+    }
+
+
+    /* Free dynamic storage */
+    if (constraintSize) {
+        XtStackFree(oldw->core.constraints, oldcCache);
+        XtStackFree(reqw->core.constraints, reqcCache);
+    }
+    XtStackFree((XtPointer)oldw, oldwCache);
+    XtStackFree((XtPointer)reqw, reqwCache);
+    UNLOCK_APP(app);
+} /* XtSetValues */
diff --git a/libXt/src/SetWMCW.c b/libXt/src/SetWMCW.c
new file mode 100644
index 000000000..679d6eb5e
--- /dev/null
+++ b/libXt/src/SetWMCW.c
@@ -0,0 +1,173 @@
+/* $Xorg: SetWMCW.c,v 1.4 2001/02/09 02:03:58 xorgcvs Exp $ */
+/* $XdotOrg: $
+ *
+ * Author:  Chris D. Peterson, MIT X Consortium
+ */
+
+/* Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
+
+/*
+
+Copyright 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <X11/Xatom.h>
+
+/*	Function Name: XtSetWMColormapWindows
+ *
+ *	Description: Sets the value of the WM_COLORMAP_WINDOWS
+ *                   property on a widget's window.
+ *
+ *	Arguments:  widget - specifies the widget on whose window the
+ *   		           - WM_COLORMAP_WINDOWS property will be stored.
+ *
+ *                  list - Specifies a list of widgets whose windows are to be
+ *		           listed in the WM_COLORMAP_WINDOWS property.
+ *                  count - Specifies the number of widgets in list.
+ *
+ *	Returns: none.
+ */
+
+void
+XtSetWMColormapWindows(
+    Widget widget,
+    Widget *list,
+    Cardinal count)
+{
+    Window *data;
+    Widget *checked, *top, *temp, hookobj;
+    Cardinal i, j, checked_count;
+    Boolean match;
+    Atom xa_wm_colormap_windows;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if ( !XtIsRealized(widget) || (count == 0) ) {
+	UNLOCK_APP(app);
+	return;
+    }
+
+    top = checked = (Widget *) __XtMalloc( (Cardinal) sizeof(Widget) * count);
+
+
+/*
+ * The specification calls for only adding the windows that have unique
+ * colormaps to the property to this function, so we will make a pass through
+ * the widget list removing all the widgets with non-unique colormaps.
+ *
+ * We will also remove any unrealized widgets from the list at this time.
+ */
+
+    for (checked_count = 0, i = 0; i < count; i++) {
+	if (!XtIsRealized(list[i])) continue;
+
+	*checked = list[i];
+	match = FALSE;
+
+/*
+ * Don't check first element for matching colormap since there is nothing
+ * to check it against.
+ */
+
+	if (checked != top)
+	    for (j = 0, temp = top; j < checked_count ; j++, temp++)
+		if ( (*temp)->core.colormap == (*checked)->core.colormap) {
+		    match = TRUE;
+		    break;
+		}
+
+/*
+ * If no colormap was found to match then add this widget to the linked list.
+ */
+
+	if (!match) {
+	    checked++;
+	    checked_count++;
+	}
+    }
+
+/*
+ * Now that we have the list of widgets we need to convert it to a list of
+ * windows and set the property.
+ */
+
+    data = (Window *) __XtMalloc( (Cardinal) sizeof(Window) * checked_count);
+
+    for ( i = 0 ; i < checked_count ; i++)
+	data[i] = XtWindow(top[i]);
+
+    xa_wm_colormap_windows = XInternAtom(XtDisplay(widget),
+					 "WM_COLORMAP_WINDOWS", FALSE);
+
+    XChangeProperty(XtDisplay(widget), XtWindow(widget),
+		    xa_wm_colormap_windows, XA_WINDOW, 32,
+		    PropModeReplace, (unsigned char *) data, (int) i);
+
+    hookobj = XtHooksOfDisplay(XtDisplay(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHsetWMColormapWindows;
+	call_data.widget = widget;
+	call_data.event_data = (XtPointer) list;
+	call_data.num_event_data = count;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+
+    XtFree( (char *) data);
+    XtFree( (char *) top);
+    UNLOCK_APP(app);
+}
diff --git a/libXt/src/Shell.c b/libXt/src/Shell.c
new file mode 100644
index 000000000..292777be0
--- /dev/null
+++ b/libXt/src/Shell.c
@@ -0,0 +1,3412 @@
+/* $Xorg: Shell.c,v 1.4 2001/02/09 02:03:58 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Shell.c,v 3.16tsi Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifndef DEFAULT_WM_TIMEOUT
+#define DEFAULT_WM_TIMEOUT 5000
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "Shell.h"
+#include "ShellP.h"
+#include "ShellI.h"
+#include "Vendor.h"
+#include "VendorP.h"
+#include <X11/Xatom.h>
+#include <X11/Xlocale.h>
+#include <X11/ICE/ICElib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef EDITRES
+#include <X11/Xmu/Editres.h>
+#endif
+
+/***************************************************************************
+ *
+ * Note: per the Xt spec, the Shell geometry management assumes in
+ * several places that there is only one managed child.  This is
+ * *not* a bug.  Any subclass that assumes otherwise is broken.
+ *
+ ***************************************************************************/
+
+#define BIGSIZE ((Dimension)32767)
+
+/***************************************************************************
+ *
+ * Default values for resource lists
+ *
+ ***************************************************************************/
+
+#ifdef CRAY
+void _XtShellDepth(Widget, int, XrmValue *);
+void _XtShellColormap(Widget, int, XrmValue *);
+void _XtShellAncestorSensitive(Widget, int, XrmValue *);
+void _XtTitleEncoding(Widget, int, XrmValue *);
+#else
+static void _XtShellDepth(Widget, int, XrmValue *);
+static void _XtShellColormap(Widget, int, XrmValue *);
+static void _XtShellAncestorSensitive(Widget, int, XrmValue *);
+static void _XtTitleEncoding(Widget, int, XrmValue *);
+#endif
+
+/***************************************************************************
+ *
+ * Shell class record
+ *
+ ***************************************************************************/
+
+#define Offset(x)	(XtOffsetOf(ShellRec, x))
+static XtResource shellResources[]=
+{
+	{XtNx, XtCPosition, XtRPosition, sizeof(Position),
+	    Offset(core.x), XtRImmediate, (XtPointer)BIGSIZE},
+	{XtNy, XtCPosition, XtRPosition, sizeof(Position),
+	    Offset(core.y), XtRImmediate, (XtPointer)BIGSIZE},
+	{ XtNdepth, XtCDepth, XtRInt, sizeof(int),
+	    Offset(core.depth), XtRCallProc, (XtPointer) _XtShellDepth},
+	{ XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap),
+	    Offset(core.colormap), XtRCallProc, (XtPointer) _XtShellColormap},
+	{ XtNancestorSensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
+	    Offset(core.ancestor_sensitive), XtRCallProc,
+	    (XtPointer) _XtShellAncestorSensitive},
+	{ XtNallowShellResize, XtCAllowShellResize, XtRBoolean,
+	    sizeof(Boolean), Offset(shell.allow_shell_resize),
+	    XtRImmediate, (XtPointer)False},
+	{ XtNgeometry, XtCGeometry, XtRString, sizeof(String),
+	    Offset(shell.geometry), XtRString, (XtPointer)NULL},
+	{ XtNcreatePopupChildProc, XtCCreatePopupChildProc, XtRFunction,
+	    sizeof(XtCreatePopupChildProc), Offset(shell.create_popup_child_proc),
+	    XtRFunction, NULL},
+	{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
+	    Offset(shell.save_under), XtRImmediate, (XtPointer)False},
+	{ XtNpopupCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	    Offset(shell.popup_callback), XtRCallback, (XtPointer) NULL},
+	{ XtNpopdownCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	    Offset(shell.popdown_callback), XtRCallback, (XtPointer) NULL},
+	{ XtNoverrideRedirect, XtCOverrideRedirect,
+	    XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
+	    XtRImmediate, (XtPointer)False},
+	{ XtNvisual, XtCVisual, XtRVisual, sizeof(Visual*),
+	    Offset(shell.visual), XtRImmediate, (XtPointer)CopyFromParent}
+};
+
+static void ClassPartInitialize(WidgetClass);
+static void Initialize(Widget, Widget, ArgList, Cardinal *);
+static void Realize(Widget, Mask *, XSetWindowAttributes *);
+static void Resize(Widget);
+static Boolean SetValues(Widget, Widget, Widget, ArgList , Cardinal *);
+static void GetValuesHook(Widget, ArgList, Cardinal*);
+static void ChangeManaged(Widget);
+static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry *, XtWidgetGeometry *);
+static XtGeometryResult RootGeometryManager(Widget gw, XtWidgetGeometry *request, XtWidgetGeometry *reply);
+static void Destroy(Widget);
+
+static ShellClassExtensionRec shellClassExtRec = {
+    NULL,
+    NULLQUARK,
+    XtShellExtensionVersion,
+    sizeof(ShellClassExtensionRec),
+    RootGeometryManager
+};
+
+externaldef(shellclassrec) ShellClassRec shellClassRec = {
+  {   /* Core */
+    /* superclass	  */	(WidgetClass) &compositeClassRec,
+    /* class_name	  */	"Shell",
+    /* size		  */	sizeof(ShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	ClassPartInitialize,
+    /* Class init'ed ?	  */	FALSE,
+    /* initialize	  */	Initialize,
+    /* initialize_notify  */	NULL,
+    /* realize		  */	Realize,
+    /* actions		  */	NULL,
+    /* num_actions	  */	0,
+    /* resources	  */	shellResources,
+    /* resource_count	  */	XtNumber(shellResources),
+    /* xrm_class	  */	NULLQUARK,
+    /* compress_motion	  */	FALSE,
+    /* compress_exposure  */	TRUE,
+    /* compress_enterleave*/	FALSE,
+    /* visible_interest	  */	FALSE,
+    /* destroy		  */	Destroy,
+    /* resize		  */	Resize,
+    /* expose		  */	NULL,
+    /* set_values	  */	SetValues,
+    /* set_values_hook	  */	NULL,
+    /* set_values_almost  */	XtInheritSetValuesAlmost,
+    /* get_values_hook	  */	GetValuesHook,
+    /* accept_focus	  */	NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets	  */	NULL,
+    /* tm_table		  */	NULL,
+    /* query_geometry	  */	NULL,
+    /* display_accelerator*/	NULL,
+    /* extension	  */	NULL
+  },{ /* Composite */
+    /* geometry_manager	  */	GeometryManager,
+    /* change_managed	  */	ChangeManaged,
+    /* insert_child	  */	XtInheritInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	  */	NULL
+  },{ /* Shell */
+    /* extension	  */	(XtPointer)&shellClassExtRec
+  }
+};
+
+externaldef(shellwidgetclass) WidgetClass shellWidgetClass = (WidgetClass) (&shellClassRec);
+
+/***************************************************************************
+ *
+ * OverrideShell class record
+ *
+ ***************************************************************************/
+
+static XtResource overrideResources[]=
+{
+	{ XtNoverrideRedirect, XtCOverrideRedirect,
+	    XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
+	    XtRImmediate, (XtPointer)True},
+	{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
+	    Offset(shell.save_under), XtRImmediate, (XtPointer)True},
+};
+
+externaldef(overrideshellclassrec) OverrideShellClassRec overrideShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &shellClassRec,
+    /* class_name         */    "OverrideShell",
+    /* size               */    sizeof(OverrideShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	NULL,
+    /* Class init'ed ?    */	FALSE,
+    /* initialize         */    NULL,
+    /* initialize_notify    */	NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    overrideResources,
+    /* resource_count     */	XtNumber(overrideResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/ 	FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    NULL,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    NULL,
+    /* set_values_hook      */	NULL,
+    /* set_values_almost    */	XtInheritSetValuesAlmost,
+    /* get_values_hook      */	NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table		    */  NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension	    */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child	  */	XtInheritInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  }
+};
+
+externaldef(overrideshellwidgetclass) WidgetClass overrideShellWidgetClass =
+	(WidgetClass) (&overrideShellClassRec);
+
+/***************************************************************************
+ *
+ * WMShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)	(XtOffsetOf(WMShellRec, x))
+
+static int default_unspecified_shell_int = XtUnspecifiedShellInt;
+/*
+ * Warning, casting XtUnspecifiedShellInt (which is -1) to an (XtPointer)
+ * can result is loss of bits on some machines (i.e. crays)
+ */
+
+static XtResource wmResources[]=
+{
+	{ XtNtitle, XtCTitle, XtRString, sizeof(String),
+	    Offset(wm.title), XtRString, NULL},
+	{ XtNtitleEncoding, XtCTitleEncoding, XtRAtom, sizeof(Atom),
+	    Offset(wm.title_encoding),
+	    XtRCallProc, (XtPointer) _XtTitleEncoding},
+	{ XtNwmTimeout, XtCWmTimeout, XtRInt, sizeof(int),
+	    Offset(wm.wm_timeout), XtRImmediate,(XtPointer)DEFAULT_WM_TIMEOUT},
+	{ XtNwaitForWm, XtCWaitForWm, XtRBoolean, sizeof(Boolean),
+	    Offset(wm.wait_for_wm), XtRImmediate, (XtPointer)True},
+	{ XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
+	    Offset(wm.transient), XtRImmediate, (XtPointer)False},
+/* size_hints minus things stored in core */
+	{ XtNbaseWidth, XtCBaseWidth, XtRInt, sizeof(int),
+	    Offset(wm.base_width),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNbaseHeight, XtCBaseHeight, XtRInt, sizeof(int),
+	    Offset(wm.base_height),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNwinGravity, XtCWinGravity, XtRGravity, sizeof(int),
+	    Offset(wm.win_gravity),
+	    XtRGravity, (XtPointer) &default_unspecified_shell_int},
+	{ XtNminWidth, XtCMinWidth, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.min_width),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNminHeight, XtCMinHeight, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.min_height),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNmaxWidth, XtCMaxWidth, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.max_width),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNmaxHeight, XtCMaxHeight, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.max_height),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNwidthInc, XtCWidthInc, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.width_inc),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNheightInc, XtCHeightInc, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.height_inc),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNminAspectX, XtCMinAspectX, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.min_aspect.x),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNminAspectY, XtCMinAspectY, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.min_aspect.y),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNmaxAspectX, XtCMaxAspectX, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.max_aspect.x),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNmaxAspectY, XtCMaxAspectY, XtRInt, sizeof(int),
+	    Offset(wm.size_hints.max_aspect.y),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+/* wm_hints */
+	{ XtNinput, XtCInput, XtRBool, sizeof(Bool),
+	    Offset(wm.wm_hints.input), XtRImmediate, (XtPointer)False},
+	{ XtNinitialState, XtCInitialState, XtRInitialState, sizeof(int),
+	    Offset(wm.wm_hints.initial_state),
+	    XtRImmediate, (XtPointer)NormalState},
+	{ XtNiconPixmap, XtCIconPixmap, XtRBitmap, sizeof(Pixmap),
+	    Offset(wm.wm_hints.icon_pixmap), XtRPixmap, NULL},
+	{ XtNiconWindow, XtCIconWindow, XtRWindow, sizeof(Window),
+	    Offset(wm.wm_hints.icon_window), XtRWindow,   (XtPointer) NULL},
+	{ XtNiconX, XtCIconX, XtRInt, sizeof(int),
+	    Offset(wm.wm_hints.icon_x),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNiconY, XtCIconY, XtRInt, sizeof(int),
+	    Offset(wm.wm_hints.icon_y),
+	    XtRInt, (XtPointer) &default_unspecified_shell_int},
+	{ XtNiconMask, XtCIconMask, XtRBitmap, sizeof(Pixmap),
+	    Offset(wm.wm_hints.icon_mask), XtRPixmap, NULL},
+	{ XtNwindowGroup, XtCWindowGroup, XtRWindow, sizeof(Window),
+	    Offset(wm.wm_hints.window_group),
+	    XtRImmediate, (XtPointer)XtUnspecifiedWindow},
+	{ XtNclientLeader, XtCClientLeader, XtRWidget, sizeof(Widget),
+	    Offset(wm.client_leader), XtRWidget, NULL},
+	{ XtNwindowRole, XtCWindowRole, XtRString, sizeof(String),
+	    Offset(wm.window_role), XtRString, (XtPointer) NULL},
+	{ XtNurgency, XtCUrgency, XtRBoolean, sizeof(Boolean),
+	    Offset(wm.urgency), XtRImmediate, (XtPointer) False}
+};
+
+static void WMInitialize(Widget, Widget, ArgList, Cardinal *);
+static Boolean WMSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void WMDestroy(Widget);
+
+externaldef(wmshellclassrec) WMShellClassRec wmShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &shellClassRec,
+    /* class_name         */    "WMShell",
+    /* size               */    sizeof(WMShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	NULL,
+    /* Class init'ed ?    */	FALSE,
+    /* initialize         */    WMInitialize,
+    /* initialize_notify    */	NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    wmResources,
+    /* resource_count     */	XtNumber(wmResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/	FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    WMDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    WMSetValues,
+    /* set_values_hook      */	NULL,
+    /* set_values_almost    */	XtInheritSetValuesAlmost,
+    /* get_values_hook      */	NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table		    */  NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension	    */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child	  */	XtInheritInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  }
+};
+
+externaldef(wmshellwidgetclass) WidgetClass wmShellWidgetClass = (WidgetClass) (&wmShellClassRec);
+
+/***************************************************************************
+ *
+ * TransientShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)	(XtOffsetOf(TransientShellRec, x))
+
+static XtResource transientResources[]=
+{
+	{ XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
+	    Offset(wm.transient), XtRImmediate, (XtPointer)True},
+	{ XtNtransientFor, XtCTransientFor, XtRWidget, sizeof(Widget),
+	    Offset(transient.transient_for), XtRWidget, NULL},
+	{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
+	    Offset(shell.save_under), XtRImmediate, (XtPointer)True},
+};
+
+static void TransientRealize(Widget, Mask *, XSetWindowAttributes *);
+static Boolean TransientSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+
+externaldef(transientshellclassrec) TransientShellClassRec transientShellClassRec = {
+  {
+    /* superclass	  */	(WidgetClass) &vendorShellClassRec,
+    /* class_name	  */	"TransientShell",
+    /* size		  */	sizeof(TransientShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	NULL,
+    /* Class init'ed ?	  */	FALSE,
+    /* initialize	  */	NULL,
+    /* initialize_notify  */	NULL,
+    /* realize		  */	TransientRealize,
+    /* actions		  */	NULL,
+    /* num_actions	  */	0,
+    /* resources	  */	transientResources,
+    /* resource_count	  */	XtNumber(transientResources),
+    /* xrm_class	  */	NULLQUARK,
+    /* compress_motion	  */	FALSE,
+    /* compress_exposure  */	TRUE,
+    /* compress_enterleave*/	FALSE,
+    /* visible_interest	  */	FALSE,
+    /* destroy		  */	NULL,
+    /* resize		  */	XtInheritResize,
+    /* expose		  */	NULL,
+    /* set_values	  */	TransientSetValues,
+    /* set_values_hook	  */	NULL,
+    /* set_values_almost  */	XtInheritSetValuesAlmost,
+    /* get_values_hook	  */	NULL,
+    /* accept_focus	  */	NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets	  */	NULL,
+    /* tm_table		  */	XtInheritTranslations,
+    /* query_geometry	  */	NULL,
+    /* display_accelerator*/	NULL,
+    /* extension	  */	NULL
+  },{
+    /* geometry_manager	  */	XtInheritGeometryManager,
+    /* change_managed	  */	XtInheritChangeManaged,
+    /* insert_child	  */	XtInheritInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  }
+};
+
+externaldef(transientshellwidgetclass) WidgetClass transientShellWidgetClass =
+	(WidgetClass) (&transientShellClassRec);
+
+/***************************************************************************
+ *
+ * TopLevelShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)	(XtOffsetOf(TopLevelShellRec, x))
+
+static XtResource topLevelResources[]=
+{
+	{ XtNiconName, XtCIconName, XtRString, sizeof(String),
+	    Offset(topLevel.icon_name), XtRString, (XtPointer) NULL},
+	{ XtNiconNameEncoding, XtCIconNameEncoding, XtRAtom, sizeof(Atom),
+	    Offset(topLevel.icon_name_encoding),
+	    XtRCallProc, (XtPointer) _XtTitleEncoding},
+	{ XtNiconic, XtCIconic, XtRBoolean, sizeof(Boolean),
+	    Offset(topLevel.iconic), XtRImmediate, (XtPointer)False}
+};
+
+static void TopLevelInitialize(Widget, Widget, ArgList, Cardinal *);
+static Boolean TopLevelSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void TopLevelDestroy(Widget);
+
+externaldef(toplevelshellclassrec) TopLevelShellClassRec topLevelShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &vendorShellClassRec,
+    /* class_name         */    "TopLevelShell",
+    /* size               */    sizeof(TopLevelShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	NULL,
+    /* Class init'ed ?    */	FALSE,
+    /* initialize         */    TopLevelInitialize,
+    /* initialize_notify    */	NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    topLevelResources,
+    /* resource_count     */	XtNumber(topLevelResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/ 	FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    TopLevelDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    TopLevelSetValues,
+    /* set_values_hook      */	NULL,
+    /* set_values_almost    */	XtInheritSetValuesAlmost,
+    /* get_values_hook      */	NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table		    */  XtInheritTranslations,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension	    */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child	  */	XtInheritInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  }
+};
+
+externaldef(toplevelshellwidgetclass) WidgetClass topLevelShellWidgetClass =
+	(WidgetClass) (&topLevelShellClassRec);
+
+/***************************************************************************
+ *
+ * ApplicationShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)	(XtOffsetOf(ApplicationShellRec, x))
+
+static XtResource applicationResources[]=
+{
+    {XtNargc, XtCArgc, XtRInt, sizeof(int),
+	  Offset(application.argc), XtRImmediate, (XtPointer)0},
+    {XtNargv, XtCArgv, XtRStringArray, sizeof(String*),
+	  Offset(application.argv), XtRPointer, (XtPointer) NULL}
+};
+#undef Offset
+
+static void ApplicationInitialize(Widget, Widget, ArgList, Cardinal *);
+static void ApplicationDestroy(Widget);
+static Boolean ApplicationSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+static void ApplicationShellInsertChild(Widget);
+
+static CompositeClassExtensionRec compositeClassExtension = {
+    /* next_extension	*/	NULL,
+    /* record_type	*/	NULLQUARK,
+    /* version		*/	XtCompositeExtensionVersion,
+    /* record_size	*/	sizeof(CompositeClassExtensionRec),
+    /* accepts_objects	*/	TRUE,
+    /* allows_change_managed_set */ FALSE
+};
+
+
+externaldef(applicationshellclassrec) ApplicationShellClassRec applicationShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &topLevelShellClassRec,
+    /* class_name         */    "ApplicationShell",
+    /* size               */    sizeof(ApplicationShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	NULL,
+    /* Class init'ed ?    */	FALSE,
+    /* initialize         */    ApplicationInitialize,
+    /* initialize_notify  */	NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    applicationResources,
+    /* resource_count     */	XtNumber(applicationResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/    FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    ApplicationDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    ApplicationSetValues,
+    /* set_values_hook    */	NULL,
+    /* set_values_almost  */	XtInheritSetValuesAlmost,
+    /* get_values_hook    */	NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table		  */	XtInheritTranslations,
+    /* query_geometry	  */	NULL,
+    /* display_accelerator*/	NULL,
+    /* extension	  */	NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child	  */	ApplicationShellInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	  */	(XtPointer)&compositeClassExtension
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  }
+};
+
+externaldef(applicationshellwidgetclass) WidgetClass applicationShellWidgetClass =
+	(WidgetClass) (&applicationShellClassRec);
+
+/***************************************************************************
+ *
+ * SessionShell class record
+ *
+ ***************************************************************************/
+
+#undef Offset
+#define Offset(x)	(XtOffsetOf(SessionShellRec, x))
+
+static XtResource sessionResources[]=
+{
+#ifndef XT_NO_SM
+ {XtNconnection, XtCConnection, XtRSmcConn, sizeof(SmcConn),
+       Offset(session.connection), XtRSmcConn, (XtPointer) NULL},
+#endif
+ {XtNsessionID, XtCSessionID, XtRString, sizeof(String),
+       Offset(session.session_id), XtRString, (XtPointer) NULL},
+ {XtNrestartCommand, XtCRestartCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.restart_command), XtRPointer, (XtPointer) NULL},
+ {XtNcloneCommand, XtCCloneCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.clone_command), XtRPointer, (XtPointer) NULL},
+ {XtNdiscardCommand, XtCDiscardCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.discard_command), XtRPointer, (XtPointer) NULL},
+ {XtNresignCommand, XtCResignCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.resign_command), XtRPointer, (XtPointer) NULL},
+ {XtNshutdownCommand, XtCShutdownCommand, XtRCommandArgArray, sizeof(String*),
+       Offset(session.shutdown_command), XtRPointer, (XtPointer) NULL},
+ {XtNenvironment, XtCEnvironment, XtREnvironmentArray, sizeof(String*),
+       Offset(session.environment), XtRPointer, (XtPointer) NULL},
+ {XtNcurrentDirectory, XtCCurrentDirectory, XtRDirectoryString, sizeof(String),
+       Offset(session.current_dir), XtRString, (XtPointer) NULL},
+ {XtNprogramPath, XtCProgramPath, XtRString, sizeof(String),
+      Offset(session.program_path), XtRString, (XtPointer) NULL},
+ {XtNrestartStyle, XtCRestartStyle, XtRRestartStyle, sizeof(unsigned char),
+      Offset(session.restart_style), XtRImmediate,
+      (XtPointer) SmRestartIfRunning},
+ {XtNjoinSession, XtCJoinSession, XtRBoolean, sizeof(Boolean),
+       Offset(session.join_session), XtRImmediate, (XtPointer) True},
+ {XtNsaveCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.save_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNinteractCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.interact_callbacks), XtRCallback, (XtPointer)NULL},
+ {XtNcancelCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.cancel_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNsaveCompleteCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.save_complete_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNdieCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.die_callbacks), XtRCallback, (XtPointer) NULL},
+ {XtNerrorCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+       Offset(session.error_callbacks), XtRCallback, (XtPointer) NULL}
+};
+#undef Offset
+
+static void SessionInitialize(Widget, Widget, ArgList, Cardinal *);
+static void SessionDestroy(Widget);
+static Boolean SessionSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+
+static CompositeClassExtensionRec sessionCompositeClassExtension = {
+    /* next_extension	*/	NULL,
+    /* record_type	*/	NULLQUARK,
+    /* version		*/	XtCompositeExtensionVersion,
+    /* record_size	*/	sizeof(CompositeClassExtensionRec),
+    /* accepts_objects	*/	TRUE,
+    /* allows_change_managed_set */ FALSE
+};
+
+
+externaldef(sessionshellclassrec) SessionShellClassRec sessionShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &applicationShellClassRec,
+    /* class_name         */    "SessionShell",
+    /* size               */    sizeof(SessionShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	NULL,
+    /* Class init'ed ?    */	FALSE,
+    /* initialize         */    SessionInitialize,
+    /* initialize_notify  */	NULL,
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    sessionResources,
+    /* resource_count     */	XtNumber(sessionResources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/    FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    SessionDestroy,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    SessionSetValues,
+    /* set_values_hook    */	NULL,
+    /* set_values_almost  */	XtInheritSetValuesAlmost,
+    /* get_values_hook    */	NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table		  */	XtInheritTranslations,
+    /* query_geometry	  */	NULL,
+    /* display_accelerator*/	NULL,
+    /* extension	  */	NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child	  */	XtInheritInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	  */	(XtPointer)&sessionCompositeClassExtension
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension	  */	NULL
+  },{
+    /* extension          */    NULL
+  }
+};
+
+externaldef(sessionshellwidgetclass) WidgetClass sessionShellWidgetClass =
+	(WidgetClass) (&sessionShellClassRec);
+
+/****************************************************************************
+ * Whew!
+ ****************************************************************************/
+
+static void ComputeWMSizeHints(
+    WMShellWidget w,
+    XSizeHints *hints)
+{
+    register long flags;
+    hints->flags = flags = w->wm.size_hints.flags;
+#define copy(field) hints->field = w->wm.size_hints.field
+    if (flags & (USPosition | PPosition)) {
+	copy(x);
+	copy(y);
+    }
+    if (flags & (USSize | PSize)) {
+	copy(width);
+	copy(height);
+    }
+    if (flags & PMinSize) {
+	copy(min_width);
+	copy(min_height);
+    }
+    if (flags & PMaxSize) {
+	copy(max_width);
+	copy(max_height);
+    }
+    if (flags & PResizeInc) {
+	copy(width_inc);
+	copy(height_inc);
+    }
+    if (flags & PAspect) {
+	copy(min_aspect.x);
+	copy(min_aspect.y);
+	copy(max_aspect.x);
+	copy(max_aspect.y);
+    }
+#undef copy
+#define copy(field) hints->field = w->wm.field
+    if (flags & PBaseSize) {
+	copy(base_width);
+	copy(base_height);
+    }
+    if (flags & PWinGravity)
+	copy(win_gravity);
+#undef copy
+}
+
+static void _SetWMSizeHints(
+    WMShellWidget w)
+{
+    XSizeHints *size_hints = XAllocSizeHints();
+
+    if (size_hints == NULL) _XtAllocError("XAllocSizeHints");
+    ComputeWMSizeHints(w, size_hints);
+    XSetWMNormalHints(XtDisplay((Widget)w), XtWindow((Widget)w), size_hints);
+    XFree((char*)size_hints);
+}
+
+static ShellClassExtension _FindClassExtension(
+    WidgetClass widget_class)
+{
+    ShellClassExtension ext;
+    for (ext = (ShellClassExtension)((ShellWidgetClass)widget_class)
+	       ->shell_class.extension;
+	 ext != NULL && ext->record_type != NULLQUARK;
+	 ext = (ShellClassExtension)ext->next_extension);
+
+    if (ext != NULL) {
+	if (  ext->version == XtShellExtensionVersion
+	      && ext->record_size == sizeof(ShellClassExtensionRec)) {
+	    /* continue */
+	} else {
+	    String params[1];
+	    Cardinal num_params = 1;
+	    params[0] = widget_class->core_class.class_name;
+	    XtErrorMsg( "invalidExtension", "shellClassPartInitialize",
+		        XtCXtToolkitError,
+		 "widget class %s has invalid ShellClassExtension record",
+		 params, &num_params);
+	}
+    }
+    return ext;
+}
+
+static void ClassPartInitialize(WidgetClass widget_class)
+{
+    ShellClassExtension ext = _FindClassExtension(widget_class);
+    if (ext != NULL) {
+	if (ext->root_geometry_manager == XtInheritRootGeometryManager) {
+	    ext->root_geometry_manager =
+		_FindClassExtension(widget_class->core_class.superclass)
+		    ->root_geometry_manager;
+	}
+    } else {
+	/* if not found, spec requires XtInheritRootGeometryManager */
+	XtPointer *extP
+	    = &((ShellWidgetClass)widget_class)->shell_class.extension;
+	ext = XtNew(ShellClassExtensionRec);
+	(void) memmove((char*)ext,
+		       (char*)_FindClassExtension(widget_class->core_class.superclass),
+		       sizeof(ShellClassExtensionRec));
+	ext->next_extension = *extP;
+	*extP = (XtPointer)ext;
+    }
+}
+
+
+static void EventHandler(Widget wid, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
+static void _popup_set_prop(ShellWidget);
+
+
+/*ARGSUSED*/
+static void XtCopyDefaultDepth(
+    Widget      widget,
+    int		offset,
+    XrmValue    *value)
+{
+    value->addr = (XPointer)(&DefaultDepthOfScreen(XtScreenOfObject(widget)));
+}
+
+#ifndef CRAY
+static
+#endif
+void _XtShellDepth(
+    Widget widget,
+    int closure,
+    XrmValue *value)
+{
+   if (widget->core.parent == NULL) XtCopyDefaultDepth(widget,closure,value);
+   else _XtCopyFromParent (widget,closure,value);
+}
+
+/*ARGSUSED*/
+static void XtCopyDefaultColormap(
+    Widget      widget,
+    int		offset,
+    XrmValue    *value)
+{
+    value->addr = (XPointer)(&DefaultColormapOfScreen(XtScreenOfObject(widget)));
+}
+
+#ifndef CRAY
+static
+#endif
+void _XtShellColormap(
+    Widget widget,
+    int closure,
+    XrmValue *value)
+{
+   if (widget->core.parent == NULL)
+	   XtCopyDefaultColormap(widget,closure,value);
+   else _XtCopyFromParent (widget,closure,value);
+}
+
+#ifndef CRAY
+static
+#endif
+void _XtShellAncestorSensitive(
+    Widget widget,
+    int closure,
+    XrmValue *value)
+{
+   static Boolean true = True;
+   if (widget->core.parent == NULL) value->addr = (XPointer)(&true);
+   else _XtCopyFromParent (widget,closure,value);
+}
+
+/*ARGSUSED*/
+#ifndef CRAY
+static
+#endif
+void _XtTitleEncoding(
+    Widget widget,
+    int offset,
+    XrmValue *value)
+{
+    static Atom atom;
+    if (XtWidgetToApplicationContext(widget)->langProcRec.proc) atom = None;
+    else atom = XA_STRING;
+    value->addr = (XPointer) &atom;
+}
+
+
+/* ARGSUSED */
+static void Initialize(
+	Widget req,
+	Widget new,
+	ArgList args,		/* unused */
+	Cardinal *num_args)	/* unused */
+{
+	ShellWidget w = (ShellWidget) new;
+
+	w->shell.popped_up = FALSE;
+	w->shell.client_specified =
+	    _XtShellNotReparented | _XtShellPositionValid;
+
+	if (w->core.x == BIGSIZE) {
+	    w->core.x = 0;
+	    if (w->core.y == BIGSIZE) w->core.y = 0;
+	} else {
+	    if (w->core.y == BIGSIZE) w->core.y = 0;
+	    else w->shell.client_specified |= _XtShellPPositionOK;
+	}
+
+	XtAddEventHandler(new, (EventMask) StructureNotifyMask,
+		TRUE, EventHandler, (XtPointer) NULL);
+
+#ifdef EDITRES
+	XtAddEventHandler(new, (EventMask) 0, TRUE,
+			  _XEditResCheckMessages, NULL);
+#endif
+}
+
+/* ARGSUSED */
+static void WMInitialize(
+	Widget req, Widget new,
+	ArgList args,		/* unused */
+	Cardinal *num_args)	/* unused */
+{
+	WMShellWidget w = (WMShellWidget) new;
+	TopLevelShellWidget tls = (TopLevelShellWidget) new;	/* maybe */
+
+	if(w->wm.title == NULL) {
+	    if (XtIsTopLevelShell(new) &&
+		    tls->topLevel.icon_name != NULL &&
+		    strlen(tls->topLevel.icon_name) != 0) {
+		w->wm.title = XtNewString(tls->topLevel.icon_name);
+	    } else {
+		w->wm.title = XtNewString(w->core.name);
+	    }
+	} else {
+	    w->wm.title = XtNewString(w->wm.title);
+	}
+	w->wm.size_hints.flags = 0;
+	w->wm.wm_hints.flags = 0;
+	if (w->wm.window_role)
+	    w->wm.window_role = XtNewString(w->wm.window_role);
+}
+
+
+/* ARGSUSED */
+static void TopLevelInitialize(
+	Widget req, Widget new,
+	ArgList args,		/* unused */
+	Cardinal *num_args)	/* unused */
+{
+	TopLevelShellWidget w = (TopLevelShellWidget) new;
+
+	if (w->topLevel.icon_name == NULL) {
+	    w->topLevel.icon_name = XtNewString(w->core.name);
+	} else {
+	    w->topLevel.icon_name = XtNewString(w->topLevel.icon_name);
+	}
+
+	if (w->topLevel.iconic)
+	    w->wm.wm_hints.initial_state = IconicState;
+}
+
+static String *NewArgv(int, String *);
+static String *NewStringArray(String *);
+static void FreeStringArray(String *);
+
+/* ARGSUSED */
+static void ApplicationInitialize(
+    Widget req, Widget new,
+    ArgList args,		/* unused */
+    Cardinal *num_args)		/* unused */
+{
+    ApplicationShellWidget w = (ApplicationShellWidget)new;
+
+    if (w->application.argc > 0)
+	w->application.argv = NewArgv(w->application.argc,
+				      w->application.argv);
+}
+
+#define XtSaveInactive 0
+#define XtSaveActive   1
+#define XtInteractPending    2
+#define XtInteractActive     3
+
+#define XtCloneCommandMask	(1L<<0)
+#define XtCurrentDirectoryMask	(1L<<1)
+#define XtDiscardCommandMask	(1L<<2)
+#define XtEnvironmentMask	(1L<<3)
+#define XtProgramMask		(1L<<4)
+#define XtResignCommandMask	(1L<<5)
+#define XtRestartCommandMask	(1L<<6)
+#define XtRestartStyleHintMask	(1L<<7)
+#define XtShutdownCommandMask	(1L<<8)
+
+static void JoinSession(SessionShellWidget);
+static void SetSessionProperties(SessionShellWidget, Boolean, unsigned long, unsigned long);
+static void StopManagingSession(SessionShellWidget, SmcConn);
+
+typedef struct _XtSaveYourselfRec {
+    XtSaveYourself next;
+    int            save_type;
+    int            interact_style;
+    Boolean        shutdown;
+    Boolean        fast;
+    Boolean        cancel_shutdown;
+    int		   phase;
+    int            interact_dialog_type;
+    Boolean	   request_cancel;
+    Boolean	   request_next_phase;
+    Boolean        save_success;
+    int            save_tokens;
+    int            interact_tokens;
+} XtSaveYourselfRec;
+
+/* ARGSUSED */
+static void SessionInitialize(
+    Widget req, Widget new,
+    ArgList args,		/* unused */
+    Cardinal *num_args)		/* unused */
+{
+#ifndef XT_NO_SM
+    SessionShellWidget w = (SessionShellWidget)new;
+
+    if (w->session.session_id) w->session.session_id =
+	XtNewString(w->session.session_id);
+    if (w->session.restart_command) w->session.restart_command =
+	NewStringArray(w->session.restart_command);
+    if (w->session.clone_command) w->session.clone_command =
+	NewStringArray(w->session.clone_command);
+    if (w->session.discard_command) w->session.discard_command =
+	NewStringArray(w->session.discard_command);
+    if (w->session.resign_command) w->session.resign_command =
+	NewStringArray(w->session.resign_command);
+    if (w->session.shutdown_command) w->session.shutdown_command =
+	NewStringArray(w->session.shutdown_command);
+    if (w->session.environment) w->session.environment =
+	NewStringArray(w->session.environment);
+    if (w->session.current_dir) w->session.current_dir =
+	XtNewString(w->session.current_dir);
+    if (w->session.program_path) w->session.program_path =
+	XtNewString(w->session.program_path);
+
+    w->session.checkpoint_state = XtSaveInactive;
+    w->session.input_id = 0;
+    w->session.save = NULL;
+
+    if ((w->session.join_session) &&
+	(w->application.argv || w->session.restart_command))
+	JoinSession(w);
+
+    if (w->session.connection)
+	SetSessionProperties(w, True, 0L, 0L);
+#endif /* !XT_NO_SM */
+}
+
+static void Resize(
+    Widget w)
+{
+    register ShellWidget sw = (ShellWidget)w;
+    Widget childwid;
+    Cardinal i;
+    for(i = 0; i < sw->composite.num_children; i++) {
+        if (XtIsManaged(sw->composite.children[i])) {
+             childwid = sw->composite.children[i];
+             XtResizeWidget(childwid, sw->core.width, sw->core.height,
+                           childwid->core.border_width);
+	     break;		/* can only be one managed child */
+        }
+    }
+}
+
+static void GetGeometry(Widget, Widget);
+
+static void Realize(
+	Widget wid,
+	Mask *vmask,
+	XSetWindowAttributes *attr)
+{
+	ShellWidget w = (ShellWidget) wid;
+        Mask mask = *vmask;
+
+	if (! (w->shell.client_specified & _XtShellGeometryParsed)) {
+	    /* we'll get here only if there was no child the first
+	       time we were realized.  If the shell was Unrealized
+	       and then re-Realized, we probably don't want to
+	       re-evaluate the defaults anyway.
+	     */
+	    GetGeometry(wid, (Widget)NULL);
+	}
+	else if (w->core.background_pixmap == XtUnspecifiedPixmap) {
+	    /* I attempt to inherit my child's background to avoid screen flash
+	     * if there is latency between when I get resized and when my child
+	     * is resized.  Background=None is not satisfactory, as I want the
+	     * user to get immediate feedback on the new dimensions (most
+	     * particularly in the case of a non-reparenting wm).  It is
+	     * especially important to have the server clear any old cruft
+	     * from the display when I am resized larger.
+	     */
+	    register Widget *childP = w->composite.children;
+	    int i;
+	    for (i = w->composite.num_children; i; i--, childP++) {
+		if (XtIsWidget(*childP) && XtIsManaged(*childP)) {
+		    if ((*childP)->core.background_pixmap
+			    != XtUnspecifiedPixmap) {
+			mask &= ~(CWBackPixel);
+			mask |= CWBackPixmap;
+			attr->background_pixmap =
+			    w->core.background_pixmap =
+				(*childP)->core.background_pixmap;
+		    } else {
+			attr->background_pixel =
+			    w->core.background_pixel =
+				(*childP)->core.background_pixel;
+		    }
+		    break;
+		}
+	    }
+	}
+
+	if(w->shell.save_under) {
+		mask |= CWSaveUnder;
+		attr->save_under = TRUE;
+	}
+	if(w->shell.override_redirect) {
+		mask |= CWOverrideRedirect;
+		attr->override_redirect = TRUE;
+	}
+	if (wid->core.width == 0 || wid->core.height == 0) {
+	    Cardinal count = 1;
+	    XtErrorMsg("invalidDimension", "shellRealize", XtCXtToolkitError,
+		       "Shell widget %s has zero width and/or height",
+		       &wid->core.name, &count);
+	}
+	wid->core.window = XCreateWindow(XtDisplay(wid),
+		wid->core.screen->root, (int)wid->core.x, (int)wid->core.y,
+		(unsigned int)wid->core.width, (unsigned int)wid->core.height,
+		(unsigned int)wid->core.border_width, (int) wid->core.depth,
+		(unsigned int) InputOutput, w->shell.visual,
+		mask, attr);
+
+	_popup_set_prop(w);
+}
+
+
+static void _SetTransientForHint(
+     TransientShellWidget w,
+     Boolean delete)
+{
+    Window window_group;
+
+    if (w->wm.transient) {
+	if (w->transient.transient_for != NULL
+	    && XtIsRealized(w->transient.transient_for))
+	    window_group = XtWindow(w->transient.transient_for);
+	else if ((window_group = w->wm.wm_hints.window_group)
+		 == XtUnspecifiedWindowGroup) {
+	    if (delete)
+		XDeleteProperty( XtDisplay((Widget)w),
+				 XtWindow((Widget)w),
+				 XA_WM_TRANSIENT_FOR
+				);
+	    return;
+	}
+
+	XSetTransientForHint( XtDisplay((Widget)w),
+			      XtWindow((Widget)w),
+			      window_group
+			     );
+    }
+}
+
+
+static void TransientRealize(
+     Widget w,
+     Mask *vmask,
+     XSetWindowAttributes *attr)
+{
+    XtRealizeProc realize;
+
+    LOCK_PROCESS;
+    realize =
+	transientShellWidgetClass->core_class.superclass->core_class.realize;
+    UNLOCK_PROCESS;
+    (*realize) (w, vmask, attr);
+
+    _SetTransientForHint((TransientShellWidget)w, False);
+}
+
+static Widget GetClientLeader(
+    Widget w)
+{
+    while ((! XtIsWMShell(w) || ! ((WMShellWidget)w)->wm.client_leader)
+	   && w->core.parent)
+	w = w->core.parent;
+
+    /* ASSERT: w is a WMshell with client_leader set, or w has no parent */
+
+    if (XtIsWMShell(w) && ((WMShellWidget)w)->wm.client_leader)
+	w = ((WMShellWidget)w)->wm.client_leader;
+    return w;
+}
+
+static void EvaluateWMHints(
+    WMShellWidget w)
+{
+	XWMHints *hintp = &w->wm.wm_hints;
+
+	hintp->flags = StateHint | InputHint;
+
+	if (hintp->icon_x == XtUnspecifiedShellInt)
+	    hintp->icon_x = -1;
+	else
+	    hintp->flags |= IconPositionHint;
+
+	if (hintp->icon_y == XtUnspecifiedShellInt)
+	    hintp->icon_y = -1;
+	else
+	    hintp->flags |= IconPositionHint;
+
+	if (hintp->icon_pixmap != None) hintp->flags |= IconPixmapHint;
+	if (hintp->icon_mask != None)   hintp->flags |= IconMaskHint;
+	if (hintp->icon_window != None) hintp->flags |= IconWindowHint;
+
+	if (hintp->window_group == XtUnspecifiedWindow) {
+	    if(w->core.parent) {
+		Widget p;
+		for (p = w->core.parent; p->core.parent; p = p->core.parent);
+		if (XtIsRealized(p)) {
+		    hintp->window_group = XtWindow(p);
+		    hintp->flags |=  WindowGroupHint;
+		}
+	    }
+	} else if (hintp->window_group != XtUnspecifiedWindowGroup)
+	    hintp->flags |=  WindowGroupHint;
+
+	if (w->wm.urgency) hintp->flags |= XUrgencyHint;
+}
+
+
+static void EvaluateSizeHints(
+    WMShellWidget w)
+{
+	struct _OldXSizeHints *sizep = &w->wm.size_hints;
+
+	sizep->x = w->core.x;
+	sizep->y = w->core.y;
+	sizep->width = w->core.width;
+	sizep->height = w->core.height;
+
+	if (sizep->flags & USSize) {
+	    if (sizep->flags & PSize) sizep->flags &= ~PSize;
+	} else
+	    sizep->flags |= PSize;
+
+	if (sizep->flags & USPosition) {
+	    if (sizep->flags & PPosition) sizep->flags &= ~PPosition;
+	} else if (w->shell.client_specified & _XtShellPPositionOK)
+	    sizep->flags |= PPosition;
+
+	if (sizep->min_aspect.x != XtUnspecifiedShellInt
+	    || sizep->min_aspect.y != XtUnspecifiedShellInt
+	    || sizep->max_aspect.x != XtUnspecifiedShellInt
+	    || sizep->max_aspect.y != XtUnspecifiedShellInt) {
+	    sizep->flags |= PAspect;
+	}
+	if (sizep->flags & PBaseSize
+	    || w->wm.base_width != XtUnspecifiedShellInt
+	    || w->wm.base_height != XtUnspecifiedShellInt) {
+	    sizep->flags |= PBaseSize;
+	    if (w->wm.base_width == XtUnspecifiedShellInt)
+		w->wm.base_width = 0;
+	    if (w->wm.base_height == XtUnspecifiedShellInt)
+		w->wm.base_height = 0;
+	}
+	if (sizep->flags & PResizeInc
+	    || sizep->width_inc != XtUnspecifiedShellInt
+	    || sizep->height_inc != XtUnspecifiedShellInt) {
+	    if (sizep->width_inc < 1) sizep->width_inc = 1;
+	    if (sizep->height_inc < 1) sizep->height_inc = 1;
+	    sizep->flags |= PResizeInc;
+	}
+	if (sizep->flags & PMaxSize
+	    || sizep->max_width != XtUnspecifiedShellInt
+	    || sizep->max_height != XtUnspecifiedShellInt) {
+	    sizep->flags |= PMaxSize;
+	    if (sizep->max_width == XtUnspecifiedShellInt)
+		sizep->max_width = BIGSIZE;
+	    if (sizep->max_height == XtUnspecifiedShellInt)
+		sizep->max_height = BIGSIZE;
+	}
+	if (sizep->flags & PMinSize
+	    || sizep->min_width != XtUnspecifiedShellInt
+	    || sizep->min_height != XtUnspecifiedShellInt) {
+	    sizep->flags |= PMinSize;
+	    if (sizep->min_width == XtUnspecifiedShellInt)
+		sizep->min_width = 1;
+	    if (sizep->min_height == XtUnspecifiedShellInt)
+		sizep->min_height = 1;
+	}
+}
+
+static void _popup_set_prop(
+	ShellWidget w)
+{
+	Widget p;
+	WMShellWidget wmshell = (WMShellWidget) w;
+	TopLevelShellWidget tlshell = (TopLevelShellWidget) w;
+	ApplicationShellWidget appshell = (ApplicationShellWidget) w;
+	XTextProperty icon_name;
+	XTextProperty window_name;
+	char **argv;
+	int argc;
+	XSizeHints *size_hints;
+	Window window_group;
+	XClassHint classhint;
+	Boolean copied_iname, copied_wname;
+
+	if (!XtIsWMShell((Widget)w) || w->shell.override_redirect) return;
+
+	if ((size_hints = XAllocSizeHints()) == NULL)
+	    _XtAllocError("XAllocSizeHints");
+
+	copied_iname = copied_wname = False;
+        if (wmshell->wm.title_encoding == None &&
+	    XmbTextListToTextProperty(XtDisplay((Widget)w),
+				      (char**)&wmshell->wm.title,
+				      1, XStdICCTextStyle,
+				      &window_name) >= Success) {
+	    copied_wname = True;
+	} else {
+	    window_name.value = (unsigned char*)wmshell->wm.title;
+	    window_name.encoding = wmshell->wm.title_encoding ?
+		wmshell->wm.title_encoding : XA_STRING;
+	    window_name.format = 8;
+	    window_name.nitems = strlen((char *)window_name.value);
+	}
+
+	if (XtIsTopLevelShell((Widget)w)) {
+            if (tlshell->topLevel.icon_name_encoding == None &&
+		XmbTextListToTextProperty(XtDisplay((Widget)w),
+					  (char**)&tlshell->topLevel.icon_name,
+					  1, XStdICCTextStyle,
+					  &icon_name) >= Success) {
+		copied_iname = True;
+	    } else {
+		icon_name.value = (unsigned char*)tlshell->topLevel.icon_name;
+		icon_name.encoding = tlshell->topLevel.icon_name_encoding ?
+		    tlshell->topLevel.icon_name_encoding : XA_STRING;
+		icon_name.format = 8;
+		icon_name.nitems = strlen((char *)icon_name.value);
+	    }
+	}
+
+	EvaluateWMHints(wmshell);
+	EvaluateSizeHints(wmshell);
+	ComputeWMSizeHints(wmshell, size_hints);
+
+	if (wmshell->wm.transient
+	    && !XtIsTransientShell((Widget)w)
+	    && (window_group = wmshell->wm.wm_hints.window_group)
+	       != XtUnspecifiedWindowGroup) {
+
+	    XSetTransientForHint(XtDisplay((Widget)w),
+				 XtWindow((Widget)w),
+				 window_group
+				 );
+	}
+
+	classhint.res_name = w->core.name;
+	/* For the class, look up to the top of the tree */
+	for (p = (Widget)w; p->core.parent != NULL; p = p->core.parent);
+	if (XtIsApplicationShell(p)) {
+	    classhint.res_class =
+		((ApplicationShellWidget)p)->application.class;
+	} else {
+	    LOCK_PROCESS;
+	    classhint.res_class = XtClass(p)->core_class.class_name;
+	    UNLOCK_PROCESS;
+	}
+
+	if (XtIsApplicationShell((Widget)w)
+	    && (argc = appshell->application.argc) != -1)
+	    argv = (char**)appshell->application.argv;
+	else {
+	    argv = NULL;
+	    argc = 0;
+	}
+
+	XSetWMProperties(XtDisplay((Widget)w), XtWindow((Widget)w),
+			 &window_name,
+			 (XtIsTopLevelShell((Widget)w)) ? &icon_name : NULL,
+			 argv, argc,
+			 size_hints,
+			 &wmshell->wm.wm_hints,
+			 &classhint);
+	XFree((char*)size_hints);
+	if (copied_wname)
+	    XFree((XPointer)window_name.value);
+	if (copied_iname)
+	    XFree((XPointer)icon_name.value);
+
+	LOCK_PROCESS;
+	if (XtWidgetToApplicationContext((Widget)w)->langProcRec.proc) {
+	    char *locale = setlocale(LC_CTYPE, (char *)NULL);
+	    if (locale)
+		XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+				XInternAtom(XtDisplay((Widget)w),
+					    "WM_LOCALE_NAME", False),
+				XA_STRING, 8, PropModeReplace,
+				(unsigned char *)locale, strlen(locale));
+	}
+	UNLOCK_PROCESS;
+
+	p = GetClientLeader((Widget)w);
+	if (XtWindow(p))
+	    XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+			    XInternAtom(XtDisplay((Widget)w),
+					"WM_CLIENT_LEADER", False),
+			    XA_WINDOW, 32, PropModeReplace,
+			    (unsigned char *)(&(p->core.window)), 1);
+#ifndef XT_NO_SM
+	if (p == (Widget) w) {
+	    for ( ; p->core.parent != NULL; p = p->core.parent);
+	    if (XtIsSubclass(p, sessionShellWidgetClass)) {
+		String sm_client_id =
+		    ((SessionShellWidget)p)->session.session_id;
+		if (sm_client_id != NULL) {
+		    XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+				    XInternAtom(XtDisplay((Widget)w),
+						"SM_CLIENT_ID", False),
+				    XA_STRING, 8, PropModeReplace,
+				    (unsigned char *) sm_client_id,
+				    strlen(sm_client_id));
+		}
+	    }
+	}
+#endif /* !XT_NO_SM */
+
+	if (wmshell->wm.window_role)
+	    XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
+			    XInternAtom(XtDisplay((Widget)w),
+					"WM_WINDOW_ROLE", False),
+			    XA_STRING, 8, PropModeReplace,
+			    (unsigned char *)wmshell->wm.window_role,
+			    strlen(wmshell->wm.window_role));
+}
+
+/* ARGSUSED */
+static void EventHandler(
+	Widget wid,
+	XtPointer closure,	/* unused */
+	XEvent *event,
+        Boolean *continue_to_dispatch) /* unused */
+{
+	register ShellWidget w = (ShellWidget) wid;
+	WMShellWidget wmshell = (WMShellWidget) w;
+	Boolean  sizechanged = FALSE;
+
+	if(w->core.window != event->xany.window) {
+		XtAppErrorMsg(XtWidgetToApplicationContext(wid),
+			"invalidWindow","eventHandler",XtCXtToolkitError,
+                        "Event with wrong window",
+			(String *)NULL, (Cardinal *)NULL);
+		return;
+	}
+
+	switch(event->type) {
+	    case ConfigureNotify:
+	        if (w->core.window != event->xconfigure.window)
+		    return;  /* in case of SubstructureNotify */
+#define NEQ(x)	( w->core.x != event->xconfigure.x )
+		if( NEQ(width) || NEQ(height) || NEQ(border_width) ) {
+			sizechanged = TRUE;
+#undef NEQ
+			w->core.width = event->xconfigure.width;
+			w->core.height = event->xconfigure.height;
+			w->core.border_width = event->xconfigure.border_width;
+		}
+		if (event->xany.send_event /* ICCCM compliant synthetic ev */
+		    /* || w->shell.override_redirect */
+		    || w->shell.client_specified & _XtShellNotReparented)
+	        {
+		    w->core.x = event->xconfigure.x;
+		    w->core.y = event->xconfigure.y;
+		    w->shell.client_specified |= _XtShellPositionValid;
+		}
+		else w->shell.client_specified &= ~_XtShellPositionValid;
+		if (XtIsWMShell(wid) && !wmshell->wm.wait_for_wm) {
+		    /* Consider trusting the wm again */
+		    register struct _OldXSizeHints *hintp
+			= &wmshell->wm.size_hints;
+#define EQ(x) (hintp->x == w->core.x)
+		    if (EQ(x) && EQ(y) && EQ(width) && EQ(height)) {
+			wmshell->wm.wait_for_wm = TRUE;
+		    }
+#undef EQ
+		}
+		break;
+
+	      case ReparentNotify:
+		if (event->xreparent.window == XtWindow(w)) {
+		   if (event->xreparent.parent !=
+		       RootWindowOfScreen(XtScreen(w)))
+		       w->shell.client_specified &=
+			   ~(_XtShellNotReparented | _XtShellPositionValid);
+		   else {
+		       w->core.x = event->xreparent.x;
+		       w->core.y = event->xreparent.y;
+		       w->shell.client_specified |=
+			   (_XtShellNotReparented | _XtShellPositionValid);
+		   }
+	        }
+		return;
+
+              case MapNotify:
+                if (XtIsTopLevelShell(wid)) {
+                    ((TopLevelShellWidget)wid)->topLevel.iconic = FALSE;
+                }
+                return;
+
+	      case UnmapNotify:
+		{
+		    XtPerDisplayInput	pdi;
+		    XtDevice		device;
+		    Widget		p;
+
+                    if (XtIsTopLevelShell(wid))
+                        ((TopLevelShellWidget)wid)->topLevel.iconic = TRUE;
+
+		    pdi = _XtGetPerDisplayInput(event->xunmap.display);
+
+		    device = &pdi->pointer;
+		    if (device->grabType == XtPassiveServerGrab) {
+			p = device->grab.widget;
+			while (p && !(XtIsShell(p)))
+			    p = p->core.parent;
+			if (p == wid)
+			    device->grabType = XtNoServerGrab;
+		    }
+
+		    device = &pdi->keyboard;
+		    if (IsEitherPassiveGrab(device->grabType)) {
+			p = device->grab.widget;
+			while (p && !(XtIsShell(p)))
+			    p = p->core.parent;
+			if (p == wid) {
+			    device->grabType = XtNoServerGrab;
+			    pdi->activatingKey = 0;
+			}
+		    }
+
+		    return;
+		}
+	      default:
+		 return;
+	}
+	{
+	XtWidgetProc resize;
+
+	LOCK_PROCESS;
+	resize = XtClass(wid)->core_class.resize;
+	UNLOCK_PROCESS;
+
+	if (sizechanged && resize) {
+	    CALLGEOTAT(_XtGeoTrace((Widget)w,
+			   "Shell \"%s\" is being resized to %d %d.\n",
+			   XtName(wid), wid->core.width, wid->core.height ));
+	    (*resize)(wid);
+	 }
+	}
+}
+
+static void Destroy(
+	Widget wid)
+{
+	if (XtIsRealized(wid))
+	    XDestroyWindow( XtDisplay(wid), XtWindow(wid) );
+}
+
+static void WMDestroy(
+	Widget wid)
+{
+	WMShellWidget w = (WMShellWidget) wid;
+
+	XtFree((char *) w->wm.title);
+	XtFree((char *) w->wm.window_role);
+}
+
+static void TopLevelDestroy(
+	Widget wid)
+{
+	TopLevelShellWidget w = (TopLevelShellWidget) wid;
+
+	XtFree((char *) w->topLevel.icon_name);
+}
+
+static void ApplicationDestroy(
+    Widget wid)
+{
+    ApplicationShellWidget w = (ApplicationShellWidget) wid;
+    if (w->application.argc > 0)
+	FreeStringArray(w->application.argv);
+}
+
+static void SessionDestroy(
+    Widget wid)
+{
+#ifndef XT_NO_SM
+    SessionShellWidget w = (SessionShellWidget) wid;
+
+    StopManagingSession(w, w->session.connection);
+    XtFree(w->session.session_id);
+    FreeStringArray(w->session.restart_command);
+    FreeStringArray(w->session.clone_command);
+    FreeStringArray(w->session.discard_command);
+    FreeStringArray(w->session.resign_command);
+    FreeStringArray(w->session.shutdown_command);
+    FreeStringArray(w->session.environment);
+    XtFree(w->session.current_dir);
+    XtFree(w->session.program_path);
+#endif /* !XT_NO_SM */
+}
+
+/*
+ * If the Shell has a width and a height which are zero, and as such
+ * suspect, and it has not yet been realized then it will grow to
+ * match the child before parsing the geometry resource.
+ *
+ */
+static void GetGeometry(
+    Widget W, Widget child)
+{
+    register ShellWidget w = (ShellWidget)W;
+    Boolean is_wmshell = XtIsWMShell(W);
+    int x, y, width, height, win_gravity = -1, flag;
+    XSizeHints hints;
+
+    if (child != NULL) {
+	/* we default to our child's size */
+	if (is_wmshell && (w->core.width == 0 || w->core.height == 0))
+	    ((WMShellWidget)W)->wm.size_hints.flags |= PSize;
+	if (w->core.width == 0)	    w->core.width = child->core.width;
+	if (w->core.height == 0)    w->core.height = child->core.height;
+    }
+    if(w->shell.geometry != NULL) {
+	char def_geom[64];
+	x = w->core.x;
+	y = w->core.y;
+	width = w->core.width;
+	height = w->core.height;
+	if (is_wmshell) {
+	    WMShellPart* wm = &((WMShellWidget)w)->wm;
+	    EvaluateSizeHints((WMShellWidget)w);
+	    (void) memmove((char*)&hints, (char*)&wm->size_hints,
+			   sizeof(struct _OldXSizeHints));
+	    hints.win_gravity = wm->win_gravity;
+	    if (wm->size_hints.flags & PBaseSize) {
+		width -= wm->base_width;
+		height -= wm->base_height;
+		hints.base_width = wm->base_width;
+		hints.base_height = wm->base_height;
+	    }
+	    else if (wm->size_hints.flags & PMinSize) {
+		width -= wm->size_hints.min_width;
+		height -= wm->size_hints.min_height;
+	    }
+	    if (wm->size_hints.flags & PResizeInc) {
+		width /= wm->size_hints.width_inc;
+		height /= wm->size_hints.height_inc;
+	    }
+	}
+	else hints.flags = 0;
+
+	sprintf( def_geom, "%dx%d+%d+%d", width, height, x, y );
+	flag = XWMGeometry( XtDisplay(W),
+			    XScreenNumberOfScreen(XtScreen(W)),
+			    w->shell.geometry, def_geom,
+			    (unsigned int)w->core.border_width,
+			    &hints, &x, &y, &width, &height,
+			    &win_gravity
+			   );
+	if (flag) {
+	    if (flag & XValue) w->core.x = (Position)x;
+	    if (flag & YValue) w->core.y = (Position)y;
+	    if (flag & WidthValue) w->core.width = (Dimension)width;
+	    if (flag & HeightValue) w->core.height = (Dimension)height;
+	}
+	else {
+	    String params[2];
+	    Cardinal num_params = 2;
+	    params[0] = XtName(W);
+	    params[1] = w->shell.geometry;
+	    XtAppWarningMsg(XtWidgetToApplicationContext(W),
+       "badGeometry", "shellRealize", XtCXtToolkitError,
+       "Shell widget \"%s\" has an invalid geometry specification: \"%s\"",
+			    params, &num_params);
+	}
+    }
+    else
+	flag = 0;
+
+    if (is_wmshell) {
+	WMShellWidget wmshell = (WMShellWidget) w;
+	if (wmshell->wm.win_gravity == XtUnspecifiedShellInt) {
+	    if (win_gravity != -1)
+		wmshell->wm.win_gravity = win_gravity;
+	    else
+		wmshell->wm.win_gravity = NorthWestGravity;
+	}
+	wmshell->wm.size_hints.flags |= PWinGravity;
+	if ((flag & (XValue|YValue)) == (XValue|YValue))
+	    wmshell->wm.size_hints.flags |= USPosition;
+	if ((flag & (WidthValue|HeightValue)) == (WidthValue|HeightValue))
+	    wmshell->wm.size_hints.flags |= USSize;
+    }
+    w->shell.client_specified |= _XtShellGeometryParsed;
+}
+
+
+static void ChangeManaged(Widget wid)
+{
+    ShellWidget w = (ShellWidget) wid;
+    Widget child = NULL;
+    Cardinal i;
+
+    for (i = 0; i < w->composite.num_children; i++) {
+	if (XtIsManaged(w->composite.children[i])) {
+	    child = w->composite.children[i];
+	    break;		/* there can only be one of them! */
+	}
+    }
+
+    if (!XtIsRealized (wid))	/* then we're about to be realized... */
+	GetGeometry(wid, child);
+
+    if (child != NULL)
+	XtConfigureWidget (child, (Position)0, (Position)0,
+			   w->core.width, w->core.height, (Dimension)0 );
+}
+
+/*
+ * This is gross, I can't wait to see if the change happened so I will ask
+ * the window manager to change my size and do the appropriate X work.
+ * I will then tell the requester that he can.  Care must be taken because
+ * it is possible that some time in the future the request will be
+ * asynchronusly denied and the window reverted to it's old size/shape.
+ */
+
+/*ARGSUSED*/
+static XtGeometryResult GeometryManager(
+	Widget wid,
+	XtWidgetGeometry *request,
+	XtWidgetGeometry *reply)
+{
+	ShellWidget shell = (ShellWidget)(wid->core.parent);
+	XtWidgetGeometry my_request;
+
+	if(shell->shell.allow_shell_resize == FALSE && XtIsRealized(wid))
+		return(XtGeometryNo);
+
+	if (request->request_mode & (CWX | CWY))
+	    return(XtGeometryNo);
+
+	my_request.request_mode = (request->request_mode & XtCWQueryOnly);
+	if (request->request_mode & CWWidth) {
+	    my_request.width = request->width;
+	    my_request.request_mode |= CWWidth;
+	}
+	if (request->request_mode & CWHeight) {
+	    my_request.height = request->height;
+	    my_request.request_mode |= CWHeight;
+	}
+	if (request->request_mode & CWBorderWidth) {
+	    my_request.border_width = request->border_width;
+	    my_request.request_mode |= CWBorderWidth;
+	}
+	if (XtMakeGeometryRequest((Widget)shell, &my_request, NULL)
+		== XtGeometryYes) {
+	    /* assert: if (request->request_mode & CWWidth) then
+	     * 		  shell->core.width == request->width
+	     * assert: if (request->request_mode & CWHeight) then
+	     * 		  shell->core.height == request->height
+	     *
+	     * so, whatever the WM sized us to (if the Shell requested
+	     * only one of the two) is now the correct child size
+	     */
+
+	    if (!(request->request_mode & XtCWQueryOnly)) {
+		wid->core.width = shell->core.width;
+		wid->core.height = shell->core.height;
+		if (request->request_mode & CWBorderWidth) {
+		    wid->core.x = wid->core.y = -request->border_width;
+		}
+	    }
+	    return XtGeometryYes;
+	} else return XtGeometryNo;
+}
+
+typedef struct {
+	Widget  w;
+	unsigned long request_num;
+	Boolean done;
+} QueryStruct;
+
+static Bool isMine(
+	Display *dpy,
+	register XEvent  *event,
+	char *arg)
+{
+	QueryStruct *q = (QueryStruct *) arg;
+	register Widget w = q->w;
+
+	if ( (dpy != XtDisplay(w)) || (event->xany.window != XtWindow(w)) ) {
+	    return FALSE;
+	}
+	if (event->xany.serial >= q->request_num) {
+	    if (event->type == ConfigureNotify) {
+		q->done = TRUE;
+		return TRUE;
+	    }
+	}
+	else if (event->type == ConfigureNotify)
+	    return TRUE;	/* flush old events */
+	if (event->type == ReparentNotify
+		 && event->xreparent.window == XtWindow(w)) {
+	    /* we might get ahead of this event, so just in case someone
+	     * asks for coordinates before this event is dispatched...
+	     */
+	    register ShellWidget s = (ShellWidget)w;
+	    if (event->xreparent.parent != RootWindowOfScreen(XtScreen(w)))
+		s->shell.client_specified &= ~_XtShellNotReparented;
+	    else
+		s->shell.client_specified |= _XtShellNotReparented;
+	}
+	return FALSE;
+}
+
+static Boolean _wait_for_response(
+	ShellWidget	w,
+	XEvent		*event,
+        unsigned long	request_num)
+{
+	XtAppContext app = XtWidgetToApplicationContext((Widget) w);
+	QueryStruct q;
+	unsigned long timeout;
+
+	if (XtIsWMShell((Widget)w))
+	    timeout = ((WMShellWidget)w)->wm.wm_timeout;
+	else
+	    timeout = DEFAULT_WM_TIMEOUT;
+
+	XFlush(XtDisplay(w));
+	q.w = (Widget) w;
+	q.request_num = request_num;
+	q.done = FALSE;
+
+	/*
+	 * look for match event and discard all prior configures
+	 */
+	while (XCheckIfEvent(XtDisplay(w),event,isMine,(char*)&q)) {
+	    if (q.done) return TRUE;
+	}
+
+	while (timeout > 0) {
+	    if (_XtWaitForSomething (app,
+				     FALSE, TRUE, TRUE, TRUE,
+				     TRUE,
+#ifdef XTHREADS
+				     FALSE,
+#endif
+				     &timeout) != -1) {
+		while (XCheckIfEvent(XtDisplay(w),event,isMine,(char*)&q)) {
+		    if (q.done) return TRUE;
+		}
+	    }
+	}
+	return FALSE;
+}
+
+/*ARGSUSED*/
+static XtGeometryResult RootGeometryManager(
+    Widget gw,
+    XtWidgetGeometry *request, XtWidgetGeometry *reply)
+{
+    register ShellWidget w = (ShellWidget)gw;
+    XWindowChanges values;
+    unsigned int mask = request->request_mode;
+    XEvent event;
+    Boolean wm;
+    register struct _OldXSizeHints *hintp = NULL;
+    int oldx, oldy, oldwidth, oldheight, oldborder_width;
+    unsigned long request_num;
+
+    CALLGEOTAT(_XtGeoTab(1));
+
+    if (XtIsWMShell(gw)) {
+	wm = True;
+	hintp = &((WMShellWidget)w)->wm.size_hints;
+	/* for draft-ICCCM wm's, need to make sure hints reflect
+	   (current) reality so client can move and size separately. */
+  	hintp->x = w->core.x;
+  	hintp->y = w->core.y;
+  	hintp->width = w->core.width;
+   	hintp->height = w->core.height;
+    } else
+	wm = False;
+
+    oldx = w->core.x;
+    oldy = w->core.y;
+    oldwidth = w->core.width;
+    oldheight = w->core.height;
+    oldborder_width = w->core.border_width;
+
+#define PutBackGeometry() \
+	{ w->core.x = oldx; \
+	  w->core.y = oldy; \
+	  w->core.width = oldwidth; \
+	  w->core.height = oldheight; \
+	  w->core.border_width = oldborder_width; }
+
+    if (mask & CWX) {
+	    if (w->core.x == request->x) mask &= ~CWX;
+	    else {
+		w->core.x = values.x = request->x;
+		if (wm) {
+		    hintp->flags &= ~USPosition;
+		    hintp->flags |= PPosition;
+		    hintp->x = values.x;
+		}
+	    }
+    }
+    if (mask & CWY) {
+	    if (w->core.y == request->y) mask &= ~CWY;
+	    else {
+		w->core.y = values.y = request->y;
+		if (wm) {
+		    hintp->flags &= ~USPosition;
+		    hintp->flags |= PPosition;
+		    hintp->y = values.y;
+		}
+	    }
+    }
+    if (mask & CWBorderWidth) {
+	    if (w->core.border_width == request->border_width) {
+		    mask &= ~CWBorderWidth;
+	    } else
+		w->core.border_width =
+		    values.border_width =
+			request->border_width;
+    }
+    if (mask & CWWidth) {
+	    if (w->core.width == request->width) mask &= ~CWWidth;
+	    else {
+		w->core.width = values.width = request->width;
+		if (wm) {
+		    hintp->flags &= ~USSize;
+		    hintp->flags |= PSize;
+		    hintp->width = values.width;
+		}
+	    }
+    }
+    if (mask & CWHeight) {
+	    if (w->core.height == request->height) mask &= ~CWHeight;
+	    else {
+		w->core.height = values.height = request->height;
+		if (wm) {
+		    hintp->flags &= ~USSize;
+		    hintp->flags |= PSize;
+		    hintp->height = values.height;
+		}
+	    }
+    }
+    if (mask & CWStackMode) {
+	values.stack_mode = request->stack_mode;
+	if (mask & CWSibling)
+	    values.sibling = XtWindow(request->sibling);
+    }
+
+    if (!XtIsRealized((Widget)w)) {
+	CALLGEOTAT(_XtGeoTrace((Widget)w,
+		      "Shell \"%s\" is not realized, return XtGeometryYes.\n",
+		       XtName((Widget)w)));
+    	CALLGEOTAT(_XtGeoTab(-1));
+	return XtGeometryYes;
+    }
+
+    request_num = NextRequest(XtDisplay(w));
+
+    CALLGEOTAT(_XtGeoTrace((Widget)w,"XConfiguring the Shell X window :\n"));
+    CALLGEOTAT(_XtGeoTab(1));
+#ifdef XT_GEO_TATTLER
+    if (mask & CWX) { CALLGEOTAT(_XtGeoTrace((Widget)w,"x = %d\n",values.x));}
+    if (mask & CWY) { CALLGEOTAT(_XtGeoTrace((Widget)w,"y = %d\n",values.y));}
+    if (mask & CWWidth) { CALLGEOTAT(_XtGeoTrace((Widget)w,
+					       "width = %d\n",values.width));}
+    if (mask & CWHeight) { CALLGEOTAT(_XtGeoTrace((Widget)w,
+					    "height = %d\n",values.height));}
+    if (mask & CWBorderWidth) { CALLGEOTAT(_XtGeoTrace((Widget)w,
+				  "border_width = %d\n",values.border_width));}
+#endif
+    CALLGEOTAT(_XtGeoTab(-1));
+
+    XConfigureWindow(XtDisplay((Widget)w), XtWindow((Widget)w), mask,&values);
+
+    if (wm && !w->shell.override_redirect
+	&& mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth)) {
+	_SetWMSizeHints((WMShellWidget)w);
+    }
+
+    if (w->shell.override_redirect) {
+	CALLGEOTAT(_XtGeoTrace((Widget)w,"Shell \"%s\" is override redirect, return XtGeometryYes.\n", XtName((Widget)w)));
+    	CALLGEOTAT(_XtGeoTab(-1));
+	return XtGeometryYes;
+    }
+
+
+    /* If no non-stacking bits are set, there's no way to tell whether
+       or not this worked, so assume it did */
+
+    if (!(mask & ~(CWStackMode | CWSibling))) return XtGeometryYes;
+
+    if (wm && ((WMShellWidget)w)->wm.wait_for_wm == FALSE) {
+	    /* the window manager is sick
+	     * so I will do the work and
+	     * say no so if a new WM starts up,
+	     * or the current one recovers
+	     * my size requests will be visible
+	     */
+	CALLGEOTAT(_XtGeoTrace((Widget)w,"Shell \"%s\" has wait_for_wm == FALSE, return XtGeometryNo.\n",
+		       XtName((Widget)w)));
+    	CALLGEOTAT(_XtGeoTab(-1));
+
+	PutBackGeometry();
+	return XtGeometryNo;
+    }
+
+    if (_wait_for_response(w, &event, request_num)) {
+	/* got an event */
+	if (event.type == ConfigureNotify) {
+
+#define NEQ(x, msk) ((mask & msk) && (values.x != event.xconfigure.x))
+	    if (NEQ(x, CWX) ||
+		NEQ(y, CWY) ||
+		NEQ(width, CWWidth) ||
+		NEQ(height, CWHeight) ||
+		NEQ(border_width, CWBorderWidth)) {
+#ifdef XT_GEO_TATTLER
+		if (NEQ(x, CWX)) {
+		    CALLGEOTAT(_XtGeoTrace((Widget)w,
+					   "received Configure X %d\n",
+					   event.xconfigure.x));
+		}
+		if (NEQ(y, CWY)) {
+		    CALLGEOTAT(_XtGeoTrace((Widget)w,
+					   "received Configure Y %d\n",
+					   event.xconfigure.y));
+		}
+		if (NEQ(width, CWWidth)) {
+		    CALLGEOTAT(_XtGeoTrace((Widget)w,
+					   "received Configure Width %d\n",
+					   event.xconfigure.width));
+		}
+		if (NEQ(height, CWHeight)) {
+		    CALLGEOTAT(_XtGeoTrace((Widget)w,
+					   "received Configure Height %d\n",
+					   event.xconfigure.height));
+		}
+		if (NEQ(border_width, CWBorderWidth)) {
+		    CALLGEOTAT(_XtGeoTrace((Widget)w,
+				        "received Configure BorderWidth %d\n",
+					event.xconfigure.border_width));
+		}
+#endif
+#undef NEQ
+		XPutBackEvent(XtDisplay(w), &event);
+		PutBackGeometry();
+		/*
+		 * We just potentially re-ordered the event queue
+		 * w.r.t. ConfigureNotifies with some trepidation.
+		 * But this is probably a Good Thing because we
+		 * will know the new true state of the world sooner
+		 * this way.
+		 */
+		CALLGEOTAT(_XtGeoTrace((Widget)w,
+			   "ConfigureNotify failed, return XtGeometryNo.\n"));
+		CALLGEOTAT(_XtGeoTab(-1));
+
+		return XtGeometryNo;
+	    }
+	    else {
+		w->core.width = event.xconfigure.width;
+		w->core.height = event.xconfigure.height;
+		w->core.border_width = event.xconfigure.border_width;
+		if (event.xany.send_event || /* ICCCM compliant synth */
+		    w->shell.client_specified & _XtShellNotReparented) {
+
+		    w->core.x = event.xconfigure.x;
+		    w->core.y = event.xconfigure.y;
+		    w->shell.client_specified |= _XtShellPositionValid;
+		}
+		else w->shell.client_specified &= ~_XtShellPositionValid;
+		CALLGEOTAT(_XtGeoTrace((Widget)w,
+			 "ConfigureNotify succeed, return XtGeometryYes.\n"));
+		CALLGEOTAT(_XtGeoTab(-1));
+		return XtGeometryYes;
+	    }
+	} else if (!wm) {
+	    PutBackGeometry();
+	    CALLGEOTAT(_XtGeoTrace((Widget)w,
+				   "Not wm, return XtGeometryNo.\n"));
+	    CALLGEOTAT(_XtGeoTab(-1));
+	    return XtGeometryNo;
+	} else XtAppWarningMsg(XtWidgetToApplicationContext((Widget)w),
+			       "internalError", "shell", XtCXtToolkitError,
+			       "Shell's window manager interaction is broken",
+			       (String *)NULL, (Cardinal *)NULL);
+    } else if (wm) { /* no event */
+	((WMShellWidget)w)->wm.wait_for_wm = FALSE; /* timed out; must be broken */
+    }
+    PutBackGeometry();
+#undef PutBackGeometry
+    CALLGEOTAT(_XtGeoTrace((Widget)w,
+			   "Timeout passed?, return XtGeometryNo.\n"));
+    CALLGEOTAT(_XtGeoTab(-1));
+    return XtGeometryNo;
+		}
+
+/* ARGSUSED */
+static Boolean SetValues(
+	Widget old, Widget ref, Widget new,
+	ArgList args,
+	Cardinal *num_args)
+{
+	ShellWidget nw = (ShellWidget) new;
+	ShellWidget ow = (ShellWidget) old;
+	Mask mask = 0;
+	XSetWindowAttributes attr;
+
+	if (!XtIsRealized(new))
+	    return False;
+
+	if (ow->shell.save_under != nw->shell.save_under) {
+	    mask = CWSaveUnder;
+	    attr.save_under = nw->shell.save_under;
+	}
+
+	if (ow->shell.override_redirect != nw->shell.override_redirect) {
+	    mask |= CWOverrideRedirect;
+	    attr.override_redirect = nw->shell.override_redirect;
+	}
+
+	if (mask) {
+	    XChangeWindowAttributes(XtDisplay(new),XtWindow(new), mask, &attr);
+	    if ((mask & CWOverrideRedirect) && !nw->shell.override_redirect)
+		_popup_set_prop(nw);
+	}
+
+	if (! (ow->shell.client_specified & _XtShellPositionValid)) {
+	    Cardinal n;
+
+	    for (n = *num_args; n; n--, args++) {
+		if (strcmp(XtNx, args->name) == 0) {
+		    _XtShellGetCoordinates((Widget)ow, &ow->core.x,
+							&ow->core.y);
+		} else if (strcmp(XtNy, args->name) == 0) {
+		    _XtShellGetCoordinates((Widget)ow, &ow->core.x,
+							&ow->core.y);
+		}
+	    }
+	}
+	return FALSE;
+}
+
+/* ARGSUSED */
+static Boolean WMSetValues(
+	Widget old, Widget ref, Widget new,
+	ArgList args,		/* unused */
+	Cardinal *num_args)	/* unused */
+{
+	WMShellWidget nwmshell = (WMShellWidget) new;
+	WMShellWidget owmshell = (WMShellWidget) old;
+	Boolean set_prop
+	    = XtIsRealized(new) && !nwmshell->shell.override_redirect;
+	Boolean title_changed;
+
+	EvaluateSizeHints(nwmshell);
+
+#define NEQ(f) (nwmshell->wm.size_hints.f != owmshell->wm.size_hints.f)
+
+	if (set_prop
+	    && (NEQ(flags) || NEQ(min_width) || NEQ(min_height)
+		|| NEQ(max_width) || NEQ(max_height)
+		|| NEQ(width_inc) || NEQ(height_inc)
+		|| NEQ(min_aspect.x) || NEQ(min_aspect.y)
+		|| NEQ(max_aspect.x) || NEQ(max_aspect.y)
+#undef NEQ
+#define NEQ(f) (nwmshell->wm.f != owmshell->wm.f)
+
+		|| NEQ(base_width) || NEQ(base_height) || NEQ(win_gravity))) {
+	    _SetWMSizeHints(nwmshell);
+	}
+#undef NEQ
+
+	if (nwmshell->wm.title != owmshell->wm.title) {
+	    XtFree(owmshell->wm.title);
+	    if (! nwmshell->wm.title) nwmshell->wm.title = "";
+	    nwmshell->wm.title = XtNewString(nwmshell->wm.title);
+	    title_changed = True;
+	} else
+	    title_changed = False;
+
+	if (set_prop
+	    && (title_changed ||
+		nwmshell->wm.title_encoding != owmshell->wm.title_encoding)) {
+
+	    XTextProperty title;
+	    Boolean copied = False;
+
+            if (nwmshell->wm.title_encoding == None &&
+		XmbTextListToTextProperty(XtDisplay(new),
+					  (char**)&nwmshell->wm.title,
+					  1, XStdICCTextStyle,
+					  &title) >= Success) {
+		copied = True;
+	    } else {
+		title.value = (unsigned char*)nwmshell->wm.title;
+		title.encoding = nwmshell->wm.title_encoding ?
+		    nwmshell->wm.title_encoding : XA_STRING;
+		title.format = 8;
+		title.nitems = strlen(nwmshell->wm.title);
+	    }
+	    XSetWMName(XtDisplay(new), XtWindow(new), &title);
+	    if (copied)
+		XFree((XPointer)title.value);
+	}
+
+	EvaluateWMHints(nwmshell);
+
+#define NEQ(f)	(nwmshell->wm.wm_hints.f != owmshell->wm.wm_hints.f)
+
+	if (set_prop
+	    && (NEQ(flags) || NEQ(input) || NEQ(initial_state)
+		|| NEQ(icon_x) || NEQ(icon_y)
+		|| NEQ(icon_pixmap) || NEQ(icon_mask) || NEQ(icon_window)
+		|| NEQ(window_group))) {
+
+	    XSetWMHints(XtDisplay(new), XtWindow(new), &nwmshell->wm.wm_hints);
+	}
+#undef NEQ
+
+ 	if (XtIsRealized(new) &&
+	    nwmshell->wm.transient != owmshell->wm.transient) {
+ 	    if (nwmshell->wm.transient) {
+		if (!XtIsTransientShell(new) &&
+		    !nwmshell->shell.override_redirect &&
+		    nwmshell->wm.wm_hints.window_group !=
+		       XtUnspecifiedWindowGroup)
+		    XSetTransientForHint(XtDisplay(new), XtWindow(new),
+					 nwmshell->wm.wm_hints.window_group);
+	    }
+ 	    else XDeleteProperty(XtDisplay(new), XtWindow(new),
+ 				 XA_WM_TRANSIENT_FOR);
+ 	}
+
+	if (nwmshell->wm.client_leader != owmshell->wm.client_leader
+	    && XtWindow(new) && !nwmshell->shell.override_redirect) {
+	    Widget leader = GetClientLeader(new);
+	    if (XtWindow(leader))
+		XChangeProperty(XtDisplay(new), XtWindow(new),
+				XInternAtom(XtDisplay(new),
+					    "WM_CLIENT_LEADER", False),
+				XA_WINDOW, 32, PropModeReplace,
+				(unsigned char *) &(leader->core.window), 1);
+	}
+
+	if (nwmshell->wm.window_role != owmshell->wm.window_role) {
+	    XtFree(owmshell->wm.window_role);
+	    if (set_prop && nwmshell->wm.window_role) {
+		XChangeProperty(XtDisplay(new), XtWindow(new),
+				XInternAtom(XtDisplay(new), "WM_WINDOW_ROLE",
+					    False),
+				XA_STRING, 8, PropModeReplace,
+				(unsigned char *)nwmshell->wm.window_role,
+				strlen(nwmshell->wm.window_role));
+	    } else if (XtIsRealized(new) && ! nwmshell->wm.window_role) {
+		XDeleteProperty(XtDisplay(new), XtWindow(new),
+				XInternAtom(XtDisplay(new), "WM_WINDOW_ROLE",
+					    False));
+	    }
+	}
+
+	return FALSE;
+}
+
+/*ARGSUSED*/
+static Boolean TransientSetValues(
+     Widget oldW, Widget refW, Widget newW,
+     ArgList args,		/* unused */
+     Cardinal *num_args)	/* unused */
+{
+    TransientShellWidget old = (TransientShellWidget)oldW;
+    TransientShellWidget new = (TransientShellWidget)newW;
+
+    if (XtIsRealized(newW)
+	&& ((new->wm.transient && !old->wm.transient)
+	    || ((new->transient.transient_for != old->transient.transient_for)
+		|| (new->transient.transient_for == NULL
+		    && (new->wm.wm_hints.window_group
+			!= old->wm.wm_hints.window_group))))) {
+
+	_SetTransientForHint(new, True);
+    }
+    return False;
+}
+
+
+/* ARGSUSED */
+static Boolean TopLevelSetValues(
+     Widget oldW, Widget refW, Widget newW,
+     ArgList args,		/* unused */
+     Cardinal *num_args)	/* unused */
+{
+    TopLevelShellWidget old = (TopLevelShellWidget)oldW;
+    TopLevelShellWidget new = (TopLevelShellWidget)newW;
+    Boolean name_changed;
+
+    if (old->topLevel.icon_name != new->topLevel.icon_name) {
+	XtFree((XtPointer)old->topLevel.icon_name);
+	if (! new->topLevel.icon_name) new->topLevel.icon_name = "";
+	new->topLevel.icon_name = XtNewString(new->topLevel.icon_name);
+	name_changed = True;
+    } else
+	name_changed = False;
+
+    if (XtIsRealized(newW)) {
+	if (new->topLevel.iconic != old->topLevel.iconic) {
+	    if (new->topLevel.iconic)
+		XIconifyWindow(XtDisplay(newW),
+			       XtWindow(newW),
+			       XScreenNumberOfScreen(XtScreen(newW))
+			       );
+	    else {
+		Boolean map = new->shell.popped_up;
+		XtPopup(newW, XtGrabNone);
+		if (map) XMapWindow(XtDisplay(newW), XtWindow(newW));
+	    }
+	}
+
+	if (!new->shell.override_redirect &&
+	    (name_changed ||
+	     (old->topLevel.icon_name_encoding
+	      != new->topLevel.icon_name_encoding))) {
+
+	    XTextProperty icon_name;
+	    Boolean copied = False;
+
+            if (new->topLevel.icon_name_encoding == None &&
+		XmbTextListToTextProperty(XtDisplay(newW),
+					  (char**) &new->topLevel.icon_name,
+					  1, XStdICCTextStyle,
+					  &icon_name) >= Success) {
+		copied = True;
+	    } else {
+		icon_name.value = (unsigned char *)new->topLevel.icon_name;
+		icon_name.encoding = new->topLevel.icon_name_encoding ?
+		    new->topLevel.icon_name_encoding : XA_STRING;
+		icon_name.format = 8;
+		icon_name.nitems = strlen((char *)icon_name.value);
+	    }
+	    XSetWMIconName(XtDisplay(newW), XtWindow(newW), &icon_name);
+	    if (copied)
+		XFree((XPointer)icon_name.value);
+	}
+    }
+    return False;
+}
+
+static String * NewArgv(
+    int count,
+    String *str)  /* do not assume it's terminated by a NULL element */
+{
+    Cardinal nbytes = 0;
+    Cardinal num = 0;
+    String *newarray, *new;
+    String *strarray = str;
+    String sptr;
+
+    if (count <= 0 || !str) return NULL;
+
+    for (num = count; num--; str++) {
+	nbytes += strlen(*str);
+	nbytes++;
+    }
+    num = (count+1) * sizeof(String);
+    new = newarray = (String *) __XtMalloc(num + nbytes);
+    sptr = ((char *) new) + num;
+
+    for (str = strarray; count--; str++) {
+	*new = sptr;
+	strcpy(*new, *str);
+	new++;
+	sptr = strchr(sptr, '\0');
+	sptr++;
+    }
+    *new = NULL;
+    return newarray;
+}
+
+
+/*ARGSUSED*/
+static Boolean ApplicationSetValues(
+    Widget current, Widget request, Widget new,
+    ArgList args,
+    Cardinal *num_args)
+{
+    ApplicationShellWidget nw = (ApplicationShellWidget) new;
+    ApplicationShellWidget cw = (ApplicationShellWidget) current;
+
+    if (cw->application.argc != nw->application.argc ||
+	cw->application.argv != nw->application.argv) {
+
+	if (nw->application.argc > 0)
+	    nw->application.argv = NewArgv(nw->application.argc,
+					   nw->application.argv);
+	if (cw->application.argc > 0)
+	    FreeStringArray(cw->application.argv);
+
+	if (XtIsRealized(new) && !nw->shell.override_redirect) {
+	    if (nw->application.argc >= 0 && nw->application.argv)
+		XSetCommand(XtDisplay(new), XtWindow(new),
+			    nw->application.argv, nw->application.argc);
+	    else
+		XDeleteProperty(XtDisplay(new), XtWindow(new), XA_WM_COMMAND);
+	}
+    }
+    return False;
+}
+
+/*ARGSUSED*/
+static Boolean SessionSetValues(
+    Widget current, Widget request, Widget new,
+    ArgList args,
+    Cardinal *num_args)
+{
+#ifndef XT_NO_SM
+    SessionShellWidget nw = (SessionShellWidget) new;
+    SessionShellWidget cw = (SessionShellWidget) current;
+    unsigned long set_mask = 0UL;
+    unsigned long unset_mask = 0UL;
+    Boolean initialize = False;
+
+    if (cw->session.session_id != nw->session.session_id) {
+	nw->session.session_id = XtNewString(nw->session.session_id);
+	XtFree(cw->session.session_id);
+    }
+
+    if (cw->session.clone_command != nw->session.clone_command) {
+	if (nw->session.clone_command) {
+	    nw->session.clone_command =
+		NewStringArray(nw->session.clone_command);
+	    set_mask |= XtCloneCommandMask;
+	} else unset_mask |= XtCloneCommandMask;
+	FreeStringArray(cw->session.clone_command);
+    }
+
+    if (cw->session.current_dir != nw->session.current_dir) {
+	if (nw->session.current_dir) {
+	    nw->session.current_dir =
+		XtNewString(nw->session.current_dir);
+	    set_mask |= XtCurrentDirectoryMask;
+	} else unset_mask |= XtCurrentDirectoryMask;
+	XtFree((char *) cw->session.current_dir);
+    }
+
+    if (cw->session.discard_command != nw->session.discard_command) {
+	if (nw->session.discard_command) {
+	    nw->session.discard_command =
+		NewStringArray(nw->session.discard_command);
+	    set_mask |=  XtDiscardCommandMask;
+	} else unset_mask |= XtDiscardCommandMask;
+	FreeStringArray(cw->session.discard_command);
+    }
+
+    if (cw->session.environment != nw->session.environment) {
+	if (nw->session.environment) {
+	    nw->session.environment =
+		NewStringArray(nw->session.environment);
+	    set_mask |= XtEnvironmentMask;
+	} else unset_mask |= XtEnvironmentMask;
+	FreeStringArray(cw->session.environment);
+    }
+
+    if (cw->session.program_path != nw->session.program_path) {
+	if (nw->session.program_path) {
+	    nw->session.program_path =
+		XtNewString(nw->session.program_path);
+	    set_mask |= XtProgramMask;
+	} else unset_mask |= XtProgramMask;
+	XtFree((char *) cw->session.program_path);
+    }
+
+    if (cw->session.resign_command != nw->session.resign_command) {
+	if (nw->session.resign_command) {
+	    nw->session.resign_command =
+		NewStringArray(nw->session.resign_command);
+	    set_mask |= XtResignCommandMask;
+	} else set_mask |= XtResignCommandMask;
+	FreeStringArray(cw->session.resign_command);
+    }
+
+    if (cw->session.restart_command != nw->session.restart_command) {
+	if (nw->session.restart_command) {
+	    nw->session.restart_command =
+		NewStringArray(nw->session.restart_command);
+	    set_mask |= XtRestartCommandMask;
+	} else unset_mask |= XtRestartCommandMask;
+	FreeStringArray(cw->session.restart_command);
+    }
+
+    if (cw->session.restart_style != nw->session.restart_style)
+	set_mask |= XtRestartStyleHintMask;
+
+    if (cw->session.shutdown_command != nw->session.shutdown_command) {
+	if (nw->session.shutdown_command) {
+	    nw->session.shutdown_command =
+		NewStringArray(nw->session.shutdown_command);
+	    set_mask |= XtShutdownCommandMask;
+	} else unset_mask |= XtShutdownCommandMask;
+	FreeStringArray(cw->session.shutdown_command);
+    }
+
+    if ((!cw->session.join_session && nw->session.join_session) ||
+	(!cw->session.connection && nw->session.connection)) {
+	JoinSession(nw);
+	initialize = True;
+    }
+
+    if (nw->session.connection && (set_mask || unset_mask || initialize))
+	SetSessionProperties((SessionShellWidget) new, initialize, set_mask, unset_mask);
+
+    if ((cw->session.join_session && !nw->session.join_session) ||
+	(cw->session.connection && !nw->session.connection))
+	StopManagingSession(nw, nw->session.connection);
+#endif /* !XT_NO_SM */
+
+    if (cw->wm.client_leader != nw->wm.client_leader ||
+	cw->session.session_id != nw->session.session_id) {
+	Widget leader;
+	if (cw->session.session_id) {
+	    leader = GetClientLeader(current);
+	    if (XtWindow(leader))
+		XDeleteProperty(XtDisplay(leader), XtWindow(leader),
+				XInternAtom(XtDisplay(leader), "SM_CLIENT_ID",
+					    False));
+	}
+	if (nw->session.session_id) {
+	    leader = GetClientLeader(new);
+	    if (XtWindow(leader))
+		XChangeProperty(XtDisplay(leader), XtWindow(leader),
+				XInternAtom(XtDisplay(leader), "SM_CLIENT_ID",
+					    False),
+				XA_STRING, 8, PropModeReplace,
+				(unsigned char *) nw->session.session_id,
+				strlen(nw->session.session_id));
+	}
+    }
+    return False;
+}
+
+void _XtShellGetCoordinates(
+    Widget widget,
+    Position* x,
+    Position* y)
+{
+    ShellWidget w = (ShellWidget)widget;
+    if (XtIsRealized(widget) &&
+	!(w->shell.client_specified & _XtShellPositionValid)) {
+	int tmpx, tmpy;
+	Window tmpchild;
+	(void) XTranslateCoordinates(XtDisplay(w), XtWindow(w),
+				     RootWindowOfScreen(XtScreen(w)),
+				     (int) -w->core.border_width,
+				     (int) -w->core.border_width,
+				     &tmpx, &tmpy, &tmpchild);
+	w->core.x = tmpx;
+	w->core.y = tmpy;
+	w->shell.client_specified |= _XtShellPositionValid;
+    }
+    *x = w->core.x;
+    *y = w->core.y;
+}
+
+static void GetValuesHook(
+    Widget	widget,
+    ArgList	args,
+    Cardinal*	num_args)
+{
+    ShellWidget w = (ShellWidget) widget;
+
+    /* x and y resource values may be invalid after a shell resize */
+    if (XtIsRealized(widget) &&
+	!(w->shell.client_specified & _XtShellPositionValid)) {
+	Cardinal	n;
+	Position	x, y;
+
+	for (n = *num_args; n; n--, args++) {
+	    if (strcmp(XtNx, args->name) == 0) {
+		_XtShellGetCoordinates(widget, &x, &y);
+		_XtCopyToArg((char *) &x, &args->value, sizeof(Position));
+	    } else if (strcmp(XtNy, args->name) == 0) {
+		_XtShellGetCoordinates(widget, &x, &y);
+		_XtCopyToArg((char *) &y, &args->value, sizeof(Position));
+	    }
+	}
+    }
+}
+
+static void ApplicationShellInsertChild(
+    Widget widget)
+{
+    if (! XtIsWidget(widget) && XtIsRectObj(widget)) {
+	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+	       "invalidClass", "applicationShellInsertChild", XtCXtToolkitError,
+	       "ApplicationShell does not accept RectObj children; ignored",
+	       (String*)NULL, (Cardinal*)NULL);
+    }
+    else {
+	XtWidgetProc insert_child;
+
+	LOCK_PROCESS;
+	insert_child =
+	    ((CompositeWidgetClass)applicationShellClassRec.core_class.
+	   superclass)->composite_class.insert_child;
+	UNLOCK_PROCESS;
+	(*insert_child) (widget);
+    }
+}
+
+/**************************************************************************
+
+  Session Protocol Participation
+
+ *************************************************************************/
+
+#define XtSessionCheckpoint	0
+#define XtSessionInteract	1
+
+static void CallSaveCallbacks(SessionShellWidget );
+static String *EditCommand(String, String *, String *);
+static Boolean ExamineToken(XtPointer);
+static void GetIceEvent(XtPointer, int *, XtInputId *);
+static XtCheckpointToken GetToken(Widget, int);
+static void XtCallCancelCallbacks(SmcConn, SmPointer);
+static void XtCallDieCallbacks(SmcConn, SmPointer);
+static void XtCallSaveCallbacks(SmcConn, SmPointer, int, Bool, int, Bool);
+static void XtCallSaveCompleteCallbacks(SmcConn, SmPointer);
+
+#ifndef XT_NO_SM
+static void StopManagingSession(
+    SessionShellWidget w,
+    SmcConn connection) /* connection to close, if any */
+{
+    if (connection)
+	SmcCloseConnection(connection, 0, NULL);
+
+    if (w->session.input_id) {
+	XtRemoveInput(w->session.input_id);
+	w->session.input_id = 0;
+    }
+    w->session.connection = NULL;
+}
+
+#define XT_MSG_LENGTH 256
+static void JoinSession(
+    SessionShellWidget w)
+{
+    IceConn ice_conn;
+    SmcCallbacks smcb;
+    char * sm_client_id;
+    unsigned long mask;
+    static char context;  /* used to guarantee the connection isn't shared */
+
+    smcb.save_yourself.callback = XtCallSaveCallbacks;
+    smcb.die.callback = XtCallDieCallbacks;
+    smcb.save_complete.callback = XtCallSaveCompleteCallbacks;
+    smcb.shutdown_cancelled.callback = XtCallCancelCallbacks;
+    smcb.save_yourself.client_data = smcb.die.client_data =
+	smcb.save_complete.client_data =
+	    smcb.shutdown_cancelled.client_data = (SmPointer) w;
+    mask = SmcSaveYourselfProcMask | SmcDieProcMask |
+	SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask;
+
+    if (w->session.connection) {
+	SmcModifyCallbacks(w->session.connection, mask, &smcb);
+	sm_client_id = SmcClientID(w->session.connection);
+    } else if (getenv("SESSION_MANAGER")) {
+	char error_msg[XT_MSG_LENGTH];
+	error_msg[0] = '\0';
+	w->session.connection =
+	    SmcOpenConnection(NULL, &context, SmProtoMajor, SmProtoMinor,
+			      mask, &smcb, w->session.session_id,
+			      &sm_client_id, XT_MSG_LENGTH, error_msg);
+	if (error_msg[0]) {
+	    String params[1];
+	    Cardinal num_params = 1;
+	    params[0] = error_msg;
+	    XtAppWarningMsg(XtWidgetToApplicationContext((Widget) w),
+			    "sessionManagement", "SmcOpenConnection",
+			    XtCXtToolkitError,
+			    "Tried to connect to session manager, %s",
+			    params, &num_params);
+	}
+    }
+
+    if (w->session.connection) {
+	if (w->session.session_id == NULL
+	    || (strcmp(w->session.session_id, sm_client_id) != 0)) {
+	    XtFree(w->session.session_id);
+	    w->session.session_id = XtNewString(sm_client_id);
+	}
+	free(sm_client_id);
+	ice_conn = SmcGetIceConnection(w->session.connection);
+	w->session.input_id =
+	    XtAppAddInput(XtWidgetToApplicationContext((Widget)w),
+			  IceConnectionNumber(ice_conn),
+			  (XtPointer) XtInputReadMask,
+			  GetIceEvent, (XtPointer) w);
+
+	w->session.restart_command =
+	    EditCommand(w->session.session_id, w->session.restart_command,
+			w->application.argv);
+
+	if (! w->session.clone_command) w->session.clone_command =
+	    EditCommand(NULL, NULL, w->session.restart_command);
+
+	if (! w->session.program_path)
+	    w->session.program_path = w->session.restart_command
+		? XtNewString(w->session.restart_command[0]) : NULL;
+    }
+}
+#undef XT_MSG_LENGTH
+
+#endif /* !XT_NO_SM */
+
+static String * NewStringArray(String *str)
+{
+    Cardinal nbytes = 0;
+    Cardinal num = 0;
+    String *newarray, *new;
+    String *strarray = str;
+    String sptr;
+
+    if (!str) return NULL;
+
+    for (num = 0; *str; num++, str++) {
+	nbytes += strlen(*str);
+	nbytes++;
+    }
+    num = (num + 1) * sizeof(String);
+    new = newarray = (String *) __XtMalloc(num + nbytes);
+    sptr = ((char *) new) + num;
+
+    for (str = strarray; *str; str++) {
+	*new = sptr;
+	strcpy(*new, *str);
+	new++;
+	sptr = strchr(sptr, '\0');
+	sptr++;
+    }
+    *new = NULL;
+    return newarray;
+}
+
+static void FreeStringArray(String *str)
+{
+    if (str)
+	XtFree((char *) str);
+}
+
+
+#ifndef XT_NO_SM
+static SmProp * CardPack(
+    char *name,
+    XtPointer closure)
+{
+    unsigned char *prop = (unsigned char *) closure;
+    SmProp *p;
+
+    p = (SmProp *) __XtMalloc(sizeof(SmProp) + sizeof(SmPropValue));
+    p->vals = (SmPropValue *) (((char *) p) + sizeof(SmProp));
+    p->num_vals = 1;
+    p->type = SmCARD8;
+    p->name = name;
+    p->vals->length = 1;
+    p->vals->value = (SmPointer) prop;
+    return p;
+}
+
+static SmProp * ArrayPack(char *name, XtPointer closure)
+{
+    String prop = *(String *) closure;
+    SmProp *p;
+
+    p = (SmProp *) __XtMalloc(sizeof(SmProp) + sizeof(SmPropValue));
+    p->vals = (SmPropValue *) (((char *) p) + sizeof(SmProp));
+    p->num_vals = 1;
+    p->type = SmARRAY8;
+    p->name = name;
+    p->vals->length = strlen(prop) + 1;
+    p->vals->value = prop;
+    return p;
+}
+
+static SmProp * ListPack(
+    char *name,
+    XtPointer closure)
+{
+    String *prop = *(String **) closure;
+    SmProp *p;
+    String *ptr;
+    SmPropValue *vals;
+    int n = 0;
+
+    for (ptr = prop; *ptr; ptr++)
+	n++;
+    p = (SmProp*) __XtMalloc(sizeof(SmProp) + (Cardinal)(n*sizeof(SmPropValue)));
+    p->vals = (SmPropValue *) (((char *) p) + sizeof(SmProp));
+    p->num_vals = n;
+    p->type = SmLISTofARRAY8;
+    p->name = name;
+    for (ptr = prop, vals = p->vals; *ptr; ptr++, vals++) {
+	vals->length = strlen(*ptr) + 1;
+	vals->value = *ptr;
+    }
+    return p;
+}
+
+static void FreePacks(
+    SmProp **props,
+    int num_props)
+{
+    while (--num_props >= 0)
+	XtFree((char *) props[num_props]);
+}
+
+typedef SmProp* (*PackProc)(char *, XtPointer);
+
+typedef struct PropertyRec {
+    char *	name;
+    int		offset;
+    PackProc	proc;
+} PropertyRec, *PropertyTable;
+
+#define Offset(x) (XtOffsetOf(SessionShellRec, x))
+static PropertyRec propertyTable[] = {
+  {SmCloneCommand,     Offset(session.clone_command),    ListPack},
+  {SmCurrentDirectory, Offset(session.current_dir),      ArrayPack},
+  {SmDiscardCommand,   Offset(session.discard_command),  ListPack},
+  {SmEnvironment,      Offset(session.environment),      ListPack},
+  {SmProgram,          Offset(session.program_path),     ArrayPack},
+  {SmResignCommand,    Offset(session.resign_command),   ListPack},
+  {SmRestartCommand,   Offset(session.restart_command),  ListPack},
+  {SmRestartStyleHint, Offset(session.restart_style),    CardPack},
+  {SmShutdownCommand,  Offset(session.shutdown_command), ListPack}
+};
+#undef Offset
+
+#define XT_NUM_SM_PROPS 11
+
+static void SetSessionProperties(
+    SessionShellWidget w,
+    Boolean initialize,
+    unsigned long set_mask,
+    unsigned long unset_mask)
+{
+    PropertyTable p = propertyTable;
+    int n;
+    int num_props = 0;
+    XtPointer *addr;
+    unsigned long mask;
+    SmProp *props[XT_NUM_SM_PROPS];
+    char *pnames[XT_NUM_SM_PROPS];
+
+    if (w->session.connection == NULL)
+	return;
+
+    if (initialize) {
+	char nam_buf[32];
+	char pid[12];
+	String user_name;
+	String pidp = pid;
+
+	/* set all non-NULL session properties, the UserID and the ProcessID */
+	for (n = XtNumber(propertyTable); n; n--, p++) {
+	    addr = (XtPointer *) ((char *) w + p->offset);
+	    if (p->proc == CardPack) {
+		if (*(unsigned char *)addr)
+		    props[num_props++] =(*(p->proc))(p->name, (XtPointer)addr);
+	    }
+	    else if (* addr)
+		props[num_props++] = (*(p->proc))(p->name, (XtPointer)addr);
+
+	}
+	user_name = _XtGetUserName(nam_buf, sizeof nam_buf);
+	if (user_name)
+	    props[num_props++] = ArrayPack(SmUserID, &user_name);
+	sprintf(pid, "%ld", (long)getpid());
+	props[num_props++] = ArrayPack(SmProcessID, &pidp);
+
+	if (num_props) {
+	    SmcSetProperties(w->session.connection, num_props, props);
+	    FreePacks(props, num_props);
+	}
+	return;
+    }
+
+    if (set_mask) {
+	mask = 1L;
+	for (n = XtNumber(propertyTable); n; n--, p++, mask <<= 1)
+	    if (mask & set_mask) {
+		addr = (XtPointer *) ((char *) w + p->offset);
+		props[num_props++] = (*(p->proc))(p->name, (XtPointer)addr);
+	    }
+	SmcSetProperties(w->session.connection, num_props, props);
+	FreePacks(props, num_props);
+    }
+
+    if (unset_mask) {
+	mask = 1L;
+	num_props = 0;
+	for (n = XtNumber(propertyTable); n; n--, p++, mask <<= 1)
+	    if (mask & unset_mask)
+		pnames[num_props++] = p->name;
+	SmcDeleteProperties(w->session.connection, num_props, pnames);
+    }
+}
+
+/*ARGSUSED*/
+static void GetIceEvent(
+    XtPointer	client_data,
+    int *	source,
+    XtInputId *	id)
+{
+    SessionShellWidget w = (SessionShellWidget) client_data;
+    IceProcessMessagesStatus status;
+
+    status = IceProcessMessages(SmcGetIceConnection(w->session.connection),
+				NULL, NULL);
+
+    if (status == IceProcessMessagesIOError) {
+	StopManagingSession(w, w->session.connection);
+	XtCallCallbackList((Widget)w, w->session.error_callbacks,
+			   (XtPointer) NULL);
+    }
+}
+
+static void CleanUpSave(
+    SessionShellWidget w)
+{
+    XtSaveYourself next = w->session.save->next;
+    XtFree((char *)w->session.save);
+    w->session.save = next;
+    if (w->session.save)
+	CallSaveCallbacks(w);
+}
+
+static void CallSaveCallbacks(
+    SessionShellWidget w)
+{
+    XtCheckpointToken token;
+
+    if (XtHasCallbacks((Widget) w, XtNsaveCallback) != XtCallbackHasSome) {
+	/* if the application makes no attempt to save state, report failure */
+	SmcSaveYourselfDone(w->session.connection, False);
+	CleanUpSave(w);
+    } else {
+	w->session.checkpoint_state = XtSaveActive;
+	token = GetToken((Widget) w, XtSessionCheckpoint);
+	_XtCallConditionalCallbackList((Widget)w, w->session.save_callbacks,
+				       (XtPointer)token, ExamineToken);
+	XtSessionReturnToken(token);
+    }
+}
+
+/*ARGSUSED*/
+static void XtCallSaveCallbacks(
+    SmcConn	connection,	/* unused */
+    SmPointer	client_data,
+    int		save_type,
+    Bool	shutdown,
+    int		interact,
+    Bool	fast)
+{
+    SessionShellWidget w = (SessionShellWidget) client_data;
+    XtSaveYourself save;
+    XtSaveYourself prev;
+
+    save = XtNew(XtSaveYourselfRec);
+    save->next = NULL;
+    save->save_type = save_type;
+    save->interact_style = interact;
+    save->shutdown = shutdown;
+    save->fast = fast;
+    save->cancel_shutdown = False;
+    save->phase = 1;
+    save->interact_dialog_type = SmDialogNormal;
+    save->request_cancel = save->request_next_phase = False;
+    save->save_success = True;
+    save->save_tokens = save->interact_tokens = 0;
+
+    prev = (XtSaveYourself) &w->session.save;
+    while (prev->next)
+	prev = prev->next;
+    prev->next = save;
+
+    if (w->session.checkpoint_state == XtSaveInactive)
+	CallSaveCallbacks(w);
+}
+
+static void XtInteractPermission(
+    SmcConn	connection,
+    SmPointer	data)
+{
+    Widget w = (Widget) data;
+    SessionShellWidget sw = (SessionShellWidget) data;
+    XtCheckpointToken token;
+    XtCallbackProc callback;
+    XtPointer client_data;
+
+
+    _XtPeekCallback(w, sw->session.interact_callbacks, &callback,
+		    &client_data);
+    if (callback) {
+	sw->session.checkpoint_state = XtInteractActive;
+	token = GetToken(w, XtSessionInteract);
+    	XtRemoveCallback(w, XtNinteractCallback, callback, client_data);
+	(*callback)(w, client_data, (XtPointer) token);
+    } else if (! sw->session.save->cancel_shutdown) {
+	SmcInteractDone(connection, False);
+    }
+}
+
+/*ARGSUSED*/
+static void XtCallSaveCompleteCallbacks(
+    SmcConn	connection,
+    SmPointer	client_data)
+{
+    SessionShellWidget w =  (SessionShellWidget) client_data;
+
+    XtCallCallbackList((Widget)w, w->session.save_complete_callbacks,
+		       (XtPointer) NULL);
+}
+
+/*ARGSUSED*/
+static void XtCallNextPhaseCallbacks(
+    SmcConn	connection,	/* unused */
+    SmPointer	client_data)
+{
+    SessionShellWidget w =  (SessionShellWidget) client_data;
+    w->session.save->phase = 2;
+    CallSaveCallbacks(w);
+}
+
+/*ARGSUSED*/
+static void XtCallDieCallbacks(
+    SmcConn	connection,	/* unused */
+    SmPointer	client_data)
+{
+    SessionShellWidget w =  (SessionShellWidget) client_data;
+
+    StopManagingSession(w, w->session.connection);
+    XtCallCallbackList((Widget)w, w->session.die_callbacks,
+		       (XtPointer) NULL);
+}
+
+/*ARGSUSED*/
+static void XtCallCancelCallbacks(
+    SmcConn	connection,	/* unused */
+    SmPointer	client_data)
+{
+    SessionShellWidget w = (SessionShellWidget) client_data;
+    Boolean call_interacts = False;
+
+    if (w->session.checkpoint_state != XtSaveInactive) {
+	w->session.save->cancel_shutdown = True;
+	call_interacts = (w->session.save->interact_style !=
+			  SmInteractStyleNone);
+    }
+
+    XtCallCallbackList((Widget)w, w->session.cancel_callbacks,
+		       (XtPointer) NULL);
+
+    if (call_interacts) {
+	w->session.save->interact_style = SmInteractStyleNone;
+	XtInteractPermission(w->session.connection, (SmPointer) w);
+    }
+
+    if (w->session.checkpoint_state != XtSaveInactive) {
+	if (w->session.save->save_tokens == 0 &&
+	    w->session.checkpoint_state == XtSaveActive) {
+	    w->session.checkpoint_state = XtSaveInactive;
+	    SmcSaveYourselfDone(w->session.connection,
+				w->session.save->save_success);
+	    CleanUpSave(w);
+	}
+    }
+}
+
+static XtCheckpointToken GetToken(
+    Widget	widget,
+    int		type)
+{
+    SessionShellWidget w = (SessionShellWidget) widget;
+    XtCheckpointToken token;
+    XtSaveYourself save = w->session.save;
+
+    if (type == XtSessionCheckpoint)
+	w->session.save->save_tokens++;
+    else if (type == XtSessionInteract)
+	w->session.save->interact_tokens++;
+    else
+	return (XtCheckpointToken) NULL;
+
+    token = (XtCheckpointToken) __XtMalloc(sizeof(XtCheckpointTokenRec));
+    token->save_type = save->save_type;
+    token->interact_style = save->interact_style;
+    token->shutdown = save->shutdown;
+    token->fast = save->fast;
+    token->cancel_shutdown = save->cancel_shutdown;
+    token->phase = save->phase;
+    token->interact_dialog_type = save->interact_dialog_type;
+    token->request_cancel = save->request_cancel;
+    token->request_next_phase = save->request_next_phase;
+    token->save_success = save->save_success;
+    token->type = type;
+    token->widget = widget;
+    return token;
+}
+
+XtCheckpointToken XtSessionGetToken(Widget widget)
+{
+    SessionShellWidget w = (SessionShellWidget) widget;
+    XtCheckpointToken token = NULL;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (w->session.checkpoint_state)
+	token = GetToken(widget, XtSessionCheckpoint);
+
+    UNLOCK_APP(app);
+    return token;
+}
+
+static Boolean ExamineToken(
+    XtPointer	call_data)
+{
+    XtCheckpointToken token = (XtCheckpointToken) call_data;
+    SessionShellWidget w = (SessionShellWidget) token->widget;
+
+    if (token->interact_dialog_type == SmDialogError)
+	w->session.save->interact_dialog_type = SmDialogError;
+    if (token->request_next_phase)
+	w->session.save->request_next_phase = True;
+    if (! token->save_success)
+	w->session.save->save_success = False;
+
+    token->interact_dialog_type = w->session.save->interact_dialog_type;
+    token->request_next_phase = w->session.save->request_next_phase;
+    token->save_success = w->session.save->save_success;
+    token->cancel_shutdown = w->session.save->cancel_shutdown;
+
+    return True;
+}
+
+void XtSessionReturnToken(XtCheckpointToken token)
+{
+    SessionShellWidget w = (SessionShellWidget) token->widget;
+    Boolean has_some;
+    Boolean phase_done;
+    XtCallbackProc callback;
+    XtPointer client_data;
+    WIDGET_TO_APPCON((Widget)w);
+
+    LOCK_APP(app);
+
+    has_some = (XtHasCallbacks(token->widget, XtNinteractCallback)
+		== XtCallbackHasSome);
+
+    (void) ExamineToken((XtPointer) token);
+
+    if (token->type == XtSessionCheckpoint) {
+	w->session.save->save_tokens--;
+	if (has_some && w->session.checkpoint_state == XtSaveActive) {
+	    w->session.checkpoint_state = XtInteractPending;
+	    SmcInteractRequest(w->session.connection,
+			       w->session.save->interact_dialog_type,
+			       XtInteractPermission, (SmPointer) w);
+	}
+	XtFree((char*) token);
+    } else {
+	if (token->request_cancel)
+	    w->session.save->request_cancel = True;
+	token->request_cancel = w->session.save->request_cancel;
+	if (has_some) {
+	    _XtPeekCallback((Widget)w, w->session.interact_callbacks,
+			    &callback, &client_data);
+	    XtRemoveCallback((Widget)w, XtNinteractCallback,
+			     callback, client_data);
+	    (*callback)((Widget)w, client_data, (XtPointer)token);
+	} else {
+	    w->session.save->interact_tokens--;
+	    if (w->session.save->interact_tokens == 0) {
+		w->session.checkpoint_state = XtSaveActive;
+		if (! w->session.save->cancel_shutdown)
+		    SmcInteractDone(w->session.connection,
+				    w->session.save->request_cancel);
+	    }
+	    XtFree((char *) token);
+	}
+    }
+
+    phase_done = (w->session.save->save_tokens == 0 &&
+		  w->session.checkpoint_state == XtSaveActive);
+
+    if (phase_done) {
+	if (w->session.save->request_next_phase &&
+	    w->session.save->phase == 1) {
+	    SmcRequestSaveYourselfPhase2(w->session.connection,
+					 XtCallNextPhaseCallbacks,
+					 (SmPointer)w);
+	} else {
+	    w->session.checkpoint_state = XtSaveInactive;
+	    SmcSaveYourselfDone(w->session.connection,
+				w->session.save->save_success);
+	    CleanUpSave(w);
+	}
+    }
+
+    UNLOCK_APP(app);
+}
+
+static Boolean IsInArray(
+    String str,
+    String *sarray)
+{
+    if (str == NULL || sarray == NULL)
+	return False;
+    for (; *sarray; sarray++) {
+	if (strcmp(*sarray, str) == 0)
+	    return True;
+    }
+    return False;
+}
+
+static String* EditCommand(
+    String str,		/* if not NULL, the sm_client_id */
+    String *src1,	/* first choice */
+    String *src2)	/* alternate */
+{
+    Boolean have;
+    Boolean want;
+    int count;
+    String *sarray;
+    String *s;
+    String *new;
+
+    want = (str != NULL);
+    sarray = (src1 ? src1 : src2);
+    if (! sarray) return NULL;
+    have = IsInArray("-xtsessionID", sarray);
+    if ((want && have) || (!want && !have)) {
+	if (sarray == src1)
+	    return src1;
+	else
+	    return NewStringArray(sarray);
+    }
+
+    count = 0;
+    for (s = sarray; *s; s++)
+	count++;
+
+    if (want) {
+	s = new = (String *) __XtMalloc((Cardinal)(count+3) * sizeof(String*));
+	*s = *sarray;		s++; sarray++;
+	*s = "-xtsessionID";	s++;
+	*s = str;		s++;
+	for (; --count > 0; s++, sarray++)
+	    *s = *sarray;
+	*s = (String) NULL;
+    } else {
+	if (count < 3)
+	    return NewStringArray(sarray);
+	s = new = (String *) __XtMalloc((Cardinal)(count-1) * sizeof(String*));
+	for (; --count >= 0; sarray++) {
+	    if (strcmp(*sarray, "-xtsessionID") == 0) {
+		sarray++;
+		count--;
+	    } else {
+		*s = *sarray;
+		s++;
+	    }
+	}
+	*s = (String) NULL;
+    }
+    s = new;
+    new = NewStringArray(new);
+    XtFree((char *)s);
+    return new;
+}
+
+#endif /* !XT_NO_SM */
diff --git a/libXt/src/TMaction.c b/libXt/src/TMaction.c
new file mode 100644
index 000000000..54a8402ec
--- /dev/null
+++ b/libXt/src/TMaction.c
@@ -0,0 +1,1056 @@
+/* $Xorg: TMaction.c,v 1.5 2001/02/09 02:03:58 xorgcvs Exp $ */
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/TMaction.c,v 3.7 2001/12/14 19:56:30 dawes Exp $ */
+
+/* TMaction.c -- maintains the state table of actions for the translation 
+ *              manager.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+
+#if defined(__STDC__) && !defined(NORCONST)
+#define RConst const
+#else
+#define RConst /**/
+#endif
+
+static String XtNtranslationError = "translationError";
+
+typedef struct _CompiledAction{
+    XrmQuark		signature;
+    XtActionProc	proc;
+}CompiledAction, *CompiledActionTable;
+
+
+#define GetClassActions(wc) \
+  ((wc->core_class.actions) \
+? (((TMClassCache)wc->core_class.actions)->actions) \
+: NULL)
+
+static CompiledActionTable CompileActionTable(
+    register RConst struct _XtActionsRec *actions,
+    register Cardinal count,	/* may be 0 */
+    Boolean stat,	/* if False, copy before compiling in place */
+    Boolean perm)	/* if False, use XrmStringToQuark */
+{
+    register CompiledActionTable cActions;
+    register int i;
+    CompiledAction hold;
+    CompiledActionTable cTableHold;
+    XrmQuark (*func)(_Xconst char*);
+
+    if (!count)
+	return (CompiledActionTable) NULL;
+    func = (perm ? XrmPermStringToQuark : XrmStringToQuark);
+
+    if (! stat) {
+	cTableHold = cActions = (CompiledActionTable)
+	    __XtMalloc(count * sizeof(CompiledAction));
+
+	for (i=count; --i >= 0; cActions++, actions++) {
+	    cActions->proc = actions->proc;
+	    cActions->signature = (*func)(actions->string);
+	}
+    } else {
+	cTableHold = (CompiledActionTable) actions;
+
+	for (i=count; --i >= 0; actions++)
+	    ((CompiledActionTable) actions)->signature =
+		(*func)(actions->string);
+    }
+    cActions = cTableHold;
+
+    /* Insertion sort.  Whatever sort is used, it must be stable. */
+    for (i=1; (Cardinal) i <= count - 1; i++) {
+	register Cardinal j;
+	hold = cActions[i];
+	j = i;
+	while (j && cActions[j-1].signature > hold.signature) {
+	    cActions[j] = cActions[j-1];
+	    j--;
+	}
+	cActions[j] = hold;
+    }
+
+    return cActions;
+}
+
+
+typedef struct _ActionListRec *ActionList;
+typedef struct _ActionListRec {
+    ActionList		next;
+    CompiledActionTable table;
+    TMShortCard		count;
+} ActionListRec;
+
+static void ReportUnboundActions(
+    XtTranslations	xlations,
+    TMBindData		bindData)
+{
+    TMSimpleStateTree	stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+    Cardinal num_unbound = 0;
+    Cardinal num_params = 1;
+    char* message;
+    char messagebuf[1000];
+    String params[1];
+    register Cardinal num_chars = 0;
+    register Cardinal i, j;
+    XtActionProc *procs;
+
+    for (i=0; i < xlations->numStateTrees; i++) {
+	if (bindData->simple.isComplex)
+	  procs = TMGetComplexBindEntry(bindData, i)->procs;
+	else
+	  procs = TMGetSimpleBindEntry(bindData, i)->procs;
+
+	stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+	for (j=0; j < stateTree->numQuarks; j++) {
+	    if (procs[j] == NULL) {
+		String s = XrmQuarkToString(stateTree->quarkTbl[j]);
+		if (num_unbound != 0)
+		    num_chars += 2;
+		num_chars += strlen(s);
+		num_unbound++;
+	    }
+	}
+    }
+    if (num_unbound == 0)
+	return;
+    message = XtStackAlloc (num_chars + 1, messagebuf);
+    if (message != NULL) {
+	*message = '\0';
+	num_unbound = 0;
+	stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+	for (i=0; i < xlations->numStateTrees; i++) {
+	    if (bindData->simple.isComplex)
+		procs = TMGetComplexBindEntry(bindData, i)->procs;
+	    else
+		procs = TMGetSimpleBindEntry(bindData, i)->procs;
+
+	    stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+	    for (j=0; j < stateTree->numQuarks; j++) {
+		if (procs[j] == NULL) {
+		    String s = XrmQuarkToString(stateTree->quarkTbl[j]);
+		    if (num_unbound != 0)
+			(void) strcat(message, ", ");
+		    (void) strcat(message, s);
+		    num_unbound++;
+		}
+	    }
+	}
+	message[num_chars] = '\0';
+	params[0] = message;
+	XtWarningMsg(XtNtranslationError,"unboundActions",XtCXtToolkitError,
+		     "Actions not found: %s",
+		     params, &num_params);
+	XtStackFree (message, messagebuf);
+    }
+}
+
+
+static CompiledAction *SearchActionTable(
+    XrmQuark		signature,
+    CompiledActionTable	actionTable,
+    Cardinal		numActions)
+{
+    register int i, left, right;
+
+    left = 0;
+    right = numActions - 1;
+    while (left <= right) {
+	i = (left + right) >> 1;
+	if (signature < actionTable[i].signature)
+	    right = i - 1;
+	else if (signature > actionTable[i].signature)
+	    left = i + 1;
+	else {
+	    while (i && actionTable[i - 1].signature == signature)
+		i--;
+	    return &actionTable[i];
+	}
+    }
+    return (CompiledAction *) NULL;
+}
+
+static int BindActions(
+    TMSimpleStateTree	stateTree,
+    XtActionProc	*procs,
+    CompiledActionTable compiledActionTable,
+    TMShortCard		numActions,
+    Cardinal 		*ndxP)
+{
+    register int unbound = stateTree->numQuarks - *ndxP;
+    CompiledAction* action;
+    register Cardinal ndx;
+    register Boolean savedNdx = False;
+
+    for (ndx = *ndxP; ndx < stateTree->numQuarks; ndx++) {
+	if (procs[ndx] == NULL) {
+	    /* attempt to bind it */
+	    XrmQuark q = stateTree->quarkTbl[ndx];
+
+	    action = SearchActionTable(q, compiledActionTable, numActions);
+	    if (action) {
+		procs[ndx] = action->proc;
+		unbound--;
+	    } else if (!savedNdx) {
+		*ndxP= ndx;
+		savedNdx = True;
+	    }
+	} else {
+	    /* already bound, leave it alone */
+	    unbound--;
+	}
+    }
+    return unbound;
+}
+
+typedef struct _TMBindCacheStatusRec{
+    unsigned int	boundInClass:1;
+    unsigned int	boundInHierarchy:1;
+    unsigned int	boundInContext:1;
+    unsigned int	notFullyBound:1;
+    unsigned int	refCount:28;
+}TMBindCacheStatusRec, *TMBindCacheStatus;
+
+typedef struct _TMBindCacheRec{
+    struct _TMBindCacheRec *next;
+    TMBindCacheStatusRec status;
+    TMStateTree		stateTree;
+#ifdef TRACE_TM
+    WidgetClass		widgetClass;
+#endif /* TRACE_TM */
+    XtActionProc	procs[1];	/* variable length */
+}TMBindCacheRec, *TMBindCache;
+
+typedef struct _TMClassCacheRec {
+    CompiledActionTable	actions;
+    TMBindCacheRec	*bindCache;
+}TMClassCacheRec, *TMClassCache;
+
+#define IsPureClassBind(bc) \
+  (bc->status.boundInClass && \
+   !(bc->status.boundInHierarchy || \
+     bc->status.boundInContext || \
+     bc->status.notFullyBound))
+
+#define GetClassCache(w) \
+  ((TMClassCache)w->core.widget_class->core_class.actions)
+
+
+static int  BindProcs(
+    Widget 		widget,
+    TMSimpleStateTree	stateTree,
+    XtActionProc	*procs,
+    TMBindCacheStatus 	bindStatus)
+{
+    register WidgetClass    	class;
+    register ActionList     	actionList;
+    int 			unbound = -1, newUnbound = -1;
+    Cardinal 			ndx = 0;
+    Widget			w = widget;
+
+    LOCK_PROCESS;
+    do {
+        class = w->core.widget_class;
+        do {
+            if (class->core_class.actions != NULL)
+	      unbound =
+		BindActions(stateTree,
+			    procs,
+			    GetClassActions(class),
+			    class->core_class.num_actions,
+			    &ndx);
+	    class = class->core_class.superclass;
+        } while (unbound != 0 && class != NULL);
+	if (unbound < (int)stateTree->numQuarks)
+	  bindStatus->boundInClass = True;
+	else
+	  bindStatus->boundInClass = False;
+	if (newUnbound == -1)
+	  newUnbound = unbound;
+	w = XtParent(w);
+    } while (unbound != 0 && w != NULL);
+
+    if (newUnbound > unbound)
+      bindStatus->boundInHierarchy = True;
+    else
+      bindStatus->boundInHierarchy = False;
+
+    if (unbound) {
+	XtAppContext app = XtWidgetToApplicationContext(widget);
+	newUnbound = unbound;
+	for (actionList = app->action_table;
+	     unbound != 0 && actionList != NULL;
+	     actionList = actionList->next) {
+	    unbound = BindActions(stateTree,
+				  procs,
+				  actionList->table,
+				  actionList->count,
+				  &ndx);
+	}
+	if (newUnbound > unbound)
+	  bindStatus->boundInContext = True;
+	else
+	  bindStatus->boundInContext = False;
+
+    } else {
+	bindStatus->boundInContext = False;
+    }
+    UNLOCK_PROCESS;
+    return unbound;
+}
+
+static XtActionProc  *TryBindCache(
+    Widget	widget,
+    TMStateTree	stateTree)
+{
+    TMClassCache	classCache;
+
+    LOCK_PROCESS;
+    classCache = GetClassCache(widget);
+
+    if (classCache == NULL)
+      {
+	  WidgetClass	wc = XtClass(widget);
+
+	  wc->core_class.actions = (XtActionList)
+	    _XtInitializeActionData(NULL, 0, True);
+      }
+    else
+      {
+	  TMBindCache bindCache =
+	    (TMBindCache)(classCache->bindCache);
+	  for (; bindCache; bindCache = bindCache->next)
+	    {
+		if (IsPureClassBind(bindCache) &&
+		    (stateTree == bindCache->stateTree))
+		  {
+		      bindCache->status.refCount++;
+		      UNLOCK_PROCESS;
+		      return &bindCache->procs[0];
+		  }
+	    }
+      }
+    UNLOCK_PROCESS;
+    return NULL;
+}
+
+
+
+/*
+ * The class record actions field will point to the bind cache header
+ * after this call is made out of coreClassPartInit.
+ */
+XtPointer _XtInitializeActionData(
+    register struct _XtActionsRec	*actions,
+    register Cardinal			count,
+    _XtBoolean				inPlace)
+{
+    TMClassCache	classCache;
+
+    classCache = XtNew(TMClassCacheRec);
+    classCache->actions = CompileActionTable(actions, count, inPlace, True);
+    classCache->bindCache = NULL;
+    return (XtPointer)classCache;
+}
+
+
+#define TM_BIND_CACHE_REALLOC	2
+
+static XtActionProc *EnterBindCache(
+    Widget		w,
+    TMSimpleStateTree	stateTree,
+    XtActionProc 	*procs,
+    TMBindCacheStatus 	bindStatus)
+{
+    TMClassCache	classCache;
+    TMBindCache*	bindCachePtr;
+    TMShortCard		procsSize;
+    TMBindCache		bindCache;
+
+    LOCK_PROCESS;
+    classCache = GetClassCache(w);
+    bindCachePtr = &classCache->bindCache;
+    procsSize = stateTree->numQuarks * sizeof(XtActionProc);
+
+    for (bindCache = *bindCachePtr;
+	 (*bindCachePtr);
+	bindCachePtr = &(*bindCachePtr)->next, bindCache = *bindCachePtr)
+      {
+	  TMBindCacheStatus	cacheStatus = &bindCache->status;
+
+	  if ((bindStatus->boundInClass == cacheStatus->boundInClass) &&
+	      (bindStatus->boundInHierarchy == cacheStatus->boundInHierarchy) &&
+	      (bindStatus->boundInContext == cacheStatus->boundInContext) &&
+	      (bindCache->stateTree == (TMStateTree)stateTree) &&
+	      !XtMemcmp(&bindCache->procs[0], procs, procsSize))
+	    {
+		bindCache->status.refCount++;
+		break;
+	    }
+      }
+    if (*bindCachePtr == NULL)
+      {
+	  *bindCachePtr =
+	    bindCache = (TMBindCache)
+	      __XtMalloc(sizeof(TMBindCacheRec) +
+		       (procsSize - sizeof(XtActionProc)));
+	  bindCache->next = NULL;
+	  bindCache->status = *bindStatus;
+	  bindCache->status.refCount = 1;
+	  bindCache->stateTree = (TMStateTree)stateTree;
+#ifdef TRACE_TM
+	  bindCache->widgetClass = XtClass(w);
+	  if (_XtGlobalTM.numBindCache == _XtGlobalTM.bindCacheTblSize)
+	    {
+		_XtGlobalTM.bindCacheTblSize += 16;
+		_XtGlobalTM.bindCacheTbl = (TMBindCache *)
+		  XtRealloc((char *)_XtGlobalTM.bindCacheTbl,
+			    ((_XtGlobalTM.bindCacheTblSize) *
+			     sizeof(TMBindCache)));
+	    }
+	  _XtGlobalTM.bindCacheTbl[_XtGlobalTM.numBindCache++] = bindCache;
+#endif /* TRACE_TM */
+	  XtMemmove((XtPointer)&bindCache->procs[0],
+		    (XtPointer)procs, procsSize);
+      }
+    UNLOCK_PROCESS;
+    return &bindCache->procs[0];
+}
+
+static void RemoveFromBindCache(
+    Widget		w,
+    XtActionProc 	*procs)
+{
+    TMClassCache	classCache;
+    TMBindCache*	bindCachePtr;
+    TMBindCache		bindCache;
+    XtAppContext	app = XtWidgetToApplicationContext (w);
+
+    LOCK_PROCESS;
+    classCache = GetClassCache(w);
+    bindCachePtr = (TMBindCache *)&classCache->bindCache;
+
+    for (bindCache = *bindCachePtr;
+	 *bindCachePtr;
+	 bindCachePtr = &(*bindCachePtr)->next, bindCache = *bindCachePtr)
+      {
+	  if (&bindCache->procs[0] == procs)
+	    {
+		if (--bindCache->status.refCount == 0)
+		  {
+#ifdef TRACE_TM
+		      TMShortCard	j;
+		      Boolean		found = False;
+		      TMBindCache	*tbl = _XtGlobalTM.bindCacheTbl;
+
+		      for (j = 0; j < _XtGlobalTM.numBindCache; j++) {
+			  if (found)
+			    tbl[j-1] = tbl[j];
+			  if (tbl[j] == bindCache)
+			    found = True;
+		      }
+		      if (!found)
+			XtWarning("where's the action ??? ");
+		      else
+			_XtGlobalTM.numBindCache--;
+#endif /* TRACE_TM */
+		      *bindCachePtr = bindCache->next;
+		      bindCache->next = app->free_bindings;
+		      app->free_bindings = bindCache;
+		  }
+		break;
+	    }
+      }
+      UNLOCK_PROCESS;
+}
+
+/* ARGSUSED */
+static void RemoveAccelerators(
+    Widget widget,
+    XtPointer closure, XtPointer data)
+{
+    Widget 		destination = (Widget)closure;
+    TMComplexBindProcs	bindProcs;
+    XtTranslations	stackXlations[16];
+    XtTranslations	*xlationsList, destXlations;
+    TMShortCard		i, numXlations = 0;
+
+    if ((destXlations = destination->core.tm.translations) == NULL) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            XtNtranslationError,"nullTable",XtCXtToolkitError,
+            "Can't remove accelerators from NULL table",
+            (String *)NULL, (Cardinal *)NULL);
+        return;
+    }
+
+    xlationsList = (XtTranslations *)
+      XtStackAlloc((destXlations->numStateTrees * sizeof(XtTranslations)),
+		   stackXlations);
+
+    for (i = 0, bindProcs = TMGetComplexBindEntry(destination->core.tm.proc_table, i);
+	 i < destXlations->numStateTrees;
+	 i++, bindProcs++) {
+	if (bindProcs->widget == widget) {
+	    /*
+	     * if it's being destroyed don't do all the work
+	     */
+	    if (destination->core.being_destroyed) {
+		bindProcs->procs = NULL;
+	    }
+	    else
+	      xlationsList[numXlations] = bindProcs->aXlations;
+	    numXlations++;
+	}
+    }
+
+    if (numXlations == 0)
+      XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		      XtNtranslationError,"nullTable",XtCXtToolkitError,
+		      "Tried to remove nonexistent accelerators",
+		      (String *)NULL, (Cardinal *)NULL);
+    else {
+	if (!destination->core.being_destroyed)
+	  for (i = 0; i < numXlations; i++)
+	    _XtUnmergeTranslations(destination, xlationsList[i]);
+    }
+    XtStackFree((char *)xlationsList, stackXlations);
+}
+
+void _XtBindActions(
+    Widget widget,
+    XtTM tm)
+{
+    XtTranslations  		xlations = tm->translations;
+    TMSimpleStateTree		stateTree;
+    int				globalUnbound = 0;
+    Cardinal 			i;
+    TMBindData			bindData = (TMBindData)tm->proc_table;
+    TMSimpleBindProcs		simpleBindProcs = NULL;
+    TMComplexBindProcs 		complexBindProcs = NULL;
+    XtActionProc		*newProcs;
+    Widget			bindWidget;
+
+    if ((xlations == NULL) || widget->core.being_destroyed)
+      return;
+
+    stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+
+    for (i = 0; i < xlations->numStateTrees; i++)
+      {
+	  stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+	  if (bindData->simple.isComplex) {
+	      complexBindProcs = TMGetComplexBindEntry(bindData, i);
+	      if (complexBindProcs->widget) {
+		  bindWidget = complexBindProcs->widget;
+
+		  if (bindWidget->core.destroy_callbacks != NULL)
+		      _XtAddCallbackOnce((InternalCallbackList *)
+					 &bindWidget->core.destroy_callbacks,
+					 RemoveAccelerators,
+					 (XtPointer)widget);
+		  else
+		      _XtAddCallback((InternalCallbackList *)
+				     &bindWidget->core.destroy_callbacks,
+				     RemoveAccelerators,
+				     (XtPointer)widget);
+	      }
+	      else
+		bindWidget = widget;
+	  }
+	  else {
+	      simpleBindProcs = TMGetSimpleBindEntry(bindData, i);
+	      bindWidget = widget;
+	  }
+	  if ((newProcs =
+	       TryBindCache(bindWidget,(TMStateTree)stateTree)) == NULL)
+	    {
+		XtActionProc		*procs, stackProcs[256];
+		int			localUnbound;
+		TMBindCacheStatusRec	bcStatusRec;
+
+		procs = (XtActionProc *)
+		  XtStackAlloc(stateTree->numQuarks * sizeof(XtActionProc),
+			       stackProcs);
+		XtBZero((XtPointer)procs,
+			stateTree->numQuarks * sizeof(XtActionProc));
+
+		localUnbound = BindProcs(bindWidget,
+					 stateTree,
+					 procs,
+					 &bcStatusRec);
+
+		if (localUnbound)
+		  bcStatusRec.notFullyBound = True;
+		else
+		  bcStatusRec.notFullyBound = False;
+
+		newProcs =
+		  EnterBindCache(bindWidget,
+				 stateTree,
+				 procs,
+				 &bcStatusRec);
+		XtStackFree((XtPointer)procs, (XtPointer)stackProcs);
+		globalUnbound += localUnbound;
+	    }
+	  if (bindData->simple.isComplex)
+	    complexBindProcs->procs = newProcs;
+	  else
+	    simpleBindProcs->procs = newProcs;
+      }
+    if (globalUnbound)
+      ReportUnboundActions(xlations,
+			   (TMBindData)tm->proc_table);
+}
+
+
+void _XtUnbindActions(
+    Widget 	widget,
+    XtTranslations xlations,
+    TMBindData	bindData)
+{
+    Cardinal			i;
+    Widget			bindWidget;
+    XtActionProc		*procs;
+
+    if ((xlations == NULL) || !XtIsRealized(widget)) return;
+
+    for (i = 0; i < xlations->numStateTrees; i++) {
+	if (bindData->simple.isComplex) {
+	    TMComplexBindProcs	complexBindProcs;
+
+	    complexBindProcs = TMGetComplexBindEntry(bindData, i);
+
+	    if (complexBindProcs->widget) {
+		/*
+		 * check for this being an accelerator binding whose
+		 * source is gone ( set by RemoveAccelerators)
+		 */
+		if (complexBindProcs->procs == NULL)
+		  continue;
+
+		XtRemoveCallback(complexBindProcs->widget,
+				 XtNdestroyCallback,
+				 RemoveAccelerators,
+				 (XtPointer)widget);
+		bindWidget = complexBindProcs->widget;
+	    }
+	    else
+	      bindWidget = widget;
+	    procs = complexBindProcs->procs;
+	    complexBindProcs->procs = NULL;
+	}
+	else {
+	    TMSimpleBindProcs simpleBindProcs;
+	    simpleBindProcs = TMGetSimpleBindEntry(bindData,i);
+	    procs = simpleBindProcs->procs;
+	    simpleBindProcs->procs = NULL;
+	    bindWidget = widget;
+	}
+	RemoveFromBindCache(bindWidget, procs);
+      }
+}
+
+#ifdef notdef
+void _XtRemoveBindProcsByIndex(
+    Widget	w,
+    TMBindData	bindData,
+    TMShortCard	ndx)
+{
+    TMShortCard	i = ndx;
+    TMBindProcs	bindProcs = (TMBindProcs)&bindData->bindTbl[0];
+
+    RemoveFromBindCache(bindProcs->widget ? bindProcs->widget : w,
+			bindProcs[i].procs);
+
+    for (; i < bindData->bindTblSize; i++)
+      bindProcs[i] = bindProcs[i+1];
+}
+#endif /* notdef */
+
+/*
+ * used to free all copied action tables, called from DestroyAppContext
+ */
+void _XtFreeActions(
+    ActionList	actions)
+{
+    ActionList	curr, next;
+
+    for (curr = actions; curr;) {
+	next = curr->next;
+	XtFree((char *)curr->table);
+	XtFree((char *)curr);
+	curr = next;
+    }
+}
+
+void XtAddActions(
+    XtActionList actions,
+    Cardinal num_actions)
+{
+    XtAppAddActions(_XtDefaultAppContext(), actions, num_actions);
+}
+
+void XtAppAddActions(
+    XtAppContext app,
+    XtActionList actions,
+    Cardinal num_actions)
+{
+    register ActionList rec;
+
+    LOCK_APP(app);
+    rec = XtNew(ActionListRec);
+    rec->next = app->action_table;
+    app->action_table = rec;
+    rec->table = CompileActionTable(actions, num_actions, False, False);
+    rec->count = num_actions;
+    UNLOCK_APP(app);
+}
+
+void XtGetActionList(
+    WidgetClass widget_class,
+    XtActionList* actions_return,
+    Cardinal* num_actions_return)
+{
+    XtActionList list;
+    CompiledActionTable table;
+    int i;
+
+    *actions_return = NULL;
+    *num_actions_return = 0;
+
+    LOCK_PROCESS;
+    if (! widget_class->core_class.class_inited) {
+	UNLOCK_PROCESS;
+	return;
+    }
+    if (! (widget_class->core_class.class_inited & WidgetClassFlag)) {
+	UNLOCK_PROCESS;
+	return;
+    }
+    *num_actions_return = widget_class->core_class.num_actions;
+    if (*num_actions_return) {
+	list = *actions_return = (XtActionList)
+	    __XtMalloc(*num_actions_return * sizeof(XtActionsRec));
+	table = GetClassActions(widget_class);
+	for (i= (*num_actions_return); --i >= 0; list++, table++) {
+	    list->string = XrmQuarkToString(table->signature);
+	    list->proc = table->proc;
+	}
+    }
+    UNLOCK_PROCESS;
+}
+
+/***********************************************************************
+ *
+ * Pop-up and Grab stuff
+ *
+ ***********************************************************************/
+
+static Widget _XtFindPopup(
+    Widget widget,
+    String name)
+{
+    register Cardinal i;
+    register XrmQuark q;
+    register Widget w;
+
+    q = XrmStringToQuark(name);
+
+    for (w=widget; w != NULL; w=w->core.parent)
+	for (i=0; i<w->core.num_popups; i++)
+	    if (w->core.popup_list[i]->core.xrm_name == q)
+		return w->core.popup_list[i];
+
+    return NULL;
+}
+
+void XtMenuPopupAction(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    Boolean spring_loaded;
+    register Widget popup_shell;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+
+    LOCK_APP(app);
+    if (*num_params != 1) {
+	XtAppWarningMsg(app,
+		      "invalidParameters","xtMenuPopupAction",XtCXtToolkitError,
+			"MenuPopup wants exactly one argument",
+			(String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+
+    if (event->type == ButtonPress)
+	spring_loaded = True;
+    else if (event->type == KeyPress || event->type == EnterNotify)
+	spring_loaded = False;
+    else {
+	XtAppWarningMsg(app,
+		"invalidPopup","unsupportedOperation",XtCXtToolkitError,
+"Pop-up menu creation is only supported on ButtonPress, KeyPress or EnterNotify events.",
+                  (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_APP(app);
+	return;
+    }
+
+    popup_shell = _XtFindPopup(widget, params[0]);
+    if (popup_shell == NULL) {
+	XtAppWarningMsg(app,
+			"invalidPopup","xtMenuPopup",XtCXtToolkitError,
+			"Can't find popup widget \"%s\" in XtMenuPopup",
+			params, num_params);
+	UNLOCK_APP(app);
+	return;
+    }
+
+    if (spring_loaded) _XtPopup(popup_shell, XtGrabExclusive, TRUE);
+    else _XtPopup(popup_shell, XtGrabNonexclusive, FALSE);
+    UNLOCK_APP(app);
+}
+
+
+/*ARGSUSED*/
+static void _XtMenuPopdownAction(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    Widget popup_shell;
+
+    if (*num_params == 0) {
+	XtPopdown(widget);
+    } else if (*num_params == 1) {
+	popup_shell = _XtFindPopup(widget, params[0]);
+	if (popup_shell == NULL) {
+            XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+			    "invalidPopup","xtMenuPopdown",XtCXtToolkitError,
+			    "Can't find popup widget \"%s\" in XtMenuPopdown",
+			    params, num_params);
+	    return;
+	}
+	XtPopdown(popup_shell);
+    } else {
+	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+			"invalidParameters","xtMenuPopdown",XtCXtToolkitError,
+			"XtMenuPopdown called with num_params != 0 or 1",
+			(String *)NULL, (Cardinal *)NULL);
+    }
+}
+
+static XtActionsRec RConst tmActions[] = {
+    {"XtMenuPopup", XtMenuPopupAction},
+    {"XtMenuPopdown", _XtMenuPopdownAction},
+    {"MenuPopup", XtMenuPopupAction}, /* old & obsolete */
+    {"MenuPopdown", _XtMenuPopdownAction}, /* ditto */
+#ifndef NO_MIT_HACKS
+    {"XtDisplayTranslations", _XtDisplayTranslations},
+    {"XtDisplayAccelerators", _XtDisplayAccelerators},
+    {"XtDisplayInstalledAccelerators", _XtDisplayInstalledAccelerators},
+#endif
+};
+
+
+void _XtPopupInitialize(
+    XtAppContext app)
+{
+    register ActionList rec;
+
+    /*
+     * The _XtGlobalTM.newMatchSemantics flag determines whether
+     * we support old or new matching
+     * behavior. This is mainly an issue of whether subsequent lhs will
+     * get pushed up in the match table if a lhs containing thier initial
+     * sequence has already been encountered. Currently inited to False;
+     */
+#ifdef NEW_TM
+    _XtGlobalTM.newMatchSemantics = True;
+#else
+    _XtGlobalTM.newMatchSemantics = False;
+#endif
+
+    rec = XtNew(ActionListRec);
+    rec->next = app->action_table;
+    app->action_table = rec;
+    LOCK_PROCESS;
+    rec->table = CompileActionTable(tmActions, XtNumber(tmActions), False,
+				    True);
+    rec->count = XtNumber(tmActions);
+    UNLOCK_PROCESS;
+    _XtGrabInitialize(app);
+}
+
+
+void XtCallActionProc(
+    Widget widget,
+    _Xconst char* action,
+    XEvent *event,
+    String *params,
+    Cardinal num_params)
+{
+    CompiledAction* actionP;
+    XrmQuark q = XrmStringToQuark(action);
+    Widget w = widget;
+    XtAppContext app = XtWidgetToApplicationContext(widget);
+    ActionList actionList;
+    Cardinal i;
+
+    LOCK_APP(app);
+    XtCheckSubclass(widget, coreWidgetClass,
+		    "XtCallActionProc first argument is not a subclass of Core");
+    LOCK_PROCESS;
+    do {
+	WidgetClass class = XtClass(w);
+	do {
+	    if ((actionP = GetClassActions(class)) != NULL)
+	      for (i = 0;
+		   i < class->core_class.num_actions;
+		   i++, actionP++) {
+
+		  if (actionP->signature == q) {
+		      ActionHook hook = app->action_hook_list;
+		      while (hook != NULL) {
+			  (*hook->proc)( widget,
+					hook->closure,
+					(String)action,
+					event,
+					params,
+					&num_params
+					);
+			  hook= hook->next;
+		      }
+		      (*(actionP->proc))
+			(widget, event, params, &num_params);
+		      UNLOCK_PROCESS;
+		      UNLOCK_APP(app);
+		      return;
+		  }
+	      }
+	    class = class->core_class.superclass;
+	} while (class != NULL);
+	w = XtParent(w);
+    } while (w != NULL);
+    UNLOCK_PROCESS;
+
+    for (actionList = app->action_table;
+	 actionList != NULL;
+	 actionList = actionList->next) {
+
+	for (i = 0, actionP = actionList->table;
+	     i < actionList->count;
+	     i++, actionP++) {
+	    if (actionP->signature == q) {
+		ActionHook hook = app->action_hook_list;
+		while (hook != NULL) {
+		    (*hook->proc)( widget,
+				  hook->closure,
+				  (String)action,
+				  event,
+				  params,
+				  &num_params
+				  );
+		    hook= hook->next;
+		}
+		(*(actionP->proc))
+		  (widget, event, params, &num_params);
+		UNLOCK_APP(app);
+		return;
+	    }
+	}
+
+    }
+
+    {
+	String params[2];
+	Cardinal num_params = 2;
+	params[0] = (String)action;
+	params[1] = XtName(widget);
+	XtAppWarningMsg(app,
+			"noActionProc", "xtCallActionProc", XtCXtToolkitError,
+			"No action proc named \"%s\" is registered for widget \"%s\"",
+			params, &num_params
+			);
+    }
+    UNLOCK_APP(app);
+}
+
+void _XtDoFreeBindings(
+    XtAppContext app)
+{
+    TMBindCache bcp;
+
+    while (app->free_bindings) {
+	bcp = app->free_bindings->next;
+	XtFree ((char *) app->free_bindings);
+	app->free_bindings = bcp;
+    }
+}
diff --git a/libXt/src/TMgrab.c b/libXt/src/TMgrab.c
new file mode 100644
index 000000000..9fc4df982
--- /dev/null
+++ b/libXt/src/TMgrab.c
@@ -0,0 +1,336 @@
+/* $Xorg: TMgrab.c,v 1.4 2001/02/09 02:03:58 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/TMgrab.c,v 1.3 2001/12/14 19:56:30 dawes Exp $ */
+
+/*LINTLIBRARY*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+typedef struct _GrabActionRec {
+    struct _GrabActionRec* next;
+    XtActionProc action_proc;
+    Boolean owner_events;
+    unsigned int event_mask;
+    int pointer_mode, keyboard_mode;
+} GrabActionRec;
+
+static GrabActionRec *grabActionList = NULL;
+
+static void GrabAllCorrectKeys(
+    Widget widget,
+    TMTypeMatch typeMatch,
+    TMModifierMatch modMatch,
+    GrabActionRec* grabP)
+{
+    Display *dpy = XtDisplay(widget);
+    KeyCode *keycodes, *keycodeP;
+    Cardinal keycount;
+    Modifiers careOn = 0;
+    Modifiers careMask = 0;
+
+    if (modMatch->lateModifiers) {
+	Boolean resolved;
+	resolved = _XtComputeLateBindings(dpy, modMatch->lateModifiers,
+					  &careOn, &careMask);
+	if (!resolved) return;
+    }
+    careOn |= modMatch->modifiers;
+    careMask |= modMatch->modifierMask;
+
+    XtKeysymToKeycodeList(
+	    dpy,
+	    (KeySym)typeMatch->eventCode,
+	    &keycodes,
+	    &keycount
+			 );
+    if (keycount == 0) return;
+    for (keycodeP = keycodes; keycount--; keycodeP++) {
+	if (modMatch->standard) {
+	    /* find standard modifiers that produce this keysym */
+	    KeySym keysym;
+	    int std_mods, least_mod;
+	    Modifiers modifiers_return;
+	    XtTranslateKeycode( dpy, *keycodeP, (Modifiers)0,
+			        &modifiers_return, &keysym );
+	    if (careOn & modifiers_return)
+		return;
+	    if (keysym == typeMatch->eventCode) {
+		XtGrabKey(widget, *keycodeP, careOn,
+			  grabP->owner_events,
+			  grabP->pointer_mode,
+			  grabP->keyboard_mode
+			);
+		/* continue; */		/* grab all modifier combinations */
+	    }
+	    least_mod = modifiers_return & (~modifiers_return + 1);
+	    for (std_mods = modifiers_return;
+		 std_mods >= least_mod; std_mods--) {
+		Modifiers dummy;
+		 /* check all useful combinations of modifier bits */
+		if (modifiers_return & std_mods &&
+		    !(~modifiers_return & std_mods)) {
+		    XtTranslateKeycode( dpy, *keycodeP,
+					(Modifiers)std_mods,
+					&dummy, &keysym );
+		    if (keysym == typeMatch->eventCode) {
+			XtGrabKey(widget, *keycodeP,
+				  careOn | (Modifiers) std_mods,
+				  grabP->owner_events,
+				  grabP->pointer_mode,
+				  grabP->keyboard_mode
+				);
+			/* break; */	/* grab all modifier combinations */
+		    }
+		}
+	    }
+	} else /* !event->standard */ {
+	    XtGrabKey(widget, *keycodeP, careOn,
+		      grabP->owner_events,
+		      grabP->pointer_mode,
+		      grabP->keyboard_mode
+		    );
+	}
+    }
+    XtFree((char *)keycodes);
+}
+
+typedef struct {
+    TMShortCard count;
+    Widget	widget;
+    GrabActionRec *grabP;
+}DoGrabRec;
+
+static Boolean DoGrab(
+    StatePtr		state,
+    XtPointer		data)
+{
+    DoGrabRec		*doGrabP = (DoGrabRec *)data;
+    GrabActionRec* 	grabP = doGrabP->grabP;
+    Widget		widget = doGrabP->widget;
+    TMShortCard		count = doGrabP->count;
+    TMShortCard		typeIndex = state->typeIndex;
+    TMShortCard		modIndex = state->modIndex;
+    ActionRec		*action;
+    TMTypeMatch		typeMatch;
+    TMModifierMatch	modMatch;
+    Modifiers		careOn = 0;
+    Modifiers		careMask = 0;
+    Boolean		resolved;
+
+    LOCK_PROCESS;
+    typeMatch = TMGetTypeMatch(typeIndex);
+    modMatch = TMGetModifierMatch(modIndex);
+
+    for (action = state->actions; action; action = action->next)
+      if (count == action->idx) break;
+    if (!action) {
+	UNLOCK_PROCESS;
+	return False;
+    }
+
+    switch (typeMatch->eventType) {
+      case ButtonPress:
+      case ButtonRelease:
+	if (modMatch->lateModifiers) {
+	    resolved = _XtComputeLateBindings(XtDisplay(widget),
+					      modMatch->lateModifiers,
+					      &careOn, &careMask);
+	    if (!resolved) break;
+	}
+	careOn |= modMatch->modifiers;
+	XtGrabButton(
+		     widget,
+		     (unsigned) typeMatch->eventCode,
+		     careOn,
+		     grabP->owner_events,
+		     grabP->event_mask,
+		     grabP->pointer_mode,
+		     grabP->keyboard_mode,
+		     None,
+		     None
+		     );
+	break;
+
+      case KeyPress:
+      case KeyRelease:
+	GrabAllCorrectKeys(widget, typeMatch, modMatch, grabP);
+	break;
+
+      case EnterNotify:
+	break;
+
+      default:
+	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+			"invalidPopup","unsupportedOperation",XtCXtToolkitError,
+			"Pop-up menu creation is only supported on Button, Key or EnterNotify events.",
+			(String *)NULL, (Cardinal *)NULL);
+	break;
+    }
+    UNLOCK_PROCESS;
+    return False;
+}
+
+void _XtRegisterGrabs(
+    Widget widget)
+{
+    XtTranslations 	xlations = widget->core.tm.translations;
+    TMComplexStateTree 	*stateTreePtr;
+    unsigned int 	count;
+    TMShortCard		i;
+    TMBindData   	bindData = (TMBindData) widget->core.tm.proc_table;
+    XtActionProc	*procs;
+
+    if (! XtIsRealized(widget) || widget->core.being_destroyed)
+	return;
+
+    /* walk the widget instance action bindings table looking for */
+    /* actions registered as grab actions. */
+    /* when you find one, do a grab on the triggering event */
+
+    if (xlations == NULL) return;
+    stateTreePtr = (TMComplexStateTree *) xlations->stateTreeTbl;
+    if (*stateTreePtr == NULL) return;
+    for (i = 0; i < xlations->numStateTrees; i++, stateTreePtr++) {
+	if (bindData->simple.isComplex)
+	  procs = TMGetComplexBindEntry(bindData, i)->procs;
+	else
+	  procs = TMGetSimpleBindEntry(bindData, i)->procs;
+	for (count=0; count < (*stateTreePtr)->numQuarks; count++) {
+	    GrabActionRec* grabP;
+	    DoGrabRec      doGrab;
+
+	    LOCK_PROCESS;
+	    for (grabP = grabActionList; grabP != NULL; grabP = grabP->next) {
+		if (grabP->action_proc == procs[count]) {
+		    /* we've found a "grabber" in the action table. Find the
+		     * states that call this action.  Note that if there is
+		     * more than one "grabber" in the action table, we end
+		     * up searching all of the states multiple times.
+		     */
+		    doGrab.widget = widget;
+		    doGrab.grabP = grabP;
+		    doGrab.count = count;
+		    _XtTraverseStateTree((TMStateTree)*stateTreePtr,
+					 DoGrab,
+					 (XtPointer)&doGrab);
+		}
+	    }
+	    UNLOCK_PROCESS;
+	}
+    }
+}
+
+void XtRegisterGrabAction(
+    XtActionProc action_proc,
+    _XtBoolean owner_events,
+    unsigned int event_mask,
+    int pointer_mode,
+    int keyboard_mode)
+{
+    GrabActionRec* actionP;
+
+    LOCK_PROCESS;
+    for (actionP = grabActionList; actionP != NULL; actionP = actionP->next) {
+	if (actionP->action_proc == action_proc) break;
+    }
+    if (actionP == NULL) {
+	actionP = XtNew(GrabActionRec);
+	actionP->action_proc = action_proc;
+	actionP->next = grabActionList;
+	grabActionList = actionP;
+    }
+#ifdef DEBUG
+    else
+	if (   actionP->owner_events != owner_events
+	    || actionP->event_mask != event_mask
+	    || actionP->pointer_mode != pointer_mode
+	    || actionP->keyboard_mode != keyboard_mode) {
+	    Cardinal n = 0;
+	    XtWarningMsg(
+		"argsReplaced", "xtRegisterGrabAction", XtCXtToolkitError,
+		"XtRegisterGrabAction called on same proc with different args",
+			 NULL, &n);
+	}
+#endif /*DEBUG*/
+
+    actionP->owner_events = owner_events;
+    actionP->event_mask = event_mask;
+    actionP->pointer_mode = pointer_mode;
+    actionP->keyboard_mode = keyboard_mode;
+    UNLOCK_PROCESS;
+}
+
+/*ARGSUSED*/
+void _XtGrabInitialize(
+    XtAppContext	app)
+{
+    LOCK_PROCESS;
+    if (grabActionList == NULL)
+	XtRegisterGrabAction( XtMenuPopupAction, True,
+			      (unsigned)(ButtonPressMask | ButtonReleaseMask),
+			      GrabModeAsync,
+			      GrabModeAsync
+			    );
+    UNLOCK_PROCESS;
+
+}
diff --git a/libXt/src/TMkey.c b/libXt/src/TMkey.c
new file mode 100644
index 000000000..71bfddb36
--- /dev/null
+++ b/libXt/src/TMkey.c
@@ -0,0 +1,718 @@
+/* $Xorg: TMkey.c,v 1.4 2001/02/09 02:03:58 xorgcvs Exp $ */
+/*LINTLIBRARY*/
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/TMkey.c,v 3.10 2001/12/14 19:56:30 dawes Exp $ */
+
+#define XK_MISCELLANY
+#define XK_LATIN1
+#define XK_LATIN2
+#define XK_LATIN3
+#define XK_LATIN4
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <X11/keysymdef.h>
+#ifdef XKB
+#include <X11/XKBlib.h>
+#endif
+
+#define FLUSHKEYCACHE(ctx) \
+	bzero((char *)&ctx->keycache, sizeof(TMKeyCache))
+
+/*
+ * The following array reorders the modifier bits so that the most common ones
+ * (used by a translator) are in the top-most bits with respect to the size of
+ * the keycache.  The array currently just reverses the bits as a good guess.
+ * This might be more trouble than it is worth, but it seems to help.
+ */
+
+#define FM(i) i >> (8 - TMKEYCACHELOG2)
+static const unsigned char modmix[256] = {
+FM(0x0f), FM(0x8f), FM(0x4f), FM(0xcf), FM(0x2f), FM(0xaf), FM(0x6f), FM(0xef),
+FM(0x1f), FM(0x9f), FM(0x5f), FM(0xdf), FM(0x3f), FM(0xbf), FM(0x7f), FM(0xff),
+FM(0x07), FM(0x87), FM(0x47), FM(0xc7), FM(0x27), FM(0xa7), FM(0x67), FM(0xe7),
+FM(0x17), FM(0x97), FM(0x57), FM(0xd7), FM(0x37), FM(0xb7), FM(0x77), FM(0xf7),
+FM(0x0b), FM(0x8b), FM(0x4b), FM(0xcb), FM(0x2b), FM(0xab), FM(0x6b), FM(0xeb),
+FM(0x1b), FM(0x9b), FM(0x5b), FM(0xdb), FM(0x3b), FM(0xbb), FM(0x7b), FM(0xfb),
+FM(0x03), FM(0x83), FM(0x43), FM(0xc3), FM(0x23), FM(0xa3), FM(0x63), FM(0xe3),
+FM(0x13), FM(0x93), FM(0x53), FM(0xd3), FM(0x33), FM(0xb3), FM(0x73), FM(0xf3),
+FM(0x0d), FM(0x8d), FM(0x4d), FM(0xcd), FM(0x2d), FM(0xad), FM(0x6d), FM(0xed),
+FM(0x1d), FM(0x9d), FM(0x5d), FM(0xdd), FM(0x3d), FM(0xbd), FM(0x7d), FM(0xfd),
+FM(0x05), FM(0x85), FM(0x45), FM(0xc5), FM(0x25), FM(0xa5), FM(0x65), FM(0xe5),
+FM(0x15), FM(0x95), FM(0x55), FM(0xd5), FM(0x35), FM(0xb5), FM(0x75), FM(0xf5),
+FM(0x09), FM(0x89), FM(0x49), FM(0xc9), FM(0x29), FM(0xa9), FM(0x69), FM(0xe9),
+FM(0x19), FM(0x99), FM(0x59), FM(0xd9), FM(0x39), FM(0xb9), FM(0x79), FM(0xf9),
+FM(0x01), FM(0x81), FM(0x41), FM(0xc1), FM(0x21), FM(0xa1), FM(0x61), FM(0xe1),
+FM(0x11), FM(0x91), FM(0x51), FM(0xd1), FM(0x31), FM(0xb1), FM(0x71), FM(0xf1),
+FM(0x00), FM(0x8e), FM(0x4e), FM(0xce), FM(0x2e), FM(0xae), FM(0x6e), FM(0xee),
+FM(0x1e), FM(0x9e), FM(0x5e), FM(0xde), FM(0x3e), FM(0xbe), FM(0x7e), FM(0xfe),
+FM(0x08), FM(0x88), FM(0x48), FM(0xc8), FM(0x28), FM(0xa8), FM(0x68), FM(0xe8),
+FM(0x18), FM(0x98), FM(0x58), FM(0xd8), FM(0x38), FM(0xb8), FM(0x78), FM(0xf8),
+FM(0x04), FM(0x84), FM(0x44), FM(0xc4), FM(0x24), FM(0xa4), FM(0x64), FM(0xe4),
+FM(0x14), FM(0x94), FM(0x54), FM(0xd4), FM(0x34), FM(0xb4), FM(0x74), FM(0xf4),
+FM(0x0c), FM(0x8c), FM(0x4c), FM(0xcc), FM(0x2c), FM(0xac), FM(0x6c), FM(0xec),
+FM(0x1c), FM(0x9c), FM(0x5c), FM(0xdc), FM(0x3c), FM(0xbc), FM(0x7c), FM(0xfc),
+FM(0x02), FM(0x82), FM(0x42), FM(0xc2), FM(0x22), FM(0xa2), FM(0x62), FM(0xe2),
+FM(0x12), FM(0x92), FM(0x52), FM(0xd2), FM(0x32), FM(0xb2), FM(0x72), FM(0xf2),
+FM(0x0a), FM(0x8a), FM(0x4a), FM(0xca), FM(0x2a), FM(0xaa), FM(0x6a), FM(0xea),
+FM(0x1a), FM(0x9a), FM(0x5a), FM(0xda), FM(0x3a), FM(0xba), FM(0x7a), FM(0xfa),
+FM(0x06), FM(0x86), FM(0x46), FM(0xc6), FM(0x26), FM(0xa6), FM(0x66), FM(0xe6),
+FM(0x16), FM(0x96), FM(0x56), FM(0xd6), FM(0x36), FM(0xb6), FM(0x76), FM(0xf6),
+FM(0x0e), FM(0x8e), FM(0x4e), FM(0xce), FM(0x2e), FM(0xae), FM(0x6e), FM(0xee),
+FM(0x1e), FM(0x9e), FM(0x5e), FM(0xde), FM(0x3e), FM(0xbe), FM(0x7e), FM(0xfe)
+};
+#undef FM
+
+#define MOD_RETURN(ctx, key) (ctx)->keycache.modifiers_return[key]
+
+#define TRANSLATE(ctx,pd,dpy,key,mod,mod_ret,sym_ret) \
+{ \
+    int _i_ = (((key) - (pd)->min_keycode + modmix[(mod) & 0xff]) & \
+	       (TMKEYCACHESIZE-1)); \
+    if ((key) == 0) { /* Xlib XIM composed input */ \
+	mod_ret = 0; \
+	sym_ret = 0; \
+    } else if (   /* not Xlib XIM composed input */ \
+	(ctx)->keycache.keycode[_i_] == (key) && \
+	(ctx)->keycache.modifiers[_i_] == (mod)) { \
+	mod_ret = MOD_RETURN(ctx, key); \
+	sym_ret = (ctx)->keycache.keysym[_i_]; \
+    } else { \
+	XtTranslateKeycode(dpy, key, mod, &mod_ret, &sym_ret); \
+	(ctx)->keycache.keycode[_i_] = key; \
+	(ctx)->keycache.modifiers[_i_] = (unsigned char)(mod); \
+	(ctx)->keycache.keysym[_i_] = sym_ret; \
+	MOD_RETURN(ctx, key) = (unsigned char)mod_ret; \
+    } \
+}
+
+#define UPDATE_CACHE(ctx, pd, key, mod, mod_ret, sym_ret) \
+{ \
+    int _i_ = (((key) - (pd)->min_keycode + modmix[(mod) & 0xff]) & \
+	       (TMKEYCACHESIZE-1)); \
+    (ctx)->keycache.keycode[_i_] = key; \
+    (ctx)->keycache.modifiers[_i_] = (unsigned char)(mod); \
+    (ctx)->keycache.keysym[_i_] = sym_ret; \
+    MOD_RETURN(ctx, key) = (unsigned char)mod_ret; \
+}
+
+/* usual number of expected keycodes in XtKeysymToKeycodeList */
+#define KEYCODE_ARRAY_SIZE 10
+
+Boolean _XtComputeLateBindings(
+    Display *dpy,
+    LateBindingsPtr lateModifiers,
+    Modifiers *computed,
+    Modifiers *computedMask)
+{
+    int i,j,ref;
+    ModToKeysymTable* temp;
+    XtPerDisplay perDisplay;
+    Boolean found;
+    KeySym tempKeysym = NoSymbol;
+
+    perDisplay = _XtGetPerDisplay(dpy);
+    if (perDisplay == NULL) {
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+		"displayError","invalidDisplay",XtCXtToolkitError,
+            "Can't find display structure",
+            (String *)NULL, (Cardinal *)NULL);
+         return FALSE;
+    }
+    _InitializeKeysymTables(dpy, perDisplay);
+    for (ref=0; lateModifiers[ref].keysym; ref++) {
+        found = FALSE;
+        for (i=0;i<8;i++) {
+            temp = &(perDisplay->modsToKeysyms[i]);
+            for (j=0;j<temp->count;j++){
+                if (perDisplay->modKeysyms[temp->idx+j] ==
+		    lateModifiers[ref].keysym) {
+                    *computedMask = *computedMask | temp->mask;
+                    if (!lateModifiers[ref].knot)
+		      *computed |= temp->mask;
+                    tempKeysym = lateModifiers[ref].keysym;
+                    found = TRUE; break;
+                }
+            }
+            if (found) break;
+        }
+        if (!found  && !lateModifiers[ref].knot)
+            if (!lateModifiers[ref].pair && (tempKeysym == NoSymbol))
+                return FALSE;
+        /* if you didn't find the modifier and the modifier must be
+           asserted then return FALSE. If you didn't find the modifier
+           and the modifier must be off, then it is OK . Don't
+           return FALSE if this is the first member of a pair or if
+           it is the second member of a pair when the first member
+           was bound to a modifier */
+    if (!lateModifiers[ref].pair) tempKeysym = NoSymbol;
+    }
+    return TRUE;
+}
+
+void _XtAllocTMContext(
+    XtPerDisplay pd)
+{
+    TMKeyContext ctx;
+    ctx = (TMKeyContext)_XtHeapAlloc(&pd->heap,
+				     sizeof(TMKeyContextRec));
+    ctx->event = NULL;
+    ctx->serial = 0;
+    ctx->keysym = NoSymbol;
+    ctx->modifiers = 0;
+    FLUSHKEYCACHE(ctx);
+    pd->tm_context = ctx;
+}
+
+static unsigned int num_bits(unsigned long mask)
+{
+    register unsigned long y;
+
+    y = (mask >> 1) &033333333333;
+    y = mask - y - ((y >>1) & 033333333333);
+    return ((unsigned int) (((y + (y >> 3)) & 030707070707) % 077));
+}
+
+Boolean _XtMatchUsingDontCareMods(
+    TMTypeMatch 	typeMatch,
+    TMModifierMatch 	modMatch,
+    TMEventPtr 		eventSeq)
+{
+    Modifiers modifiers_return;
+    KeySym keysym_return;
+    Modifiers useful_mods;
+    int i, num_modbits;
+    Modifiers computed = 0;
+    Modifiers computedMask = 0;
+    Boolean resolved = TRUE;
+    Display *dpy = eventSeq->xev->xany.display;
+    XtPerDisplay pd;
+    TMKeyContext tm_context;
+
+    if (modMatch->lateModifiers != NULL)
+	resolved = _XtComputeLateBindings(dpy, modMatch->lateModifiers,
+					  &computed, &computedMask);
+    if (!resolved) return FALSE;
+    computed |= modMatch->modifiers;
+    computedMask |= modMatch->modifierMask; /* gives do-care mask */
+
+    if ( (computed & computedMask) ==
+        (eventSeq->event.modifiers & computedMask) ) {
+
+	pd = _XtGetPerDisplay(dpy);
+	tm_context = pd->tm_context;
+	TRANSLATE(tm_context, pd, dpy, (KeyCode)eventSeq->event.eventCode,
+			    (unsigned)0, modifiers_return, keysym_return);
+
+        if ((keysym_return & typeMatch->eventCodeMask)  == typeMatch->eventCode ) {
+	    tm_context->event = eventSeq->xev;
+	    tm_context->serial = eventSeq->xev->xany.serial;
+	    tm_context->keysym = keysym_return;
+	    tm_context->modifiers = (Modifiers)0;
+	    return TRUE;
+	}
+        useful_mods = ~computedMask & modifiers_return;
+        if (useful_mods == 0) return FALSE;
+
+	switch (num_modbits = num_bits(useful_mods)) {
+	case 1:
+	case 8:
+	    /*
+	     * one modbit should never happen, in fact the implementation
+	     * of XtTranslateKey and XmTranslateKey guarantee that it
+	     * won't, so don't care if the loop is set up for the case
+	     * when one modbit is set.
+	     * The performance implications of all eight modbits being
+	     * set is horrendous. This isn't a problem with Xt/Xaw based
+	     * applications. We can only hope that Motif's virtual
+	     * modifiers won't result in all eight modbits being set.
+	     */
+	    for (i = useful_mods; i > 0; i--) {
+		TRANSLATE(tm_context, pd, dpy, eventSeq->event.eventCode,
+			  (Modifiers)i, modifiers_return, keysym_return);
+		if (keysym_return ==
+		    (typeMatch->eventCode & typeMatch->eventCodeMask)) {
+		    tm_context->event = eventSeq->xev;
+		    tm_context->serial = eventSeq->xev->xany.serial;
+		    tm_context->keysym = keysym_return;
+		    tm_context->modifiers = (Modifiers)i;
+		    return TRUE;
+		}
+	    }
+	    break;
+	default: /* (2..7) */
+	    {
+	    /*
+	     * Only translate using combinations of the useful modifiers.
+	     * to minimize the chance of invalidating the cache.
+	     */
+		static char pows[] = { 0, 1, 3, 7, 15, 31, 63, 127 };
+		Modifiers tmod, mod_masks[8];
+		int j;
+		for (tmod = 1, i = 0; tmod <= (Mod5Mask<<1); tmod <<= 1)
+		    if (tmod & useful_mods) mod_masks[i++] = tmod;
+		for (j = (int) pows[num_modbits]; j > 0; j--) {
+		    tmod = 0;
+		    for (i = 0; i < num_modbits; i++)
+			if (j & (1<<i)) tmod |= mod_masks[i];
+		    TRANSLATE(tm_context, pd, dpy, eventSeq->event.eventCode,
+			      tmod, modifiers_return, keysym_return);
+		    if (keysym_return ==
+			(typeMatch->eventCode & typeMatch->eventCodeMask)) {
+			tm_context->event = eventSeq->xev;
+			tm_context->serial = eventSeq->xev->xany.serial;
+			tm_context->keysym = keysym_return;
+			tm_context->modifiers = (Modifiers)i;
+			return TRUE;
+		    }
+		}
+	    }
+	    break;
+	} /* switch (num_modbits) */
+    }
+    return FALSE;
+}
+
+void XtConvertCase(
+    Display *dpy,
+    KeySym keysym,
+    KeySym *lower_return,
+    KeySym *upper_return)
+{
+    XtPerDisplay pd;
+    CaseConverterPtr ptr;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+
+    *lower_return = *upper_return = keysym;
+    for (ptr=pd->case_cvt;  ptr; ptr = ptr->next)
+	if (ptr->start <= keysym && keysym <= ptr->stop) {
+	    (*ptr->proc)(dpy, keysym, lower_return, upper_return);
+	    return;
+	}
+    XConvertCase(keysym, lower_return, upper_return);
+    UNLOCK_APP(app);
+}
+
+Boolean _XtMatchUsingStandardMods (
+    TMTypeMatch typeMatch,
+    TMModifierMatch modMatch,
+    TMEventPtr eventSeq)
+{
+    Modifiers modifiers_return;
+    KeySym keysym_return;
+    Modifiers computed= 0;
+    Modifiers computedMask = 0;
+    Boolean resolved = TRUE;
+    Display *dpy = eventSeq->xev->xany.display;
+    XtPerDisplay pd = _XtGetPerDisplay(dpy);
+    TMKeyContext tm_context = pd->tm_context;
+    Modifiers translateModifiers;
+
+    /* To maximize cache utilization, we mask off nonstandard modifiers
+       before cache lookup.  For a given key translator, standard modifiers
+       are constant per KeyCode.  If a key translator uses no standard
+       modifiers this implementation will never reference the cache.
+     */
+
+    modifiers_return = MOD_RETURN(tm_context, eventSeq->event.eventCode);
+    if (!modifiers_return) {
+	XtTranslateKeycode(dpy, (KeyCode)eventSeq->event.eventCode,
+			   eventSeq->event.modifiers, &modifiers_return,
+			   &keysym_return);
+	translateModifiers = eventSeq->event.modifiers & modifiers_return;
+	UPDATE_CACHE(tm_context, pd, eventSeq->event.eventCode,
+		     translateModifiers, modifiers_return, keysym_return);
+    } else {
+	translateModifiers = eventSeq->event.modifiers & modifiers_return;
+	TRANSLATE(tm_context, pd, dpy, (KeyCode)eventSeq->event.eventCode,
+		  translateModifiers, modifiers_return, keysym_return);
+    }
+
+    if ((typeMatch->eventCode & typeMatch->eventCodeMask) ==
+             (keysym_return & typeMatch->eventCodeMask)) {
+        if (modMatch->lateModifiers != NULL)
+            resolved = _XtComputeLateBindings(dpy, modMatch->lateModifiers,
+					      &computed, &computedMask);
+        if (!resolved) return FALSE;
+        computed |= modMatch->modifiers;
+        computedMask |= modMatch->modifierMask;
+
+        if ((computed & computedMask) ==
+	    (eventSeq->event.modifiers & ~modifiers_return & computedMask)) {
+	    tm_context->event = eventSeq->xev;
+	    tm_context->serial = eventSeq->xev->xany.serial;
+	    tm_context->keysym = keysym_return;
+	    tm_context->modifiers = translateModifiers;
+	    return TRUE;
+	}
+    }
+    return FALSE;
+}
+
+
+void _XtBuildKeysymTables(
+    Display *dpy,
+    register XtPerDisplay pd)
+{
+    ModToKeysymTable *table;
+    int maxCount,i,j,k,tempCount,idx;
+    KeySym keysym,tempKeysym;
+    XModifierKeymap* modKeymap;
+    KeyCode keycode;
+#define KeysymTableSize 16
+
+    FLUSHKEYCACHE(pd->tm_context);
+    if (pd->keysyms)
+	XFree( (char *)pd->keysyms );
+    pd->keysyms_serial = NextRequest(dpy);
+    pd->keysyms = XGetKeyboardMapping(dpy, pd->min_keycode,
+				      pd->max_keycode-pd->min_keycode+1,
+				      &pd->keysyms_per_keycode);
+    if (pd->modKeysyms)
+	XtFree((char *)pd->modKeysyms);
+    if (pd->modsToKeysyms)
+	XtFree((char *)pd->modsToKeysyms);
+    pd->modKeysyms = (KeySym*)__XtMalloc((Cardinal)KeysymTableSize*sizeof(KeySym));
+    maxCount = KeysymTableSize;
+    tempCount = 0;
+
+    table = (ModToKeysymTable*)__XtMalloc((Cardinal)8*sizeof(ModToKeysymTable));
+    pd->modsToKeysyms = table;
+
+    table[0].mask = ShiftMask;
+    table[1].mask = LockMask;
+    table[2].mask = ControlMask;
+    table[3].mask = Mod1Mask;
+    table[4].mask = Mod2Mask;
+    table[5].mask = Mod3Mask;
+    table[6].mask = Mod4Mask;
+    table[7].mask = Mod5Mask;
+    tempKeysym = 0;
+
+    modKeymap = XGetModifierMapping(dpy);
+    for (i=0;i<32;i++)
+	pd->isModifier[i] = 0;
+    pd->mode_switch = 0;
+    pd->num_lock = 0;
+    for (i=0;i<8;i++) {
+        table[i].idx = tempCount;
+        table[i].count = 0;
+        for (j=0;j<modKeymap->max_keypermod;j++) {
+            keycode = modKeymap->modifiermap[i*modKeymap->max_keypermod+j];
+            if (keycode != 0) {
+		pd->isModifier[keycode>>3] |= 1 << (keycode & 7);
+                for (k=0; k<pd->keysyms_per_keycode;k++) {
+                    idx = ((keycode-pd->min_keycode)*
+                             pd->keysyms_per_keycode)+k;
+                    keysym = pd->keysyms[idx];
+		    if ((keysym == XK_Mode_switch) && (i > 2))
+			pd->mode_switch |= 1 << i;
+		    if ((keysym == XK_Num_Lock) && (i > 2))
+			pd->num_lock |= 1 << i;
+                    if (keysym != 0 && keysym != tempKeysym ){
+                        if (tempCount==maxCount) {
+                            maxCount += KeysymTableSize;
+                            pd->modKeysyms = (KeySym*)XtRealloc(
+                                (char*)pd->modKeysyms,
+                                (unsigned) (maxCount*sizeof(KeySym)) );
+                        }
+                        pd->modKeysyms[tempCount++] = keysym;
+                        table[i].count++;
+                        tempKeysym = keysym;
+                    }
+                }
+            }
+        }
+    }
+    pd->lock_meaning = NoSymbol;
+    for (i = 0; i < table[1].count; i++) {
+	keysym = pd->modKeysyms[table[1].idx + i];
+	if (keysym == XK_Caps_Lock) {
+	    pd->lock_meaning = XK_Caps_Lock;
+	    break;
+	} else if (keysym == XK_Shift_Lock) {
+	    pd->lock_meaning = XK_Shift_Lock;
+	}
+    }
+    XFreeModifiermap(modKeymap);
+}
+
+void XtTranslateKeycode (
+    Display *dpy,
+    _XtKeyCode keycode,
+    Modifiers modifiers,
+    Modifiers *modifiers_return,
+    KeySym *keysym_return)
+{
+    XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    (*pd->defaultKeycodeTranslator)(
+            dpy,keycode,modifiers,modifiers_return,keysym_return);
+    UNLOCK_APP(app);
+}
+
+/* This code should match XTranslateKey (internal, sigh) in Xlib */
+void XtTranslateKey(
+    register Display *dpy,
+    _XtKeyCode keycode,
+    Modifiers modifiers,
+    Modifiers *modifiers_return,
+    KeySym *keysym_return)
+{
+#ifndef XKB
+    XtPerDisplay pd;
+    int per;
+    register KeySym *syms;
+    KeySym sym, lsym, usym;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    *modifiers_return = (ShiftMask|LockMask) | pd->mode_switch | pd->num_lock;
+    if (((int)keycode < pd->min_keycode) || ((int)keycode > pd->max_keycode)) {
+	*keysym_return = NoSymbol;
+	UNLOCK_APP(app);
+	return;
+    }
+    per = pd->keysyms_per_keycode;
+    syms = &pd->keysyms[(keycode - pd->min_keycode) * per];
+    while ((per > 2) && (syms[per - 1] == NoSymbol))
+	per--;
+    if ((per > 2) && (modifiers & pd->mode_switch)) {
+	syms += 2;
+	per -= 2;
+    }
+    if ((modifiers & pd->num_lock) &&
+	(per > 1 && (IsKeypadKey(syms[1]) || IsPrivateKeypadKey(syms[1])))) {
+	if ((modifiers & ShiftMask) ||
+	    ((modifiers & LockMask) && (pd->lock_meaning == XK_Shift_Lock)))
+	    *keysym_return = syms[0];
+	else
+	    *keysym_return = syms[1];
+    } else if (!(modifiers & ShiftMask) &&
+	(!(modifiers & LockMask) || (pd->lock_meaning == NoSymbol))) {
+	if ((per == 1) || (syms[1] == NoSymbol))
+	    XtConvertCase(dpy, syms[0], keysym_return, &usym);
+	else
+	    *keysym_return = syms[0];
+    } else if (!(modifiers & LockMask) ||
+	       (pd->lock_meaning != XK_Caps_Lock)) {
+	if ((per == 1) || ((usym = syms[1]) == NoSymbol))
+	    XtConvertCase(dpy, syms[0], &lsym, &usym);
+	*keysym_return = usym;
+    } else {
+	if ((per == 1) || ((sym = syms[1]) == NoSymbol))
+	    sym = syms[0];
+	XtConvertCase(dpy, sym, &lsym, &usym);
+	if (!(modifiers & ShiftMask) && (sym != syms[0]) &&
+	    ((sym != usym) || (lsym == usym)))
+	    XtConvertCase(dpy, syms[0], &lsym, &usym);
+	*keysym_return = usym;
+    }
+
+    if (*keysym_return == XK_VoidSymbol)
+	*keysym_return = NoSymbol;
+    UNLOCK_APP(app);
+#else
+    XkbLookupKeySym(dpy, keycode, modifiers, modifiers_return, keysym_return);
+#endif
+}
+
+void XtSetKeyTranslator(
+    Display *dpy,
+    XtKeyProc translator)
+{
+    XtPerDisplay pd;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+
+    pd->defaultKeycodeTranslator = translator;
+    FLUSHKEYCACHE(pd->tm_context);
+    /* XXX should now redo grabs */
+    UNLOCK_APP(app);
+}
+
+void XtRegisterCaseConverter(
+    Display *dpy,
+    XtCaseProc proc,
+    KeySym start,
+    KeySym stop)
+{
+    XtPerDisplay pd;
+    CaseConverterPtr ptr, prev;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+
+    ptr = (CaseConverterPtr) __XtMalloc(sizeof(CaseConverterRec));
+    ptr->start = start;
+    ptr->stop = stop;
+    ptr->proc = proc;
+    ptr->next = pd->case_cvt;
+    pd->case_cvt = ptr;
+
+    /* Remove obsolete case converters from the list */
+    prev = ptr;
+    for (ptr=ptr->next; ptr; ptr=prev->next) {
+	if (start <= ptr->start && stop >= ptr->stop) {
+	    prev->next = ptr->next;
+	    XtFree((char *)ptr);
+	}
+	else prev = ptr;
+    }
+    FLUSHKEYCACHE(pd->tm_context);
+    /* XXX should now redo grabs */
+    UNLOCK_APP(app);
+}
+
+KeySym *XtGetKeysymTable(
+    Display *dpy,
+    KeyCode *min_keycode_return,
+    int *keysyms_per_keycode_return)
+{
+    XtPerDisplay pd;
+    KeySym* retval;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    *min_keycode_return = pd->min_keycode; /* %%% */
+    *keysyms_per_keycode_return = pd->keysyms_per_keycode;
+    retval = pd->keysyms;
+    UNLOCK_APP(app);
+    return retval;
+}
+
+void XtKeysymToKeycodeList(
+    Display *dpy,
+    KeySym keysym,
+    KeyCode **keycodes_return,
+    Cardinal *keycount_return)
+{
+    XtPerDisplay pd;
+    unsigned keycode;
+    int per, match;
+    register KeySym *syms;
+    register int i, j;
+    KeySym lsym, usym;
+    unsigned maxcodes = 0;
+    unsigned ncodes = 0;
+    KeyCode *keycodes, *codeP = NULL;
+    DPY_TO_APPCON(dpy);
+
+    LOCK_APP(app);
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    keycodes = NULL;
+    per = pd->keysyms_per_keycode;
+    for (syms = pd->keysyms, keycode = (unsigned) pd->min_keycode;
+	 (int)keycode <= pd->max_keycode;
+	 syms += per, keycode++) {
+	match = 0;
+	for (j = 0; j < per; j++) {
+	    if (syms[j] == keysym) {
+		match = 1;
+		break;
+	    }
+	}
+	if (!match)
+	    for (i = 1; i < 5; i += 2) {
+		if ((per == i) || ((per > i) && (syms[i] == NoSymbol))) {
+		    XtConvertCase(dpy, syms[i-1], &lsym, &usym);
+		    if ((lsym == keysym) || (usym == keysym)) {
+			match = 1;
+			break;
+		    }
+		}
+	    }
+	if (match) {
+	    if (ncodes == maxcodes) {
+		KeyCode *old = keycodes;
+		maxcodes += KEYCODE_ARRAY_SIZE;
+		keycodes = (KeyCode*)__XtMalloc(maxcodes*sizeof(KeyCode));
+		if (ncodes) {
+		    (void) memmove((char *)keycodes, (char *)old,
+				   ncodes*sizeof(KeyCode) );
+		    XtFree((char *)old);
+		}
+		codeP = &keycodes[ncodes];
+	    }
+	    *codeP++ = (KeyCode) keycode;
+	    ncodes++;
+	}
+    }
+    *keycodes_return = keycodes;
+    *keycount_return = ncodes;
+    UNLOCK_APP(app);
+}
diff --git a/libXt/src/TMparse.c b/libXt/src/TMparse.c
new file mode 100644
index 000000000..43ee8c9d5
--- /dev/null
+++ b/libXt/src/TMparse.c
@@ -0,0 +1,2136 @@
+/* $Xorg: TMparse.c,v 1.6 2001/02/09 02:03:58 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/TMparse.c,v 3.10tsi Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include <ctype.h>
+#include <stdlib.h>
+#ifndef NOTASCII
+#define XK_LATIN1
+#endif
+#define XK_MISCELLANY
+#include <X11/keysymdef.h>
+
+#ifdef CACHE_TRANSLATIONS
+# ifdef REFCNT_TRANSLATIONS
+#  define CACHED XtCacheAll | XtCacheRefCount
+# else
+#  define CACHED XtCacheAll
+# endif
+#else
+# define CACHED XtCacheNone
+#endif
+
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+static String XtNtranslationParseError = "translationParseError";
+
+typedef int		EventType;
+
+typedef String (*ParseProc)(
+    String /* str; */,
+    Opaque /* closure; */,
+    EventPtr /* event; */,
+    Boolean* /* error */);
+
+typedef TMShortCard	Value;
+typedef void (*ModifierProc)(Value, LateBindingsPtr*, Boolean, Value*);
+
+typedef struct _ModifierRec {
+    char*      name;
+    XrmQuark   signature;
+    ModifierProc modifierParseProc;
+    Value      value;
+} ModifierRec, *ModifierKeys;
+
+typedef struct _EventKey {
+    char    	*event;
+    XrmQuark	signature;
+    EventType	eventType;
+    ParseProc	parseDetail;
+    Opaque	closure;
+}EventKey, *EventKeys;
+
+typedef struct {
+    char	*name;
+    XrmQuark	signature;
+    Value	value;
+} NameValueRec, *NameValueTable;
+
+static void ParseModImmed(Value, LateBindingsPtr*, Boolean, Value*);
+static void ParseModSym(Value, LateBindingsPtr*, Boolean, Value*);
+static String PanicModeRecovery(String);
+static String CheckForPoundSign(String, _XtTranslateOp, _XtTranslateOp *);
+static KeySym StringToKeySym(String, Boolean *);
+static ModifierRec modifiers[] = {
+    {"Shift",	0,	ParseModImmed,ShiftMask},
+    {"Lock",	0,	ParseModImmed,LockMask},
+    {"Ctrl",	0,	ParseModImmed,ControlMask},
+    {"Mod1",	0,	ParseModImmed,Mod1Mask},
+    {"Mod2",	0,	ParseModImmed,Mod2Mask},
+    {"Mod3",	0,	ParseModImmed,Mod3Mask},
+    {"Mod4",	0,	ParseModImmed,Mod4Mask},
+    {"Mod5",	0,	ParseModImmed,Mod5Mask},
+    {"Meta",	0,	ParseModSym,  XK_Meta_L},
+    {"m",       0,      ParseModSym,  XK_Meta_L},
+    {"h",       0,      ParseModSym,  XK_Hyper_L},
+    {"su",      0,      ParseModSym,  XK_Super_L},
+    {"a",       0,      ParseModSym,  XK_Alt_L},
+    {"Hyper",   0,      ParseModSym,  XK_Hyper_L},
+    {"Super",   0,      ParseModSym,  XK_Super_L},
+    {"Alt",     0,      ParseModSym,  XK_Alt_L},
+    {"Button1",	0,	ParseModImmed,Button1Mask},
+    {"Button2",	0,	ParseModImmed,Button2Mask},
+    {"Button3",	0,	ParseModImmed,Button3Mask},
+    {"Button4",	0,	ParseModImmed,Button4Mask},
+    {"Button5",	0,	ParseModImmed,Button5Mask},
+    {"c",	0,	ParseModImmed,ControlMask},
+    {"s",	0,	ParseModImmed,ShiftMask},
+    {"l",	0,	ParseModImmed,LockMask},
+};
+
+static NameValueRec buttonNames[] = {
+    {"Button1",	0,	Button1},
+    {"Button2", 0,	Button2},
+    {"Button3", 0,	Button3},
+    {"Button4", 0,	Button4},
+    {"Button5", 0,	Button5},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec motionDetails[] = {
+    {"Normal",		0,	NotifyNormal},
+    {"Hint",		0,	NotifyHint},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec notifyModes[] = {
+    {"Normal",		0,	NotifyNormal},
+    {"Grab",		0,	NotifyGrab},
+    {"Ungrab",		0,	NotifyUngrab},
+    {"WhileGrabbed",    0,	NotifyWhileGrabbed},
+    {NULL, NULLQUARK, 0},
+};
+
+#if 0
+static NameValueRec notifyDetail[] = {
+    {"Ancestor",	    0,	NotifyAncestor},
+    {"Virtual",		    0,	NotifyVirtual},
+    {"Inferior",	    0,	NotifyInferior},
+    {"Nonlinear",	    0,	NotifyNonlinear},
+    {"NonlinearVirtual",    0,	NotifyNonlinearVirtual},
+    {"Pointer",		    0,	NotifyPointer},
+    {"PointerRoot",	    0,	NotifyPointerRoot},
+    {"DetailNone",	    0,	NotifyDetailNone},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec visibilityNotify[] = {
+    {"Unobscured",	    0,	VisibilityUnobscured},
+    {"PartiallyObscured",   0,	VisibilityPartiallyObscured},
+    {"FullyObscured",       0,	VisibilityFullyObscured},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec circulation[] = {
+    {"OnTop",       0,	PlaceOnTop},
+    {"OnBottom",    0,	PlaceOnBottom},
+    {NULL, NULLQUARK, 0},
+};
+
+static NameValueRec propertyChanged[] = {
+    {"NewValue",    0,	PropertyNewValue},
+    {"Delete",      0,	PropertyDelete},
+    {NULL, NULLQUARK, 0},
+};
+#endif /*0*/
+
+static NameValueRec mappingNotify[] = {
+    {"Modifier",	0,	MappingModifier},
+    {"Keyboard",	0,	MappingKeyboard},
+    {"Pointer",	0,	MappingPointer},
+    {NULL, NULLQUARK, 0},
+};
+
+static String ParseKeySym(String, Opaque, EventPtr, Boolean*);
+static String ParseKeyAndModifiers(String, Opaque, EventPtr, Boolean*);
+static String ParseTable(String, Opaque, EventPtr, Boolean*);
+static String ParseImmed(String, Opaque, EventPtr, Boolean*);
+static String ParseAddModifier(String, Opaque, EventPtr, Boolean*);
+static String ParseNone(String, Opaque, EventPtr, Boolean*);
+static String ParseAtom(String, Opaque, EventPtr, Boolean*);
+
+static EventKey events[] = {
+
+/* Event Name,	  Quark, Event Type,	Detail Parser, Closure */
+
+{"KeyPress",	    NULLQUARK, KeyPress,	ParseKeySym,	NULL},
+{"Key", 	    NULLQUARK, KeyPress,	ParseKeySym,	NULL},
+{"KeyDown",	    NULLQUARK, KeyPress,	ParseKeySym,	NULL},
+{"Ctrl",            NULLQUARK, KeyPress, ParseKeyAndModifiers,(Opaque)ControlMask},
+{"Shift",           NULLQUARK, KeyPress, ParseKeyAndModifiers,(Opaque)ShiftMask},
+{"Meta",            NULLQUARK, KeyPress,   ParseKeyAndModifiers,(Opaque)NULL},
+{"KeyUp",	    NULLQUARK, KeyRelease,	ParseKeySym,	NULL},
+{"KeyRelease",	    NULLQUARK, KeyRelease,	ParseKeySym,	NULL},
+
+{"ButtonPress",     NULLQUARK, ButtonPress,  ParseTable,(Opaque)buttonNames},
+{"BtnDown",	    NULLQUARK, ButtonPress,  ParseTable,(Opaque)buttonNames},
+{"Btn1Down",	    NULLQUARK, ButtonPress,	ParseImmed,(Opaque)Button1},
+{"Btn2Down", 	    NULLQUARK, ButtonPress,	ParseImmed,(Opaque)Button2},
+{"Btn3Down", 	    NULLQUARK, ButtonPress,	ParseImmed,(Opaque)Button3},
+{"Btn4Down", 	    NULLQUARK, ButtonPress,	ParseImmed,(Opaque)Button4},
+{"Btn5Down", 	    NULLQUARK, ButtonPress,	ParseImmed,(Opaque)Button5},
+
+/* Event Name,	  Quark, Event Type,	Detail Parser, Closure */
+
+{"ButtonRelease",   NULLQUARK, ButtonRelease,  ParseTable,(Opaque)buttonNames},
+{"BtnUp", 	    NULLQUARK, ButtonRelease,  ParseTable,(Opaque)buttonNames},
+{"Btn1Up", 	    NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button1},
+{"Btn2Up", 	    NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button2},
+{"Btn3Up", 	    NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button3},
+{"Btn4Up", 	    NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button4},
+{"Btn5Up", 	    NULLQUARK, ButtonRelease,    ParseImmed,(Opaque)Button5},
+
+{"MotionNotify",    NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"PtrMoved", 	    NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"Motion", 	    NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"MouseMoved", 	    NULLQUARK, MotionNotify, ParseTable, (Opaque)motionDetails},
+{"BtnMotion",  NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)AnyButtonMask},
+{"Btn1Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button1Mask},
+{"Btn2Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button2Mask},
+{"Btn3Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button3Mask},
+{"Btn4Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button4Mask},
+{"Btn5Motion", NULLQUARK, MotionNotify, ParseAddModifier, (Opaque)Button5Mask},
+
+{"EnterNotify",     NULLQUARK, EnterNotify,    ParseTable,(Opaque)notifyModes},
+{"Enter",	    NULLQUARK, EnterNotify,    ParseTable,(Opaque)notifyModes},
+{"EnterWindow",     NULLQUARK, EnterNotify,    ParseTable,(Opaque)notifyModes},
+
+{"LeaveNotify",     NULLQUARK, LeaveNotify,    ParseTable,(Opaque)notifyModes},
+{"LeaveWindow",     NULLQUARK, LeaveNotify,    ParseTable,(Opaque)notifyModes},
+{"Leave",	    NULLQUARK, LeaveNotify,    ParseTable,(Opaque)notifyModes},
+
+/* Event Name,	  Quark, Event Type,	Detail Parser, Closure */
+
+{"FocusIn",	    NULLQUARK, FocusIn,	  ParseTable,(Opaque)notifyModes},
+
+{"FocusOut",	    NULLQUARK, FocusOut,       ParseTable,(Opaque)notifyModes},
+
+{"KeymapNotify",    NULLQUARK, KeymapNotify,	ParseNone,	NULL},
+{"Keymap",	    NULLQUARK, KeymapNotify,	ParseNone,	NULL},
+
+{"Expose", 	    NULLQUARK, Expose,		ParseNone,	NULL},
+
+{"GraphicsExpose",  NULLQUARK, GraphicsExpose,	ParseNone,	NULL},
+{"GrExp",	    NULLQUARK, GraphicsExpose,	ParseNone,	NULL},
+
+{"NoExpose",	    NULLQUARK, NoExpose,	ParseNone,	NULL},
+{"NoExp",	    NULLQUARK, NoExpose,	ParseNone,	NULL},
+
+{"VisibilityNotify",NULLQUARK, VisibilityNotify,ParseNone,	NULL},
+{"Visible",	    NULLQUARK, VisibilityNotify,ParseNone,	NULL},
+
+{"CreateNotify",    NULLQUARK, CreateNotify,	ParseNone,	NULL},
+{"Create",	    NULLQUARK, CreateNotify,	ParseNone,	NULL},
+
+/* Event Name,	  Quark, Event Type,	Detail Parser, Closure */
+
+{"DestroyNotify",   NULLQUARK, DestroyNotify,	ParseNone,	NULL},
+{"Destroy",	    NULLQUARK, DestroyNotify,	ParseNone,	NULL},
+
+{"UnmapNotify",     NULLQUARK, UnmapNotify,	ParseNone,	NULL},
+{"Unmap",	    NULLQUARK, UnmapNotify,	ParseNone,	NULL},
+
+{"MapNotify",	    NULLQUARK, MapNotify,	ParseNone,	NULL},
+{"Map",		    NULLQUARK, MapNotify,	ParseNone,	NULL},
+
+{"MapRequest",	    NULLQUARK, MapRequest,	ParseNone,	NULL},
+{"MapReq",	    NULLQUARK, MapRequest,	ParseNone,	NULL},
+
+{"ReparentNotify",  NULLQUARK, ReparentNotify,	ParseNone,	NULL},
+{"Reparent",	    NULLQUARK, ReparentNotify,	ParseNone,	NULL},
+
+{"ConfigureNotify", NULLQUARK, ConfigureNotify,	ParseNone,	NULL},
+{"Configure",	    NULLQUARK, ConfigureNotify,	ParseNone,	NULL},
+
+{"ConfigureRequest",NULLQUARK, ConfigureRequest,ParseNone,	NULL},
+{"ConfigureReq",    NULLQUARK, ConfigureRequest,ParseNone,	NULL},
+
+/* Event Name,	  Quark, Event Type,	Detail Parser, Closure */
+
+{"GravityNotify",   NULLQUARK, GravityNotify,	ParseNone,	NULL},
+{"Grav",	    NULLQUARK, GravityNotify,	ParseNone,	NULL},
+
+{"ResizeRequest",   NULLQUARK, ResizeRequest,	ParseNone,	NULL},
+{"ResReq",	    NULLQUARK, ResizeRequest,	ParseNone,	NULL},
+
+{"CirculateNotify", NULLQUARK, CirculateNotify,	ParseNone,	NULL},
+{"Circ",	    NULLQUARK, CirculateNotify,	ParseNone,	NULL},
+
+{"CirculateRequest",NULLQUARK, CirculateRequest,ParseNone,	NULL},
+{"CircReq",	    NULLQUARK, CirculateRequest,ParseNone,	NULL},
+
+{"PropertyNotify",  NULLQUARK, PropertyNotify,	ParseAtom,	NULL},
+{"Prop",	    NULLQUARK, PropertyNotify,	ParseAtom,	NULL},
+
+{"SelectionClear",  NULLQUARK, SelectionClear,	ParseAtom,	NULL},
+{"SelClr",	    NULLQUARK, SelectionClear,	ParseAtom,	NULL},
+
+{"SelectionRequest",NULLQUARK, SelectionRequest,ParseAtom,	NULL},
+{"SelReq",	    NULLQUARK, SelectionRequest,ParseAtom,	NULL},
+
+/* Event Name,	  Quark, Event Type,	Detail Parser, Closure */
+
+{"SelectionNotify", NULLQUARK, SelectionNotify,	ParseAtom,	NULL},
+{"Select",	    NULLQUARK, SelectionNotify,	ParseAtom,	NULL},
+
+{"ColormapNotify",  NULLQUARK, ColormapNotify,	ParseNone,	NULL},
+{"Clrmap",	    NULLQUARK, ColormapNotify,	ParseNone,	NULL},
+
+{"ClientMessage",   NULLQUARK, ClientMessage,	ParseAtom,	NULL},
+{"Message",	    NULLQUARK, ClientMessage,	ParseAtom,	NULL},
+
+{"MappingNotify",   NULLQUARK, MappingNotify, ParseTable, (Opaque)mappingNotify},
+{"Mapping",	    NULLQUARK, MappingNotify, ParseTable, (Opaque)mappingNotify},
+
+#ifdef DEBUG
+# ifdef notdef
+{"Timer",	    NULLQUARK, _XtTimerEventType,ParseNone,	NULL},
+# endif /* notdef */
+{"EventTimer",	    NULLQUARK, _XtEventTimerEventType,ParseNone,NULL},
+#endif /* DEBUG */
+
+/* Event Name,	  Quark, Event Type,	Detail Parser, Closure */
+
+};
+
+#ifndef __UNIXOS2__
+#define IsNewline(str) ((str) == '\n')
+#else
+#define IsNewline(str) ((str) == '\n' || (str) == '\r')
+#endif
+
+#define ScanFor(str, ch) \
+    while ((*(str) != (ch)) && (*(str) != '\0') && !IsNewline(*(str))) (str)++
+
+#define ScanNumeric(str)  while ('0' <= *(str) && *(str) <= '9') (str)++
+
+#define ScanAlphanumeric(str) \
+    while (('A' <= *(str) && *(str) <= 'Z') || \
+           ('a' <= *(str) && *(str) <= 'z') || \
+           ('0' <= *(str) && *(str) <= '9')) (str)++
+
+#ifndef __UNIXOS2__
+#define ScanWhitespace(str) \
+    while (*(str) == ' ' || *(str) == '\t') (str)++
+#else
+#define ScanWhitespace(str) \
+    while (*(str) == ' ' || *(str) == '\t' || *(str) == '\r') (str)++
+#endif
+
+static Boolean initialized = FALSE;
+static XrmQuark QMeta;
+static XrmQuark QCtrl;
+static XrmQuark QNone;
+static XrmQuark QAny;
+
+static void FreeEventSeq(
+    EventSeqPtr eventSeq)
+{
+    register EventSeqPtr evs = eventSeq;
+
+    while (evs != NULL) {
+	evs->state = (StatePtr) evs;
+	if (evs->next != NULL
+	    && evs->next->state == (StatePtr) evs->next)
+	    evs->next = NULL;
+	evs = evs->next;
+    }
+
+    evs = eventSeq;
+    while (evs != NULL) {
+	register EventPtr event = evs;
+	evs = evs->next;
+	if (evs == event) evs = NULL;
+	XtFree((char *)event);
+    }
+}
+
+static void CompileNameValueTable(
+    NameValueTable table)
+{
+    register int i;
+
+    for (i=0; table[i].name; i++)
+        table[i].signature = XrmPermStringToQuark(table[i].name);
+}
+
+static int OrderEvents(_Xconst void *a, _Xconst void *b)
+{
+    return ((((_Xconst EventKey *)a)->signature <
+	     ((_Xconst EventKey *)b)->signature) ? -1 : 1);
+}
+
+static void Compile_XtEventTable(
+    EventKeys	table,
+    Cardinal	count)
+{
+    register int i;
+    register EventKeys entry = table;
+
+    for (i=count; --i >= 0; entry++)
+	entry->signature = XrmPermStringToQuark(entry->event);
+    qsort(table, count, sizeof(EventKey), OrderEvents);
+}
+
+static int OrderModifiers(_Xconst void *a, _Xconst void *b)
+{
+    return ((((_Xconst ModifierRec *)a)->signature <
+	     ((_Xconst ModifierRec *)b)->signature) ? -1 : 1);
+}
+
+static void Compile_XtModifierTable(
+    ModifierKeys table,
+    Cardinal count)
+{
+    register int i;
+    register ModifierKeys entry = table;
+
+    for (i=count; --i >= 0; entry++)
+	entry->signature = XrmPermStringToQuark(entry->name);
+    qsort(table, count, sizeof(ModifierRec), OrderModifiers);
+}
+
+static String PanicModeRecovery(
+    String str)
+{
+     ScanFor(str,'\n');
+     if (*str == '\n') str++;
+     return str;
+
+}
+
+
+static void Syntax(
+    String str0,String str1)
+{
+    Cardinal num_params = 2;
+    String params[2];
+
+    params[0] = str0;
+    params[1] = str1;
+    XtWarningMsg(XtNtranslationParseError,"parseError",XtCXtToolkitError,
+		 "translation table syntax error: %s %s",params,&num_params);
+}
+
+
+
+static Cardinal LookupTMEventType(
+  String eventStr,
+  Boolean *error)
+{
+    register int   i = 0, left, right;
+    register XrmQuark	signature;
+    static int 	previous = 0;
+
+    LOCK_PROCESS;
+    if ((signature = StringToQuark(eventStr)) == events[previous].signature) {
+	UNLOCK_PROCESS;
+	return (Cardinal) previous;
+    }
+
+    left = 0;
+    right = XtNumber(events) - 1;
+    while (left <= right) {
+	i = (left + right) >> 1;
+	if (signature < events[i].signature)
+	    right = i - 1;
+	else if (signature > events[i].signature)
+	    left = i + 1;
+	else {
+	    previous = i;
+	    UNLOCK_PROCESS;
+	    return (Cardinal) i;
+	}
+    }
+
+    Syntax("Unknown event type :  ",eventStr);
+    *error = TRUE;
+    UNLOCK_PROCESS;
+    return (Cardinal) i;
+}
+
+static void StoreLateBindings(
+    KeySym  keysymL,
+    Boolean notL,
+    KeySym keysymR,
+    Boolean notR,
+    LateBindingsPtr* lateBindings)
+{
+    LateBindingsPtr temp;
+    Boolean pair = FALSE;
+    unsigned long count,number;
+    if (lateBindings != NULL){
+        temp = *lateBindings;
+        if (temp != NULL) {
+            for (count = 0; temp[count].keysym; count++){/*EMPTY*/}
+        }
+        else count = 0;
+        if (! keysymR){
+             number = 1;pair = FALSE;
+        } else{
+             number = 2;pair = TRUE;
+        }
+
+        temp = (LateBindingsPtr)XtRealloc((char *)temp,
+            (unsigned)((count+number+1) * sizeof(LateBindings)) );
+        *lateBindings = temp;
+        temp[count].knot = notL;
+        temp[count].pair = pair;
+	if (count == 0)
+	    temp[count].ref_count = 1;
+        temp[count++].keysym = keysymL;
+        if (keysymR){
+            temp[count].knot = notR;
+            temp[count].pair = FALSE;
+	    temp[count].ref_count = 0;
+            temp[count++].keysym = keysymR;
+        }
+        temp[count].knot = temp[count].pair = FALSE;
+        temp[count].ref_count = 0;
+        temp[count].keysym = 0;
+    }
+}
+
+static void _XtParseKeysymMod(
+    String name,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value *valueP,
+    Boolean *error)
+{
+    KeySym keySym;
+    keySym = StringToKeySym(name, error);
+    *valueP = 0;
+    if (keySym != NoSymbol) {
+        StoreLateBindings(keySym,notFlag,(KeySym) NULL,FALSE,lateBindings);
+    }
+}
+
+static Boolean _XtLookupModifier(
+    XrmQuark signature,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value *valueP,
+    Bool constMask)
+{
+    register int i, left, right;
+    static int previous = 0;
+
+    LOCK_PROCESS;
+    if (signature == modifiers[previous].signature) {
+	if (constMask)  *valueP = modifiers[previous].value;
+	else /* if (modifiers[previous].modifierParseProc) always true */
+	   (*modifiers[previous].modifierParseProc)
+	      (modifiers[previous].value, lateBindings, notFlag, valueP);
+	UNLOCK_PROCESS;
+	return TRUE;
+    }
+
+    left = 0;
+    right = XtNumber(modifiers) - 1;
+    while (left <= right) {
+	i = (left + right) >> 1;
+	if (signature < modifiers[i].signature)
+	    right = i - 1;
+	else if (signature > modifiers[i].signature)
+	    left = i + 1;
+	else {
+	    previous = i;
+	    if (constMask)  *valueP = modifiers[i].value;
+	    else /* if (modifiers[i].modifierParseProc) always true */
+		(*modifiers[i].modifierParseProc)
+		    (modifiers[i].value, lateBindings, notFlag, valueP);
+	    UNLOCK_PROCESS;
+	    return TRUE;
+	}
+    }
+    UNLOCK_PROCESS;
+    return FALSE;
+}
+
+
+static String ScanIdent(
+    register String str)
+{
+    ScanAlphanumeric(str);
+    while (
+	   ('A' <= *str && *str <= 'Z')
+	|| ('a' <= *str && *str <= 'z')
+	|| ('0' <= *str && *str <= '9')
+	|| (*str == '-')
+	|| (*str == '_')
+	|| (*str == '$')
+	) str++;
+    return str;
+}
+
+static String FetchModifierToken(
+    String str,
+    XrmQuark *token_return)
+{
+    String start = str;
+
+    if (*str == '$') {
+        *token_return = QMeta;
+        str++;
+        return str;
+    }
+    if (*str == '^') {
+        *token_return = QCtrl;
+        str++;
+        return str;
+    }
+    str = ScanIdent(str);
+    if (start != str) {
+	char modStrbuf[100];
+	char* modStr;
+
+	modStr = XtStackAlloc ((size_t)(str - start + 1), modStrbuf);
+	if (modStr == NULL) _XtAllocError (NULL);
+	(void) memmove(modStr, start, str-start);
+	modStr[str-start] = '\0';
+	*token_return = XrmStringToQuark(modStr);
+	XtStackFree (modStr, modStrbuf);
+	return str;
+    }
+    return str;
+}
+
+static String ParseModifiers(
+    register String str,
+    EventPtr event,
+    Boolean* error)
+{
+    register String start;
+    Boolean notFlag, exclusive, keysymAsMod;
+    Value maskBit;
+    XrmQuark Qmod;
+
+    ScanWhitespace(str);
+    start = str;
+    str = FetchModifierToken(str, &Qmod);
+    exclusive = FALSE;
+    if (start != str) {
+	if (Qmod == QNone) {
+	    event->event.modifierMask = ~0;
+	    event->event.modifiers = 0;
+	    ScanWhitespace(str);
+	    return str;
+	} else if (Qmod == QAny) { /*backward compatability*/
+	    event->event.modifierMask = 0;
+	    event->event.modifiers = AnyModifier;
+	    ScanWhitespace(str);
+	    return str;
+	}
+	str = start; /*if plain modifier, reset to beginning */
+    }
+    else while (*str == '!' || *str == ':') {
+        if (*str == '!') {
+             exclusive = TRUE;
+             str++;
+             ScanWhitespace(str);
+        }
+        if (*str == ':') {
+             event->event.standard = TRUE;
+             str++;
+             ScanWhitespace(str);
+        }
+    }
+
+    while (*str != '<') {
+        if (*str == '~') {
+             notFlag = TRUE;
+             str++;
+          } else
+              notFlag = FALSE;
+        if (*str == '@') {
+            keysymAsMod = TRUE;
+            str++;
+        }
+        else keysymAsMod = FALSE;
+	start = str;
+        str = FetchModifierToken(str, &Qmod);
+        if (start == str) {
+            Syntax("Modifier or '<' expected","");
+            *error = TRUE;
+            return PanicModeRecovery(str);
+        }
+         if (keysymAsMod) {
+             _XtParseKeysymMod(XrmQuarkToString(Qmod),
+			       &event->event.lateModifiers,
+			       notFlag,&maskBit, error);
+	     if (*error)
+                 return PanicModeRecovery(str);
+
+         } else
+  	     if (!_XtLookupModifier(Qmod, &event->event.lateModifiers,
+				    notFlag, &maskBit, FALSE)) {
+	         Syntax("Unknown modifier name:  ", XrmQuarkToString(Qmod));
+                 *error = TRUE;
+                 return PanicModeRecovery(str);
+             }
+        event->event.modifierMask |= maskBit;
+	if (notFlag) event->event.modifiers &= ~maskBit;
+	else event->event.modifiers |= maskBit;
+        ScanWhitespace(str);
+    }
+    if (exclusive) event->event.modifierMask = ~0;
+    return str;
+}
+
+static String ParseXtEventType(
+    register String str,
+    EventPtr event,
+    Cardinal *tmEventP,
+    Boolean* error)
+{
+    String start = str;
+    char eventTypeStrbuf[100];
+    char* eventTypeStr;
+
+    ScanAlphanumeric(str);
+    eventTypeStr = XtStackAlloc ((size_t)(str - start + 1), eventTypeStrbuf);
+    if (eventTypeStr == NULL) _XtAllocError (NULL);
+    (void) memmove(eventTypeStr, start, str-start);
+    eventTypeStr[str-start] = '\0';
+    *tmEventP = LookupTMEventType(eventTypeStr,error);
+    XtStackFree (eventTypeStr, eventTypeStrbuf);
+    if (*error)
+        return PanicModeRecovery(str);
+    event->event.eventType = events[*tmEventP].eventType;
+    return str;
+}
+
+static unsigned long StrToHex(
+    String str)
+{
+    register char   c;
+    register unsigned long    val = 0;
+
+    while ((c = *str)) {
+	if ('0' <= c && c <= '9') val = val*16+c-'0';
+	else if ('a' <= c && c <= 'z') val = val*16+c-'a'+10;
+	else if ('A' <= c && c <= 'Z') val = val*16+c-'A'+10;
+	else return 0;
+	str++;
+    }
+
+    return val;
+}
+
+static unsigned long StrToOct(
+    String str)
+{
+    register char c;
+    register unsigned long  val = 0;
+
+    while ((c = *str)) {
+        if ('0' <= c && c <= '7') val = val*8+c-'0'; else return 0;
+	str++;
+    }
+
+    return val;
+}
+
+static unsigned long StrToNum(
+    String str)
+{
+    register char c;
+    register unsigned long val = 0;
+
+    if (*str == '0') {
+	str++;
+	if (*str == 'x' || *str == 'X') return StrToHex(++str);
+	else return StrToOct(str);
+    }
+
+    while ((c = *str)) {
+	if ('0' <= c && c <= '9') val = val*10+c-'0';
+	else return 0;
+	str++;
+    }
+
+    return val;
+}
+
+static KeySym StringToKeySym(
+    String str,
+    Boolean *error)
+{
+    KeySym k;
+
+    if (str == NULL || *str == '\0') return (KeySym) 0;
+
+#ifndef NOTASCII
+    /* special case single character ASCII, for speed */
+    if (*(str+1) == '\0') {
+	if (' ' <= *str && *str <= '~') return XK_space + (*str - ' ');
+    }
+#endif
+
+    if ('0' <= *str && *str <= '9') return (KeySym) StrToNum(str);
+    k = XStringToKeysym(str);
+    if (k != NoSymbol) return k;
+
+#ifdef NOTASCII
+    /* fall-back case to preserve backwards compatibility; no-one
+     * should be relying upon this!
+     */
+    if (*(str+1) == '\0') return (KeySym) *str;
+#endif
+
+    Syntax("Unknown keysym name: ", str);
+    *error = TRUE;
+    return NoSymbol;
+}
+/* ARGSUSED */
+static void ParseModImmed(
+    Value value,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value* valueP)
+{
+    *valueP = value;
+}
+
+ /* is only valid with keysyms that have an _L and _R in their name;
+  * and ignores keysym lookup errors (i.e. assumes only valid keysyms)
+  */
+static void ParseModSym(
+    Value value,
+    LateBindingsPtr* lateBindings,
+    Boolean notFlag,
+    Value* valueP)
+{
+    register KeySym keysymL = (KeySym)value;
+    register KeySym keysymR = keysymL + 1; /* valid for supported keysyms */
+    StoreLateBindings(keysymL,notFlag,keysymR,notFlag,lateBindings);
+    *valueP = 0;
+}
+
+#ifdef sparc
+/*
+ * The stupid optimizer in SunOS 4.0.3 and below generates bogus code that
+ * causes the value of the most recently used variable to be returned instead
+ * of the value passed in.
+ */
+static String stupid_optimizer_kludge;
+#define BROKEN_OPTIMIZER_HACK(val) stupid_optimizer_kludge = (val)
+#else
+#define BROKEN_OPTIMIZER_HACK(val) val
+#endif
+
+/* ARGSUSED */
+static String ParseImmed(
+    register String str,
+    register Opaque closure,
+    register EventPtr event,
+    Boolean* error)
+{
+    event->event.eventCode = (unsigned long)closure;
+    event->event.eventCodeMask = ~0UL;
+
+    return BROKEN_OPTIMIZER_HACK(str);
+}
+
+/* ARGSUSED */
+static String ParseAddModifier(
+    register String str,
+    register Opaque closure,
+    register EventPtr event,
+    Boolean* error)
+{
+    register unsigned long modval = (unsigned long)closure;
+    event->event.modifiers |= modval;
+    if (modval != AnyButtonMask) /* AnyButtonMask is don't-care mask */
+	event->event.modifierMask |= modval;
+
+    return BROKEN_OPTIMIZER_HACK(str);
+}
+
+
+static String ParseKeyAndModifiers(
+    String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    str = ParseKeySym(str, closure, event,error);
+    if ((unsigned long) closure == 0) {
+	Value metaMask; /* unused */
+	(void) _XtLookupModifier(QMeta, &event->event.lateModifiers, FALSE,
+				 &metaMask, FALSE);
+    } else {
+	event->event.modifiers |= (unsigned long) closure;
+	event->event.modifierMask |= (unsigned long) closure;
+    }
+    return str;
+}
+
+/*ARGSUSED*/
+static String ParseKeySym(
+    register String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    char *start;
+    char keySymNamebuf[100];
+    char* keySymName;
+
+    ScanWhitespace(str);
+
+    if (*str == '\\') {
+	keySymName = keySymNamebuf;
+	str++;
+	keySymName[0] = *str;
+	if (*str != '\0' && !IsNewline(*str)) str++;
+	keySymName[1] = '\0';
+	event->event.eventCode = StringToKeySym(keySymName, error);
+	event->event.eventCodeMask = ~0L;
+    } else if (*str == ',' || *str == ':' ||
+             /* allow leftparen to be single char symbol,
+              * for backwards compatibility
+              */
+             (*str == '(' && *(str+1) >= '0' && *(str+1) <= '9')) {
+	keySymName = keySymNamebuf; /* just so we can stackfree it later */
+	/* no detail */
+	event->event.eventCode = 0L;
+        event->event.eventCodeMask = 0L;
+    } else {
+	start = str;
+	while (
+		*str != ','
+		&& *str != ':'
+		&& *str != ' '
+		&& *str != '\t'
+                && !IsNewline(*str)
+                && (*str != '(' || *(str+1) <= '0' || *(str+1) >= '9')
+		&& *str != '\0') str++;
+	keySymName = XtStackAlloc ((size_t)(str - start + 1), keySymNamebuf);
+	(void) memmove(keySymName, start, str-start);
+	keySymName[str-start] = '\0';
+	event->event.eventCode = StringToKeySym(keySymName, error);
+	event->event.eventCodeMask = ~0L;
+    }
+    if (*error) {
+	/* We never get here when keySymName hasn't been allocated */
+	if (keySymName[0] == '<') {
+	    /* special case for common error */
+	    XtWarningMsg(XtNtranslationParseError, "missingComma",
+			 XtCXtToolkitError,
+		     "... possibly due to missing ',' in event sequence.",
+		     (String*)NULL, (Cardinal*)NULL);
+	}
+	XtStackFree (keySymName, keySymNamebuf);
+	return PanicModeRecovery(str);
+    }
+    if (event->event.standard)
+	event->event.matchEvent = _XtMatchUsingStandardMods;
+    else
+	event->event.matchEvent = _XtMatchUsingDontCareMods;
+
+    XtStackFree (keySymName, keySymNamebuf);
+
+    return str;
+}
+
+static String ParseTable(
+    register String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    register String start = str;
+    register XrmQuark signature;
+    NameValueTable table = (NameValueTable) closure;
+    char tableSymName[100];
+
+    event->event.eventCode = 0L;
+    ScanAlphanumeric(str);
+    if (str == start) {event->event.eventCodeMask = 0L; return str; }
+    if (str-start >= 99) {
+	Syntax("Invalid Detail Type (string is too long).", "");
+	*error = TRUE;
+	return str;
+    }
+    (void) memmove(tableSymName, start, str-start);
+    tableSymName[str-start] = '\0';
+    signature = StringToQuark(tableSymName);
+    for (; table->signature != NULLQUARK; table++)
+	if (table->signature == signature) {
+	    event->event.eventCode = table->value;
+	    event->event.eventCodeMask = ~0L;
+	    return str;
+	}
+
+    Syntax("Unknown Detail Type:  ", tableSymName);
+    *error = TRUE;
+    return PanicModeRecovery(str);
+}
+
+/*ARGSUSED*/
+static String ParseNone(
+    String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    event->event.eventCode = 0;
+    event->event.eventCodeMask = 0;
+
+    return BROKEN_OPTIMIZER_HACK(str);
+}
+
+/*ARGSUSED*/
+static String ParseAtom(
+    String str,
+    Opaque closure,
+    EventPtr event,
+    Boolean* error)
+{
+    ScanWhitespace(str);
+
+    if (*str == ',' || *str == ':') {
+	/* no detail */
+	event->event.eventCode = 0L;
+        event->event.eventCodeMask = 0L;
+    } else {
+	char *start, atomName[1000];
+	start = str;
+	while (
+		*str != ','
+		&& *str != ':'
+		&& *str != ' '
+		&& *str != '\t'
+                && !IsNewline(*str)
+		&& *str != '\0') str++;
+	if (str-start >= 999) {
+	    Syntax( "Atom name must be less than 1000 characters long.", "" );
+	    *error = TRUE;
+	    return str;
+	}
+	(void) memmove(atomName, start, str-start);
+	atomName[str-start] = '\0';
+	event->event.eventCode = XrmStringToQuark(atomName);
+	event->event.matchEvent = _XtMatchAtom;
+    }
+    return str;
+}
+
+static ModifierMask buttonModifierMasks[] = {
+    0, Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask
+};
+static String ParseRepeat(String, int *, Boolean *, Boolean *);
+
+static String ParseEvent(
+    register String str,
+    EventPtr	event,
+    int*	reps,
+    Boolean*	plus,
+    Boolean* error)
+{
+    Cardinal	tmEvent;
+
+    str = ParseModifiers(str, event,error);
+    if (*error) return str;
+    if (*str != '<') {
+         Syntax("Missing '<' while parsing event type.","");
+         *error = TRUE;
+         return PanicModeRecovery(str);
+    }
+    else str++;
+    str = ParseXtEventType(str, event, &tmEvent,error);
+    if (*error) return str;
+    if (*str != '>'){
+         Syntax("Missing '>' while parsing event type","");
+         *error = TRUE;
+         return PanicModeRecovery(str);
+    }
+    else str++;
+    if (*str == '(') {
+	str = ParseRepeat(str, reps, plus, error);
+	if (*error) return str;
+    }
+    str = (*(events[tmEvent].parseDetail))(
+        str, events[tmEvent].closure, event,error);
+    if (*error) return str;
+
+/* gross hack! ||| this kludge is related to the X11 protocol deficiency w.r.t.
+ * modifiers in grabs.
+ */
+    if ((event->event.eventType == ButtonRelease)
+	&& (event->event.modifiers | event->event.modifierMask) /* any */
+        && (event->event.modifiers != AnyModifier))
+    {
+	event->event.modifiers
+	    |= buttonModifierMasks[event->event.eventCode];
+	/* the button that is going up will always be in the modifiers... */
+    }
+
+    return str;
+}
+
+static String ParseQuotedStringEvent(
+    register String str,
+    register EventPtr event,
+    Boolean *error)
+{
+    Value metaMask;
+    char	s[2];
+
+    if (*str=='^') {
+	str++;
+	event->event.modifiers = ControlMask;
+    } else if (*str == '$') {
+	str++;
+	(void) _XtLookupModifier(QMeta, &event->event.lateModifiers, FALSE,
+				 &metaMask, FALSE);
+    }
+    if (*str == '\\')
+	str++;
+    s[0] = *str;
+    s[1] = '\0';
+    if (*str != '\0' && !IsNewline(*str)) str++;
+    event->event.eventType = KeyPress;
+    event->event.eventCode = StringToKeySym(s, error);
+    if (*error) return PanicModeRecovery(str);
+    event->event.eventCodeMask = ~0L;
+    event->event.matchEvent = _XtMatchUsingStandardMods;
+    event->event.standard = TRUE;
+
+    return str;
+}
+
+
+static EventSeqRec timerEventRec = {
+    {0, 0, NULL, _XtEventTimerEventType, 0L, 0L, NULL, False},
+    /* (StatePtr) -1 */ NULL,
+    NULL,
+    NULL
+};
+
+static void RepeatDown(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    upEvent->event.eventType = ((event->event.eventType == ButtonPress) ?
+	ButtonRelease : KeyRelease);
+    if ((upEvent->event.eventType == ButtonRelease)
+	&& (upEvent->event.modifiers != AnyModifier)
+        && (upEvent->event.modifiers | upEvent->event.modifierMask))
+	upEvent->event.modifiers
+	    |= buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+	event->event.lateModifiers->ref_count += (reps - 1) * 2;
+
+    for (i=1; i<reps; i++) {
+
+	/* up */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *upEvent;
+
+	/* timer */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = timerEventRec;
+
+	/* down */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *downEvent;
+
+    }
+
+    event->next = NULL;
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatDownPlus(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent, lastDownEvent = NULL;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    upEvent->event.eventType = ((event->event.eventType == ButtonPress) ?
+	ButtonRelease : KeyRelease);
+    if ((upEvent->event.eventType == ButtonRelease)
+	&& (upEvent->event.modifiers != AnyModifier)
+        && (upEvent->event.modifiers | upEvent->event.modifierMask))
+	upEvent->event.modifiers
+	    |= buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+	event->event.lateModifiers->ref_count += reps * 2 - 1;
+
+    for (i=0; i<reps; i++) {
+
+	if (i > 0) {
+	/* down */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *downEvent;
+	}
+	lastDownEvent = event;
+
+	/* up */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *upEvent;
+
+	/* timer */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = timerEventRec;
+
+    }
+
+    event->next = lastDownEvent;
+    *eventP = event;
+    *actionsP = &lastDownEvent->actions;
+}
+
+static void RepeatUp(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    /* the event currently sitting in *eventP is an "up" event */
+    /* we want to make it a "down" event followed by an "up" event, */
+    /* so that sequence matching on the "state" side works correctly. */
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    downEvent->event.eventType = ((event->event.eventType == ButtonRelease) ?
+	ButtonPress : KeyPress);
+    if ((downEvent->event.eventType == ButtonPress)
+	&& (downEvent->event.modifiers != AnyModifier)
+        && (downEvent->event.modifiers | downEvent->event.modifierMask))
+	downEvent->event.modifiers
+	    &= ~buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+	event->event.lateModifiers->ref_count += reps * 2 - 1;
+
+    /* up */
+    event->next = XtNew(EventSeqRec);
+    event = event->next;
+    *event = *upEvent;
+
+    for (i=1; i<reps; i++) {
+
+	/* timer */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = timerEventRec;
+
+	/* down */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *downEvent;
+
+	/* up */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *upEvent;
+
+	}
+
+    event->next = NULL;
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatUpPlus(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    EventRec upEventRec;
+    register EventPtr event, downEvent, lastUpEvent = NULL;
+    EventPtr upEvent = &upEventRec;
+    register int i;
+
+    /* the event currently sitting in *eventP is an "up" event */
+    /* we want to make it a "down" event followed by an "up" event, */
+    /* so that sequence matching on the "state" side works correctly. */
+
+    downEvent = event = *eventP;
+    *upEvent = *downEvent;
+    downEvent->event.eventType = ((event->event.eventType == ButtonRelease) ?
+	ButtonPress : KeyPress);
+    if ((downEvent->event.eventType == ButtonPress)
+	&& (downEvent->event.modifiers != AnyModifier)
+        && (downEvent->event.modifiers | downEvent->event.modifierMask))
+	downEvent->event.modifiers
+	    &= ~buttonModifierMasks[event->event.eventCode];
+
+    if (event->event.lateModifiers)
+	event->event.lateModifiers->ref_count += reps * 2;
+
+    for (i=0; i<reps; i++) {
+
+	/* up */
+	event->next = XtNew(EventSeqRec);
+	lastUpEvent = event = event->next;
+	*event = *upEvent;
+
+	/* timer */
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = timerEventRec;
+
+	/* down */
+	event->next = XtNew(EventSeqRec);
+        event = event->next;
+	*event = *downEvent;
+
+	}
+
+    event->next = lastUpEvent;
+    *eventP = event;
+    *actionsP = &lastUpEvent->actions;
+}
+
+static void RepeatOther(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    register EventPtr event, tempEvent;
+    register int i;
+
+    tempEvent = event = *eventP;
+
+    if (event->event.lateModifiers)
+	event->event.lateModifiers->ref_count += reps - 1;
+
+    for (i=1; i<reps; i++) {
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *tempEvent;
+    }
+
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatOtherPlus(
+    EventPtr *eventP,
+    int reps,
+    ActionPtr **actionsP)
+{
+    register EventPtr event, tempEvent;
+    register int i;
+
+    tempEvent = event = *eventP;
+
+    if (event->event.lateModifiers)
+	event->event.lateModifiers->ref_count += reps - 1;
+
+    for (i=1; i<reps; i++) {
+	event->next = XtNew(EventSeqRec);
+	event = event->next;
+	*event = *tempEvent;
+    }
+
+    event->next = event;
+    *eventP = event;
+    *actionsP = &event->actions;
+}
+
+static void RepeatEvent(
+    EventPtr *eventP,
+    int reps,
+    Boolean plus,
+    ActionPtr **actionsP)
+{
+    switch ((*eventP)->event.eventType) {
+
+	case ButtonPress:
+	case KeyPress:
+	    if (plus) RepeatDownPlus(eventP, reps, actionsP);
+	    else RepeatDown(eventP, reps, actionsP);
+	    break;
+
+	case ButtonRelease:
+	case KeyRelease:
+	    if (plus) RepeatUpPlus(eventP, reps, actionsP);
+	    else RepeatUp(eventP, reps, actionsP);
+	    break;
+
+	default:
+	    if (plus) RepeatOtherPlus(eventP, reps, actionsP);
+	    else RepeatOther(eventP, reps, actionsP);
+    }
+}
+
+static String ParseRepeat(
+    register String str,
+    int	*reps,
+    Boolean *plus, Boolean *error)
+{
+
+    /*** Parse the repetitions, for double click etc... ***/
+    if (*str != '(' || !(isdigit(str[1]) || str[1] == '+' || str[1] == ')'))
+	return str;
+    str++;
+    if (isdigit(*str)) {
+	String start = str;
+	char repStr[7];
+	size_t len;
+
+	ScanNumeric(str);
+	len = (str - start);
+	if (len < sizeof repStr) {
+	    (void) memmove(repStr, start, len);
+	    repStr[len] = '\0';
+	    *reps = StrToNum(repStr);
+	} else {
+	    Syntax("Repeat count too large.", "");
+	    *error = TRUE;
+	    return str;
+	}
+    }
+    if (*reps == 0) {
+	Syntax("Missing repeat count.","");
+	*error = True;
+	return str;
+    }
+
+    if (*str == '+') {
+	*plus = TRUE;
+	str++;
+    }
+    if (*str == ')')
+	str++;
+    else {
+	Syntax("Missing ')'.","");
+	*error = TRUE;
+    }
+
+    return str;
+}
+
+/***********************************************************************
+ * ParseEventSeq
+ * Parses the left hand side of a translation table production
+ * up to, and consuming the ":".
+ * Takes a pointer to a char* (where to start parsing) and returns an
+ * event seq (in a passed in variable), having updated the String
+ **********************************************************************/
+
+static String ParseEventSeq(
+    register String str,
+    EventSeqPtr *eventSeqP,
+    ActionPtr	**actionsP,
+    Boolean *error)
+{
+    EventSeqPtr *nextEvent = eventSeqP;
+
+    *eventSeqP = NULL;
+
+    while ( *str != '\0' && !IsNewline(*str)) {
+	static Event	nullEvent =
+             {0, 0,NULL, 0, 0L, 0L,_XtRegularMatch,FALSE};
+	EventPtr	event;
+
+	ScanWhitespace(str);
+
+	if (*str == '"') {
+	    str++;
+	    while (*str != '"' && *str != '\0' && !IsNewline(*str)) {
+                event = XtNew(EventRec);
+                event->event = nullEvent;
+                event->state = /* (StatePtr) -1 */ NULL;
+                event->next = NULL;
+                event->actions = NULL;
+		str = ParseQuotedStringEvent(str, event,error);
+		if (*error) {
+		    XtWarningMsg(XtNtranslationParseError, "nonLatin1",
+			XtCXtToolkitError,
+			"... probably due to non-Latin1 character in quoted string",
+			(String*)NULL, (Cardinal*)NULL);
+		    return PanicModeRecovery(str);
+		}
+		*nextEvent = event;
+		*actionsP = &event->actions;
+		nextEvent = &event->next;
+	    }
+	    if (*str != '"') {
+                Syntax("Missing '\"'.","");
+                *error = TRUE;
+                return PanicModeRecovery(str);
+             }
+             else str++;
+	} else {
+	    int reps = 0;
+	    Boolean plus = FALSE;
+
+            event = XtNew(EventRec);
+            event->event = nullEvent;
+            event->state = /* (StatePtr) -1 */ NULL;
+            event->next = NULL;
+            event->actions = NULL;
+
+	    str = ParseEvent(str, event, &reps, &plus, error);
+            if (*error) return str;
+	    *nextEvent = event;
+	    *actionsP = &event->actions;
+	    if (reps > 1 || plus)
+		RepeatEvent(&event, reps, plus, actionsP);
+	    nextEvent = &event->next;
+	}
+	ScanWhitespace(str);
+        if (*str == ':') break;
+        else {
+            if (*str != ',') {
+                Syntax("',' or ':' expected while parsing event sequence.","");
+                *error = TRUE;
+                return PanicModeRecovery(str);
+	    } else str++;
+        }
+    }
+
+    if (*str != ':') {
+        Syntax("Missing ':'after event sequence.","");
+        *error = TRUE;
+        return PanicModeRecovery(str);
+    } else str++;
+
+    return str;
+}
+
+
+static String ParseActionProc(
+    register String str,
+    XrmQuark *actionProcNameP,
+    Boolean *error)
+{
+    register String start = str;
+    char procName[200];
+
+    str = ScanIdent(str);
+    if (str-start >= 199) {
+	Syntax("Action procedure name is longer than 199 chars","");
+	*error = TRUE;
+	return str;
+    }
+    (void) memmove(procName, start, str-start);
+    procName[str-start] = '\0';
+    *actionProcNameP = XrmStringToQuark( procName );
+    return str;
+}
+
+
+static String ParseString(
+    register String str,
+    String *strP)
+{
+    register String start;
+
+    if (*str == '"') {
+	register unsigned prev_len, len;
+	str++;
+	start = str;
+	*strP = NULL;
+	prev_len = 0;
+
+	while (*str != '"' && *str != '\0') {
+	    /* \"  produces double quote embedded in a quoted parameter
+	     * \\" produces backslash as last character of a quoted parameter
+	     */
+	    if (*str == '\\' &&
+		(*(str+1) == '"' || (*(str+1) == '\\' && *(str+2) == '"'))) {
+		len = prev_len + (str-start+2);
+		*strP = XtRealloc(*strP, len);
+		(void) memmove(*strP + prev_len, start, str-start);
+		prev_len = len-1;
+		str++;
+		(*strP)[prev_len-1] = *str;
+		(*strP)[prev_len] = '\0';
+		start = str+1;
+	    }
+	    str++;
+	}
+	len = prev_len + (str-start+1);
+	*strP = XtRealloc(*strP, len);
+	(void) memmove( *strP + prev_len, start, str-start);
+	(*strP)[len-1] = '\0';
+	if (*str == '"') str++; else
+            XtWarningMsg(XtNtranslationParseError,"parseString",
+                      XtCXtToolkitError,"Missing '\"'.",
+		      (String *)NULL, (Cardinal *)NULL);
+    } else {
+	/* scan non-quoted string, stop on whitespace, ',' or ')' */
+	start = str;
+	while (*str != ' '
+		&& *str != '\t'
+		&& *str != ','
+		&& *str != ')'
+                && !IsNewline(*str)
+		&& *str != '\0') str++;
+	*strP = __XtMalloc((unsigned)(str-start+1));
+	(void) memmove(*strP, start, str-start);
+	(*strP)[str-start] = '\0';
+    }
+    return str;
+}
+
+
+static String ParseParamSeq(
+    register String str,
+    String **paramSeqP,
+    Cardinal *paramNumP)
+{
+    typedef struct _ParamRec *ParamPtr;
+    typedef struct _ParamRec {
+	ParamPtr next;
+	String	param;
+    } ParamRec;
+
+    ParamPtr params = NULL;
+    register Cardinal num_params = 0;
+    register Cardinal i;
+
+    ScanWhitespace(str);
+    while (*str != ')' && *str != '\0' && !IsNewline(*str)) {
+	String newStr;
+	str = ParseString(str, &newStr);
+	if (newStr != NULL) {
+	    ParamPtr temp = (ParamRec*)
+		ALLOCATE_LOCAL( (unsigned)sizeof(ParamRec) );
+	    if (temp == NULL) _XtAllocError (NULL);
+
+	    num_params++;
+	    temp->next = params;
+	    params = temp;
+	    temp->param = newStr;
+	    ScanWhitespace(str);
+	    if (*str == ',') {
+		str++;
+		ScanWhitespace(str);
+	    }
+	}
+    }
+
+    if (num_params != 0) {
+	String *paramP = (String *)
+		__XtMalloc( (unsigned)(num_params+1) * sizeof(String) );
+	*paramSeqP = paramP;
+	*paramNumP = num_params;
+	paramP += num_params; /* list is LIFO right now */
+	*paramP-- = NULL;
+	for (i=0; i < num_params; i++) {
+	    ParamPtr next = params->next;
+	    *paramP-- = params->param;
+	    DEALLOCATE_LOCAL( (char *)params );
+	    params = next;
+	}
+    } else {
+	*paramSeqP = NULL;
+	*paramNumP = 0;
+    }
+
+    return str;
+}
+
+static String ParseAction(
+    String str,
+    ActionPtr actionP,
+    XrmQuark* quarkP,
+    Boolean* error)
+{
+    str = ParseActionProc(str, quarkP, error);
+    if (*error) return str;
+
+    if (*str == '(') {
+	str++;
+	str = ParseParamSeq(str, &actionP->params, &actionP->num_params);
+    } else {
+        Syntax("Missing '(' while parsing action sequence","");
+        *error = TRUE;
+        return str;
+    }
+    if (*str == ')') str++;
+    else{
+        Syntax("Missing ')' while parsing action sequence","");
+        *error = TRUE;
+        return str;
+    }
+    return str;
+}
+
+
+static String ParseActionSeq(
+    TMParseStateTree   	parseTree,
+    String 		str,
+    ActionPtr 		*actionsP,
+    Boolean		*error)
+{
+    ActionPtr *nextActionP = actionsP;
+
+    *actionsP = NULL;
+    while (*str != '\0' && !IsNewline(*str)) {
+	register ActionPtr	action;
+	XrmQuark quark;
+
+	action = XtNew(ActionRec);
+        action->params = NULL;
+        action->num_params = 0;
+        action->next = NULL;
+
+	str = ParseAction(str, action, &quark, error);
+	if (*error) return PanicModeRecovery(str);
+
+	action->idx = _XtGetQuarkIndex(parseTree, quark);
+	ScanWhitespace(str);
+	*nextActionP = action;
+	nextActionP = &action->next;
+    }
+    if (IsNewline(*str)) str++;
+    ScanWhitespace(str);
+    return str;
+}
+
+
+static void ShowProduction(
+  String currentProduction)
+{
+    Cardinal num_params = 1;
+    String params[1];
+    size_t len;
+    char *eol, *production, productionbuf[500];
+
+#ifdef __UNIXOS2__
+    eol = strchr(currentProduction, '\r');
+    if (!eol) /* try '\n' as well below */
+#endif
+        eol = strchr(currentProduction, '\n');
+    if (eol) len = eol - currentProduction;
+    else len = strlen (currentProduction);
+    production = XtStackAlloc (len + 1, productionbuf);
+    if (production == NULL) _XtAllocError (NULL);
+    (void) memmove(production, currentProduction, len);
+    production[len] = '\0';
+
+    params[0] = production;
+    XtWarningMsg(XtNtranslationParseError, "showLine", XtCXtToolkitError,
+		 "... found while parsing '%s'", params, &num_params);
+
+    XtStackFree (production, productionbuf);
+}
+
+/***********************************************************************
+ * ParseTranslationTableProduction
+ * Parses one line of event bindings.
+ ***********************************************************************/
+
+static String ParseTranslationTableProduction(
+    TMParseStateTree	 parseTree,
+    register String str,
+    Boolean* error)
+{
+    EventSeqPtr	eventSeq = NULL;
+    ActionPtr	*actionsP;
+    String	production = str;
+
+    actionsP = NULL;
+    str = ParseEventSeq(str, &eventSeq, &actionsP,error);
+    if (*error == TRUE) {
+	ShowProduction(production);
+        FreeEventSeq(eventSeq);
+        return (str);
+    }
+    ScanWhitespace(str);
+    str = ParseActionSeq(parseTree, str, actionsP, error);
+    if (*error == TRUE) {
+	ShowProduction(production);
+        FreeEventSeq(eventSeq);
+        return (str);
+    }
+
+    _XtAddEventSeqToStateTree(eventSeq, parseTree);
+    FreeEventSeq(eventSeq);
+    return (str);
+}
+
+static String CheckForPoundSign(
+    String str,
+    _XtTranslateOp defaultOp,
+    _XtTranslateOp *actualOpRtn)
+{
+    String start;
+    char operation[20];
+    _XtTranslateOp opType;
+
+    opType = defaultOp;
+    ScanWhitespace(str);
+    if (*str == '#') {
+	int len;
+	str++;
+	start = str;
+	str = ScanIdent(str);
+	len = MIN(19, str-start);
+	(void) memmove(operation, start, len);
+	operation[len] = '\0';
+	if (!strcmp(operation,"replace"))
+	  opType = XtTableReplace;
+	else if (!strcmp(operation,"augment"))
+	  opType = XtTableAugment;
+	else if (!strcmp(operation,"override"))
+	  opType = XtTableOverride;
+	ScanWhitespace(str);
+	if (IsNewline(*str)) {
+	    str++;
+	    ScanWhitespace(str);
+	}
+    }
+    *actualOpRtn = opType;
+    return str;
+}
+
+static XtTranslations ParseTranslationTable(
+    String 	source,
+    Boolean	isAccelerator,
+    _XtTranslateOp defaultOp,
+    Boolean*	error)
+{
+    XtTranslations		xlations;
+    TMStateTree			stateTrees[8];
+    TMParseStateTreeRec		parseTreeRec, *parseTree = &parseTreeRec;
+    XrmQuark			stackQuarks[200];
+    TMBranchHeadRec		stackBranchHeads[200];
+    StatePtr			stackComplexBranchHeads[200];
+    _XtTranslateOp		actualOp;
+
+    if (source == NULL)
+      return (XtTranslations)NULL;
+
+    source = CheckForPoundSign(source, defaultOp, &actualOp);
+    if (isAccelerator && actualOp == XtTableReplace)
+	actualOp = defaultOp;
+
+    parseTree->isSimple = TRUE;
+    parseTree->mappingNotifyInterest = FALSE;
+    parseTree->isAccelerator = isAccelerator;
+    parseTree->isStackBranchHeads =
+      parseTree->isStackQuarks =
+	parseTree->isStackComplexBranchHeads = TRUE;
+
+    parseTree->numQuarks =
+      parseTree->numBranchHeads =
+	parseTree->numComplexBranchHeads = 0;
+
+    parseTree->quarkTblSize =
+      parseTree->branchHeadTblSize =
+	parseTree->complexBranchHeadTblSize = 200;
+
+    parseTree->quarkTbl = stackQuarks;
+    parseTree->branchHeadTbl = stackBranchHeads;
+    parseTree->complexBranchHeadTbl = stackComplexBranchHeads;
+
+    while (source != NULL && *source != '\0') {
+	source =  ParseTranslationTableProduction(parseTree, source, error);
+	if (*error == TRUE) break;
+    }
+    stateTrees[0] = _XtParseTreeToStateTree(parseTree);
+
+    if (!parseTree->isStackQuarks)
+      XtFree((char *)parseTree->quarkTbl);
+    if (!parseTree->isStackBranchHeads)
+      XtFree((char *)parseTree->branchHeadTbl);
+    if (!parseTree->isStackComplexBranchHeads)
+      XtFree((char *)parseTree->complexBranchHeadTbl);
+
+    xlations = _XtCreateXlations(stateTrees, 1, NULL, NULL);
+    xlations->operation = actualOp;
+
+#ifdef notdef
+    XtFree(stateTrees);
+#endif /* notdef */
+    return xlations;
+}
+
+/*** public procedures ***/
+
+/*ARGSUSED*/
+Boolean XtCvtStringToAcceleratorTable(
+    Display*	dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr from,
+    XrmValuePtr to,
+    XtPointer	*closure)
+{
+    String str;
+    Boolean error = FALSE;
+
+    if (*num_args != 0)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	  "wrongParameters","cvtStringToAcceleratorTable",XtCXtToolkitError,
+          "String to AcceleratorTable conversion needs no extra arguments",
+	  (String *)NULL, (Cardinal *)NULL);
+    str = (String)(from->addr);
+    if (str == NULL) {
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	  "badParameters","cvtStringToAcceleratorTable",XtCXtToolkitError,
+          "String to AcceleratorTable conversion needs string",
+	  (String *)NULL, (Cardinal *)NULL);
+	return FALSE;
+    }
+    if (to->addr != NULL) {
+	if (to->size < sizeof(XtAccelerators)) {
+	    to->size = sizeof(XtAccelerators);
+	    return FALSE;
+	}
+	*(XtAccelerators*)to->addr =
+	    (XtAccelerators) ParseTranslationTable(str, TRUE, XtTableAugment, &error);
+    }
+    else {
+	static XtAccelerators staticStateTable;
+	staticStateTable =
+	    (XtAccelerators) ParseTranslationTable(str, TRUE, XtTableAugment, &error);
+	to->addr = (XPointer) &staticStateTable;
+	to->size = sizeof(XtAccelerators);
+    }
+    if (error == TRUE)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	  "parseError","cvtStringToAcceleratorTable",XtCXtToolkitError,
+          "String to AcceleratorTable conversion encountered errors",
+	  (String *)NULL, (Cardinal *)NULL);
+    return (error != TRUE);
+}
+
+
+/*ARGSUSED*/
+Boolean
+XtCvtStringToTranslationTable(
+    Display	*dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr from,
+    XrmValuePtr to,
+    XtPointer	*closure_ret)
+{
+    String str;
+    Boolean error = FALSE;
+
+    if (*num_args != 0)
+      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	    "wrongParameters","cvtStringToTranslationTable",XtCXtToolkitError,
+	    "String to TranslationTable conversion needs no extra arguments",
+	    (String *)NULL, (Cardinal *)NULL);
+    str = (String)(from->addr);
+    if (str == NULL) {
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	  "badParameters","cvtStringToTranslation",XtCXtToolkitError,
+          "String to TranslationTable conversion needs string",
+	  (String *)NULL, (Cardinal *)NULL);
+	return FALSE;
+    }
+    if (to->addr != NULL) {
+	if (to->size < sizeof(XtTranslations)) {
+	    to->size = sizeof(XtTranslations);
+	    return FALSE;
+	}
+	*(XtTranslations*)to->addr =
+	    ParseTranslationTable(str, FALSE, XtTableReplace, &error);
+    }
+    else {
+	static XtTranslations staticStateTable;
+	staticStateTable =
+	    ParseTranslationTable(str, FALSE, XtTableReplace, &error);
+	to->addr = (XPointer) &staticStateTable;
+	to->size = sizeof(XtTranslations);
+    }
+    if (error == TRUE)
+        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
+	  "parseError","cvtStringToTranslationTable",XtCXtToolkitError,
+          "String to TranslationTable conversion encountered errors",
+	  (String *)NULL, (Cardinal *)NULL);
+    return (error != TRUE);
+}
+
+
+/*
+ * Parses a user's or applications translation table
+ */
+XtAccelerators XtParseAcceleratorTable(
+    _Xconst char* source)
+{
+    Boolean error = FALSE;
+    XtAccelerators ret =
+	(XtAccelerators) ParseTranslationTable ((char *)source, TRUE, XtTableAugment, &error);
+    if (error == TRUE)
+        XtWarningMsg ("parseError", "cvtStringToAcceleratorTable",
+	  XtCXtToolkitError,
+          "String to AcceleratorTable conversion encountered errors",
+	  (String *)NULL, (Cardinal *)NULL);
+    return ret;
+}
+
+XtTranslations XtParseTranslationTable(
+    _Xconst char* source)
+{
+    Boolean error = FALSE;
+    XtTranslations ret = ParseTranslationTable((char *)source, FALSE, XtTableReplace, &error);
+    if (error == TRUE)
+        XtWarningMsg ("parseError",
+	  "cvtStringToTranslationTable", XtCXtToolkitError,
+          "String to TranslationTable conversion encountered errors",
+	  (String *)NULL, (Cardinal *)NULL);
+    return ret;
+}
+
+void _XtTranslateInitialize(void)
+{
+    LOCK_PROCESS;
+    if (initialized) {
+	XtWarningMsg("translationError","xtTranslateInitialize",
+                  XtCXtToolkitError,"Initializing Translation manager twice.",
+                    (String *)NULL, (Cardinal *)NULL);
+	UNLOCK_PROCESS;
+	return;
+    }
+
+    initialized = TRUE;
+    UNLOCK_PROCESS;
+    QMeta = XrmPermStringToQuark("Meta");
+    QCtrl = XrmPermStringToQuark("Ctrl");
+    QNone = XrmPermStringToQuark("None");
+    QAny  = XrmPermStringToQuark("Any");
+
+    Compile_XtEventTable( events, XtNumber(events) );
+    Compile_XtModifierTable( modifiers, XtNumber(modifiers) );
+    CompileNameValueTable( buttonNames );
+    CompileNameValueTable( notifyModes );
+    CompileNameValueTable( motionDetails );
+#if 0
+    CompileNameValueTable( notifyDetail );
+    CompileNameValueTable( visibilityNotify );
+    CompileNameValueTable( circulation );
+    CompileNameValueTable( propertyChanged );
+#endif
+    CompileNameValueTable( mappingNotify );
+}
+
+void _XtAddTMConverters(
+    ConverterTable table)
+{
+     _XtTableAddConverter(table,
+	     _XtQString,
+	     XrmPermStringToQuark(XtRTranslationTable),
+ 	     XtCvtStringToTranslationTable, (XtConvertArgList) NULL,
+	     (Cardinal)0, True, CACHED, _XtFreeTranslations, True);
+     _XtTableAddConverter(table, _XtQString,
+	     XrmPermStringToQuark(XtRAcceleratorTable),
+ 	     XtCvtStringToAcceleratorTable, (XtConvertArgList) NULL,
+	     (Cardinal)0, True, CACHED, _XtFreeTranslations, True);
+     _XtTableAddConverter(table,
+	     XrmPermStringToQuark( _XtRStateTablePair ),
+	     XrmPermStringToQuark(XtRTranslationTable),
+ 	     _XtCvtMergeTranslations, (XtConvertArgList) NULL,
+	     (Cardinal)0, True, CACHED, _XtFreeTranslations, True);
+}
diff --git a/libXt/src/TMprint.c b/libXt/src/TMprint.c
new file mode 100644
index 000000000..aeb6b30ed
--- /dev/null
+++ b/libXt/src/TMprint.c
@@ -0,0 +1,885 @@
+/* $Xorg: TMprint.c,v 1.4 2001/02/09 02:03:58 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/TMprint.c,v 1.6 2001/12/14 19:56:31 dawes Exp $ */
+
+/*LINTLIBRARY*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include <stdio.h>
+
+typedef struct _TMStringBufRec{
+    String	start;
+    String	current;
+    Cardinal	max;
+}TMStringBufRec, *TMStringBuf;
+
+
+#define STR_THRESHOLD 25
+#define STR_INCAMOUNT 100
+#define CHECK_STR_OVERFLOW(sb) \
+if (sb->current - sb->start > (int)sb->max - STR_THRESHOLD) 	\
+{ String old = sb->start; \
+  sb->start = XtRealloc(old, (Cardinal)(sb->max += STR_INCAMOUNT)); \
+  sb->current = sb->current - old + sb->start; \
+}
+
+#define ExpandForChars(sb, nchars ) \
+    if ((unsigned)(sb->current - sb->start) > sb->max - STR_THRESHOLD - nchars) { \
+	String old = sb->start;					\
+	sb->start = XtRealloc(old,				\
+	    (Cardinal)(sb->max += STR_INCAMOUNT + nchars));	\
+	sb->current = sb->current - old + sb->start;		\
+    }
+
+#define ExpandToFit(sb, more) \
+{								\
+	size_t l = strlen(more);				\
+	ExpandForChars(sb, l);					\
+      }
+
+static void PrintModifiers(
+    TMStringBuf	sb,
+    unsigned long mask, unsigned long mod)
+{
+    Boolean notfirst = False;
+    CHECK_STR_OVERFLOW(sb);
+
+    if (mask == ~0UL && mod == 0) {
+	*sb->current++ = '!';
+	*sb->current = '\0';
+	return;
+    }
+
+#define PRINTMOD(modmask,modstring) \
+    if (mask & modmask) {		 \
+	if (! (mod & modmask)) {	 \
+	    *sb->current++ = '~';		 \
+	    notfirst = True;		 \
+	}				 \
+	else if (notfirst)		 \
+	    *sb->current++ = ' ';		 \
+	else notfirst = True;		 \
+	strcpy(sb->current, modstring);		 \
+	sb->current += strlen(sb->current);		 \
+    }
+
+    PRINTMOD(ShiftMask, "Shift");
+    PRINTMOD(ControlMask, "Ctrl");	/* name is not CtrlMask... */
+    PRINTMOD(LockMask, "Lock");
+    PRINTMOD(Mod1Mask, "Mod1");
+    CHECK_STR_OVERFLOW(sb);
+    PRINTMOD(Mod2Mask, "Mod2");
+    PRINTMOD(Mod3Mask, "Mod3");
+    PRINTMOD(Mod4Mask, "Mod4");
+    PRINTMOD(Mod5Mask, "Mod5");
+    CHECK_STR_OVERFLOW(sb);
+    PRINTMOD(Button1Mask, "Button1");
+    PRINTMOD(Button2Mask, "Button2");
+    PRINTMOD(Button3Mask, "Button3");
+    CHECK_STR_OVERFLOW(sb);
+    PRINTMOD(Button4Mask, "Button4");
+    PRINTMOD(Button5Mask, "Button5");
+
+#undef PRINTMOD
+}
+
+static void PrintEventType(
+    TMStringBuf	sb,
+    unsigned long event)
+{
+    CHECK_STR_OVERFLOW(sb);
+    switch (event) {
+#define PRINTEVENT(event, name) case event: (void) strcpy(sb->current, name); break;
+	PRINTEVENT(KeyPress, "<KeyPress>")
+	PRINTEVENT(KeyRelease, "<KeyRelease>")
+	PRINTEVENT(ButtonPress, "<ButtonPress>")
+	PRINTEVENT(ButtonRelease, "<ButtonRelease>")
+	PRINTEVENT(MotionNotify, "<MotionNotify>")
+	PRINTEVENT(EnterNotify, "<EnterNotify>")
+	PRINTEVENT(LeaveNotify, "<LeaveNotify>")
+	PRINTEVENT(FocusIn, "<FocusIn>")
+	PRINTEVENT(FocusOut, "<FocusOut>")
+	PRINTEVENT(KeymapNotify, "<KeymapNotify>")
+	PRINTEVENT(Expose, "<Expose>")
+	PRINTEVENT(GraphicsExpose, "<GraphicsExpose>")
+	PRINTEVENT(NoExpose, "<NoExpose>")
+	PRINTEVENT(VisibilityNotify, "<VisibilityNotify>")
+	PRINTEVENT(CreateNotify, "<CreateNotify>")
+	PRINTEVENT(DestroyNotify, "<DestroyNotify>")
+	PRINTEVENT(UnmapNotify, "<UnmapNotify>")
+	PRINTEVENT(MapNotify, "<MapNotify>")
+	PRINTEVENT(MapRequest, "<MapRequest>")
+	PRINTEVENT(ReparentNotify, "<ReparentNotify>")
+	PRINTEVENT(ConfigureNotify, "<ConfigureNotify>")
+	PRINTEVENT(ConfigureRequest, "<ConfigureRequest>")
+	PRINTEVENT(GravityNotify, "<GravityNotify>")
+	PRINTEVENT(ResizeRequest, "<ResizeRequest>")
+	PRINTEVENT(CirculateNotify, "<CirculateNotify>")
+	PRINTEVENT(CirculateRequest, "<CirculateRequest>")
+	PRINTEVENT(PropertyNotify, "<PropertyNotify>")
+	PRINTEVENT(SelectionClear, "<SelectionClear>")
+	PRINTEVENT(SelectionRequest, "<SelectionRequest>")
+	PRINTEVENT(SelectionNotify, "<SelectionNotify>")
+	PRINTEVENT(ColormapNotify, "<ColormapNotify>")
+	PRINTEVENT(ClientMessage, "<ClientMessage>")
+	case _XtEventTimerEventType:
+	    (void) strcpy(sb->current,"<EventTimer>");
+	    break;
+	default:
+	    (void) sprintf(sb->current, "<0x%x>", (int) event);
+#undef PRINTEVENT
+    }
+    sb->current += strlen(sb->current);
+}
+
+static void PrintCode(
+    TMStringBuf sb,
+    unsigned long mask, unsigned long code)
+{
+    CHECK_STR_OVERFLOW(sb);
+    if (mask != 0) {
+	if (mask != ~0UL)
+	    (void) sprintf(sb->current, "0x%lx:0x%lx", mask, code);
+	else (void) sprintf(sb->current, /*"0x%lx"*/ "%d", (unsigned)code);
+	sb->current += strlen(sb->current);
+    }
+}
+
+static void PrintKeysym(
+    TMStringBuf sb,
+    KeySym keysym)
+{
+    String keysymName;
+
+    if (keysym == 0) return;
+
+    CHECK_STR_OVERFLOW(sb);
+    keysymName = XKeysymToString(keysym);
+    if (keysymName == NULL)
+      PrintCode(sb,~0UL,(unsigned long)keysym);
+    else {
+      ExpandToFit(sb, keysymName);
+      strcpy(sb->current, keysymName);
+      sb->current += strlen(sb->current);
+    }
+}
+
+static void PrintAtom(
+    TMStringBuf sb,
+    Display *dpy,
+    Atom atom)
+{
+    String atomName;
+
+    if (atom == 0) return;
+
+    atomName = (dpy ? XGetAtomName(dpy, atom) : NULL);
+
+    if (! atomName)
+      PrintCode(sb,~0UL,(unsigned long)atom);
+    else {
+      ExpandToFit( sb, atomName );
+      strcpy(sb->current, atomName);
+      sb->current += strlen(sb->current);
+      XFree(atomName);
+    }
+}
+
+static	void PrintLateModifiers(
+    TMStringBuf	sb,
+    LateBindingsPtr lateModifiers)
+{
+    for (; lateModifiers->keysym; lateModifiers++) {
+	CHECK_STR_OVERFLOW(sb);
+	if (lateModifiers->knot) {
+	    *sb->current++ = '~';
+	} else {
+	    *sb->current++ = ' ';
+	}
+	strcpy(sb->current, XKeysymToString(lateModifiers->keysym));
+	sb->current += strlen(sb->current);
+	if (lateModifiers->pair) {
+	    *(sb->current -= 2) = '\0';	/* strip "_L" */
+	    lateModifiers++;	/* skip _R keysym */
+	}
+    }
+}
+
+static void PrintEvent(
+    TMStringBuf sb,
+    register TMTypeMatch typeMatch,
+    register TMModifierMatch modMatch,
+    Display *dpy)
+{
+    if (modMatch->standard) *sb->current++ = ':';
+
+    PrintModifiers(sb, modMatch->modifierMask, modMatch->modifiers);
+    if (modMatch->lateModifiers != NULL)
+      PrintLateModifiers(sb, modMatch->lateModifiers);
+    PrintEventType(sb, typeMatch->eventType);
+    switch (typeMatch->eventType) {
+      case KeyPress:
+      case KeyRelease:
+	PrintKeysym(sb, (KeySym)typeMatch->eventCode);
+	break;
+
+      case PropertyNotify:
+      case SelectionClear:
+      case SelectionRequest:
+      case SelectionNotify:
+      case ClientMessage:
+	PrintAtom(sb, dpy, (Atom)typeMatch->eventCode);
+	break;
+
+      default:
+	PrintCode(sb, typeMatch->eventCodeMask, typeMatch->eventCode);
+    }
+}
+
+static void PrintParams(
+    TMStringBuf	sb,
+    String	*params,
+    Cardinal num_params)
+{
+    register Cardinal i;
+    for (i = 0; i<num_params; i++) {
+	ExpandToFit( sb, params[i] );
+	if (i != 0) {
+	    *sb->current++ = ',';
+	    *sb->current++ = ' ';
+	}
+	*sb->current++ = '"';
+	strcpy(sb->current, params[i]);
+	sb->current += strlen(sb->current);
+	*sb->current++ = '"';
+    }
+    *sb->current = '\0';
+}
+
+static void PrintActions(
+    TMStringBuf	sb,
+    register ActionPtr actions,
+    XrmQuark *quarkTbl,
+    Widget   accelWidget)
+{
+    while (actions != NULL) {
+	String proc;
+
+	*sb->current++ = ' ';
+
+	if (accelWidget) {
+	    /* accelerator */
+	    String name = XtName(accelWidget);
+	    int nameLen = strlen(name);
+	    ExpandForChars(sb,  nameLen );
+	    XtMemmove(sb->current, name, nameLen );
+	    sb->current += nameLen;
+	    *sb->current++ = '`';
+	}
+	proc = XrmQuarkToString(quarkTbl[actions->idx]);
+	ExpandToFit( sb, proc );
+	strcpy(sb->current, proc);
+	sb->current += strlen(proc);
+	*sb->current++ = '(';
+	PrintParams(sb, actions->params, actions->num_params);
+	*sb->current++ = ')';
+	actions = actions->next;
+    }
+    *sb->current = '\0';
+}
+
+static Boolean LookAheadForCycleOrMulticlick(
+    register StatePtr state,
+    StatePtr *state_return,	/* state to print, usually startState */
+    int *countP,
+    StatePtr *nextLevelP)
+{
+    int repeatCount = 0;
+    StatePtr	startState = state;
+    Boolean	isCycle = startState->isCycleEnd;
+    TMTypeMatch sTypeMatch;
+    TMModifierMatch sModMatch;
+
+    LOCK_PROCESS;
+    sTypeMatch = TMGetTypeMatch(startState->typeIndex);
+    sModMatch = TMGetModifierMatch(startState->modIndex);
+
+    *state_return = startState;
+
+    for (state = state->nextLevel; state != NULL; state = state->nextLevel) {
+	TMTypeMatch typeMatch = TMGetTypeMatch(state->typeIndex);
+	TMModifierMatch modMatch = TMGetModifierMatch(state->modIndex);
+
+	/* try to pick up the correct state with actions, to be printed */
+	/* This is to accommodate <ButtonUp>(2+), for example */
+	if (state->isCycleStart)
+	    *state_return = state;
+
+	if (state->isCycleEnd) {
+	    *countP = repeatCount;
+	    UNLOCK_PROCESS;
+	    return True;
+	}
+	if ((startState->typeIndex == state->typeIndex) &&
+	    (startState->modIndex == state->modIndex)) {
+	    repeatCount++;
+	    *nextLevelP = state;
+	}
+	else if (typeMatch->eventType == _XtEventTimerEventType)
+	  continue;
+	else /* not same event as starting event and not timer */ {
+	    unsigned int type = sTypeMatch->eventType;
+	    unsigned int t = typeMatch->eventType;
+	    if (   (type == ButtonPress	  && t != ButtonRelease)
+		|| (type == ButtonRelease && t != ButtonPress)
+		|| (type == KeyPress	  && t != KeyRelease)
+		|| (type == KeyRelease	  && t != KeyPress)
+		|| typeMatch->eventCode != sTypeMatch->eventCode
+		|| modMatch->modifiers != sModMatch->modifiers
+		|| modMatch->modifierMask != sModMatch->modifierMask
+		|| modMatch->lateModifiers != sModMatch->lateModifiers
+		|| typeMatch->eventCodeMask != sTypeMatch->eventCodeMask
+		|| typeMatch->matchEvent != sTypeMatch->matchEvent
+		|| modMatch->standard != sModMatch->standard)
+		/* not inverse of starting event, either */
+		break;
+	}
+    }
+    *countP = repeatCount;
+    UNLOCK_PROCESS;
+    return isCycle;
+}
+
+static void PrintComplexState(
+    TMStringBuf	sb,
+    Boolean	includeRHS,
+    StatePtr 	state,
+    TMStateTree stateTree,
+    Widget	accelWidget,
+    Display 	*dpy)
+{
+    int 		clickCount = 0;
+    Boolean 		cycle;
+    StatePtr 		nextLevel = NULL;
+    StatePtr		triggerState = NULL;
+
+    /* print the current state */
+    if (! state) return;
+    LOCK_PROCESS;
+    cycle = LookAheadForCycleOrMulticlick(state, &triggerState, &clickCount,
+					  &nextLevel);
+
+    PrintEvent(sb, TMGetTypeMatch(triggerState->typeIndex),
+	       TMGetModifierMatch(triggerState->modIndex), dpy);
+
+    if (cycle || clickCount) {
+	if (clickCount)
+	    sprintf(sb->current, "(%d%s)", clickCount+1, cycle ? "+" : "");
+	else
+	    (void) strncpy(sb->current, "(+)", 4);
+	sb->current += strlen(sb->current);
+	if (! state->actions && nextLevel)
+	    state = nextLevel;
+	while (! state->actions && ! state->isCycleEnd)
+	    state = state->nextLevel;	/* should be trigger state */
+    }
+
+    if (state->actions) {
+	if (includeRHS) {
+	    CHECK_STR_OVERFLOW(sb);
+	    *sb->current++ = ':';
+	    PrintActions(sb,
+			 state->actions,
+			 ((TMSimpleStateTree)stateTree)->quarkTbl,
+			 accelWidget);
+	    *sb->current++ = '\n';
+	}
+    }
+    else {
+	if (state->nextLevel && !cycle && !clickCount)
+	    *sb->current++ = ',';
+	else {
+	    /* no actions are attached to this production */
+	    *sb->current++ = ':';
+	    *sb->current++ = '\n';
+	}
+    }
+    *sb->current = '\0';
+
+    /* print succeeding states */
+    if (state->nextLevel && !cycle && !clickCount)
+	PrintComplexState(sb, includeRHS, state->nextLevel,
+			  stateTree, accelWidget, dpy);
+    UNLOCK_PROCESS;
+}
+
+typedef struct{
+    TMShortCard	tIndex;
+    TMShortCard	bIndex;
+}PrintRec, *Print;
+
+static int FindNextMatch(
+    PrintRec		*printData,
+    TMShortCard		numPrints,
+    XtTranslations 	xlations,
+    TMBranchHead	branchHead,
+    StatePtr 		nextLevel,
+    TMShortCard		startIndex)
+{
+    TMShortCard		i;
+    TMComplexStateTree 	stateTree;
+    StatePtr		currState, candState;
+    Boolean		noMatch = True;
+    TMBranchHead	prBranchHead;
+
+    for (i = startIndex; noMatch && i < numPrints; i++) {
+	stateTree = (TMComplexStateTree)
+	  xlations->stateTreeTbl[printData[i].tIndex];
+	prBranchHead =
+	  &(stateTree->branchHeadTbl[printData[i].bIndex]);
+
+	if ((prBranchHead->typeIndex == branchHead->typeIndex) &&
+	    (prBranchHead->modIndex == branchHead->modIndex)) {
+	    if (prBranchHead->isSimple) {
+		if (!nextLevel)
+		  return i;
+	    }
+	    else {
+		currState = TMComplexBranchHead(stateTree, prBranchHead);
+		currState = currState->nextLevel;
+		candState = nextLevel;
+		for (;
+		     ((currState && !currState->isCycleEnd) &&
+		      (candState && !candState->isCycleEnd));
+		     currState = currState->nextLevel,
+		     candState = candState->nextLevel) {
+		    if ((currState->typeIndex != candState->typeIndex) ||
+			(currState->modIndex != candState->modIndex))
+		      break;
+		}
+		if (candState == currState) {
+		    return i;
+		}
+	    }
+	}
+    }
+    return TM_NO_MATCH;
+}
+
+static void ProcessLaterMatches(
+    PrintRec	*printData,
+    XtTranslations xlations,
+    TMShortCard	tIndex,
+    int bIndex,
+    TMShortCard	*numPrintsRtn)
+{
+    TMComplexStateTree 	stateTree;
+    int			i, j;
+    TMBranchHead	branchHead, matchBranch = NULL;
+
+    for (i = tIndex; i < (int)xlations->numStateTrees; i++) {
+	stateTree = (TMComplexStateTree)xlations->stateTreeTbl[i];
+	if (i == tIndex) {
+	    matchBranch = &stateTree->branchHeadTbl[bIndex];
+	    j = bIndex+1;
+	}
+	else j = 0;
+	for (branchHead = &stateTree->branchHeadTbl[j];
+	     j < (int)stateTree->numBranchHeads;
+	     j++, branchHead++) {
+	    if ((branchHead->typeIndex == matchBranch->typeIndex) &&
+		(branchHead->modIndex == matchBranch->modIndex)) {
+		StatePtr state;
+		if (!branchHead->isSimple)
+		  state = TMComplexBranchHead(stateTree, branchHead);
+		else
+		  state = NULL;
+		if ((!branchHead->isSimple || branchHead->hasActions) &&
+		    (FindNextMatch(printData,
+				   *numPrintsRtn,
+				   xlations,
+				   branchHead,
+				   (state ? state->nextLevel : NULL),
+				   0) == TM_NO_MATCH)) {
+		    printData[*numPrintsRtn].tIndex = i;
+		    printData[*numPrintsRtn].bIndex = j;
+		    (*numPrintsRtn)++;
+		}
+	    }
+	}
+    }
+}
+
+static void ProcessStateTree(
+    PrintRec	*printData,
+    XtTranslations xlations,
+    TMShortCard	tIndex,
+    TMShortCard	*numPrintsRtn)
+{
+    TMComplexStateTree stateTree;
+    int			i;
+    TMBranchHead	branchHead;
+
+    stateTree = (TMComplexStateTree)xlations->stateTreeTbl[tIndex];
+
+    for (i = 0, branchHead = stateTree->branchHeadTbl;
+	 i < (int)stateTree->numBranchHeads;
+	 i++, branchHead++) {
+	StatePtr state;
+	if (!branchHead->isSimple)
+	  state = TMComplexBranchHead(stateTree, branchHead);
+	else
+	  state = NULL;
+	if (FindNextMatch(printData, *numPrintsRtn, xlations, branchHead,
+			  (state ? state->nextLevel : NULL), 0)
+	    == TM_NO_MATCH) {
+	    if (!branchHead->isSimple || branchHead->hasActions) {
+		printData[*numPrintsRtn].tIndex = tIndex;
+		printData[*numPrintsRtn].bIndex = i;
+		(*numPrintsRtn)++;
+	    }
+	    LOCK_PROCESS;
+	    if (_XtGlobalTM.newMatchSemantics == False)
+	      ProcessLaterMatches(printData,
+				  xlations,
+				  tIndex,
+				  i,
+				  numPrintsRtn);
+	    UNLOCK_PROCESS;
+	}
+    }
+}
+
+static void PrintState(
+    TMStringBuf	sb,
+    TMStateTree	tree,
+    TMBranchHead branchHead,
+    Boolean	includeRHS,
+    Widget	accelWidget,
+    Display 	*dpy)
+{
+    TMComplexStateTree stateTree = (TMComplexStateTree)tree;
+    LOCK_PROCESS;
+    if (branchHead->isSimple) {
+	PrintEvent(sb,
+		   TMGetTypeMatch(branchHead->typeIndex),
+		   TMGetModifierMatch(branchHead->modIndex),
+		   dpy);
+	if (includeRHS) {
+	    ActionRec	actRec;
+
+	    CHECK_STR_OVERFLOW(sb);
+	    *sb->current++ = ':';
+	    actRec.idx = TMBranchMore(branchHead);
+	    actRec.num_params = 0;
+	    actRec.params = NULL;
+	    actRec.next = NULL;
+	    PrintActions(sb,
+			 &actRec,
+			 stateTree->quarkTbl,
+			 accelWidget);
+	    *sb->current++ = '\n';
+	}
+	else
+	  *sb->current++ = ',';
+#ifdef TRACE_TM
+	if (!branchHead->hasActions)
+	  printf(" !! no actions !! ");
+#endif
+    }
+	else { /* it's a complex branchHead */
+	    StatePtr state = TMComplexBranchHead(stateTree, branchHead);
+	    PrintComplexState(sb,
+			      includeRHS,
+			      state,
+			      tree,
+			      accelWidget,
+			      (Display *)NULL);
+	}
+    *sb->current = '\0';
+    UNLOCK_PROCESS;
+}
+
+String _XtPrintXlations(
+    Widget		w,
+    XtTranslations 	xlations,
+    Widget		accelWidget,
+    _XtBoolean		includeRHS)
+{
+    register Cardinal 	i;
+#define STACKPRINTSIZE 250
+    PrintRec		stackPrints[STACKPRINTSIZE];
+    PrintRec		*prints;
+    TMStringBufRec	sbRec, *sb = &sbRec;
+    TMShortCard		numPrints, maxPrints;
+#ifdef TRACE_TM
+    TMBindData		bindData = (TMBindData)w->core.tm.proc_table;
+    Boolean		hasAccel = (accelWidget ? True : False);
+#endif /* TRACE_TM */
+    if (xlations == NULL) return NULL;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->max = 1000;
+    maxPrints = 0;
+    for (i = 0; i < xlations->numStateTrees; i++)
+	maxPrints +=
+	  ((TMSimpleStateTree)(xlations->stateTreeTbl[i]))->numBranchHeads;
+    prints = (PrintRec *)
+      XtStackAlloc(maxPrints * sizeof(PrintRec), stackPrints);
+
+    numPrints = 0;
+    for (i = 0; i < xlations->numStateTrees; i++)
+      ProcessStateTree(prints, xlations, i, &numPrints);
+
+    for (i = 0; i < numPrints; i++) {
+	TMSimpleStateTree stateTree = (TMSimpleStateTree)
+	  xlations->stateTreeTbl[prints[i].tIndex];
+	TMBranchHead branchHead =
+	  &stateTree->branchHeadTbl[prints[i].bIndex];
+#ifdef TRACE_TM
+	TMComplexBindProcs	complexBindProcs;
+
+	if (hasAccel == False) {
+	    accelWidget = NULL;
+	    if (bindData->simple.isComplex) {
+		complexBindProcs = TMGetComplexBindEntry(bindData, 0);
+		accelWidget = complexBindProcs[prints[i].tIndex].widget;
+	    }
+	}
+#endif /* TRACE_TM */
+	PrintState(sb, (TMStateTree)stateTree, branchHead,
+		   includeRHS, accelWidget, XtDisplay(w));
+    }
+    XtStackFree((XtPointer)prints, (XtPointer)stackPrints);
+    return (sb->start);
+}
+
+
+#ifndef NO_MIT_HACKS
+/*ARGSUSED*/
+void _XtDisplayTranslations(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    String 	xString;
+
+    xString =  _XtPrintXlations(widget,
+				widget->core.tm.translations,
+				NULL,
+				True);
+    if (xString) {
+	printf("%s\n",xString);
+	XtFree(xString);
+    }
+}
+
+/*ARGSUSED*/
+void _XtDisplayAccelerators(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    String 	xString;
+
+
+    xString =  _XtPrintXlations(widget,
+				widget->core.accelerators,
+				NULL,
+				True);
+    if (xString) {
+	printf("%s\n",xString);
+	XtFree(xString);
+    }
+}
+
+/*ARGSUSED*/
+void _XtDisplayInstalledAccelerators(
+    Widget widget,
+    XEvent *event,
+    String *params,
+    Cardinal *num_params)
+{
+    Widget eventWidget
+	= XtWindowToWidget(event->xany.display, event->xany.window);
+    register Cardinal 	i;
+    TMStringBufRec	sbRec, *sb = &sbRec;
+    XtTranslations	xlations;
+#define STACKPRINTSIZE 250
+    PrintRec		stackPrints[STACKPRINTSIZE];
+    PrintRec		*prints;
+    TMShortCard		numPrints, maxPrints;
+    TMBindData	bindData = (TMBindData) eventWidget->core.tm.proc_table;
+    TMComplexBindProcs	complexBindProcs;
+
+    if ((eventWidget == NULL) ||
+	((xlations = eventWidget->core.tm.translations) == NULL) ||
+	(bindData->simple.isComplex == False))
+      return;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->start[0] = '\0';
+    sb->max = 1000;
+    maxPrints = 0;
+    for (i = 0; i < xlations->numStateTrees; i++)
+	maxPrints +=
+	  ((TMSimpleStateTree)xlations->stateTreeTbl[i])->numBranchHeads;
+    prints = (PrintRec *)
+      XtStackAlloc(maxPrints * sizeof(PrintRec), stackPrints);
+
+    numPrints = 0;
+
+    complexBindProcs = TMGetComplexBindEntry(bindData, 0);
+    for (i = 0;
+	 i < xlations->numStateTrees;
+	 i++, complexBindProcs++) {
+	if (complexBindProcs->widget)
+	  {
+	      ProcessStateTree(prints, xlations, i, &numPrints);
+	  }
+    }
+    for (i = 0; i < numPrints; i++) {
+	TMSimpleStateTree stateTree = (TMSimpleStateTree)
+	  xlations->stateTreeTbl[prints[i].tIndex];
+	TMBranchHead branchHead =
+	  &stateTree->branchHeadTbl[prints[i].bIndex];
+
+	complexBindProcs = TMGetComplexBindEntry(bindData, 0);
+
+	PrintState(sb, (TMStateTree)stateTree, branchHead, True,
+		   complexBindProcs[prints[i].tIndex].widget,
+		   XtDisplay(widget));
+    }
+    XtStackFree((XtPointer)prints, (XtPointer)stackPrints);
+    printf("%s\n", sb->start);
+    XtFree(sb->start);
+}
+#endif /*NO_MIT_HACKS*/
+
+String _XtPrintActions(
+    register ActionRec *actions,
+    XrmQuark		*quarkTbl)
+{
+    TMStringBufRec	sbRec, *sb = &sbRec;
+
+    sb->max = 1000;
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    PrintActions(sb,
+		 actions,
+		 quarkTbl,
+		 (Widget)NULL);
+    return sb->start;
+}
+
+String _XtPrintState(
+    TMStateTree		stateTree,
+    TMBranchHead	branchHead)
+{
+    TMStringBufRec	sbRec, *sb = &sbRec;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->max = 1000;
+    PrintState(sb, stateTree, branchHead,
+	       True, (Widget)NULL, (Display *)NULL);
+    return sb->start;
+}
+
+
+String _XtPrintEventSeq(
+    register EventSeqPtr eventSeq,
+    Display *dpy)
+{
+    TMStringBufRec	sbRec, *sb = &sbRec;
+    TMTypeMatch		typeMatch;
+    TMModifierMatch	modMatch;
+#define MAXSEQS 100
+    EventSeqPtr		eventSeqs[MAXSEQS];
+    TMShortCard		i, j;
+    Boolean		cycle = False;
+
+    sb->current = sb->start = __XtMalloc((Cardinal)1000);
+    sb->max = 1000;
+    for (i = 0;
+	 i < MAXSEQS && eventSeq != NULL && !cycle;
+	 eventSeq = eventSeq->next, i++)
+      {
+	  eventSeqs[i] = eventSeq;
+	  for (j = 0; j < i && !cycle; j++)
+	    if (eventSeqs[j] == eventSeq)
+	      cycle = True;
+      }
+    LOCK_PROCESS;
+    for (j = 0; j < i; j++) {
+	typeMatch =
+	  TMGetTypeMatch(_XtGetTypeIndex(&eventSeqs[j]->event));
+	modMatch =
+	  TMGetModifierMatch(_XtGetModifierIndex(&eventSeqs[j]->event));
+	PrintEvent(sb, typeMatch, modMatch, dpy);
+	if (j < i)
+	  *sb->current++ = ',';
+    }
+    UNLOCK_PROCESS;
+    return sb->start;
+}
diff --git a/libXt/src/TMstate.c b/libXt/src/TMstate.c
new file mode 100644
index 000000000..604947496
--- /dev/null
+++ b/libXt/src/TMstate.c
@@ -0,0 +1,2349 @@
+/* $Xorg: TMstate.c,v 1.6 2001/02/09 02:03:58 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or Sun not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/TMstate.c,v 1.8 2001/12/14 19:56:31 dawes Exp $ */
+
+/*
+
+Copyright 1987, 1988, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+/* TMstate.c -- maintains the state table of actions for the translation
+ *              manager.
+ */
+/*LINTLIBRARY*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+#ifndef TM_NO_MATCH
+#define TM_NO_MATCH (-2)
+#endif /* TM_NO_MATCH */
+
+/* forward definitions */
+static StatePtr NewState(TMParseStateTree, TMShortCard, TMShortCard);
+
+
+static String XtNtranslationError = "translationError";
+
+#ifndef __EMX__
+TMGlobalRec _XtGlobalTM; /* initialized to zero K&R */
+#else
+TMGlobalRec _XtGlobalTM = {0};
+#endif
+
+#define MatchIncomingEvent(tmEvent, typeMatch, modMatch) \
+  (typeMatch->eventType == tmEvent->event.eventType && \
+   (typeMatch->matchEvent != NULL) && \
+   (*typeMatch->matchEvent)(typeMatch, modMatch, tmEvent))
+
+
+#define NumStateTrees(xlations) \
+  ((translateData->isSimple) ? 1 : (TMComplexXlations(xlations))->numTrees)
+
+static TMShortCard GetBranchHead(
+    TMParseStateTree	parseTree,
+    TMShortCard		typeIndex,
+    TMShortCard		modIndex,
+    Boolean		isDummy)
+{
+#define TM_BRANCH_HEAD_TBL_ALLOC 	8
+#define TM_BRANCH_HEAD_TBL_REALLOC 	8
+
+    TMBranchHead branchHead = parseTree->branchHeadTbl;
+    TMShortCard	newSize, i;
+
+    /*
+     * dummy is used as a place holder for later matching in old-style
+     * matching behavior. If there's already an entry we don't need
+     * another dummy.
+     */
+    if (isDummy) {
+	for (i = 0; i < parseTree->numBranchHeads; i++, branchHead++) {
+	    if ((branchHead->typeIndex == typeIndex) &&
+		(branchHead->modIndex == modIndex))
+	      return i;
+	}
+    }
+    if (parseTree->numBranchHeads == parseTree->branchHeadTblSize)
+      {
+	  if (parseTree->branchHeadTblSize == 0)
+	    parseTree->branchHeadTblSize += TM_BRANCH_HEAD_TBL_ALLOC;
+	  else
+	    parseTree->branchHeadTblSize +=
+	      TM_BRANCH_HEAD_TBL_REALLOC;
+	  newSize = (parseTree->branchHeadTblSize * sizeof(TMBranchHeadRec));
+	  if (parseTree->isStackBranchHeads) {
+	      TMBranchHead	oldBranchHeadTbl = parseTree->branchHeadTbl;
+	      parseTree->branchHeadTbl = (TMBranchHead) __XtMalloc(newSize);
+	      XtMemmove(parseTree->branchHeadTbl, oldBranchHeadTbl, newSize);
+	      parseTree->isStackBranchHeads = False;
+	  }
+	  else {
+	      parseTree->branchHeadTbl = (TMBranchHead)
+		XtRealloc((char *)parseTree->branchHeadTbl,
+			  (parseTree->branchHeadTblSize *
+			   sizeof(TMBranchHeadRec)));
+	  }
+      }
+#ifdef TRACE_TM
+    LOCK_PROCESS;
+    _XtGlobalTM.numBranchHeads++;
+    UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+    branchHead =
+      &parseTree->branchHeadTbl[parseTree->numBranchHeads++];
+    branchHead->typeIndex = typeIndex;
+    branchHead->modIndex = modIndex;
+    branchHead->more = 0;
+    branchHead->isSimple = True;
+    branchHead->hasActions = False;
+    branchHead->hasCycles = False;
+    return parseTree->numBranchHeads-1;
+}
+
+TMShortCard _XtGetQuarkIndex(
+    TMParseStateTree	parseTree,
+    XrmQuark		quark)
+{
+#define TM_QUARK_TBL_ALLOC 	16
+#define TM_QUARK_TBL_REALLOC 	16
+    TMShortCard  i = parseTree->numQuarks;
+
+    for (i=0; i < parseTree->numQuarks; i++)
+      if (parseTree->quarkTbl[i] == quark)
+	    break;
+
+    if (i == parseTree->numQuarks)
+      {
+	  if (parseTree->numQuarks == parseTree->quarkTblSize)
+	    {
+		TMShortCard	newSize;
+
+		if (parseTree->quarkTblSize == 0)
+		  parseTree->quarkTblSize += TM_QUARK_TBL_ALLOC;
+		else
+		  parseTree->quarkTblSize += TM_QUARK_TBL_REALLOC;
+		newSize = (parseTree->quarkTblSize * sizeof(XrmQuark));
+
+		if (parseTree->isStackQuarks) {
+		    XrmQuark	*oldquarkTbl = parseTree->quarkTbl;
+		    parseTree->quarkTbl = (XrmQuark *) __XtMalloc(newSize);
+		    XtMemmove(parseTree->quarkTbl, oldquarkTbl, newSize);
+		    parseTree->isStackQuarks = False;
+		}
+		else {
+		    parseTree->quarkTbl = (XrmQuark *)
+		      XtRealloc((char *)parseTree->quarkTbl,
+				(parseTree->quarkTblSize *
+				 sizeof(XrmQuark)));
+		}
+	    }
+	  parseTree->quarkTbl[parseTree->numQuarks++] = quark;
+      }
+    return i;
+}
+
+/*
+ * Get an entry from the parseTrees complex branchHead tbl. If there's none
+ * there then allocate one
+ */
+/*ARGSUSED*/
+static TMShortCard GetComplexBranchIndex(
+    TMParseStateTree	parseTree,
+    TMShortCard		typeIndex,
+    TMShortCard		modIndex)
+{
+#define TM_COMPLEXBRANCH_HEAD_TBL_ALLOC 8
+#define TM_COMPLEXBRANCH_HEAD_TBL_REALLOC 4
+
+    if (parseTree->numComplexBranchHeads == parseTree->complexBranchHeadTblSize) {
+	TMShortCard	newSize;
+
+	if (parseTree->complexBranchHeadTblSize == 0)
+	  parseTree->complexBranchHeadTblSize += TM_COMPLEXBRANCH_HEAD_TBL_ALLOC;
+	else
+	  parseTree->complexBranchHeadTblSize += TM_COMPLEXBRANCH_HEAD_TBL_REALLOC;
+
+	newSize = (parseTree->complexBranchHeadTblSize * sizeof(StatePtr));
+
+	if (parseTree->isStackComplexBranchHeads) {
+	    StatePtr *oldcomplexBranchHeadTbl
+	      = parseTree->complexBranchHeadTbl;
+	    parseTree->complexBranchHeadTbl = (StatePtr *) __XtMalloc(newSize);
+	    XtMemmove(parseTree->complexBranchHeadTbl,
+		      oldcomplexBranchHeadTbl, newSize);
+	    parseTree->isStackComplexBranchHeads = False;
+	}
+	else {
+	    parseTree->complexBranchHeadTbl = (StatePtr *)
+	      XtRealloc((char *)parseTree->complexBranchHeadTbl,
+			(parseTree->complexBranchHeadTblSize *
+			 sizeof(StatePtr)));
+	}
+    }
+    parseTree->complexBranchHeadTbl[parseTree->numComplexBranchHeads++] = NULL;
+    return parseTree->numComplexBranchHeads-1;
+}
+
+TMShortCard _XtGetTypeIndex(
+    Event	*event)
+{
+    TMShortCard		i, j = TM_TYPE_SEGMENT_SIZE;
+    TMShortCard		typeIndex = 0;
+    TMTypeMatch 	typeMatch;
+    TMTypeMatch		segment = NULL;
+
+    LOCK_PROCESS;
+    for (i = 0; i < _XtGlobalTM.numTypeMatchSegments; i++) {
+	segment = _XtGlobalTM.typeMatchSegmentTbl[i];
+	for (j = 0;
+	     typeIndex < _XtGlobalTM.numTypeMatches && j <  TM_TYPE_SEGMENT_SIZE;
+	     j++, typeIndex++)
+	  {
+	      typeMatch = &(segment[j]);
+	      if (event->eventType == typeMatch->eventType &&
+		  event->eventCode == typeMatch->eventCode &&
+		  event->eventCodeMask == typeMatch->eventCodeMask &&
+		  event->matchEvent == typeMatch->matchEvent) {
+		    UNLOCK_PROCESS;
+		    return typeIndex;
+		  }
+	  }
+    }
+
+    if (j == TM_TYPE_SEGMENT_SIZE) {
+	if (_XtGlobalTM.numTypeMatchSegments == _XtGlobalTM.typeMatchSegmentTblSize) {
+	    _XtGlobalTM.typeMatchSegmentTblSize += 4;
+	    _XtGlobalTM.typeMatchSegmentTbl = (TMTypeMatch *)
+	      XtRealloc((char *)_XtGlobalTM.typeMatchSegmentTbl,
+			(_XtGlobalTM.typeMatchSegmentTblSize * sizeof(TMTypeMatch)));
+	}
+	_XtGlobalTM.typeMatchSegmentTbl[_XtGlobalTM.numTypeMatchSegments++] =
+	  segment = (TMTypeMatch)
+	    __XtMalloc(TM_TYPE_SEGMENT_SIZE * sizeof(TMTypeMatchRec));
+	j = 0;
+    }
+    typeMatch = &segment[j];
+    typeMatch->eventType = event->eventType;
+    typeMatch->eventCode = event->eventCode;
+    typeMatch->eventCodeMask = event->eventCodeMask;
+    typeMatch->matchEvent = event->matchEvent;
+    _XtGlobalTM.numTypeMatches++;
+    UNLOCK_PROCESS;
+    return typeIndex;
+}
+
+static Boolean CompareLateModifiers(
+    LateBindingsPtr lateBind1P,
+    LateBindingsPtr lateBind2P)
+{
+    LateBindingsPtr late1P = lateBind1P;
+    LateBindingsPtr late2P = lateBind2P;
+
+    if (late1P != NULL || late2P != NULL) {
+	int i = 0;
+	int j = 0;
+	if (late1P != NULL)
+	  for (; late1P->keysym != NoSymbol; i++) late1P++;
+	if (late2P != NULL)
+	  for (; late2P->keysym != NoSymbol; j++) late2P++;
+	if (i != j) return FALSE;
+	late1P--;
+	while (late1P >= lateBind1P) {
+	    Boolean last = True;
+	    for (late2P = lateBind2P + i - 1;
+		 late2P >= lateBind2P;
+		 late2P--) {
+		if (late1P->keysym == late2P->keysym
+		    && late1P->knot == late2P->knot) {
+		    j--;
+		    if (last) i--;
+		    break;
+		}
+		last = False;
+	    }
+	    late1P--;
+	}
+	if (j != 0) return FALSE;
+    }
+    return TRUE;
+}
+
+TMShortCard _XtGetModifierIndex(
+    Event	*event)
+{
+    TMShortCard		i, j = TM_MOD_SEGMENT_SIZE;
+    TMShortCard		modIndex = 0;
+    TMModifierMatch 	modMatch;
+    TMModifierMatch	segment = NULL;
+
+    LOCK_PROCESS;
+    for (i = 0; i < _XtGlobalTM.numModMatchSegments; i++) {
+	segment = _XtGlobalTM.modMatchSegmentTbl[i];
+	for (j = 0;
+	     modIndex < _XtGlobalTM.numModMatches && j <  TM_MOD_SEGMENT_SIZE;
+	     j++, modIndex++) {
+	    modMatch = &(segment[j]);
+	    if (event->modifiers == modMatch->modifiers &&
+		event->modifierMask == modMatch->modifierMask &&
+		event->standard == modMatch->standard &&
+		((!event->lateModifiers && !modMatch->lateModifiers) ||
+		 CompareLateModifiers(event->lateModifiers,
+				      modMatch->lateModifiers))) {
+		/*
+		 * if we found a match then we can free the parser's
+		 * late modifiers. If there isn't a match we use the
+		 * parser's copy
+		 */
+		if (event->lateModifiers &&
+		    --event->lateModifiers->ref_count == 0) {
+		    XtFree((char *)event->lateModifiers);
+		    event->lateModifiers = NULL;
+		}
+		UNLOCK_PROCESS;
+		return modIndex;
+	    }
+	}
+    }
+
+    if (j == TM_MOD_SEGMENT_SIZE) {
+	if (_XtGlobalTM.numModMatchSegments == _XtGlobalTM.modMatchSegmentTblSize) {
+	    _XtGlobalTM.modMatchSegmentTblSize += 4;
+	    _XtGlobalTM.modMatchSegmentTbl = (TMModifierMatch *)
+	      XtRealloc((char *)_XtGlobalTM.modMatchSegmentTbl,
+			(_XtGlobalTM.modMatchSegmentTblSize * sizeof(TMModifierMatch)));
+	}
+	_XtGlobalTM.modMatchSegmentTbl[_XtGlobalTM.numModMatchSegments++] =
+	  segment = (TMModifierMatch)
+	    __XtMalloc(TM_MOD_SEGMENT_SIZE * sizeof(TMModifierMatchRec));
+	j = 0;
+    }
+    modMatch = &segment[j];
+    modMatch->modifiers = event->modifiers;;
+    modMatch->modifierMask = event->modifierMask;
+    modMatch->standard = event->standard;
+    /*
+     * We use the parser's copy of the late binding array
+     */
+#ifdef TRACE_TM
+    if (event->lateModifiers)
+      _XtGlobalTM.numLateBindings++;
+#endif /* TRACE_TM */
+    modMatch->lateModifiers = event->lateModifiers;
+    _XtGlobalTM.numModMatches++;
+    UNLOCK_PROCESS;
+    return modIndex;
+}
+
+
+/*
+ * This is called from the SimpleStateHandler to match a stateTree
+ * entry to the event coming in
+ */
+static int MatchBranchHead(
+    TMSimpleStateTree 	stateTree,
+    int			startIndex,
+    TMEventPtr		event)
+{
+    TMBranchHead branchHead = &stateTree->branchHeadTbl[startIndex];
+    int i;
+
+    LOCK_PROCESS;
+    for (i = startIndex;
+	 i < (int)stateTree->numBranchHeads;
+	 i++, branchHead++)
+      {
+	  TMTypeMatch 		typeMatch;
+	  TMModifierMatch	modMatch;
+
+	  typeMatch  = TMGetTypeMatch(branchHead->typeIndex);
+	  modMatch = TMGetModifierMatch(branchHead->modIndex);
+
+	  if (MatchIncomingEvent(event, typeMatch, modMatch)) {
+	    UNLOCK_PROCESS;
+	    return i;
+	  }
+      }
+    UNLOCK_PROCESS;
+    return (TM_NO_MATCH);
+}
+
+Boolean _XtRegularMatch(
+    TMTypeMatch 	typeMatch,
+    TMModifierMatch	modMatch,
+    TMEventPtr 		eventSeq)
+{
+    Modifiers computed =0;
+    Modifiers computedMask =0;
+    Boolean resolved = TRUE;
+    if (typeMatch->eventCode != (eventSeq->event.eventCode &
+				  typeMatch->eventCodeMask)) return FALSE;
+    if (modMatch->lateModifiers != NULL)
+	resolved = _XtComputeLateBindings(eventSeq->xev->xany.display,
+					  modMatch->lateModifiers,
+					  &computed, &computedMask);
+    if (!resolved) return FALSE;
+    computed |= modMatch->modifiers;
+    computedMask |= modMatch->modifierMask;
+
+    return ( (computed & computedMask) ==
+	    (eventSeq->event.modifiers & computedMask));
+}
+
+/*ARGSUSED*/
+Boolean _XtMatchAtom(
+    TMTypeMatch 	typeMatch,
+    TMModifierMatch	modMatch,
+    TMEventPtr 		eventSeq)
+{
+    Atom	atom;
+
+    atom = XInternAtom(eventSeq->xev->xany.display,
+		       XrmQuarkToString(typeMatch->eventCode),
+		       False);
+    return (atom == eventSeq->event.eventCode);
+}
+
+#define IsOn(vec,idx) ((vec)[(idx)>>3] & (1 << ((idx) & 7)))
+
+/*
+ * there are certain cases where you want to ignore the event and stay
+ * in the same state.
+ */
+static Boolean Ignore(
+    TMEventPtr event)
+{
+    Display *dpy;
+    XtPerDisplay pd;
+
+    if (event->event.eventType == MotionNotify)
+	return TRUE;
+    if (!(event->event.eventType == KeyPress ||
+	  event->event.eventType == KeyRelease))
+	return FALSE;
+    dpy = event->xev->xany.display;
+    pd = _XtGetPerDisplay(dpy);
+    _InitializeKeysymTables(dpy, pd);
+    return IsOn(pd->isModifier, event->event.eventCode) ? TRUE : FALSE;
+}
+
+
+static void XEventToTMEvent(
+    XEvent *event,
+    TMEventPtr tmEvent)
+{
+    tmEvent->xev = event;
+    tmEvent->event.eventCodeMask = 0;
+    tmEvent->event.modifierMask = 0;
+    tmEvent->event.eventType = event->type;
+    tmEvent->event.lateModifiers = NULL;
+    tmEvent->event.matchEvent = NULL;
+    tmEvent->event.standard = FALSE;
+
+    switch (event->type) {
+
+	case KeyPress:
+	case KeyRelease:
+            tmEvent->event.eventCode = event->xkey.keycode;
+	    tmEvent->event.modifiers = event->xkey.state;
+	    break;
+
+	case ButtonPress:
+	case ButtonRelease:
+	    tmEvent->event.eventCode = event->xbutton.button;
+	    tmEvent->event.modifiers = event->xbutton.state;
+	    break;
+
+	case MotionNotify:
+	    tmEvent->event.eventCode = event->xmotion.is_hint;
+	    tmEvent->event.modifiers = event->xmotion.state;
+	    break;
+
+	case EnterNotify:
+	case LeaveNotify:
+	    tmEvent->event.eventCode = event->xcrossing.mode;
+	    tmEvent->event.modifiers = event->xcrossing.state;
+	    break;
+
+	case PropertyNotify:
+	    tmEvent->event.eventCode = event->xproperty.atom;
+	    tmEvent->event.modifiers = 0;
+	    break;
+
+	case SelectionClear:
+	    tmEvent->event.eventCode = event->xselectionclear.selection;
+	    tmEvent->event.modifiers = 0;
+	    break;
+
+	case SelectionRequest:
+	    tmEvent->event.eventCode = event->xselectionrequest.selection;
+	    tmEvent->event.modifiers = 0;
+	    break;
+
+	case SelectionNotify:
+	    tmEvent->event.eventCode = event->xselection.selection;
+	    tmEvent->event.modifiers = 0;
+	    break;
+
+	case ClientMessage:
+	    tmEvent->event.eventCode = event->xclient.message_type;
+	    tmEvent->event.modifiers = 0;
+	    break;
+
+	case MappingNotify:
+	    tmEvent->event.eventCode = event->xmapping.request;
+	    tmEvent->event.modifiers = 0;
+	    break;
+
+	case FocusIn:
+	case FocusOut:
+	    tmEvent->event.eventCode = event->xfocus.mode;
+	    tmEvent->event.modifiers = 0;
+	    break;
+
+	default:
+	    tmEvent->event.eventCode = 0;
+	    tmEvent->event.modifiers = 0;
+	    break;
+    }
+}
+
+
+static unsigned long GetTime(
+    XtTM tm,
+    XEvent *event)
+{
+    switch (event->type) {
+
+        case KeyPress:
+	case KeyRelease:
+	    return event->xkey.time;
+
+        case ButtonPress:
+	case ButtonRelease:
+	    return event->xbutton.time;
+
+	default:
+	    return tm->lastEventTime;
+
+    }
+
+}
+
+static void HandleActions(
+    Widget		w,
+    XEvent		*event,
+    TMSimpleStateTree	stateTree,
+    Widget		accelWidget,
+    XtActionProc	*procs,
+    ActionRec		*actions)
+{
+    ActionHook	 	actionHookList;
+    Widget		bindWidget;
+
+    bindWidget = accelWidget ? accelWidget : w;
+    if (accelWidget && !XtIsSensitive(accelWidget) &&
+	(event->type == KeyPress || event->type == KeyRelease ||
+	event->type == ButtonPress || event->type == ButtonRelease ||
+	event->type == MotionNotify || event->type == EnterNotify ||
+	event->type == LeaveNotify || event->type == FocusIn ||
+	event->type == FocusOut))
+	return;
+
+    actionHookList = XtWidgetToApplicationContext(w)->action_hook_list;
+
+    while (actions != NULL) {
+	/* perform any actions */
+	if (procs[actions->idx] != NULL) {
+	    if (actionHookList) {
+		ActionHook hook;
+		ActionHook next_hook;
+		String procName =
+		    XrmQuarkToString(stateTree->quarkTbl[actions->idx] );
+
+		for (hook = actionHookList; hook != NULL; ) {
+		    /*
+		     * Need to cache hook->next because the following action
+		     * proc may free hook via XtRemoveActionHook making
+		     * hook->next invalid upon return from the action proc.
+		     */
+		    next_hook = hook->next;
+		    (*hook->proc)(bindWidget,
+				  hook->closure,
+				  procName,
+				  event,
+				  actions->params,
+				  &actions->num_params
+				  );
+		    hook = next_hook;
+		}
+	    }
+	    (*(procs[actions->idx]))
+	      (bindWidget, event,
+	       actions->params, &actions->num_params );
+	}
+	actions = actions->next;
+    }
+}
+
+typedef struct {
+    unsigned int isCycleStart:1;
+    unsigned int isCycleEnd:1;
+    TMShortCard typeIndex;
+    TMShortCard modIndex;
+}MatchPairRec, *MatchPair;
+
+typedef struct TMContextRec{
+    TMShortCard	numMatches;
+    TMShortCard	maxMatches;
+    MatchPair	matches;
+}TMContextRec, *TMContext;
+
+static TMContextRec	contextCache[2];
+
+#define GetContextPtr(tm) ((TMContext *)&(tm->current_state))
+
+#define TM_CONTEXT_MATCHES_ALLOC 4
+#define TM_CONTEXT_MATCHES_REALLOC 2
+
+static void PushContext(
+    TMContext	*contextPtr,
+    StatePtr	newState)
+{
+    TMContext 		context = *contextPtr;
+
+    LOCK_PROCESS;
+    if (context == NULL)
+      {
+	  if (contextCache[0].numMatches == 0)
+	    context = &contextCache[0];
+	  else if (contextCache[1].numMatches == 0)
+	    context = &contextCache[1];
+	  if (!context)
+	    {
+		context = XtNew(TMContextRec);
+		context->matches = NULL;
+		context->numMatches =
+		  context->maxMatches = 0;
+	    }
+      }
+    if (context->numMatches &&
+	context->matches[context->numMatches-1].isCycleEnd)
+      {
+	  TMShortCard	i;
+	  for (i = 0;
+	       i < context->numMatches &&
+	       !(context->matches[i].isCycleStart);
+	       i++){};
+	  if (i < context->numMatches)
+	    context->numMatches = i+1;
+#ifdef DEBUG
+	  else
+	    XtWarning("pushing cycle end with no cycle start");
+#endif /* DEBUG */
+      }
+    else
+      {
+	  if (context->numMatches == context->maxMatches)
+	    {
+		if (context->maxMatches == 0)
+		  context->maxMatches += TM_CONTEXT_MATCHES_ALLOC;
+		else
+		  context->maxMatches += TM_CONTEXT_MATCHES_REALLOC;
+		context->matches = (MatchPairRec *)
+		  XtRealloc((char *)context->matches,
+			    context->maxMatches * sizeof(MatchPairRec));
+	    }
+	  context->matches[context->numMatches].isCycleStart = newState->isCycleStart;
+	  context->matches[context->numMatches].isCycleEnd = newState->isCycleEnd;
+	  context->matches[context->numMatches].typeIndex = newState->typeIndex;
+	  context->matches[context->numMatches++].modIndex = newState->modIndex;
+	  *contextPtr = context;
+      }
+      UNLOCK_PROCESS;
+}
+
+static void FreeContext(
+    TMContext	*contextPtr)
+{
+    TMContext 		context = NULL;
+
+    LOCK_PROCESS;
+
+    if (&contextCache[0] == *contextPtr)
+      context = &contextCache[0];
+    else if (&contextCache[1] == *contextPtr)
+      context = &contextCache[1];
+
+    if (context)
+      context->numMatches = 0;
+    else if (*contextPtr)
+    {
+      if ((*contextPtr)->matches)
+        XtFree ((char *) ((*contextPtr)->matches));
+      XtFree((char *)*contextPtr);
+    }
+
+    *contextPtr = NULL;
+    UNLOCK_PROCESS;
+}
+
+static int MatchExact(
+    TMSimpleStateTree 	stateTree,
+    int			startIndex,
+    TMShortCard		typeIndex,
+    TMShortCard		modIndex)
+{
+    TMBranchHead branchHead = &(stateTree->branchHeadTbl[startIndex]);
+    int i;
+
+    for (i = startIndex;
+	 i < (int)stateTree->numBranchHeads;
+	 i++, branchHead++)
+      {
+	  if ((branchHead->typeIndex == typeIndex) &&
+	      (branchHead->modIndex == modIndex))
+	    return i;
+      }
+    return (TM_NO_MATCH);
+}
+
+
+
+static void HandleSimpleState(
+    Widget	w,
+    XtTM	tmRecPtr,
+    TMEventRec	*curEventPtr)
+{
+    XtTranslations	xlations = tmRecPtr->translations;
+    TMSimpleStateTree	stateTree;
+    TMContext		*contextPtr = GetContextPtr(tmRecPtr);
+    TMShortCard		i;
+    ActionRec		*actions = NULL;
+    Boolean		matchExact = False;
+    Boolean	       	match = False;
+    StatePtr		complexMatchState = NULL;
+    int			currIndex;
+    TMShortCard		typeIndex = 0, modIndex = 0;
+    int			matchTreeIndex = TM_NO_MATCH;
+
+    LOCK_PROCESS;
+    stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[0];
+
+    for (i = 0;
+	 ((!match || !complexMatchState) && (i < xlations->numStateTrees));
+	 i++){
+	stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+	currIndex = -1;
+	/*
+	 * don't process this tree if we're only looking for a
+	 * complexMatchState and there are no complex states
+	 */
+	while (!(match && stateTree->isSimple) &&
+	       ((!match || !complexMatchState) && (currIndex != TM_NO_MATCH))) {
+	    currIndex++;
+	    if (matchExact)
+	      currIndex = MatchExact(stateTree,currIndex,typeIndex,modIndex);
+	    else
+	      currIndex = MatchBranchHead(stateTree,currIndex,curEventPtr);
+	    if (currIndex != TM_NO_MATCH) {
+		TMBranchHead branchHead;
+		StatePtr currState;
+
+		branchHead = &stateTree->branchHeadTbl[currIndex];
+		if (branchHead->isSimple)
+		  currState = NULL;
+		else
+		  currState = ((TMComplexStateTree)stateTree)
+		    ->complexBranchHeadTbl[TMBranchMore(branchHead)];
+
+		/*
+		 * first check for a complete match
+		 */
+		if (!match) {
+		    if (branchHead->hasActions) {
+			if (branchHead->isSimple) {
+			    static ActionRec	dummyAction;
+
+			    dummyAction.idx = TMBranchMore(branchHead);
+			    actions = &dummyAction;
+			}
+			else
+			  actions = currState->actions;
+			tmRecPtr->lastEventTime =
+			  GetTime(tmRecPtr, curEventPtr->xev);
+			FreeContext((TMContext
+				     *)&tmRecPtr->current_state);
+			match = True;
+			matchTreeIndex = i;
+		    }
+		    /*
+		     * if it doesn't have actions and
+		     * it's bc mode then it's a potential match node that is
+		     * used to match later sequences.
+		     */
+		    if (!TMNewMatchSemantics() && !matchExact) {
+			matchExact = True;
+			typeIndex = branchHead->typeIndex;
+			modIndex = branchHead->modIndex;
+		    }
+		}
+		/*
+		 * check for it being an event sequence which can be
+		 * a future match
+		 */
+		if (!branchHead->isSimple &&
+		    !branchHead->hasActions &&
+		    !complexMatchState)
+		  complexMatchState = currState;
+	    }
+	}
+    }
+    if (match)
+      {
+	  TMBindData	bindData = (TMBindData) tmRecPtr->proc_table;
+	  XtActionProc	*procs;
+	  Widget	accelWidget;
+
+	  if (bindData->simple.isComplex) {
+	      TMComplexBindProcs bindProcs =
+		TMGetComplexBindEntry(bindData, matchTreeIndex);
+	      procs = bindProcs->procs;
+	      accelWidget = bindProcs->widget;
+	  }
+	  else {
+	      TMSimpleBindProcs bindProcs =
+		TMGetSimpleBindEntry(bindData, matchTreeIndex);
+	      procs = bindProcs->procs;
+	      accelWidget = NULL;
+	  }
+	  HandleActions
+	    (w,
+	     curEventPtr->xev,
+	     (TMSimpleStateTree)xlations->stateTreeTbl[matchTreeIndex],
+	     accelWidget,
+	     procs,
+	     actions);
+      }
+    if (complexMatchState)
+      PushContext(contextPtr, complexMatchState);
+    UNLOCK_PROCESS;
+}
+
+static int MatchComplexBranch(
+    TMComplexStateTree	stateTree,
+    int			startIndex,
+    TMContext		context,
+    StatePtr		*leafStateRtn)
+{
+    TMShortCard	i;
+
+    LOCK_PROCESS;
+    for (i = startIndex; i < stateTree->numComplexBranchHeads; i++)
+      {
+	  StatePtr	candState;
+	  TMShortCard	numMatches = context->numMatches;
+	  MatchPair	statMatch = context->matches;
+
+	  for (candState = stateTree->complexBranchHeadTbl[i];
+	       numMatches && candState;
+	       numMatches--, statMatch++, candState = candState->nextLevel)
+	    {
+		if ((statMatch->typeIndex != candState->typeIndex) ||
+		    (statMatch->modIndex != candState->modIndex))
+		  break;
+	    }
+	  if (numMatches == 0) {
+	      *leafStateRtn = candState;
+	      UNLOCK_PROCESS;
+	      return i;
+	  }
+      }
+    *leafStateRtn = NULL;
+    UNLOCK_PROCESS;
+    return (TM_NO_MATCH);
+}
+
+static StatePtr TryCurrentTree(
+    TMComplexStateTree	*stateTreePtr,
+    XtTM		tmRecPtr,
+    TMEventRec		*curEventPtr)
+{
+    StatePtr		candState = NULL, matchState = NULL;
+    TMContext		*contextPtr = GetContextPtr(tmRecPtr);
+    TMTypeMatch 	typeMatch;
+    TMModifierMatch 	modMatch;
+    int			currIndex = -1;
+
+    /*
+     * we want the first sequence that both matches and has actions.
+     * we keep on looking till we find both
+     */
+    LOCK_PROCESS;
+    while ((currIndex =
+	    MatchComplexBranch(*stateTreePtr,
+			       ++currIndex,
+			       (*contextPtr),
+			       &candState))
+	   != TM_NO_MATCH) {
+	if (candState  != NULL) {
+	    typeMatch  = TMGetTypeMatch(candState->typeIndex);
+	    modMatch = TMGetModifierMatch(candState->modIndex);
+
+	    /* does this state's index match? --> done */
+	    if (MatchIncomingEvent(curEventPtr, typeMatch, modMatch))
+	      {
+		  if (candState->actions) {
+		      UNLOCK_PROCESS;
+		      return candState;
+		  }
+		  else
+		    matchState = candState;
+	      }
+	    /* is this an event timer? */
+	    if (typeMatch->eventType == _XtEventTimerEventType) {
+		StatePtr nextState = candState->nextLevel;
+
+		/* does the succeeding state match? */
+		if (nextState != NULL) {
+		    TMTypeMatch 	nextTypeMatch;
+		    TMModifierMatch	nextModMatch;
+
+		    nextTypeMatch  = TMGetTypeMatch(nextState->typeIndex);
+		    nextModMatch = TMGetModifierMatch(nextState->modIndex);
+
+		    /* is it within the timeout? */
+		    if (MatchIncomingEvent(curEventPtr,
+					   nextTypeMatch,
+					   nextModMatch)) {
+			XEvent *xev = curEventPtr->xev;
+			unsigned long time = GetTime(tmRecPtr, xev);
+			XtPerDisplay pd = _XtGetPerDisplay(xev->xany.display);
+			unsigned long delta = pd->multi_click_time;
+
+			if ((tmRecPtr->lastEventTime + delta) >= time) {
+			    if (nextState->actions) {
+				UNLOCK_PROCESS;
+				return candState;
+			    }
+			    else
+			      matchState = candState;
+			}
+		    }
+		}
+	    }
+	}
+    }
+    UNLOCK_PROCESS;
+    return matchState;
+}
+
+static void HandleComplexState(
+    Widget	w,
+    XtTM	tmRecPtr,
+    TMEventRec	*curEventPtr)
+{
+    XtTranslations 	xlations = tmRecPtr->translations;
+    TMContext		*contextPtr = GetContextPtr(tmRecPtr);
+    TMShortCard		i, matchTreeIndex = 0;
+    StatePtr		matchState = NULL, candState;
+    TMComplexStateTree 	*stateTreePtr =
+      (TMComplexStateTree *)&xlations->stateTreeTbl[0];
+
+    LOCK_PROCESS;
+    for (i = 0;
+	 i < xlations->numStateTrees;
+	 i++, stateTreePtr++) {
+	/*
+	 * some compilers sign extend Boolean bit fields so test for
+	 * false |||
+	 */
+	if (((*stateTreePtr)->isSimple == False) &&
+	    (candState = TryCurrentTree(stateTreePtr,
+				       tmRecPtr,
+				       curEventPtr))) {
+	    if (!matchState || candState->actions) {
+		matchTreeIndex = i;
+		matchState = candState;
+		if (candState->actions)
+		    break;
+	    }
+	}
+    }
+    if (matchState == NULL){
+	/* couldn't find it... */
+	if (!Ignore(curEventPtr))
+	  {
+	      FreeContext(contextPtr);
+	      HandleSimpleState(w, tmRecPtr, curEventPtr);
+	  }
+    }
+    else {
+	TMBindData	bindData = (TMBindData) tmRecPtr->proc_table;
+	XtActionProc	*procs;
+	Widget		accelWidget;
+	TMTypeMatch 	typeMatch;
+
+	typeMatch  = TMGetTypeMatch(matchState->typeIndex);
+
+	PushContext(contextPtr, matchState);
+	if (typeMatch->eventType == _XtEventTimerEventType) {
+	    matchState = matchState->nextLevel;
+	    PushContext(contextPtr, matchState);
+	}
+	tmRecPtr->lastEventTime = GetTime (tmRecPtr, curEventPtr->xev);
+
+	if (bindData->simple.isComplex) {
+	    TMComplexBindProcs bindProcs =
+	      TMGetComplexBindEntry(bindData, matchTreeIndex);
+	    procs = bindProcs->procs;
+	    accelWidget = bindProcs->widget;
+	}
+	else {
+	    TMSimpleBindProcs bindProcs =
+	      TMGetSimpleBindEntry(bindData, matchTreeIndex);
+	    procs = bindProcs->procs;
+	    accelWidget = NULL;
+	}
+	HandleActions(w,
+		      curEventPtr->xev,
+		      (TMSimpleStateTree)
+		      xlations->stateTreeTbl[matchTreeIndex],
+		      accelWidget,
+		      procs,
+		      matchState->actions);
+    }
+    UNLOCK_PROCESS;
+}
+
+
+void _XtTranslateEvent (
+    Widget w,
+    XEvent * event)
+{
+    XtTM	tmRecPtr = &w->core.tm;
+    TMEventRec 	curEvent;
+    StatePtr 	current_state = tmRecPtr->current_state;
+
+    XEventToTMEvent (event, &curEvent);
+
+    if (! tmRecPtr->translations) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			XtNtranslationError,"nullTable",XtCXtToolkitError,
+			"Can't translate event through NULL table",
+			(String *)NULL, (Cardinal *)NULL);
+	return ;
+    }
+    if (current_state == NULL)
+	  HandleSimpleState(w, tmRecPtr, &curEvent);
+    else
+	  HandleComplexState(w, tmRecPtr, &curEvent);
+}
+
+
+/*ARGSUSED*/
+static StatePtr NewState(
+    TMParseStateTree stateTree,
+    TMShortCard	typeIndex,
+    TMShortCard	modIndex)
+{
+    StatePtr state = XtNew(StateRec);
+
+#ifdef TRACE_TM
+    LOCK_PROCESS;
+    _XtGlobalTM.numComplexStates++;
+    UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+    state->typeIndex = typeIndex;
+    state->modIndex = modIndex;
+    state->nextLevel = NULL;
+    state->actions = NULL;
+    state->isCycleStart = state->isCycleEnd = False;
+    return state;
+}
+
+/*
+ * This routine is an iterator for state trees. If the func returns
+ * true then iteration is over.
+ */
+void _XtTraverseStateTree(
+    TMStateTree	tree,
+    _XtTraversalProc func,
+    XtPointer 	data)
+{
+    TMComplexStateTree stateTree = (TMComplexStateTree)tree;
+    TMBranchHead	currBH;
+    TMShortCard		i;
+    StateRec		dummyStateRec, *dummyState = &dummyStateRec;
+    ActionRec		dummyActionRec, *dummyAction = &dummyActionRec;
+    Boolean		firstSimple = True;
+    StatePtr 		currState;
+
+    /* first traverse the complex states */
+    if (stateTree->isSimple == False)
+      for (i = 0; i < stateTree->numComplexBranchHeads; i++) {
+	  currState = stateTree->complexBranchHeadTbl[i];
+	  for (; currState; currState = currState->nextLevel) {
+	      if (func(currState, data))
+		return;
+	      if (currState->isCycleEnd)
+		break;
+	  }
+      }
+
+    /* now traverse the simple ones */
+    for (i = 0, currBH = stateTree->branchHeadTbl;
+	 i < stateTree->numBranchHeads;
+	 i++, currBH++)
+      {
+	  if (currBH->isSimple && currBH->hasActions)
+	    {
+		if (firstSimple)
+		  {
+		      XtBZero((char *) dummyState, sizeof(StateRec));
+		      XtBZero((char *) dummyAction, sizeof(ActionRec));
+		      dummyState->actions = dummyAction;
+		      firstSimple = False;
+		  }
+		dummyState->typeIndex = currBH->typeIndex;
+		dummyState->modIndex = currBH->modIndex;
+		dummyAction->idx = currBH->more;
+		if (func(dummyState, data))
+		  return;
+	    }
+      }
+}
+
+static EventMask EventToMask(
+    TMTypeMatch     typeMatch,
+    TMModifierMatch modMatch)
+{
+    EventMask returnMask;
+    unsigned long eventType = typeMatch->eventType;
+
+    if (eventType == MotionNotify) {
+        Modifiers modifierMask = modMatch->modifierMask;
+        Modifiers tempMask;
+
+	returnMask = 0;
+        if (modifierMask == 0) {
+	    if (modMatch->modifiers == AnyButtonMask)
+		return ButtonMotionMask;
+	    else
+		return PointerMotionMask;
+	}
+        tempMask = modifierMask &
+	    (Button1Mask | Button2Mask | Button3Mask
+	     | Button4Mask | Button5Mask);
+        if (tempMask == 0)
+	    return PointerMotionMask;
+        if (tempMask & Button1Mask)
+            returnMask |= Button1MotionMask;
+        if (tempMask & Button2Mask)
+            returnMask |= Button2MotionMask;
+        if (tempMask & Button3Mask)
+            returnMask |= Button3MotionMask;
+        if (tempMask & Button4Mask)
+            returnMask |= Button4MotionMask;
+        if (tempMask & Button5Mask)
+            returnMask |= Button5MotionMask;
+        return returnMask;
+    }
+    returnMask = _XtConvertTypeToMask(eventType);
+    if (returnMask == (StructureNotifyMask|SubstructureNotifyMask))
+	returnMask = StructureNotifyMask;
+    return returnMask;
+}
+
+/*ARGSUSED*/
+static void DispatchMappingNotify(
+    Widget widget,		/* will be NULL from _RefreshMapping */
+    XtPointer closure,		/* real Widget */
+    XtPointer call_data)	/* XEvent* */
+{
+    _XtTranslateEvent( (Widget)closure, (XEvent*)call_data);
+}
+
+
+/*ARGSUSED*/
+static void RemoveFromMappingCallbacks(
+    Widget widget,
+    XtPointer closure,		/* target widget */
+    XtPointer call_data)
+{
+    _XtRemoveCallback( &_XtGetPerDisplay(XtDisplay(widget))->mapping_callbacks,
+		       DispatchMappingNotify,
+		       closure
+		      );
+}
+
+static Boolean AggregateEventMask(
+    StatePtr	state,
+    XtPointer	data)
+{
+    LOCK_PROCESS;
+    *((EventMask *)data) |= EventToMask(TMGetTypeMatch(state->typeIndex),
+					TMGetModifierMatch(state->modIndex));
+    UNLOCK_PROCESS;
+    return False;
+}
+
+void _XtInstallTranslations(
+    Widget widget)
+{
+    XtTranslations xlations;
+    Cardinal	i;
+    TMStateTree	stateTree;
+    Boolean  mappingNotifyInterest = False;
+
+    xlations = widget->core.tm.translations;
+    if (xlations == NULL) return;
+
+    /*
+     * check for somebody stuffing the translations directly into the
+     * instance structure. We will end up being called again out of
+     * ComposeTranslations but we *should* have bindings by then
+     */
+    if (widget->core.tm.proc_table == NULL) {
+	_XtMergeTranslations(widget, NULL, XtTableReplace);
+	/*
+	 * if we're realized then we'll be called out of
+	 * ComposeTranslations
+	 */
+	if (XtIsRealized(widget))
+	  return;
+    }
+
+    xlations->eventMask = 0;
+    for (i = 0;
+	 i < xlations->numStateTrees;
+	 i++)
+      {
+	  stateTree = xlations->stateTreeTbl[i];
+	  _XtTraverseStateTree(stateTree,
+			    AggregateEventMask,
+			    (XtPointer)&xlations->eventMask);
+	  mappingNotifyInterest |= stateTree->simple.mappingNotifyInterest;
+      }
+    /* double click needs to make sure that you have selected on both
+	button down and up. */
+
+    if (xlations->eventMask & ButtonPressMask)
+      xlations->eventMask |= ButtonReleaseMask;
+    if (xlations->eventMask & ButtonReleaseMask)
+      xlations->eventMask |= ButtonPressMask;
+
+    if (mappingNotifyInterest) {
+	XtPerDisplay pd = _XtGetPerDisplay(XtDisplay(widget));
+	if (pd->mapping_callbacks)
+	    _XtAddCallbackOnce(&(pd->mapping_callbacks),
+			       DispatchMappingNotify,
+			       (XtPointer)widget);
+	else
+	    _XtAddCallback(&(pd->mapping_callbacks),
+			   DispatchMappingNotify,
+			   (XtPointer)widget);
+
+	if (widget->core.destroy_callbacks != NULL)
+	    _XtAddCallbackOnce( (InternalCallbackList *)
+			        &widget->core.destroy_callbacks,
+				RemoveFromMappingCallbacks,
+				(XtPointer)widget
+			       );
+	else
+	    _XtAddCallback((InternalCallbackList *)
+			   &widget->core.destroy_callbacks,
+			   RemoveFromMappingCallbacks,
+			   (XtPointer)widget
+			  );
+    }
+    _XtBindActions(widget, (XtTM)&widget->core.tm);
+    _XtRegisterGrabs(widget);
+}
+
+void _XtRemoveTranslations(
+    Widget widget)
+{
+    Cardinal	i;
+    TMSimpleStateTree	stateTree;
+    Boolean  		mappingNotifyInterest = False;
+    XtTranslations		xlations = widget->core.tm.translations;
+
+    if (xlations == NULL)
+      return;
+
+    for (i = 0;
+	 i < xlations->numStateTrees;
+	 i++)
+      {
+	  stateTree = (TMSimpleStateTree)xlations->stateTreeTbl[i];
+	  mappingNotifyInterest |= stateTree->mappingNotifyInterest;
+      }
+    if (mappingNotifyInterest)
+      RemoveFromMappingCallbacks(widget, (XtPointer)widget, NULL);
+}
+
+static void _XtUninstallTranslations(
+    Widget widget)
+{
+    XtTranslations	xlations = widget->core.tm.translations;
+
+    _XtUnbindActions(widget,
+		     xlations,
+		     (TMBindData)widget->core.tm.proc_table);
+    _XtRemoveTranslations(widget);
+    widget->core.tm.translations = NULL;
+    FreeContext((TMContext *)&widget->core.tm.current_state);
+}
+
+void _XtDestroyTMData(
+    Widget	widget)
+{
+    TMComplexBindData	cBindData;
+
+    _XtUninstallTranslations(widget);
+
+    if ((cBindData = (TMComplexBindData)widget->core.tm.proc_table)) {
+	if (cBindData->isComplex) {
+	    ATranslations	aXlations, nXlations;
+
+	    nXlations = (ATranslations) cBindData->accel_context;
+	    while (nXlations){
+		aXlations = nXlations;
+		nXlations = nXlations->next;
+		XtFree((char *)aXlations);
+	    }
+	}
+	XtFree((char *)cBindData);
+    }
+}
+
+/*** Public procedures ***/
+
+
+void XtUninstallTranslations(
+    Widget widget)
+{
+    EventMask	oldMask;
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    if (! widget->core.tm.translations) {
+	UNLOCK_APP(app);
+	return;
+    }
+    oldMask = widget->core.tm.translations->eventMask;
+    _XtUninstallTranslations(widget);
+    if (XtIsRealized(widget) && oldMask)
+	XSelectInput(XtDisplay(widget), XtWindow(widget),
+		     XtBuildEventMask(widget));
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHuninstallTranslations;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_APP(app);
+}
+
+XtTranslations _XtCreateXlations(
+    TMStateTree		*stateTrees,
+    TMShortCard		numStateTrees,
+    XtTranslations	first,
+    XtTranslations	second)
+{
+    XtTranslations	xlations;
+    TMShortCard i;
+
+    xlations = (XtTranslations)
+      __XtMalloc(sizeof(TranslationData) +
+	       (numStateTrees-1) * sizeof(TMStateTree));
+#ifdef TRACE_TM
+    LOCK_PROCESS;
+    if (_XtGlobalTM.numTms == _XtGlobalTM.tmTblSize) {
+	_XtGlobalTM.tmTblSize += 16;
+	_XtGlobalTM.tmTbl = (XtTranslations *)
+	  XtRealloc((char *)_XtGlobalTM.tmTbl,
+		   _XtGlobalTM.tmTblSize * sizeof(XtTranslations));
+    }
+    _XtGlobalTM.tmTbl[_XtGlobalTM.numTms++] = xlations;
+    UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+
+    xlations->composers[0] = first;
+    xlations->composers[1] = second;
+    xlations->hasBindings = False;
+    xlations->operation = XtTableReplace;
+
+    for (i = 0;i < numStateTrees; i++)
+      {
+	  xlations->stateTreeTbl[i] = (TMStateTree) stateTrees[i];
+	  stateTrees[i]->simple.refCount++;
+      }
+    xlations->numStateTrees = numStateTrees;
+    xlations->eventMask = 0;
+    return xlations;
+}
+
+TMStateTree _XtParseTreeToStateTree(
+    TMParseStateTree	parseTree)
+{
+    TMSimpleStateTree  simpleTree;
+    unsigned int	tableSize;
+
+    if (parseTree->numComplexBranchHeads) {
+	TMComplexStateTree complexTree;
+
+	complexTree = XtNew(TMComplexStateTreeRec);
+	complexTree->isSimple = False;
+	tableSize = parseTree->numComplexBranchHeads * sizeof(StatePtr);
+	complexTree->complexBranchHeadTbl = (StatePtr *)
+	  __XtMalloc(tableSize);
+	XtMemmove(complexTree->complexBranchHeadTbl,
+		  parseTree->complexBranchHeadTbl, tableSize);
+	complexTree->numComplexBranchHeads =
+	  parseTree->numComplexBranchHeads;
+	simpleTree = (TMSimpleStateTree)complexTree;
+    }
+    else {
+	simpleTree = XtNew(TMSimpleStateTreeRec);
+	simpleTree->isSimple = True;
+    }
+    simpleTree->isAccelerator = parseTree->isAccelerator;
+    simpleTree->refCount = 0;
+    simpleTree->mappingNotifyInterest = parseTree->mappingNotifyInterest;
+
+    tableSize = parseTree->numBranchHeads * sizeof(TMBranchHeadRec);
+    simpleTree->branchHeadTbl = (TMBranchHead)
+      __XtMalloc(tableSize);
+    XtMemmove(simpleTree->branchHeadTbl, parseTree->branchHeadTbl, tableSize);
+    simpleTree->numBranchHeads = parseTree->numBranchHeads;
+
+    tableSize = parseTree->numQuarks * sizeof(XrmQuark);
+    simpleTree->quarkTbl = (XrmQuark *) __XtMalloc(tableSize);
+    XtMemmove(simpleTree->quarkTbl, parseTree->quarkTbl, tableSize);
+    simpleTree->numQuarks = parseTree->numQuarks;
+
+    return (TMStateTree)simpleTree;
+}
+
+static void FreeActions(
+    ActionPtr	actions)
+{
+    ActionPtr action;
+    TMShortCard i;
+    for (action = actions; action;) {
+	ActionPtr nextAction = action->next;
+	for (i = action->num_params; i;) {
+	    XtFree( action->params[--i] );
+	}
+	XtFree( (char*)action->params );
+	XtFree((char*) action);
+	action = nextAction;
+    }
+}
+
+/*ARGSUSED*/
+static void AmbigActions(
+    EventSeqPtr	initialEvent,
+    StatePtr	*state,
+    TMParseStateTree stateTree)
+{
+    String 	params[3];
+    Cardinal 	numParams = 0;
+
+    params[numParams++] = _XtPrintEventSeq(initialEvent, NULL);
+    params[numParams++] = _XtPrintActions((*state)->actions,
+					  stateTree->quarkTbl);
+    XtWarningMsg (XtNtranslationError,"oldActions",XtCXtToolkitError,
+		  "Previous entry was: %s %s", params, &numParams);
+    XtFree((char *)params[0]);
+    XtFree((char *)params[1]);
+    numParams = 0;
+    params[numParams++]  = _XtPrintActions(initialEvent->actions,
+					   stateTree->quarkTbl);
+    XtWarningMsg (XtNtranslationError,"newActions",XtCXtToolkitError,
+		  "New actions are:%s", params, &numParams);
+    XtFree((char *)params[0]);
+    XtWarningMsg (XtNtranslationError,"ambiguousActions",
+		  XtCXtToolkitError,
+		  "Overriding earlier translation manager actions.",
+		  (String *)NULL, (Cardinal *)NULL);
+
+    FreeActions((*state)->actions);
+    (*state)->actions = NULL;
+}
+
+
+void _XtAddEventSeqToStateTree(
+    EventSeqPtr 	eventSeq,
+    TMParseStateTree	stateTree)
+{
+    StatePtr		*state;
+    EventSeqPtr		initialEvent = eventSeq;
+    TMBranchHead	branchHead;
+    TMShortCard		idx, modIndex, typeIndex;
+
+    if (eventSeq == NULL) return;
+
+    /* note that all states in the event seq passed in start out null */
+    /* we fill them in with the matching state as we traverse the list */
+
+    /*
+     * We need to free the parser data structures !!!
+     */
+
+    typeIndex = _XtGetTypeIndex(&eventSeq->event);
+    modIndex = _XtGetModifierIndex(&eventSeq->event);
+    idx = GetBranchHead(stateTree, typeIndex, modIndex, False);
+    branchHead = &stateTree->branchHeadTbl[idx];
+
+    /*
+     * Need to check for pre-existing actions with same lhs |||
+     */
+
+    /*
+     * Check for optimized case. Don't assume that the eventSeq has actions.
+     */
+    if (!eventSeq->next &&
+	 eventSeq->actions &&
+	!eventSeq->actions->next &&
+	!eventSeq->actions->num_params)
+      {
+	  if (eventSeq->event.eventType == MappingNotify)
+	    stateTree->mappingNotifyInterest = True;
+	  branchHead->hasActions = True;
+	  branchHead->more = eventSeq->actions->idx;
+	  FreeActions(eventSeq->actions);
+	  eventSeq->actions = NULL;
+	  return;
+      }
+
+    branchHead->isSimple = False;
+    if (!eventSeq->next)
+      branchHead->hasActions = True;
+    branchHead->more = GetComplexBranchIndex(stateTree, typeIndex, modIndex);
+    state = &stateTree->complexBranchHeadTbl[TMBranchMore(branchHead)];
+
+    for (;;) {
+	*state = NewState(stateTree, typeIndex, modIndex);
+
+	if (eventSeq->event.eventType == MappingNotify)
+	    stateTree->mappingNotifyInterest = True;
+
+	/* *state now points at state record matching event */
+	eventSeq->state = *state;
+
+	if (eventSeq->actions != NULL) {
+	    if ((*state)->actions != NULL)
+	      AmbigActions(initialEvent, state, stateTree);
+	    (*state)->actions = eventSeq->actions;
+#ifdef TRACE_TM
+	    LOCK_PROCESS
+	    _XtGlobalTM.numComplexActions++;
+	    UNLOCK_PROCESS;
+#endif /* TRACE_TM */
+	}
+
+	if (((eventSeq = eventSeq->next) == NULL) || (eventSeq->state))
+	  break;
+
+	state = &(*state)->nextLevel;
+	typeIndex = _XtGetTypeIndex(&eventSeq->event);
+	modIndex = _XtGetModifierIndex(&eventSeq->event);
+	LOCK_PROCESS;
+	if (!TMNewMatchSemantics()) {
+	    /*
+	     * force a potential empty entry into the branch head
+	     * table in order to emulate old matching behavior
+	     */
+	    (void) GetBranchHead(stateTree, typeIndex, modIndex, True);
+	}
+	UNLOCK_PROCESS;
+    }
+
+    if (eventSeq && eventSeq->state) {
+	/* we've been here before... must be a cycle in the event seq. */
+	branchHead->hasCycles = True;
+	(*state)->nextLevel = eventSeq->state;
+	eventSeq->state->isCycleStart = True;
+	(*state)->isCycleEnd = TRUE;
+    }
+}
+
+
+/*
+ * Internal Converter for merging. Old and New must both be valid xlations
+ */
+
+/*ARGSUSED*/
+Boolean _XtCvtMergeTranslations(
+    Display	*dpy,
+    XrmValuePtr args,
+    Cardinal    *num_args,
+    XrmValuePtr from,
+    XrmValuePtr to,
+    XtPointer	*closure_ret)
+{
+    XtTranslations 	first, second, xlations;
+    TMStateTree		*stateTrees, stackStateTrees[16];
+    TMShortCard		numStateTrees, i;
+
+    if (*num_args != 0)
+	XtWarningMsg("invalidParameters","mergeTranslations",XtCXtToolkitError,
+             "MergeTM to TranslationTable needs no extra arguments",
+               (String *)NULL, (Cardinal *)NULL);
+
+    if (to->addr != NULL && to->size < sizeof(XtTranslations)) {
+	to->size = sizeof(XtTranslations);
+	return False;
+    }
+
+    first = ((TMConvertRec*)from->addr)->old;
+    second = ((TMConvertRec*)from->addr)->new;
+
+    numStateTrees = first->numStateTrees + second->numStateTrees;
+
+    stateTrees = (TMStateTree *)
+      XtStackAlloc(numStateTrees * sizeof(TMStateTree), stackStateTrees);
+
+    for (i = 0; i < first->numStateTrees; i++)
+      stateTrees[i] = first->stateTreeTbl[i];
+    for (i = 0; i < second->numStateTrees; i++)
+      stateTrees[i + first->numStateTrees] = second->stateTreeTbl[i];
+
+    xlations = _XtCreateXlations(stateTrees, numStateTrees, first, second);
+
+    if (to->addr != NULL) {
+	*(XtTranslations*)to->addr = xlations;
+    }
+    else {
+	static XtTranslations staticStateTable;
+	staticStateTable = xlations;
+	to->addr= (XPointer)&staticStateTable;
+	to->size = sizeof(XtTranslations);
+    }
+
+    XtStackFree((XtPointer)stateTrees, (XtPointer)stackStateTrees);
+    return True;
+}
+
+
+static XtTranslations MergeThem(
+    Widget		dest,
+    XtTranslations	first,
+    XtTranslations	second)
+{
+    XtCacheRef 		cache_ref;
+    static XrmQuark 	from_type = NULLQUARK, to_type;
+    XrmValue 		from, to;
+    TMConvertRec 	convert_rec;
+    XtTranslations	newTable;
+
+    LOCK_PROCESS;
+    if (from_type == NULLQUARK) {
+	from_type = XrmPermStringToQuark(_XtRStateTablePair);
+	to_type = XrmPermStringToQuark(XtRTranslationTable);
+    }
+    UNLOCK_PROCESS;
+    from.addr = (XPointer)&convert_rec;
+    from.size = sizeof(TMConvertRec);
+    to.addr = (XPointer)&newTable;
+    to.size = sizeof(XtTranslations);
+    convert_rec.old = first;
+    convert_rec.new = second;
+
+    LOCK_PROCESS;
+    if (! _XtConvert(dest, from_type, &from, to_type, &to, &cache_ref)) {
+	UNLOCK_PROCESS;
+	return NULL;
+    }
+    UNLOCK_PROCESS;
+
+#ifndef REFCNT_TRANSLATIONS
+
+    if (cache_ref)
+	XtAddCallback(dest, XtNdestroyCallback,
+		      XtCallbackReleaseCacheRef, (XtPointer)cache_ref);
+
+#endif
+
+    return newTable;
+}
+
+/*
+ * Unmerge will recursively traverse the xlation compose tree and
+ * generate a new xlation that is the result of all instances of
+ * xlations being removed. It currently doesn't differentiate between
+ * the potential that an xlation will be both an accelerator and
+ * normal. This is not supported by the spec anyway.
+ */
+static XtTranslations UnmergeTranslations(
+    Widget		widget,
+    XtTranslations	xlations,
+    XtTranslations	unmergeXlations,
+    TMShortCard		currIndex,
+    TMComplexBindProcs	oldBindings,
+    TMShortCard		numOldBindings,
+    TMComplexBindProcs	newBindings,
+    TMShortCard		*numNewBindingsRtn)
+
+{
+    XtTranslations first, second, result;
+
+    if (!xlations || (xlations == unmergeXlations))
+      return NULL;
+
+    if (xlations->composers[0]) {
+	first = UnmergeTranslations(widget, xlations->composers[0],
+				    unmergeXlations,  currIndex,
+				    oldBindings, numOldBindings,
+				    newBindings, numNewBindingsRtn);
+    }
+    else
+      first = NULL;
+
+    if (xlations->composers[1]) {
+	second = UnmergeTranslations(widget, xlations->composers[1],
+				     unmergeXlations,
+				     currIndex +
+				     xlations->composers[0]->numStateTrees,
+				     oldBindings, numOldBindings,
+				     newBindings, numNewBindingsRtn);
+    }
+    else
+      second = NULL;
+
+    if (first || second) {
+	if (first && second) {
+	    if ((first != xlations->composers[0]) ||
+		(second != xlations->composers[1]))
+	      result = MergeThem(widget, first, second);
+	    else result = xlations;
+	}
+	else {
+	    if (first)
+	      result = first;
+	    else
+	      result = second;
+	}
+    } else { /* only update for leaf nodes */
+  	if (numOldBindings) {
+ 	    Cardinal	i;
+ 	    for (i = 0; i < xlations->numStateTrees; i++) {
+ 		if (xlations->stateTreeTbl[i]->simple.isAccelerator)
+		    newBindings[*numNewBindingsRtn] =
+			oldBindings[currIndex + i];
+ 		(*numNewBindingsRtn)++;
+	    }
+	}
+	result = xlations;
+    }
+    return result;
+}
+
+typedef struct {
+    XtTranslations xlations;
+    TMComplexBindProcs bindings;
+}MergeBindRec, *MergeBind;
+
+static XtTranslations MergeTranslations(
+    Widget		widget,
+    XtTranslations	oldXlations,
+    XtTranslations	newXlations,
+    _XtTranslateOp	operation,
+    Widget		source,
+    TMComplexBindProcs	oldBindings,
+    TMComplexBindProcs	newBindings,
+    TMShortCard		*numNewRtn)
+{
+    XtTranslations      newTable = NULL, xlations;
+    TMComplexBindProcs	bindings;
+    TMShortCard		i, j;
+    TMStateTree 	*treePtr;
+    TMShortCard		numNew = *numNewRtn;
+    MergeBindRec	bindPair[2];
+
+    /* If the new translation has an accelerator context then pull it
+     * off and pass it and the real xlations in to the caching merge
+     * routine.
+     */
+    if (newXlations->hasBindings) {
+	xlations = ((ATranslations) newXlations)->xlations;
+	bindings = (TMComplexBindProcs)
+	    &((ATranslations) newXlations)->bindTbl[0];
+    }
+    else {
+	xlations = newXlations;
+	bindings = NULL;
+    }
+    switch(operation) {
+      case XtTableReplace:
+	newTable = bindPair[0].xlations = xlations;
+	bindPair[0].bindings = bindings;
+	bindPair[1].xlations = NULL;
+	bindPair[1].bindings = NULL;
+	break;
+      case XtTableAugment:
+	bindPair[0].xlations = oldXlations;
+	bindPair[0].bindings = oldBindings;
+	bindPair[1].xlations = xlations;
+	bindPair[1].bindings = bindings;
+	newTable = NULL;
+	break;
+      case XtTableOverride:
+	bindPair[0].xlations = xlations;
+	bindPair[0].bindings = bindings;
+	bindPair[1].xlations = oldXlations;
+	bindPair[1].bindings = oldBindings;
+	newTable = NULL;
+	break;
+    }
+    if (!newTable)
+      newTable = MergeThem(widget, bindPair[0].xlations, bindPair[1].xlations);
+
+    for (i = 0, numNew = 0; i < 2; i++) {
+	if (bindPair[i].xlations)
+	  for (j = 0; j < bindPair[i].xlations->numStateTrees; j++, numNew++) {
+	      if (bindPair[i].xlations->stateTreeTbl[j]->simple.isAccelerator) {
+		  if (bindPair[i].bindings)
+		    newBindings[numNew] = bindPair[i].bindings[j];
+		  else {
+		      newBindings[numNew].widget = source;
+		      newBindings[numNew].aXlations =
+			bindPair[i].xlations;
+		  }
+		}
+	  }
+    }
+    *numNewRtn = numNew;
+    treePtr = &newTable->stateTreeTbl[0];
+    for (i = 0; i < newTable->numStateTrees; i++, treePtr++)
+      (*treePtr)->simple.refCount++;
+    return newTable;
+}
+
+static TMBindData MakeBindData(
+    TMComplexBindProcs	bindings,
+    TMShortCard		numBindings,
+    TMBindData		oldBindData)
+{
+    TMLongCard		bytes;
+    TMShortCard		i;
+    Boolean		isComplex;
+    TMBindData		bindData;
+
+    if (numBindings == 0)
+      return NULL;
+    for (i = 0; i < numBindings; i++)
+      if (bindings[i].widget)
+	break;
+    isComplex = (i < numBindings);
+    if (isComplex)
+      bytes = (sizeof(TMComplexBindDataRec) +
+	       ((numBindings - 1) *
+		sizeof(TMComplexBindProcsRec)));
+    else
+      bytes = (sizeof(TMSimpleBindDataRec) +
+	       ((numBindings - 1) *
+		sizeof(TMSimpleBindProcsRec)));
+
+    bindData = (TMBindData) __XtCalloc(sizeof(char), bytes);
+    bindData->simple.isComplex = isComplex;
+    if (isComplex) {
+	TMComplexBindData cBindData = (TMComplexBindData)bindData;
+	/*
+	 * If there were any accelerator contexts in the old bindData
+	 * then propagate them to the new one.
+	 */
+	if (oldBindData && oldBindData->simple.isComplex)
+	    cBindData->accel_context =
+		((TMComplexBindData) oldBindData)->accel_context;
+	XtMemmove((char *)&cBindData->bindTbl[0], (char *)bindings,
+		  numBindings * sizeof(TMComplexBindProcsRec));
+    }
+    return bindData;
+}
+
+/*
+ * This routine is the central clearinghouse for merging translations
+ * into a widget. It takes care of preping the action bindings for
+ * realize time and calling the converter or doing a straight merge if
+ * the destination is empty.
+ */
+static Boolean ComposeTranslations(
+    Widget dest,
+    _XtTranslateOp operation,
+    Widget source,
+    XtTranslations newXlations)
+{
+    XtTranslations 	newTable, oldXlations;
+    XtTranslations	accNewXlations;
+    EventMask		oldMask = 0;
+    TMBindData		bindData;
+    TMComplexBindProcs	oldBindings = NULL;
+    TMShortCard		numOldBindings = 0, numNewBindings = 0, numBytes;
+    TMComplexBindProcsRec stackBindings[16], *newBindings;
+
+    /*
+     * how should we be handling the refcount decrement for the
+     * replaced translation table ???
+     */
+    if (!newXlations)
+      {
+	  XtAppWarningMsg(XtWidgetToApplicationContext(dest),
+			  XtNtranslationError,"nullTable",XtCXtToolkitError,
+			  "table to (un)merge must not be null",
+			  (String *)NULL, (Cardinal *)NULL);
+	  return False;
+      }
+
+    accNewXlations = newXlations;
+    newXlations = ((newXlations->hasBindings)
+		   ? ((ATranslations)newXlations)->xlations
+		   : newXlations);
+
+    if (!(oldXlations = dest->core.tm.translations))
+      operation = XtTableReplace;
+
+    /*
+     * try to avoid generation of duplicate state trees. If the source
+     * isn't simple (1 state Tree) then it's too much hassle
+     */
+    if (((operation == XtTableAugment) ||
+	 (operation == XtTableOverride)) &&
+	(newXlations->numStateTrees == 1)) {
+	Cardinal	i;
+	for (i = 0; i < oldXlations->numStateTrees; i++)
+	  if (oldXlations->stateTreeTbl[i] ==
+	      newXlations->stateTreeTbl[0])
+	    break;
+	if (i < oldXlations->numStateTrees) {
+	    if (operation == XtTableAugment) {
+		/*
+		 * we don't need to do anything since it's already
+		 * there
+		 */
+		return True;
+	    }
+	    else {/* operation == XtTableOverride */
+		/*
+		 * We'll get rid of the duplicate trees throughout the
+		 * and leave it with a pruned translation table. This
+		 * will only work if the same table has been merged
+		 * into this table (or one of it's composers
+		 */
+		_XtUnmergeTranslations(dest, newXlations);
+		/*
+		 * reset oldXlations so we're back in sync
+		 */
+		if (!(oldXlations = dest->core.tm.translations))
+		  operation = XtTableReplace;
+	    }
+	}
+    }
+
+    bindData = (TMBindData) dest->core.tm.proc_table;
+    if (bindData) {
+	numOldBindings = (oldXlations ? oldXlations->numStateTrees : 0);
+ 	if (bindData->simple.isComplex)
+	    oldBindings = &((TMComplexBindData)bindData)->bindTbl[0];
+ 	else
+	    oldBindings = (TMComplexBindProcs)
+		(&((TMSimpleBindData)bindData)->bindTbl[0]);
+    }
+
+    numBytes =(((oldXlations ? oldXlations->numStateTrees : 0)
+		+ newXlations->numStateTrees) * sizeof(TMComplexBindProcsRec));
+    newBindings = (TMComplexBindProcs) XtStackAlloc(numBytes,  stackBindings);
+    XtBZero((char *)newBindings, numBytes);
+
+    if (operation == XtTableUnmerge) {
+	newTable = UnmergeTranslations(dest,
+				       oldXlations,
+				       newXlations,
+				       0,
+				       oldBindings, numOldBindings,
+				       newBindings, &numNewBindings);
+#ifdef DEBUG
+	/* check for no match for unmerge */
+	if (newTable == oldXlations) {
+	    XtWarning("attempt to unmerge invalid table");
+	    XtStackFree((char *)newBindings, (char *)stackBindings);
+	    return(newTable != NULL);
+	}
+#endif /* DEBUG */
+    }
+    else {
+	newTable = MergeTranslations(dest,
+				     oldXlations,
+				     accNewXlations,
+				     operation,
+				     source,
+				     oldBindings,
+				     newBindings,
+				     &numNewBindings);
+    }
+    if (XtIsRealized(dest)) {
+	oldMask = 0;
+	if (oldXlations)
+	    oldMask = oldXlations->eventMask;
+	_XtUninstallTranslations(dest);
+    }
+
+    dest->core.tm.proc_table =
+      (XtActionProc *) MakeBindData(newBindings, numNewBindings, bindData);
+
+    if (bindData) XtFree((char *)bindData);
+
+    dest->core.tm.translations = newTable;
+
+    if (XtIsRealized(dest)) {
+	EventMask mask = 0;
+	_XtInstallTranslations(dest);
+	if (newTable)
+	    mask = newTable->eventMask;
+	if (mask != oldMask)
+	    XSelectInput(XtDisplay(dest), XtWindow(dest),
+			 XtBuildEventMask(dest));
+    }
+    XtStackFree((XtPointer)newBindings, (XtPointer)stackBindings);
+    return(newTable != NULL);
+}
+
+/*
+ * If a GetValues is done on a translation resource that contains
+ * accelerators we need to return the accelerator context in addition
+ * to the pure translations.  Since this means returning memory that
+ * the client controlls but we still own, we will track the "headers"
+ * that we return (via a linked list pointed to from the bindData) and
+ * free it at destroy time.
+ */
+XtTranslations _XtGetTranslationValue(
+    Widget	w)
+{
+    XtTM		tmRecPtr = (XtTM) &w->core.tm;
+    ATranslations	*aXlationsPtr;
+    TMComplexBindData	cBindData = (TMComplexBindData) tmRecPtr->proc_table;
+    XtTranslations	xlations = tmRecPtr->translations;
+
+    if (!xlations || !cBindData || !cBindData->isComplex)
+	return xlations;
+
+    /* Walk the list looking to see if we already have generated a
+     * header for the currently installed translations.  If we have,
+     * just return that header.  Otherwise create a new header.
+     */
+    for (aXlationsPtr = (ATranslations *) &cBindData->accel_context;
+	 *aXlationsPtr && (*aXlationsPtr)->xlations != xlations;
+	 aXlationsPtr = &(*aXlationsPtr)->next)
+	;
+    if (*aXlationsPtr)
+	return (XtTranslations) *aXlationsPtr;
+    else {
+	/* create a new aXlations context */
+	ATranslations	aXlations;
+	Cardinal	numBindings = xlations->numStateTrees;
+
+	(*aXlationsPtr) = aXlations = (ATranslations)
+	    __XtMalloc(sizeof(ATranslationData) +
+		     (numBindings - 1) * sizeof(TMComplexBindProcsRec));
+
+	aXlations->hasBindings = True;
+	aXlations->xlations = xlations;
+	aXlations->next = NULL;
+	XtMemmove((char *) &aXlations->bindTbl[0],
+		  (char *) &cBindData->bindTbl[0],
+		  numBindings * sizeof(TMComplexBindProcsRec));
+	return (XtTranslations) aXlations;
+    }
+}
+
+
+/*ARGSUSED*/
+static void RemoveStateTree(
+    TMStateTree	tree)
+{
+#ifdef REFCNT_TRANSLATIONS
+    TMComplexStateTree stateTree = (TMComplexStateTree)tree;
+
+    if (--stateTree->refCount == 0) {
+	/*
+	 * should we free/refcount the match recs ?
+	 */
+	if (!stateTree->isSimple)  {
+	    StatePtr	currState, nextState;
+	    TMShortCard i;
+	    for (i = 0; i < stateTree->numComplexBranchHeads; i++) {
+		currState =
+		  nextState =
+		    stateTree->complexBranchHeadTbl[i];
+		for (; nextState;){
+		    FreeActions(currState->actions);
+		    currState->actions = NULL;
+		    if (!currState->isCycleEnd)
+		      nextState = currState->nextLevel;
+		    else
+		      nextState = NULL;
+		    XtFree( (char*)currState );
+		}
+	    }
+	    XtFree((char*)stateTree->complexBranchHeadTbl);
+	}
+	XtFree((char*)stateTree->branchHeadTbl);
+	XtFree((char*)stateTree);
+    }
+#endif /* REFCNT_TRANSLATIONS */
+}
+
+void _XtRemoveStateTreeByIndex(
+    XtTranslations	xlations,
+    TMShortCard	i)
+{
+    TMStateTree		*stateTrees = xlations->stateTreeTbl;
+
+    RemoveStateTree(stateTrees[i]);
+    xlations->numStateTrees--;
+
+    for (; i < xlations->numStateTrees; i++)
+      {
+	  stateTrees[i] = stateTrees[i+1];
+      }
+}
+
+/* ARGSUSED */
+void _XtFreeTranslations(
+    XtAppContext app,
+    XrmValuePtr	toVal,
+    XtPointer	closure,
+    XrmValuePtr	args,
+    Cardinal	*num_args)
+{
+    XtTranslations 	xlations;
+    int 	i;
+
+    if (*num_args != 0)
+	XtAppWarningMsg(app,
+	  "invalidParameters","freeTranslations",XtCXtToolkitError,
+          "Freeing XtTranslations requires no extra arguments",
+	  (String *)NULL, (Cardinal *)NULL);
+
+    xlations = *(XtTranslations*)toVal->addr;
+    for (i = 0; i < (int)xlations->numStateTrees; i++)
+      RemoveStateTree(xlations->stateTreeTbl[i]);
+    XtFree((char *)xlations);
+}
+
+/*  The spec is not clear on when actions specified in accelerators are bound;
+ *  Bind them at Realize the same as translations
+ */
+void XtInstallAccelerators(
+    Widget destination, Widget source)
+{
+    XtTranslations	aXlations;
+    _XtTranslateOp	op;
+    String		buf;
+    WIDGET_TO_APPCON(destination);
+
+    /*
+     * test that it was parsed as an accelarator table. Even though
+     * there doesn't need to be a distinction it makes life easier if
+     * we honor the spec implication that aXlations is an accelerator
+     */
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if ((!XtIsWidget(source)) ||
+	((aXlations = source->core.accelerators) == NULL) ||
+	(aXlations->stateTreeTbl[0]->simple.isAccelerator == False)) {
+	UNLOCK_PROCESS;
+	UNLOCK_APP(app);
+	return;
+    }
+
+    aXlations = source->core.accelerators;
+    op = aXlations->operation;
+
+    if (ComposeTranslations(destination, op, source, aXlations) &&
+	(XtClass(source)->core_class.display_accelerator != NULL)) {
+
+	buf = _XtPrintXlations(destination, aXlations, source, False);
+	(*(XtClass(source)->core_class.display_accelerator))(source,buf);
+	XtFree(buf);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtInstallAllAccelerators(
+    Widget destination,
+    Widget source)
+{
+    Cardinal i;
+    CompositeWidget cw;
+    WIDGET_TO_APPCON(destination);
+
+    /* Recurse down normal children */
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    if (XtIsComposite(source)) {
+        cw = (CompositeWidget) source;
+        for (i = 0; i < cw->composite.num_children; i++) {
+            XtInstallAllAccelerators(destination,cw->composite.children[i]);
+        }
+    }
+
+    /* Recurse down popup children */
+    if (XtIsWidget(source)) {
+        for (i = 0; i < source->core.num_popups; i++) {
+            XtInstallAllAccelerators(destination,source->core.popup_list[i]);
+        }
+    }
+    /* Finally, apply procedure to this widget */
+    XtInstallAccelerators(destination,source);
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+#if 0 /* dead code */
+static _XtTranslateOp _XtGetTMOperation(
+    XtTranslations xlations)
+{
+    return ((xlations->hasBindings)
+	    ? ((ATranslations)xlations)->xlations->operation
+	    : xlations->operation);
+}
+#endif
+
+void XtAugmentTranslations(
+    Widget widget,
+    XtTranslations new)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    (void)ComposeTranslations(widget, XtTableAugment, (Widget)NULL, new);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHaugmentTranslations;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void XtOverrideTranslations(
+    Widget widget,
+    XtTranslations new)
+{
+    Widget hookobj;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    LOCK_PROCESS;
+    (void) ComposeTranslations(widget, XtTableOverride, (Widget)NULL, new);
+    hookobj = XtHooksOfDisplay(XtDisplayOfObject(widget));
+    if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
+	XtChangeHookDataRec call_data;
+
+	call_data.type = XtHoverrideTranslations;
+	call_data.widget = widget;
+	XtCallCallbackList(hookobj,
+		((HookObject)hookobj)->hooks.changehook_callbacks,
+		(XtPointer)&call_data);
+    }
+    UNLOCK_PROCESS;
+    UNLOCK_APP(app);
+}
+
+void _XtMergeTranslations(
+    Widget	widget,
+    XtTranslations newXlations,
+    _XtTranslateOp op)
+{
+    if (!newXlations){
+	if (!widget->core.tm.translations)
+	  return;
+	else {
+	  newXlations = widget->core.tm.translations;
+	  widget->core.tm.translations = NULL;
+      }
+    }
+    (void) ComposeTranslations(widget,
+			     op,
+			     (Widget)NULL,
+			     newXlations);
+}
+
+void _XtUnmergeTranslations(
+   Widget		widget,
+    XtTranslations	xlations)
+{
+    ComposeTranslations(widget, XtTableUnmerge, (Widget)NULL, xlations);
+}
diff --git a/libXt/src/Threads.c b/libXt/src/Threads.c
new file mode 100644
index 000000000..aad17ca79
--- /dev/null
+++ b/libXt/src/Threads.c
@@ -0,0 +1,428 @@
+/* $Xorg: Threads.c,v 1.4 2001/02/09 02:03:59 xorgcvs Exp $ */
+
+/************************************************************
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+                    All Rights Reserved
+
+Permission  to  use,  copy,  modify,  and  distribute   this
+software  and  its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright no-
+tice  appear  in all copies and that both that copyright no-
+tice and this permission notice appear in  supporting  docu-
+mentation,  and  that the name Sun not be used in advertising
+or publicity pertaining to distribution  of  the software
+without specific prior written permission. Sun makes no
+representations about the suitability of this software for
+any purpose. It is provided "as is" without any express or
+implied warranty.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+/*
+
+Copyright 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Threads.c,v 3.6 2001/12/14 19:56:31 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+
+#ifdef XTHREADS
+
+#define xmalloc __XtMalloc
+#define xfree XtFree
+#include <X11/Xthreads.h>
+
+#ifndef NDEBUG
+#define NDEBUG
+#endif
+#include <assert.h>
+#include <stdio.h>
+
+typedef struct _ThreadStack {
+    unsigned int size;
+    int sp;
+    struct _Tstack {
+	xthread_t t;
+	xcondition_t c;
+    } *st;
+} ThreadStack;
+
+typedef struct _LockRec {
+    xmutex_t mutex;
+    int level;
+    ThreadStack stack;
+#ifndef _XMUTEX_NESTS
+    xthread_t holder;
+    xcondition_t cond;
+#endif
+} LockRec;
+
+
+#define STACK_INCR 16
+
+static LockPtr process_lock = NULL;
+
+static void
+InitProcessLock(void)
+{
+    if(!process_lock) {
+    	process_lock = XtNew(LockRec);
+    	process_lock->mutex = xmutex_malloc();
+    	xmutex_init(process_lock->mutex);
+    	process_lock->level = 0;
+#ifndef _XMUTEX_NESTS
+    	process_lock->cond = xcondition_malloc();
+    	xcondition_init(process_lock->cond);
+    	xthread_clear_id(process_lock->holder);
+#endif
+    }
+}
+
+static void
+ProcessLock(void)
+{
+#ifdef _XMUTEX_NESTS
+    xmutex_lock(process_lock->mutex);
+    process_lock->level++;
+#else
+    xthread_t this_thread = xthread_self();
+
+    xmutex_lock(process_lock->mutex);
+
+    if (!xthread_have_id(process_lock->holder)) {
+	process_lock->holder = this_thread;
+	xmutex_unlock(process_lock->mutex);
+	return;
+    }
+
+    if (xthread_equal(process_lock->holder,this_thread)) {
+	process_lock->level++;
+	xmutex_unlock(process_lock->mutex);
+	return;
+    }
+
+    while(xthread_have_id(process_lock->holder))
+	xcondition_wait(process_lock->cond, process_lock->mutex);
+
+    process_lock->holder = this_thread;
+    assert(xthread_equal(process_lock->holder, this_thread));
+    xmutex_unlock(process_lock->mutex);
+#endif
+}
+
+static void
+ProcessUnlock(void)
+{
+#ifdef _XMUTEX_NESTS
+    process_lock->level--;
+    xmutex_unlock(process_lock->mutex);
+#else
+    xmutex_lock(process_lock->mutex);
+    assert(xthread_equal(process_lock->holder, xthread_self()));
+    if (process_lock->level != 0) {
+	process_lock->level--;
+	xmutex_unlock(process_lock->mutex);
+	return;
+    }
+
+    xthread_clear_id(process_lock->holder);
+    xcondition_signal(process_lock->cond);
+
+    xmutex_unlock(process_lock->mutex);
+#endif
+}
+
+
+static void
+AppLock(XtAppContext app)
+{
+    LockPtr app_lock = app->lock_info;
+#ifdef _XMUTEX_NESTS
+    xmutex_lock(app_lock->mutex);
+    app_lock->level++;
+#else
+    xthread_t self = xthread_self();
+    xmutex_lock(app_lock->mutex);
+    if (!xthread_have_id(app_lock->holder)) {
+	app_lock->holder = self;
+    	assert(xthread_equal(app_lock->holder, self));
+	xmutex_unlock(app_lock->mutex);
+	return;
+    }
+    if (xthread_equal(app_lock->holder, self)) {
+	app_lock->level++;
+	xmutex_unlock(app_lock->mutex);
+	return;
+    }
+    while(xthread_have_id(app_lock->holder)) {
+	xcondition_wait(app_lock->cond, app_lock->mutex);
+    }
+    app_lock->holder = self;
+    assert(xthread_equal(app_lock->holder, self));
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+AppUnlock(XtAppContext app)
+{
+    LockPtr app_lock = app->lock_info;
+#ifdef _XMUTEX_NESTS
+    app_lock->level--;
+    xmutex_unlock(app_lock->mutex);
+#else
+    xthread_t self;
+
+    self = xthread_self();
+    xmutex_lock(app_lock->mutex);
+    assert(xthread_equal(app_lock->holder, self));
+    if (app_lock->level != 0) {
+	app_lock->level--;
+	xmutex_unlock(app_lock->mutex);
+	return;
+    }
+    xthread_clear_id(app_lock->holder);
+    xcondition_signal(app_lock->cond);
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+YieldAppLock(
+    XtAppContext app,
+    Boolean* push_thread,
+    Boolean* pushed_thread,
+    int* level)
+{
+    LockPtr app_lock = app->lock_info;
+    xthread_t self = xthread_self();
+#ifndef _XMUTEX_NESTS
+    xmutex_lock(app_lock->mutex);
+    assert(xthread_equal(app_lock->holder, self));
+#endif
+    *level = app_lock->level;
+    if (*push_thread) {
+	*push_thread = FALSE;
+	*pushed_thread = TRUE;
+
+	if(app_lock->stack.sp == (int)app_lock->stack.size - 1) {
+	    unsigned ii;
+	    app_lock->stack.st = (struct _Tstack *)
+		XtRealloc ((char *)app_lock->stack.st,
+		(app_lock->stack.size + STACK_INCR) * sizeof (struct _Tstack));
+	    ii = app_lock->stack.size;
+	    app_lock->stack.size += STACK_INCR;
+	    for ( ; ii < app_lock->stack.size; ii++) {
+		app_lock->stack.st[ii].c = xcondition_malloc();
+		xcondition_init(app_lock->stack.st[ii].c);
+	    }
+	}
+	app_lock->stack.st[++(app_lock->stack.sp)].t = self;
+    }
+#ifdef _XMUTEX_NESTS
+    while (app_lock->level > 0) {
+	app_lock->level--;
+	xmutex_unlock(app_lock->mutex);
+    }
+#else
+    xcondition_signal(app_lock->cond);
+    app_lock->level = 0;
+    xthread_clear_id(app_lock->holder);
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+RestoreAppLock(
+    XtAppContext app,
+    int level,
+    Boolean* pushed_thread)
+{
+    LockPtr app_lock = app->lock_info;
+    xthread_t self = xthread_self();
+    xmutex_lock(app_lock->mutex);
+#ifdef _XMUTEX_NESTS
+    app_lock->level++;
+#else
+    while(xthread_have_id(app_lock->holder)) {
+	xcondition_wait(app_lock->cond, app_lock->mutex);
+    }
+#endif
+    if (!xthread_equal(app_lock->stack.st[app_lock->stack.sp].t, self)) {
+	int ii;
+	for (ii = app_lock->stack.sp - 1; ii >= 0; ii--) {
+	    if (xthread_equal(app_lock->stack.st[ii].t, self)) {
+		xcondition_wait(app_lock->stack.st[ii].c, app_lock->mutex);
+		break;
+	    }
+	}
+#ifndef _XMUTEX_NESTS
+	while(xthread_have_id(app_lock->holder)) {
+	    xcondition_wait(app_lock->cond, app_lock->mutex);
+	}
+#endif
+    }
+#ifdef _XMUTEX_NESTS
+    while (app_lock->level < level) {
+	xmutex_lock(app_lock->mutex);
+	app_lock->level++;
+    }
+#else
+    app_lock->holder = self;
+    app_lock->level = level;
+    assert(xthread_equal(app_lock->holder, self));
+#endif
+    if (*pushed_thread) {
+	*pushed_thread = FALSE;
+	(app_lock->stack.sp)--;
+	if (app_lock->stack.sp >= 0) {
+	    xcondition_signal (app_lock->stack.st[app_lock->stack.sp].c);
+	}
+    }
+#ifndef _XMUTEX_NESTS
+    xmutex_unlock(app_lock->mutex);
+#endif
+}
+
+static void
+FreeAppLock(XtAppContext app)
+{
+    unsigned ii;
+    LockPtr app_lock = app->lock_info;
+
+    if(app_lock) {
+	xmutex_clear(app_lock->mutex);
+	xmutex_free(app_lock->mutex);
+#ifndef _XMUTEX_NESTS
+	xcondition_clear(app_lock->cond);
+	xcondition_free(app_lock->cond);
+#endif
+	if(app_lock->stack.st != (struct _Tstack *)NULL) {
+	    for (ii = 0; ii < app_lock->stack.size; ii++) {
+		xcondition_clear(app_lock->stack.st[ii].c);
+		xcondition_free(app_lock->stack.st[ii].c);
+	    }
+	    XtFree((char *)app_lock->stack.st);
+	}
+	XtFree((char *)app_lock);
+	app->lock_info = NULL;
+    }
+}
+
+static void
+InitAppLock(XtAppContext app)
+{
+    int ii;
+    LockPtr app_lock;
+
+    app->lock = AppLock;
+    app->unlock = AppUnlock;
+    app->yield_lock = YieldAppLock;
+    app->restore_lock = RestoreAppLock;
+    app->free_lock = FreeAppLock;
+
+    app_lock = app->lock_info = XtNew(LockRec);
+    app_lock->mutex = xmutex_malloc();
+    xmutex_init(app_lock->mutex);
+    app_lock->level = 0;
+#ifndef _XMUTEX_NESTS
+    app_lock->cond = xcondition_malloc();
+    xcondition_init(app_lock->cond);
+    xthread_clear_id(app_lock->holder);
+#endif
+    app_lock->stack.size = STACK_INCR;
+    app_lock->stack.sp = -1;
+    app_lock->stack.st =
+	(struct _Tstack *)__XtMalloc(sizeof(struct _Tstack)*STACK_INCR);
+    for (ii = 0; ii < STACK_INCR; ii++) {
+	app_lock->stack.st[ii].c = xcondition_malloc();
+	xcondition_init(app_lock->stack.st[ii].c);
+    }
+}
+
+#endif /* defined(XTHREADS) */
+
+void XtAppLock(XtAppContext app)
+{
+#ifdef XTHREADS
+    if(app->lock)
+	(*app->lock)(app);
+#endif
+}
+
+void XtAppUnlock(XtAppContext app)
+{
+#ifdef XTHREADS
+    if(app->unlock)
+	(*app->unlock)(app);
+#endif
+}
+
+void XtProcessLock(void)
+{
+#ifdef XTHREADS
+    if(_XtProcessLock)
+	(*_XtProcessLock)();
+#endif
+}
+
+void XtProcessUnlock(void)
+{
+#ifdef XTHREADS
+    if(_XtProcessUnlock)
+	(*_XtProcessUnlock)();
+#endif
+}
+
+Boolean XtToolkitThreadInitialize(void)
+{
+#ifdef XTHREADS
+    if (_XtProcessLock == NULL) {
+#ifdef xthread_init
+	xthread_init();
+#endif
+	InitProcessLock();
+	_XtProcessLock = ProcessLock;
+	_XtProcessUnlock = ProcessUnlock;
+	_XtInitAppLock = InitAppLock;
+    }
+    return True;
+#else
+    return False;
+#endif
+}
+
diff --git a/libXt/src/VarCreate.c b/libXt/src/VarCreate.c
new file mode 100644
index 000000000..b3761e8b8
--- /dev/null
+++ b/libXt/src/VarCreate.c
@@ -0,0 +1,399 @@
+/* $Xorg: VarCreate.c,v 1.4 2001/02/09 02:03:59 xorgcvs Exp $ */
+
+/*
+
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name Sun not be used in
+advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+Sun makes no representations about the suitability of
+this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+/*
+
+Copyright 1885, 1986, 1987, 1988, 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/VarCreate.c,v 3.6 2001/08/22 22:52:20 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "Shell.h"
+#include "VarargsI.h"
+#include "CreateI.h"
+
+#if (defined(SUNSHLIB) || defined(AIXSHLIB)) && defined(SHAREDCODE)
+#define XtToolkitInitialize _XtToolkitInitialize
+#endif /* (SUNSHLIB || AIXSHLIB) && SHAREDCODE */
+
+static Widget
+_XtVaCreateWidget(
+    String      name,
+    WidgetClass widget_class,
+    Widget      parent,
+    va_list     var,
+    int		count)
+{
+    register Widget         widget;
+    XtTypedArgList	    typed_args = NULL;
+    Cardinal		    num_args;
+
+    _XtVaToTypedArgList(var, count, &typed_args, &num_args);
+
+    widget = _XtCreateWidget(name, widget_class, parent, (ArgList)NULL, 
+		    (Cardinal)0, typed_args, num_args);
+
+    if (typed_args != NULL) {
+        XtFree((XtPointer)typed_args);
+    }    
+
+    return widget;
+}
+
+
+Widget
+XtVaCreateWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget parent,
+    ...)
+{
+    va_list                 var;
+    register Widget         widget;
+    int			    total_count, typed_count;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    va_start(var,parent);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,parent);
+    widget = _XtVaCreateWidget((String)name, widget_class, parent, var,
+				total_count);
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+
+Widget
+XtVaCreateManagedWidget(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget parent,
+    ...)
+{
+    va_list		var;
+    register Widget	widget;
+    int			total_count, typed_count;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    va_start(var,parent);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,parent);
+    widget = _XtVaCreateWidget((String)name, widget_class, parent, var,
+				total_count);
+    XtManageChild(widget);
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+
+Widget
+XtVaAppCreateShell(
+    _Xconst char* name,
+    _Xconst char* class,
+    WidgetClass widget_class,
+    Display* display,
+    ...)
+{
+    va_list                 var;
+    register Widget         widget;
+    XtTypedArgList          typed_args = NULL;
+    Cardinal                num_args;
+    int			    total_count, typed_count;
+    DPY_TO_APPCON(display);
+
+    LOCK_APP(app);
+    va_start(var,display);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,display);
+
+    _XtVaToTypedArgList(var, total_count, &typed_args, &num_args);
+    widget = _XtAppCreateShell((String)name, (String)class, widget_class,
+		display, (ArgList)NULL, (Cardinal)0, typed_args, num_args);
+    if (typed_args != NULL) {
+	XtFree((XtPointer)typed_args);
+    }
+ 
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+
+Widget
+XtVaCreatePopupShell(
+    _Xconst char* name,
+    WidgetClass widget_class,
+    Widget parent,
+    ...)
+{
+    va_list                 var;
+    register Widget         widget;
+    XtTypedArgList          typed_args = NULL;
+    Cardinal                num_args;
+    int			    total_count, typed_count;
+    WIDGET_TO_APPCON(parent);
+
+    LOCK_APP(app);
+    va_start(var,parent);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,parent);
+
+    _XtVaToTypedArgList(var, total_count, &typed_args, &num_args);
+    widget = _XtCreatePopupShell((String)name, widget_class, parent,
+		(ArgList)NULL, (Cardinal)0, typed_args, num_args);
+    if (typed_args != NULL) {
+	XtFree((XtPointer)typed_args);
+    }
+
+    va_end(var);
+    UNLOCK_APP(app);
+    return widget;
+}
+
+void
+XtVaSetValues(Widget widget, ...)
+{
+    va_list                 var;
+    ArgList                 args = NULL;
+    Cardinal                num_args;
+    int			    total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var,widget);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,widget);
+
+    _XtVaToArgList(widget, var, total_count, &args, &num_args);
+    XtSetValues(widget, args, num_args);
+    _XtFreeArgList(args, total_count, typed_count);
+
+    UNLOCK_APP(app);
+    va_end(var);
+}
+
+
+void
+XtVaSetSubvalues(XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
+{
+    va_list	var;
+    ArgList    	args;
+    Cardinal   	num_args;
+    int		total_count, typed_count;		
+
+    va_start(var, num_resources);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    if (typed_count != 0) {
+	XtWarning("XtVaTypedArg is not valid in XtVaSetSubvalues()\n");
+    }
+
+    va_start(var, num_resources);
+    _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
+
+    XtSetSubvalues(base, resources, num_resources, args, num_args);
+
+    if (num_args != 0) {
+        XtFree((XtPointer)args);
+    }    
+
+    va_end(var);
+}
+
+Widget
+_XtVaOpenApplication(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    va_list var_args)
+{
+    XtAppContext app_con;
+    Display * dpy;
+    register int saved_argc = *argc_in_out;
+    Widget root;
+    String attr;
+    int count = 0;
+    XtTypedArgList typed_args;
+
+    XtToolkitInitialize(); /* cannot be moved into _XtAppInit */
+    
+    dpy = _XtAppInit(&app_con, (String)application_class, options, num_options,
+		     argc_in_out, &argv_in_out, fallback_resources);
+
+    typed_args = (XtTypedArgList) __XtMalloc((unsigned) sizeof(XtTypedArg));
+    attr = va_arg (var_args, String);
+    for(; attr != NULL; attr = va_arg (var_args, String)) {
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+            typed_args[count].name = va_arg(var_args, String);
+            typed_args[count].type = va_arg(var_args, String);
+            typed_args[count].value = va_arg(var_args, XtArgVal);
+            typed_args[count].size = va_arg(var_args, int);
+        } else {
+	    typed_args[count].name = attr;
+	    typed_args[count].type = NULL;
+	    typed_args[count].value = va_arg(var_args, XtArgVal);
+	    typed_args[count].size = 0;
+        }
+	count++;
+	typed_args = (XtTypedArgList) 
+	    XtRealloc((char *) typed_args, 
+		       (unsigned) (count + 1) * sizeof(XtTypedArg));
+    }
+    typed_args[count].name = NULL;
+
+    va_end (var_args);
+
+    root =
+	XtVaAppCreateShell( NULL, application_class, 
+			    widget_class, dpy,
+			    XtNscreen, (XtArgVal)DefaultScreenOfDisplay(dpy),
+			    XtNargc, (XtArgVal)saved_argc,
+			    XtNargv, (XtArgVal)argv_in_out,
+			    XtVaNestedList, (XtVarArgsList)typed_args,
+			    NULL );
+   
+    if (app_context_return != NULL)
+	*app_context_return = app_con;
+
+    XtFree((XtPointer)typed_args);
+    XtFree((XtPointer)argv_in_out);
+    return(root);
+}
+
+Widget
+_XtVaAppInitialize(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    va_list var_args)
+{
+    return _XtVaOpenApplication(app_context_return, application_class,
+				options, num_options,
+				argc_in_out, argv_in_out, fallback_resources,
+				applicationShellWidgetClass, var_args);
+}
+
+#if !((defined(SUNSHLIB) || defined(AIXSHLIB)) && defined(SHAREDCODE))
+
+/*
+ * If not used as a shared library, we still need a front end to 
+ * _XtVaOpenApplication and to _XtVaAppInitialize.
+ */
+
+Widget
+XtVaOpenApplication(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    ...)
+{
+    va_list	var;
+
+    va_start(var, widget_class);    
+    return _XtVaOpenApplication(app_context_return, (String)application_class,
+				options, num_options, argc_in_out, argv_in_out,
+				fallback_resources, widget_class, var);
+}
+
+Widget
+XtVaAppInitialize(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ...)
+{
+    va_list	var;
+
+    va_start(var, fallback_resources);    
+    return _XtVaOpenApplication(app_context_return, (String)application_class,
+				options, num_options, argc_in_out, argv_in_out,
+				fallback_resources,
+				applicationShellWidgetClass, var);
+}
+
+#endif /* !((SUNSHLIB || AIXSHLIB) && SHAREDCODE) */
+
diff --git a/libXt/src/VarGet.c b/libXt/src/VarGet.c
new file mode 100644
index 000000000..cdb425a71
--- /dev/null
+++ b/libXt/src/VarGet.c
@@ -0,0 +1,317 @@
+/* $Xorg: VarGet.c,v 1.4 2001/02/09 02:03:59 xorgcvs Exp $ */
+/*
+
+Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name Sun not be used in
+advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+Sun makes no representations about the suitability of
+this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+/*
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/VarGet.c,v 1.7 2001/07/29 05:01:12 tsi Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "StringDefs.h"
+
+static String XtNxtGetTypedArg = "xtGetTypedArg";
+
+void
+XtVaGetSubresources(
+    Widget widget,
+    XtPointer base,
+    _Xconst char* name,
+    _Xconst char* class,
+    XtResourceList resources,
+    Cardinal num_resources,
+    ...)
+{
+    va_list                 var;
+    XtTypedArgList          args;
+    Cardinal                num_args;
+    int			    total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var, num_resources);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var, num_resources);
+
+    _XtVaToTypedArgList(var, total_count, &args, &num_args);
+
+    _XtGetSubresources(widget, base, name, class, resources, num_resources,
+	NULL, 0, args, num_args);
+
+    if (num_args != 0) {
+	XtFree((XtPointer)args);
+    }
+
+    va_end(var);
+    UNLOCK_APP(app);
+}
+
+
+void
+XtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
+{
+    va_list                 var;
+    XtTypedArgList          args;
+    Cardinal                num_args;
+    int			    total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var,num_resources);
+    _XtCountVaList(var, &total_count, &typed_count);
+    va_end(var);
+
+    va_start(var,num_resources);
+
+    _XtVaToTypedArgList(var, total_count, &args, &num_args);
+
+    _XtGetApplicationResources(widget, base, resources, num_resources,
+	NULL, 0, args, num_args);
+
+    if (num_args != 0) {
+	XtFree((XtPointer)args);
+    }
+
+    va_end(var);
+    UNLOCK_APP(app);
+}
+
+
+static void
+GetTypedArg(
+    Widget              widget,
+    XtTypedArgList	typed_arg,
+    XtResourceList      resources,
+    Cardinal            num_resources)
+{
+    String              from_type = NULL;
+    Cardinal		from_size = 0;
+    XrmValue            from_val, to_val;
+    register Cardinal   i;
+    Arg			arg;
+    XtPointer		value;
+
+    /* note we presume that the XtResourceList to be un-compiled */
+
+    for (i = 0; i < num_resources; i++) {
+        if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) {
+            from_type = resources[i].resource_type;
+	    from_size = resources[i].resource_size;
+            break;
+        }
+    }
+
+    if (i == num_resources) {
+	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "unknownType", XtNxtGetTypedArg, XtCXtToolkitError,
+            "Unable to find type of resource for conversion",
+            (String *)NULL, (Cardinal *)NULL);
+ 	return;
+    }
+
+    value = ALLOCATE_LOCAL(from_size);
+    if (value == NULL) _XtAllocError(NULL);
+    XtSetArg(arg, typed_arg->name, value);
+    XtGetValues(widget, &arg, 1);
+
+    from_val.size = from_size;
+    from_val.addr = (XPointer)value;
+    to_val.addr = (XPointer)typed_arg->value;
+    to_val.size = typed_arg->size;
+
+    if (!XtConvertAndStore(widget, from_type, &from_val,
+			   typed_arg->type, &to_val)) {
+	if (to_val.size > (unsigned) typed_arg->size) {
+	    String params[2];
+	    Cardinal num_params = 2;
+	    params[0] = typed_arg->type;
+	    params[1] = XtName(widget);
+	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError,
+		"Insufficient space for converted type '%s' in widget '%s'",
+		params, &num_params);
+	}
+	else {
+	    String params[3];
+	    Cardinal num_params = 3;
+	    params[0] = from_type;
+	    params[1] = typed_arg->type;
+	    params[2] = XtName(widget);
+	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+		"conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError,
+		"Type conversion (%s to %s) failed for widget '%s'",
+		params, &num_params);
+	}
+    }
+    DEALLOCATE_LOCAL(value);
+}
+
+static int
+GetNestedArg(
+    Widget              widget,
+    XtTypedArgList	avlist,
+    ArgList             args,
+    XtResourceList      resources,
+    Cardinal            num_resources)
+{
+    int         count = 0;
+
+    for (; avlist->name != NULL; avlist++) {
+        if (avlist->type != NULL) {
+	    GetTypedArg(widget, avlist, resources, num_resources);
+        } else if(strcmp(avlist->name, XtVaNestedList) == 0) {
+            count += GetNestedArg(widget, (XtTypedArgList)avlist->value,
+				     args, resources, num_resources);
+        } else {
+            (args+count)->name = avlist->name;
+            (args+count)->value = avlist->value;
+            ++count;
+        }
+    }
+
+    return(count);
+}
+
+void
+XtVaGetValues(Widget widget, ...)
+{
+    va_list		var;
+    String      	attr;
+    ArgList    		args;
+    XtTypedArg		typed_arg;
+    XtResourceList      resources = (XtResourceList)NULL;
+    Cardinal            num_resources;
+    int			count, total_count, typed_count;
+    WIDGET_TO_APPCON(widget);
+
+    LOCK_APP(app);
+    va_start(var,widget);
+
+    _XtCountVaList(var, &total_count, &typed_count);
+
+    if (total_count != typed_count) {
+        args = (ArgList)__XtMalloc((unsigned)((total_count - typed_count)
+				* sizeof(Arg)));
+    }
+    else args = NULL;		/* for lint; really unused */
+    va_end(var);
+
+    va_start(var,widget);
+    for(attr = va_arg(var, String), count = 0 ; attr != NULL;
+			attr = va_arg(var, String)) {
+	if (strcmp(attr, XtVaTypedArg) == 0) {
+	    typed_arg.name = va_arg(var, String);
+	    typed_arg.type = va_arg(var, String);
+	    typed_arg.value = va_arg(var, XtArgVal);
+	    typed_arg.size = va_arg(var, int);
+
+	    if (resources == NULL) {
+		XtGetResourceList(XtClass(widget), &resources,&num_resources);
+	    }
+
+	    GetTypedArg(widget, &typed_arg, resources, num_resources);
+	} else if (strcmp(attr, XtVaNestedList) == 0) {
+	    if (resources == NULL) {
+		XtGetResourceList(XtClass(widget),&resources, &num_resources);
+	    }
+
+	    count += GetNestedArg(widget, va_arg(var, XtTypedArgList),
+				     (args+count), resources, num_resources);
+	} else {
+	    args[count].name = attr;
+	    args[count].value = va_arg(var, XtArgVal);
+	    count ++;
+	}
+    }
+    va_end(var);
+
+    if (resources != (XtResourceList)NULL) {
+	XtFree((XtPointer)resources);
+    }
+
+    if (total_count != typed_count) {
+	XtGetValues(widget, args, count);
+	XtFree((XtPointer)args);
+    }
+    UNLOCK_APP(app);
+}
+
+void
+XtVaGetSubvalues(XtPointer base,XtResourceList  resources, Cardinal num_resources, ...)
+{
+    va_list	var;
+    ArgList    	args;
+    Cardinal   	num_args;
+    int		total_count, typed_count;
+
+    va_start(var,num_resources);
+
+    _XtCountVaList(var, &total_count, &typed_count);
+
+    if (typed_count != 0) {
+	XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n");
+    }
+    va_end(var);
+
+    va_start(var,num_resources);
+    _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
+    va_end(var);
+
+    XtGetSubvalues(base, resources, num_resources, args, num_args);
+
+    if (num_args != 0) {
+        XtFree((XtPointer)args);
+    }
+}
diff --git a/libXt/src/Varargs.c b/libXt/src/Varargs.c
new file mode 100644
index 000000000..37d3c64db
--- /dev/null
+++ b/libXt/src/Varargs.c
@@ -0,0 +1,519 @@
+/* $Xorg: Varargs.c,v 1.4 2001/02/09 02:03:59 xorgcvs Exp $ */
+
+/*
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/Varargs.c,v 3.10 2001/12/14 19:56:32 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "StringDefs.h"
+
+static String XtNxtConvertVarToArgList = "xtConvertVarToArgList";
+
+/*
+ *    Given a nested list, _XtCountNestedList() returns counts of the
+ *    total number of attribute-value pairs and the count of those
+ *    attributes that are typed. The list is counted recursively.
+ */
+static  void
+_XtCountNestedList(
+    XtTypedArgList  avlist,
+    int             *total_count,
+    int             *typed_count)
+{
+    for (; avlist->name != NULL; avlist++) {
+        if (strcmp(avlist->name, XtVaNestedList) == 0) {
+            _XtCountNestedList((XtTypedArgList)avlist->value, total_count,
+                	       typed_count);
+        } else {
+            if (avlist->type != NULL) {
+                ++(*typed_count);
+            }
+            ++(*total_count);
+        }
+    }
+}
+
+
+/*
+ *    Given a variable length attribute-value list, _XtCountVaList()
+ *    returns counts of the total number of attribute-value pairs,
+ *    and the count of the number of those attributes that are typed.
+ *    The list is counted recursively.
+ */
+void
+_XtCountVaList(va_list var, int* total_count, int* typed_count)
+{
+    String          attr;
+
+    *total_count = 0;
+    *typed_count = 0;
+
+    for(attr = va_arg(var, String) ; attr != NULL;
+                        attr = va_arg(var, String)) {
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+            (void)va_arg(var, String);
+            (void)va_arg(var, String);
+            (void)va_arg(var, XtArgVal);
+            (void)va_arg(var, int);
+            ++(*total_count);
+            ++(*typed_count);
+        } else if (strcmp(attr, XtVaNestedList) == 0) {
+            _XtCountNestedList(va_arg(var, XtTypedArgList), total_count,
+                typed_count);
+        } else {
+            (void)va_arg(var, XtArgVal);
+            ++(*total_count);
+	}
+    }
+}
+
+
+/*
+ *   Given a variable length attribute-value list, XtVaCreateArgsList()
+ *   constructs an attribute-value list of type XtTypedArgList and
+ *   returns the list.
+ */
+XtVarArgsList
+XtVaCreateArgsList(XtPointer unused, ...)
+{
+    va_list var;
+    XtTypedArgList  avlist;
+    int		    count = 0;
+    String	    attr;
+
+    /*
+     * Count the number of attribute-value pairs in the list.
+     * Note: The count is required only to allocate enough space to store
+     * the list. Therefore nested lists are not counted recursively.
+     */
+    va_start(var,unused);
+    for(attr = va_arg(var, String) ; attr != NULL;
+                        attr = va_arg(var, String)) {
+        ++count;
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+            (void)va_arg(var, String);
+            (void)va_arg(var, String);
+            (void)va_arg(var, XtArgVal);
+            (void)va_arg(var, int);
+        } else {
+            (void)va_arg(var, XtArgVal);
+        }
+    }
+    va_end(var);
+
+    va_start(var,unused);
+    avlist = _XtVaCreateTypedArgList(var, count);
+    va_end(var);
+    return (XtVarArgsList)avlist;
+}
+
+
+XtTypedArgList _XtVaCreateTypedArgList(va_list var, register int count)
+{
+    String	    attr;
+    XtTypedArgList  avlist;
+
+    avlist = (XtTypedArgList)
+		__XtCalloc((int)count + 1, (unsigned)sizeof(XtTypedArg));
+
+    for(attr = va_arg(var, String), count = 0; attr != NULL;
+		attr = va_arg(var, String)) {
+	if (strcmp(attr, XtVaTypedArg) == 0) {
+	    avlist[count].name = va_arg(var, String);
+	    avlist[count].type = va_arg(var, String);
+	    avlist[count].value = va_arg(var, XtArgVal);
+	    avlist[count].size = va_arg(var, int);
+	} else {
+	    avlist[count].name = attr;
+	    avlist[count].type = NULL;
+	    avlist[count].value = va_arg(var, XtArgVal);
+	}
+	++count;
+    }
+    avlist[count].name = NULL;
+
+    return avlist;
+}
+
+
+/*
+ *    TypedArgToArg() invokes a resource converter to convert the
+ *    passed typed arg into a name/value pair and stores the name/value
+ *    pair in the passed Arg structure.  If memory is allocated for the
+ *    converted value, the address is returned in the value field of
+ *    memory_return; otherwise that field is NULL.  The function returns
+ *    1 if the conversion succeeded and 0 if the conversion failed.
+ */
+static int
+TypedArgToArg(
+    Widget              widget,
+    XtTypedArgList      typed_arg,
+    ArgList             arg_return,
+    XtResourceList      resources,
+    Cardinal            num_resources,
+    ArgList		memory_return)
+{
+    String              to_type = NULL;
+    XrmValue            from_val, to_val;
+
+
+    if (widget == NULL) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "nullWidget", XtNxtConvertVarToArgList, XtCXtToolkitError,
+	    "XtVaTypedArg conversion needs non-NULL widget handle",
+            (String *)NULL, (Cardinal *)NULL);
+        return(0);
+    }
+
+    /* again we assume that the XtResourceList is un-compiled */
+
+    for (; num_resources--; resources++)
+	if (strcmp(typed_arg->name, resources->resource_name) == 0) {
+	    to_type = resources->resource_type;
+	    break;
+	}
+
+    if (to_type == NULL) {
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "unknownType", XtNxtConvertVarToArgList, XtCXtToolkitError,
+            "Unable to find type of resource for conversion",
+            (String *)NULL, (Cardinal *)NULL);
+        return(0);
+    }
+
+    to_val.addr = NULL;
+    from_val.size = typed_arg->size;
+    if ((strcmp(typed_arg->type, XtRString) == 0) ||
+            ((unsigned) typed_arg->size > sizeof(XtArgVal))) {
+        from_val.addr = (XPointer)typed_arg->value;
+    } else {
+            from_val.addr = (XPointer)&typed_arg->value;
+    }
+
+    LOCK_PROCESS;
+    XtConvertAndStore(widget, typed_arg->type, &from_val, to_type, &to_val);
+
+    if (to_val.addr == NULL) {
+	UNLOCK_PROCESS;
+        XtAppWarningMsg(XtWidgetToApplicationContext(widget),
+            "conversionFailed", XtNxtConvertVarToArgList, XtCXtToolkitError,
+            "Type conversion failed", (String *)NULL, (Cardinal *)NULL);
+        return(0);
+    }
+
+    arg_return->name = typed_arg->name;
+    memory_return->value = (XtArgVal) NULL;
+
+    if (strcmp(to_type, XtRString) == 0) {
+	arg_return->value = (XtArgVal) to_val.addr;
+    }
+    else {
+	if (to_val.size == sizeof(long))
+	    arg_return->value = (XtArgVal) *(long *)to_val.addr;
+	else if (to_val.size == sizeof(short))
+	    arg_return->value = (XtArgVal) *(short *)to_val.addr;
+	else if (to_val.size == sizeof(char))
+	    arg_return->value = (XtArgVal) *(char *)to_val.addr;
+	else if (to_val.size == sizeof(XtArgVal))
+	    arg_return->value = *(XtArgVal *)to_val.addr;
+	else if (to_val.size > sizeof(XtArgVal)) {
+	    arg_return->value = (XtArgVal) __XtMalloc(to_val.size);
+	    memory_return->value = (XtArgVal)
+		memcpy((void *)arg_return->value, to_val.addr, to_val.size);
+	}
+    }
+    UNLOCK_PROCESS;
+
+    return(1);
+}
+
+
+/*
+ *    NestedArgtoArg() converts the passed nested list into
+ *    an ArgList/count.
+ */
+static int
+NestedArgtoArg(
+    Widget              widget,
+    XtTypedArgList      avlist,
+    ArgList             args,
+    XtResourceList      resources,
+    Cardinal            num_resources,
+    ArgList		memory_return)
+{
+    int         count = 0;
+
+    for (; avlist->name != NULL; avlist++) {
+        if (avlist->type != NULL) {
+            /* If widget is NULL, the typed arg is ignored */
+            if (widget != NULL) {
+                /* this is a typed arg */
+                count += TypedArgToArg(widget, avlist, (args+count),
+					  resources, num_resources,
+					  (memory_return+count));
+            }
+        } else if (strcmp(avlist->name, XtVaNestedList) == 0) {
+            count += NestedArgtoArg(widget, (XtTypedArgList)avlist->value,
+				       (args+count), resources, num_resources,
+				       (memory_return+count));
+        } else {
+            (args+count)->name = avlist->name;
+            (args+count)->value = avlist->value;
+            ++count;
+        }
+    }
+
+    return(count);
+}
+
+/*
+ * Free memory allocated through _XtVaToArgList.  The actual args array
+ * size is expected to be total_count * 2, where total_count is the number
+ * of elements needed for resource representations.  The lower half of the
+ * array contains pairs of resource names and values as usual.  For each
+ * element [n] in the lower half of the array, the value field of the
+ * corresponding element [n + total_count] in the upper half of the array
+ * has been pressed into service in order to note whether the resource value
+ * is a pointer to memory that was allocated in TypedArgToArg.  In the
+ * upper half, if the value field is not NULL, it contains the address of
+ * memory which should now be freed.  That memory could have been allocated
+ * only as a result of the conversion of typed arguments.  Therefore, if
+ * there were no typed arguments in the original varargs, there is no need
+ * to examine the upper half of the array.  In the choice of data structure
+ * to make this representation, priority was given to the wish to retrofit
+ * the release of memory around the existing signature of _XtVaToArgList.
+ */
+void
+_XtFreeArgList(
+    ArgList	args,	     /* as returned by _XtVaToArgList */
+    int		total_count, /*  argument count returned by _XtCountVaList */
+    int 	typed_count) /* typed arg count returned by _XtCountVaList */
+{
+    ArgList p;
+
+    if (args) {
+	if (typed_count)
+	    for (p = args + total_count; total_count--; ++p) {
+		if (p->value) XtFree((char *)p->value);
+	    }
+	XtFree((char *)args);
+    }
+}
+
+
+static void GetResources(Widget widget, XtResourceList *res_list,
+			 Cardinal *number);
+
+
+/*
+ *    Given a variable argument list, _XtVaToArgList() returns the
+ *    equivalent ArgList and count. _XtVaToArgList() handles nested
+ *    lists and typed arguments.  If typed arguments are present, the
+ *    ArgList should be freed with _XtFreeArgList.
+ */
+void
+_XtVaToArgList(
+    Widget		widget,
+    va_list     	var,
+    int			max_count,
+    ArgList		*args_return,
+    Cardinal		*num_args_return)
+{
+    String		attr;
+    int			count;
+    ArgList		args = (ArgList)NULL;
+    XtTypedArg		typed_arg;
+    XtResourceList	resources = (XtResourceList)NULL;
+    Cardinal		num_resources;
+    Boolean		fetched_resource_list = False;
+
+    if (max_count  == 0) {
+	*num_args_return = 0;
+	*args_return = (ArgList)NULL;
+	return;
+    }
+
+    args = (ArgList)__XtMalloc((unsigned)(max_count * 2 * sizeof(Arg)));
+    for (count = max_count * 2; --count >= 0; )
+	args[count].value = (XtArgVal) NULL;
+    count = 0;
+
+    for(attr = va_arg(var, String) ; attr != NULL;
+			attr = va_arg(var, String)) {
+	if (strcmp(attr, XtVaTypedArg) == 0) {
+	    typed_arg.name = va_arg(var, String);
+	    typed_arg.type = va_arg(var, String);
+	    typed_arg.value = va_arg(var, XtArgVal);
+	    typed_arg.size = va_arg(var, int);
+
+	    /* if widget is NULL, typed args are ignored */
+	    if (widget != NULL) {
+		if (!fetched_resource_list) {
+		    GetResources(widget, &resources, &num_resources);
+		    fetched_resource_list = True;
+		}
+		count += TypedArgToArg(widget, &typed_arg, &args[count],
+					  resources, num_resources,
+					  &args[max_count + count]);
+	    }
+	} else if (strcmp(attr, XtVaNestedList) == 0) {
+	    if (widget != NULL) {
+		if (!fetched_resource_list) {
+		    GetResources(widget, &resources, &num_resources);
+		    fetched_resource_list = True;
+		}
+	    }
+
+	    count += NestedArgtoArg(widget, va_arg(var, XtTypedArgList),
+				       &args[count], resources, num_resources,
+				       &args[max_count + count]);
+	} else {
+	    args[count].name = attr;
+	    args[count].value = va_arg(var, XtArgVal);
+	    count ++;
+	}
+    }
+
+    if (resources != NULL)
+	XtFree((XtPointer)resources);
+
+    *num_args_return = (Cardinal)count;
+    *args_return = (ArgList)args;
+}
+
+/*	Function Name: GetResources
+ *	Description: Retreives the normal and constraint resources
+ *                   for this widget.
+ *	Arguments: widget - the widget.
+ * RETURNED        res_list - the list of resource for this widget
+ * RETURNED        number - the number of resources in the above list.
+ *	Returns: none
+ */
+
+static void
+GetResources(
+    Widget widget,
+    XtResourceList * res_list,
+    Cardinal * number)
+{
+    Widget parent = XtParent(widget);
+
+    XtInitializeWidgetClass(XtClass(widget));
+    XtGetResourceList(XtClass(widget), res_list, number);
+
+    if (!XtIsShell(widget) && parent && XtIsConstraint(parent)) {
+	XtResourceList res, constraint, cons_top;
+	Cardinal num_constraint, temp;
+
+	XtGetConstraintResourceList(XtClass(parent), &constraint,
+				    &num_constraint);
+
+	cons_top = constraint;
+	*res_list = (XtResourceList) XtRealloc((char*)*res_list,
+					       ((*number + num_constraint) *
+						sizeof(XtResource)));
+
+	for (temp= num_constraint, res= *res_list + *number; temp != 0; temp--)
+	    *res++ = *constraint++;
+
+	*number += num_constraint;
+	XtFree( (XtPointer) cons_top);
+    }
+}
+
+static int NestedArgtoTypedArg(
+    XtTypedArgList      args,
+    XtTypedArgList      avlist)
+{
+    int         count = 0;
+
+    for (; avlist->name != NULL; avlist++) {
+        if (avlist->type != NULL) {
+            (args+count)->name = avlist->name;
+            (args+count)->type = avlist->type;
+            (args+count)->size = avlist->size;
+            (args+count)->value = avlist->value;
+            ++count;
+        } else if(strcmp(avlist->name, XtVaNestedList) == 0) {
+            count += NestedArgtoTypedArg((args+count),
+                            (XtTypedArgList)avlist->value);
+        } else {
+            (args+count)->name = avlist->name;
+	    (args+count)->type = NULL;
+            (args+count)->value = avlist->value;
+            ++count;
+        }
+    }
+    return(count);
+}
+
+
+/*
+ *    Given a variable argument list, _XtVaToTypedArgList() returns
+ *    the equivalent TypedArgList. _XtVaToTypedArgList() handles nested
+ *    lists.
+ *    Note: _XtVaToTypedArgList() does not do type conversions.
+ */
+void
+_XtVaToTypedArgList(
+    va_list             var,
+    int			max_count,
+    XtTypedArgList   	*args_return,
+    Cardinal            *num_args_return)
+{
+    XtTypedArgList	args = NULL;
+    String              attr;
+    int			count;
+
+    args = (XtTypedArgList)
+	__XtMalloc((unsigned)(max_count * sizeof(XtTypedArg)));
+
+    for(attr = va_arg(var, String), count = 0 ; attr != NULL;
+		    attr = va_arg(var, String)) {
+        if (strcmp(attr, XtVaTypedArg) == 0) {
+	    args[count].name = va_arg(var, String);
+	    args[count].type = va_arg(var, String);
+	    args[count].value = va_arg(var, XtArgVal);
+	    args[count].size = va_arg(var, int);
+	    ++count;
+	} else if (strcmp(attr, XtVaNestedList) == 0) {
+   	    count += NestedArgtoTypedArg(&args[count], 
+			va_arg(var, XtTypedArgList));
+	} else {
+	    args[count].name = attr;
+	    args[count].type = NULL;
+	    args[count].value = va_arg(var, XtArgVal);
+	    ++count;
+	}
+    }
+
+    *args_return = args;
+    *num_args_return = count;
+}
diff --git a/libXt/src/Vendor.c b/libXt/src/Vendor.c
new file mode 100644
index 000000000..2d3090189
--- /dev/null
+++ b/libXt/src/Vendor.c
@@ -0,0 +1,159 @@
+/* $Xorg: Vendor.c,v 1.4 2001/02/09 02:03:59 xorgcvs Exp $ */
+
+/***********************************************************
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xt/Vendor.c,v 1.7 2002/05/31 18:45:46 dawes Exp $ */
+
+/* Make sure all wm properties can make it out of the resource manager */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "StringDefs.h"
+#include "Shell.h"
+#include "ShellP.h"
+#include "Vendor.h"
+#include "VendorP.h"
+#include <stdio.h>
+
+/***************************************************************************
+ *
+ * Vendor shell class record
+ *
+ ***************************************************************************/
+
+#if defined(__UNIXOS2__) || defined(__CYGWIN__) || defined(__MINGW32__)
+/* to fix the EditRes problem because of wrong linker semantics */
+extern WidgetClass vendorShellWidgetClass;
+
+#if defined(__UNIXOS2__)
+unsigned long _DLL_InitTerm(unsigned long mod,unsigned long flag)
+{
+        switch (flag) {
+        case 0: /*called on init*/
+                _CRT_init();
+                vendorShellWidgetClass = (WidgetClass)(&vendorShellClassRec);
+                return 1;
+        case 1: /*called on exit*/
+                return 1;
+        default:
+                return 0;
+        }
+}
+#endif
+
+#if defined(__CYGWIN__) || defined(__MINGW32__)
+int __stdcall
+DllMain(unsigned long mod_handle, unsigned long flag, void *routine)
+{
+  switch (flag)
+    {
+    case 1: /* DLL_PROCESS_ATTACH - process attach */
+      vendorShellWidgetClass = (WidgetClass)(&vendorShellClassRec);
+      break;
+    case 0: /* DLL_PROCESS_DETACH - process detach */
+      break;
+    }
+  return 1;
+}
+#endif
+#endif
+
+externaldef(vendorshellclassrec) VendorShellClassRec vendorShellClassRec = {
+  {
+    /* superclass         */    (WidgetClass) &wmShellClassRec,
+    /* class_name         */    "VendorShell",
+    /* size               */    sizeof(VendorShellRec),
+    /* Class Initializer  */	NULL,
+    /* class_part_initialize*/	NULL,
+    /* Class init'ed ?    */	FALSE,
+    /* initialize         */    NULL,
+    /* initialize_notify    */	NULL,		
+    /* realize            */    XtInheritRealize,
+    /* actions            */    NULL,
+    /* num_actions        */    0,
+    /* resources          */    NULL,
+    /* resource_count     */	0,
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion    */    FALSE,
+    /* compress_exposure  */    TRUE,
+    /* compress_enterleave*/	FALSE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    NULL,
+    /* resize             */    XtInheritResize,
+    /* expose             */    NULL,
+    /* set_values         */    NULL,
+    /* set_values_hook      */	NULL,			
+    /* set_values_almost    */	XtInheritSetValuesAlmost,  
+    /* get_values_hook      */	NULL,
+    /* accept_focus       */    NULL,
+    /* intrinsics version */	XtVersion,
+    /* callback offsets   */    NULL,
+    /* tm_table		  */	NULL,
+    /* query_geometry	    */  NULL,
+    /* display_accelerator  */  NULL,
+    /* extension	    */  NULL
+  },{
+    /* geometry_manager   */    XtInheritGeometryManager,
+    /* change_managed     */    XtInheritChangeManaged,
+    /* insert_child	  */	XtInheritInsertChild,
+    /* delete_child	  */	XtInheritDeleteChild,
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  },{
+    /* extension	    */  NULL
+  }
+};
+
+#if !defined(AIXSHLIB) || !defined(SHAREDCODE)
+externaldef(vendorshellwidgetclass) WidgetClass vendorShellWidgetClass =
+	(WidgetClass) (&vendorShellClassRec);
+#endif
diff --git a/libXt/src/sharedlib.c b/libXt/src/sharedlib.c
new file mode 100644
index 000000000..699302ced
--- /dev/null
+++ b/libXt/src/sharedlib.c
@@ -0,0 +1,236 @@
+/* $Xorg: sharedlib.c,v 1.4 2001/02/09 02:03:59 xorgcvs Exp $ */
+
+/*
+
+Copyright 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xt/sharedlib.c,v 3.7 2002/05/31 18:45:46 dawes Exp $ */
+
+#if (defined(SUNSHLIB) || defined(AIXSHLIB)) && !defined(SHAREDCODE)
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "IntrinsicI.h"
+#include "VarargsI.h"
+#include "ShellP.h"
+#include "VendorP.h"
+#include "CreateI.h"
+
+
+#if defined(AIXSHLIB) || defined(__UNIXOS2__)
+WidgetClass vendorShellWidgetClass = (WidgetClass) &vendorShellClassRec;
+
+static void _XtVendorInitialize()
+{
+    transientShellWidgetClass->core_class.superclass =
+	(WidgetClass) &vendorShellClassRec;
+    topLevelShellWidgetClass->core_class.superclass =
+	(WidgetClass) &vendorShellClassRec;
+}
+
+#define VENDORINIT _XtVendorInitialize();
+
+#else
+
+#define VENDORINIT /* as nothing */
+
+#endif
+
+#ifdef SUNSHLIB
+/*
+ * _XtInherit needs to be statically linked since it is compared against as
+ * well as called.
+ */
+void _XtInherit()
+{
+    extern void __XtInherit();
+    __XtInherit();
+}
+#endif
+
+/*
+ * The following routine will be called by every toolkit
+ * application, forcing this file to be statically linked.
+ *
+ * Note: XtInitialize, XtAppInitialize, and XtOpenApplication
+ *       call XtToolkitInitialize.
+ */
+
+void XtToolkitInitialize()
+{
+    extern void _XtToolkitInitialize();
+    VENDORINIT
+    _XtToolkitInitialize();
+}
+
+Widget 
+XtInitialize(
+    _Xconst char* name,
+    _Xconst char* classname,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc,
+    String *argv)
+{
+    extern Widget _XtInitialize();
+    VENDORINIT
+    return _XtInitialize (name, classname, options, num_options, argc, argv);
+}
+
+Widget
+XtAppInitialize(
+    XtAppContext * app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ArgList args_in,
+    Cardinal num_args_in)
+{
+    extern Widget _XtAppInitialize();
+    VENDORINIT
+    return _XtAppInitialize (app_context_return, application_class, options,
+			     num_options, argc_in_out, argv_in_out, 
+			     fallback_resources, args_in, num_args_in);
+}
+
+Widget
+XtVaAppInitialize(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    ...)
+{
+    va_list	var;
+    extern Widget _XtVaAppInitialize();
+
+    VENDORINIT
+    va_start(var, fallback_resources);
+    return _XtVaAppInitialize(app_context_return, application_class, options,
+			      num_options, argc_in_out, argv_in_out,
+			      fallback_resources, var);
+}
+
+Widget
+XtOpenApplication(
+    XtAppContext * app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescRec *options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    ArgList args_in,
+    Cardinal num_args_in)
+{
+    extern Widget _XtOpenApplication();
+    VENDORINIT
+    return _XtOpenApplication (app_context_return, application_class, options,
+			       num_options, argc_in_out, argv_in_out, 
+			       fallback_resources, widget_class,
+			       args_in, num_args_in);
+}
+
+Widget
+XtVaOpenApplication(
+    XtAppContext *app_context_return,
+    _Xconst char* application_class,
+    XrmOptionDescList options,
+    Cardinal num_options,
+    int *argc_in_out,
+    String *argv_in_out,
+    String *fallback_resources,
+    WidgetClass widget_class,
+    ...)
+{
+    va_list	var;
+    extern Widget _XtVaOpenApplication();
+
+    VENDORINIT
+    va_start(var, widget_class);
+    return _XtVaOpenApplication(app_context_return, application_class, options,
+				num_options, argc_in_out, argv_in_out,
+				fallback_resources, widget_class, var);
+}
+
+#else
+
+#ifndef lint
+static int dummy;			/* avoid warning from ranlib */
+#endif
+
+#endif /* SUNSHLIB or AIXSHLIB */
+
+#if defined(SUNSHLIB) && !defined(SHAREDCODE)
+
+int _XtInheritTranslations = 0;
+
+extern CompositeClassRec compositeClassRec;
+WidgetClass compositeWidgetClass = (WidgetClass) &compositeClassRec;
+
+extern ConstraintClassRec constraintClassRec;
+WidgetClass constraintWidgetClass = (WidgetClass) &constraintClassRec;
+
+extern WidgetClassRec widgetClassRec;
+WidgetClass widgetClass = &widgetClassRec;
+WidgetClass coreWidgetClass = &widgetClassRec;
+
+extern ObjectClassRec objectClassRec;
+WidgetClass objectClass = (WidgetClass)&objectClassRec;
+
+extern RectObjClassRec rectObjClassRec;
+WidgetClass rectObjClass = (WidgetClass)&rectObjClassRec;
+
+extern ShellClassRec shellClassRec;
+WidgetClass shellWidgetClass = (WidgetClass) &shellClassRec;
+
+extern OverrideShellClassRec overrideShellClassRec;
+WidgetClass overrideShellWidgetClass = (WidgetClass) &overrideShellClassRec;
+
+extern WMShellClassRec wmShellClassRec;
+WidgetClass wmShellWidgetClass = (WidgetClass) &wmShellClassRec;
+
+extern TransientShellClassRec transientShellClassRec;
+WidgetClass transientShellWidgetClass = (WidgetClass) &transientShellClassRec;
+
+extern TopLevelShellClassRec topLevelShellClassRec;
+WidgetClass topLevelShellWidgetClass = (WidgetClass) &topLevelShellClassRec;
+
+extern ApplicationShellClassRec applicationShellClassRec;
+WidgetClass applicationShellWidgetClass = (WidgetClass) &applicationShellClassRec;
+
+extern SessionShellClassRec sessionShellClassRec;
+WidgetClass sessionShellWidgetClass = (WidgetClass) &sessionShellClassRec;
+
+extern HookObjClassRec hookObjClassRec;
+WidgetClass hookObjectClass = (WidgetClass) &hookObjClassRec;
+
+#endif /* SUNSHLIB */
-- 
cgit v1.2.3