diff --git a/ChangeLog b/ChangeLog
index 5c2f747..1aa6162 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,73 @@
+Thu Jan 13 11:45:13 1994  John Richardson <jrichard@cs.uml.edu>
+
+	* [window/win.c]
+	Added functions EnableWindow, IsWindowEnabled, and helper 
+	WIN_SetSensitive.
+	
+	* [window/event.c]
+	Added checks for WS_DISABLED windows in EVENT_key, EVENT_MotionNotify,
+	EVENT_ButtonPress, EVENT_ButtonRelease, EVENT_ConfigureNotify,
+	EVENT_FocusIn, EVENT_FocusOut, and EVENT_EnterNotify.  Key and 
+	button presses beep for a disabled window.  
+	If anyone finds better places for these checks, please tell me.
+
+Jan 17, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [misc/message.c]
+	Cleanup on buttons answer value returned.
+
+	* [control/combo.c]
+	Now use OBM_COMBO bitmap dropdown button.
+
+Mon Jan 17 21:56:45 1994  Erik Bos (erik@trashcan.hacktic.nl)
+
+	* [misc/comm/c]
+	A few bugfixes.
+
+Tue Jan 18 06:36:48 1994  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [loader/cursor.c]
+	Added X cursor for IDC_SIZENS and IDC_SIZEWE.
+
+	* [include/options.h] [misc/main.c]  (New files)
+	Rewrote main() function to get rid of Xt application context,
+	and added command-line option parsing.
+
+	* [objects/color.c]
+	Use of a private map now configurable with command-line option.
+
+	* [windows/defwnd.c]
+	Added WM_SYSCOMMAND handling, and better WM_SETCURSOR handling.
+
+	* [windows/event.c]
+	Removed ConfigureNotify event handler (no longer needed).
+
+	* [windows/message.c]
+	Send WM_SETCURSOR message on mouse events.
+
+	* [windows/nonclient.c]
+	Use OEM bitmaps for the drawing of the non-client area.
+	Added caption bar buttons handling, and moving and resizing of
+	the window via the window frame (bypassing the window manager).
+
+	* [windows/painting.c]
+	Bug fix in BeginPaint().
+
+	* [windows/win.c]
+	Set the override_redirect flag for windows (to bypass window
+	manager).
+
+	* [windows/winpos.c]
+	Implemented WindowFromPoint(), ChildWindowFromPoint(),
+	BringWindowToTop(), Get/SetInternalWindowPos(),
+	Get/SetWindowPlacement().
+
+Mon Jan 17 20:48:24 1994  Bob Amstadt  (bob@pooh)
+
+	* [memory/heap.c]
+	Added support for multiple local heaps.
+
+----------------------------------------------------------------------
 Tue Jan  4 13:01:33 1994  David Metcalfe <david@prism.demon.co.uk>
 
         * [window/caret.c]
@@ -84,7 +154,6 @@
 	Added sending of the WM_NCPAINT message in SetWindowPos().
 	Removed the Xt code.
 
-----------------------------------------------------------------------
 Sun Jan  2 12:38:53 1994  David Metcalfe <david@prism.demon.co.uk>
 
 	* [windows/class.c]
diff --git a/Makefile b/Makefile
index 21c7cab..033a5bf 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@
 ######################################################################
 # These definitions are for the top level
 TARGET=wine
-LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm
+LIBS=-L/usr/X386/lib -lX11 -lm
 OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
 	memory/memory.o misc/misc.o objects/objects.o windows/windows.o debugger/debugger.o
 SUBDIRS=if1632 controls loader memory misc objects windows debugger
diff --git a/README b/README
index 52863a7..1b23e05 100644
--- a/README
+++ b/README
@@ -41,6 +41,12 @@
 Have a nice game of solitaire, but be careful.  Emulation isn't perfect.
 So, occassionally it will crash.
 
+WHAT'S NEW with version 0.7: (see ChangeLog for details)
+	- Eliminated Xt-dependent code.  Thanks to Alexandre and Martin.
+	- Other bug fixes.
+	- IsWIndowEnabled() and EnableWindow() now implemented.
+	- New command line options.
+
 WHAT'S NEW with version 0.6: (see ChangeLog for details)
 	- Working towards elimination of Xt-dependent code.  Thanks to
 	  Alexandre and Martin.
diff --git a/controls/Makefile b/controls/Makefile
index 520a112..fb915e7 100644
--- a/controls/Makefile
+++ b/controls/Makefile
@@ -1,9 +1,7 @@
 CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
 
 OBJS = menu.o caption.o widgets.o button.o \
-	scroll.o listbox.o combo.o static.o \
-	SmeMenuButto.o WinLabel.o WinCommand.o \
-	WinMenuButto.o
+	scroll.o listbox.o combo.o static.o
 
 default: controls.o
 
diff --git a/controls/SmeMenuButtP.h b/controls/SmeMenuButtP.h
deleted file mode 100644
index 176577d..0000000
--- a/controls/SmeMenuButtP.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * $XConsortium: SmeMenuButtP.h,v 1.6 89/12/11 15:20:15 kit Exp $
- *
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * 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, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  M.I.T. makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * 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.
- *
- * Author:  Chris D. Peterson, MIT X Consortium
- *
- * Modifications for Wine
- *
- * 8/23/93  David Metcalfe (david@prism.demon.co.uk)
- *          Added code to translate ampersand to underlined char
- */
-
-/* 
- * SmeP.h - Private definitions for Sme object
- * 
- */
-
-#ifndef _XawSmeMenuButtP_h
-#define _XawSmeMenuButtP_h
-
-/***********************************************************************
- *
- * Sme Object Private Data
- *
- ***********************************************************************/
-
-#include <X11/Xaw/SmeP.h>
-#include "SmeMenuButto.h"
-
-/************************************************************
- *
- * New fields for the Sme Object class record.
- *
- ************************************************************/
-
-typedef struct _SmeMenuButtonClassPart {
-  XtPointer extension;
-} SmeMenuButtonClassPart;
-
-/* Full class record declaration */
-typedef struct _SmeMenuButtonClassRec {
-    RectObjClassPart       rect_class;
-    SmeClassPart     sme_class;
-    SmeMenuButtonClassPart  sme_bsb_class;
-} SmeMenuButtonClassRec;
-
-extern SmeMenuButtonClassRec smeMenuButtonClassRec;
-
-/* New fields for the Sme Object record */
-typedef struct {
-    /* resources */
-    String label;		/* The entry label. */
-    int vert_space;		/* extra vert space to leave, as a percentage
-				   of the font height of the label. */
-    Pixmap left_bitmap, right_bitmap; /* bitmaps to show. */
-    Dimension left_margin, right_margin; /* left and right margins. */
-    Pixel foreground;		/* foreground color. */
-    XFontStruct * font;		/* The font to show label in. */
-    XtJustify justify;		/* Justification for the label. */
-    String menu_name;		/* Menu to activate */
-    Boolean inactive;		/* True if can't be selected */
-
-/* private resources. */
-
-    Boolean set_values_area_cleared; /* Remember if we need to unhighlight. */
-    GC norm_gc;			/* noral color gc. */
-    GC rev_gc;			/* reverse color gc. */
-    GC norm_gray_gc;		/* Normal color (grayed out) gc. */
-    GC invert_gc;		/* gc for flipping colors. */
-
-    Dimension left_bitmap_width; /* size of each bitmap. */
-    Dimension left_bitmap_height;
-    Dimension right_bitmap_width;
-    Dimension right_bitmap_height;
-
-    int ul_pos;                 /* Offset in chars of underlined character */
-                                /* in label */
-} SmeMenuButtonPart;
-
-/****************************************************************
- *
- * Full instance record declaration
- *
- ****************************************************************/
-
-typedef struct _SmeMenuButtonRec {
-  ObjectPart         object;
-  RectObjPart        rectangle;
-  SmePart	     sme;
-  SmeMenuButtonPart   sme_bsb;
-} SmeMenuButtonRec;
-
-/************************************************************
- *
- * Private declarations.
- *
- ************************************************************/
-
-#endif /* _XawSmeMenuButtP_h */
diff --git a/controls/SmeMenuButto.c b/controls/SmeMenuButto.c
deleted file mode 100644
index 5d426fc..0000000
--- a/controls/SmeMenuButto.c
+++ /dev/null
@@ -1,758 +0,0 @@
-/* $XConsortium: SmeMenuButton.c,v 1.16 91/03/15 15:59:41 gildea Exp $ */
-
-/*
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * 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, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  M.I.T. makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * 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.
- */
-
-/*
- * SmeMenuButton.c - Source code file for BSB Menu Entry object.
- *
- * Date:    September 26, 1989
- *
- * By:      Chris D. Peterson
- *          MIT X Consortium 
- *          kit@expo.lcs.mit.edu
- *
- * Modifications for Wine
- *
- * 8/23/93  David Metcalfe (david@prism.demon.co.uk)
- *          Added code to translate ampersand to underlined char
- */
-
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/Xos.h>
-
-#include <X11/Xmu/Drawing.h>
-
-#include <X11/Xaw/XawInit.h>
-#include <X11/Xaw/SimpleMenu.h>
-#include "SmeMenuButtP.h"
-#include <X11/Xaw/Cardinals.h>
-
-#include <stdio.h>
-
-#define ONE_HUNDRED 100
-
-#define offset(field) XtOffsetOf(SmeMenuButtonRec, sme_bsb.field)
-
-static XtResource resources[] = {
-  {XtNlabel,  XtCLabel, XtRString, sizeof(String),
-     offset(label), XtRString, NULL},
-  {XtNvertSpace,  XtCVertSpace, XtRInt, sizeof(int),
-     offset(vert_space), XtRImmediate, (XtPointer) 25},
-  {XtNleftBitmap, XtCLeftBitmap, XtRBitmap, sizeof(Pixmap),
-     offset(left_bitmap), XtRImmediate, (XtPointer)None},
-  {XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify),
-     offset(justify), XtRImmediate, (XtPointer) XtJustifyLeft},
-  {XtNrightBitmap, XtCRightBitmap, XtRBitmap, sizeof(Pixmap),
-     offset(right_bitmap), XtRImmediate, (XtPointer)None},
-  {XtNleftMargin,  XtCHorizontalMargins, XtRDimension, sizeof(Dimension),
-     offset(left_margin), XtRImmediate, (XtPointer) 15},
-  {XtNrightMargin,  XtCHorizontalMargins, XtRDimension, sizeof(Dimension),
-     offset(right_margin), XtRImmediate, (XtPointer) 5},
-  {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
-     offset(foreground), XtRString, XtDefaultForeground},
-  {XtNfont,  XtCFont, XtRFontStruct, sizeof(XFontStruct *),
-     offset(font), XtRString, XtDefaultFont},
-  {XtNmenuName, XtCMenuName, XtRString, sizeof(String), 
-    offset(menu_name), XtRString, (XtPointer) NULL},
-  {XtNinactive, XtCInactive, XtRBoolean, sizeof(Boolean),
-    offset(inactive), XtRImmediate, (XtPointer) FALSE },
-};   
-#undef offset
-
-/*
- * Semi Public function definitions. 
- */
-
-static void Redisplay(), Destroy(), Initialize(), FlipColors();
-static void ClassInitialize();
-static void PopupMenu(), Unhighlight();
-static Boolean SetValues();
-static XtGeometryResult QueryGeometry();
-
-/* 
- * Private Function Definitions.
- */
-
-static void GetDefaultSize(), DrawBitmaps(), GetBitmapInfo();
-static void CreateGCs(), DestroyGCs();
-static void RemoveAmpersand();
-    
-#define superclass (&smeClassRec)
-SmeMenuButtonClassRec smeMenuButtonClassRec = {
-  {
-    /* superclass         */    (WidgetClass) superclass,
-    /* class_name         */    "SmeMenuButton",
-    /* size               */    sizeof(SmeMenuButtonRec),
-    /* class_initializer  */	ClassInitialize,
-    /* class_part_initialize*/	NULL,
-    /* Class init'ed      */	FALSE,
-    /* initialize         */    Initialize,
-    /* initialize_hook    */	NULL,
-    /* realize            */    NULL,
-    /* actions            */    NULL,
-    /* num_actions        */    ZERO,
-    /* resources          */    resources,
-    /* resource_count     */	XtNumber(resources),
-    /* xrm_class          */    NULLQUARK,
-    /* compress_motion    */    FALSE, 
-    /* compress_exposure  */    FALSE,
-    /* compress_enterleave*/ 	FALSE,
-    /* visible_interest   */    FALSE,
-    /* destroy            */    Destroy,
-    /* resize             */    NULL,
-    /* expose             */    Redisplay,
-    /* set_values         */    SetValues,
-    /* 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	  */    QueryGeometry,
-    /* display_accelerator*/    NULL,
-    /* extension	  */    NULL
-  },{
-    /* Menu Entry Fields */
-      
-    /* highlight */             FlipColors,
-    /* unhighlight */           Unhighlight,
-    /* notify */		XtInheritNotify,		
-    /* extension	  */    NULL
-  }, {
-    /* BSB Menu entry Fields */  
-
-    /* extension	  */    NULL
-  }
-};
-
-WidgetClass smeMenuButtonObjectClass = (WidgetClass) &smeMenuButtonClassRec;
-
-/************************************************************
- *
- * Semi-Public Functions.
- *
- ************************************************************/
-
-/*	Function Name: ClassInitialize
- *	Description: Initializes the SmeMenuButtonObject. 
- *	Arguments: none.
- *	Returns: none.
- */
-
-static void 
-ClassInitialize()
-{
-    XawInitializeWidgetSet();
-    XtAddConverter( XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0 );
-}
-
-/*      Function Name: Initialize
- *      Description: Initializes the simple menu widget
- *      Arguments: request - the widget requested by the argument list.
- *                 new     - the new widget with both resource and non
- *                           resource values.
- *      Returns: none.
- */
-
-/* ARGSUSED */
-static void
-Initialize(request, new)
-Widget request, new;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) new;
-
-    if (entry->sme_bsb.label == NULL) 
-	entry->sme_bsb.label = XtName(new);
-    else
-	entry->sme_bsb.label = XtNewString( entry->sme_bsb.label );
-
-    RemoveAmpersand(new);
-
-    GetDefaultSize(new, &(entry->rectangle.width), &(entry->rectangle.height));
-    CreateGCs(new);
-
-    entry->sme_bsb.left_bitmap_width = entry->sme_bsb.left_bitmap_height = 0;
-    entry->sme_bsb.right_bitmap_width = entry->sme_bsb.right_bitmap_height = 0;
-
-    GetBitmapInfo(new, TRUE);	/* Left Bitmap Info */
-    GetBitmapInfo(new, FALSE);	/* Right Bitmap Info */
-}
-
-/*      Function Name: Destroy
- *      Description: Called at destroy time, cleans up.
- *      Arguments: w - the simple menu widget.
- *      Returns: none.
- */
-
-static void
-Destroy(w)
-Widget w;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
-    DestroyGCs(w);
-    if (entry->sme_bsb.label != XtName(w))
-	XtFree(entry->sme_bsb.label);
-}
-
-/*      Function Name: Redisplay
- *      Description: Redisplays the contents of the widget.
- *      Arguments: w - the simple menu widget.
- *                 event - the X event that caused this redisplay.
- *                 region - the region the needs to be repainted. 
- *      Returns: none.
- */
-
-/* ARGSUSED */
-static void
-Redisplay(w, event, region)
-Widget w;
-XEvent * event;
-Region region;
-{
-    GC gc;
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-    int	font_ascent, font_descent, y_loc;
-    int ul_x_loc, ul_y_loc, ul_width;
-
-    entry->sme_bsb.set_values_area_cleared = FALSE;    
-    font_ascent = entry->sme_bsb.font->max_bounds.ascent;
-    font_descent = entry->sme_bsb.font->max_bounds.descent;
-
-    y_loc = entry->rectangle.y;
-    
-    if (XtIsSensitive(w) && XtIsSensitive( XtParent(w) ) ) {
-	if ( w == XawSimpleMenuGetActiveEntry(XtParent(w)) ) {
-	    XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w), 
-			   entry->sme_bsb.norm_gc, 0, y_loc,
-			   (unsigned int) entry->rectangle.width,
-			   (unsigned int) entry->rectangle.height);
-	    gc = entry->sme_bsb.rev_gc;
-	}
-	else
-	    gc = entry->sme_bsb.norm_gc;
-    }
-    else
-	gc = entry->sme_bsb.norm_gray_gc;
-    
-    if (entry->sme_bsb.label != NULL) {
-	int x_loc = entry->sme_bsb.left_margin;
-	int len = strlen(entry->sme_bsb.label);
-	char * label = entry->sme_bsb.label;
-
-	switch(entry->sme_bsb.justify) {
-	    int width, t_width;
-
-	case XtJustifyCenter:
-	    t_width = XTextWidth(entry->sme_bsb.font, label, len);
-	    width = entry->rectangle.width - (entry->sme_bsb.left_margin +
-					      entry->sme_bsb.right_margin);
-	    x_loc += (width - t_width)/2;
-	    break;
-	case XtJustifyRight:
-	    t_width = XTextWidth(entry->sme_bsb.font, label, len);
-	    x_loc = entry->rectangle.width - (entry->sme_bsb.right_margin +
-					      t_width);
-	    break;
-	case XtJustifyLeft:
-	default:
-	    break;
-	}
-
-	y_loc += ((int)entry->rectangle.height - 
-		  (font_ascent + font_descent)) / 2 + font_ascent;
-	
-	XDrawString(XtDisplayOfObject(w), XtWindowOfObject(w), gc,
-		    x_loc, y_loc, label, len);
-
-	if (entry->sme_bsb.ul_pos != -1)
-	{
-	    ul_x_loc = x_loc + XTextWidth(entry->sme_bsb.font,
-		       entry->sme_bsb.label, entry->sme_bsb.ul_pos);
-	    ul_y_loc = entry->rectangle.y + (entry->rectangle.height + 
-		       font_ascent + font_descent) / 2;
-	    ul_width = XTextWidth(entry->sme_bsb.font,
-		       entry->sme_bsb.label + entry->sme_bsb.ul_pos, 1);
-
-	    XDrawLine(XtDisplayOfObject(w), XtWindowOfObject(w), gc,
-		      ul_x_loc, ul_y_loc, ul_x_loc + ul_width - 1, ul_y_loc);
-	}
-    }
-
-    DrawBitmaps(w, gc);
-}
-
-
-/*      Function Name: SetValues
- *      Description: Relayout the menu when one of the resources is changed.
- *      Arguments: current - current state of the widget.
- *                 request - what was requested.
- *                 new - what the widget will become.
- *      Returns: none
- */
-
-/* ARGSUSED */
-static Boolean
-SetValues(current, request, new)
-Widget current, request, new;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) new;
-    SmeMenuButtonObject old_entry = (SmeMenuButtonObject) current;
-    Boolean ret_val = FALSE;
-
-    if (old_entry->sme_bsb.label != entry->sme_bsb.label) {
-        if (old_entry->sme_bsb.label != XtName( new ) )
-	    XtFree( (char *) old_entry->sme_bsb.label );
-
-	if (entry->sme_bsb.label != XtName(new) ) 
-	    entry->sme_bsb.label = XtNewString( entry->sme_bsb.label );
-
-	RemoveAmpersand(new);
-	ret_val = True;
-    }
-
-    if (entry->rectangle.sensitive != old_entry->rectangle.sensitive )
-	ret_val = TRUE;
-
-    if (entry->sme_bsb.left_bitmap != old_entry->sme_bsb.left_bitmap) {
-	GetBitmapInfo(new, TRUE);
-	ret_val = TRUE;
-    }
-
-    if (entry->sme_bsb.right_bitmap != old_entry->sme_bsb.right_bitmap) {
-	GetBitmapInfo(new, FALSE);
-	ret_val = TRUE;
-    }
-
-    if ( (old_entry->sme_bsb.font != entry->sme_bsb.font) ||
-	 (old_entry->sme_bsb.foreground != entry->sme_bsb.foreground) ) {
-	DestroyGCs(current);
-	CreateGCs(new);
-	ret_val = TRUE;
-    }
-
-    if (ret_val) {
-	GetDefaultSize(new, 
-		       &(entry->rectangle.width), &(entry->rectangle.height));
-	entry->sme_bsb.set_values_area_cleared = TRUE;
-    }
-    return(ret_val);
-}
-
-/*	Function Name: QueryGeometry.
- *	Description: Returns the preferred geometry for this widget.
- *	Arguments: w - the menu entry object.
- *                 itended, return_val - the intended and return geometry info.
- *	Returns: A Geometry Result.
- *
- * See the Intrinsics manual for details on what this function is for.
- * 
- * I just return the height and width of the label plus the margins.
- */
-
-static XtGeometryResult
-QueryGeometry(w, intended, return_val) 
-Widget w;
-XtWidgetGeometry *intended, *return_val;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-    Dimension width, height;
-    XtGeometryResult ret_val = XtGeometryYes;
-    XtGeometryMask mode = intended->request_mode;
-
-    GetDefaultSize(w, &width, &height );    
-
-    if ( ((mode & CWWidth) && (intended->width != width)) ||
-	 !(mode & CWWidth) ) {
-	return_val->request_mode |= CWWidth;
-	return_val->width = width;
-	ret_val = XtGeometryAlmost;
-    }
-
-    if ( ((mode & CWHeight) && (intended->height != height)) ||
-	 !(mode & CWHeight) ) {
-	return_val->request_mode |= CWHeight;
-	return_val->height = height;
-	ret_val = XtGeometryAlmost;
-    }
-
-    if (ret_val == XtGeometryAlmost) {
-	mode = return_val->request_mode;
-	
-	if ( ((mode & CWWidth) && (width == entry->rectangle.width)) &&
-	     ((mode & CWHeight) && (height == entry->rectangle.height)) )
-	    return(XtGeometryNo);
-    }
-
-    return(ret_val);
-}
-    
-/*      Function Name: FlipColors
- *      Description: Invert the colors of the current entry.
- *      Arguments: w - the bsb menu entry widget.
- *      Returns: none.
- */
-
-static void 
-FlipColors(w)
-Widget w;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
-    if (entry->sme_bsb.set_values_area_cleared || entry->sme_bsb.inactive) 
-	return;
-
-    XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w),
-		   entry->sme_bsb.invert_gc, 0, (int) entry->rectangle.y,
-		   (unsigned int) entry->rectangle.width, 
-		   (unsigned int) entry->rectangle.height);
-}
-
-/************************************************************
- *
- * Private Functions.
- *
- ************************************************************/
-
-/*	Function Name: GetDefaultSize
- *	Description: Calculates the Default (preferred) size of
- *                   this menu entry.
- *	Arguments: w - the menu entry widget.
- *                 width, height - default sizes (RETURNED).
- *	Returns: none.
- */
-
-static void
-GetDefaultSize(w, width, height) 
-Widget w;
-Dimension * width, * height;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
-    if (entry->sme_bsb.label == NULL) 
-	*width = 0;
-    else
-	*width = XTextWidth(entry->sme_bsb.font, entry->sme_bsb.label,
-			    strlen(entry->sme_bsb.label));
-
-    *width += entry->sme_bsb.left_margin + entry->sme_bsb.right_margin;
-    
-    *height = (entry->sme_bsb.font->max_bounds.ascent +
-	       entry->sme_bsb.font->max_bounds.descent);
-
-    *height = ((int)*height * ( ONE_HUNDRED + 
-			        entry->sme_bsb.vert_space )) / ONE_HUNDRED;
-}
-
-/*      Function Name: DrawBitmaps
- *      Description: Draws left and right bitmaps.
- *      Arguments: w - the simple menu widget.
- *                 gc - graphics context to use for drawing.
- *      Returns: none
- */
-
-static void
-DrawBitmaps(w, gc)
-Widget w;
-GC gc;
-{
-    int x_loc, y_loc;
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-    
-    if ( (entry->sme_bsb.left_bitmap == None) && 
-	 (entry->sme_bsb.right_bitmap == None) ) return;
-
-/*
- * Draw Left Bitmap.
- */
-
-  if (entry->sme_bsb.left_bitmap != None) {
-    x_loc = (int)(entry->sme_bsb.left_margin -
-	          entry->sme_bsb.left_bitmap_width) / 2;
-
-    y_loc = entry->rectangle.y + (int)(entry->rectangle.height -
-				       entry->sme_bsb.left_bitmap_height) / 2;
-
-    XCopyPlane(XtDisplayOfObject(w), entry->sme_bsb.left_bitmap,
-	       XtWindowOfObject(w), gc, 0, 0, 
-	       entry->sme_bsb.left_bitmap_width,
-	       entry->sme_bsb.left_bitmap_height, x_loc, y_loc, 1);
-  }
-
-/*
- * Draw Right Bitmap.
- */
-
-
-  if (entry->sme_bsb.right_bitmap != None) {
-    x_loc = entry->rectangle.width -
-	      (int)(entry->sme_bsb.right_margin +
-		    entry->sme_bsb.right_bitmap_width) / 2;
-
-    y_loc = entry->rectangle.y + (int)(entry->rectangle.height -
-				       entry->sme_bsb.right_bitmap_height) / 2;
-
-    XCopyPlane(XtDisplayOfObject(w), entry->sme_bsb.right_bitmap,
-	       XtWindowOfObject(w), gc, 0, 0, 
-	       entry->sme_bsb.right_bitmap_width,
-	       entry->sme_bsb.right_bitmap_height, x_loc, y_loc, 1);
-  }
-}
-
-/*      Function Name: GetBitmapInfo
- *      Description: Gets the bitmap information from either of the bitmaps.
- *      Arguments: w - the bsb menu entry widget.
- *                 is_left - TRUE if we are testing left bitmap,
- *                           FALSE if we are testing the right bitmap.
- *      Returns: none
- */
-
-static void
-GetBitmapInfo(w, is_left)
-Widget w;
-Boolean is_left;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;    
-    unsigned int depth, bw;
-    Window root;
-    int x, y;
-    unsigned int width, height;
-    char buf[BUFSIZ];
-    
-    if (is_left) {
-	if (entry->sme_bsb.left_bitmap != None) {
-	    if (!XGetGeometry(XtDisplayOfObject(w), 
-			      entry->sme_bsb.left_bitmap, &root, 
-			      &x, &y, &width, &height, &bw, &depth)) {
-		sprintf(buf, "SmeMenuButton Object: %s %s \"%s\".", "Could not",
-			"get Left Bitmap geometry information for menu entry ",
-			XtName(w));
-		XtAppError(XtWidgetToApplicationContext(w), buf);
-	    }
-	    if (depth != 1) {
-		sprintf(buf, "SmeMenuButton Object: %s \"%s\"%s.", 
-			"Left Bitmap of entry ", 
-			XtName(w), " is not one bit deep.");
-		XtAppError(XtWidgetToApplicationContext(w), buf);
-	    }
-	    entry->sme_bsb.left_bitmap_width = (Dimension) width; 
-	    entry->sme_bsb.left_bitmap_height = (Dimension) height;
-	}
-    }
-    else if (entry->sme_bsb.right_bitmap != None) {
-	if (!XGetGeometry(XtDisplayOfObject(w),
-			  entry->sme_bsb.right_bitmap, &root,
-			  &x, &y, &width, &height, &bw, &depth)) {
-	    sprintf(buf, "SmeMenuButton Object: %s %s \"%s\".", "Could not",
-		    "get Right Bitmap geometry information for menu entry ",
-		    XtName(w));
-	    XtAppError(XtWidgetToApplicationContext(w), buf);
-	}
-	if (depth != 1) {
-	    sprintf(buf, "SmeMenuButton Object: %s \"%s\"%s.", 
-		    "Right Bitmap of entry ", XtName(w),
-		    " is not one bit deep.");
-	    XtAppError(XtWidgetToApplicationContext(w), buf);
-	}
-	entry->sme_bsb.right_bitmap_width = (Dimension) width; 
-	entry->sme_bsb.right_bitmap_height = (Dimension) height;
-    }
-}      
-
-/*      Function Name: CreateGCs
- *      Description: Creates all gc's for the simple menu widget.
- *      Arguments: w - the simple menu widget.
- *      Returns: none.
- */
-
-static void
-CreateGCs(w)
-Widget w;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;    
-    XGCValues values;
-    XtGCMask mask;
-    
-    values.foreground = XtParent(w)->core.background_pixel;
-    values.background = entry->sme_bsb.foreground;
-    values.font = entry->sme_bsb.font->fid;
-    values.graphics_exposures = FALSE;
-    mask        = GCForeground | GCBackground | GCFont | GCGraphicsExposures;
-    entry->sme_bsb.rev_gc = XtGetGC(w, mask, &values);
-    
-    values.foreground = entry->sme_bsb.foreground;
-    values.background = XtParent(w)->core.background_pixel;
-    entry->sme_bsb.norm_gc = XtGetGC(w, mask, &values);
-    
-    values.fill_style = FillTiled;
-    values.tile   = XmuCreateStippledPixmap(XtScreenOfObject(w), 
-					    entry->sme_bsb.foreground,
-					    XtParent(w)->core.background_pixel,
-					    XtParent(w)->core.depth);
-    values.graphics_exposures = FALSE;
-    mask |= GCTile | GCFillStyle;
-    entry->sme_bsb.norm_gray_gc = XtGetGC(w, mask, &values);
-    
-    values.foreground ^= values.background;
-    values.background = 0;
-    values.function = GXxor;
-    mask = GCForeground | GCBackground | GCGraphicsExposures | GCFunction;
-    entry->sme_bsb.invert_gc = XtGetGC(w, mask, &values);
-}
-
-/*      Function Name: DestroyGCs
- *      Description: Removes all gc's for the simple menu widget.
- *      Arguments: w - the simple menu widget.
- *      Returns: none.
- */
-
-static void
-DestroyGCs(w)
-Widget w;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;    
-
-    XtReleaseGC(w, entry->sme_bsb.norm_gc);
-    XtReleaseGC(w, entry->sme_bsb.norm_gray_gc);
-    XtReleaseGC(w, entry->sme_bsb.rev_gc);
-    XtReleaseGC(w, entry->sme_bsb.invert_gc);
-}
-
-static void
-PopupMenu(w)
-Widget w;
-{
-  SmeMenuButtonObject mbw = (SmeMenuButtonObject) w;
-  Widget menu, temp;
-  Arg arglist[2];
-  Cardinal num_args;
-  int menu_x, menu_y, menu_width, menu_height, button_width;
-  Position button_x, button_y;
-
-  if (mbw->sme_bsb.menu_name == NULL || strlen(mbw->sme_bsb.menu_name) == 0)
-      return;
-
-  temp = w;
-  while(temp != NULL) {
-    menu = XtNameToWidget(temp, mbw->sme_bsb.menu_name);
-    if (menu == NULL) 
-      temp = XtParent(temp);
-    else
-      break;
-  }
-
-  if (menu == NULL) {
-    char error_buf[BUFSIZ];
-    sprintf(error_buf, "MenuButton: %s %s.",
-	    "Could not find menu widget named", mbw->sme_bsb.menu_name);
-    XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
-    return;
-  }
-  if (!XtIsRealized(menu))
-    XtRealizeWidget(menu);
-  
-  menu_width = menu->core.width + 2 * menu->core.border_width;
-  button_width = mbw->rectangle.width + 2 * mbw->rectangle.border_width;
-  menu_height = menu->core.height + 2 * menu->core.border_width;
-
-  XtTranslateCoords(w, 0, 0, &button_x, &button_y);
-  menu_x = button_x + button_width;
-  menu_y = button_y;
-
-  if (menu_x >= 0) {
-    int scr_width = WidthOfScreen(XtScreen(menu));
-    if (menu_x + menu_width > scr_width)
-      menu_x = scr_width - menu_width;
-  }
-  if (menu_x < 0) 
-    menu_x = 0;
-
-  if (menu_y >= 0) {
-    int scr_height = HeightOfScreen(XtScreen(menu));
-    if (menu_y + menu_height > scr_height)
-      menu_y = scr_height - menu_height;
-  }
-  if (menu_y < 0)
-    menu_y = 0;
-
-  num_args = 0;
-  XtSetArg(arglist[num_args], XtNx, menu_x); num_args++;
-  XtSetArg(arglist[num_args], XtNy, menu_y); num_args++;
-  XtSetValues(menu, arglist, num_args);
-
-  XtPopupSpringLoaded(menu);
-}
-
-static void
-Unhighlight(w)
-Widget w;
-{
-    SmeMenuButtonObject mbw = (SmeMenuButtonObject) w;
-    Display  *display;
-    Screen   *screen;
-    Window   win, rootwin;
-    int      rootwin_x, rootwin_y;
-    int      win_x, win_y;
-    unsigned int mask;
-    Position left, right, top, bottom;
-
-    if (mbw->sme_bsb.inactive)
-	return;
-    
-    display = XtDisplayOfObject(w);
-    screen  = XtScreenOfObject(w);
-    XQueryPointer(display, RootWindowOfScreen(screen),
-                  &rootwin, &win, &rootwin_x, &rootwin_y,
-                  &win_x, &win_y, &mask);
-
-    XtTranslateCoords(w, 0, 0, &left, &top);
-    XtTranslateCoords(w, mbw->rectangle.width, mbw->rectangle.height, 
-		      &right, &bottom);
-
-    if (rootwin_x >= right && rootwin_y >= top && rootwin_y < bottom)
-    {
-	PopupMenu(w);
-    }
-
-    FlipColors(w);
-}
-
-static void
-RemoveAmpersand(w)
-Widget w;
-{
-    SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
-    entry->sme_bsb.ul_pos = strcspn(entry->sme_bsb.label, "&");
-    if (entry->sme_bsb.ul_pos == strlen(entry->sme_bsb.label))
-    {
-	entry->sme_bsb.ul_pos = -1;
-	return;
-    }
-
-    /* Remove ampersand from label */
-    strcpy(entry->sme_bsb.label + entry->sme_bsb.ul_pos,
-	   entry->sme_bsb.label + entry->sme_bsb.ul_pos + 1);
-}
-
diff --git a/controls/SmeMenuButto.h b/controls/SmeMenuButto.h
deleted file mode 100644
index 72c9a51..0000000
--- a/controls/SmeMenuButto.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * $XConsortium: SmeMenuButton.h,v 1.5 89/12/11 15:20:14 kit Exp $
- *
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * 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, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  M.I.T. makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * 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.
- */
-
-/*
- * SmeMenuButton.h - Public Header file for SmeMenuButton object.
- *
- * This is the public header file for the Athena BSB Sme object.
- * It is intended to be used with the simple menu widget.  This object
- * provides bitmap - string - bitmap style entries.
- *
- * Date:    April 3, 1989
- *
- * By:      Chris D. Peterson
- *          MIT X Consortium 
- *          kit@expo.lcs.mit.edu
- *
- * Modifications for Wine
- *
- * 8/23/93  David Metcalfe (david@prism.demon.co.uk)
- *          Added code to translate ampersand to underlined char
- */
-
-#ifndef _SmeMenuButto_h
-#define _SmeMenuButto_h
-
-#include <X11/Xmu/Converters.h>
-
-#include <X11/Xaw/Sme.h>
-
-/****************************************************************
- *
- * SmeMenuButton object
- *
- ****************************************************************/
-
-/* BSB Menu Entry Resources:
-
- Name		     Class		RepType		Default Value
- ----		     -----		-------		-------------
- callback            Callback           Callback        NULL
- destroyCallback     Callback		Pointer		NULL
- font                Font               XFontStruct *   XtDefaultFont
- foreground          Foreground         Pixel           XtDefaultForeground
- height		     Height		Dimension	0
- label               Label              String          Name of entry
- leftBitmap          LeftBitmap         Pixmap          None
- leftMargin          HorizontalMargins  Dimension       4
- rightBitmap         RightBitmap        Pixmap          None
- rightMargin         HorizontalMargins  Dimension       4
- sensitive	     Sensitive		Boolean		True
- vertSpace           VertSpace          int             25
- width		     Width		Dimension	0
- x		     Position		Position	0n
- y		     Position		Position	0
- menuName            MenuName           String          "menu"
- inactive	     Inactive		Boolean		False
-
-*/
-
-typedef struct _SmeMenuButtonClassRec    *SmeMenuButtonObjectClass;
-typedef struct _SmeMenuButtonRec         *SmeMenuButtonObject;
-
-extern WidgetClass smeMenuButtonObjectClass;
-
-#define XtNleftBitmap "leftBitmap"
-#define XtNleftMargin "leftMargin"
-#define XtNrightBitmap "rightBitmap"
-#define XtNrightMargin "rightMargin"
-#define XtNvertSpace   "vertSpace"
-#define XtNmenuName "menuName"
-#define XtNinactive "inactive"
-
-#define XtCLeftBitmap "LeftBitmap"
-#define XtCHorizontalMargins "HorizontalMargins"
-#define XtCRightBitmap "RightBitmap"
-#define XtCVertSpace   "VertSpace"
-#define XtCMenuName "MenuName"
-#define XtCInactive "Inactive"
-
-#endif /* _SmeMenuButto_h */
diff --git a/controls/WinCommand.c b/controls/WinCommand.c
deleted file mode 100644
index e05da8e..0000000
--- a/controls/WinCommand.c
+++ /dev/null
@@ -1,567 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, 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 names of Digital or MIT 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.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinCommand
- */
-
-/*
- * WinCommand.c - WinCommand button widget
- */
-
-#include <stdio.h>
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/Xmu/Misc.h>
-#include <X11/Xaw/XawInit.h>
-#include "WinCommandP.h"
-#include <X11/Xmu/Converters.h>
-
-#define DEFAULT_HIGHLIGHT_THICKNESS 2
-#define DEFAULT_SHAPE_HIGHLIGHT 32767
-
-/****************************************************************
- *
- * Full class record constant
- *
- ****************************************************************/
-
-/* Private Data */
-
-static char defaultTranslations[] =
-    "<EnterWindow>:	highlight()		\n\
-     <LeaveWindow>:	reset()			\n\
-     <Btn1Down>:	set()			\n\
-     <Btn1Up>:		notify() unset()	";
-
-#define offset(field) XtOffsetOf(WinCommandRec, field)
-static XtResource resources[] = { 
-   {XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer), 
-      offset(wincommand.callbacks), XtRCallback, (XtPointer)NULL},
-   {XtNhighlightThickness, XtCThickness, XtRDimension, sizeof(Dimension),
-      offset(wincommand.highlight_thickness), XtRImmediate,
-      (XtPointer) DEFAULT_SHAPE_HIGHLIGHT},
-   {XtNshapeStyle, XtCShapeStyle, XtRShapeStyle, sizeof(int),
-      offset(wincommand.shape_style), XtRImmediate, 
-	    (XtPointer)XawShapeRectangle},
-   {XtNcornerRoundPercent, XtCCornerRoundPercent, 
-	XtRDimension, sizeof(Dimension),
-	offset(wincommand.corner_round), XtRImmediate, (XtPointer) 25},
-};
-#undef offset
-
-static Boolean SetValues();
-static void Initialize(), Redisplay(), Set(), Reset(), Notify(), Unset();
-static void Highlight(), Unhighlight(), Destroy(), PaintWinCommandWidget();
-static void ClassInitialize();
-static Boolean ShapeButton();
-static void Realize(), Resize();
-
-static XtActionsRec actionsList[] = {
-  {"set",		Set},
-  {"notify",		Notify},
-  {"highlight",		Highlight},
-  {"reset",		Reset},
-  {"unset",		Unset},
-  {"unhighlight",	Unhighlight}
-};
-
-#define SuperClass ((WinLabelWidgetClass)&winLabelClassRec)
-
-WinCommandClassRec winCommandClassRec = {
-  {
-    (WidgetClass) SuperClass,		/* superclass		  */	
-    "WinCommand",			/* class_name		  */
-    sizeof(WinCommandRec),		/* size			  */
-    ClassInitialize,			/* class_initialize	  */
-    NULL,				/* class_part_initialize  */
-    FALSE,				/* class_inited		  */
-    Initialize,				/* initialize		  */
-    NULL,				/* initialize_hook	  */
-    Realize,				/* realize		  */
-    actionsList,			/* actions		  */
-    XtNumber(actionsList),		/* num_actions		  */
-    resources,				/* resources		  */
-    XtNumber(resources),		/* resource_count	  */
-    NULLQUARK,				/* xrm_class		  */
-    FALSE,				/* compress_motion	  */
-    TRUE,				/* compress_exposure	  */
-    TRUE,				/* compress_enterleave    */
-    FALSE,				/* visible_interest	  */
-    Destroy,				/* destroy		  */
-    Resize,				/* resize		  */
-    Redisplay,				/* expose		  */
-    SetValues,				/* set_values		  */
-    NULL,				/* set_values_hook	  */
-    XtInheritSetValuesAlmost,		/* set_values_almost	  */
-    NULL,				/* get_values_hook	  */
-    NULL,				/* accept_focus		  */
-    XtVersion,				/* version		  */
-    NULL,				/* callback_private	  */
-    defaultTranslations,		/* tm_table		  */
-    XtInheritQueryGeometry,		/* query_geometry	  */
-    XtInheritDisplayAccelerator,	/* display_accelerator	  */
-    NULL				/* extension		  */
-  },  /* CoreClass fields initialization */
-  {
-    XtInheritChangeSensitive		/* change_sensitive	*/
-  },  /* SimpleClass fields initialization */
-  {
-    0,                                     /* field not used    */
-  },  /* WinLabelClass fields initialization */
-  {
-    0,                                     /* field not used    */
-  },  /* WinCommandClass fields initialization */
-};
-
-  /* for public consumption */
-WidgetClass winCommandWidgetClass = (WidgetClass) &winCommandClassRec;
-
-/****************************************************************
- *
- * Private Procedures
- *
- ****************************************************************/
-
-static GC 
-Get_GC(cbw, fg, bg)
-WinCommandWidget cbw;
-Pixel fg, bg;
-{
-  XGCValues	values;
-  
-  values.foreground   = fg;
-  values.background	= bg;
-  values.font		= cbw->winlabel.font->fid;
-  values.cap_style = CapProjecting;
-  
-  if (cbw->wincommand.highlight_thickness > 1 )
-    values.line_width   = cbw->wincommand.highlight_thickness;
-  else 
-    values.line_width   = 0;
-  
-  return XtGetGC((Widget)cbw,
-		 (GCForeground|GCBackground|GCFont|GCLineWidth|GCCapStyle),
-		 &values);
-}
-
-
-/* ARGSUSED */
-static void 
-Initialize(request, new, args, num_args)
-Widget request, new;
-ArgList args;			/* unused */
-Cardinal *num_args;		/* unused */
-{
-  WinCommandWidget cbw = (WinCommandWidget) new;
-  int shape_event_base, shape_error_base;
-
-  if (cbw->wincommand.shape_style != XawShapeRectangle
-      && !XShapeQueryExtension(XtDisplay(new), &shape_event_base, 
-			       &shape_error_base))
-      cbw->wincommand.shape_style = XawShapeRectangle;
-  if (cbw->wincommand.highlight_thickness == DEFAULT_SHAPE_HIGHLIGHT) {
-      if (cbw->wincommand.shape_style != XawShapeRectangle)
-	  cbw->wincommand.highlight_thickness = 0;
-      else
-	  cbw->wincommand.highlight_thickness = DEFAULT_HIGHLIGHT_THICKNESS;
-  }
-
-  cbw->wincommand.normal_GC = Get_GC(cbw, cbw->winlabel.foreground, 
-				  cbw->core.background_pixel);
-  cbw->wincommand.inverse_GC = Get_GC(cbw, cbw->core.background_pixel, 
-				   cbw->winlabel.foreground);
-  XtReleaseGC(new, cbw->winlabel.normal_GC);
-  cbw->winlabel.normal_GC = cbw->wincommand.normal_GC;
-
-  cbw->wincommand.set = FALSE;
-  cbw->wincommand.highlighted = HighlightNone;
-}
-
-static Region 
-HighlightRegion(cbw)
-WinCommandWidget cbw;
-{
-  static Region outerRegion = NULL, innerRegion, emptyRegion;
-  XRectangle rect;
-
-  if (cbw->wincommand.highlight_thickness == 0 ||
-      cbw->wincommand.highlight_thickness >
-      (Dimension) ((Dimension) Min(cbw->core.width, cbw->core.height)/2))
-    return(NULL);
-
-  if (outerRegion == NULL) {
-    /* save time by allocating scratch regions only once. */
-    outerRegion = XCreateRegion();
-    innerRegion = XCreateRegion();
-    emptyRegion = XCreateRegion();
-  }
-
-  rect.x = rect.y = 0;
-  rect.width = cbw->core.width;
-  rect.height = cbw->core.height;
-  XUnionRectWithRegion( &rect, emptyRegion, outerRegion );
-  rect.x = rect.y = cbw->wincommand.highlight_thickness;
-  rect.width -= cbw->wincommand.highlight_thickness * 2;
-  rect.height -= cbw->wincommand.highlight_thickness * 2;
-  XUnionRectWithRegion( &rect, emptyRegion, innerRegion );
-  XSubtractRegion( outerRegion, innerRegion, outerRegion );
-  return outerRegion;
-}
-
-/***************************
-*
-*  Action Procedures
-*
-***************************/
-
-/* ARGSUSED */
-static void 
-Set(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params;		/* unused */
-Cardinal *num_params;	/* unused */
-{
-  WinCommandWidget cbw = (WinCommandWidget)w;
-
-  if (cbw->wincommand.set)
-    return;
-
-  cbw->wincommand.set= TRUE;
-  if (XtIsRealized(w))
-    PaintWinCommandWidget(w, (Region) NULL, TRUE);
-}
-
-/* ARGSUSED */
-static void
-Unset(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params;		/* unused */
-Cardinal *num_params;
-{
-  WinCommandWidget cbw = (WinCommandWidget)w;
-
-  if (!cbw->wincommand.set)
-    return;
-
-  cbw->wincommand.set = FALSE;
-  if (XtIsRealized(w)) {
-    XClearWindow(XtDisplay(w), XtWindow(w));
-    PaintWinCommandWidget(w, (Region) NULL, TRUE);
-  }
-}
-
-/* ARGSUSED */
-static void 
-Reset(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params;		/* unused */
-Cardinal *num_params;   /* unused */
-{
-  WinCommandWidget cbw = (WinCommandWidget)w;
-
-  if (cbw->wincommand.set) {
-    cbw->wincommand.highlighted = HighlightNone;
-    Unset(w, event, params, num_params);
-  }
-  else
-    Unhighlight(w, event, params, num_params);
-}
-
-/* ARGSUSED */
-static void 
-Highlight(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params;		
-Cardinal *num_params;	
-{
-  WinCommandWidget cbw = (WinCommandWidget)w;
-
-  if ( *num_params == (Cardinal) 0) 
-    cbw->wincommand.highlighted = HighlightWhenUnset;
-  else {
-    if ( *num_params != (Cardinal) 1) 
-      XtWarning("Too many parameters passed to highlight action table.");
-    switch (params[0][0]) {
-    case 'A':
-    case 'a':
-      cbw->wincommand.highlighted = HighlightAlways;
-      break;
-    default:
-      cbw->wincommand.highlighted = HighlightWhenUnset;
-      break;
-    }
-  }
-
-  if (XtIsRealized(w))
-    PaintWinCommandWidget(w, HighlightRegion(cbw), TRUE);
-}
-
-/* ARGSUSED */
-static void 
-Unhighlight(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params;		/* unused */
-Cardinal *num_params;	/* unused */
-{
-  WinCommandWidget cbw = (WinCommandWidget)w;
-
-  cbw->wincommand.highlighted = HighlightNone;
-  if (XtIsRealized(w))
-    PaintWinCommandWidget(w, HighlightRegion(cbw), TRUE);
-}
-
-/* ARGSUSED */
-static void 
-Notify(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params;		/* unused */
-Cardinal *num_params;	/* unused */
-{
-  WinCommandWidget cbw = (WinCommandWidget)w; 
-
-  /* check to be sure state is still Set so that user can cancel
-     the action (e.g. by moving outside the window, in the default
-     bindings.
-  */
-  if (cbw->wincommand.set)
-    XtCallCallbackList(w, cbw->wincommand.callbacks, NULL);
-}
-
-/*
- * Repaint the widget window
- */
-
-/************************
-*
-*  REDISPLAY (DRAW)
-*
-************************/
-
-/* ARGSUSED */
-static void 
-Redisplay(w, event, region)
-Widget w;
-XEvent *event;
-Region region;
-{
-  PaintWinCommandWidget(w, region, FALSE);
-}
-
-/*	Function Name: PaintWinCommandWidget
- *	Description: Paints the wincommand widget.
- *	Arguments: w - the wincommand widget.
- *                 region - region to paint (passed to the superclass).
- *                 change - did it change either set or highlight state?
- *	Returns: none
- */
-
-static void 
-PaintWinCommandWidget(w, region, change)
-Widget w;
-Region region;
-Boolean change;
-{
-  WinCommandWidget cbw = (WinCommandWidget) w;
-  Boolean very_thick;
-  GC norm_gc, rev_gc;
-   
-  very_thick = cbw->wincommand.highlight_thickness >
-               (Dimension)((Dimension) Min(cbw->core.width, 
-					   cbw->core.height)/2);
-
-  if (cbw->wincommand.set) {
-    cbw->winlabel.normal_GC = cbw->wincommand.inverse_GC;
-    XFillRectangle(XtDisplay(w), XtWindow(w), cbw->wincommand.normal_GC,
-		   0, 0, cbw->core.width, cbw->core.height);
-    region = NULL;		/* Force label to repaint text. */
-  }
-  else
-      cbw->winlabel.normal_GC = cbw->wincommand.normal_GC;
-
-  if (cbw->wincommand.highlight_thickness <= 0)
-  {
-    (*SuperClass->core_class.expose) (w, (XEvent *) NULL, region);
-    return;
-  }
-
-/*
- * If we are set then use the same colors as if we are not highlighted. 
- */
-
-  if (cbw->wincommand.set == (cbw->wincommand.highlighted == HighlightNone)) {
-    norm_gc = cbw->wincommand.inverse_GC;
-    rev_gc = cbw->wincommand.normal_GC;
-  }
-  else {
-    norm_gc = cbw->wincommand.normal_GC;
-    rev_gc = cbw->wincommand.inverse_GC;
-  }
-
-  if ( !( (!change && (cbw->wincommand.highlighted == HighlightNone)) ||
-	  ((cbw->wincommand.highlighted == HighlightWhenUnset) &&
-	   (cbw->wincommand.set))) ) {
-    if (very_thick) {
-      cbw->winlabel.normal_GC = norm_gc; /* Give the label the right GC. */
-      XFillRectangle(XtDisplay(w),XtWindow(w), rev_gc,
-		     0, 0, cbw->core.width, cbw->core.height);
-    }
-    else {
-      /* wide lines are centered on the path, so indent it */
-      int offset = cbw->wincommand.highlight_thickness/2;
-      XDrawRectangle(XtDisplay(w),XtWindow(w), rev_gc, offset, offset, 
-		     cbw->core.width - cbw->wincommand.highlight_thickness,
-		     cbw->core.height - cbw->wincommand.highlight_thickness);
-    }
-  }
-  (*SuperClass->core_class.expose) (w, (XEvent *) NULL, region);
-}
-
-static void 
-Destroy(w)
-Widget w;
-{
-  WinCommandWidget cbw = (WinCommandWidget) w;
-
-  /* so WinLabel can release it */
-  if (cbw->winlabel.normal_GC == cbw->wincommand.normal_GC)
-    XtReleaseGC( w, cbw->wincommand.inverse_GC );
-  else
-    XtReleaseGC( w, cbw->wincommand.normal_GC );
-}
-
-/*
- * Set specified arguments into widget
- */
-
-/* ARGSUSED */
-static Boolean 
-SetValues (current, request, new)
-Widget current, request, new;
-{
-  WinCommandWidget oldcbw = (WinCommandWidget) current;
-  WinCommandWidget cbw = (WinCommandWidget) new;
-  Boolean redisplay = False;
-
-  if ( oldcbw->core.sensitive != cbw->core.sensitive && !cbw->core.sensitive) {
-    /* about to become insensitive */
-    cbw->wincommand.set = FALSE;
-    cbw->wincommand.highlighted = HighlightNone;
-    redisplay = TRUE;
-  }
-  
-  if ( (oldcbw->winlabel.foreground != cbw->winlabel.foreground)           ||
-       (oldcbw->core.background_pixel != cbw->core.background_pixel) ||
-       (oldcbw->wincommand.highlight_thickness != 
-                                   cbw->wincommand.highlight_thickness) ||
-       (oldcbw->winlabel.font != cbw->winlabel.font) ) 
-  {
-    if (oldcbw->winlabel.normal_GC == oldcbw->wincommand.normal_GC)
-	/* WinLabel has release one of these */
-      XtReleaseGC(new, cbw->wincommand.inverse_GC);
-    else
-      XtReleaseGC(new, cbw->wincommand.normal_GC);
-
-    cbw->wincommand.normal_GC = Get_GC(cbw, cbw->winlabel.foreground, 
-				    cbw->core.background_pixel);
-    cbw->wincommand.inverse_GC = Get_GC(cbw, cbw->core.background_pixel, 
-				     cbw->winlabel.foreground);
-    XtReleaseGC(new, cbw->winlabel.normal_GC);
-    cbw->winlabel.normal_GC = (cbw->wincommand.set
-			    ? cbw->wincommand.inverse_GC
-			    : cbw->wincommand.normal_GC);
-    
-    redisplay = True;
-  }
-
-  if ( XtIsRealized(new)
-       && oldcbw->wincommand.shape_style != cbw->wincommand.shape_style
-       && !ShapeButton(cbw, TRUE))
-  {
-      cbw->wincommand.shape_style = oldcbw->wincommand.shape_style;
-  }
-
-  return (redisplay);
-}
-
-static void ClassInitialize()
-{
-    XawInitializeWidgetSet();
-    XtSetTypeConverter( XtRString, XtRShapeStyle, XmuCvtStringToShapeStyle,
-		        NULL, 0, XtCacheNone, NULL );
-}
-
-
-static Boolean
-ShapeButton(cbw, checkRectangular)
-WinCommandWidget cbw;
-Boolean checkRectangular;
-{
-    Dimension corner_size;
-
-    if ( (cbw->wincommand.shape_style == XawShapeRoundedRectangle) ) {
-	corner_size = (cbw->core.width < cbw->core.height) ? cbw->core.width 
-	                                                   : cbw->core.height;
-	corner_size = (int) (corner_size * cbw->wincommand.corner_round) / 100;
-    }
-
-    if (checkRectangular || cbw->wincommand.shape_style != XawShapeRectangle) {
-	if (!XmuReshapeWidget((Widget) cbw, cbw->wincommand.shape_style,
-			      corner_size, corner_size)) {
-	    cbw->wincommand.shape_style = XawShapeRectangle;
-	    return(False);
-	}
-    }
-    return(TRUE);
-}
-
-static void Realize(w, valueMask, attributes)
-    Widget w;
-    Mask *valueMask;
-    XSetWindowAttributes *attributes;
-{
-    (*winCommandWidgetClass->core_class.superclass->core_class.realize)
-	(w, valueMask, attributes);
-
-    ShapeButton( (WinCommandWidget) w, FALSE);
-}
-
-static void Resize(w)
-    Widget w;
-{
-    if (XtIsRealized(w)) 
-	ShapeButton( (WinCommandWidget) w, FALSE);
-
-    (*winCommandWidgetClass->core_class.superclass->core_class.resize)(w);
-}
-
diff --git a/controls/WinCommand.h b/controls/WinCommand.h
deleted file mode 100644
index 0b69e06..0000000
--- a/controls/WinCommand.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, 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 names of Digital or MIT 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.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinCommand
- */
-
-#ifndef _WinCommand_h
-#define _WinCommand_h
-
-#include "WinLabel.h"
-
-/* Command widget resources:
-
- Name		     Class		RepType		Default Value
- ----		     -----		-------		-------------
- accelerators	     Accelerators	AcceleratorTable NULL
- ancestorSensitive   AncestorSensitive	Boolean		True
- background	     Background		Pixel		XtDefaultBackground
- backgroundPixmap    Pixmap		Pixmap		XtUnspecifiedPixmap
- bitmap		     Pixmap		Pixmap		None
- borderColor	     BorderColor	Pixel		XtDefaultForeground
- borderPixmap	     Pixmap		Pixmap		XtUnspecifiedPixmap
- borderWidth	     BorderWidth	Dimension	1
- callback	     Callback		XtCallbackList	NULL
- colormap	     Colormap		Colormap	parent's colormap
- cornerRoundPercent  CornerRoundPercent	Dimension	25
- cursor		     Cursor		Cursor		None
- cursorName	     Cursor		String		NULL
- depth		     Depth		int		parent's depth
- destroyCallback     Callback		XtCallbackList	NULL
- encoding	     Encoding		UnsignedChar	XawTextEncoding8bit
- font		     Font		XFontStruct*	XtDefaultFont
- foreground	     Foreground		Pixel		XtDefaultForeground
- height		     Height		Dimension	text height
- highlightThickness  Thickness		Dimension	0 if shaped, else 2
- insensitiveBorder   Insensitive	Pixmap		Gray
- internalHeight	     Height		Dimension	2
- internalWidth	     Width		Dimension	4
- justify	     Justify		XtJustify	XtJustifyCenter
- label		     Label		String		NULL
- leftBitmap	     LeftBitmap		Pixmap		None
- mappedWhenManaged   MappedWhenManaged	Boolean		True
- pointerColor	     Foreground		Pixel		XtDefaultForeground
- pointerColorBackground Background	Pixel		XtDefaultBackground
- resize		     Resize		Boolean		True
- screen		     Screen		Screen		parent's Screen
- sensitive	     Sensitive		Boolean		True
- shapeStyle	     ShapeStyle		ShapeStyle	Rectangle
- translations	     Translations	TranslationTable see doc or source
- width		     Width		Dimension	text width
- x		     Position		Position	0
- y		     Position		Position	0
-
-*/
-
-#define XtNhighlightThickness "highlightThickness"
-
-#define XtNshapeStyle "shapeStyle"
-#define XtCShapeStyle "ShapeStyle"
-#define XtRShapeStyle "ShapeStyle"
-#define XtNcornerRoundPercent "cornerRoundPercent"
-#define XtCCornerRoundPercent "CornerRoundPercent"
-
-#define XawShapeRectangle XmuShapeRectangle
-#define XawShapeOval XmuShapeOval
-#define XawShapeEllipse XmuShapeEllipse
-#define XawShapeRoundedRectangle XmuShapeRoundedRectangle
-
-extern WidgetClass     winCommandWidgetClass;
-
-typedef struct _WinCommandClassRec   *WinCommandWidgetClass;
-typedef struct _WinCommandRec        *WinCommandWidget;
-
-#endif /* _WinCommand_h */
-/* DON'T ADD STUFF AFTER THIS */
diff --git a/controls/WinCommandP.h b/controls/WinCommandP.h
deleted file mode 100644
index 5f79931..0000000
--- a/controls/WinCommandP.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, 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 names of Digital or MIT 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.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Convrted to WinCommand
- */
-
-/* 
- * WinCommandP.h - Private definitions for WinCommand widget
- * 
- */
-
-#ifndef _WinCommandP_h
-#define _WinCommandP_h
-
-#include "WinCommand.h"
-#include "WinLabelP.h"
-
-/***********************************************************************
- *
- * WinCommand Widget Private Data
- *
- ***********************************************************************/
-
-typedef enum {
-  HighlightNone,		/* Do not highlight. */
-  HighlightWhenUnset,		/* Highlight only when unset, this is
-				   to preserve current command widget 
-				   functionality. */
-  HighlightAlways		/* Always highlight, lets the toggle widget
-				   and other subclasses do the right thing. */
-} XtCommandHighlight;
-
-/************************************
- *
- *  Class structure
- *
- ***********************************/
-
-
-   /* New fields for the WinCommand widget class record */
-typedef struct _WinCommandClass 
-  {
-    int makes_compiler_happy;  /* not used */
-  } WinCommandClassPart;
-
-   /* Full class record declaration */
-typedef struct _WinCommandClassRec {
-    CoreClassPart	core_class;
-    SimpleClassPart	simple_class;
-    WinLabelClassPart	winlabel_class;
-    WinCommandClassPart wincommand_class;
-} WinCommandClassRec;
-
-extern WinCommandClassRec winCommandClassRec;
-
-/***************************************
- *
- *  Instance (widget) structure 
- *
- **************************************/
-
-    /* New fields for the WinCommand widget record */
-typedef struct {
-    /* resources */
-    Dimension   highlight_thickness;
-    XtCallbackList callbacks;
-
-    /* private state */
-    Pixmap      	gray_pixmap;
-    GC          	normal_GC;
-    GC          	inverse_GC;
-    Boolean     	set;
-    XtCommandHighlight	highlighted;
-    /* more resources */
-    int			shape_style;    
-    Dimension		corner_round;
-} WinCommandPart;
-
-
-/*    XtEventsPtr eventTable;*/
-
-
-   /* Full widget declaration */
-typedef struct _WinCommandRec {
-    CorePart         core;
-    SimplePart	     simple;
-    WinLabelPart     winlabel;
-    WinCommandPart   wincommand;
-} WinCommandRec;
-
-#endif /* _WinCommandP_h */
-
-
diff --git a/controls/WinLabel.c b/controls/WinLabel.c
deleted file mode 100644
index f079ed7..0000000
--- a/controls/WinLabel.c
+++ /dev/null
@@ -1,691 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, 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 names of Digital or MIT 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.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/23/93  David Metcalfe (david@prism.demon.co.uk)
- *          Added code to translate ampersand to underlined char
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinLabel
- */
-
-/*
- * WinLabel.c - WinLabel widget
- *
- */
-
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/Xos.h>
-#include <X11/Xaw/XawInit.h>
-#include "WinLabelP.h"
-#include <X11/Xmu/Converters.h>
-#include <X11/Xmu/Drawing.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#define streq(a,b) (strcmp( (a), (b) ) == 0)
-
-#define MULTI_LINE_LABEL 32767
-
-#ifdef CRAY
-#define WORD64
-#endif
-
-/****************************************************************
- *
- * Full class record constant
- *
- ****************************************************************/
-
-/* Private Data */
-
-#define offset(field) XtOffsetOf(WinLabelRec, field)
-static XtResource resources[] = {
-    {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
-        offset(winlabel.foreground), XtRString, XtDefaultForeground},
-    {XtNfont,  XtCFont, XtRFontStruct, sizeof(XFontStruct *),
-        offset(winlabel.font),XtRString, XtDefaultFont},
-    {XtNlabel,  XtCLabel, XtRString, sizeof(String),
-        offset(winlabel.label), XtRString, NULL},
-    {XtNencoding, XtCEncoding, XtRUnsignedChar, sizeof(unsigned char),
-        offset(winlabel.encoding), XtRImmediate, 
-	                             (XtPointer)XawTextEncoding8bit},
-    {XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify),
-	offset(winlabel.justify), XtRImmediate, (XtPointer)XtJustifyCenter},
-    {XtNinternalWidth, XtCWidth, XtRDimension,  sizeof(Dimension),
-	offset(winlabel.internal_width), XtRImmediate, (XtPointer)4},
-    {XtNinternalHeight, XtCHeight, XtRDimension, sizeof(Dimension),
-	offset(winlabel.internal_height), XtRImmediate, (XtPointer)4},
-    {XtNleftBitmap, XtCLeftBitmap, XtRBitmap, sizeof(Pixmap),
-       offset(winlabel.left_bitmap), XtRImmediate, (XtPointer) None},
-    {XtNbitmap, XtCPixmap, XtRBitmap, sizeof(Pixmap),
-	offset(winlabel.pixmap), XtRImmediate, (XtPointer)None},
-    {XtNresize, XtCResize, XtRBoolean, sizeof(Boolean),
-	offset(winlabel.resize), XtRImmediate, (XtPointer)True},
-};
-#undef offset
-
-static void Initialize();
-static void Resize();
-static void Redisplay();
-static Boolean SetValues();
-static void ClassInitialize();
-static void Destroy();
-static XtGeometryResult QueryGeometry();
-
-WinLabelClassRec winLabelClassRec = {
-  {
-/* core_class fields */	
-#define superclass		(&simpleClassRec)
-    /* superclass	  	*/	(WidgetClass) superclass,
-    /* class_name	  	*/	"WinLabel",
-    /* widget_size	  	*/	sizeof(WinLabelRec),
-    /* class_initialize   	*/	ClassInitialize,
-    /* class_part_initialize	*/	NULL,
-    /* class_inited       	*/	FALSE,
-    /* initialize	  	*/	Initialize,
-    /* initialize_hook		*/	NULL,
-    /* realize		  	*/	XtInheritRealize,
-    /* actions		  	*/	NULL,
-    /* num_actions	  	*/	0,
-    /* resources	  	*/	resources,
-    /* num_resources	  	*/	XtNumber(resources),
-    /* xrm_class	  	*/	NULLQUARK,
-    /* compress_motion	  	*/	TRUE,
-    /* compress_exposure  	*/	TRUE,
-    /* compress_enterleave	*/	TRUE,
-    /* visible_interest	  	*/	FALSE,
-    /* destroy		  	*/	Destroy,
-    /* resize		  	*/	Resize,
-    /* expose		  	*/	Redisplay,
-    /* set_values	  	*/	SetValues,
-    /* set_values_hook		*/	NULL,
-    /* set_values_almost	*/	XtInheritSetValuesAlmost,
-    /* get_values_hook		*/	NULL,
-    /* accept_focus	 	*/	NULL,
-    /* version			*/	XtVersion,
-    /* callback_private   	*/	NULL,
-    /* tm_table		   	*/	NULL,
-    /* query_geometry		*/	QueryGeometry,
-    /* display_accelerator	*/	XtInheritDisplayAccelerator,
-    /* extension		*/	NULL
-  },
-/* Simple class fields initialization */
-  {
-    /* change_sensitive		*/	XtInheritChangeSensitive
-  }
-};
-WidgetClass winLabelWidgetClass = (WidgetClass)&winLabelClassRec;
-/****************************************************************
- *
- * Private Procedures
- *
- ****************************************************************/
-
-static void ClassInitialize()
-{
-    XawInitializeWidgetSet();
-    XtAddConverter( XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0 );
-}
-
-#ifndef WORD64
-
-#define TXT16 XChar2b
-
-#else
-
-#define TXT16 char
-
-static XChar2b *buf2b;
-static int buf2blen = 0;
-
-_WinLabelWidth16(fs, str, n)
-    XFontStruct *fs;
-    char *str;
-    int	n;
-{
-    int i;
-    XChar2b *ptr;
-
-    if (n > buf2blen) {
-	buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
-	buf2blen = n;
-    }
-    for (ptr = buf2b, i = n; --i >= 0; ptr++) {
-	ptr->byte1 = *str++;
-	ptr->byte2 = *str++;
-    }
-    return XTextWidth16(fs, buf2b, n);
-}
-
-_WinLabelDraw16(dpy, d, gc, x, y, str, n)
-    Display *dpy;
-    Drawable d;
-    GC gc;
-    int x, y;
-    char *str;
-    int n;
-{
-    int i;
-    XChar2b *ptr;
-
-    if (n > buf2blen) {
-	buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
-	buf2blen = n;
-    }
-    for (ptr = buf2b, i = n; --i >= 0; ptr++) {
-	ptr->byte1 = *str++;
-	ptr->byte2 = *str++;
-    }
-    XDrawString16(dpy, d, gc, x, y, buf2b, n);
-}
-
-#define XTextWidth16 _WinLabelWidth16
-#define XDrawString16 _WinLabelDraw16
-
-#endif /* WORD64 */
-
-/*
- * Calculate width and height of displayed text in pixels
- */
-
-static void SetTextWidthAndHeight(lw)
-    WinLabelWidget lw;
-{
-    register XFontStruct	*fs = lw->winlabel.font;
-    char *nl;
-
-    if (lw->winlabel.pixmap != None) {
-	Window root;
-	int x, y;
-	unsigned int width, height, bw, depth;
-	if (XGetGeometry(XtDisplay(lw), lw->winlabel.pixmap, &root, &x, &y,
-			 &width, &height, &bw, &depth)) {
-	    lw->winlabel.label_height = height;
-	    lw->winlabel.label_width = width;
-	    lw->winlabel.label_len = depth;
-	    return;
-	}
-    }
-
-    lw->winlabel.label_height = fs->max_bounds.ascent + fs->max_bounds.descent;
-    if (lw->winlabel.label == NULL) {
-	lw->winlabel.label_len = 0;
-	lw->winlabel.label_width = 0;
-    }
-    else if ((nl = index(lw->winlabel.label, '\n')) != NULL) {
-	char *label;
-	lw->winlabel.label_len = MULTI_LINE_LABEL;
-	lw->winlabel.label_width = 0;
-	for (label = lw->winlabel.label; nl != NULL; nl = index(label, '\n')) {
-	    int width;
-
-	    if (lw->winlabel.encoding)
-		width = XTextWidth16(fs, (TXT16*)label, (int)(nl - label)/2);
-	    else
-		width = XTextWidth(fs, label, (int)(nl - label));
-	    if (width > (int)lw->winlabel.label_width)
-		lw->winlabel.label_width = width;
-	    label = nl + 1;
-	    if (*label)
-		lw->winlabel.label_height +=
-		    fs->max_bounds.ascent + fs->max_bounds.descent;
-	}
-	if (*label) {
-	    int width = XTextWidth(fs, label, strlen(label));
-
-	    if (lw->winlabel.encoding)
-		width = XTextWidth16(fs, (TXT16*)label, (int)strlen(label)/2);
-	    else
-		width = XTextWidth(fs, label, strlen(label));
-	    if (width > (int) lw->winlabel.label_width)
-		lw->winlabel.label_width = width;
-	}
-    } else {
-	lw->winlabel.label_len = strlen(lw->winlabel.label);
-	if (lw->winlabel.encoding)
-	    lw->winlabel.label_width =
-		XTextWidth16(fs, (TXT16*)lw->winlabel.label,
-			     (int) lw->winlabel.label_len/2);
-	else
-	    lw->winlabel.label_width =
-		XTextWidth(fs, lw->winlabel.label, 
-			   (int) lw->winlabel.label_len);
-    }
-}
-
-static void GetnormalGC(lw)
-    WinLabelWidget lw;
-{
-    XGCValues	values;
-
-    values.foreground	= lw->winlabel.foreground;
-    values.background	= lw->core.background_pixel;
-    values.font		= lw->winlabel.font->fid;
-    values.graphics_exposures = False;
-
-    lw->winlabel.normal_GC = XtGetGC(
-	(Widget)lw,
-	(unsigned) GCForeground | GCBackground | GCFont | GCGraphicsExposures,
-	&values);
-}
-
-static void GetgrayGC(lw)
-    WinLabelWidget lw;
-{
-    XGCValues	values;
-
-    values.foreground = lw->winlabel.foreground;
-    values.background = lw->core.background_pixel;
-    values.font	      = lw->winlabel.font->fid;
-    values.fill_style = FillTiled;
-    values.tile       = XmuCreateStippledPixmap(XtScreen((Widget)lw),
-						lw->winlabel.foreground, 
-						lw->core.background_pixel,
-						lw->core.depth);
-    values.graphics_exposures = False;
-
-    lw->winlabel.stipple = values.tile;
-    lw->winlabel.gray_GC = XtGetGC((Widget)lw, 
-				(unsigned) GCForeground | GCBackground |
-					   GCFont | GCTile | GCFillStyle |
-					   GCGraphicsExposures,
-				&values);
-}
-
-static void compute_bitmap_offsets (lw)
-    WinLabelWidget lw;
-{
-    /*
-     * label will be displayed at (internal_width, internal_height + lbm_y)
-     */
-    if (lw->winlabel.lbm_height != 0) {
-	lw->winlabel.lbm_y = (((int) lw->core.height) -
-			   ((int) lw->winlabel.internal_height * 2) -
-			   ((int) lw->winlabel.lbm_height)) / 2;
-    } else {
-	lw->winlabel.lbm_y = 0;
-    }
-}
-
-
-static void set_bitmap_info (lw)
-    WinLabelWidget lw;
-{
-    Window root;
-    int x, y;
-    unsigned int bw, depth;
-
-    if (!(lw->winlabel.left_bitmap &&
-	  XGetGeometry (XtDisplay(lw), lw->winlabel.left_bitmap, &root, &x, &y,
-			&lw->winlabel.lbm_width, &lw->winlabel.lbm_height,
-			&bw, &depth))) {
-	lw->winlabel.lbm_width = lw->winlabel.lbm_height = 0;
-    }
-    compute_bitmap_offsets (lw);
-}
-
-static void
-RemoveAmpersand(w)
-Widget w;
-{
-    WinLabelWidget lw = (WinLabelWidget) w;
-
-    lw->winlabel.ul_pos = strcspn(lw->winlabel.label, "&");
-    if (lw->winlabel.ul_pos == strlen(lw->winlabel.label))
-    {
-	lw->winlabel.ul_pos = -1;
-	return;
-    }
-
-    /* Remove ampersand from label */
-    strcpy(lw->winlabel.label + lw->winlabel.ul_pos,
-	   lw->winlabel.label + lw->winlabel.ul_pos + 1);
-}
-
-
-
-/* ARGSUSED */
-static void Initialize(request, new)
- Widget request, new;
-{
-    WinLabelWidget lw = (WinLabelWidget) new;
-
-    if (lw->winlabel.label == NULL) 
-        lw->winlabel.label = XtNewString(lw->core.name);
-    else {
-        lw->winlabel.label = XtNewString(lw->winlabel.label);
-    }
-
-    RemoveAmpersand(new);
-
-    GetnormalGC(lw);
-    GetgrayGC(lw);
-
-    SetTextWidthAndHeight(lw);
-
-    if (lw->core.height == 0)
-        lw->core.height = lw->winlabel.label_height + 
-		          2*lw->winlabel.internal_height;
-
-    set_bitmap_info (lw);		/* need core.height */
-
-    if (lw->core.width == 0)		/* need winlabel.lbm_width */
-        lw->core.width = (lw->winlabel.label_width + 
-			  2 * lw->winlabel.internal_width
-			  + LEFT_OFFSET(lw));
-
-    lw->winlabel.label_x = lw->winlabel.label_y = 0;
-    (*XtClass(new)->core_class.resize) ((Widget)lw);
-
-} /* Initialize */
-
-/*
- * Repaint the widget window
- */
-
-/* ARGSUSED */
-static void Redisplay(w, event, region)
-    Widget w;
-    XEvent *event;
-    Region region;
-{
-   WinLabelWidget lw = (WinLabelWidget) w;
-   GC gc;
-   int ul_x_loc, ul_y_loc, ul_width;
-
-   if (region != NULL) {
-       int x = lw->winlabel.label_x;
-       unsigned int width = lw->winlabel.label_width;
-       if (lw->winlabel.lbm_width) {
-	   if (lw->winlabel.label_x > (x = lw->winlabel.internal_width))
-	       width += lw->winlabel.label_x - x;
-       }
-       if (XRectInRegion(region, x, lw->winlabel.label_y,
-			 width, lw->winlabel.label_height) == RectangleOut)
-	   return;
-   }
-
-   gc = XtIsSensitive((Widget)lw) ? lw->winlabel.normal_GC 
-	                          : lw->winlabel.gray_GC;
-#ifdef notdef
-   if (region != NULL) XSetRegion(XtDisplay(w), gc, region);
-#endif /*notdef*/
-   if (lw->winlabel.pixmap == None) {
-       int len = lw->winlabel.label_len;
-       char *label = lw->winlabel.label;
-       Position y = lw->winlabel.label_y + 
-	            lw->winlabel.font->max_bounds.ascent;
-
-       /* display left bitmap */
-       if (lw->winlabel.left_bitmap && lw->winlabel.lbm_width != 0) {
-	   XCopyPlane (XtDisplay(w), lw->winlabel.left_bitmap, XtWindow(w), gc,
-		       0, 0, lw->winlabel.lbm_width, lw->winlabel.lbm_height,
-		       (int) lw->winlabel.internal_width, 
-		       (int) lw->winlabel.internal_height + 
-		       lw->winlabel.lbm_y, 
-		       (unsigned long) 1L);
-       }
-
-       if (len == MULTI_LINE_LABEL) {
-	   char *nl;
-	   while ((nl = index(label, '\n')) != NULL) {
-	       if (lw->winlabel.encoding)
-		   XDrawString16(XtDisplay(w), XtWindow(w), gc,
-				 lw->winlabel.label_x, y,
-				 (TXT16*)label, (int)(nl - label)/2);
-	       else
-		   XDrawString(XtDisplay(w), XtWindow(w), gc,
-			       lw->winlabel.label_x, y, label, 
-			       (int)(nl - label));
-	       y += lw->winlabel.font->max_bounds.ascent + 
-		               lw->winlabel.font->max_bounds.descent;
-	       label = nl + 1;
-	   }
-	   len = strlen(label);
-       }
-       if (len) {
-	   if (lw->winlabel.encoding)
-	       XDrawString16(XtDisplay(w), XtWindow(w), gc,
-			     lw->winlabel.label_x, y, (TXT16*)label, len/2);
-	   else
-	       XDrawString(XtDisplay(w), XtWindow(w), gc,
-			   lw->winlabel.label_x, y, label, len);
-
-	   if (lw->winlabel.ul_pos != -1)
-	   {
-	       /* Don't bother with two byte chars at present */
-	       if (!lw->winlabel.encoding)
-	       {
-	           ul_x_loc = lw->winlabel.label_x + 
-			      XTextWidth(lw->winlabel.font,
-		              lw->winlabel.label, lw->winlabel.ul_pos);
-	           ul_y_loc = lw->winlabel.label_height + 
-		              lw->winlabel.internal_height + 1;
-	           ul_width = XTextWidth(lw->winlabel.font,
-		              lw->winlabel.label + lw->winlabel.ul_pos, 1);
-
-	           XDrawLine(XtDisplayOfObject(w), XtWindowOfObject(w), gc,
-		        ul_x_loc, ul_y_loc, ul_x_loc + ul_width - 1, ul_y_loc);
-	       }
-           }
-       }
-   } else if (lw->winlabel.label_len == 1) { /* depth */
-       XCopyPlane(XtDisplay(w), lw->winlabel.pixmap, XtWindow(w), gc,
-		  0, 0, lw->winlabel.label_width, lw->winlabel.label_height,
-		  lw->winlabel.label_x, lw->winlabel.label_y, 1L);
-   } else {
-       XCopyArea(XtDisplay(w), lw->winlabel.pixmap, XtWindow(w), gc,
-		 0, 0, lw->winlabel.label_width, lw->winlabel.label_height,
-		 lw->winlabel.label_x, lw->winlabel.label_y);
-   }
-#ifdef notdef
-   if (region != NULL) XSetClipMask(XtDisplay(w), gc, (Pixmap)None);
-#endif /* notdef */
-}
-
-static void _Reposition(lw, width, height, dx, dy)
-    register WinLabelWidget lw;
-    Dimension width, height;
-    Position *dx, *dy;
-{
-    Position newPos;
-    Position leftedge = lw->winlabel.internal_width + LEFT_OFFSET(lw);
-
-    switch (lw->winlabel.justify) {
-
-	case XtJustifyLeft   :
-	    newPos = leftedge;
-	    break;
-
-	case XtJustifyRight  :
-	    newPos = width -
-		(lw->winlabel.label_width + lw->winlabel.internal_width);
-	    break;
-
-	case XtJustifyCenter :
-	default:
-	    newPos = (int)(width - lw->winlabel.label_width) / 2;
-	    break;
-    }
-    if (newPos < (Position)leftedge)
-	newPos = leftedge;
-    *dx = newPos - lw->winlabel.label_x;
-    lw->winlabel.label_x = newPos;
-    *dy = (newPos = (int)(height - lw->winlabel.label_height) / 2)
-	  - lw->winlabel.label_y;
-    lw->winlabel.label_y = newPos;
-    return;
-}
-
-static void Resize(w)
-    Widget w;
-{
-    WinLabelWidget lw = (WinLabelWidget)w;
-    Position dx, dy;
-    _Reposition(lw, w->core.width, w->core.height, &dx, &dy);
-    compute_bitmap_offsets (lw);
-}
-
-/*
- * Set specified arguments into widget
- */
-
-#define PIXMAP 0
-#define WIDTH 1
-#define HEIGHT 2
-#define NUM_CHECKS 3
-
-static Boolean SetValues(current, request, new, args, num_args)
-    Widget current, request, new;
-    ArgList args;
-    Cardinal *num_args;
-{
-    WinLabelWidget curlw = (WinLabelWidget) current;
-    WinLabelWidget reqlw = (WinLabelWidget) request;
-    WinLabelWidget newlw = (WinLabelWidget) new;
-    int i;
-    Boolean was_resized = False, redisplay = False, checks[NUM_CHECKS];
-
-    for (i = 0; i < NUM_CHECKS; i++)
-	checks[i] = FALSE;
-
-    for (i = 0; i < *num_args; i++) {
-	if (streq(XtNbitmap, args[i].name))
-	    checks[PIXMAP] = TRUE;
-	if (streq(XtNwidth, args[i].name))
-	    checks[WIDTH] = TRUE;
-	if (streq(XtNheight, args[i].name))
-	    checks[HEIGHT] = TRUE;
-    }
-
-    if (newlw->winlabel.label == NULL) {
-	newlw->winlabel.label = newlw->core.name;
-    }
-
-    /*
-     * resize on bitmap change
-     */
-    if (curlw->winlabel.left_bitmap != newlw->winlabel.left_bitmap) {
-	was_resized = True;
-    }
-
-    if (curlw->winlabel.encoding != newlw->winlabel.encoding)
-	was_resized = True;
-
-    if (curlw->winlabel.label != newlw->winlabel.label) {
-        if (curlw->winlabel.label != curlw->core.name)
-	    XtFree( (char *)curlw->winlabel.label );
-
-	if (newlw->winlabel.label != newlw->core.name) {
-	    newlw->winlabel.label = XtNewString( newlw->winlabel.label );
-	}
-	RemoveAmpersand(new);
-	was_resized = True;
-    }
-
-    if (was_resized || (curlw->winlabel.font != newlw->winlabel.font) ||
-	(curlw->winlabel.justify != newlw->winlabel.justify) 
-	|| checks[PIXMAP]) {
-
-	SetTextWidthAndHeight(newlw);
-	was_resized = True;
-    }
-
-    /* recalculate the window size if something has changed. */
-    if (newlw->winlabel.resize && was_resized) {
-	if ((curlw->core.height == reqlw->core.height) && !checks[HEIGHT])
-	    newlw->core.height = (newlw->winlabel.label_height + 
-				  2 * newlw->winlabel.internal_height);
-
-	set_bitmap_info (newlw);
-
-	if ((curlw->core.width == reqlw->core.width) && !checks[WIDTH])
-	    newlw->core.width = (newlw->winlabel.label_width +
-				 LEFT_OFFSET(newlw) +
-				 2 * newlw->winlabel.internal_width);
-    }
-
-    if (curlw->winlabel.foreground != newlw->winlabel.foreground
-	|| curlw->core.background_pixel != newlw->core.background_pixel
-	|| curlw->winlabel.font->fid != newlw->winlabel.font->fid) {
-
-	XtReleaseGC(new, curlw->winlabel.normal_GC);
-	XtReleaseGC(new, curlw->winlabel.gray_GC);
-	XmuReleaseStippledPixmap( XtScreen(current), curlw->winlabel.stipple );
-	GetnormalGC(newlw);
-	GetgrayGC(newlw);
-	redisplay = True;
-    }
-
-    if ((curlw->winlabel.internal_width != newlw->winlabel.internal_width)
-        || (curlw->winlabel.internal_height != newlw->winlabel.internal_height)
-	|| was_resized) {
-	/* Resize() will be called if geometry changes succeed */
-	Position dx, dy;
-	_Reposition(newlw, curlw->core.width, curlw->core.height, &dx, &dy);
-    }
-
-    return was_resized || redisplay ||
-	   XtIsSensitive(current) != XtIsSensitive(new);
-}
-
-static void Destroy(w)
-    Widget w;
-{
-    WinLabelWidget lw = (WinLabelWidget)w;
-
-    XtFree( lw->winlabel.label );
-    XtReleaseGC( w, lw->winlabel.normal_GC );
-    XtReleaseGC( w, lw->winlabel.gray_GC);
-    XmuReleaseStippledPixmap( XtScreen(w), lw->winlabel.stipple );
-}
-
-
-static XtGeometryResult QueryGeometry(w, intended, preferred)
-    Widget w;
-    XtWidgetGeometry *intended, *preferred;
-{
-    register WinLabelWidget lw = (WinLabelWidget)w;
-
-    preferred->request_mode = CWWidth | CWHeight;
-    preferred->width = (lw->winlabel.label_width + 
-			2 * lw->winlabel.internal_width +
-			LEFT_OFFSET(lw));
-    preferred->height = lw->winlabel.label_height + 
-	                2*lw->winlabel.internal_height;
-    if (  ((intended->request_mode & (CWWidth | CWHeight))
-	   	== (CWWidth | CWHeight)) &&
-	  intended->width == preferred->width &&
-	  intended->height == preferred->height)
-	return XtGeometryYes;
-    else if (preferred->width == w->core.width &&
-	     preferred->height == w->core.height)
-	return XtGeometryNo;
-    else
-	return XtGeometryAlmost;
-}
diff --git a/controls/WinLabel.h b/controls/WinLabel.h
deleted file mode 100644
index de285da..0000000
--- a/controls/WinLabel.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, 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 names of Digital or MIT 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.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/23/93  David Metcalfe (david@prism.demon.co.uk)
- *          Added code to translate ampersand to underlined char
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinLabel
- */
-
-#ifndef _WinLabel_h
-#define _WinLabel_h
-
-/***********************************************************************
- *
- * WinLabel Widget
- *
- ***********************************************************************/
-
-#include <X11/Xaw/Simple.h>
-
-/* Resources:
-
- Name		     Class		RepType		Default Value
- ----		     -----		-------		-------------
- background	     Background		Pixel		XtDefaultBackground
- bitmap		     Pixmap		Pixmap		None
- border		     BorderColor	Pixel		XtDefaultForeground
- borderWidth	     BorderWidth	Dimension	1
- cursor		     Cursor		Cursor		None
- cursorName	     Cursor		String		NULL
- destroyCallback     Callback		XtCallbackList	NULL
- encoding	     Encoding		unsigned char	XawTextEncoding8bit
- font		     Font		XFontStruct*	XtDefaultFont
- foreground	     Foreground		Pixel		XtDefaultForeground
- height		     Height		Dimension	text height
- insensitiveBorder   Insensitive	Pixmap		Gray
- internalHeight	     Height		Dimension	2
- internalWidth	     Width		Dimension	4
- justify	     Justify		XtJustify	XtJustifyCenter
- label		     Label		String		NULL
- leftBitmap	     LeftBitmap		Pixmap		None
- mappedWhenManaged   MappedWhenManaged	Boolean		True
- pointerColor	     Foreground		Pixel		XtDefaultForeground
- pointerColorBackground Background	Pixel		XtDefaultBackground
- resize		     Resize		Boolean		True
- sensitive	     Sensitive		Boolean		True
- width		     Width		Dimension	text width
- x		     Position		Position	0
- y		     Position		Position	0
-
-*/
-
-#define XawTextEncoding8bit 0
-#define XawTextEncodingChar2b 1
-
-#define XtNleftBitmap "leftBitmap"
-#define XtCLeftBitmap "LeftBitmap"
-#define XtNencoding "encoding"
-#define XtCEncoding "Encoding"
-
-#ifndef _XtStringDefs_h_
-#define XtNbitmap "bitmap"
-#define XtNforeground "foreground"
-#define XtNlabel "label"
-#define XtNfont "font"
-#define XtNinternalWidth "internalWidth"
-#define XtNinternalHeight "internalHeight"
-#define XtNresize "resize"
-#define XtCResize "Resize"
-#define XtCBitmap "Bitmap"
-#endif
-
-/* Class record constants */
-
-extern WidgetClass winLabelWidgetClass;
-
-typedef struct _WinLabelClassRec *WinLabelWidgetClass;
-typedef struct _WinLabelRec      *WinLabelWidget;
-
-#endif /* _WinLabel_h */
-/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/controls/WinLabelP.h b/controls/WinLabelP.h
deleted file mode 100644
index f84c2b7..0000000
--- a/controls/WinLabelP.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, 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 names of Digital or MIT 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.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/23/93  David Metcalfe (david@prism.demon.co.uk)
- *          Added code to translate ampersand to underlined char
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinLabel
- */
-
-/* 
- * WinLabelP.h - Private definitions for WinLabel widget
- * 
- */
-
-#ifndef _WinLabelP_h
-#define _WinLabelP_h
-
-/***********************************************************************
- *
- * WinLabel Widget Private Data
- *
- ***********************************************************************/
-
-#include "WinLabel.h"
-#include <X11/Xaw/SimpleP.h>
-
-/* New fields for the WinLabel widget class record */
-
-typedef struct {int foo;} WinLabelClassPart;
-
-/* Full class record declaration */
-typedef struct _WinLabelClassRec {
-    CoreClassPart	core_class;
-    SimpleClassPart	simple_class;
-    WinLabelClassPart	winlabel_class;
-} WinLabelClassRec;
-
-extern WinLabelClassRec winLabelClassRec;
-
-/* New fields for the WinLabel widget record */
-typedef struct {
-    /* resources */
-    Pixel	foreground;
-    XFontStruct	*font;
-    char	*label;
-    XtJustify	justify;
-    Dimension	internal_width;
-    Dimension	internal_height;
-    Pixmap	pixmap;
-    Boolean	resize;
-    unsigned char encoding;
-    Pixmap	left_bitmap;
-
-    /* private state */
-    GC		normal_GC;
-    GC          gray_GC;
-    Pixmap	stipple;
-    Position	label_x;
-    Position	label_y;
-    Dimension	label_width;
-    Dimension	label_height;
-    Dimension	label_len;
-    int		lbm_y;			/* where in label */
-    unsigned int lbm_width, lbm_height;	 /* size of pixmap */
-
-    int ul_pos;                 /* Offset in chars of underlined character */
-                                /* in label */
-} WinLabelPart;
-
-
-/****************************************************************
- *
- * Full instance record declaration
- *
- ****************************************************************/
-
-typedef struct _WinLabelRec {
-    CorePart	core;
-    SimplePart	simple;
-    WinLabelPart winlabel;
-} WinLabelRec;
-
-#define LEFT_OFFSET(lw) ((lw)->winlabel.left_bitmap \
-			 ? (lw)->winlabel.lbm_width + \
-			 (lw)->winlabel.internal_width \
-			 : 0)
-
-#endif /* _WinLabelP_h */
-
diff --git a/controls/WinMenuButtP.h b/controls/WinMenuButtP.h
deleted file mode 100644
index e5d45b1..0000000
--- a/controls/WinMenuButtP.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  M.I.T. makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * 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.
- */
-
-/*
- * Modifications for Wine
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinMenuButton
- */
-
-/***********************************************************************
- *
- * WinMenuButton Widget
- *
- ***********************************************************************/
-
-/*
- * WinMenuButtP.h - Private Header file for WinMenuButton widget.
- *
- * This is the private header file for the WinMenuButton widget.
- * It is intended to provide an easy method of activating pulldown menus.
- *
- * Date:    May 2, 1989
- *
- * By:      Chris D. Peterson
- *          MIT X Consortium 
- *          kit@expo.lcs.mit.edu
- */
-
-#ifndef _WinMenuButtonP_h
-#define _WinMenuButtonP_h
-
-#include "WinMenuButto.h"
-#include "WinCommandP.h"
-
-/************************************
- *
- *  Class structure
- *
- ***********************************/
-
-
-   /* New fields for the WinMenuButton widget class record */
-typedef struct _WinMenuButtonClass 
-{
-  int makes_compiler_happy;  /* not used */
-} WinMenuButtonClassPart;
-
-   /* Full class record declaration */
-typedef struct _WinMenuButtonClassRec {
-	CoreClassPart	    core_class;
-  SimpleClassPart	    simple_class;
-  WinLabelClassPart	    winLabel_class;
-  WinCommandClassPart	    winCommand_class;
-  WinMenuButtonClassPart    winMenuButton_class;
-} WinMenuButtonClassRec;
-
-extern WinMenuButtonClassRec winMenuButtonClassRec;
-
-/***************************************
- *
- *  Instance (widget) structure 
- *
- **************************************/
-
-    /* New fields for the WinMenuButton widget record */
-typedef struct {
-  /* resources */
-  String menu_name;
-
-} WinMenuButtonPart;
-
-   /* Full widget declaration */
-typedef struct _WinMenuButtonRec {
-    CorePart         core;
-    SimplePart	     simple;
-    WinLabelPart     winlabel;
-    WinCommandPart   wincommand;
-    WinMenuButtonPart winmenu_button;
-} WinMenuButtonRec;
-
-#endif /* _WinMenuButtonP_h */
-
-
diff --git a/controls/WinMenuButto.c b/controls/WinMenuButto.c
deleted file mode 100644
index 71508e0..0000000
--- a/controls/WinMenuButto.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * 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, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  M.I.T. makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * 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.
- *
- */
-
-/*
- * Modifications for Wine
- *
- * 8/27/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinMenuButton
- */
-
-/***********************************************************************
- *
- * WinMenuButton Widget
- *
- ***********************************************************************/
-
-/*
- * WinMenuButto.c - Source code for WinMenuButton widget.
- *
- * This is the source code for the WinMenuButton widget.
- * It is intended to provide an easy method of activating pulldown menus.
- *
- * Date:    May 2, 1989
- *
- * By:      Chris D. Peterson
- *          MIT X Consortium 
- *          kit@expo.lcs.mit.edu
- */
-
-#include <stdio.h>
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-
-#include <X11/Xaw/XawInit.h>
-#include "WinMenuButtP.h"
-
-static void ClassInitialize();
-static void PopupMenu();
-
-#define superclass ((WinCommandWidgetClass)&winCommandClassRec)
-
-static char defaultTranslations[] = 
-    "<EnterWindow>:     highlight()             \n\
-     <LeaveWindow>:     reset()                 \n\
-     <BtnDown>:         reset() PopupMenu()     ";
-
-/****************************************************************
- *
- * Full class record constant
- *
- ****************************************************************/
-
-/* Private Data */
-
-#define offset(field) XtOffsetOf(WinMenuButtonRec, field)
-static XtResource resources[] = {
-  {
-    XtNmenuName, XtCMenuName, XtRString, sizeof(String), 
-    offset(winmenu_button.menu_name), XtRString, (XtPointer)"menu"},
-};
-#undef offset
-
-static XtActionsRec actionsList[] =
-{
-  {"PopupMenu",	PopupMenu}
-};
-
-WinMenuButtonClassRec winMenuButtonClassRec = {
-  {
-    (WidgetClass) superclass,		/* superclass		  */	
-    "WinMenuButton",			/* class_name		  */
-    sizeof(WinMenuButtonRec),       	/* size			  */
-    ClassInitialize,			/* class_initialize	  */
-    NULL,				/* class_part_initialize  */
-    FALSE,				/* class_inited		  */
-    NULL,				/* initialize		  */
-    NULL,				/* initialize_hook	  */
-    XtInheritRealize,			/* realize		  */
-    actionsList,			/* actions		  */
-    XtNumber(actionsList),		/* num_actions		  */
-    resources,				/* resources		  */
-    XtNumber(resources),		/* resource_count	  */
-    NULLQUARK,				/* xrm_class		  */
-    FALSE,				/* compress_motion	  */
-    TRUE,				/* compress_exposure	  */
-    TRUE,				/* compress_enterleave    */
-    FALSE,				/* visible_interest	  */
-    NULL,				/* destroy		  */
-    XtInheritResize,			/* resize		  */
-    XtInheritExpose,			/* expose		  */
-    NULL,				/* set_values		  */
-    NULL,				/* set_values_hook	  */
-    XtInheritSetValuesAlmost,		/* set_values_almost	  */
-    NULL,				/* get_values_hook	  */
-    NULL,				/* accept_focus		  */
-    XtVersion,				/* version		  */
-    NULL,				/* callback_private	  */
-    defaultTranslations,               	/* tm_table		  */
-    XtInheritQueryGeometry,		/* query_geometry	  */
-    XtInheritDisplayAccelerator,	/* display_accelerator	  */
-    NULL				/* extension		  */
-  },  /* CoreClass fields initialization */
-  {
-    XtInheritChangeSensitive		/* change_sensitive	  */ 
-  },  /* SimpleClass fields initialization */
-  {
-    0,                                     /* field not used    */
-  },  /* WinLabelClass fields initialization */
-  {
-    0,                                     /* field not used    */
-  },  /* WinCommandClass fields initialization */
-  {
-    0,                                     /* field not used    */
-  },  /* WinMenuButtonClass fields initialization */
-};
-
-  /* for public consumption */
-WidgetClass winMenuButtonWidgetClass = (WidgetClass) &winMenuButtonClassRec;
-
-/****************************************************************
- *
- * Private Procedures
- *
- ****************************************************************/
-
-static void ClassInitialize()
-{
-    XawInitializeWidgetSet();
-    XtRegisterGrabAction(PopupMenu, True, ButtonPressMask | ButtonReleaseMask,
-			 GrabModeAsync, GrabModeAsync);
-}
-
-/* ARGSUSED */
-static void
-PopupMenu(w, event, params, num_params)
-Widget w;
-XEvent * event;
-String * params;
-Cardinal * num_params;
-{
-  WinMenuButtonWidget mbw = (WinMenuButtonWidget) w;
-  Widget menu, temp;
-  Arg arglist[2];
-  Cardinal num_args;
-  int menu_x, menu_y, menu_width, menu_height, button_height;
-  Position button_x, button_y;
-
-  temp = w;
-  while(temp != NULL) {
-    menu = XtNameToWidget(temp, mbw->winmenu_button.menu_name);
-    if (menu == NULL) 
-      temp = XtParent(temp);
-    else
-      break;
-  }
-
-  if (menu == NULL) {
-    char error_buf[BUFSIZ];
-    sprintf(error_buf, "MenuButton: %s %s.",
-	    "Could not find menu widget named", mbw->winmenu_button.menu_name);
-    XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
-    return;
-  }
-  if (!XtIsRealized(menu))
-    XtRealizeWidget(menu);
-  
-  menu_width = menu->core.width + 2 * menu->core.border_width;
-  button_height = w->core.height + 2 * w->core.border_width;
-  menu_height = menu->core.height + 2 * menu->core.border_width;
-
-  XtTranslateCoords(w, 0, 0, &button_x, &button_y);
-  menu_x = button_x;
-  menu_y = button_y + button_height;
-
-  if (menu_x >= 0) {
-    int scr_width = WidthOfScreen(XtScreen(menu));
-    if (menu_x + menu_width > scr_width)
-      menu_x = scr_width - menu_width;
-  }
-  if (menu_x < 0) 
-    menu_x = 0;
-
-  if (menu_y >= 0) {
-    int scr_height = HeightOfScreen(XtScreen(menu));
-    if (menu_y + menu_height > scr_height)
-      menu_y = scr_height - menu_height;
-  }
-  if (menu_y < 0)
-    menu_y = 0;
-
-  num_args = 0;
-  XtSetArg(arglist[num_args], XtNx, menu_x); num_args++;
-  XtSetArg(arglist[num_args], XtNy, menu_y); num_args++;
-  XtSetValues(menu, arglist, num_args);
-
-  XtPopupSpringLoaded(menu);
-}
-
diff --git a/controls/WinMenuButto.h b/controls/WinMenuButto.h
deleted file mode 100644
index 3dcb3f3..0000000
--- a/controls/WinMenuButto.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * 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, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  M.I.T. makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * 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.
- */
-
-/*
- * Modifications for Wine
- *
- * 8/23/93  David Metcalfe (david@prism.demon.co.uk)
- *          Converted to WinMenuButton
- */
-
-/***********************************************************************
- *
- * WinMenuButton Widget
- *
- ***********************************************************************/
-
-/*
- * WinMenuButton.h - Public Header file for WinMenuButton widget.
- *
- * This is the public header file for the WinMenuButton widget.
- * It is intended to provide an easy method of activating pulldown menus.
- *
- * Date:    May 2, 1989
- *
- * By:      Chris D. Peterson
- *          MIT X Consortium 
- *          kit@expo.lcs.mit.edu
- */
-
-#ifndef _WinMenuButton_h
-#define _WinMenuButton_h
-
-#include "WinCommand.h"
-
-/* Resources:
-
- Name		     Class		RepType		Default Value
- ----		     -----		-------		-------------
- background	     Background		Pixel		XtDefaultBackground
- bitmap		     Pixmap		Pixmap		None
- border		     BorderColor	Pixel		XtDefaultForeground
- borderWidth	     BorderWidth	Dimension	1
- callback	     Callback		Pointer		NULL
- cursor		     Cursor		Cursor		None
- destroyCallback     Callback		Pointer		NULL
- font		     Font		XFontStruct*	XtDefaultFont
- foreground	     Foreground		Pixel		XtDefaultForeground
- height		     Height		Dimension	text height
- highlightThickness  Thickness		Dimension	2
- insensitiveBorder   Insensitive	Pixmap		Gray
- internalHeight	     Height		Dimension	2
- internalWidth	     Width		Dimension	4
- justify	     Justify		XtJustify	XtJustifyCenter
- label		     Label		String		NULL
- mappedWhenManaged   MappedWhenManaged	Boolean		True
- menuName            MenuName           String          "menu"
- resize		     Resize		Boolean		True
- sensitive	     Sensitive		Boolean		True
- width		     Width		Dimension	text width
- x		     Position		Position	0
- y		     Position		Position	0
-
-*/
-
-#define XtNmenuName "menuName"
-#define XtCMenuName "MenuName"
-
-extern WidgetClass     winMenuButtonWidgetClass;
-
-typedef struct _WinMenuButtonClassRec   *WinMenuButtonWidgetClass;
-typedef struct _WinMenuButtonRec        *WinMenuButtonWidget;
-
-#endif /* _WinMenuButton_h --  DON'T ADD STUFF AFTER THIS */
diff --git a/controls/combo.c b/controls/combo.c
index c8e32b9..f4af8dc 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -21,6 +21,8 @@
 #include <dirent.h>
 #include <sys/stat.h>
 
+HBITMAP hComboBit = 0;
+
 LPHEADCOMBO ComboGetStorageHeader(HWND hwnd);
 int CreateComboStruct(HWND hwnd);
 
@@ -37,12 +39,21 @@
     int		AltState;
     WND  	*wndPtr;
     LPHEADCOMBO lphc;
+    LPDRAWITEMSTRUCT lpdis;
+    HDC		hMemDC;
+    BITMAP	bm;
     char	str[128];
     PAINTSTRUCT paintstruct;
     static RECT rectsel;
     switch(message)
     {
     case WM_CREATE:
+	ShowScrollBar(hwnd, SB_BOTH, FALSE);
+	GetClientRect(hwnd, &rect);
+	width = rect.right - rect.left;
+	height = rect.bottom - rect.top;
+/*	SetWindowPos(hwnd, 0, 0, 0, width, 16, 
+		SWP_NOMOVE | SWP_NOZORDER); */
 	CreateComboStruct(hwnd);
 	wndPtr = WIN_FindWndPtr(hwnd);
 	lphc = ComboGetStorageHeader(hwnd);
@@ -50,10 +61,10 @@
 #ifdef DEBUG_COMBO
         printf("Combo WM_CREATE %lX !\n", lphc);
 #endif
-	width = wndPtr->rectClient.right - wndPtr->rectClient.left;
-	height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
+	if (hComboBit == (HBITMAP)NULL) 
+	    hComboBit = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_COMBO));
 	lphc->hWndDrop = CreateWindow("BUTTON", "", 
-        	WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+        	WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_OWNERDRAW,
         	width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
 	lphc->hWndEdit = CreateWindow("STATIC", "", 
         	WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
@@ -189,6 +200,24 @@
 	break;
     case WM_CTLCOLOR:
     	return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
+    case WM_DRAWITEM:
+#ifdef DEBUG_SCROLL
+	    printf("ComboBox WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
+#endif
+        lpdis = (LPDRAWITEMSTRUCT)lParam;
+	if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_DRAWENTIRE) {
+	    hMemDC = CreateCompatibleDC(lpdis->hDC);
+	    GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
+	    SelectObject(hMemDC, hComboBit);
+	    BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+	    DeleteDC(hMemDC);
+	    }
+	if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_SELECT) {
+	    CopyRect(&rect, &lpdis->rcItem);
+	    InflateRect(&rect, -1, -1);
+	    DrawReliefRect(lpdis->hDC, rect, 1, 1);
+	    }
+	break;
     case WM_PAINT:
 	BeginPaint( hwnd, &paintstruct );
 	EndPaint( hwnd, &paintstruct );
diff --git a/controls/menu.c b/controls/menu.c
index 4a01b2f..8c43e6f 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -9,11 +9,6 @@
 
 #include <X11/Intrinsic.h>
 #include <X11/StringDefs.h>
-#include <X11/Xaw/SmeBSB.h>
-#include <X11/Xaw/SmeLine.h>
-#include <X11/Xaw/SimpleMenu.h>
-#include "WinMenuButto.h"
-#include "SmeMenuButto.h"
 #include "windows.h"
 #include "menu.h"
 #include "heap.h"
diff --git a/controls/scroll.c b/controls/scroll.c
index 439be8d..47da5bf 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -205,7 +205,9 @@
 	    if (lpdis->CtlID == 1) {
 		GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
 		SelectObject(hMemDC, hUpArrow);
-		BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+/*		BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); */
+		StretchBlt(lpdis->hDC, 0, 0, lpdis->rcItem.right, lpdis->rcItem.right,
+			hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
 		}
 	    if (lpdis->CtlID == 2) {
 		GetObject(hDnArrow, sizeof(BITMAP), (LPSTR)&bm);
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index f2e2baa..16a5548 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -43,9 +43,8 @@
 33  pascal TextOut(word s_word s_word ptr word) TextOut(1 2 3 4 5)
 34  pascal BitBlt( word s_word s_word s_word s_word word s_word s_word long)
 	   BitBlt(1 2 3 4 5 6 7 8 9)
-35  pascal StrechBlt( word s_word s_word s_word s_word word s_word s_word s_word s_word long)
-           StrechBlt(1 2 3 4 5 6 7 8 9 10 11)
-
+35  pascal StretchBlt( word s_word s_word s_word s_word word s_word s_word s_word s_word long)
+           StretchBlt(1 2 3 4 5 6 7 8 9 10 11)
 36  pascal Polygon (word ptr word) Polygon (1 2 3)
 37  pascal Polyline (word ptr word) Polyline (1 2 3)
 39  pascal RestoreDC(word s_word) RestoreDC(1 2)
diff --git a/if1632/user.spec b/if1632/user.spec
index 24c3e24..ebd04ea 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -23,9 +23,12 @@
 23  pascal GetFocus() GetFocus()
 28  pascal ClientToScreen(word ptr) ClientToScreen(1 2)
 29  pascal ScreenToClient(word ptr) ScreenToClient(1 2)
+30  pascal WindowFromPoint(long) WindowFromPoint(1)
 31  pascal IsIconic(word) IsIconic(1)
 32  pascal GetWindowRect(word ptr) GetWindowRect(1 2)
 33  pascal GetClientRect(word ptr) GetClientRect(1 2)
+34  pascal EnableWindow(word word) EnableWindow(1 2)
+35  pascal IsWindowEnabled(word) IsWindowEnabled(1)
 36  pascal GetWindowText(word ptr word) GetWindowText(1 2 3)
 37  pascal SetWindowText(word ptr) SetWindowText(1 2)
 38  pascal GetWindowTextLength(word) GetWindowTextLength(1)
@@ -36,6 +39,7 @@
 42  pascal ShowWindow(word word) ShowWindow(1 2)
 43  pascal CloseWindow(word) CloseWindow(1)
 44  pascal OpenIcon(word) OpenIcon(1)
+45  pascal BringWindowToTop(word) BringWindowToTop(1)
 46  pascal GetParent(word) GetParent(1)
 47  pascal IsWindow(word) IsWindow(1)
 48  pascal IsChild(word word) IsChild(1 2)
@@ -140,6 +144,7 @@
 182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
 183 pascal GetCaretPos(ptr) GetCaretPos(1)
 190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
+191 pascal ChildWindowFromPoint(word long) ChildWindowFromPoint(1 2)
 200 pascal OpenComm(ptr word word) OpenComm(1 2 3)
 201 pascal SetCommState(ptr) SetCommState(1)
 202 pascal GetCommState(word ptr) GetCommState(1 2)
@@ -194,6 +199,8 @@
 334 pascal GetQueueStatus(word) GetQueueStatus(1)
 335 pascal GetInputState() GetInputState()
 359 pascal GetDCEx(word word long) GetDCEx(1 2 3)
+370 pascal GetWindowPlacement(word ptr) GetWindowPlacement(1 2)
+371 pascal SetWindowPlacement(word ptr) SetWindowPlacement(1 2)
 373 pascal SubtractRect(ptr ptr ptr) SubtractRect(1 2 3)
 403 pascal UnregisterClass(ptr word) UnregisterClass(1 2)
 404 pascal GetClassInfo(word ptr ptr) GetClassInfo(1 2 3)
@@ -226,6 +233,9 @@
 454 pascal AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx(1 2 3 4)
 457 pascal DestroyIcon(word) DestroyIcon(1)
 458 pascal DestroyCursor(word) DestroyCursor(1)
+460 pascal GetInternalWindowPos(word ptr ptr) GetInternalWindowPos(1 2 3)
+461 pascal SetInternalWindowPos(word word ptr ptr) SetInternalWindowPos(1 2 3 4)
+466 pascal DrawFocusRect(word ptr) DrawFocusRect(1 2)
 471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
 472 pascal AnsiNext(ptr) AnsiNext(1 )
 473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2)
diff --git a/include/options.h b/include/options.h
new file mode 100644
index 0000000..a783b32
--- /dev/null
+++ b/include/options.h
@@ -0,0 +1,20 @@
+/*
+ * Command-line options.
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+#ifndef OPTIONS_H
+#define OPTIONS_H
+
+struct options
+{
+    char * spyFilename;
+    int    usePrivateMap;
+    int    synchronous;
+    short  cmdShow;
+};
+
+extern struct options Options;
+
+#endif
diff --git a/include/segmem.h b/include/segmem.h
index 437dfd9..d4f6fd8 100644
--- a/include/segmem.h
+++ b/include/segmem.h
@@ -69,4 +69,10 @@
     return ((int) address >= (((FIRST_SELECTOR << 3) | 0x0007) << 16));
 }
 
+extern SEGDESC Segments[];
+
 #endif /* SEGMEM_H */
+
+
+
+
diff --git a/include/win.h b/include/win.h
index 8bb8d57..12800c7 100644
--- a/include/win.h
+++ b/include/win.h
@@ -26,6 +26,9 @@
     HANDLE       hInstance;      /* Window hInstance (from CreateWindow) */
     RECT         rectClient;     /* Client area rel. to parent client area */
     RECT         rectWindow;     /* Whole window rel. to parent client area */
+    RECT         rectNormal;     /* Window rect. when in normal state */
+    POINT        ptIconPos;      /* Icon position */
+    POINT        ptMaxPos;       /* Maximized window position */
     HANDLE       hmemTaskQ;      /* Task queue global memory handle */
     HRGN         hrgnUpdate;     /* Update region */
     HWND         hwndLastActive; /* Last active popup hwnd */
@@ -54,6 +57,10 @@
 #define WIN_OWN_DC              0x08  /* Win class has style CS_OWNDC */
 #define WIN_CLASS_DC            0x10  /* Win class has style CS_CLASSDC */
 #define WIN_DOUBLE_CLICKS       0x20  /* Win class has style CS_DBLCLKS */
+#define WIN_RESTORE_MAX         0x40  /* Maximize when restoring */
+
+  /* First top-level window */
+extern HWND firstWindow;
 
   /* Window functions */
 WND *WIN_FindWndPtr( HWND hwnd );
diff --git a/include/windows.h b/include/windows.h
index 7cfecdc..a4064c3 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -111,6 +111,19 @@
 #endif
 */
 
+typedef struct { short x, y; } POINT;
+typedef POINT *PPOINT;
+typedef POINT *NPPOINT;
+typedef POINT *LPPOINT;
+
+typedef struct 
+{
+    short cx;
+    short cy;
+} SIZE, *LPSIZE;
+
+#define MAKEPOINT(l) (*((POINT *)&(l)))
+
 #define MAKELPARAM(low, high) ((LONG)(((WORD)(low)) | \
 			      (((DWORD)((WORD)(high))) << 16)))
 
@@ -221,6 +234,21 @@
     UINT    flags;
 } WINDOWPOS;
 
+  /* SetWindowPlacement() struct */
+typedef struct
+{
+    UINT   length;
+    UINT   flags;
+    UINT   showCmd;
+    POINT  ptMinPosition __attribute__ ((packed));
+    POINT  ptMaxPosition __attribute__ ((packed));
+    RECT   rcNormalPosition __attribute__ ((packed));
+} WINDOWPLACEMENT, *LPWINDOWPLACEMENT;
+
+  /* WINDOWPLACEMENT flags */
+#define WPF_SETMINPOSITION      0x0001
+#define WPF_RESTORETOMAXIMIZED  0x0002
+
   /* WM_NCCALCSIZE parameter structure */
 typedef struct
 {
@@ -324,19 +352,6 @@
 #define IDNO                7
 
 
-typedef struct { short x, y; } POINT;
-typedef POINT *PPOINT;
-typedef POINT *NPPOINT;
-typedef POINT *LPPOINT;
-
-typedef struct 
-{
-    short cx;
-    short cy;
-} SIZE, *LPSIZE;
-
-#define MAKEPOINT(l) (*((POINT *)&(l)))
-
 typedef struct tagMSG
 {
   HWND    hwnd;
@@ -2002,6 +2017,7 @@
 Fa(ATOM,GlobalAddAtom,LPCSTR,a)
 Fa(ATOM,GlobalDeleteAtom,ATOM,a)
 Fa(ATOM,GlobalFindAtom,LPCSTR,a)
+Fa(BOOL,BringWindowToTop,HWND,a)
 Fa(BOOL,DeleteDC,HDC,a)
 Fa(BOOL,DeleteMetaFile,HANDLE,a)
 Fa(BOOL,DeleteObject,HANDLE,a)
@@ -2156,7 +2172,6 @@
 Fa(int,UpdateColors,HDC,a)
 Fa(int,WaitSoundState,int,a)
 Fa(short,GetTextCharacterExtra,HDC,a)
-Fa(void,BringWindowToTop,HWND,a)
 Fa(void,ClipCursor,LPRECT,a)
 Fa(void,CloseWindow,HWND,a)
 Fa(void,DrawMenuBar,HWND,a)
@@ -2179,6 +2194,8 @@
 Fa(void,SwapRecording,WORD,a)
 Fb(BOOL,ExitWindows,DWORD,dwReserved,WORD,wReturnCode)
 Fb(BOOL,GetBitmapDimensionEx,HBITMAP,a,LPSIZE,b)
+Fb(BOOL,GetWindowPlacement,HWND,a,LPWINDOWPLACEMENT,b)
+Fb(BOOL,SetWindowPlacement,HWND,a,LPWINDOWPLACEMENT,b)
 Fb(BOOL,ShowWindow,HWND,a,int,b) 
 Fb(HDC,BeginPaint,HWND,a,LPPAINTSTRUCT,b) 
 Fb(LPSTR,lstrcat,LPSTR,a,LPCSTR,b )
@@ -2270,6 +2287,12 @@
 Fb(WORD,LocalShrink,HANDLE,a,WORD,b)
 Fb(WORD,MapVirtualKey,WORD,a,WORD,b)
 Fb(WORD,SetSystemPaletteUse,HDC,a,WORD,b)
+Fb(WORD,SetBkMode,HDC,a,WORD,b)
+Fb(WORD,SetMapMode,HDC,a,WORD,b)
+Fb(WORD,SetPolyFillMode,HDC,a,WORD,b)
+Fb(WORD,SetRelAbs,HDC,a,WORD,b)
+Fb(WORD,SetROP2,HDC,a,WORD,b)
+Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
 Fb(WORD,SetTaskQueue,HANDLE,a,HANDLE,b)
 Fb(WORD,SetTextAlign,HDC,a,WORD,b)
 Fb(WORD,SizeofResource,HANDLE,a,HANDLE,b)
@@ -2317,6 +2340,7 @@
 Fb(void,ValidateRect,HWND,a,LPRECT,b)
 Fb(void,ValidateRgn,HWND,a,HRGN,b)
 Fc(BOOL,LineTo,HDC,a,short,b,short,c)
+Fc(WORD,GetInternalWindowPos,HWND,a,LPRECT,b,LPPOINT,c)
 Fc(LONG,_llseek,int,a,long,b,int,c)
 Fc(WORD,_lread,int,a,LPSTR,b,int,c)
 Fc(WORD,_lwrite,int,a,LPSTR,b,int,c)
@@ -2378,12 +2402,6 @@
 Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,short,c)
 Fc(WORD,SetClassWord,HWND,a,short,b,WORD,c)
 Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c)
-Fb(WORD,SetBkMode,HDC,a,WORD,b)
-Fb(WORD,SetMapMode,HDC,a,WORD,b)
-Fb(WORD,SetPolyFillMode,HDC,a,WORD,b)
-Fb(WORD,SetRelAbs,HDC,a,WORD,b)
-Fb(WORD,SetROP2,HDC,a,WORD,b)
-Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
 Fc(int,FrameRect,HDC,a,LPRECT,b,HBRUSH,c)
 Fc(int,GetClassName,HWND,a,LPSTR,b,short,c)
 Fc(int,GetClipboardFormatName,WORD,a,LPSTR,b,int,c)
@@ -2479,6 +2497,7 @@
 Fd(void,GetScrollRange,HWND,a,int,b,LPINT,c,LPINT,d)
 Fd(void,MapWindowPoints,HWND,a,HWND,b,LPPOINT,c,WORD,d)
 Fd(void,PlayMetaFileRecord,HDC,a,LPHANDLETABLE,b,LPMETARECORD,c,WORD,d)
+Fd(void,SetInternalWindowPos,HWND,a,WORD,b,LPRECT,c,LPPOINT,d)
 Fd(void,SetDlgItemInt,HWND,a,WORD,b,WORD,c,BOOL,d)
 Fe(BOOL,Rectangle,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom)
 Fe(int,DrawText,HDC,a,LPSTR,str,int,c,LPRECT,d,WORD,flag)
diff --git a/loader/cursor.c b/loader/cursor.c
index 039c1c3..3bf7577 100644
--- a/loader/cursor.c
+++ b/loader/cursor.c
@@ -77,6 +77,14 @@
 		lpcur->xcursor = XCreateFontCursor(XT_display, XC_watch);
 		GlobalUnlock(hCursor);
 	    	return hCursor;
+	    case IDC_SIZENS:
+		lpcur->xcursor = XCreateFontCursor(XT_display, XC_sb_v_double_arrow);
+		GlobalUnlock(hCursor);
+	    	return hCursor;
+	    case IDC_SIZEWE:
+		lpcur->xcursor = XCreateFontCursor(XT_display, XC_sb_h_double_arrow);
+		GlobalUnlock(hCursor);
+	    	return hCursor;
 	    default:
 		break;
 	    }
diff --git a/loader/selector.c b/loader/selector.c
index 5edee7fa..38ad26f 100644
--- a/loader/selector.c
+++ b/loader/selector.c
@@ -62,6 +62,35 @@
  *					FindUnusedSelector
  */
 int
+FindUnusedSelectors(int n_selectors)
+{
+    int i;
+    int n_found;
+
+    n_found = 0;
+    for (i = LastUsedSelector + 1; i != LastUsedSelector; i++)
+    {
+	if (i >= MAX_SELECTORS)
+	{
+	    n_found = 0;
+	    i = FIRST_SELECTOR;
+	}
+	
+	if (!SelectorMap[i] && ++n_found == n_selectors)
+	    break;
+    }
+    
+    if (i == LastUsedSelector)
+	return 0;
+
+    LastUsedSelector = i;
+    return i - n_selectors + 1;
+}
+
+/**********************************************************************
+ *					FindUnusedSelector
+ */
+int
 FindUnusedSelector(void)
 {
     int i;
@@ -728,6 +757,7 @@
     int i;
     int status;
     int old_length, file_image_length;
+    int saved_old_length;
 
     /*
      * Allocate memory for the table to keep track of all selectors.
@@ -828,14 +858,18 @@
 	if (i + 1 == ne_header->auto_data_seg)
 	{
 	    auto_data_sel = s->selector;
-	    HEAP_LocalInit(s->base_addr + old_length, 
-			   ne_header->local_heap_length);
+	    saved_old_length = old_length;
 	}
     }
 
     s = selectors;
     for (i = 0; i < ne_header->n_segment_tab; i++, s++)
+    {
 	Segments[s->selector >> 3].owner = auto_data_sel;
+	if (s->selector == auto_data_sel)
+	    HEAP_LocalInit(auto_data_sel, s->base_addr + saved_old_length, 
+			   ne_header->local_heap_length);
+    }
 
     if(!EnvironmentSelector) {
 	    EnvironmentSelector = CreateEnvironment();
diff --git a/memory/heap.c b/memory/heap.c
index e97ce84..252f5fb 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -6,8 +6,16 @@
 #include "prototypes.h"
 #include "segmem.h"
 #include "heap.h"
+#include "regfunc.h"
 
-MDESC *LOCAL_FreeList;
+typedef struct heap_local_heap_s
+{
+    struct heap_local_heap_s *next;
+    MDESC *free_list;
+    unsigned short selector;
+} LHEAP;
+
+LHEAP *LocalHeaps = NULL;
 
 /**********************************************************************
  *					HEAP_Init
@@ -274,12 +282,49 @@
 }
 
 /**********************************************************************
+ *					HEAP_LocalFindHeap
+ */
+MDESC **
+HEAP_LocalFindHeap(unsigned short owner)
+{
+    LHEAP *lh;
+    
+#ifdef DEBUG_HEAP
+    printf("HEAP_LocalFindHeap: owner %04x\n", owner);
+#endif
+    
+    for (lh = LocalHeaps; lh != NULL; lh = lh->next)
+    {
+	if (lh->selector == owner)
+	    return &lh->free_list;
+    }
+
+    return NULL;
+}
+
+#define LOCALHEAP() HEAP_LocalFindHeap(Segments[Stack16Frame[11] >> 3].owner)
+
+/**********************************************************************
  *					HEAP_LocalInit
  */
 void
-HEAP_LocalInit(void *start, int length)
+HEAP_LocalInit(unsigned short owner, void *start, int length)
 {
-    HEAP_Init(&LOCAL_FreeList, start, length);
+    LHEAP *lh;
+
+#ifdef DEBUG_HEAP
+    printf("HEAP_LocalInit: owner %04x, start %08x, length %04x\n",
+	   owner, start, length);
+#endif
+    
+    lh = (LHEAP *) malloc(sizeof(*lh));
+    if (lh == NULL)
+	return;
+    
+    lh->selector = owner;
+    lh->next = LocalHeaps;
+    HEAP_Init(&lh->free_list, start, length);
+    LocalHeaps = lh;
 }
 
 /**********************************************************************
@@ -292,9 +337,10 @@
     
 #ifdef DEBUG_HEAP
     printf("LocalAlloc: flags %x, bytes %d\n", flags, bytes);
+    printf("    called from segment %04x\n", Stack16Frame[11]);
 #endif
 
-    m = HEAP_Alloc(&LOCAL_FreeList, flags, bytes);
+    m = HEAP_Alloc(LOCALHEAP(), flags, bytes);
 	
 #ifdef DEBUG_HEAP
 	printf("LocalAlloc: returning %x\n", (int) m);
@@ -312,7 +358,7 @@
     int max_block;
     
     max_block = 0;
-    for (m = LOCAL_FreeList; m != NULL; m = m->next)
+    for (m = *LOCALHEAP(); m != NULL; m = m->next)
 	if (m->length > max_block)
 	    max_block = m->length;
     
@@ -327,7 +373,7 @@
 {
     MDESC *m;
     
-    m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) | 
+    m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) | 
 		   (handle & 0xffff)) - 1;
     if (m->next != m || m->prev != m)
 	return 0;
@@ -343,8 +389,8 @@
 {
     unsigned int addr;
     
-    addr = ((int) LOCAL_FreeList & 0xffff0000) | (handle & 0xffff);
-    if (HEAP_Free(&LOCAL_FreeList, (void *) addr) < 0)
+    addr = ((int) *LOCALHEAP() & 0xffff0000) | (handle & 0xffff);
+    if (HEAP_Free(LOCALHEAP(), (void *) addr) < 0)
 	return handle;
     else
 	return 0;
@@ -356,7 +402,7 @@
 unsigned int
 LocalInit(unsigned int segment, unsigned int start, unsigned int end)
 {
-    HEAP_Init(&LOCAL_FreeList, 
+    HEAP_Init(LOCALHEAP(), 
 	      (void *) ((segment << 16) | start), end - start + 1);
 
     return segment;
@@ -370,7 +416,7 @@
 {
     MDESC *m;
     
-    m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) | 
+    m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) | 
 		   (handle & 0xffff)) - 1;
     if (m->next != m || m->prev != m)
 	return 0;
@@ -387,8 +433,8 @@
 {
     void *m;
     
-    m = HEAP_ReAlloc(&LOCAL_FreeList, (void *)
-		     (((int) LOCAL_FreeList & 0xffff0000) | (handle & 0xffff)),
+    m = HEAP_ReAlloc(LOCALHEAP(), (void *)
+		     (((int) *LOCALHEAP() & 0xffff0000) | (handle & 0xffff)),
 		     bytes, flags);
 	
     return m;
@@ -402,7 +448,7 @@
 {
     MDESC *m;
     
-    m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) | 
+    m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) | 
 		   (handle & 0xffff)) - 1;
     if (m->next != m || m->prev != m)
 	return 0;
@@ -418,7 +464,7 @@
 {
     MDESC *m;
     
-    m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) | 
+    m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) | 
 		   (handle & 0xffff)) - 1;
     if (m->next != m || m->prev != m)
 	return 1;
diff --git a/misc/Makefile b/misc/Makefile
index 6fa5c19..f72ab80 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -1,6 +1,6 @@
 CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
 
-OBJS=kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
+OBJS=main.o kernel.o user.o rect.o file.o sound.o emulate.o \
      keyboard.o profile.o lstr.o exec.o message.o int1a.o int21.o \
      dos_fs.o comm.o spy.o
 
diff --git a/misc/comm.c b/misc/comm.c
index c0db9d5..ca65c0d 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -25,6 +25,8 @@
 	char *devicename;	/* /dev/cua1 */
 	int fd;
 	int suspended;
+	int unget;
+	int unget_byte;
 };
 
 struct DosDeviceStruct COM[MAX_PORTS];
@@ -83,15 +85,6 @@
 
 	}
 	atexit(Comm_DeInit);
-
-#ifdef DEBUG_COMM
-	for (x=0; x!=MAX_PORTS; x++) {
-	    if (COM[x].devicename)
-		fprintf(stderr, "comm: COM%d = %s\n", x, COM[x].devicename);
-	    if (LPT[x].devicename)
-		fprintf(stderr, "comm: LPT%d = %s\n", x, LPT[x].devicename);
-	}
-#endif
 }
 
 void Comm_DeInit(void)
@@ -103,13 +96,11 @@
 		if (COM[x].devicename) {
 			if (COM[x].fd)
 	    			close(COM[x].fd);
-			fprintf(stderr, "comm: COM%d = %s\n",x,COM[x].devicename);
 	        	free(COM[x].devicename);
 	    	}
 		if (LPT[x].devicename) {
 			if (LPT[x].fd)
 		    		close(LPT[x].fd);
-			fprintf(stderr, "comm: LPT%d = %s\n",x,LPT[x].devicename);
 			free(LPT[x].devicename);
 		}
 	}
@@ -799,7 +790,6 @@
 #ifdef DEBUG_COMM
 fprintf(stderr,"UngetCommChar: fd %d (char %d)\n", fd, chUnget);
 #endif	
-	fprintf(stderr,"NOT implemented!\n");
 
 	if ((ptr = GetDeviceStruct(fd)) == NULL) {
 		commerror = IE_BADID;
@@ -811,16 +801,22 @@
 		return -1;
 	}	
 
+	ptr->unget = 1;
+	ptr->unget_byte = chUnget;
+	
 	commerror = 0;
 	return 0;
 }
 
 int ReadComm(int fd, LPSTR lpvBuf, int cbRead)
 {
+	int status, length;
 	struct DosDeviceStruct *ptr;
+
 #ifdef DEBUG_COMM
 fprintf(stderr,"ReadComm: fd %d, ptr %d, length %d\n", fd, lpvBuf, cbRead);
 #endif	
+
 	if ((ptr = GetDeviceStruct(fd)) == NULL) {
 		commerror = IE_BADID;
 		return -1;
@@ -831,18 +827,29 @@
 		return -1;
 	}	
 
-	if (read(fd, (void *) lpvBuf, cbRead) == -1) {
+	if (ptr->unget) {
+		*lpvBuf = ptr->unget_byte;
+		lpvBuf++;
+		ptr->unget = 0;
+
+		length = 1;
+	} else
+	 	length = 0;
+
+	status = read(fd, (void *) lpvBuf, cbRead);
+
+	if (status == -1) {
 		commerror = WinError();
-		return -1;	
+		return -1 - length;	
 	} else {
 		commerror = 0;
-		return 0;
+		return length + status;
 	}
 }
 
 int WriteComm(int fd, LPSTR lpvBuf, int cbWrite)
 {
-	int x;
+	int x, length;
 	struct DosDeviceStruct *ptr;
 
 #ifdef DEBUG_COMM
@@ -859,14 +866,18 @@
 		return -1;
 	}	
 	
+#ifdef DEBUG_COMM
 	for (x=0; x != cbWrite ; x++)
 		fprintf(stderr,"%c", *(lpvBuf + x) );
+#endif
 
-	if (write(fd, (void *) lpvBuf, cbWrite) == -1) {
+	length = write(fd, (void *) lpvBuf, cbWrite);
+	
+	if (length == -1) {
 		commerror = WinError();
 		return -1;	
 	} else {
 		commerror = 0;	
-		return 0;
+		return length;
 	}
 }
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 57aed8d..b8f052e 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -338,8 +338,9 @@
 { 
 	/*   a:\windows\system.ini  =>  /dos/windows/system.ini   */
 	
+	static char temp[256];
 	int drive;
-	char x, temp[256];
+	char x;
 
 	if (dosfilename[1] == ':') 
 	{
diff --git a/misc/exec.c b/misc/exec.c
index 8bbace7..e20e53a 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -73,7 +73,7 @@
       case 0:
          printf("New process started !\n");
          ArgV[0] = "wine";
-         ArgV[1] = "/C:/windows/winhelp.exe";
+         ArgV[1] = "winhelp.exe";
          ArgV[2] = lpHelpFile;
          switch (wCommand) {
 	     case HELP_CONTEXT:
@@ -99,5 +99,3 @@
       }
 return(TRUE);
 }
-
-
diff --git a/misc/kernel.c b/misc/kernel.c
index ea3c3c0..3cdd950 100644
--- a/misc/kernel.c
+++ b/misc/kernel.c
@@ -5,6 +5,7 @@
 #include <stdlib.h>
 #include "prototypes.h"
 #include "regfunc.h"
+#include "options.h"
 
 extern unsigned short WIN_StackSize;
 
@@ -48,7 +49,7 @@
     _BX = 0x81;
     _AX = 1;
     _CX = WIN_StackSize;
-    _DX = 1;
+    _DX = Options.cmdShow;
     _SI = 0;
     ReturnFromRegisterFunc();
     /* Function does not return */
diff --git a/misc/main.c b/misc/main.c
new file mode 100644
index 0000000..c371d01
--- /dev/null
+++ b/misc/main.c
@@ -0,0 +1,120 @@
+/*
+ * Main function.
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright  Alexandre Julliard, 1994";
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+
+#include "windows.h"
+#include "options.h"
+
+
+Display * XT_display;  /* To be removed */
+Screen * XT_screen;    /* To be removed */
+
+Display * display;
+Screen * screen;
+
+
+struct options Options =
+{  /* default options */
+    NULL,           /* spyFilename */
+    FALSE,          /* usePrivateMap */
+    FALSE,          /* synchronous */
+    SW_SHOWNORMAL   /* cmdShow */
+};
+
+
+static XrmOptionDescRec optionsTable[] =
+{
+    { "-display",     ".display",     XrmoptionSepArg, (caddr_t)NULL },
+    { "-iconic",      ".iconic",      XrmoptionNoArg,  (caddr_t)"on" },
+    { "-privatemap",  ".privatemap",  XrmoptionNoArg,  (caddr_t)"on" },
+    { "-synchronous", ".synchronous", XrmoptionNoArg,  (caddr_t)"on" },
+    { "-spy",         ".spy",         XrmoptionSepArg, (caddr_t)NULL }
+};
+
+#define NB_OPTIONS  (sizeof(optionsTable) / sizeof(optionsTable[0]))
+
+
+/***********************************************************************
+ *           MAIN_Usage
+ */
+static void MAIN_Usage( char *name )
+{
+    fprintf( stderr,"Usage: %s [-display name] [-iconic] [-privatemap]\n"
+	            "        [-synchronous] [-spy file] program [arguments]\n",
+	     name );
+    exit(1);
+}
+
+
+/***********************************************************************
+ *           MAIN_ParseOptions
+ *
+ * Parse command line options and open display.
+ */
+static void MAIN_ParseOptions( int *argc, char *argv[] )
+{
+    char *dummy, *display_name;
+    XrmValue value;
+    XrmDatabase db = NULL;
+
+    XrmParseCommand( &db, optionsTable, NB_OPTIONS, "wine", argc, argv );
+    if (*argc < 2) MAIN_Usage( argv[0] );
+
+    if (XrmGetResource( db, "wine.display", "Wine.display", &dummy, &value ))
+	display_name = value.addr;
+    else display_name = NULL;
+
+    if (!(display = XOpenDisplay( display_name )))
+    {
+	fprintf( stderr, "%s: Can't open display: %s\n",
+		 argv[0], display_name ? display_name : "" );
+	exit(1);
+    }
+
+    if (XrmGetResource(db,"wine.iconic","Wine.iconic",&dummy,&value))
+	Options.cmdShow = SW_SHOWMINIMIZED;
+    if (XrmGetResource(db,"wine.privatemap","Wine.privatemap",&dummy,&value))
+	Options.usePrivateMap = TRUE;
+    if (XrmGetResource(db,"wine.synchronous","Wine.synchronous",&dummy,&value))
+	Options.synchronous = TRUE;
+    if (XrmGetResource(db,"wine.spy","Wine.spy",&dummy,&value))
+	Options.spyFilename = value.addr;
+}
+
+
+/***********************************************************************
+ *           main
+ */
+int main( int argc, char *argv[] )
+{    
+
+    XrmInitialize();
+    
+    MAIN_ParseOptions( &argc, argv );
+
+    screen = DefaultScreenOfDisplay( display );
+    XT_display = display;
+    XT_screen = screen;
+    if (Options.synchronous) XSynchronize( display, True );
+
+    DOS_InitFS();
+    Comm_Init();
+    return _WinMain( argc, argv );
+}
+
+
+/***********************************************************************
+ *           MessageBeep    (USER.104)
+ */
+void MessageBeep( WORD i )
+{
+    XBell( display, 100 );
+}
diff --git a/misc/message.c b/misc/message.c
index cde5164..f6fb52f 100644
--- a/misc/message.c
+++ b/misc/message.c
@@ -108,6 +108,9 @@
     int		x;
     switch(message) {
 	case WM_CREATE:
+#ifdef DEBUG_MSGBOX
+	    printf("MessageBox WM_CREATE !\n");
+#endif
 	    wndPtr = WIN_FindWndPtr(hWnd);
 	    createStruct = (CREATESTRUCT *)lParam;
      	    lpmbInit = (LPMSGBOX)createStruct->lpCreateParams;
@@ -122,55 +125,55 @@
 		    lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 - 30, rect.bottom - 25, 
-			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDOK, wndPtr->hInstance, 0L);
 		    break;
 		case MB_OKCANCEL :
 		    lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 - 65, rect.bottom - 25, 
-			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDOK, wndPtr->hInstance, 0L);
 		    lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 + 5, rect.bottom - 25, 
-			60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDCANCEL, wndPtr->hInstance, 0L);
 		    break;
 		case MB_ABORTRETRYIGNORE :
 		    lpmb->hWndYes = CreateWindow("BUTTON", "&Retry", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 - 100, rect.bottom - 25, 
-			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDRETRY, wndPtr->hInstance, 0L);
 		    lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 - 30, rect.bottom - 25, 
-			60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDIGNORE, wndPtr->hInstance, 0L);
 		    lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 + 40, rect.bottom - 25, 
-			60, 18, hWnd, 3, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDABORT, wndPtr->hInstance, 0L);
 		    break;
 		case MB_YESNO :
 		    lpmb->hWndYes = CreateWindow("BUTTON", "&Yes", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 - 65, rect.bottom - 25, 
-			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDYES, wndPtr->hInstance, 0L);
 		    lpmb->hWndNo = CreateWindow("BUTTON", "&No", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 + 5, rect.bottom - 25, 
-			60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDNO, wndPtr->hInstance, 0L);
 		    break;
 		case MB_YESNOCANCEL :
 		    lpmb->hWndYes = CreateWindow("BUTTON", "&Yes", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 - 100, rect.bottom - 25, 
-			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDYES, wndPtr->hInstance, 0L);
 		    lpmb->hWndNo = CreateWindow("BUTTON", "&No", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 - 30, rect.bottom - 25, 
-			60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDNO, wndPtr->hInstance, 0L);
 		    lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel", 
 			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
 			rect.right / 2 + 40, rect.bottom - 25, 
-			60, 18, hWnd, 3, wndPtr->hInstance, 0L);
+			60, 18, hWnd, IDCANCEL, wndPtr->hInstance, 0L);
 		    break;
 		}
 	    switch(lpmb->wType & MB_ICONMASK) {
@@ -199,6 +202,9 @@
 		}
 	    break;
 	case WM_PAINT:
+#ifdef DEBUG_MSGBOX
+	    printf("MessageBox WM_PAINT !\n");
+#endif
 	    lpmb = MsgBoxGetStorageHeader(hWnd);
 	    CopyRect(&rect, &lpmb->rectStr);
 	    hDC = BeginPaint(hWnd, &ps);
@@ -224,65 +230,12 @@
 	    break;
 	case WM_COMMAND:
 	    lpmb = MsgBoxGetStorageHeader(hWnd);
-	    switch(wParam) {
-		case 1:
-		    lpmb->wRetVal = IDOK;
-		    break;
-		case 2:
-		    wndPtr = WIN_FindWndPtr(hWnd);
-		    hDC = GetDC(hWnd);
-/*
-		    for (x = 1; x < 50; x++) {
-			hBitMap = LoadBitmap(wndPtr->hInstance, MAKEINTRESOURCE(x));
-			GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-			hMemDC = CreateCompatibleDC(hDC);
-			SelectObject(hMemDC, hBitMap);
-			printf(" bm.bmWidth=%d bm.bmHeight=%d\n",
-				bm.bmWidth, bm.bmHeight);
-			BitBlt(hDC, x * 20, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-			DeleteDC(hMemDC);
-			}
-*/
-		    hBitMap = LoadBitmap((HINSTANCE)NULL, "WINELOGO");
-		    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-		    printf("bm.bmWidth=%d bm.bmHeight=%d\n",
-		    	bm.bmWidth, bm.bmHeight);  
-		    hMemDC = CreateCompatibleDC(hDC);
-		    SelectObject(hMemDC, hBitMap);
-		    BitBlt(hDC, 100, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-		    DeleteDC(hMemDC);
-		    ReleaseDC(hWnd, hDC);
-		    lpmb->wRetVal = IDCANCEL;
-/*
-		    SetWindowPos(lpmb->hWndNo, (HWND)NULL, 20, 20, 0, 0, 
-		    		SWP_NOSIZE | SWP_NOZORDER);
-*/
-		    return 0;
-		    break;
-		case 3:
-		    hDC = GetDC(hWnd);
-		    hInst2 = LoadImage("ev3lite.exe");
-		    printf("hInst2=%04X\n", hInst2);
-		    hIcon = LoadIcon(hInst2, "EV3LITE");
-		    DrawIcon(hDC, 20, 20, hIcon);
-		    DestroyIcon(hIcon);
-		    hInst2 = LoadImage("moricons.dll");
-		    printf("hInst2=%04X\n", hInst2);
-		    hIcon = LoadIcon(hInst2, MAKEINTRESOURCE(1));
-/*		    hIcon = LoadIcon(hInst2, "WINEICON"); */
-		    DrawIcon(hDC, 60, 20, hIcon);
-		    DestroyIcon(hIcon);
-		    hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION);
-		    DrawIcon(hDC, 1000, 20, hIcon);
-		    DestroyIcon(hIcon);
-		    ReleaseDC(hWnd, hDC);
-		    lpmb->wRetVal = IDIGNORE;
-		    return(0);
-		    break;
-		default:
-		    return(0);
-		}
-	    CloseWindow(hWnd);
+	    if (wParam < IDOK || wParam > IDNO) return(0);
+	    lpmb->wRetVal = wParam;
+#ifdef DEBUG_MSGBOX
+	    printf("MessageBox sending WM_CLOSE !\n");
+#endif
+	    PostMessage(hWnd, WM_CLOSE, 0, 0L);
 	    break;
 	default:
 	    return DefWindowProc(hWnd, message, wParam, lParam );
@@ -292,3 +245,52 @@
 
 
 
+/*************************************************************************
+ *			"About Wine..." Dialog Box
+ */
+BOOL FAR PASCAL AboutWine_Proc(HWND hDlg, WORD msg, WORD wParam, LONG lParam)
+{
+    HDC  	hDC;
+    HDC		hMemDC;
+    PAINTSTRUCT ps;
+    int 	OldBackMode;
+    HFONT	hOldFont;
+    RECT 	rect;
+    BITMAP	bm;
+    char 	C[80];
+    int 	X;
+    static HBITMAP	hBitMap;
+    switch (msg) {
+    case WM_INITDIALOG:
+	strcpy(C, "WINELOGO");
+	hBitMap = LoadBitmap((HINSTANCE)NULL, (LPSTR)C);
+	return TRUE;
+    case WM_PAINT:
+	hDC = BeginPaint(hDlg, &ps);
+	GetClientRect(hDlg, &rect);
+	FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
+	InflateRect(&rect, -3, -3);
+	FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+	InflateRect(&rect, -10, -10);
+	hMemDC = CreateCompatibleDC(hDC);
+	SelectObject(hMemDC, hBitMap);
+	GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+	BitBlt(hDC, rect.left, rect.top, bm.bmWidth, bm.bmHeight, 
+					hMemDC, 0, 0, SRCCOPY);
+	DeleteDC(hMemDC);
+	EndPaint(hDlg, &ps);
+	return TRUE;
+    case WM_COMMAND:
+	switch (wParam)
+	    {
+	    case IDOK:
+CloseDLG:	EndDialog(hDlg, TRUE);
+		return TRUE;
+	    default:
+		return TRUE;
+	    }
+    }
+return FALSE;
+}
+
+
diff --git a/misc/spy.c b/misc/spy.c
index d45ebb2..86e5791 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -5,9 +5,12 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
 #include "wineopts.h"
 #include "windows.h"
 #include "wine.h"
+#include "options.h"
 
 #ifndef NOSPY
 
@@ -244,9 +247,14 @@
 
     if (SpyFp == NULL)
 	return;
-    
-    GetPrivateProfileString("spy", "file", "", filename, sizeof(filename),
-			    WINE_INI);
+
+    if (Options.spyFilename == NULL)
+    {
+	GetPrivateProfileString("spy", "file", "", filename, sizeof(filename),
+				WINE_INI);
+    }
+    else
+	strncpy(filename, Options.spyFilename, 100);
 
     if (strcasecmp(filename, "CON") == 0)
 	SpyFp = stdout;
diff --git a/misc/xt.c b/misc/xt.c
deleted file mode 100644
index 4458521..0000000
--- a/misc/xt.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * X toolkit functions
- *
- * Copyright 1993 Alexandre Julliard
- */
-
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
-
-#include <sys/param.h>
-#include <sys/times.h>
-
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Core.h>
-#include <X11/Shell.h>
-
-#include "windows.h"
-
-#ifdef __NetBSD__
-#define HZ 100
-#endif
-
-Display * XT_display;
-Screen * XT_screen;
-Display * display;
-Screen * screen;
-XtAppContext XT_app_context;
-
-static Widget topLevelWidget;
-
-
-/***********************************************************************
- *           main
- */
-void main(int argc, char **argv)
-{    
-    topLevelWidget = XtVaAppInitialize(&XT_app_context,
-				       "XWine",     /* Application class */
-				       NULL, 0,     /* Option list */
-				       &argc, argv, /* Command line args */
-				       NULL,        /* Fallback resources */
-				       NULL );
-    XT_display = XtDisplay( topLevelWidget );
-    XT_screen  = XtScreen( topLevelWidget );
-    display = XtDisplay( topLevelWidget );
-    screen  = XtScreen( topLevelWidget );
-    
-    DOS_InitFS();
-    Comm_Init();
-    _WinMain( argc, argv );
-}
-
-
-
-/********************************************************************
- *
- * Miscellaneous partially implemented functions.
- * 
- */
-
-
-void MessageBeep( WORD i )
-{
-    XBell(XT_display, 100);
-}
-
-/***********************************************************************
- *           GetTickCount    (USER.13)
- */
-DWORD GetTickCount()
-{
-    struct tms dummy;
-    return (times(&dummy) * 1000) / HZ;
-}
diff --git a/objects/bitblt.c b/objects/bitblt.c
index c4ed6bc..7b0d4ae 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -113,9 +113,9 @@
 
 
 /***********************************************************************
- *           StrechBlt    (GDI.35)
+ *           StretchBlt    (GDI.35)
  */
-BOOL StrechBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short heightDest,
+BOOL StretchBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short heightDest,
                HDC hdcSrc, short xSrc, short ySrc, short widthSrc, short heightSrc, DWORD rop )
 {
     int xs1, xs2, ys1, ys2;
@@ -124,7 +124,7 @@
 
 /*#ifdef DEBUG_GDI     */
 
-    printf( "StrechBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
+    printf( "StretchBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
            hdcDest, xDest, yDest, widthDest, heightDest, hdcSrc, xSrc, 
            ySrc, widthSrc, heightSrc, rop );
 /*#endif */
diff --git a/objects/color.c b/objects/color.c
index 19065ea..8eb9c2e 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -10,17 +10,12 @@
 #include <X11/Xlib.h>
 
 #include "windows.h"
+#include "options.h"
 
-extern Display * XT_display;
-extern Screen * XT_screen;
+extern Display * display;
+extern Screen * screen;
 
 
-/* 
- * We try to use a private color map if possible, because Windows programs
- * assume that palette(0) == Black and palette(max-1) == White.
- */
-#undef USE_PRIVATE_MAP
-
 Colormap COLOR_WinColormap = 0;
 
 
@@ -55,10 +50,10 @@
 
     for (i = 0; i < NB_SYS_COLORS; i++)
     {
-	if (XParseColor( XT_display, DefaultColormapOfScreen( XT_screen ),
+	if (XParseColor( display, DefaultColormapOfScreen( screen ),
 			 SysColors[i], &color ))
 	{
-	    if (XAllocColor( XT_display, DefaultColormapOfScreen( XT_screen ), 
+	    if (XAllocColor( display, DefaultColormapOfScreen( screen ), 
 			     &color ))
 		total++;
 	}
@@ -72,8 +67,6 @@
  *
  * Fill the private colormap.
  */
-#ifdef USE_PRIVATE_MAP
-
 static BOOL COLOR_BuildMap( Colormap map, int depth, int size )
 {
     XColor color;
@@ -99,7 +92,7 @@
 		    color.red   = r;
 		    color.green = g;
 		    color.blue  = b;
-		    XStoreColor( XT_display, map, &color );
+		    XStoreColor( display, map, &color );
 		}
     }
     
@@ -107,46 +100,47 @@
 
     for (i = 0; i < NB_SYS_COLORS; i++)
     {
-	if (!XParseColor( XT_display, map, SysColors[i], &color ))
+	if (!XParseColor( display, map, SysColors[i], &color ))
 	    color.red = color.green = color.blue = color.flags = 0;
 	if (i < NB_SYS_COLORS/2) color.pixel = i;
 	else color.pixel = (1 << depth) - NB_SYS_COLORS + i;
-	if (color.pixel < size) XStoreColor( XT_display, map, &color );
+	if (color.pixel < size) XStoreColor( display, map, &color );
     }
     return TRUE;
 }
-#endif  /* USE_PRIVATE_MAP */
+
 
 /***********************************************************************
  *           COLOR_Init
  */
 BOOL COLOR_Init()
 {
-    Visual * visual = DefaultVisual( XT_display, DefaultScreen(XT_display) );
+    Visual * visual = DefaultVisual( display, DefaultScreen(display) );
     
     switch(visual->class)
     {
-      case GrayScale:
-      case PseudoColor:
-      case DirectColor:
-
-#ifdef USE_PRIVATE_MAP
-	COLOR_WinColormap = XCreateColormap( XT_display,
-					     DefaultRootWindow(XT_display),
-					     visual, AllocAll );
-	if (COLOR_WinColormap)
-	    COLOR_BuildMap(COLOR_WinColormap,
-			   DefaultDepth(XT_display, DefaultScreen(XT_display)),
-			   visual->map_entries );
-	else COLOR_FillDefaultMap();
-	break;
-#endif  /* USE_PRIVATE_MAP */
-
-      case StaticGray:
-      case StaticColor:
-      case TrueColor:
+    case GrayScale:
+    case PseudoColor:
+    case DirectColor:
+	if (Options.usePrivateMap)
+	{
+	    COLOR_WinColormap = XCreateColormap( display,
+						 DefaultRootWindow(display),
+						 visual, AllocAll );
+	    if (COLOR_WinColormap)
+	    {
+		COLOR_BuildMap(COLOR_WinColormap,
+			       DefaultDepth(display, DefaultScreen(display)),
+			       visual->map_entries );
+		break;
+	    }
+	}
+	/* Fall through */
+    case StaticGray:
+    case StaticColor:
+    case TrueColor:
 	COLOR_FillDefaultMap();
-	COLOR_WinColormap = DefaultColormapOfScreen( XT_screen );	
+	COLOR_WinColormap = DefaultColormapOfScreen( screen );
 	break;	
     }
     return TRUE;
diff --git a/windows/defwnd.c b/windows/defwnd.c
index dc75bc1..95bb0f0 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -12,12 +12,15 @@
 #include "class.h"
 #include "user.h"
 
-extern Display * display;
-
 extern LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn );
 extern LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params );
 extern LONG NC_HandleNCHitTest( HWND hwnd, POINT pt );
-extern LONG NC_HandleNCMouseMsg(HWND hwnd, WORD msg, WORD wParam, LONG lParam);
+extern LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG NC_HandleNCLButtonUp( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG NC_HandleNCMouseMove( HWND hwnd, WORD wParam, POINT pt );
+extern LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt );
+extern LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam );
 
 
 /***********************************************************************
@@ -28,7 +31,6 @@
     CLASS * classPtr;
     LPSTR textPtr;
     int len;
-    int tempwidth, tempheight;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     
 #ifdef DEBUG_MESSAGE
@@ -63,10 +65,16 @@
 	return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
 
     case WM_NCLBUTTONDOWN:
+	return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
+
     case WM_NCLBUTTONUP:
+	return NC_HandleNCLButtonUp( hwnd, wParam, lParam );
+
     case WM_NCLBUTTONDBLCLK:
+	return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
+
     case WM_NCMOUSEMOVE:
-	return NC_HandleNCMouseMsg( hwnd, msg, wParam, lParam );
+	return NC_HandleNCMouseMove( hwnd, wParam, MAKEPOINT(lParam) );
 
     case WM_NCDESTROY:
 	{
@@ -170,32 +178,18 @@
 					    strlen((LPSTR)lParam) + 1);
 	    textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
 	    strcpy(textPtr, (LPSTR)lParam);
-	    XStoreName( display, wndPtr->window, textPtr );
 	    return (0L);
 	}
+
     case WM_SETCURSOR:
-	if (wndPtr->hCursor != (HCURSOR)NULL)
-	    SetCursor(wndPtr->hCursor);
-	return 0L;
+	if (wndPtr->dwStyle & WS_CHILD)
+	    if (SendMessage(wndPtr->hwndParent, WM_SETCURSOR, wParam, lParam))
+		return TRUE;
+	return NC_HandleSetCursor( hwnd, wParam, lParam );
+
     case WM_SYSCOMMAND:
-	switch (wParam)
-	    {
-	    case SC_CLOSE:
-		ShowWindow(hwnd, SW_MINIMIZE);
-		printf("defdwndproc WM_SYSCOMMAND SC_CLOSE !\n");
-	        return SendMessage( hwnd, WM_CLOSE, 0, 0 );
-	    case SC_RESTORE:
-		ShowWindow(hwnd, SW_RESTORE);
-		break;
-	    case SC_MINIMIZE:
-		ShowWindow(hwnd, SW_MINIMIZE);
-		printf("defdwndproc WM_SYSCOMMAND SC_MINIMIZE !\n");
-		break;
-	    case SC_MAXIMIZE:
-		ShowWindow(hwnd, SW_MAXIMIZE);
-		break;
-	    }
-    	break;    	
+	return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT(lParam) );
+
     case WM_SYSKEYDOWN:
     	if (wParam == VK_MENU) {
     	    printf("VK_MENU Pressed // hMenu=%04X !\n", GetMenu(hwnd));
diff --git a/windows/event.c b/windows/event.c
index b2de49f..ba1c0a3 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -117,7 +117,6 @@
 static void EVENT_FocusIn( HWND hwnd, XFocusChangeEvent *event );
 static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event );
 static void EVENT_Expose( HWND hwnd, XExposeEvent *event );
-static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event );
 
 
 /***********************************************************************
@@ -172,10 +171,6 @@
 	EVENT_Expose( hwnd, (XExposeEvent*)event );
 	break;
 
-    case ConfigureNotify:
-	EVENT_ConfigureNotify( hwnd, (XConfigureEvent*)event );
-	break;
-
 #ifdef DEBUG_EVENT
     default:    
 	printf( "Unprocessed event %s for hwnd %d\n",
@@ -257,6 +252,12 @@
 	   keysym, count, Str[0], Str);
 #endif
 
+    if (wndPtr->dwStyle & WS_DISABLED) {
+	if (event->type == KeyPress) XBell(display, 0);
+	return;
+    }
+
+
     xkey = LOWORD(keysym);
     key_type = HIBYTE(xkey);
     key = LOBYTE(xkey);
@@ -358,6 +359,14 @@
  */
 static void EVENT_MotionNotify( HWND hwnd, XMotionEvent *event )
 {
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr) return;
+    if (wndPtr->dwStyle & WS_DISABLED) {
+        return;
+    }
+
+
     hardware_event( hwnd, WM_MOUSEMOVE,
 		    EVENT_XStateToKeyState( event->state ), 0L,
 		    event->x_root & 0xffff, event->y_root & 0xffff,
@@ -373,6 +382,18 @@
     static WORD messages[NB_BUTTONS] = 
         { WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN };
     int buttonNum = event->button - 1;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr)  { 
+	printf("couldn't find window\n");
+	return;
+    }
+    if (wndPtr->dwStyle & WS_DISABLED) {
+	XBell(display, 0);
+        return;
+    }
+
+	
 
     if (buttonNum >= NB_BUTTONS) return;    
     winHasCursor = event->window;
@@ -391,6 +412,13 @@
     static const WORD messages[NB_BUTTONS] = 
         { WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP };
     int buttonNum = event->button - 1;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr) return;
+    if (wndPtr->dwStyle & WS_DISABLED) {
+        return;
+    } 
+
 
     if (buttonNum >= NB_BUTTONS) return;    
     winHasCursor = event->window;
@@ -401,42 +429,20 @@
 }
 
 
-/***********************************************************************
- *           EVENT_ConfigureNotify
- */
-static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
-{
-    HANDLE handle;
-    NCCALCSIZE_PARAMS *params;	    
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return;
-    wndPtr->rectWindow.left   = event->x;
-    wndPtr->rectWindow.top    = event->y;
-    wndPtr->rectWindow.right  = event->x + event->width;
-    wndPtr->rectWindow.bottom = event->y + event->height;
-
-      /* Send WM_NCCALCSIZE message */
-    handle = GlobalAlloc( GMEM_MOVEABLE, sizeof(*params) );
-    params = (NCCALCSIZE_PARAMS *)GlobalLock( handle );
-    params->rgrc[0] = wndPtr->rectWindow;
-    params->lppos   = NULL;  /* Should be WINDOWPOS struct */
-    SendMessage( hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)params );
-    wndPtr->rectClient = params->rgrc[0];
-    PostMessage( hwnd, WM_MOVE, 0,
-		 MAKELONG( wndPtr->rectClient.left, wndPtr->rectClient.top ));
-    PostMessage( hwnd, WM_SIZE, SIZE_RESTORED,
-		 MAKELONG( wndPtr->rectClient.right-wndPtr->rectClient.left,
-			   wndPtr->rectClient.bottom-wndPtr->rectClient.top) );
-    GlobalUnlock( handle );
-    GlobalFree( handle );
-}
-
-
 /**********************************************************************
  *              EVENT_FocusIn
  */
 static void EVENT_FocusIn( HWND hwnd, XFocusChangeEvent *event )
 {
+
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr) return;
+    if (wndPtr->dwStyle & WS_DISABLED) {
+	return;
+    }
+
+
     PostMessage( hwnd, WM_SETFOCUS, hwnd, 0 );
     hWndFocus = hwnd;
 }
@@ -447,6 +453,14 @@
  */
 static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event )
 {
+
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr) return;
+    if (wndPtr->dwStyle & WS_DISABLED) {
+	return;
+    }
+
     if (hWndFocus)
     {
 	PostMessage( hwnd, WM_KILLFOCUS, hwnd, 0 );
@@ -460,9 +474,20 @@
  */
 static void EVENT_EnterNotify( HWND hwnd, XCrossingEvent *event )
 {
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr) return;
+    if (wndPtr->dwStyle & WS_DISABLED) {
+	return;
+    }
+
     if (captureWnd != 0) return;
     winHasCursor = event->window;
-    PostMessage( hwnd, WM_SETCURSOR, hwnd, 0 );
+      /* Simulate a mouse motion to set the correct cursor */
+    hardware_event( hwnd, WM_MOUSEMOVE,
+		    EVENT_XStateToKeyState( event->state ), 0L,
+		    event->x_root & 0xffff, event->y_root & 0xffff,
+		    event->time, 0 );		    
 }
 
 
diff --git a/windows/graphics.c b/windows/graphics.c
index c5e41b5..1160d3f 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -382,7 +382,7 @@
 
 
 /***********************************************************************
- *           DrawFocusRect    (GDI.466)
+ *           DrawFocusRect    (USER.466)
  */
 void DrawFocusRect( HDC hdc, LPRECT rc )
 {
diff --git a/windows/message.c b/windows/message.c
index 3782a27..b41dbf8 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -196,10 +196,11 @@
  *
  * Translate an mouse hardware event into a real mouse message.
  * Actions performed:
- * - Translate button down messages in double-clicks.
+ * - Translate button-down messages in double-clicks.
  * - Send the WM_NCHITTEST message to find where the cursor is.
  * - Translate the message into a non-client message, or translate
  *   the coordinates to client coordinates.
+ * - Send the WM_SETCURSOR message.
  */
 static void MSG_TranslateMouseMsg( MSG *msg )
 {
@@ -209,6 +210,8 @@
 
     LONG hittest_result = SendMessage( msg->hwnd, WM_NCHITTEST, 0,
 				       MAKELONG( msg->pt.x, msg->pt.y ) );
+    SendMessage( msg->hwnd, WM_SETCURSOR, msg->hwnd,
+		 MAKELONG( hittest_result, msg->message ));
 
     if ((msg->message == WM_LBUTTONDOWN) ||
         (msg->message == WM_RBUTTONDOWN) ||
@@ -697,3 +700,13 @@
     return GlobalAddAtom( str );
 }
 
+
+/***********************************************************************
+ *           GetTickCount    (USER.13)
+ */
+DWORD GetTickCount()
+{
+    struct timeval t;
+    gettimeofday( &t, NULL );
+    return (t.tv_sec * 1000) + (t.tv_usec / 1000);
+}
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 79f5893..d326ab9 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -10,6 +10,35 @@
 #include "sysmetrics.h"
 
 
+static HBITMAP hbitmapClose = 0;
+static HBITMAP hbitmapMinimize = 0;
+static HBITMAP hbitmapMinimizeD = 0;
+static HBITMAP hbitmapMaximize = 0;
+static HBITMAP hbitmapMaximizeD = 0;
+static HBITMAP hbitmapRestore = 0;
+static HBITMAP hbitmapRestoreD = 0;
+
+  /* Hit test code returned when the mouse is captured. */
+  /* Used to direct NC mouse messages to the correct part of the window. */
+static WORD captureHitTest = HTCLIENT; 
+
+  /* Point where the current capture started. Used for SC_SIZE and SC_MOVE. */
+static POINT capturePoint;
+
+  /* Current window rectangle when a move or resize is in progress. */
+static RECT sizingRect;
+
+  /* Some useful macros */
+#define HAS_DLGFRAME(style,exStyle) \
+    (((style) & WS_DLGFRAME) && \
+     (((exStyle) & WS_EX_DLGMODALFRAME) || !((style) & WS_BORDER)))
+
+#define HAS_THICKFRAME(style) \
+    (((style) & WS_THICKFRAME) && \
+     !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
+
+#define HAS_MENU(w)  (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0))
+
 /***********************************************************************
  *           NC_AdjustRect
  *
@@ -18,14 +47,15 @@
  */
 static void NC_AdjustRect( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle )
 {
-    if ((style & WS_DLGFRAME) && 
-	((exStyle & WS_EX_DLGMODALFRAME) || !(style & WS_BORDER)))
+    if (HAS_DLGFRAME( style, exStyle ))
 	InflateRect( rect, SYSMETRICS_CXDLGFRAME, SYSMETRICS_CYDLGFRAME );
-    else if (style & WS_THICKFRAME)
-	InflateRect( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME );
-
-    if (style & WS_BORDER)
-	InflateRect( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER );
+    else
+    {
+	if (HAS_THICKFRAME(style))
+	    InflateRect( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME );
+	if (style & WS_BORDER)
+	    InflateRect( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER );
+    }
 
     if ((style & WS_CAPTION) == WS_CAPTION)
 	rect->top -= SYSMETRICS_CYCAPTION - 1;
@@ -74,14 +104,12 @@
 LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params )
 {
     RECT tmpRect = { 0, 0, 0, 0 };
-    BOOL hasMenu;
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
-    
+    WND *wndPtr = WIN_FindWndPtr( hwnd );    
+
     if (!wndPtr) return 0;
 
-    hasMenu = (!(wndPtr->dwStyle & WS_CHILD)) && (wndPtr->wIDmenu != 0);
-
-    NC_AdjustRect( &tmpRect, wndPtr->dwStyle, hasMenu, wndPtr->dwExStyle );
+    NC_AdjustRect( &tmpRect, wndPtr->dwStyle,
+		   HAS_MENU(wndPtr), wndPtr->dwExStyle );
     
     params->rgrc[0].left   -= tmpRect.left;
     params->rgrc[0].top    -= tmpRect.top;
@@ -92,21 +120,45 @@
 
 
 /***********************************************************************
- *           NC_HandleNCHitTest
+ *           NC_GetInsideRect
  *
- * Handle a WM_NCHITTEST message. Called from DefWindowProc().
+ * Get the 'inside' rectangle of a window, i.e. the whole window rectangle
+ * but without the borders (if any).
+ * The rectangle is in window coordinates (for drawing with GetWindowDC()).
  */
-LONG NC_HandleNCHitTest( HWND hwnd, POINT pt )
+static void NC_GetInsideRect( HWND hwnd, RECT *rect )
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    rect->top    = rect->left = 0;
+    rect->right  = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
+    rect->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
+
+      /* Remove frame from rectangle */
+    if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+	InflateRect( rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME);
+    else
+    {
+	if (HAS_THICKFRAME( wndPtr->dwStyle ))
+	    InflateRect( rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME );
+	if (wndPtr->dwStyle & WS_BORDER)
+	    InflateRect( rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER );
+    }
+}
+
+
+/***********************************************************************
+ *           NC_InternalNCHitTest
+ *
+ * Perform the hit test calculation, but whithout testing the capture
+ * window.
+ */
+static LONG NC_InternalNCHitTest( HWND hwnd, POINT pt )
 {
     RECT rect;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return HTERROR;
 
-#ifdef DEBUG_NONCLIENT
-    printf( "NC_HandleNCHitTest: hwnd=%x pt=%d,%d\n", hwnd, pt.x, pt.y );
-#endif
-
-    if (hwnd == GetCapture()) return HTCLIENT;
     GetWindowRect( hwnd, &rect );
     if (!PtInRect( &rect, pt )) return HTNOWHERE;
     ScreenToClient( hwnd, &pt );
@@ -135,7 +187,7 @@
     }
 
       /* Check menu */
-    if ((!(wndPtr->dwStyle & WS_CHILD)) && (wndPtr->wIDmenu != 0))
+    if (HAS_MENU(wndPtr))
     {
 	rect.top -= SYSMETRICS_CYMENU + 1;
 	if (PtInRect( &rect, pt )) return HTMENU;
@@ -163,9 +215,7 @@
     }
     
       /* Check non-sizing border */
-    if (!(wndPtr->dwStyle & WS_THICKFRAME) ||
-	((wndPtr->dwStyle & (WS_DLGFRAME | WS_BORDER)) == WS_DLGFRAME))
-	return HTBORDER;
+    if (!HAS_THICKFRAME( wndPtr->dwStyle )) return HTBORDER;
 
       /* Check top sizing border */
     if (pt.y < rect.top)
@@ -205,6 +255,86 @@
 
 
 /***********************************************************************
+ *           NC_HandleNCHitTest
+ *
+ * Handle a WM_NCHITTEST message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCHitTest( HWND hwnd, POINT pt )
+{
+#ifdef DEBUG_NONCLIENT
+    printf( "NC_HandleNCHitTest: hwnd=%x pt=%d,%d\n", hwnd, pt.x, pt.y );
+#endif
+    if (hwnd == GetCapture()) return captureHitTest;
+    return NC_InternalNCHitTest( hwnd, pt );
+}
+
+
+/***********************************************************************
+ *           NC_DrawSysButton
+ */
+static void NC_DrawSysButton( HWND hwnd, HDC hdc )
+{
+    RECT rect;
+    BOOL down;
+    HDC hdcMem = CreateCompatibleDC( hdc );
+    if (hdcMem)
+    {
+	NC_GetInsideRect( hwnd, &rect );
+	down = ((GetCapture() == hwnd) && (captureHitTest == HTSYSMENU));
+	SelectObject( hdcMem, hbitmapClose );
+	BitBlt( hdc, rect.left-1, rect.top-1, SYSMETRICS_CXSIZE+1,
+	       SYSMETRICS_CYSIZE+1, hdcMem, 0, 0, down ? NOTSRCCOPY : SRCCOPY);
+	DeleteDC( hdcMem );
+    }
+}
+
+
+/***********************************************************************
+ *           NC_DrawMaxButton
+ */
+static void NC_DrawMaxButton( HWND hwnd, HDC hdc )
+{
+    RECT rect;
+    BOOL down;
+    HDC hdcMem = CreateCompatibleDC( hdc );
+    if (hdcMem)
+    {
+	NC_GetInsideRect( hwnd, &rect );
+	down = ((GetCapture() == hwnd) && (captureHitTest == HTMAXBUTTON));
+	if (IsZoomed(hwnd))
+	    SelectObject( hdcMem, down ? hbitmapRestoreD : hbitmapRestore );
+	else SelectObject( hdcMem, down ? hbitmapMaximizeD : hbitmapMaximize );
+	BitBlt( hdc, rect.right - SYSMETRICS_CXSIZE - 1, rect.top - 1,
+	      SYSMETRICS_CXSIZE+2, SYSMETRICS_CYSIZE+2, hdcMem, 0, 0, SRCCOPY);
+	DeleteDC( hdcMem );
+    }
+}
+
+
+/***********************************************************************
+ *           NC_DrawMinButton
+ */
+static void NC_DrawMinButton( HWND hwnd, HDC hdc )
+{
+    RECT rect;
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+    HDC hdcMem = CreateCompatibleDC( hdc );
+    if (hdcMem)
+    {
+	NC_GetInsideRect( hwnd, &rect );
+	if (wndPtr->dwStyle & WS_MAXIMIZEBOX)
+	    rect.right -= SYSMETRICS_CXSIZE + 1;	
+	if ((GetCapture() == hwnd) && (captureHitTest == HTMINBUTTON))
+	    SelectObject( hdcMem, hbitmapMinimizeD );
+	else SelectObject( hdcMem, hbitmapMinimize );
+	BitBlt( hdc, rect.right - SYSMETRICS_CXSIZE - 1, rect.top - 1,
+	      SYSMETRICS_CXSIZE+2, SYSMETRICS_CYSIZE+2, hdcMem, 0, 0, SRCCOPY);
+	DeleteDC( hdcMem );
+    }
+}
+
+
+/***********************************************************************
  *           NC_DrawFrame
  *
  * Draw a window frame inside the given rectangle, and update the rectangle.
@@ -278,6 +408,36 @@
 
 
 /***********************************************************************
+ *           NC_DrawMovingFrame
+ *
+ * Draw the frame used when moving or resizing window.
+ */
+static void NC_DrawMovingFrame( HWND hwnd, RECT *rect )
+{
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+    HDC hdc = GetDC( 0 );
+
+    if (HAS_THICKFRAME( wndPtr->dwStyle ))
+    {
+	SelectObject( hdc, GetStockObject( GRAY_BRUSH ) );
+	PatBlt( hdc, rect->left, rect->top,
+	        rect->right - rect->left - SYSMETRICS_CXFRAME,
+	        SYSMETRICS_CYFRAME, PATINVERT );
+	PatBlt( hdc, rect->left, rect->top + SYSMETRICS_CYFRAME,
+	        SYSMETRICS_CXFRAME, 
+	        rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
+	PatBlt( hdc, rect->left + SYSMETRICS_CXFRAME, rect->bottom,
+	        rect->right - rect->left - SYSMETRICS_CXFRAME,
+	        -SYSMETRICS_CYFRAME, PATINVERT );
+	PatBlt( hdc, rect->right, rect->top, -SYSMETRICS_CXFRAME, 
+	        rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
+    }
+    else DrawFocusRect( hdc, rect );
+    ReleaseDC( 0, hdc );
+}
+
+
+/***********************************************************************
  *           NC_DrawCaption
  *
  * Draw the window caption.
@@ -285,58 +445,55 @@
  */
 static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, DWORD style )
 {
-    RECT r;
-    HBRUSH hbrushCaption, hbrushButtons;
+    RECT r = *rect;
+    HBRUSH hbrushCaption;
     char buffer[256];
 
-    hbrushButtons = CreateSolidBrush( GetSysColor( COLOR_BTNFACE ) );
+    if (!hbitmapClose)
+    {
+	if (!(hbitmapClose = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
+	    return;
+	hbitmapMinimize  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCE) );
+	hbitmapMinimizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCED) );
+	hbitmapMaximize  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOM) );
+	hbitmapMaximizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOMD) );
+	hbitmapRestore   = LoadBitmap( 0, MAKEINTRESOURCE(OBM_RESTORE) );
+	hbitmapRestoreD  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_RESTORED) );
+    }
+    
     hbrushCaption = CreateSolidBrush( GetSysColor( COLOR_ACTIVECAPTION ) );
 
-    MoveTo( hdc, rect->left, rect->bottom );
-    LineTo( hdc, rect->right-1, rect->bottom );
+    MoveTo( hdc, r.left, r.bottom );
+    LineTo( hdc, r.right-1, r.bottom );
 
-    /* We should probably use OEM bitmaps (OBM_*) here */
     if (style & WS_SYSMENU)
     {
-	r = *rect;
-	r.right = r.left + SYSMETRICS_CYSIZE;
-	FillRect( hdc, &r, hbrushButtons );
-	MoveTo( hdc, r.right, r.top );
-	LineTo( hdc, r.right, r.bottom );
-	rect->left += SYSMETRICS_CXSIZE + 1;
+	NC_DrawSysButton( hwnd, hdc );
+	r.left += SYSMETRICS_CXSIZE + 1;
+	MoveTo( hdc, r.left - 1, r.top );
+	LineTo( hdc, r.left - 1, r.bottom );
     }
     if (style & WS_MAXIMIZEBOX)
     {
-	r = *rect;
-	r.left = r.right - SYSMETRICS_CXSIZE;
-	FillRect( hdc, &r, hbrushButtons );
-	MoveTo( hdc, r.left-1, r.top );
-	LineTo( hdc, r.left-1, r.bottom );
-	DrawReliefRect( hdc, r, 2, 0 );
-	rect->right -= SYSMETRICS_CXSIZE + 1;
+	NC_DrawMaxButton( hwnd, hdc );
+	r.right -= SYSMETRICS_CXSIZE + 1;
     }
     if (style & WS_MINIMIZEBOX)
     {
-	r = *rect;
-	r.left = r.right - SYSMETRICS_CXSIZE;
-	FillRect( hdc, &r, hbrushButtons );
-	MoveTo( hdc, r.left-1, r.top );
-	LineTo( hdc, r.left-1, r.bottom );
-	DrawReliefRect( hdc, r, 2, 0 );
-	rect->right -= SYSMETRICS_CXSIZE + 1;
+	NC_DrawMinButton( hwnd, hdc );
+	r.right -= SYSMETRICS_CXSIZE + 1;
     }
 
-    FillRect( hdc, rect, hbrushCaption );
+    FillRect( hdc, &r, hbrushCaption );
 
     if (GetWindowText( hwnd, buffer, 256 ))
     {
 	SetTextColor( hdc, GetSysColor( COLOR_CAPTIONTEXT ) );
 	SetBkMode( hdc, TRANSPARENT );
-	DrawText( hdc, buffer, -1, rect,
+	DrawText( hdc, buffer, -1, &r,
 		 DT_SINGLELINE | DT_CENTER | DT_VCENTER );
     }
 
-    DeleteObject( hbrushButtons );
     DeleteObject( hbrushCaption );
 }
 
@@ -443,19 +600,359 @@
 
 
 /***********************************************************************
- *           NC_HandleNCMouseMsg
+ *           NC_HandleNCLButtonDown
  *
- * Handle a non-client mouse message. Called from DefWindowProc().
+ * Handle a WM_NCLBUTTONDOWN message. Called from DefWindowProc().
  */
-LONG NC_HandleNCMouseMsg( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam )
 {
-    switch(wParam)  /* Hit test code */
+    HDC hdc = GetWindowDC( hwnd );
+
+    switch(wParam)  /* Hit test */
     {
+    case HTCAPTION:
+	if (GetCapture() != hwnd)
+	    SendMessage( hwnd, WM_SYSCOMMAND, SC_MOVE, lParam );
+	break;
+
     case HTSYSMENU:
-	if (msg == WM_NCLBUTTONDBLCLK)
-	    return SendMessage( hwnd, WM_SYSCOMMAND, SC_CLOSE, lParam );
+	captureHitTest = wParam;
+	SetCapture( hwnd );
+	NC_DrawSysButton( hwnd, hdc );
+	break;
+
+    case HTMENU:
+	break;
+
+    case HTHSCROLL:
+	if (GetCapture() != hwnd)
+	    SendMessage( hwnd, WM_SYSCOMMAND, SC_HSCROLL, lParam );
+	break;
+
+    case HTVSCROLL:
+	if (GetCapture() != hwnd)
+	    SendMessage( hwnd, WM_SYSCOMMAND, SC_VSCROLL, lParam );
+	break;
+
+    case HTMINBUTTON:
+	captureHitTest = wParam;
+	SetCapture( hwnd );
+	NC_DrawMinButton( hwnd, hdc );
+	break;
+
+    case HTMAXBUTTON:
+	captureHitTest = wParam;
+	SetCapture( hwnd );
+	NC_DrawMaxButton( hwnd, hdc );
+	break;
+
+    case HTLEFT:
+    case HTRIGHT:
+    case HTTOP:
+    case HTTOPLEFT:
+    case HTTOPRIGHT:
+    case HTBOTTOM:
+    case HTBOTTOMLEFT:
+    case HTBOTTOMRIGHT:
+	if (GetCapture() != hwnd)
+	    SendMessage( hwnd, WM_SYSCOMMAND,
+			 SC_SIZE + wParam - HTLEFT + 1, lParam );
+	break;
+
+    case HTBORDER:
+	break;
+    }
+
+    ReleaseDC( hwnd, hdc );
+    return 0;
+}
+
+
+/***********************************************************************
+ *           NC_HandleNCLButtonUp
+ *
+ * Handle a WM_NCLBUTTONUP message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCLButtonUp( HWND hwnd, WORD wParam, LONG lParam )
+{
+    HDC hdc;
+    WORD hittest;
+
+    if (hwnd != GetCapture()) return 0;
+
+    ReleaseCapture();
+    captureHitTest = HTCLIENT;
+    hdc = GetWindowDC( hwnd );
+    hittest = NC_InternalNCHitTest( hwnd, MAKEPOINT(lParam) );
+
+    switch(wParam)  /* Hit test */
+    {
+    case HTCAPTION:  /* End of window moving */
+	NC_DrawMovingFrame( hwnd, &sizingRect );
+	SetWindowPos( hwnd, 0, sizingRect.left, sizingRect.top, 0, 0,
+		      SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER );
+	break;
+
+    case HTSYSMENU:
+	NC_DrawSysButton( hwnd, hdc );
+	break;
+
+    case HTMENU:
+    case HTHSCROLL:
+    case HTVSCROLL:
+	break;
+
+    case HTMINBUTTON:
+	NC_DrawMinButton( hwnd, hdc );
+	if (hittest == HTMINBUTTON)
+	    SendMessage( hwnd, WM_SYSCOMMAND, SC_MINIMIZE, lParam );
+	break;
+
+    case HTMAXBUTTON:
+	NC_DrawMaxButton( hwnd, hdc );
+	if (hittest == HTMAXBUTTON)
+	{
+	    if (IsZoomed(hwnd))
+		SendMessage( hwnd, WM_SYSCOMMAND, SC_RESTORE, lParam );
+	    else SendMessage( hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, lParam );
+	}
+	break;
+
+    case HTLEFT:
+    case HTRIGHT:
+    case HTTOP:
+    case HTTOPLEFT:
+    case HTTOPRIGHT:
+    case HTBOTTOM:
+    case HTBOTTOMLEFT:
+    case HTBOTTOMRIGHT:  /* End of window resizing */
+	NC_DrawMovingFrame( hwnd, &sizingRect );
+	SetWindowPos( hwnd, 0, sizingRect.left, sizingRect.top,
+		      sizingRect.right - sizingRect.left,
+		      sizingRect.bottom - sizingRect.top,
+		      SWP_NOACTIVATE | SWP_NOZORDER );
+	break;
+
+    case HTBORDER:
+	    break;
+    }
+    ReleaseDC( hwnd, hdc );
+    return 0;
+}
+
+
+/***********************************************************************
+ *           NC_HandleNCLButtonDblClk
+ *
+ * Handle a WM_NCLBUTTONDBLCLK message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam )
+{
+    switch(wParam)  /* Hit test */
+    {
+    case HTCAPTION:
+	SendMessage( hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, lParam );
+	break;
+
+    case HTSYSMENU:
+	SendMessage( hwnd, WM_SYSCOMMAND, SC_CLOSE, lParam );
 	break;
     }
     return 0;
 }
 
+
+/***********************************************************************
+ *           NC_HandleNCMouseMove
+ *
+ * Handle a WM_NCMOUSEMOVE message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCMouseMove( HWND hwnd, WORD wParam, POINT pt )
+{
+    RECT newRect;
+
+    if (hwnd != GetCapture()) return 0;
+    newRect = sizingRect;
+
+    switch(wParam)  /* Hit test */
+    {
+    case HTCAPTION:
+	OffsetRect( &newRect, pt.x - capturePoint.x, pt.y - capturePoint.y);
+	break;
+
+    case HTLEFT:
+	newRect.left += pt.x - capturePoint.x;
+	break;
+
+    case HTRIGHT:
+	newRect.right += pt.x - capturePoint.x;
+	break;
+
+    case HTTOP:
+	newRect.top += pt.y - capturePoint.y;
+	break;
+
+    case HTTOPLEFT:
+	newRect.left += pt.x - capturePoint.x;
+	newRect.top  += pt.y - capturePoint.y;
+	break;
+
+    case HTTOPRIGHT:
+	newRect.right += pt.x - capturePoint.x;
+	newRect.top   += pt.y - capturePoint.y;
+	break;
+
+    case HTBOTTOM:
+	newRect.bottom += pt.y - capturePoint.y;
+	break;
+
+    case HTBOTTOMLEFT:
+	newRect.left   += pt.x - capturePoint.x;
+	newRect.bottom += pt.y - capturePoint.y;
+	break;
+
+    case HTBOTTOMRIGHT:
+	newRect.right  += pt.x - capturePoint.x;
+	newRect.bottom += pt.y - capturePoint.y;
+	break;
+ 
+    default:
+	return 0;  /* Nothing to do */
+   }
+
+    NC_DrawMovingFrame( hwnd, &sizingRect );
+    NC_DrawMovingFrame( hwnd, &newRect );
+    capturePoint = pt;
+    sizingRect = newRect;
+
+    return 0;
+}
+
+
+/***********************************************************************
+ *           NC_HandleSysCommand
+ *
+ * Handle a WM_SYSCOMMAND message. Called from DefWindowProc().
+ */
+LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt )
+{
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+#ifdef DEBUG_NONCLIENT
+    printf( "Handling WM_SYSCOMMAND %x %d,%d\n", wParam, pt.x, pt.y );
+#endif
+
+    switch (wParam & 0xfff0)
+    {
+    case SC_SIZE:
+	if (!HAS_THICKFRAME(wndPtr->dwStyle)) break;
+	if (IsZoomed(hwnd) || IsIconic(hwnd)) break;
+	if (wParam & 0x0f) captureHitTest = (wParam & 0x0f) + HTLEFT - 1;
+	else captureHitTest = HTBORDER;
+	capturePoint = pt;
+	SetCapture( hwnd );
+	GetWindowRect( hwnd, &sizingRect );
+	NC_DrawMovingFrame( hwnd, &sizingRect );
+	break;
+
+    case SC_MOVE:
+	if (!(wndPtr->dwStyle & WS_CAPTION)) break;
+	if (IsZoomed(hwnd) || IsIconic(hwnd)) break;
+	captureHitTest = HTCAPTION;
+	capturePoint = pt;
+	SetCapture( hwnd );
+	GetWindowRect( hwnd, &sizingRect );
+	NC_DrawMovingFrame( hwnd, &sizingRect );
+	break;
+
+    case SC_MINIMIZE:
+	ShowWindow( hwnd, SW_MINIMIZE );
+	break;
+
+    case SC_MAXIMIZE:
+	ShowWindow( hwnd, SW_MAXIMIZE );
+	break;
+
+    case SC_RESTORE:
+	ShowWindow( hwnd, SW_RESTORE );
+	break;
+
+    case SC_NEXTWINDOW:
+    case SC_PREVWINDOW:
+	break;
+
+    case SC_CLOSE:
+	return SendMessage( hwnd, WM_CLOSE, 0, 0 );
+
+    case SC_VSCROLL:
+    case SC_HSCROLL:
+    case SC_MOUSEMENU:
+    case SC_KEYMENU:
+    case SC_ARRANGE:
+	break;
+
+    case SC_TASKLIST:
+    case SC_SCREENSAVE:
+    case SC_HOTKEY:
+	break;
+    }
+    return 0;
+}
+
+
+/***********************************************************************
+ *           NC_HandleSetCursor
+ *
+ * Handle a WM_SETCURSOR message. Called from DefWindowProc().
+ */
+LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam )
+{
+    if (hwnd != wParam) return 0;  /* Don't set the cursor for child windows */
+
+    switch(LOWORD(lParam))
+    {
+    case HTERROR:
+	{
+	    WORD msg = HIWORD( lParam );
+	    if ((msg == WM_LBUTTONDOWN) || (msg == WM_MBUTTONDOWN) ||
+		(msg == WM_RBUTTONDOWN))
+		MessageBeep(0);
+	}
+	break;
+
+    case HTCLIENT:
+	{
+	    WND *wndPtr = WIN_FindWndPtr( hwnd );
+	    if (wndPtr && wndPtr->hCursor)
+	    {
+		SetCursor( wndPtr->hCursor );
+		return TRUE;
+	    }
+	}
+	break;
+
+    case HTLEFT:
+    case HTRIGHT:
+	SetCursor( LoadCursor( 0, IDC_SIZEWE ) );
+	return TRUE;
+
+    case HTTOP:
+    case HTBOTTOM:
+	SetCursor( LoadCursor( 0, IDC_SIZENS ) );
+	return TRUE;
+
+    case HTTOPLEFT:
+    case HTBOTTOMRIGHT:	
+	SetCursor( LoadCursor( 0, IDC_SIZENWSE ) );
+	return TRUE;
+
+    case HTTOPRIGHT:
+    case HTBOTTOMLEFT:
+	SetCursor( LoadCursor( 0, IDC_SIZENESW ) );
+	return TRUE;
+    }
+
+    /* Default cursor: arrow */
+    SetCursor( LoadCursor( 0, IDC_ARROW ) );
+    return TRUE;
+}
diff --git a/windows/painting.c b/windows/painting.c
index 2aeaba2..c218e23 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -33,13 +33,14 @@
 
     if (wndPtr->hrgnUpdate)
     {
-	DeleteObject( wndPtr->hrgnUpdate );
 	wndPtr->hrgnUpdate = 0;
 	MSG_DecPaintCount( wndPtr->hmemTaskQ );
     }
     wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
 
     SendMessage( hwnd, WM_NCPAINT, hrgnUpdate, 0 );
+    if (hrgnUpdate) DeleteObject( hrgnUpdate );
+
     if (!(wndPtr->flags & WIN_ERASE_UPDATERGN)) lps->fErase = TRUE;
     else lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
     
diff --git a/windows/win.c b/windows/win.c
index 810503c..95730dd 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -22,7 +22,7 @@
 
 extern void EVENT_RegisterWindow( Window w, HWND hwnd );  /* event.c */
 
-static HWND firstWindow = 0;
+HWND firstWindow = 0;
 
 /***********************************************************************
  *           WIN_FindWndPtr
@@ -240,6 +240,11 @@
     wndPtr->rectWindow.right  = x + width;
     wndPtr->rectWindow.bottom = y + height;
     wndPtr->rectClient        = wndPtr->rectWindow;
+    wndPtr->rectNormal        = wndPtr->rectWindow;
+    wndPtr->ptIconPos.x       = -1;
+    wndPtr->ptIconPos.y       = -1;
+    wndPtr->ptMaxPos.x        = -1;
+    wndPtr->ptMaxPos.y        = -1;
     wndPtr->hmemTaskQ         = GetTaskQueue(0);
     wndPtr->hrgnUpdate        = 0;
     wndPtr->hwndLastActive    = 0;
@@ -281,10 +286,9 @@
       /* Create the X window */
 
     win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
-	                  PointerMotionMask | ButtonPressMask |
-			  ButtonReleaseMask | StructureNotifyMask |
-			  FocusChangeMask | EnterWindowMask;
-    win_attr.override_redirect = /*True*/ False;
+	                 PointerMotionMask | ButtonPressMask |
+			 ButtonReleaseMask | FocusChangeMask | EnterWindowMask;
+    win_attr.override_redirect = True;
     win_attr.colormap = COLOR_WinColormap;
     if (style & WS_CHILD)
     {
@@ -360,12 +364,14 @@
 
       /* Create scrollbars */
 
+#if 0
     if (windowName != NULL) SetWindowText(hwnd, windowName);
     if ((style & WS_CAPTION) == WS_CAPTION) {
 	wndPtr->hWndCaption = CreateWindow("CAPTION", "",
 		WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
 		0, -20, width, 20, hwnd, 1, instance, 0L);
 	}
+#endif
     if (((style & WS_CHILD) != WS_CHILD) && (wndPtr->wIDmenu != 0)) {
 	lpbar = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
 	if (lpbar != NULL) {
@@ -434,6 +440,7 @@
 
       /* Destroy the window */
 
+    wndPtr->dwMagic = 0;  /* Mark it as invalid */
     XDestroyWindow( display, wndPtr->window );
     if (wndPtr->flags & WIN_OWN_DC) DCE_FreeDCE( wndPtr->hdce );
     classPtr->cWindows--;
@@ -555,6 +562,86 @@
 }
 
 
+
+/*******************************************************************
+ *    WIN_SetSensitive
+ * 
+ *      sets hWnd and all children to the same sensitivity
+ * 
+ *      sets hWnd sensitive and then calls SetSensitive on hWnd's child
+ *      and all of hWnd's child's Next windows 
+ */
+static BOOL WIN_SetSensitive(HWND hWnd, BOOL fEnable)
+{
+    WND *wndPtr;
+    HWND hwnd;
+
+    printf("in SetSenitive\n");
+
+    if (!hWnd) return 0;
+    if (!(wndPtr = WIN_FindWndPtr(hWnd))) return 0;
+
+	
+    if (fEnable) {
+        wndPtr->dwStyle &= ~WS_DISABLED;
+     } else {
+        wndPtr->dwStyle |= WS_DISABLED;
+     }
+  
+    hwnd=wndPtr->hwndChild;
+    while (hwnd) {					/* mk next child sens */
+        WIN_SetSensitive(hwnd, fEnable); 
+        if ( !(wndPtr=WIN_FindWndPtr(hwnd)) ) return 0;
+	hwnd=wndPtr->hwndNext;
+    }
+    return 1;
+
+}
+
+/*******************************************************************
+ *           EnableWindow   (USER.34)
+ * 
+ *
+ */
+
+BOOL EnableWindow(HWND hWnd, BOOL fEnable)
+{
+    WND *wndPtr;
+    int eprev;
+   
+    if (hWnd == 0) return 0;
+    
+    wndPtr = WIN_FindWndPtr(hWnd);
+    if (wndPtr == 0) return 0;
+
+    eprev = ! (wndPtr->dwStyle & WS_DISABLED);
+
+    if (fEnable != eprev) {                        /* change req */
+        printf("changing window\n");
+        WIN_SetSensitive(hWnd, fEnable); 
+        SendMessage(hWnd, WM_ENABLE, (WORD)fEnable, 0);  
+    }
+    return !eprev;
+}
+
+/***********************************************************************
+ *           IsWindowEnabled   (USER.35)
+ */
+ 
+BOOL IsWindowEnabled(HWND hWnd)
+{
+    WND * wndPtr; 
+
+    if (hWnd == 0) return 0;
+    wndPtr = WIN_FindWndPtr(hWnd);
+    if (wndPtr == 0) return 0;
+
+    return !(wndPtr->dwStyle & WS_DISABLED);
+}
+
+
+
+
 /**********************************************************************
  *	     GetWindowLong    (USER.135)
  */
diff --git a/windows/winpos.c b/windows/winpos.c
index 884f411..ad23161 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -60,6 +60,44 @@
 
 
 /*******************************************************************
+ *         WindowFromPoint   (USER.30)
+ */
+HWND WindowFromPoint( POINT pt )
+{
+    RECT rect;
+    HWND hwnd = firstWindow;
+    while (hwnd)
+    {
+	GetWindowRect( hwnd, &rect );
+	if (PtInRect( &rect, pt )) return hwnd;
+	hwnd = GetWindow( hwnd, GW_HWNDNEXT );
+    }
+    return 0;
+}
+
+
+/*******************************************************************
+ *         ChildWindowFromPoint   (USER.191)
+ */
+HWND ChildWindowFromPoint( HWND hwndParent, POINT pt )
+{
+    RECT rect;
+    HWND hwnd;
+    
+    GetWindowRect( hwndParent, &rect );
+    if (!PtInRect( &rect, pt )) return 0;
+    hwnd = GetTopWindow( hwndParent );
+    while (hwnd)
+    {
+	GetWindowRect( hwnd, &rect );
+	if (PtInRect( &rect, pt )) return hwnd;
+	hwnd = GetWindow( hwnd, GW_HWNDNEXT );
+    }
+    return 0;
+}
+
+
+/*******************************************************************
  *         MapWindowPoints   (USER.258)
  */
 void MapWindowPoints( HWND hwndFrom, HWND hwndTo, LPPOINT lppt, WORD count )
@@ -119,6 +157,15 @@
 
 
 /***********************************************************************
+ *           BringWindowToTop   (USER.45)
+ */
+BOOL BringWindowToTop( HWND hwnd )
+{
+    return SetWindowPos( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
+}
+
+
+/***********************************************************************
  *           MoveWindow   (USER.56)
  */
 BOOL MoveWindow( HWND hwnd, short x, short y, short cx, short cy, BOOL repaint)
@@ -196,6 +243,75 @@
 
 
 /***********************************************************************
+ *           GetInternalWindowPos   (USER.460)
+ */
+WORD GetInternalWindowPos( HWND hwnd, LPRECT rectWnd, LPPOINT ptIcon )
+{
+    WINDOWPLACEMENT wndpl;
+    if (!GetWindowPlacement( hwnd, &wndpl )) return 0;
+    if (rectWnd) *rectWnd = wndpl.rcNormalPosition;
+    if (ptIcon)  *ptIcon = wndpl.ptMinPosition;
+    return wndpl.showCmd;
+}
+
+
+/***********************************************************************
+ *           SetInternalWindowPos   (USER.461)
+ */
+void SetInternalWindowPos( HWND hwnd, WORD showCmd, LPRECT rect, LPPOINT pt )
+{
+    WINDOWPLACEMENT wndpl;
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+    wndpl.length  = sizeof(wndpl);
+    wndpl.flags   = (pt != NULL) ? WPF_SETMINPOSITION : 0;
+    wndpl.showCmd = showCmd;
+    if (pt) wndpl.ptMinPosition = *pt;
+    wndpl.rcNormalPosition = (rect != NULL) ? *rect : wndPtr->rectNormal;
+    wndpl.ptMaxPosition = wndPtr->ptMaxPos;
+    SetWindowPlacement( hwnd, &wndpl );
+}
+
+
+/***********************************************************************
+ *           GetWindowPlacement   (USER.370)
+ */
+BOOL GetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
+{
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr) return FALSE;
+
+    wndpl->length  = sizeof(*wndpl);
+    wndpl->flags   = 0;
+    wndpl->showCmd = IsZoomed(hwnd) ? SW_SHOWMAXIMIZED : 
+	             (IsIconic(hwnd) ? SW_SHOWMINIMIZED : SW_SHOWNORMAL);
+    wndpl->ptMinPosition = wndPtr->ptIconPos;
+    wndpl->ptMaxPosition = wndPtr->ptMaxPos;
+    wndpl->rcNormalPosition = wndPtr->rectNormal;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           SetWindowPlacement   (USER.371)
+ */
+BOOL SetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
+{
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr) return FALSE;
+
+    if (wndpl->flags & WPF_SETMINPOSITION)
+	wndPtr->ptIconPos = wndpl->ptMinPosition;
+    if ((wndpl->flags & WPF_RESTORETOMAXIMIZED) &&
+	(wndpl->showCmd == SW_SHOWMINIMIZED)) wndPtr->flags |= WIN_RESTORE_MAX;
+    wndPtr->ptMaxPos   = wndpl->ptMaxPosition;
+    wndPtr->rectNormal = wndpl->rcNormalPosition;
+    ShowWindow( hwnd, wndpl->showCmd );
+    return TRUE;
+}
+
+
+/***********************************************************************
  *           SetWindowPos   (USER.232)
  */
 /* Unimplemented flags: SWP_NOREDRAW, SWP_NOACTIVATE
