Release 0.4.10

Mon Nov 22 13:58:56 1993  David Metcalfe <david@prism.demon.co.uk>

        * [windows/scroll.c]
	Preliminary implementations of ScrollWindow, ScrollDC and
        ScrollWindowEx.

Nov 21, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [controls/listbox.c]
	Optimization of redraw during 'Add' or 'Insert'.

	* [controls/scroll.c]
	Optimization of WM_PAINT during 'thumbtracking'.

	* [controls/button.c]
	Add of beta implement of 'BS_OWNERDRAW'

	* [controls/static.c]
	Style 'SS_ICON' new supported.

	* [misc/message.c]
	Begin of implemantation of MB_XXX styles.

	* [loader/resource.c]
	Function LoadIcon() : now prepare transparency Bitmap mask.
	Function LoadCursor() : now prepare a 'X pixmapcursor'.
	New function SetCursor() : not finished.
	New function ShowCursor() : not finished.
	New function AccessResource() : stub.

	* [obj/dib.c]
	Function DrawIcon(): deugging phase of icon transparency mask.

	* [loader/library.c]
	new file for news functions LoadLibrary() & FreeLibrary().

	* [sysres.dll]
	Resources only 16bits DLL for System Resources, icons, etc...

Sun Nov 14 14:39:06 1993  julliard@di.epfl.ch (Alexandre Julliard)

	* [include/dialog.h] [windows/dialog.c]
	Simplified dialog template parsing.
	Implemented DialogBoxIndirect().

	* [windows/win.c]
	Fixed bug in CreateWindow() when aborting window creation.
	Modified UpdateWindow() to only update visible windows.
	Implemented IsWindow().

Nov 14, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [controls/listbox.c]
	Listbox control window : new messages.

	* [controls/combo.c]
	Combo box control window : new messages.

	* [misc/message.c]
	Moved stub MessageBox() to this new file.
	Implemented of a callback, now MessageBox show a window.

	* [loader/resource.c]
	New function DestroyIcon()
	New function DestroyCursor()
	Filled stub LoadIcon()
	Filled stub LoadCursor()
	Bug fixed in FindResourceByName() : missing lseek().

	* [obj/dib.c]
	New function DrawIcon()

	* [windows/win.c]
	New function CloseWindow()
	New function OpenIcon()
	New function IsIconic()
	New Function FindWindow()

Sun Nov 14 08:27:19 1993  Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de)

	* [loader/selector.c]
	Wrote AllocCStoDSAlias() and AllocDStoCSAlias()

Sun Nov 14 08:27:19 1993  Bob Amstadt  (bob at amscons)

	* [loader/selector.c]
	Wrote AllocSelector() and PrestoChangoSelector().  YUK!

Sat Nov 13 13:56:42 1993  Bob Amstadt  (bob at amscons)

	* [loader/resource.c]
	Wrote FindResource(), LoadResource(), LockResource(),
	and FreeResource()

	* [include/segmem.h] [loader/selector.c] [loader/signal.h]
	Changed selector allocation method.

Sun Nov 10 08:27:19 1993  Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de)

	* [if1632/callback.c if1632/call.S if1632/user.spec] 
	added Catch (KERNEL.55) and Throw (KERNEL.56)
	
Nov 7, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [controls/scroll.c]
	Scroll bar control window
		Bug resolved : Painting message before scroll visible.

	* [controls/listbox.c]
	Listbox control window
		Destroy cleanup.

	* [controls/combo.c]
	Combo box control window
		Destroy cleanup.

	* [controls/button.c]
		GetCheck Message now return is state.

	* [windows/win.c]
	New function IsWindowVisible()
diff --git a/ChangeLog b/ChangeLog
index 086760b..ebf46f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,126 @@
+Mon Nov 22 13:58:56 1993  David Metcalfe <david@prism.demon.co.uk>
+
+        * [windows/scroll.c]
+	Preliminary implementations of ScrollWindow, ScrollDC and
+        ScrollWindowEx.
+
+Nov 21, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [controls/listbox.c]
+	Optimization of redraw during 'Add' or 'Insert'.
+
+	* [controls/scroll.c]
+	Optimization of WM_PAINT during 'thumbtracking'.
+
+	* [controls/button.c]
+	Add of beta implement of 'BS_OWNERDRAW'
+
+	* [controls/static.c]
+	Style 'SS_ICON' new supported.
+
+	* [misc/message.c]
+	Begin of implemantation of MB_XXX styles.
+
+	* [loader/resource.c]
+	Function LoadIcon() : now prepare transparency Bitmap mask.
+	Function LoadCursor() : now prepare a 'X pixmapcursor'.
+	New function SetCursor() : not finished.
+	New function ShowCursor() : not finished.
+	New function AccessResource() : stub.
+
+	* [obj/dib.c]
+	Function DrawIcon(): deugging phase of icon transparency mask.
+
+	* [loader/library.c]
+	new file for news functions LoadLibrary() & FreeLibrary().
+
+	* [sysres.dll]
+	Resources only 16bits DLL for System Resources, icons, etc...
+
+----------------------------------------------------------------------
+Sun Nov 14 14:39:06 1993  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [include/dialog.h] [windows/dialog.c]
+	Simplified dialog template parsing.
+	Implemented DialogBoxIndirect().
+
+	* [windows/win.c]
+	Fixed bug in CreateWindow() when aborting window creation.
+	Modified UpdateWindow() to only update visible windows.
+	Implemented IsWindow().
+
+Nov 14, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [controls/listbox.c]
+	Listbox control window : new messages.
+
+	* [controls/combo.c]
+	Combo box control window : new messages.
+
+	* [misc/message.c]
+	Moved stub MessageBox() to this new file.
+	Implemented of a callback, now MessageBox show a window.
+
+	* [loader/resource.c]
+	New function DestroyIcon()
+	New function DestroyCursor()
+	Filled stub LoadIcon()
+	Filled stub LoadCursor()
+	Bug fixed in FindResourceByName() : missing lseek().
+
+	* [obj/dib.c]
+	New function DrawIcon()
+
+	* [windows/win.c]
+	New function CloseWindow()
+	New function OpenIcon()
+	New function IsIconic()
+	New Function FindWindow()
+
+Sun Nov 14 08:27:19 1993  Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de)
+
+	* [loader/selector.c]
+	Wrote AllocCStoDSAlias() and AllocDStoCSAlias()
+
+Sun Nov 14 08:27:19 1993  Bob Amstadt  (bob at amscons)
+
+	* [loader/selector.c]
+	Wrote AllocSelector() and PrestoChangoSelector().  YUK!
+
+Sat Nov 13 13:56:42 1993  Bob Amstadt  (bob at amscons)
+
+	* [loader/resource.c]
+	Wrote FindResource(), LoadResource(), LockResource(),
+	and FreeResource()
+
+	* [include/segmem.h] [loader/selector.c] [loader/signal.h]
+	Changed selector allocation method.
+
+Sun Nov 10 08:27:19 1993  Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de)
+
+	* [if1632/callback.c if1632/call.S if1632/user.spec] 
+	added Catch (KERNEL.55) and Throw (KERNEL.56)
+	
+Nov 7, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [controls/scroll.c]
+	Scroll bar control window
+		Bug resolved : Painting message before scroll visible.
+
+	* [controls/listbox.c]
+	Listbox control window
+		Destroy cleanup.
+
+	* [controls/combo.c]
+	Combo box control window
+		Destroy cleanup.
+
+	* [controls/button.c]
+		GetCheck Message now return is state.
+
+	* [windows/win.c]
+	New function IsWindowVisible()
+
 Mon Nov  1 14:40:21 1993  julliard@di.epfl.ch (Alexandre Julliard)
 
 	* [if1632/user.spec]
diff --git a/Makefile b/Makefile
index 8b508d9..11a884a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 ######################################################################
 # These variables are inherited by the sub-makefiles
-DEBUGOPTS=-DDEBUG_RESOURCE
+DEBUGOPTS=
 COPTS=-O2 -m486
 INCLUDE_DIR=include
 LDFLAGS=
diff --git a/README b/README
index 9e326d6..ba0b81b 100644
--- a/README
+++ b/README
@@ -31,6 +31,19 @@
 Have a nice game of solitaire, but be careful.  Emulation isn't perfect.
 So, occassionally it will crash.
 
+WHAT'S NEW with version 0.4.10: (see ChangeLog for details)
+	- Bug fixes
+	- More scroll bar functions
+	- More icon and cursor handling
+
+WHAT'S NEW with version 0.4.9: (see ChangeLog for details)
+	- Bug fixes
+	- real MessageBox()
+	- New resource functions
+	- Icon functions
+	- Selector manipulation functions
+	- Catch()/Throw()
+
 WHAT'S NEW with version 0.4.7: (see ChangeLog for details)
 	- More dialog box functions
 	- More DOS interrupts
diff --git a/controls/button.c b/controls/button.c
index 1a13b9d..aad2aa1 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -9,6 +9,7 @@
 
 #include <windows.h>
 #include "win.h"
+#include "user.h"
 
 LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
 
@@ -48,6 +49,10 @@
 static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
 static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
 static LONG UB_KillFocus(HWND hWnd);
+static LONG OB_Paint(HWND hWnd);
+static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
+static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
+static LONG OB_KillFocus(HWND hWnd);
 
 typedef struct
 {
@@ -60,7 +65,7 @@
     LONG (*getCheckfn)();
 } BTNFN;
 
-#define MAX_BTN_TYPE  10
+#define MAX_BTN_TYPE  12
 
 static BTNFN btnfn[MAX_BTN_TYPE] =
 {
@@ -153,7 +158,25 @@
 	(LONG(*)())RB_KillFocus,
 	(LONG(*)())RB_SetCheck,
 	(LONG(*)())RB_GetCheck
-    }
+    },
+    {
+	(LONG(*)())NULL,                           /* Not defined */
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL
+    },
+    { 
+	(LONG(*)())OB_Paint,                       /* BS_OWNERDRAW */
+	(LONG(*)())OB_LButtonDown,
+	(LONG(*)())OB_LButtonUp,
+	(LONG(*)())NULL,
+	(LONG(*)())OB_KillFocus,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL
+    },
 };
 
 
@@ -239,7 +262,7 @@
 
 	case BM_GETCHECK:
 		if (btnfn[style].getCheckfn)
-		    (btnfn[style].getCheckfn)(hWnd);
+		    return (btnfn[style].getCheckfn)(hWnd);
 		break;
 
 	default:
@@ -954,3 +977,91 @@
     UpdateWindow(hWnd);
 }
 
+
+/**********************************************************************
+ *       Ownerdrawn Button Functions
+ */
+
+static LONG OB_Paint(HWND hWnd)
+{
+    PAINTSTRUCT ps;
+    HDC 	hDC;
+    RECT 	rc;
+    HANDLE	hDis;
+    LPDRAWITEMSTRUCT lpdis;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+    hDC = BeginPaint(hWnd, &ps);
+    GetClientRect(hWnd, &rc);
+    hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
+    lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
+    lpdis->hDC = hDC;
+    lpdis->itemID = 0;
+    CopyRect(&lpdis->rcItem, &rc);
+    lpdis->CtlID = wndPtr->wIDmenu;
+    lpdis->CtlType = ODT_BUTTON;
+    lpdis->itemAction = ODA_DRAWENTIRE;
+/*    printf("ownerdrawn button WM_DRAWITEM CtrlID=%X\n", lpdis->CtlID);*/
+    SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); 
+    USER_HEAP_FREE(hDis);
+    EndPaint(hWnd, &ps);
+}
+
+static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
+{
+    HDC 	hDC;
+    RECT 	rc;
+    HANDLE	hDis;
+    LPDRAWITEMSTRUCT lpdis;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+/*    SetFocus(hWnd); */
+    SetCapture(hWnd);
+    hDC = GetDC(hWnd);
+    GetClientRect(hWnd, &rc);
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+	NOTIFY_PARENT(hWnd, BN_CLICKED);
+    GetClientRect(hWnd, &rc);
+    hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
+    lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
+    lpdis->hDC = hDC;
+    lpdis->itemID = 0;
+    CopyRect(&lpdis->rcItem, &rc);
+    lpdis->CtlID = wndPtr->wIDmenu;
+    lpdis->CtlType = ODT_BUTTON;
+    lpdis->itemAction = ODA_SELECT;
+    SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); 
+    USER_HEAP_FREE(hDis);
+    ReleaseDC(hWnd, hDC);
+}
+
+static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
+{
+    HDC 	hDC;
+    RECT 	rc;
+    HANDLE	hDis;
+    LPDRAWITEMSTRUCT lpdis;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+    ReleaseCapture();
+    hDC = GetDC(hWnd);
+    GetClientRect(hWnd, &rc);
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+	NOTIFY_PARENT(hWnd, BN_CLICKED);
+    GetClientRect(hWnd, &rc);
+    hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
+    lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
+    lpdis->hDC = hDC;
+    lpdis->itemID = 0;
+    CopyRect(&lpdis->rcItem, &rc);
+    lpdis->CtlID = wndPtr->wIDmenu;
+    lpdis->CtlType = ODT_BUTTON;
+    lpdis->itemAction = ODA_SELECT;
+    SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); 
+    USER_HEAP_FREE(hDis);
+    ReleaseDC(hWnd, hDC);
+}
+
+static LONG OB_KillFocus(HWND hWnd)
+{
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
diff --git a/controls/combo.c b/controls/combo.c
index ee90962..e471589 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -74,16 +74,20 @@
     WND  	*wndPtr;
     LPHEADCOMBO lphc;
     char	str[128];
+    PAINTSTRUCT paintstruct;
     static RECT rectsel;
     switch(message)
     {
     case WM_CREATE:
 	CreateComboStruct(hwnd);
 	wndPtr = WIN_FindWndPtr(hwnd);
-	width = wndPtr->rectClient.right - wndPtr->rectClient.left;
-	height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
 	lphc = ComboGetStorageHeader(hwnd);
 	if (lphc == NULL) return 0;
+#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;
 	lphc->hWndDrop = CreateWindow("BUTTON", "", 
         	WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
         	width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
@@ -94,25 +98,23 @@
         	WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
         	wndPtr->rectClient.left, wndPtr->rectClient.top + 16, width, height, 
         	wndPtr->hwndParent, 1, wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
-/*
         ShowWindow(lphc->hWndLBox, SW_HIDE);
-*/
-        InvalidateRect(lphc->hWndEdit, NULL, TRUE);
-        UpdateWindow(lphc->hWndEdit);
-        InvalidateRect(lphc->hWndDrop, NULL, TRUE);
-        UpdateWindow(lphc->hWndDrop);
 #ifdef DEBUG_COMBO
         printf("Combo Creation Drop=%X LBox=%X!\n", lphc->hWndDrop, lphc->hWndLBox);
 #endif
 	return 0;
     case WM_DESTROY:
 	lphc = ComboGetStorageHeader(hwnd);
+	if (lphc == 0) return 0;
 	DestroyWindow(lphc->hWndDrop);
 	DestroyWindow(lphc->hWndEdit);
+/*
 	DestroyWindow(lphc->hWndLBox);
+*/
 	free(lphc);
+	*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = 0;
 #ifdef DEBUG_COMBO
-        printf("Combo WM_DESTROY !\n");
+        printf("Combo WM_DESTROY %lX !\n", lphc);
 #endif
 	return 0;
 	
@@ -128,24 +130,33 @@
 	    lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
 	    if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
 		ShowWindow(lphc->hWndLBox, SW_SHOW);
+/*
+		SetFocus(lphc->hWndLBox);
+*/
 		}
 	    else {
+/*
+		SetFocus(lphc->hWndEdit);
+*/
 		ShowWindow(lphc->hWndLBox, SW_HIDE);
 		y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
-		SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
-		SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
-		printf("combo hide\n");
+		if (y != LB_ERR) {
+		    SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
+		    SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+		    }
 		}
             }
         if (LOWORD(lParam) == lphc->hWndLBox) {
             switch(HIWORD(lParam))
         	{
         	case LBN_SELCHANGE:
-		    lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
+		    lphc->dwState = lphc->dwState & (CB_SHOWDROPDOWN ^ 0xFFFF);
 		    ShowWindow(lphc->hWndLBox, SW_HIDE);
 		    y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
-		    SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
-		    SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+		    if (y != LB_ERR) {
+		    	SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
+		    	SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+		    	}
 		    SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
 			        	MAKELONG(hwnd, CBN_SELCHANGE));
         	    break;
@@ -165,6 +176,8 @@
     case WM_CTLCOLOR:
     	return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
     case WM_PAINT:
+	BeginPaint( hwnd, &paintstruct );
+	EndPaint( hwnd, &paintstruct );
 	lphc = ComboGetStorageHeader(hwnd);
         InvalidateRect(lphc->hWndEdit, NULL, TRUE);
         UpdateWindow(lphc->hWndEdit);
@@ -175,17 +188,6 @@
 	    UpdateWindow(lphc->hWndLBox);
 	    }
 	break;
-    case WM_MOUSEMOVE:
-        if ((wParam & MK_LBUTTON) != 0) {
-            y = HIWORD(lParam);
-	    if (y < 4) {
-		lphc = ComboGetStorageHeader(hwnd);
-		}
-	    GetClientRect(hwnd, &rect);
-	    if (y > (rect.bottom - 4)) {
-		lphc = ComboGetStorageHeader(hwnd);
-		}
-	    }
     case CB_ADDSTRING:
 #ifdef DEBUG_COMBO
         printf("CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
@@ -196,6 +198,10 @@
         printf("CB_GETLBTEXT #%u !\n", wParam);
 	lphc = ComboGetStorageHeader(hwnd);
         return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam));
+    case CB_GETLBTEXTLEN:
+        printf("CB_GETLBTEXTLEN !\n");
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_GETTEXTLEN, wParam, lParam));
     case CB_INSERTSTRING:
         printf("CB_INSERTSTRING '%s' !\n", (LPSTR)lParam);
 	lphc = ComboGetStorageHeader(hwnd);
@@ -210,17 +216,65 @@
         return(SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L));
     case CB_DIR:
         printf("ComboBox CB_DIR !\n");
+	lphc = ComboGetStorageHeader(hwnd);
         return(SendMessage(lphc->hWndLBox, LB_DIR, wParam, lParam));
     case CB_FINDSTRING:
+	lphc = ComboGetStorageHeader(hwnd);
         return(SendMessage(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam));
     case CB_GETCOUNT:
+	lphc = ComboGetStorageHeader(hwnd);
         return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
     case CB_GETCURSEL:
         printf("ComboBox CB_GETCURSEL !\n");
-        return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L));
     case CB_SETCURSEL:
-        printf("ComboBox CB_SETCURSEL wParam=%x !\n", wParam);
-        return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, wParam, 0L));
+        printf("ComboBox CB_SETCURSEL wParam=%X !\n", wParam);
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_SETCURSEL, wParam, 0L));
+    case CB_GETEDITSEL:
+        printf("ComboBox CB_GETEDITSEL !\n");
+	lphc = ComboGetStorageHeader(hwnd);
+/*        return(SendMessage(lphc->hWndEdit, EM_GETSEL, 0, 0L)); */
+        break;
+     case CB_SETEDITSEL:
+        printf("ComboBox CB_SETEDITSEL lParam=%lX !\n", lParam);
+	lphc = ComboGetStorageHeader(hwnd);
+/*        return(SendMessage(lphc->hWndEdit, EM_SETSEL, 0, lParam)); */
+	break;
+    case CB_SELECTSTRING:
+        printf("ComboBox CB_SELECTSTRING !\n");
+	lphc = ComboGetStorageHeader(hwnd);
+        break;
+    case CB_SHOWDROPDOWN:
+        printf("ComboBox CB_SHOWDROPDOWN !\n");
+	lphc = ComboGetStorageHeader(hwnd);
+	lphc->dwState = lphc->dwState | CB_SHOWDROPDOWN;
+	if (wParam != 0) {
+	    ShowWindow(lphc->hWndLBox, SW_SHOW);
+	    }
+	else {
+	    lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
+	    ShowWindow(lphc->hWndLBox, SW_HIDE);
+	    SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
+			        	MAKELONG(hwnd, CBN_DROPDOWN));
+	    }
+        break;
+    case CB_GETITEMDATA:
+        printf("ComboBox CB_GETITEMDATA wParam=%X !\n", wParam);
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0L));
+        break;
+    case CB_SETITEMDATA:
+        printf("ComboBox CB_SETITEMDATA wParam=%X lParam=%lX !\n", wParam, lParam);
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam));
+        break;
+    case CB_LIMITTEXT:
+        printf("ComboBox CB_LIMITTEXT !\n");
+	lphc = ComboGetStorageHeader(hwnd);
+/*        return(SendMessage(lphc->hWndEdit, EM_LIMITTEXT, wParam, 0L)); */
+        break;
 	
     default:
 	return DefWindowProc( hwnd, message, wParam, lParam );
@@ -235,6 +289,10 @@
     WND  *wndPtr;
     LPHEADCOMBO lphc;
     wndPtr = WIN_FindWndPtr(hwnd);
+    if (wndPtr == 0) {
+    	printf("Bad Window handle on ComboBox !\n");
+    	return 0;
+    	}
     lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]);
     return lphc;
 }
@@ -246,6 +304,10 @@
     WND  *wndPtr;
     LPHEADCOMBO lphc;
     wndPtr = WIN_FindWndPtr(hwnd);
+    if (wndPtr == 0) {
+    	printf("Bad Window handle on ComboBox !\n");
+    	return 0;
+    	}
     lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
     *((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc;
     lphc->dwState = 0;
diff --git a/controls/listbox.c b/controls/listbox.c
index dc2ae49..a71eb92 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -107,6 +107,9 @@
     case WM_CREATE:
 	CreateListBoxStruct(hwnd);
 	lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+#ifdef DEBUG_LISTBOX
+        printf("ListBox WM_CREATE %lX !\n", lphl);
+#endif
 	createStruct = (CREATESTRUCT *)lParam;
      	if (HIWORD(createStruct->lpCreateParams) != 0)
 	    lphl->hWndLogicParent = (HWND)HIWORD(createStruct->lpCreateParams);
@@ -122,10 +125,14 @@
 	return 0;
     case WM_DESTROY:
         lphl = ListBoxGetStorageHeader(hwnd);
+        if (lphl == 0) return 0;
 	ListBoxResetContent(hwnd);
 	DestroyWindow(lphl->hWndScroll);
 	free(lphl);
-        printf("ListBox WM_DESTROY !\n");
+	*((LPHEADLIST *)&wndPtr->wExtra[1]) = 0;
+#ifdef DEBUG_LISTBOX
+        printf("ListBox WM_DESTROY %lX !\n", lphl);
+#endif
 	return 0;
 
     case WM_VSCROLL:
@@ -164,6 +171,10 @@
 	return 0;
 	
     case WM_LBUTTONDOWN:
+/*
+	SetFocus(hwnd);
+*/
+	SetCapture(hwnd);
         lphl = ListBoxGetStorageHeader(hwnd);
         if (lphl == NULL) return 0;
 	lphl->PrevSelected = lphl->ItemSelected;
@@ -174,6 +185,7 @@
         UpdateWindow(hwnd);
 	return 0;
     case WM_LBUTTONUP:
+	ReleaseCapture();
 	lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
         if (lphl == NULL) return 0;
 	if (lphl->PrevSelected != lphl->ItemSelected)
@@ -248,8 +260,10 @@
     case LB_DIR:
         printf("ListBox LB_DIR !\n");
 	wRet = ListBoxDirectory(hwnd, wParam, (LPSTR)lParam);
-        InvalidateRect(hwnd, NULL, TRUE);
-        UpdateWindow(hwnd);
+	if (IsWindowVisible(hwnd)) {
+	    InvalidateRect(hwnd, NULL, TRUE);
+	    UpdateWindow(hwnd);
+	    }
 	return wRet;
     case LB_ADDSTRING:
 	wRet = ListBoxAddString(hwnd, (LPSTR)lParam);
@@ -315,30 +329,38 @@
         printf("ListBox LB_SETCURSEL wParam=%x !\n", wParam);
 #endif
 	wRet = ListBoxSetCurSel(hwnd, wParam);
-        InvalidateRect(hwnd, NULL, TRUE);
-        UpdateWindow(hwnd);
+	if (IsWindowVisible(hwnd)) {
+	    InvalidateRect(hwnd, NULL, TRUE);
+	    UpdateWindow(hwnd);
+	    }
 	return wRet;
     case LB_SETSEL:
         printf("ListBox LB_SETSEL wParam=%x lParam=%lX !\n", wParam, lParam);
 	wRet = ListBoxSetSel(hwnd, wParam);
-        InvalidateRect(hwnd, NULL, TRUE);
-        UpdateWindow(hwnd);
+	if (IsWindowVisible(hwnd)) {
+	    InvalidateRect(hwnd, NULL, TRUE);
+	    UpdateWindow(hwnd);
+	    }
 	return wRet;
     case LB_SETTOPINDEX:
         printf("ListBox LB_SETTOPINDEX wParam=%x !\n", wParam);
         lphl = ListBoxGetStorageHeader(hwnd);
 	lphl->FirstVisible = wParam;
 	SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
-        InvalidateRect(hwnd, NULL, TRUE);
-        UpdateWindow(hwnd);
+	if (IsWindowVisible(hwnd)) {
+	    InvalidateRect(hwnd, NULL, TRUE);
+	    UpdateWindow(hwnd);
+	    }
 	break;
     case LB_SETITEMHEIGHT:
 #ifdef DEBUG_LISTBOX
         printf("ListBox LB_SETITEMHEIGHT wParam=%x lParam=%lX !\n", wParam, lParam);
 #endif
 	wRet = ListBoxSetItemHeight(hwnd, wParam, lParam);
-        InvalidateRect(hwnd, NULL, TRUE);
-        UpdateWindow(hwnd);
+	if (IsWindowVisible(hwnd)) {
+	    InvalidateRect(hwnd, NULL, TRUE);
+	    UpdateWindow(hwnd);
+	    }
 	return wRet;
 	
     default:
@@ -381,6 +403,10 @@
 	char	C[128];
 	h = 0;
 	hdc = BeginPaint( hwnd, &ps );
+    	if (!IsWindowVisible(hwnd)) {
+	    EndPaint( hwnd, &ps );
+	    return;
+	    }
 	GetClientRect(hwnd, &rect);
         lphl = ListBoxGetStorageHeader(hwnd);
 	if (lphl == NULL) goto EndOfPaint;
@@ -425,7 +451,6 @@
 {
 	LPHEADLIST  lphl;
 	LPLISTSTRUCT lpls;
-	HANDLE	hTemp;
 	PAINTSTRUCT ps;
 	HBRUSH 	hBrush;
 	HWND	hWndParent;
@@ -435,6 +460,10 @@
 	char	C[128];
 	h = 0;
 	hdc = BeginPaint( hwnd, &ps );
+    	if (!IsWindowVisible(hwnd)) {
+	    EndPaint( hwnd, &ps );
+	    return;
+	    }
 	GetClientRect(hwnd, &rect);
         lphl = ListBoxGetStorageHeader(hwnd);
 	if (lphl == NULL) goto EndOfPaint;
@@ -465,11 +494,9 @@
 			lpls->dis.rcItem.right, lpls->dis.rcItem.bottom);
 		printf("LBOX WM_DRAWITEM Parent=%X &dis=%lX CtlID=%u !\n", 
 			hWndParent, (LONG)&lpls->dis, lpls->dis.CtlID);
-#endif
 		printf("LBOX WM_DRAWITEM '%s' !\n", lpls->dis.itemData);
+#endif
 		SendMessage(lphl->hWndLogicParent, WM_DRAWITEM, i, (LPARAM)&lpls->dis);
-		GlobalUnlock(hTemp);
-		GlobalFree(hTemp);
 		if (lpls->dis.itemState != 0) {
 		    InvertRect(hdc, &lpls->dis.rcItem);
 		    }
@@ -575,7 +602,8 @@
     lplsnew->dis.itemID = lphl->ItemsCount;
     lplsnew->dis.itemData = (DWORD)newstr;
     lplsnew->hData = hTemp;
-    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
+    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, 
+    	(lphl->FirstVisible != 1));
     if (lphl->FirstVisible >= (lphl->ItemsCount - lphl->ItemsVisible)) {
         InvalidateRect(hwnd, NULL, TRUE);
         UpdateWindow(hwnd);
@@ -625,7 +653,8 @@
     lplsnew->dis.itemID = lphl->ItemsCount;
     lplsnew->dis.itemData = (DWORD)newstr;
     lplsnew->hData = hTemp;
-    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
+    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, 
+    	(lphl->FirstVisible != 1));
     if (((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) && 
         (lphl->ItemsVisible != 0)) 
     	ShowWindow(lphl->hWndScroll, SW_NORMAL);
@@ -768,10 +797,10 @@
     lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
     if (lphl == NULL) return LB_ERR;
     lphl->ItemSelected = LB_ERR;
-    if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
+    if (wIndex < 0 || wIndex >= lphl->ItemsCount) return LB_ERR;
     lpls = lphl->lpFirst;
     if (lpls == NULL) return LB_ERR;
-    for(i = 1; i <= lphl->ItemsCount; i++) {
+    for(i = 0; i < lphl->ItemsCount; i++) {
 	lpls2 = lpls;
 	lpls = (LPLISTSTRUCT)lpls->lpNext;
 	if (i == wIndex)
@@ -797,10 +826,10 @@
     UINT	i;
     lphl = ListBoxGetStorageHeader(hwnd);
     if (lphl == NULL) return LB_ERR;
-    if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
+    if (wIndex < 0 || wIndex >= lphl->ItemsCount) return LB_ERR;
     lpls = lphl->lpFirst;
     if (lpls == NULL) return LB_ERR;
-    for(i = 1; i <= lphl->ItemsCount; i++) {
+    for(i = 0; i < lphl->ItemsCount; i++) {
 	lpls2 = lpls;
 	lpls = (LPLISTSTRUCT)lpls->lpNext;
 	if (i == wIndex) {
diff --git a/controls/scroll.c b/controls/scroll.c
index 83816f5..fd8e45a 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -86,11 +86,15 @@
 #endif
 	return 0;
     case WM_DESTROY:
-	lphs = ScrollBarGetStorageHeader(hwnd);
+	lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+	if (lphs == 0) return 0;
+#ifdef DEBUG_SCROLL
+        printf("ScrollBar WM_DESTROY %lX !\n", lphs);
+#endif
 	DestroyWindow(lphs->hWndUp);
 	DestroyWindow(lphs->hWndDown);
 	free(lphs);
-        printf("ScrollBar WM_DESTROY !\n");
+	*((LPHEADSCROLL *)&wndPtr->wExtra[1]) = 0;
 	return 0;
 	
     case WM_COMMAND:
@@ -105,10 +109,17 @@
         if (LOWORD(lParam) == lphs->hWndDown)
             SendMessage(wndPtr->hwndParent, lphs->Direction, 
             	SB_LINEDOWN, MAKELONG(0, hwnd));
+/*
+	SetFocus(hwnd);
+*/
 	return 0;
 
     case WM_LBUTTONDOWN:
 	lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+/*
+	SetFocus(hwnd);
+*/
+	SetCapture(hwnd);
 	GetClientRect(hwnd, &rect);
 	if (lphs->Direction == WM_VSCROLL) {
 	    y = HIWORD(lParam);
@@ -152,11 +163,13 @@
 	    }
 	break;
     case WM_LBUTTONUP:
+	lphs = ScrollBarGetStorageHeader(hwnd);
         lphs->ThumbActive = FALSE;
+	ReleaseCapture();
 	break;
 
     case WM_KEYDOWN:
-        printf("ScrollBar WM_KEYDOWN wParam %X!\n", wParam);
+        printf("ScrollBar WM_KEYDOWN wParam %X !\n", wParam);
 	break;
     case WM_PAINT:
 	StdDrawScrollBar(hwnd);
@@ -192,6 +205,10 @@
     WND  *Ptr;
     LPHEADSCROLL lphs;
     *(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
+    if (Ptr == 0) {
+    	printf("Bad Window handle on ScrollBar !\n");
+    	return 0;
+    	}
     lphs = *((LPHEADSCROLL *)&Ptr->wExtra[1]);
     return lphs;
 }
@@ -202,6 +219,10 @@
     WND  *wndPtr;
     LPHEADSCROLL lphs;
     wndPtr = WIN_FindWndPtr(hwnd);
+    if (wndPtr == 0) {
+    	printf("Bad Window handle on ScrollBar !\n");
+    	return 0;
+    	}
     lphs = *((LPHEADSCROLL *)&wndPtr->wExtra[1]);
     return lphs;
 }
@@ -209,49 +230,53 @@
 
 void StdDrawScrollBar(HWND hwnd)
 {
-	LPHEADSCROLL lphs;
-	PAINTSTRUCT ps;
-	HBRUSH hBrush;
-	HDC hdc;
-	RECT rect;
-	UINT  i, w, h, siz;
-	char	C[128];
-	hdc = BeginPaint( hwnd, &ps );
-	hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
-		    MAKELONG(hwnd, CTLCOLOR_SCROLLBAR));
-	if (hBrush == (HBRUSH)NULL)  hBrush = GetStockObject(LTGRAY_BRUSH);
-	lphs = ScrollBarGetStorageHeader(hwnd);
-	if (lphs == NULL) goto EndOfPaint;
-	GetClientRect(hwnd, &rect);
-	w = rect.right - rect.left;
-	h = rect.bottom - rect.top;
-	if (lphs->Direction == WM_VSCROLL) {
-	    rect.top += w;
-	    rect.bottom -= w;
-	    }
-	else {
-	    rect.left += h;
-	    rect.right -= h;
-	    }
-	FillRect(hdc, &rect, hBrush);
-	if (lphs->Direction == WM_VSCROLL)
-	    SetRect(&rect, 0, lphs->CurPix + w, 
-	    		w, lphs->CurPix + (w << 1));
-	else
-	    SetRect(&rect, lphs->CurPix + h, 
-	    		0, lphs->CurPix + (h << 1), h);
-	FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH));
-	InflateRect(&rect, -1, -1);
-	FillRect(hdc, &rect, GetStockObject(LTGRAY_BRUSH));
-	DrawReliefRect(hdc, rect, 2, 0);
-	InflateRect(&rect, -3, -3);
-	DrawReliefRect(hdc, rect, 1, 1);
-EndOfPaint:
+    LPHEADSCROLL lphs;
+    PAINTSTRUCT ps;
+    HBRUSH hBrush;
+    HDC hdc;
+    RECT rect;
+    UINT  i, w, h, siz;
+    char	C[128];
+    hdc = BeginPaint( hwnd, &ps );
+    if (!IsWindowVisible(hwnd)) {
 	EndPaint( hwnd, &ps );
-        InvalidateRect(lphs->hWndUp, NULL, TRUE);
-        UpdateWindow(lphs->hWndUp);
-        InvalidateRect(lphs->hWndDown, NULL, TRUE);
-        UpdateWindow(lphs->hWndDown);
+	return;
+	}
+    hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
+			MAKELONG(hwnd, CTLCOLOR_SCROLLBAR));
+    if (hBrush == (HBRUSH)NULL)  hBrush = GetStockObject(LTGRAY_BRUSH);
+    lphs = ScrollBarGetStorageHeader(hwnd);
+    if (lphs == NULL) goto EndOfPaint;
+    GetClientRect(hwnd, &rect);
+    w = rect.right - rect.left;
+    h = rect.bottom - rect.top;
+    if (lphs->Direction == WM_VSCROLL) {
+	rect.top += w;
+	rect.bottom -= w;
+	}
+    else {
+	rect.left += h;
+	rect.right -= h;
+	}
+    FillRect(hdc, &rect, hBrush);
+    if (lphs->Direction == WM_VSCROLL)
+	SetRect(&rect, 0, lphs->CurPix + w, w, lphs->CurPix + (w << 1));
+    else
+	SetRect(&rect, lphs->CurPix + h, 0, lphs->CurPix + (h << 1), h);
+    FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH));
+    InflateRect(&rect, -1, -1);
+    FillRect(hdc, &rect, GetStockObject(LTGRAY_BRUSH));
+    DrawReliefRect(hdc, rect, 2, 0);
+    InflateRect(&rect, -3, -3);
+    DrawReliefRect(hdc, rect, 1, 1);
+    if (!lphs->ThumbActive) {
+	InvalidateRect(lphs->hWndUp, NULL, TRUE);
+	UpdateWindow(lphs->hWndUp);
+	InvalidateRect(lphs->hWndDown, NULL, TRUE);
+	UpdateWindow(lphs->hWndDown);
+	}
+EndOfPaint:
+    EndPaint( hwnd, &ps );
 }
 
 
@@ -264,16 +289,22 @@
     LPHEADSCROLL lphs;
     wndPtr = WIN_FindWndPtr(hwnd);
     lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
+    if (lphs == 0) {
+    	printf("Bad Memory Alloc on ScrollBar !\n");
+    	return 0;
+    	}
+
+#ifdef DEBUG_SCROLL
+        printf("CreateScrollBarStruct %lX !\n", lphs);
+#endif
     *((LPHEADSCROLL *)&wndPtr->wExtra[1]) = lphs;
-    lphs->ThumbActive;
+    lphs->ThumbActive = FALSE;
     lphs->MinVal = 0;
     lphs->MaxVal = 100;
     lphs->CurVal = 0;
     lphs->CurPix = 0;
     width = wndPtr->rectClient.right - wndPtr->rectClient.left;
     height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
-    lphs = ScrollBarGetStorageHeader(hwnd);
-    if (lphs == NULL) return 0;
     if (width <= height)
 	{
 	lphs->MaxPix = height - 3 * width;
@@ -308,7 +339,7 @@
 {
     LPHEADSCROLL lphs;
     lphs = ScrollBarGetStorageHeader(hwnd);
-    if (lphs == NULL) return;
+    if (lphs == NULL) return 0;
     return lphs->CurVal;
 }
 
@@ -330,7 +361,7 @@
     int nRet;
     LPHEADSCROLL lphs;
     lphs = ScrollBarGetStorageHeader(hwnd);
-    if (lphs == NULL) return;
+    if (lphs == NULL) return 0;
     nRet = lphs->CurVal;
     lphs->CurVal = (short)nPos;
     if (lphs->MaxVal != lphs->MinVal)
@@ -343,7 +374,7 @@
     printf("SetScrollPos min=%d max=%d\n", 
 	    lphs->MinVal, lphs->MaxVal);
 #endif
-    if (bRedraw) {
+    if ((bRedraw) && (IsWindowVisible(hwnd))) {
         InvalidateRect(hwnd, NULL, TRUE);
         UpdateWindow(hwnd);
         }
@@ -367,7 +398,7 @@
 #ifdef DEBUG_SCROLL
     printf("SetScrollRange min=%d max=%d\n", lphs->MinVal, lphs->MaxVal);
 #endif
-    if (bRedraw) {
+    if ((bRedraw) && (IsWindowVisible(hwnd))) {
         InvalidateRect(hwnd, NULL, TRUE);
         UpdateWindow(hwnd);
         }
diff --git a/controls/static.c b/controls/static.c
index 40e5fbb..6928139 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -16,6 +16,8 @@
 static LONG PaintTextfn(HWND hwnd);
 static LONG PaintRectfn(HWND hwnd);
 static LONG PaintFramefn(HWND hwnd);
+static LONG PaintIconfn(HWND hwnd);
+
 
 static COLORREF color_windowframe, color_background, color_window,
                                                      color_windowtext;
@@ -37,7 +39,7 @@
     { (LONG(*)())PaintTextfn },                    /* SS_LEFT */
     { (LONG(*)())PaintTextfn },                    /* SS_CENTER */
     { (LONG(*)())PaintTextfn },                    /* SS_RIGHT */
-    { (LONG(*)())NULL        },                    /* SS_ICON */
+    { (LONG(*)())PaintIconfn },                    /* SS_ICON */
     { (LONG(*)())PaintRectfn },                    /* SS_BLACKRECT */
     { (LONG(*)())PaintRectfn },                    /* SS_GRAYRECT */
     { (LONG(*)())PaintRectfn },                    /* SS_WHITERECT */
@@ -65,17 +67,22 @@
 	    break;
 
 	case WM_CREATE:
-	    if (style < 0L || style >= (LONG)DIM(staticfn))
+	    if (style < 0L || style >= (LONG)DIM(staticfn)) {
 		lResult = -1L;
-	    else
-	    {
-		/* initialise colours */
-		color_windowframe  = GetSysColor(COLOR_WINDOWFRAME);
-		color_background   = GetSysColor(COLOR_BACKGROUND);
-		color_window       = GetSysColor(COLOR_WINDOW);
-		color_windowtext   = GetSysColor(COLOR_WINDOWTEXT);
-		lResult = 0L;
-	    }
+		break;
+		}
+	    /* initialise colours */
+	    color_windowframe  = GetSysColor(COLOR_WINDOWFRAME);
+	    color_background   = GetSysColor(COLOR_BACKGROUND);
+	    color_window       = GetSysColor(COLOR_WINDOW);
+	    color_windowtext   = GetSysColor(COLOR_WINDOWTEXT);
+	    lResult = 0L;
+	    if (style == SS_ICON) {
+/*
+		SetWindowPos(hWnd, (HWND)NULL, 0, 0, 32, 32,
+				SWP_NOZORDER | SWP_NOMOVE);
+*/
+		}
 	    break;
 
 	case WM_PAINT:
@@ -259,6 +266,35 @@
 }
 
 
+static LONG PaintIconfn(HWND hwnd)
+{
+    WND 	*wndPtr;
+    PAINTSTRUCT ps;
+    RECT 	rc;
+    HDC 	hdc;
+    LPSTR	textPtr;
+    HICON	hIcon;
+
+    wndPtr = WIN_FindWndPtr(hwnd);
+    hdc = BeginPaint(hwnd, &ps);
+    GetClientRect(hwnd, &rc);
+    FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH));
+    textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
+    printf("SS_ICON : textPtr='%s' / left=%d top=%d right=%d bottom=%d \n", 
+    		textPtr, rc.left, rc.top, rc.right, rc.bottom);
+/*
+    SetWindowPos(hwnd, (HWND)NULL, 0, 0, 32, 32,
+		SWP_NOZORDER | SWP_NOMOVE);
+    GetClientRect(hwnd, &rc);
+    printf("SS_ICON : textPtr='%s' / left=%d top=%d right=%d bottom=%d \n", 
+    		textPtr, rc.left, rc.top, rc.right, rc.bottom);
+*/
+    hIcon = LoadIcon(wndPtr->hInstance, textPtr);
+    DrawIcon(hdc, rc.left, rc.top, hIcon);
+    EndPaint(hwnd, &ps);
+    GlobalUnlock(hwnd);
+}
+
 
 
 
diff --git a/if1632/call.S b/if1632/call.S
index 9da87f0..c8ac030 100644
--- a/if1632/call.S
+++ b/if1632/call.S
@@ -15,11 +15,12 @@
 /**********************************************************************
  *	Places to keep info about the current 32-bit stack frame.
  */
-saved_esp:
+	.globl	_IF1632_Saved32_esp,_IF1632_Saved32_ebp,_IF1632_Saved32_ss
+_IF1632_Saved32_esp:
 	.long	0
-saved_ebp:
+_IF1632_Saved32_ebp:
 	.long	0
-saved_ss:
+_IF1632_Saved32_ss:
 	.word	0
 
 /**********************************************************************
@@ -64,9 +65,9 @@
  	 * Save our registers
 	 */
 	pushal
-	pushl	saved_esp
-	pushl	saved_ebp
-	pushw	saved_ss
+	pushl	_IF1632_Saved32_esp
+	pushl	_IF1632_Saved32_ebp
+	pushw	_IF1632_Saved32_ss
 
 	/*
 	 * Get target address.
@@ -78,9 +79,9 @@
 	/*
 	 * Put stack registers where we can get them after stack switch.
 	 */
-	movw	%ss,saved_ss
-	movl	%esp,saved_esp
-	movl	%ebp,saved_ebp
+	movw	%ss,_IF1632_Saved32_ss
+	movl	%esp,_IF1632_Saved32_esp
+	movl	%ebp,_IF1632_Saved32_ebp
 
 	/*
 	 * Load initial registers
@@ -130,16 +131,16 @@
 	movw	%ax,%fs
 	movw	%ax,%gs
 	popl	%eax
-	movw	saved_ss,%ss
-	movl	saved_esp,%esp
-	movl	saved_ebp,%ebp
+	movw	_IF1632_Saved32_ss,%ss
+	movl	_IF1632_Saved32_esp,%esp
+	movl	_IF1632_Saved32_ebp,%ebp
 
 	/*
  	 * Restore registers, but do not destroy return value.
 	 */
-	popw	saved_ss
-	popl	saved_ebp
-	popl	saved_esp
+	popw	_IF1632_Saved32_ss
+	popl	_IF1632_Saved32_ebp
+	popl	_IF1632_Saved32_esp
 	movl	%eax,return_value
 	popal
 	movl	return_value,%eax
@@ -173,13 +174,13 @@
 	/*
 	 * Switch to 16-bit stack
 	 */
-	pushl	saved_esp
-	pushl	saved_ebp
-	pushw	saved_ss
+	pushl	_IF1632_Saved32_esp
+	pushl	_IF1632_Saved32_ebp
+	pushw	_IF1632_Saved32_ss
 
-	movw	%ss,saved_ss
-	movl	%esp,saved_esp
-	movl	%ebp,saved_ebp
+	movw	%ss,_IF1632_Saved32_ss
+	movl	%esp,_IF1632_Saved32_esp
+	movl	%ebp,_IF1632_Saved32_ebp
 
 	movw	_IF1632_Saved16_ss,%ss
 	movl	_IF1632_Saved16_esp,%esp
@@ -215,13 +216,13 @@
 	movl	%esp,_IF1632_Saved16_esp
 	movl	%ebp,_IF1632_Saved16_ebp
 
-	movw	saved_ss,%ss
-	movl	saved_esp,%esp
-	movl	saved_ebp,%ebp
+	movw	_IF1632_Saved32_ss,%ss
+	movl	_IF1632_Saved32_esp,%esp
+	movl	_IF1632_Saved32_ebp,%ebp
 
-	popw	saved_ss
-	popl	saved_ebp
-	popl	saved_esp
+	popw	_IF1632_Saved32_ss
+	popl	_IF1632_Saved32_ebp
+	popl	_IF1632_Saved32_esp
 
 	movl	%eax,return_value
 	movw	return_value+2,%dx
@@ -276,9 +277,9 @@
 	movl	%esp,_IF1632_Saved16_esp
 	movl	%ebp,_IF1632_Saved16_ebp
 
-	movw	saved_ss,%ss
-	movl	saved_esp,%esp
-	movl	saved_ebp,%ebp
+	movw	_IF1632_Saved32_ss,%ss
+	movl	_IF1632_Saved32_esp,%esp
+	movl	_IF1632_Saved32_ebp,%ebp
 
 	/*
 	 * Call entry point
diff --git a/if1632/callback.c b/if1632/callback.c
index 60a9e88..1852185 100644
--- a/if1632/callback.c
+++ b/if1632/callback.c
@@ -5,10 +5,16 @@
 #include "callback.h"
 #include "wine.h"
 #include "segmem.h"
+#include <setjmp.h>
 
 extern unsigned short SelectorOwners[];
 extern unsigned short IF1632_Saved16_ss;
+extern unsigned long  IF1632_Saved16_ebp;
 extern unsigned long  IF1632_Saved16_esp;
+extern unsigned short IF1632_Saved32_ss;
+extern unsigned long  IF1632_Saved32_ebp;
+extern unsigned long  IF1632_Saved32_esp;
+
 extern struct segment_descriptor_s *MakeProcThunks;
 
 struct thunk_s
@@ -169,3 +175,77 @@
 	(*func)(xPos, yPos, lParam);
     }
 }
+
+/* ------------------------------------------------------------------------ */
+/*
+ * The following functions realize the Catch/Throw functionality.
+ * My thought is to use the setjmp, longjmp combination to do the
+ * major part of this one. All I have to remember, in addition to
+ * whatever the jmp_buf contains, is the contents of the 16-bit
+ * sp, bp and ss. I do this by storing them in the structure passed
+ * to me by the 16-bit program (including my own jmp_buf...). 
+ * Hopefully there isn't any program that modifies the contents!
+ * Bad thing: I have to save part of the stack, since this will 
+ * get reused on the next call after my return, leaving it in an
+ * undefined state.
+ */
+#define	STACK_DEPTH_16 	28
+
+struct special_buffer {
+	jmp_buf buffer;
+	long 	regs [6];
+	char 	stack_part [STACK_DEPTH_16];
+} *sb;
+
+int Catch (LPCATCHBUF cbuf)
+{
+	WORD retval;
+	jmp_buf *tmp_jmp;
+	char *stack16 =  (char *) (((unsigned int)IF1632_Saved16_ss << 16) +
+		(IF1632_Saved16_esp & 0xffff));
+
+	sb = malloc (sizeof (struct special_buffer));
+	
+	sb -> regs [0] = IF1632_Saved16_esp;
+	sb -> regs [1] = IF1632_Saved16_ebp;
+	sb -> regs [2] = IF1632_Saved16_ss & 0xffff;
+	sb -> regs [3] = IF1632_Saved32_esp;
+	sb -> regs [4] = IF1632_Saved32_ebp;
+	sb -> regs [5] = IF1632_Saved32_ss & 0xffff;
+	memcpy (sb -> stack_part, stack16, STACK_DEPTH_16);
+	tmp_jmp = &sb -> buffer;
+	*((struct special_buffer **)cbuf) = sb;
+	
+	if ((retval = setjmp (*tmp_jmp)))
+	{
+		IF1632_Saved16_esp = sb -> regs [0];
+		IF1632_Saved16_ebp = sb -> regs [1];
+		IF1632_Saved16_ss = sb -> regs [2] & 0xffff;
+		IF1632_Saved32_esp = sb -> regs [3];
+		IF1632_Saved32_ebp = sb -> regs [4];
+		IF1632_Saved32_ss = sb -> regs [5] & 0xffff;
+		stack16 = (char *) (((unsigned int)IF1632_Saved16_ss << 16) +
+				(IF1632_Saved16_esp & 0xffff));
+
+		memcpy (stack16, sb -> stack_part, STACK_DEPTH_16);
+#ifdef	DEBUG_CATCH
+		printf ("Been thrown here: %d, retval = %d\n", sb, retval);
+#endif
+		free ((void *) sb);
+		return (retval);
+	} else {
+#ifdef	DEBUG_CATCH
+		printf ("Will somtime get thrown here: %d\n", sb);
+#endif
+		return (retval);
+	}
+}
+
+void Throw (LPCATCHBUF cbuf, int val)
+{
+	sb = *((struct special_buffer **)cbuf);
+#ifdef	DEBUG_CATCH
+	printf ("Throwing to: %d\n", sb);
+#endif
+	longjmp (sb -> buffer, val);
+}
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 755f843..142f451 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -32,11 +32,14 @@
 50  pascal GetProcAddress(word ptr) GetProcAddress(1 2)
 51  pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2)
 52  pascal FreeProcInstance(ptr) FreeProcInstance(1)
+55  pascal Catch(ptr) Catch (1)
+56  pascal Throw(ptr word) Throw(1 2)
 59  pascal WriteProfileString(ptr ptr ptr) WriteProfileString(1 2 3)
 60  pascal FindResource(word ptr ptr) FindResource(1 2 3)
 61  pascal LoadResource(word word) LoadResource(1 2)
 62  pascal LockResource(word) LockResource(1)
 63  pascal FreeResource(word) FreeResource(1)
+64  pascal AccessResource(word word) AccessResource(1 2)
 74  pascal OpenFile(ptr ptr word) KERNEL_OpenFile(1 2 3)
 81  pascal _lclose(word) KERNEL__lclose(1)
 82  pascal _lread(word ptr word) KERNEL__lread(1 2 3)
@@ -48,6 +51,8 @@
 91  register InitTask(word word word word word
 		      word word word word word) 
 	     KERNEL_InitTask()
+95  pascal LoadLibrary(ptr) LoadLibrary(1)
+96  pascal FreeLibrary(word) FreeLibrary(1)
 102 register DOS3Call(word word word word word
 		      word word word word word) 
 	     KERNEL_DOS3Call()
@@ -67,6 +72,11 @@
 163 pascal GlobalLRUOldest(word) ReturnArg(1)
 164 pascal GlobalLRUNewest(word) ReturnArg(1)
 166 pascal WinExec(ptr word) WinExec(1 2)
+170 pascal AllocCStoDSAlias(word) AllocDStoCSAlias(1)
+171 pascal AllocDStoCSAlias(word) AllocDStoCSAlias(1)
+175 pascal AllocSelector(word) AllocSelector(1)
+176 pascal FreeSelector(word) FreeSelector(1)
+177 pascal PrestoChangoSelector(word word) PrestoChangoSelector(1 2)
 178 equate __WINFLAGS 0x413
 184 return GlobalDOSAlloc 4 0
 185 return GlobalDOSFree 2 0
diff --git a/if1632/relay.c b/if1632/relay.c
index 9bf6b12..859144c 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -166,10 +166,17 @@
 	    break;
 	    
 	  case DLL_ARGTYPE_LONG:
-	  case DLL_ARGTYPE_FARPTR:
 	    ip = (int *) ((char *) arg_ptr + offset);
 	    arg_table[i] = *ip;
 	    break;
+
+	  case DLL_ARGTYPE_FARPTR:
+	    ip = (int *) ((char *) arg_ptr + offset);
+	    if (*ip & 0xffff0000)
+		arg_table[i] = SAFEMAKEPTR((unsigned) *ip >> 16, *ip);
+	    else
+		arg_table[i] = *ip;
+	    break;
 	}
     }
 
diff --git a/if1632/user.spec b/if1632/user.spec
index 9f92bd8..bf032d6 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -15,6 +15,8 @@
 15  pascal GetCurrentTime() GetTickCount()
 18  pascal SetCapture(word) SetCapture(1)
 19  pascal ReleaseCapture() ReleaseCapture()
+20  pascal SetDoubleClickTime(word) SetDoubleClickTime(1)
+21  pascal GetDoubleClickTime() GetDoubleClickTime()
 22  pascal SetFocus(word) SetFocus(1)
 23  pascal GetFocus() GetFocus()
 31  pascal IsIconic(word) IsIconic(1)
@@ -28,16 +30,24 @@
 41  pascal CreateWindow(ptr ptr long s_word s_word s_word s_word word word word ptr) 
 	   CreateWindow(1 2 3 4 5 6 7 8 9 10 11)
 42  pascal ShowWindow(word word) ShowWindow(1 2)
+43  pascal CloseWindow(word) CloseWindow(1)
+44  pascal OpenIcon(word) OpenIcon(1)
 46  pascal GetParent(word) GetParent(1)
+47  pascal IsWindow(word) IsWindow(1)
 48  pascal IsChild(word word) IsChild(1 2)
+49  pascal IsWindowVisible(word) IsWindowVisible(1)
+50  pascal FindWindow(ptr ptr) FindWindow(1 2)
 53  pascal DestroyWindow(word) DestroyWindow(1)
 56  pascal MoveWindow(word word word word word word) 
            MoveWindow(1 2 3 4 5 6)
 57  pascal RegisterClass(ptr) RegisterClass(1)
+61  pascal ScrollWindow(word s_word s_word ptr ptr) ScrollWindow(1 2 3 4 5)
 62  pascal SetScrollPos(word word word word) SetScrollPos(1 2 3 4)
 64  pascal SetScrollRange(word word word word word) SetScrollRange(1 2 3 4 5)
 66  pascal GetDC(word) GetDC(1)
 68  pascal ReleaseDC(word word) ReleaseDC(1 2)
+69  pascal SetCursor(word word) SetCursor(1 2)
+71  pascal ShowCursor(word word) ShowCursor(1 2)
 72  pascal SetRect(ptr s_word s_word s_word s_word) SetRect(1 2 3 4 5)
 73  pascal SetRectEmpty(ptr) SetRectEmpty(1)
 74  pascal CopyRect(ptr ptr) CopyRect(1 2)
@@ -50,6 +60,7 @@
 81  pascal FillRect(word ptr word) FillRect(1 2 3)
 82  pascal InvertRect(word ptr) InvertRect(1 2)
 83  pascal FrameRect(word ptr word) FrameRect(1 2 3)
+84  pascal DrawIcon(word s_word s_word word) DrawIcon(1 2 3 4)
 85  pascal DrawText(word ptr s_word ptr word) DrawText(1 2 3 4 5)
 87  pascal DialogBox(word ptr word ptr) DialogBox(1 2 3 4)
 88  pascal EndDialog(word s_word) EndDialog(1 2)
@@ -109,8 +120,11 @@
 181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3)
 182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
 190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
+218 pascal DialogBoxIndirect(word word word ptr) DialogBoxIndirect(1 2 3 4)
 219 pascal CreateDialogIndirect(word ptr word ptr)
 	   CreateDialogIndirect(1 2 3 4)
+221 pascal ScrollDC(word s_word s_word ptr ptr word ptr) 
+	   ScrollDC(1 2 3 4 5 6 7)
 227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3)
 228 pascal GetNextDlgTabItem(word word word) GetNextDlgTabItem(1 2 3)
 229 pascal GetTopWindow(word) GetTopWindow(1)
@@ -118,6 +132,9 @@
 232 pascal SetWindowPos(word word word word word word word) 
            SetWindowPos(1 2 3 4 5 6 7)
 237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3)
+239 pascal DialogBoxParam(word ptr word ptr long) DialogBoxParam(1 2 3 4 5)
+240 pascal DialogBoxIndirectParam(word word word ptr long)
+	   DialogBoxIndirectParam(1 2 3 4 5)
 241 pascal CreateDialogParam(word ptr word ptr long)
 	   CreateDialogParam(1 2 3 4 5)
 242 pascal CreateDialogIndirectParam(word ptr word ptr long)
@@ -128,6 +145,8 @@
 277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1)
 286 pascal GetDesktopWindow() GetDesktopWindow()
 288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
+319 pascal ScrollWindowEx(word s_word s_word ptr ptr word ptr word) 
+	   ScrollWindowEx(1 2 3 4 5 6 7 8)
 324 pascal FillWindow(word word word word) FillWindow(1 2 3 4)
 325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
 334 pascal GetQueueStatus(word) GetQueueStatus(1)
@@ -149,6 +168,8 @@
 452 pascal CreateWindowEx(long ptr ptr long s_word s_word s_word s_word 
 	                  word word word ptr) 
 	   CreateWindowEx(1 2 3 4 5 6 7 8 9 10 11 12)
+457 pascal DestroyIcon(word) DestroyIcon(1)
+458 pascal DestroyCursor(word) DestroyCursor(1)
 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/cursor.h b/include/cursor.h
new file mode 100644
index 0000000..c70df90
--- /dev/null
+++ b/include/cursor.h
@@ -0,0 +1,27 @@
+/*
+ * structure definitions for CURSOR
+ *
+ * Copyright  Martin Ayotte, 1993
+ *
+ */
+
+typedef struct {
+	BYTE	Width;
+	BYTE	Reserved1;
+	BYTE	Height;
+	BYTE	Reserved2;
+	WORD	curXHotspot;
+	WORD	curYHotspot;
+	DWORD	curDIBSize;
+	DWORD	curDIBOffset;
+	} CURSORDESCRIP;
+
+typedef struct {
+	CURSORDESCRIP	descriptor;
+	HBITMAP		hBitmap;
+	Display		*display;
+	Pixmap		pixshape;
+	Pixmap		pixmask;
+	Cursor		xcursor;
+	} CURSORALLOC;
+
diff --git a/include/dialog.h b/include/dialog.h
index 190c8c9..4cfddba 100644
--- a/include/dialog.h
+++ b/include/dialog.h
@@ -54,15 +54,6 @@
 } DLGCONTROLHEADER;
 
 
-  /* Dialog control data */
-typedef struct
-{
-    DLGCONTROLHEADER * header;
-    LPSTR              class;
-    LPSTR              text;
-} DLGCONTROL;
-
-
   /* Dialog template */
 typedef struct
 {
@@ -72,7 +63,6 @@
     LPSTR               caption;
     WORD                pointSize;
     LPSTR               faceName;
-    DLGCONTROL *        controls;
 } DLGTEMPLATE;
 
 
diff --git a/include/icon.h b/include/icon.h
new file mode 100644
index 0000000..4a38a60
--- /dev/null
+++ b/include/icon.h
@@ -0,0 +1,26 @@
+/*
+ * structure definitions for ICON
+ *
+ * Copyright  Martin Ayotte, 1993
+ *
+ */
+
+
+typedef struct {
+	BYTE	Width;
+	BYTE	Height;
+	BYTE	ColorCount;
+	BYTE	Reserved1;
+	WORD	Reserved2;
+	WORD	Reserved3;
+	DWORD	icoDIBSize;
+	DWORD	icoDIBOffset;
+	} ICONDESCRIP;
+
+typedef struct {
+	ICONDESCRIP	descriptor;
+	HBITMAP		hBitmap;
+	HBITMAP		hBitMask;
+	} ICONALLOC;
+
+
diff --git a/include/segmem.h b/include/segmem.h
index 6c4f7c5..ea9f851 100644
--- a/include/segmem.h
+++ b/include/segmem.h
@@ -7,6 +7,19 @@
 #define SEGMEM_H
 
 /*
+ * Array to track selector allocation.
+ */
+#define MAX_SELECTORS		512
+#define SELECTOR_ISFREE		0x8000
+#define SELECTOR_INDEXMASK	0x0fff
+
+extern unsigned short SelectorMap[MAX_SELECTORS];
+
+#define SAFEMAKEPTR(s, o) \
+    (((int) SelectorMap[SelectorMap[(s) >> 3] & SELECTOR_INDEXMASK] << 19) \
+     | 0x70000 | ((o) & 0xffff))
+
+/*
  * Structure to hold info about each selector we create.
  */
 
diff --git a/include/windows.h b/include/windows.h
index dd937c5..9d3eaf3 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -66,6 +66,14 @@
 
 #define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
 
+#ifndef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
 /*
 typedef long LONG;
 typedef WORD HANDLE;
@@ -136,6 +144,8 @@
 	LPSTR   lpszClassName __attribute__ ((packed));
 } WNDCLASS, *LPWNDCLASS;
 
+typedef LONG	(* WNDPROC)() __attribute__ ((packed));
+
 #define CS_VREDRAW          0x0001
 #define CS_HREDRAW          0x0002
 #define CS_KEYCVTWINDOW     0x0004
@@ -230,6 +240,15 @@
 #define DLGC_STATIC          0x0100
 #define DLGC_BUTTON          0x2000
 
+/* Standard dialog button IDs */
+#define IDOK                1
+#define IDCANCEL            2
+#define IDABORT             3
+#define IDRETRY             4
+#define IDIGNORE            5
+#define IDYES               6
+#define IDNO                7
+
 
 typedef struct { short x, y; } POINT;
 typedef POINT *PPOINT;
@@ -735,17 +754,17 @@
 
 typedef struct tagBITMAPINFOHEADER
 {
-    unsigned long biSize;
-    unsigned long biWidth;
-    unsigned long biHeight;
-    unsigned short biPlanes;
-    unsigned short biBitCount;
-    unsigned long biCompression;
-    unsigned long biSizeImage;
-    unsigned long biXPelsPerMeter;
-    unsigned long biYPelsPerMeter;
-    unsigned long biClrUsed;
-    unsigned long biClrImportant;
+    DWORD 	biSize;
+    DWORD 	biWidth;
+    DWORD 	biHeight;
+    WORD 	biPlanes;
+    WORD 	biBitCount;
+    DWORD 	biCompression;
+    DWORD 	biSizeImage;
+    DWORD 	biXPelsPerMeter;
+    DWORD 	biYPelsPerMeter;
+    DWORD 	biClrUsed;
+    DWORD 	biClrImportant;
 } BITMAPINFOHEADER;
 
 typedef BITMAPINFOHEADER * LPBITMAPINFOHEADER;
@@ -1021,8 +1040,34 @@
 #define GCW_HBRBACKGROUND (-10)
 #endif
 
-#define MB_OK 0
-#define MB_ICONINFORMATION 0x0040
+#define MB_OK               0x0000
+#define MB_OKCANCEL         0x0001
+#define MB_ABORTRETRYIGNORE 0x0002
+#define MB_YESNOCANCEL      0x0003
+#define MB_YESNO            0x0004
+#define MB_RETRYCANCEL      0x0005
+#define MB_TYPEMASK         0x000F
+
+#define MB_ICONHAND         0x0010
+#define MB_ICONQUESTION     0x0020
+#define MB_ICONEXCLAMATION  0x0030
+#define MB_ICONASTERISK     0x0040
+#define MB_ICONMASK         0x00F0
+
+#define MB_ICONINFORMATION  MB_ICONASTERISK
+#define MB_ICONSTOP         MB_ICONHAND
+
+#define MB_DEFBUTTON1       0x0000
+#define MB_DEFBUTTON2       0x0100
+#define MB_DEFBUTTON3       0x0200
+#define MB_DEFMASK          0x0F00
+
+#define MB_APPLMODAL        0x0000
+#define MB_SYSTEMMODAL      0x1000
+#define MB_TASKMODAL        0x2000
+
+#define MB_NOFOCUS          0x8000
+
 
 #define DT_TOP 0
 #define DT_LEFT 0
@@ -1079,6 +1124,11 @@
 #define WS_EX_ACCEPTFILES      0x00000010L
 #define WS_EX_TRANSPARENT      0x00000020L
 
+/* Window scrolling */
+#define SW_SCROLLCHILDREN      0x0001
+#define SW_INVALIDATE          0x0002
+#define SW_ERASE               0x0003
+
 /* Button control styles */
 #define BS_PUSHBUTTON          0x00000000L
 #define BS_DEFPUSHBUTTON       0x00000001L
@@ -1319,6 +1369,70 @@
 #define ODS_CHECKED     0x0008
 #define ODS_FOCUS       0x0010
 
+/* Edit control styles */
+#define ES_LEFT         0x00000000L
+#define ES_CENTER       0x00000001L
+#define ES_RIGHT        0x00000002L
+#define ES_MULTILINE    0x00000004L
+#define ES_UPPERCASE    0x00000008L
+#define ES_LOWERCASE    0x00000010L
+#define ES_PASSWORD     0x00000020L
+#define ES_AUTOVSCROLL  0x00000040L
+#define ES_AUTOHSCROLL  0x00000080L
+#define ES_NOHISESEL    0x00000100L
+#define ES_OEMCONVERT   0x00000400L
+#define ES_READONLY     0x00000800L
+#define ES_WANTRETURN   0x00001000L
+
+/* Edit control messages */
+#define EM_GETSEL              (WM_USER+0)
+#define EM_SETSEL              (WM_USER+1)
+#define EM_GETRECT             (WM_USER+2)
+#define EM_SETRECT             (WM_USER+3)
+#define EM_SETRECTNP           (WM_USER+4)
+#define EM_LINESCROLL          (WM_USER+6)
+#define EM_GETMODIFY           (WM_USER+8)
+#define EM_SETMODIFY           (WM_USER+9)
+#define EM_GETLINECOUNT        (WM_USER+10)
+#define EM_LINEINDEX           (WM_USER+11)
+#define EM_SETHANDLE           (WM_USER+12)
+#define EM_GETHANDLE           (WM_USER+13)
+#define EM_LINELENGTH          (WM_USER+17)
+#define EM_REPLACESEL          (WM_USER+18)
+#define EM_GETLINE             (WM_USER+20)
+#define EM_LIMITTEXT           (WM_USER+21)
+#define EM_CANUNDO             (WM_USER+22)
+#define EM_UNDO                (WM_USER+23)
+#define EM_FMTLINES            (WM_USER+24)
+#define EM_LINEFROMCHAR        (WM_USER+25)
+#define EM_SETTABSTOPS         (WM_USER+27)
+#define EM_SETPASSWORDCHAR     (WM_USER+28)
+#define EM_EMPTYUNDOBUFFER     (WM_USER+29)
+#define EM_GETFIRSTVISIBLELINE (WM_USER+30)
+#define EM_SETREADONLY         (WM_USER+31)
+#define EM_SETWORDBREAKPROC    (WM_USER+32)
+#define EM_GETWORDBREAKPROC    (WM_USER+33)
+#define EM_GETPASSWORDCHAR     (WM_USER+34)
+
+typedef int (CALLBACK *EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent,
+					  int cch, int code);
+
+/* EDITWORDBREAKPROC code values */
+#define WB_LEFT         0
+#define WB_RIGHT        1
+#define WB_ISDELIMITER  2
+
+/* Edit control notification codes */
+#define EN_SETFOCUS     0x0100
+#define EN_KILLFOCUS    0x0200
+#define EN_CHANGE       0x0300
+#define EN_UPDATE       0x0400
+#define EN_ERRSPACE     0x0500
+#define EN_MAXTEXT      0x0501
+#define EN_HSCROLL      0x0601
+#define EN_VSCROLL      0x0602
+
+
 #define WM_DRAWITEM         0x002B
 
 typedef struct tagDRAWITEMSTRUCT
@@ -1485,12 +1599,12 @@
 Fa(int,lstrlen,LPCSTR,a)
 Fa(LONG,DispatchMessage,LPMSG,msg)
 Fa(void,UpdateWindow,HWND,a)
-Fa(ATOM,AddAtom,LPSTR,a)
+Fa(ATOM,AddAtom,LPCSTR,a)
 Fa(ATOM,DeleteAtom,ATOM,a)
-Fa(ATOM,FindAtom,LPSTR,a)
-Fa(ATOM,GlobalAddAtom,LPSTR,a)
+Fa(ATOM,FindAtom,LPCSTR,a)
+Fa(ATOM,GlobalAddAtom,LPCSTR,a)
 Fa(ATOM,GlobalDeleteAtom,ATOM,a)
-Fa(ATOM,GlobalFindAtom,LPSTR,a)
+Fa(ATOM,GlobalFindAtom,LPCSTR,a)
 Fa(BOOL,DeleteDC,HDC,a)
 Fa(BOOL,DeleteMetaFile,HANDLE,a)
 Fa(BOOL,DeleteObject,HANDLE,a)
@@ -1504,7 +1618,7 @@
 Fa(BOOL,GlobalUnWire,HANDLE,a)
 Fa(BOOL,GlobalUnfix,HANDLE,a)
 Fa(BOOL,GlobalUnlock,HANDLE,a)
-Fa(BOOL,InitAtomTable,int,a)
+Fa(BOOL,InitAtomTable,WORD,a)
 Fa(BOOL,IsClipboardFormatAvailable,WORD,a)
 Fa(BOOL,IsIconic,HWND,a)
 Fa(BOOL,IsRectEmpty,LPRECT,a)
@@ -1858,10 +1972,10 @@
 Fc(LONG,SetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
 Fc(LONG,SetClassLong,HWND,a,short,b,LONG,c)
 Fc(LONG,SetWindowLong,HWND,a,short,b,LONG,c)
-Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,int,c)
+Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,short,c)
 Fc(WORD,GetMenuState,HMENU,a,WORD,b,WORD,c)
 Fc(WORD,GetProfileInt,LPSTR,a,LPSTR,b,int,c)
-Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,int,c)
+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)
@@ -1911,7 +2025,7 @@
 Fd(LONG,SendMessage,HWND,a,WORD,b,WORD,c,LONG,d)
 Fd(BOOL,GetMessage,LPMSG,msg,HWND,b,WORD,c,WORD,d)
 Fd(BOOL,GetTextExtentPoint,HDC,a,LPSTR,b,short,c,LPSIZE,d)
-Fd(BOOL,DrawIcon,HDC,a,int,b,int,c,HICON,d)
+Fd(BOOL,DrawIcon,HDC,a,short,b,short,c,HICON,d)
 Fd(BOOL,EnumMetaFile,HDC,a,LOCALHANDLE,b,FARPROC,c,BYTE FAR*,d)
 Fd(BOOL,FloodFill,HDC,a,int,b,int,c,DWORD,d)
 Fd(BOOL,GetCharWidth,HDC,a,WORD,b,WORD,c,LPINT,d)
@@ -1986,7 +2100,7 @@
 Fe(LONG,DefFrameProc,HWND,a,HWND,b,WORD,c,WORD,d,LONG,e)
 Fe(LONG,SendDlgItemMessage,HWND,a,WORD,b,WORD,c,WORD,d,LONG,e)
 Fe(int,DialogBoxIndirectParam,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d,LONG,e)
-Fe(int,DialogBoxParam,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d,LONG,e)
+Fe(int,DialogBoxParam,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d,LONG,e)
 Fe(int,DlgDirList,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
 Fe(int,DlgDirListComboBox,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
 Fe(int,Escape,HDC,a,int,b,int,c,LPSTR,d,LPSTR,e)
@@ -1999,7 +2113,7 @@
 Fe(int,SetVoiceAccent,int,a,int,b,int,c,int,d,int,e)
 Fe(int,ToAscii,WORD,wVirtKey,WORD,wScanCode,LPSTR,lpKeyState,LPVOID,lpChar,WORD,wFlags)
 Fe(void,PaintRect,HWND,a,HWND,b,HDC,c,HBRUSH,d,LPRECT,e)
-Fe(void,ScrollWindow,HWND,a,int,b,int,c,LPRECT,d,LPRECT,e)
+Fe(void,ScrollWindow,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e)
 Fe(void,SetRect,LPRECT,a,short,b,short,c,short,d,short,e)
 Fe(void,SetRectRgn,HRGN,a,short,b,short,c,short,d,short,e)
 Fe(void,SetScrollRange,HWND,a,int,b,int,c,int,d,BOOL,e)
@@ -2012,7 +2126,7 @@
 Ff(BOOL,ScaleViewportExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
 Ff(BOOL,ScaleWindowExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
 Fg(BOOL,RoundRect,HDC,a,short,b,short,c,short,d,short,e,short,f,short,g)
-Fg(BOOL,ScrollDC,HDC,a,int,b,int,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g)
+Fg(BOOL,ScrollDC,HDC,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g)
 Fg(BOOL,TrackPopupMenu,HMENU,a,WORD,b,int,c,int,d,int,e,HWND,f,LPRECT,g)
 Fg(HCURSOR,CreateCursor,HANDLE,a,int,b,int,c,int,d,int,e,LPSTR,f,LPSTR,g)
 Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g)
@@ -2022,6 +2136,7 @@
 Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
 Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
 Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
+Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,WORD,h)
 Fi(BOOL,Arc,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
 Fi(BOOL,Chord,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
 Fi(BOOL,BitBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,DWORD,i)
diff --git a/loader/Makefile b/loader/Makefile
index 662b597..873a6ac 100644
--- a/loader/Makefile
+++ b/loader/Makefile
@@ -1,7 +1,7 @@
 CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
 
 OBJS=dump.o files.o ldt.o ldtlib.o resource.o selector.o signal.o int1a.o \
-     int21.o wine.o
+     int21.o wine.o library.o
 
 default: loader.o
 
diff --git a/loader/files.c b/loader/files.c
index 8bf3fbb..a4371c6 100644
--- a/loader/files.c
+++ b/loader/files.c
@@ -66,6 +66,7 @@
 			strncpy(buffer, dirname, buflen);
 			strncat(buffer, "/", buflen - strlen(buffer));
 			strncat(buffer, f->d_name, buflen - strlen(buffer));
+			closedir(d);
 			return buffer;
 		    }
 		}
diff --git a/loader/int21.c b/loader/int21.c
index 968801b..fdf506a 100644
--- a/loader/int21.c
+++ b/loader/int21.c
@@ -665,6 +665,7 @@
 	struct stat filestat;
 	struct tm *now;
 
+	dirname = (char *) pointer(DS,DX);
 	ParseDOSFileName(unixname, dirname, &drive);
 
 	{
@@ -872,7 +873,7 @@
 	case 0x12: /* FIND NEXT MATCHING FILE USING FCB */
 	case 0x13: /* DELETE FILE USING FCB */
 	case 0x14: /* SEQUENTIAL READ FROM FCB FILE */		
-	case 0x15: /* SEQUENTIAL WRITE TO FCB FILE
+	case 0x15: /* SEQUENTIAL WRITE TO FCB FILE */
 	case 0x16: /* CREATE OR TRUNCATE FILE USING FCB */
 	case 0x17: /* RENAME FILE USING FCB */
 	case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */
@@ -888,7 +889,7 @@
 	case 0x2e: /* SET VERIFY FLAG */
 		break;
 
-	case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY *
+	case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY */
 	case 0x1d:
 	case 0x1e:
 	case 0x20:
diff --git a/loader/library.c b/loader/library.c
new file mode 100644
index 0000000..6e96351
--- /dev/null
+++ b/loader/library.c
@@ -0,0 +1,37 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "prototypes.h"
+#include "windows.h"
+#include "win.h"
+#include "gdi.h"
+#include "wine.h"
+
+
+
+/**********************************************************************
+ *				LoadLibrary	[KERNEL.95]
+ */
+HANDLE LoadLibrary(LPSTR libname)
+{
+    HANDLE hRet;
+    printf("LoadLibrary '%s'\n", libname);
+    hRet = LoadImage(libname, NULL);
+    printf("after LoadLibrary hRet=%04X\n", hRet);
+    return hRet;
+}
+
+
+/**********************************************************************
+ *				FreeLibrary	[KERNEL.96]
+ */
+void FreeLibrary(HANDLE hLib)
+{
+    printf("FreeLibrary(%04X);\n", hLib);
+    if (hLib != (HANDLE)NULL) GlobalFree(hLib);
+}
+
diff --git a/loader/resource.c b/loader/resource.c
index eeafc9e..a0c986c 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -1,6 +1,7 @@
 static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $";
 static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
 
+#include <X11/Intrinsic.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
@@ -8,16 +9,32 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include "prototypes.h"
-#include "neexe.h"
 #include "windows.h"
+#include "win.h"
 #include "gdi.h"
 #include "wine.h"
+#include "icon.h"
+#include "cursor.h"
 
 #define MIN(a,b)	((a) < (b) ? (a) : (b))
 
+typedef struct resource_s
+{
+    struct resource_s *next;
+    HANDLE info_mem;
+    int size_shift;
+    struct resource_nameinfo_s nameinfo;
+    HANDLE rsc_mem;
+} RESOURCE;
+
 static int ResourceFd = -1;
 static HANDLE ResourceInst = 0;
 static struct w_files *ResourceFileInfo = NULL;
+static RESOURCE *Top = NULL;
+static HCURSOR hActiveCursor;
+extern HINSTANCE hSysRes;
+
+HANDLE RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret);
 
 
 /**********************************************************************
@@ -227,6 +244,11 @@
 	    printf("FindResourceByName (%s) bad typeinfo size !\n", resource_name);
 	    return -1;
 	}
+#ifdef DEBUG_RESOURCE
+	printf("FindResourceByName typeinfo.type_id=%d type_id=%d\n",
+			typeinfo.type_id, type_id);
+#endif
+	if (typeinfo.type_id == 0) break;
 	if (typeinfo.type_id == type_id || type_id == -1)
 	{
 	    for (i = 0; i < typeinfo.count; i++)
@@ -248,6 +270,10 @@
 		read(ResourceFd, name, nbytes);
 		lseek(ResourceFd, old_pos, SEEK_SET);
 		name[nbytes] = '\0';
+#ifdef DEBUG_RESOURCE
+		printf("FindResourceByName type_id=%d name='%s' resource_name='%s'\n", 
+				typeinfo.type_id, name, resource_name);
+#endif
 		if (strcasecmp(name, resource_name) == 0)
 		{
 		    memcpy(result_p, &nameinfo, sizeof(nameinfo));
@@ -255,31 +281,289 @@
 		}
 	    }
 	}
+	else {
+	    lseek(ResourceFd, (typeinfo.count * sizeof(nameinfo)), SEEK_CUR);
+	}
     }
-    printf("FindResourceByName (%s) typeinfo.type_id = 0 !\n", resource_name);
-    
     return -1;
 }
-
+
+
 /**********************************************************************
- *					LoadIcon
+ *			LoadIcon [USER.174]
  */
-HICON
-LoadIcon(HANDLE instance, LPSTR icon_name)
+HICON LoadIcon(HANDLE instance, LPSTR icon_name)
 {
-  fprintf(stderr,"LoadIcon: (%d),%d\n",instance,icon_name);
+    HICON 	hIcon;
+    HANDLE 	rsc_mem;
+    WORD 	*lp;
+    ICONDESCRIP *lpicodesc;
+    ICONALLOC	*lpico;
+    int		width, height;
+    BITMAPINFO 	*bmi;
+    BITMAPINFOHEADER 	*bih;
+    RGBQUAD	*rgbq;
+    HBITMAP 	hBitMap;
+    HDC 	hMemDC;
+    HDC 	hMemDC2;
+    HDC 	hdc;
+    int 	i, j, image_size;
+#ifdef DEBUG_RESOURCE
+    printf("LoadIcon: instance = %04x, name = %08x\n",
+	   instance, icon_name);
+#endif
+    
+    if (instance == (HANDLE)NULL)  instance = hSysRes;
+    if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
+    rsc_mem = RSC_LoadResource(instance, icon_name, NE_RSCTYPE_GROUP_ICON, 
+			       &image_size);
+    if (rsc_mem == (HANDLE)NULL) {
+	printf("LoadIcon / Icon %04X not Found !\n", icon_name);
+	return 0;
+	}
+    lp = (WORD *)GlobalLock(rsc_mem);
+    if (lp == NULL) {
+	GlobalFree(rsc_mem);
+	return 0;
+	}
+    lpicodesc = (ICONDESCRIP *)(lp + 3);
+    hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
+    if (hIcon == (HICON)NULL) {
+	GlobalFree(rsc_mem);
+	return 0;
+	}
+    printf("LoadIcon Alloc hIcon=%X\n", hIcon);
+    lpico = (ICONALLOC *)GlobalLock(hIcon);
+    lpico->descriptor = *lpicodesc;
+    width = lpicodesc->Width;
+    height = lpicodesc->Height;
+    GlobalUnlock(rsc_mem);
+    GlobalFree(rsc_mem);
+    rsc_mem = RSC_LoadResource(instance, 
+    	MAKEINTRESOURCE(lpicodesc->icoDIBOffset), 
+    	NE_RSCTYPE_ICON, &image_size);
+    if (rsc_mem == (HANDLE)NULL) {
+	printf("LoadIcon / Icon %04X Bitmaps not Found !\n", icon_name);
+	return 0;
+	}
+    lp = (WORD *)GlobalLock(rsc_mem);
+    if (lp == NULL) {
+	GlobalFree(rsc_mem);
+	return 0;
+ 	}
+    bmi = (BITMAPINFO *)lp;
+    bih = (BITMAPINFOHEADER *)lp;
+    rgbq = &bmi->bmiColors[0];
+    bih->biHeight = bih->biHeight / 2;
+/*
+    printf("LoadIcon / image_size=%d width=%d height=%d bih->biBitCount=%d bih->biSizeImage=%ld\n", 
+    	image_size, width, height, bih->biBitCount, bih->biSizeImage);
+*/
+    if (bih->biSize == sizeof(BITMAPINFOHEADER))
+	lpico->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)bih);
+    else
+        lpico->hBitmap = 0;
+    bih->biBitCount = 1;
+    bih->biClrUsed = bih->biClrImportant  = 2;
+    rgbq[0].rgbBlue 	= 0xFF;
+    rgbq[0].rgbGreen 	= 0xFF;
+    rgbq[0].rgbRed 	= 0xFF;
+    rgbq[0].rgbReserved = 0x00;
+    rgbq[1].rgbBlue 	= 0x00;
+    rgbq[1].rgbGreen 	= 0x00;
+    rgbq[1].rgbRed 	= 0x00;
+    rgbq[1].rgbReserved = 0x00;
+    lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT,
+    	(LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4,
+	(BITMAPINFO *)bih, DIB_RGB_COLORS );
+    GlobalUnlock(rsc_mem);
+    GlobalFree(rsc_mem);
+    
+    hMemDC = CreateCompatibleDC(hdc);
+    hMemDC2 = CreateCompatibleDC(hdc);
+    SelectObject(hMemDC, lpico->hBitmap);
+    SelectObject(hMemDC2, lpico->hBitMask);
+    BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0, SRCINVERT);
+    DeleteDC(hMemDC);
+    DeleteDC(hMemDC2);
+
+    ReleaseDC(0, hdc);
+    return hIcon;
+}
+
+
+/**********************************************************************
+ *			DestroyIcon [USER.457]
+ */
+BOOL DestroyIcon(HICON hIcon)
+{
+    ICONALLOC	*lpico;
+    if (hIcon == (HICON)NULL) return FALSE;
+    lpico = (ICONALLOC *)GlobalLock(hIcon);
+    if (lpico->hBitmap != (HBITMAP)NULL) DeleteObject(lpico->hBitmap);
+    GlobalFree(hIcon);
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *			LoadCursor [USER.173]
+ */
+HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name)
+{
+    XColor	bkcolor;
+    XColor	fgcolor;
+    HCURSOR 	hCursor;
+    HANDLE 	rsc_mem;
+    WORD 	*lp;
+    CURSORDESCRIP *lpcurdesc;
+    CURSORALLOC	  *lpcur;
+    BITMAP 	BitMap;
+    HBITMAP 	hBitMap;
+    HDC 	hMemDC;
+    HDC 	hdc;
+    int i, j, image_size;
+#ifdef DEBUG_RESOURCE
+    printf("LoadCursor: instance = %04x, name = %08x\n",
+	   instance, cursor_name);
+#endif    
+    if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
+    if (instance == (HANDLE)NULL)  instance = hSysRes;
+    rsc_mem = RSC_LoadResource(instance, cursor_name, NE_RSCTYPE_GROUP_CURSOR, 
+			       &image_size);
+    if (rsc_mem == (HANDLE)NULL) {
+	printf("LoadCursor / Cursor %08X not Found !\n", cursor_name);
+	return 0;
+	}
+    lp = (WORD *)GlobalLock(rsc_mem);
+    if (lp == NULL) {
+	GlobalFree(rsc_mem);
+	return 0;
+	}
+    lpcurdesc = (CURSORDESCRIP *)(lp + 3);
+#ifdef DEBUG_CURSOR
+    printf("LoadCursor / image_size=%d\n", image_size);
+    printf("LoadCursor / curReserved=%X\n", *lp);
+    printf("LoadCursor / curResourceType=%X\n", *(lp + 1));
+    printf("LoadCursor / curResourceCount=%X\n", *(lp + 2));
+    printf("LoadCursor / cursor Width=%d\n", (int)lpcurdesc->Width);
+    printf("LoadCursor / cursor Height=%d\n", (int)lpcurdesc->Height);
+    printf("LoadCursor / cursor curXHotspot=%d\n", (int)lpcurdesc->curXHotspot);
+    printf("LoadCursor / cursor curYHotspot=%d\n", (int)lpcurdesc->curYHotspot);
+    printf("LoadCursor / cursor curDIBSize=%lX\n", (DWORD)lpcurdesc->curDIBSize);
+    printf("LoadCursor / cursor curDIBOffset=%lX\n", (DWORD)lpcurdesc->curDIBOffset);
+#endif
+    hCursor = GlobalAlloc(GMEM_MOVEABLE, sizeof(CURSORALLOC) + 1024L); 
+    if (hCursor == (HCURSOR)NULL) {
+	GlobalFree(rsc_mem);
+	return 0;
+	}
+    printf("LoadCursor Alloc hCursor=%X\n", hCursor);
+    lpcur = (CURSORALLOC *)GlobalLock(hCursor);
+    lpcur->descriptor = *lpcurdesc;
+    GlobalUnlock(rsc_mem);
+    GlobalFree(rsc_mem);
+    rsc_mem = RSC_LoadResource(instance, 
+    	MAKEINTRESOURCE(lpcurdesc->curDIBOffset), 
+    	NE_RSCTYPE_CURSOR, &image_size);
+    if (rsc_mem == (HANDLE)NULL) {
+	printf("LoadCursor / Cursor %08X Bitmap not Found !\n", cursor_name);
+	return 0;
+	}
+    lp = (WORD *)GlobalLock(rsc_mem);
+    if (lp == NULL) {
+	GlobalFree(rsc_mem);
+	return 0;
+ 	}
+    lp += 2;
+    for (j = 0; j < 16; j++)
+    	printf("%04X ", *(lp + j));
+    if (*lp == sizeof(BITMAPINFOHEADER))
+	lpcur->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)lp);
+    else
+        lpcur->hBitmap = 0;
+    lp += sizeof(BITMAP);
+    for (i = 0; i < 81; i++) {
+	char temp = *((char *)lp + 162 + i);
+	*((char *)lp + 162 + i) = *((char *)lp + 324 - i);
+	*((char *)lp + 324 - i) = temp;
+	}
+printf("LoadCursor / before XCreatePixmapFromBitmapData !\n");
+    lpcur->pixshape = XCreatePixmapFromBitmapData(
+    	XT_display, DefaultRootWindow(XT_display), 
+        ((char *)lp + 211), 32, 32,
+/*
+        lpcurdesc->Width / 2, lpcurdesc->Height / 4, 
+*/
+        WhitePixel(XT_display, DefaultScreen(XT_display)), 
+        BlackPixel(XT_display, DefaultScreen(XT_display)), 1);
+    lpcur->pixmask = lpcur->pixshape;
+    bkcolor.pixel = WhitePixel(XT_display, DefaultScreen(XT_display)); 
+    fgcolor.pixel = BlackPixel(XT_display, DefaultScreen(XT_display));
+printf("LoadCursor / before XCreatePixmapCursor !\n");
+    lpcur->xcursor = XCreatePixmapCursor(XT_display,
+ 	lpcur->pixshape, lpcur->pixmask, 
+ 	&fgcolor, &bkcolor, lpcur->descriptor.curXHotspot, 
+ 	lpcur->descriptor.curYHotspot);
+
+    ReleaseDC(0, hdc); 
+    GlobalUnlock(rsc_mem);
+    GlobalFree(rsc_mem);
+    return hCursor;
+}
+
+
+
+/**********************************************************************
+ *			DestroyCursor [USER.458]
+ */
+BOOL DestroyCursor(HCURSOR hCursor)
+{
+    CURSORALLOC	*lpcur;
+    if (hCursor == (HCURSOR)NULL) return FALSE;
+    lpcur = (CURSORALLOC *)GlobalLock(hCursor);
+    if (lpcur->hBitmap != (HBITMAP)NULL) DeleteObject(lpcur->hBitmap);
+    GlobalUnlock(hCursor);
+    GlobalFree(hCursor);
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *			SetCursor [USER.69]
+ */
+HCURSOR SetCursor(HCURSOR hCursor)
+{
+    HDC		hDC;
+    HDC		hMemDC;
+    BITMAP	bm;
+    CURSORALLOC	*lpcur;
+    HCURSOR	hOldCursor;
+#ifdef DEBUG_CURSOR
+    printf("SetCursor / hCursor=%04X !\n", hCursor);
+#endif
+    if (hCursor == (HCURSOR)NULL) return FALSE;
+    lpcur = (CURSORALLOC *)GlobalLock(hCursor);
+    hOldCursor = hActiveCursor;
+    
+printf("SetCursor / before XDefineCursor !\n");
+    XDefineCursor(XT_display, DefaultRootWindow(XT_display), lpcur->xcursor);
+    GlobalUnlock(hCursor);
+    hActiveCursor = hCursor;
+    return hOldCursor;
+}
+
+
+/**********************************************************************
+ *			ShowCursor [USER.71]
+ */
+int ShowCursor(BOOL bShow)
+{
+    if (bShow) {
+    	}
     return 0;
 }
 
-/**********************************************************************
- *					LoadCursor
- */
-HCURSOR
-LoadCursor(HANDLE instance, LPSTR cursor_name)
-{
-  fprintf(stderr,"LoadCursor: (%d),%d\n",instance,cursor_name);
-    return 0;
-}
 
 /**********************************************************************
  *					LoadAccelerators
@@ -296,8 +580,43 @@
  */
 HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name)
 {
-    fprintf(stderr,"FindResource: (%d),%d\n",instance, resource_name, type_name);
-    return 0;
+    RESOURCE *r;
+    HANDLE rh;
+
+    if (instance == 0)
+	return 0;
+    
+    if (OpenResourceFile(instance) < 0)
+	return 0;
+    
+    rh = GlobalAlloc(GMEM_MOVEABLE, sizeof(*r));
+    if (rh == 0)
+	return 0;
+    r = (RESOURCE *)GlobalLock(rh);
+
+    r->next = Top;
+    Top = r;
+    r->info_mem = rh;
+    r->rsc_mem = 0;
+
+    if (((int) resource_name & 0xffff0000) == 0)
+    {
+	r->size_shift = FindResourceByNumber(&r->nameinfo, type_name,
+					     (int) resource_name | 0x8000);
+    }
+    else
+    {
+	r->size_shift = FindResourceByName(&r->nameinfo, type_name, 
+					   resource_name);
+    }
+    
+    if (r->size_shift == -1)
+    {
+	GlobalFree(rh);
+	return 0;
+    }
+
+    return rh;
 }
 
 /**********************************************************************
@@ -305,8 +624,36 @@
  */
 HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
 {
-    fprintf(stderr,"LoadResource: (%d),%d\n",instance, hResInfo);
-    return ;
+    RESOURCE *r;
+    int image_size;
+    void *image;
+    HANDLE h;
+
+    if (instance == 0)
+	return 0;
+    
+    if (OpenResourceFile(instance) < 0)
+	return 0;
+
+    r = (RESOURCE *)GlobalLock(hResInfo);
+    if (r == NULL)
+	return 0;
+    
+    image_size = r->nameinfo.length << r->size_shift;
+
+    h = r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size);
+    image = GlobalLock(h);
+
+    if (image == NULL || read(ResourceFd, image, image_size) != image_size)
+    {
+	GlobalFree(h);
+	GlobalUnlock(hResInfo);
+	return 0;
+    }
+
+    GlobalUnlock(h);
+    GlobalUnlock(hResInfo);
+    return h;
 }
 
 /**********************************************************************
@@ -314,19 +661,51 @@
  */
 LPSTR LockResource(HANDLE hResData)
 {
-    fprintf(stderr,"LockResource: %d\n", hResData);
-    return ;
+    return GlobalLock(hResData);
 }
 
 /**********************************************************************
  *				FreeResource	[KERNEL.63]
  */
-BOOL FreeResource(HANDLE hResData)
+HANDLE FreeResource(HANDLE hResData)
 {
-    fprintf(stderr,"FreeResource: %d\n", hResData);
-    return ;
+    RESOURCE *r, *rp;
+    
+    for (r = rp = Top; r != NULL; r = r->next)
+    {
+	if (r->info_mem == hResData)
+	{
+	    if (rp != NULL)
+		rp->next = r->next;
+	    else
+		Top = r->next;
+	    
+	    GlobalFree(r->rsc_mem);
+	    GlobalFree(r->info_mem);
+	    return 0;
+	}
+    }
+    
+    return hResData;
 }
 
+/**********************************************************************
+ *				AccessResource	[KERNEL.64]
+ */
+int AccessResource(HANDLE instance, HANDLE hResInfo)
+{
+    int	resfile;
+#ifdef DEBUG_RESOURCE
+    printf("AccessResource(%04X, %04X);\n", instance, hResInfo);
+#endif
+/*
+    resfile = OpenResourceFile(instance);
+    return resfile;
+*/
+    return - 1;
+}
+
+
 
 /**********************************************************************
  *					RSC_LoadResource
@@ -365,9 +744,10 @@
     {
 	size_shift = FindResourceByName(&nameinfo, type, rsc_name);
     }
-    if (size_shift == -1)
+    if (size_shift == -1) {
+    	printf("RSC_LoadResource / Resource '%X' not Found !\n", rsc_name);
 	return 0;
-
+	}
     /*
      * Read resource.
      */
@@ -406,15 +786,15 @@
 	   instance, resource_id, buffer, buflen);
 #endif
 
-    hmem = RSC_LoadResource(instance, (char *) (resource_id >> 4),
+    hmem = RSC_LoadResource(instance, (char *) ((resource_id >> 4) + 1),
 			    NE_RSCTYPE_STRING, &rsc_size);
     if (hmem == 0)
 	return 0;
     
     p = GlobalLock(hmem);
     string_num = resource_id & 0x000f;
-    for (i = 0; i < resource_id; i++)
-	p += *p;
+    for (i = 0; i < string_num; i++)
+	p += *p + 1;
     
     i = MIN(buflen - 1, *p);
     memcpy(buffer, p + 1, i);
@@ -445,7 +825,6 @@
 {
     HBITMAP hbitmap;
     HANDLE rsc_mem;
-    GDIOBJHDR * ptr;
     HDC hdc;
     long *lp;
     int image_size;
@@ -454,11 +833,20 @@
     printf("LoadBitmap: instance = %04x, name = %08x\n",
 	   instance, bmp_name);
 #endif
+    printf("LoadBitmap: instance = %04x, name = %08x\n",
+	   instance, bmp_name);
     
-    if (!(hdc = GetDC( 0 ))) return 0;
+    if (instance == (HANDLE)NULL)  instance = hSysRes;
+    if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
 
+printf("before RSC_Load\n");
     rsc_mem = RSC_LoadResource(instance, bmp_name, NE_RSCTYPE_BITMAP, 
 			       &image_size);
+    if (rsc_mem == (HANDLE)NULL) {
+	printf("LoadBitmap / BitMap %04X not Found !\n", bmp_name);
+	return 0;
+	}
+printf("before GlobalLock\n");
     lp = (long *) GlobalLock(rsc_mem);
     if (lp == NULL)
     {
@@ -470,7 +858,7 @@
     else if (*lp == sizeof(BITMAPINFOHEADER))
 	hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );
     else hbitmap = 0;
-
+printf("LoadBitmap %04X\n", hbitmap);
     GlobalFree(rsc_mem);
     ReleaseDC( 0, hdc );
     return hbitmap;
diff --git a/loader/selector.c b/loader/selector.c
index 489dfd6..f091d1d 100644
--- a/loader/selector.c
+++ b/loader/selector.c
@@ -38,52 +38,260 @@
 #define UTEXTSEL 0x1f
 #endif
 
-#define MAX_SELECTORS	512
-
 static struct segment_descriptor_s * EnvironmentSelector =  NULL;
 static struct segment_descriptor_s * PSP_Selector = NULL;
 struct segment_descriptor_s * MakeProcThunks = NULL;
 unsigned short PSPSelector;
 unsigned char ran_out = 0;
 unsigned short SelectorOwners[MAX_SELECTORS];
+unsigned short SelectorMap[MAX_SELECTORS];
+unsigned short SelectorLimits[MAX_SELECTORS];
+unsigned char  SelectorTypes[MAX_SELECTORS];
+int LastUsedSelector = FIRST_SELECTOR - 1;
 
-static int next_unused_selector = FIRST_SELECTOR;
+#ifdef DEV_ZERO
+    static FILE *zfile = NULL;
+#endif    
+
 extern void KERNEL_Ordinal_102();
 extern void UNIXLIB_Ordinal_0();
 
 extern char **Argv;
 extern int Argc;
-
+
 /**********************************************************************
- *					GetNextSegment
+ *					FindUnusedSelector
+ */
+int
+FindUnusedSelector(void)
+{
+    int i;
+    
+    for (i = LastUsedSelector + 1; i != LastUsedSelector; i++)
+    {
+	if (i >= MAX_SELECTORS)
+	    i = FIRST_SELECTOR;
+	
+	if (!SelectorMap[i])
+	    break;
+    }
+    
+    if (i == LastUsedSelector)
+	return 0;
+
+    LastUsedSelector = i;
+    return i;
+}
+
+/**********************************************************************
+ *					AllocSelector
+ *
+ * This is very bad!!!  This function is implemented for Windows
+ * compatibility only.  Do not call this from the emulation library.
+ */
+unsigned int
+AllocSelector(unsigned int old_selector)
+{
+    int i_new, i_old;
+    long base;
+    
+    i_new = FindUnusedSelector();
+    if (old_selector)
+    {
+	i_old = (old_selector >> 3);
+	SelectorMap[i_new] = i_old;
+	base = SAFEMAKEPTR(old_selector, 0);
+	if (set_ldt_entry(i_new, base, 
+			  SelectorLimits[i_old], 0, 
+			  SelectorTypes[i_old], 0, 0) < 0)
+	{
+	    return 0;
+	}
+
+	SelectorLimits[i_new] = SelectorLimits[i_old];
+	SelectorTypes[i_new]  = SelectorTypes[i_old];
+	SelectorMap[i_new]    = SelectorMap[i_old];
+    }
+    else
+    {
+	SelectorMap[i_new] = i_new;
+    }
+
+    return i_new;
+}
+
+/**********************************************************************
+ *					PrestoChangoSelector
+ *
+ * This is very bad!!!  This function is implemented for Windows
+ * compatibility only.  Do not call this from the emulation library.
+ */
+unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector)
+{
+    long dst_base, src_base;
+    char *p;
+    int src_idx, dst_idx;
+    int alias_count;
+    int i;
+    
+    src_idx = (SelectorMap[src_selector >> 3]);
+    dst_idx = dst_selector >> 3;
+    src_base = (src_idx << 19) | 0x70000;
+    dst_base = (dst_idx << 19) | 0x70000;
+
+    alias_count = 0;
+    for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++)
+	if (SelectorMap[i] == src_idx)
+	    alias_count++;
+    
+    if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA 
+	|| alias_count > 1 || src_idx == dst_idx)
+    {
+	if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA)
+	    SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_CODE;
+	else
+	    SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA;
+
+	SelectorMap[dst_idx] = SelectorMap[src_idx];
+	SelectorLimits[dst_idx] = SelectorLimits[src_idx];
+	if (set_ldt_entry(dst_idx, src_base,
+			  SelectorLimits[dst_idx], 0, 
+			  SelectorTypes[dst_idx], 0, 0) < 0)
+	{
+	    return 0;
+	}
+    }
+    else
+    {
+	/*
+	 * We're changing an unaliased code segment into a data
+	 * segment.  The SAFEST (but ugliest) way to deal with 
+	 * this is to map the new segment and copy all the contents.
+	 */
+	SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA;
+	SelectorMap[dst_idx] = SelectorMap[src_idx];
+	SelectorLimits[dst_idx] = SelectorLimits[src_idx];
+#ifdef DEV_ZERO
+	if (zfile == NULL)
+	    zfile = fopen("/dev/zero","r");
+	p = (void *) mmap((char *) dst_base,
+			  ((SelectorLimits[dst_idx] + PAGE_SIZE) 
+			   & ~(PAGE_SIZE - 1)),
+			  PROT_EXEC | PROT_READ | PROT_WRITE,
+			  MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
+#else
+	p = (void *) mmap((char *) dst_base,
+			  ((SelectorLimits[dst_idx] + PAGE_SIZE) 
+			   & ~(PAGE_SIZE - 1)),
+			  PROT_EXEC | PROT_READ | PROT_WRITE,
+			  MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
+#endif
+	if (p == NULL)
+	    return 0;
+	
+	memcpy((void *) dst_base, (void *) src_base, 
+	       SelectorLimits[dst_idx] + 1);
+	if (set_ldt_entry(src_idx, dst_base,
+			  SelectorLimits[dst_idx], 0, 
+			  SelectorTypes[dst_idx], 0, 0) < 0)
+	{
+	    return 0;
+	}
+	if (set_ldt_entry(dst_idx, dst_base,
+			  SelectorLimits[dst_idx], 0, 
+			  SelectorTypes[dst_idx], 0, 0) < 0)
+	{
+	    return 0;
+	}
+    }
+
+    return (dst_idx << 3) | 0x0007;
+}
+
+/**********************************************************************
+ *					AllocCStoDSAlias
+ */
+AllocDStoCSAlias(unsigned int ds_selector)
+{
+    unsigned int cs_selector;
+    
+    if (ds_selector == 0)
+	return 0;
+    
+    cs_selector = AllocSelector(0);
+    return PrestoChangoSelector(ds_selector, cs_selector);
+}
+
+/**********************************************************************
+ *					FreeSelector
+ */
+unsigned int FreeSelector(unsigned int sel)
+{
+    int sel_idx;
+    int alias_count;
+    int i;
+    
+    sel_idx = SelectorMap[sel >> 3];
+
+    if (sel_idx != (sel >> 3))
+    {
+	SelectorMap[sel >> 3] = 0;
+	return 0;
+    }
+    
+    alias_count = 0;
+    for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++)
+	if (SelectorMap[i] == sel_idx)
+	    alias_count++;
+
+    if (alias_count == 1)
+    {
+	munmap((char *) (sel << 16), 
+	       ((SelectorLimits[sel_idx] + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
+	SelectorMap[sel >> 3] = 0;
+    }
+
+    return 0;
+}
+
+/**********************************************************************
+ *					CreateNewSegment
  */
 struct segment_descriptor_s *
-GetNextSegment(unsigned int flags, unsigned int limit)
+CreateNewSegment(int code_flag, int read_only, int length)
 {
-    struct segment_descriptor_s *selectors, *s;
-    int sel_idx;
-#ifdef DEV_ZERO
-    FILE *zfile;
-#endif
-
-    sel_idx = next_unused_selector++;
+    struct segment_descriptor_s *s;
+    int contents;
+    int i;
+    
+    i = FindUnusedSelector();
 
     /*
      * Fill in selector info.
      */
     s = malloc(sizeof(*s));
-    s->flags = NE_SEGFLAGS_DATA;
-    s->selector = (sel_idx << 3) | 0x0007;
-    s->length = limit;
+    if (code_flag)
+    {
+	contents = MODIFY_LDT_CONTENTS_CODE;
+	s->flags = 0;
+    }
+    else
+    {
+	contents = MODIFY_LDT_CONTENTS_DATA;
+	s->flags = NE_SEGFLAGS_DATA;
+    }
+    
+    s->selector = (i << 3) | 0x0007;
+    s->length = length;
 #ifdef DEV_ZERO
-    zfile = fopen("/dev/zero","r");
+    if (zfile == NULL)
+	zfile = fopen("/dev/zero","r");
     s->base_addr = (void *) mmap((char *) (s->selector << 16),
 				 ((s->length + PAGE_SIZE - 1) & 
 				  ~(PAGE_SIZE - 1)),
 				 PROT_EXEC | PROT_READ | PROT_WRITE,
 				 MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
 
-    fclose(zfile);
 #else
     s->base_addr = (void *) mmap((char *) (s->selector << 16),
 				 ((s->length + PAGE_SIZE - 1) & 
@@ -93,18 +301,30 @@
 
 #endif
 
-    if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, 
+    if (set_ldt_entry(i, (unsigned long) s->base_addr, 
 		      (s->length - 1) & 0xffff, 0, 
-		      MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0)
+		      contents, read_only, 0) < 0)
     {
-	next_unused_selector--;
 	free(s);
 	return NULL;
     }
 
+    SelectorMap[i] = (unsigned short) i;
+    SelectorLimits[i] = s->length - 1;
+    SelectorTypes[i] = contents;
+    
     return s;
 }
-
+
+/**********************************************************************
+ *					GetNextSegment
+ */
+struct segment_descriptor_s *
+GetNextSegment(unsigned int flags, unsigned int limit)
+{
+    return CreateNewSegment(0, 0, limit);
+}
+
 /**********************************************************************
  *					GetEntryPointFromOrdinal
  */
@@ -275,37 +495,14 @@
  *					CreateEnvironment
  */
 static struct segment_descriptor_s *
-#ifdef DEV_ZERO
-CreateEnvironment(FILE *zfile)
-#else
 CreateEnvironment(void)
-#endif
 {
     char *p;
-    int sel_idx;
     struct segment_descriptor_s * s;
 
-    s = (struct segment_descriptor_s *) 
-	    malloc(sizeof(struct segment_descriptor_s));
-
-    sel_idx =  next_unused_selector++;
-    /*
-     * Create memory to hold environment.
-     */
-    s->flags = NE_SEGFLAGS_DATA;
-    s->selector = (sel_idx << 3) | 0x0007;
-    s->length = PAGE_SIZE;
-#ifdef DEV_ZERO
-    s->base_addr = (void *) mmap((char *) (s->selector << 16),
-				 PAGE_SIZE,
-				 PROT_EXEC | PROT_READ | PROT_WRITE,
-				 MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
-#else
-    s->base_addr = (void *) mmap((char *) (s->selector << 16),
-				 PAGE_SIZE,
-				 PROT_EXEC | PROT_READ | PROT_WRITE,
-				 MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
-#endif
+    s = CreateNewSegment(0, 0, PAGE_SIZE);
+    if (s == NULL)
+	return NULL;
 
     /*
      * Fill environment with meaningless babble.
@@ -318,63 +515,6 @@
     *p++ = 0;
     strcpy(p, "C:\\TEST.EXE");
 
-    /*
-     * Create entry in LDT for this segment.
-     */
-    if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, 
-		      (s->length - 1) & 0xffff, 0, 
-		      MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0)
-    {
-	myerror("Could not create LDT entry for environment");
-    }
-    return  s;
-}
-
-/**********************************************************************
- *					CreateThunks
- */
-static struct segment_descriptor_s *
-#ifdef DEV_ZERO
-CreateThunks(FILE *zfile)
-#else
-CreateThunks(void)
-#endif
-{
-    int sel_idx;
-    struct segment_descriptor_s * s;
-
-    s = (struct segment_descriptor_s *) 
-	    malloc(sizeof(struct segment_descriptor_s));
-
-    sel_idx =  next_unused_selector++;
-    /*
-     * Create memory to hold environment.
-     */
-    s->flags = 0;
-    s->selector = (sel_idx << 3) | 0x0007;
-    s->length = 0x10000;
-#ifdef DEV_ZERO
-    s->base_addr = (void *) mmap((char *) (s->selector << 16),
-				 s->length,
-				 PROT_EXEC | PROT_READ | PROT_WRITE,
-				 MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
-#else
-    s->base_addr = (void *) mmap((char *) (s->selector << 16),
-				 s->length,
-				 PROT_EXEC | PROT_READ | PROT_WRITE,
-				 MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
-#endif
-
-
-    /*
-     * Create entry in LDT for this segment.
-     */
-    if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, 
-		      (s->length - 1) & 0xffff, 0, 
-		      MODIFY_LDT_CONTENTS_CODE, 0, 0) < 0)
-    {
-	myerror("Could not create LDT entry for thunks");
-    }
     return  s;
 }
 
@@ -382,40 +522,15 @@
  *					CreatePSP
  */
 static struct segment_descriptor_s *
-#ifdef DEV_ZERO
-CreatePSP(FILE *zfile)
-#else
 CreatePSP(void)
-#endif
 {
     struct dos_psp_s *psp;
     unsigned short *usp;
-    int sel_idx;
     struct segment_descriptor_s * s;
     char *p1, *p2;
     int i;
 
-    s = (struct segment_descriptor_s *) 
-	    malloc(sizeof(struct segment_descriptor_s));
-    
-    sel_idx =  next_unused_selector++;
-    /*
-     * Create memory to hold PSP.
-     */
-    s->flags = NE_SEGFLAGS_DATA;
-    s->selector = (sel_idx << 3) | 0x0007;
-    s->length = PAGE_SIZE;
-#ifdef DEV_ZERO
-    s->base_addr = (void *) mmap((char *) (s->selector << 16),
-				 PAGE_SIZE,
-				 PROT_EXEC | PROT_READ | PROT_WRITE,
-				 MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
-#else
-    s->base_addr = (void *) mmap((char *) (s->selector << 16),
-				 PAGE_SIZE,
-				 PROT_EXEC | PROT_READ | PROT_WRITE,
-				 MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
-#endif
+    s = CreateNewSegment(0, 0, PAGE_SIZE);
 
     /*
      * Fill PSP
@@ -451,15 +566,6 @@
     *p1 = '\0';
     psp->pspCommandTailCount = strlen(psp->pspCommandTail);
 
-    /*
-     * Create entry in LDT for this segment.
-     */
-    if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr, 
-		      (s->length - 1) & 0xffff, 0, 
-		      MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0)
-    {
-	myerror("Could not create LDT entry for PSP");
-    }
     return s;
 }
 
@@ -472,15 +578,12 @@
     int fd = wpnt->fd;
     struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
     struct ne_header_s *ne_header = wpnt->ne_header;
-    struct segment_descriptor_s *selectors, *s;
-    unsigned short *sp;
+    struct segment_descriptor_s *selectors, *s, *stmp;
+    unsigned short auto_data_sel;
     int contents, read_only;
     int SelectorTableLength;
     int i;
     int status;
-#ifdef DEV_ZERO
-    FILE * zfile;
-#endif
     int old_length, file_image_length;
 
     /*
@@ -495,24 +598,12 @@
      * Step through the segment table in the exe header.
      */
     s = selectors;
-#ifdef DEV_ZERO
-    zfile = fopen("/dev/zero","r");
-#endif
     for (i = 0; i < ne_header->n_segment_tab; i++, s++)
     {
-#ifdef DEBUG_SEGMENT
-	printf("  %2d: OFFSET %04.4x, LENGTH %04.4x, ",
-	       i + 1, seg_table[i].seg_data_offset, 
-	       seg_table[i].seg_data_length);
-	printf("FLAGS %04.4x, MIN ALLOC %04.4x\n",
-	       seg_table[i].seg_flags, seg_table[i].min_alloc);
-#endif
-
 	/*
 	 * Store the flags in our table.
 	 */
 	s->flags = seg_table[i].seg_flags;
-	s->selector = ((next_unused_selector + i) << 3) | 0x0007;
 
 	/*
 	 * Is there an image for this segment in the file?
@@ -570,19 +661,12 @@
 	    if (s->flags & NE_SEGFLAGS_EXECUTEONLY)
 		read_only = 1;
 	}
-#ifdef DEV_ZERO        
-	s->base_addr =
-	  (void *) mmap((char *) (s->selector << 16),
-			(s->length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1),
-			PROT_EXEC | PROT_READ | PROT_WRITE,
-			MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
-#else
-	s->base_addr =
-	  (void *) mmap((char *) (s->selector << 16),
-			(s->length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1),
-			PROT_EXEC | PROT_READ | PROT_WRITE,
-			MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
-#endif
+
+	stmp = CreateNewSegment(!(s->flags & NE_SEGFLAGS_DATA), read_only,
+				s->length);
+	s->base_addr = stmp->base_addr;
+	s->selector = stmp->selector;
+	
 	if (seg_table[i].seg_data_offset != 0)
 	{
 	    /*
@@ -593,56 +677,28 @@
 	    if(read(fd, s->base_addr, file_image_length) != file_image_length)
 		myerror("Unable to read segment from file");
 	}
-	/*
-	 * Create entry in LDT for this segment.
-	 */
-	if (set_ldt_entry(s->selector >> 3, (unsigned long) s->base_addr, 
-			  (s->length - 1) & 0xffff, 0, 
-			  contents, read_only, 0) < 0)
-	{
-	    free(selectors);
-	    fprintf(stderr,"Ran out of ldt  entries.\n");
-	    ran_out++;
-	    return NULL;
-	}
-#ifdef DEBUG_SEGMENT
-	printf("      SELECTOR %04.4x, %s\n",
-	       s->selector, 
-	       contents == MODIFY_LDT_CONTENTS_CODE ? "CODE" : "DATA");
-#endif
+
 	/*
 	 * If this is the automatic data segment, then we must initialize
 	 * the local heap.
 	 */
 	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);
 	}
     }
 
-    sp = &SelectorOwners[next_unused_selector];
-    for (i = 0; i < ne_header->n_segment_tab; i++)
-	*sp++ = (((next_unused_selector + ne_header->auto_data_seg - 1) << 3)
-		 | 0x0007);
-
-    next_unused_selector += ne_header->n_segment_tab;
+    s = selectors;
+    for (i = 0; i < ne_header->n_segment_tab; i++, s++)
+	SelectorOwners[s->selector >> 3] = auto_data_sel;
 
     if(!EnvironmentSelector) {
-#ifdef DEV_ZERO
-	    EnvironmentSelector = CreateEnvironment(zfile);
-	    PSP_Selector = CreatePSP(zfile);
-	    MakeProcThunks = CreateThunks(zfile);
-#else
 	    EnvironmentSelector = CreateEnvironment();
 	    PSP_Selector = CreatePSP();
-	    MakeProcThunks = CreateThunks();
-#endif
+	    MakeProcThunks = CreateNewSegment(1, 0, 0x10000);
     };
 
-#ifdef DEV_ZERO
-    fclose(zfile);
-#endif
-
     return selectors;
 }
diff --git a/loader/signal.c b/loader/signal.c
index cc85fc7..7b2727c 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -10,7 +10,8 @@
 #include <linux/sched.h>
 #include <asm/system.h>
 #endif
-#include <wine.h>
+#include "wine.h"
+#include "segmem.h"
  
 char * cstack[4096];
 struct sigaction segv_act;
@@ -64,7 +65,7 @@
 
 	/*  Now take a look at the actual instruction where the program
 	    bombed */
-	instr = (char *) ((scp->sc_cs << 16) | (scp->sc_eip & 0xffff));
+	instr = (char *) SAFEMAKEPTR(scp->sc_cs, scp->sc_eip);
 
 	if(*instr != 0xcd) {
 		fprintf(stderr,
diff --git a/loader/wine.c b/loader/wine.c
index 82928ca..7124317 100644
--- a/loader/wine.c
+++ b/loader/wine.c
@@ -38,11 +38,13 @@
 struct mz_header_s *CurrentMZHeader;
 struct ne_header_s *CurrentNEHeader;
 int CurrentNEFile;
+HINSTANCE hSysRes;
 
 static char *dllExtensions[] = { "dll", "exe", NULL };
 static char *exeExtensions[] = { "exe", NULL };
 static char *WinePath = NULL;
 
+
 /**********************************************************************
  *					DebugPrintString
  */
@@ -99,7 +101,7 @@
  *					LoadImage
  * Load one NE format executable into memory
  */
-LoadImage(char * filename,  char * modulename)
+HINSTANCE LoadImage(char * filename,  char * modulename)
 {
     unsigned int read_size;
     int i;
@@ -236,6 +238,7 @@
 
       fprintf(stderr,"Unable to load:%s\n",  buff);
     }
+return(wpnt->hinstance);
 }
 
 
@@ -278,6 +281,7 @@
 	}
 	
 	LoadImage(exe_path, NULL);
+    	hSysRes = LoadImage("sysres.dll", NULL);
 	
 	if(ran_out) exit(1);
 #ifdef DEBUG
diff --git a/memory/global.c b/memory/global.c
index 3edfbbe..169ebc3 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -555,7 +555,7 @@
      * reallocate the block.  If this fails, call GlobalAlloc() to get
      * a new block.
      */
-    if (g->sequence = 0)
+    if (g->sequence == 0)
     {
 	MDESC **free_list;
 	void *p;
diff --git a/misc/Makefile b/misc/Makefile
index e5d5542..12180d0 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -1,7 +1,7 @@
 CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
 
 OBJS=dos.o kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
-     keyboard.o profile.o lstr.o exec.o
+     keyboard.o profile.o lstr.o exec.o message.o
 
 default: misc.o
 
diff --git a/misc/exec.c b/misc/exec.c
index d2e7866..8bbace7 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -41,7 +41,7 @@
    }  
    switch(fork()) {
       case -1:
-         printf("Can'k 'fork' process !\n");
+         printf("Can't 'fork' process !\n");
          break;
       case 0:
          printf("New process started !\n");
@@ -68,7 +68,7 @@
    printf("WinHelp(%s, %u, %lu)\n", lpHelpFile, wCommand, dwData);
    switch(fork()) {
       case -1:
-         printf("Can'k 'fork' process !\n");
+         printf("Can't 'fork' process !\n");
          break;
       case 0:
          printf("New process started !\n");
diff --git a/misc/message.c b/misc/message.c
new file mode 100644
index 0000000..281b012
--- /dev/null
+++ b/misc/message.c
@@ -0,0 +1,264 @@
+/*
+ * 'Wine' MessageBox function handling
+ *
+ * Copyright 1993 Martin Ayotte
+ */
+
+static char Copyright[] = "Copyright Martin Ayotte, 1993";
+
+#include "windows.h"
+#include "heap.h"
+#include "win.h"
+
+
+typedef struct tagMSGBOX {
+    LPSTR	Title;
+    LPSTR	Str;
+    WORD	wType;
+    WORD	wRetVal;
+    BOOL	ActiveFlg;
+    HWND	hWndYes;
+    HWND	hWndNo;
+    HWND	hWndCancel;
+    HICON	hIcon;
+} MSGBOX;
+typedef MSGBOX FAR* LPMSGBOX;
+
+
+LONG SystemMessageBoxProc(HWND hwnd, WORD message, WORD wParam, LONG lParam);
+
+/**************************************************************************
+ *			MessageBox  [USER.1]
+ */
+
+int MessageBox( HWND hWnd, LPSTR str, LPSTR title, WORD type )
+{
+    HWND    	hDlg;
+    WND	    	*wndPtr;
+    WNDCLASS  	wndClass;
+    MSG	    	msg;
+    MSGBOX	mb;
+    wndPtr = WIN_FindWndPtr(hWnd);
+    printf( "MessageBox: '%s'\n", str );
+    wndClass.style           = CS_HREDRAW | CS_VREDRAW ;
+    wndClass.lpfnWndProc     = (WNDPROC)SystemMessageBoxProc;
+    wndClass.cbClsExtra      = 0;
+    wndClass.cbWndExtra      = 0;
+    wndClass.hInstance       = wndPtr->hInstance;
+    wndClass.hIcon           = (HICON)NULL;
+    wndClass.hCursor         = LoadCursor((HANDLE)NULL, IDC_ARROW);
+    wndClass.hbrBackground   = GetStockObject(WHITE_BRUSH);
+    wndClass.lpszMenuName    = NULL;
+    wndClass.lpszClassName   = "MESSAGEBOX";
+    if (!RegisterClass(&wndClass)) return 0;
+    memset(&mb, 0, sizeof(MSGBOX));
+    mb.Title = title;
+    mb.Str = str;
+    mb.wType = type;
+    mb.ActiveFlg = TRUE;
+    hDlg = CreateWindow("MESSAGEBOX", title, 
+    	WS_POPUP | WS_DLGFRAME | WS_VISIBLE, 100, 150, 320, 120,
+    	(HWND)NULL, (HMENU)NULL, wndPtr->hInstance, (LPSTR)&mb);
+    if (hDlg == 0) return 0;
+    while(TRUE) {
+	if (!mb.ActiveFlg) break;
+	if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
+	TranslateMessage(&msg);
+	DispatchMessage(&msg);
+	}
+    printf( "after MessageBox !\n");
+    if (!UnregisterClass("MESSAGEBOX", wndPtr->hInstance)) return 0;
+    return(mb.wRetVal);
+}
+
+
+
+LPMSGBOX MsgBoxGetStorageHeader(HWND hwnd)
+{
+    WND  *wndPtr;
+    LPMSGBOX lpmb;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    if (wndPtr == 0) {
+    	printf("Bad Window handle on MessageBox !\n");
+    	return 0;
+    	}
+    lpmb = *((LPMSGBOX *)&wndPtr->wExtra[1]);
+    return lpmb;
+}
+
+
+
+
+LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam)
+{
+    WND	    *wndPtr;
+    CREATESTRUCT *createStruct;
+    PAINTSTRUCT	ps;
+    HDC		hDC;
+    RECT	rect;
+    LPMSGBOX	lpmb;
+    LPMSGBOX	lpmbInit;
+    BITMAP	bm;
+    HBITMAP	hBitMap;
+    HDC		hMemDC;
+    HICON	hIcon;
+    HINSTANCE	hInst2;
+    int		x;
+    switch(message) {
+	case WM_CREATE:
+	    wndPtr = WIN_FindWndPtr(hWnd);
+	    createStruct = (CREATESTRUCT *)lParam;
+     	    lpmbInit = (LPMSGBOX)createStruct->lpCreateParams;
+     	    if (lpmbInit == 0) break;
+	    *((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmbInit;
+	    lpmb = MsgBoxGetStorageHeader(hWnd);
+	    GetClientRect(hWnd, &rect);
+	    switch(lpmb->wType & MB_TYPEMASK) {
+		case MB_OK :
+		    lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 - 70, rect.bottom - 25, 
+			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+		    break;
+		case MB_OKCANCEL :
+		    lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 - 70, rect.bottom - 25, 
+			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+		    lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 + 10, rect.bottom - 25, 
+			60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+		    break;
+		case MB_ABORTRETRYIGNORE :
+		    lpmb->hWndYes = CreateWindow("BUTTON", "&Retry", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 - 70, rect.bottom - 25, 
+			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+		    lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 + 10, rect.bottom - 25, 
+			60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+		    lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 + 80, rect.bottom - 25, 
+			60, 18, hWnd, 3, wndPtr->hInstance, 0L);
+		    break;
+		case MB_YESNO :
+		    lpmb->hWndYes = CreateWindow("BUTTON", "&Yes", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 - 70, rect.bottom - 25, 
+			60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+		    lpmb->hWndNo = CreateWindow("BUTTON", "&No", 
+			WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+			rect.right / 2 + 10, rect.bottom - 25, 
+			60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+		    break;
+		}
+	    switch(lpmb->wType & MB_ICONMASK) {
+		case MB_ICONEXCLAMATION:
+		    printf("MsgBox LoadIcon Exclamation !\n");
+		    lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION);
+		    break;
+		case MB_ICONQUESTION:
+		    printf("MsgBox LoadIcon Question !\n");
+		    lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_QUESTION);
+		    break;
+		case MB_ICONASTERISK:
+		    printf("MsgBox LoadIcon Asterisk !\n");
+		    lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_ASTERISK);
+		    break;
+		case MB_ICONHAND:
+		    printf("MsgBox LoadIcon Hand !\n");
+		    lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_HAND);
+		    break;
+	    	}
+	    break;
+	case WM_PAINT:
+	    lpmb = MsgBoxGetStorageHeader(hWnd);
+	    GetClientRect(hWnd, &rect);
+	    hDC = BeginPaint(hWnd, &ps);
+	    if (lpmb->hIcon) DrawIcon(hDC, 30, 20, lpmb->hIcon);
+	    TextOut(hDC, rect.right / 2, 15, 
+	    	lpmb->Title, strlen(lpmb->Title));
+	    TextOut(hDC, rect.right / 2, 30, 
+	    	lpmb->Str, strlen(lpmb->Str));
+	    EndPaint(hWnd, &ps);
+	    break;
+	case WM_DESTROY:
+	    printf("MessageBox WM_DESTROY !\n");
+	    ReleaseCapture();
+	    lpmb = MsgBoxGetStorageHeader(hWnd);
+	    lpmb->ActiveFlg = FALSE;
+	    if (lpmb->hIcon) DestroyIcon(lpmb->hIcon);
+	    if (lpmb->hWndYes) DestroyWindow(lpmb->hWndYes);
+	    if (lpmb->hWndNo) DestroyWindow(lpmb->hWndNo);
+	    if (lpmb->hWndCancel) DestroyWindow(lpmb->hWndCancel);
+	    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, "SMILE");
+		    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", NULL);
+		    hIcon = LoadIcon(hInst2, "EV3LITE");
+		    DrawIcon(hDC, 20, 20, hIcon);
+		    DestroyIcon(hIcon);
+		    hInst2 = LoadImage("sysres.dll", NULL);
+		    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);
+	    break;
+	default:
+	    return DefWindowProc(hWnd, message, wParam, lParam );
+    }
+return(0);
+}
+
+
+
diff --git a/misc/xt.c b/misc/xt.c
index 928d6dd..8d386ae 100644
--- a/misc/xt.c
+++ b/misc/xt.c
@@ -53,11 +53,6 @@
  */
 
 
-int MessageBox( HWND hwnd, LPSTR str, LPSTR title, WORD type )
-{
-    printf( "MessageBox: '%s'\n", str );
-}
-
 void MessageBeep( WORD i )
 {
     XBell(XT_display, 100);
@@ -102,12 +97,6 @@
 }
 
 
-BOOL IsIconic( HWND hwnd )
-{
-    printf( "IsIconic: returning FALSE\n" );
-    return FALSE;
-}
-
 HMENU CreateMenu() { return 0; }
 
 BOOL AppendMenu( HMENU hmenu, WORD flags, WORD id, LPSTR text ) { return TRUE;}
diff --git a/objects/color.c b/objects/color.c
index 0215d47..19065ea 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -19,7 +19,7 @@
  * We try to use a private color map if possible, because Windows programs
  * assume that palette(0) == Black and palette(max-1) == White.
  */
-#define USE_PRIVATE_MAP
+#undef USE_PRIVATE_MAP
 
 Colormap COLOR_WinColormap = 0;
 
diff --git a/objects/dib.c b/objects/dib.c
index 839f0b5..735e449 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -6,9 +6,11 @@
 
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
+#include <stdio.h>
 #include <stdlib.h>
 
 #include "gdi.h"
+#include "icon.h"
 
 
 extern XImage * BITMAP_BmpToImage( BITMAP *, void * );
@@ -201,3 +203,45 @@
 				    bits, data, coloruse );
     return handle;
 }
+
+/***********************************************************************
+ *           DrawIcon    (USER.84)
+ */
+BOOL DrawIcon(HDC hDC, short x, short y, HICON hIcon)
+{
+    ICONALLOC	*lpico;
+    BITMAP	bm;
+    HBITMAP	hBitTemp;
+    HDC		hMemDC;
+    HDC		hMemDC2;
+#ifdef DEBUG_ICON
+    printf("DrawIcon(%04X, %d, %d, %04X) \n", hDC, x, y, hIcon);
+#endif
+    if (hIcon == (HICON)NULL) return FALSE;
+    lpico = (ICONALLOC *)GlobalLock(hIcon);
+    GetObject(lpico->hBitmap, sizeof(BITMAP), (LPSTR)&bm);
+#ifdef DEBUG_ICON
+    printf("DrawIcon / x=%d y=%d\n", x, y);
+    printf("DrawIcon / icon Width=%d\n", (int)lpico->descriptor.Width);
+    printf("DrawIcon / icon Height=%d\n", (int)lpico->descriptor.Height);
+    printf("DrawIcon / icon ColorCount=%d\n", (int)lpico->descriptor.ColorCount);
+    printf("DrawIcon / icon icoDIBSize=%lX\n", (DWORD)lpico->descriptor.icoDIBSize);
+    printf("DrawIcon / icon icoDIBOffset=%lX\n", (DWORD)lpico->descriptor.icoDIBOffset);
+    printf("DrawIcon / bitmap bmWidth=%d bmHeight=%d\n", bm.bmWidth, bm.bmHeight);
+#endif
+    hMemDC = CreateCompatibleDC(hDC);
+#ifdef DEBUG_ICON
+    SelectObject(hMemDC, lpico->hBitmap);
+    BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+    SelectObject(hMemDC, lpico->hBitMask);
+    BitBlt(hDC, x, y + bm.bmHeight, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+#else
+    SelectObject(hMemDC, lpico->hBitMask);
+    BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCAND);
+    SelectObject(hMemDC, lpico->hBitmap);
+    BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCPAINT);
+#endif
+    DeleteDC(hMemDC);
+    return TRUE;
+}
+
diff --git a/sysres.dll b/sysres.dll
new file mode 100755
index 0000000..44a53ab
--- /dev/null
+++ b/sysres.dll
Binary files differ
diff --git a/test/btnlook.c b/test/btnlook.c
deleted file mode 100755
index 28f5608..0000000
--- a/test/btnlook.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*------------------------------------------

-   BTNLOOK.C -- Button Look Program

-  ------------------------------------------*/

-

-#include <windows.h>

-#include <stdio.h>

-

-struct

-{

-	long    style;

-	char    *text;

-}

-button[] =

-{

-	BS_PUSHBUTTON,          "PUSHBUTTON",

-	BS_DEFPUSHBUTTON,       "DEFPUSHBUTTON",

-	BS_CHECKBOX,            "CHECKBOX",

-	BS_AUTOCHECKBOX,        "AUTOCHECKBOX",

-	BS_RADIOBUTTON,         "RADIOBUTTON",

-	BS_3STATE,              "3STATE",

-	BS_AUTO3STATE,          "AUTO3STATE",

-	BS_GROUPBOX,            "GROUPBOX",

-	BS_USERBUTTON,          "USERBUTTON",

-	BS_AUTORADIOBUTTON,     "AUTORADIOBUTTON"

-};

-

-#define NUM (sizeof button / sizeof button[0])

-

-long FAR PASCAL _export WndProc(HWND, WORD, WORD, LONG);

-

-int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,

-		   LPSTR lpszCmdParam, int nCmdShow)

-{

-	static char szAppName[] = "BtnLook";

-	HWND        hwnd;

-	MSG         msg;

-	WNDCLASS    wndclass;

-

-	if (!hPrevInstance)

-	{

-		wndclass.style          = CS_HREDRAW | CS_VREDRAW;

-		wndclass.lpfnWndProc    = WndProc;

-		wndclass.cbClsExtra     = 0;

-		wndclass.cbWndExtra     = 0;

-		wndclass.hInstance      = hInstance;

-		wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);

-		wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);

-		wndclass.hbrBackground  = GetStockObject(WHITE_BRUSH);

-		wndclass.lpszMenuName   = NULL;

-		wndclass.lpszClassName  = szAppName;

-

-		RegisterClass(&wndclass);

-	}

-

-	hwnd = CreateWindow(szAppName, "Button Look",

-			WS_OVERLAPPEDWINDOW,

-			CW_USEDEFAULT, CW_USEDEFAULT,

-			CW_USEDEFAULT, CW_USEDEFAULT,

-			NULL, NULL, hInstance, NULL);

-

-	ShowWindow(hwnd, nCmdShow);

-	UpdateWindow(hwnd);

-

-	while (GetMessage(&msg, NULL, 0, 0))

-	{

-		TranslateMessage(&msg);

-		DispatchMessage(&msg);

-	}

-	return msg.wParam;

-}

-

-long FAR PASCAL _export WndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)

-{

-	static char szPrm[]    = "wParam      LOWORD(lParam)  HIWORD(lParam)",

-		    szTop[]    = "Control ID  Window Handle   Notification",

-		    szUnd[]    = "__________  _____________   ____________",

-		    szFormat[] = " %5u          %4X          %5u",

-		    szBuffer[50];

-	static HWND hwndButton[NUM];

-	static RECT rect;

-	static int  cxChar, cyChar;

-	HDC         hdc;

-	PAINTSTRUCT ps;

-	int         i;

-	TEXTMETRIC  tm;

-

-	switch (message)

-	{

-		case WM_CREATE:

-			hdc = GetDC(hwnd);

-			SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));

-			GetTextMetrics(hdc, &tm);

-			cxChar = tm.tmAveCharWidth;

-			cyChar = tm.tmHeight + tm.tmExternalLeading;

-			ReleaseDC(hwnd, hdc);

-

-			for (i = 0; i < NUM; i++)

-				hwndButton[i] = CreateWindow("button", button[i].text,

-					   WS_CHILD | WS_VISIBLE | button[i].style,

-					   cxChar, cyChar * (1 + 2 * i),

-					   20 * cxChar, 7 * cyChar / 4,

-					   hwnd, i,

-					   ((LPCREATESTRUCT) lParam)->hInstance, NULL);

-			return 0;

-

-		case WM_SIZE:

-			rect.left   = 24 * cxChar;

-			rect.top    =  3 * cyChar;

-			rect.right  = LOWORD(lParam);

-			rect.bottom = HIWORD(lParam);

-			return 0;

-

-		case WM_PAINT:

-			InvalidateRect(hwnd, &rect, TRUE);

-

-			hdc = BeginPaint(hwnd, &ps);

-			SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));

-			SetBkMode(hdc, TRANSPARENT);

-			TextOut(hdc, 24 * cxChar, 1 * cyChar, szPrm, sizeof szPrm - 1);

-			TextOut(hdc, 24 * cxChar, 2 * cyChar, szTop, sizeof szTop - 1);

-			TextOut(hdc, 24 * cxChar, 2 * cyChar, szUnd, sizeof szUnd - 1);

-

-			EndPaint(hwnd, &ps);

-			return 0;

-

-		case WM_COMMAND:

-/*			ScrollWindow(hwnd, 0, -cyChar, &rect, &rect);  */

-			hdc = GetDC(hwnd);

-			SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));

-

-			TextOut(hdc, 24 * cxChar, cyChar * 5,  /* (rect.bottom / cyChar - 1), */

-				szBuffer, sprintf(szBuffer, szFormat, wParam,

-				LOWORD(lParam), HIWORD(lParam)));

-

-			ReleaseDC(hwnd, hdc);

-			ValidateRect(hwnd, NULL);

-			return 0;

-

-		case WM_DESTROY:

-			PostQuitMessage(0);

-			return 0;

-	}

-

-	return DefWindowProc(hwnd, message, wParam, lParam);

-}

-

diff --git a/test/btnlook.exe b/test/btnlook.exe
index 134c8a1..d952b61 100755
--- a/test/btnlook.exe
+++ b/test/btnlook.exe
Binary files differ
diff --git a/test/martin_ship2/widget.c b/test/martin_ship2/widget.c
deleted file mode 100755
index de7e29a..0000000
--- a/test/martin_ship2/widget.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/**********************************************************************

- *               Copyright (c) 1991 by TRG ELECTRONIK                 *

- *                                                                    *

- *                            widget.C                               *

- *              widget Inventory Controler   PART # 1                *

- *                                                                    *

- **********************************************************************/

-

-#include <WINDOWS.H>

-#include "STDIO.h"

-#include "STDLIB.h"

-#include "STDARG.h"

-#include "STRING.H"

-

-#include "widget.H"

-#include "widget.VAR"

-#include "widget.P"

-

-#define NoREF(a) a=a

-

-WORD          wPlayDiskID;

-

-HWND		hWndBut;

-HWND		hWndChk;

-HWND		hWndRadio;

-HWND		hWndLBox;

-HWND		hWndScrol;

-HWND		hWndScro2;

-HWND		hWndStat;

-HWND		hWndEdit;

-HWND		hWndCBox;

-int		x, y;

-

-/**********************************************************************/

-

-

-int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,

-                   LPSTR lpszCmdLine,int nCmdShow)

-{

-WNDCLASS  wndClass;

-MSG       msg;

-HWND      hWnd;

-HDC       hDC;

-char      C[40];

-int       X;

-NoREF(lpszCmdLine);

-if ( !hPrevInstance )

-    {

-    wndClass.style           = CS_HREDRAW | CS_VREDRAW ;

-    wndClass.lpfnWndProc     = (WNDPROC)WndProc;

-    wndClass.cbClsExtra      = 0;

-    wndClass.cbWndExtra      = 0;

-    wndClass.hInstance       = hInstance;

-    wndClass.hIcon           = LoadIcon(hInstance,(LPSTR)"ICON_1");

-    wndClass.hCursor         = LoadCursor(NULL, IDC_ARROW );

-    wndClass.hbrBackground   = GetStockObject(WHITE_BRUSH );

-    wndClass.lpszMenuName    = szAppName;

-    wndClass.lpszClassName   = szAppName;

-    if (!RegisterClass(&wndClass))

-        return FALSE;

-    }

-hWnd = CreateWindow(szAppName, "widget test program",

-                    WS_POPUP | WS_BORDER | WS_VISIBLE, 50, 50,

-                    400, 400, NULL, NULL, hInstance, NULL);

-hWndMain = hWnd;

-hInst = hInstance;

-hDCMain = GetDC(hWndMain);

-

-InitWidgets();

-

-while (GetMessage(&msg, NULL, 0, 0))

-    {

-    TranslateMessage(&msg );

-    DispatchMessage(&msg );

-    }

-ReleaseDC(hWndMain, hDC);

-return(0);

-}

-

-

-void InitWidgets()

-{

-hWndBut = CreateWindow("BUTTON", "Button #1",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON, 

-            230, 40, 80, 30, hWndMain, 1001, hInst, NULL);

-hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,

-				200, 140, 15, 100, hWndMain, 1004, hInst, NULL);

-hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,

-				50, 140, 100, 15, hWndMain, 1005, hInst, NULL);

-x = y = 25;

-SetVertScroll(NULL, hWndScrol, 25, 0, 50);

-SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE);

-SetScrollPos(hWndScro2, SB_CTL, 25, TRUE);

-hWndLBox = CreateWindow("LISTBOX", "",

-            WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,

-				230, 160, 150, 100, hWndMain, 1004, hInst, NULL);

-SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1");

-}

-

-

-

-long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam)

-{

-int	ShiftState;

-char	C[80];

-ShiftState = GetKeyState(VK_SHIFT);

-switch(Message)

-    {

-    case WM_COMMAND:

-		  if (LOWORD(lParam) != 0)

-			   {

-		  		sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam);

-		  		TextOut(hDCMain, 25, 280, C, strlen(C));

-			   }

-        break;

-

-    case WM_KEYDOWN:

-		  sprintf(C, "WM_KEYDOWN !!!");

-		  TextOut(hDCMain, 25, 40, C, strlen(C));

-		  KeyDown(hWnd, Message, wParam);

-        break;

-

-    case WM_CHAR:

-		  sprintf(C, "WM_CHAR !!!");

-		  TextOut(hDCMain, 25, 50, C, strlen(C));

-        break;

-

-    case WM_LBUTTONDOWN:

-        break;

-

-    case WM_LBUTTONUP:

-        break;

-

-    case WM_RBUTTONDOWN:

-        break;

-

-    case WM_RBUTTONUP:

-        break;

-

-    case WM_MOUSEMOVE:

-        break;

-

-    case WM_VSCROLL:

-		  sprintf(C, "WM_VSCROLL %X %X %lX !!!", Message, wParam, lParam);

-		  TextOut(hDCMain, 25, 370, C, strlen(C));

-		  Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50);

-        break;

-

-    case WM_HSCROLL:

-		  sprintf(C, "WM_HSCROLL %X %X %lX !!!", Message, wParam, lParam);

-		  TextOut(hDCMain, 25, 370, C, strlen(C));

-		  Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50);

-        break;

-

-    case WM_PAINT:

-        DoPaint(hWnd);

-        break;

-

-    case WM_DESTROY:

-        PostQuitMessage(0);

-        break;

-

-    default:

-        return DefWindowProc(hWnd, Message, wParam, lParam);

-    }

-return(0);

-}

-

-

-

-BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam)

-{

-WORD			wRet;

-UINT			uRet;

-DWORD			dwRet;

-char			C[128];

-char			C2[64];

-NoREF(hWnd);

-NoREF(Message);

-sprintf(C, "KeyDown %x !!!", wParam);

-TextOut(hDCMain, 25, 100, C, strlen(C));

-switch (wParam)

-    {

-    case VK_HOME:            /* 'HOME' KEY         */

-        break;

-    case VK_LEFT:            /* 'LEFT' CURSOR KEY  */

-        break;

-    case VK_RIGHT:           /* 'RIGHT' CURSOR KEY */

-        break;

-    case VK_UP:              /* 'UP' CURSOR KEY    */

-        break;

-    case VK_DOWN:            /* 'DOWN' CURSOR KEY  */

-        break;

-    case VK_PRIOR:           /* 'PGUP' CURSOR KEY  */

-        break;

-    case VK_NEXT:            /* 'PGDN' CURSOR KEY  */

-        break;

-    case '1':

-        break;

-    case '2':

-        break;

-    case '3':

-        break;

-    case '4':

-        break;

-    case '5':

-        break;

-    case 'A':

-        break;

-    case 'B':

-        break;

-    case 'C':

-        break;

-    case 'D':

-        break;

-    case 'E':

-        break;

-    case 'F':

-        break;

-    case 'G':

-        break;

-    case 'H':

-		  WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L);

-        break;

-    case 'J':

-		  WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL);

-        break;

-    case 'K':

-        break;

-    case 'Q':

-		  hWndStat = CreateWindow("STATIC", "Static #1",

-            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE, 

-            			230, 20, 80, 20, hWndMain, 1000, hInst, NULL);

-        break;

-    case 'W':

-		  hWndChk = CreateWindow("BUTTON", "CheckBox #1",

-                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX,

-						  230, 90, 120, 20, hWndMain, 1002, hInst, NULL);

-        break;

-    case 'R':

-		  hWndRadio = CreateWindow("BUTTON", "RadioBut #1",

-                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON,

-						  230, 120, 120, 20, hWndMain, 1003, hInst, NULL);

-		  SendMessage(hWndRadio, BM_SETCHECK, 0, 0L);

-        break;

-    case 'T':

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item");

-        break;

-    case 'Y':

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6");

-		  SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L);

-		  SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6");

-		  wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6");

-		  sprintf(C, "LB_FINDSTRING returned #%u   ", wRet);

-		  TextOut(hDCMain, 25, 300, C, strlen(C));

-		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);

-		  sprintf(C, "LB_GETCURSEL returned #%u   ", wRet);

-		  TextOut(hDCMain, 25, 320, C, strlen(C));

-        break;

-    case 'U':

-		  SendMessage(hWndLBox, LB_DELETESTRING, 3, 0L);

-        break;

-    case 'I':

-		  SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L);

-        break;

-    case 'O':

-		  C2[0] = '\0';

-		  SendMessage(hWndLBox, LB_GETTEXT, 2, (DWORD)C2);

-		  sprintf(C, "LB_GETTEXT returned '%s'   ", C2);

-		  TextOut(hDCMain, 25, 320, C, strlen(C));

-        break;

-    case 'P':

-		  SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*");

-        break;

-    case 'Z':

-		  ShowWindow(hWndScrol, SW_HIDE);

-        break;

-    case 'X':

-		  ShowWindow(hWndScrol, SW_SHOW);

-        break;

-     case 'V':

-		  hWndCBox = CreateWindow("COMBOBOX", "Combo #1",

-                    WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWNLIST,

-						  230, 270, 150, 100, hWndMain, 1006, hInst, NULL);

-		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");

-		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");

-        break;

-     case 'N':

-		  hWndCBox = CreateWindow("COMBOBOX", "Combo #2",

-                    WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWN,

-						  30, 270, 150, 100, hWndMain, 1007, hInst, NULL);

-		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");

-		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");

-        break;

-

-    case VK_F10:             /* 'F10' FUNCTION KEY */

-        break;

-    case VK_F11:             /* 'F11' FUNCTION KEY */

-        break;

-    }

-return(TRUE);

-}

-

-

-

-void DoPaint(HWND hWnd)

-{

-HDC         hDC;

-RECT        rect;

-PAINTSTRUCT ps;

-char   C[80];

-GetClientRect(hWnd, &rect);

-hDC = BeginPaint(hWnd, &ps);

-FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));

-InflateRect(&rect, -3, -3);

-FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));

-InflateRect(&rect, -10, -10);

-FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH));

-sprintf(C, "Wine Testing !!!");

-TextOut(hDC, 25, 25, C, strlen(C));

-ReleaseDC(hWnd,hDC);

-EndPaint(hWnd,&ps);

-}

-

-

-/**********************************************************************/

-

-

-void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)

-{

-char  C[12];

-SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE);

-SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE);

-itoa(VAL, C, 10);

-//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);

-}

-

-

-

-void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)

-{

-char  C[12];

-SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE);

-SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE);

-itoa(VAL, C, 10);

-//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);

-}

-

-

-

-void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)

-{

-char  C[12];

-int   VAL;

-int   VAL2;

-int	Step = 100;

-if (MAX < 1000)	Step = 10;

-if (MAX < 100)		Step = MAX / 10;

-VAL = *(V);

-VAL2 = VAL;

-switch (wParam)

-    {

-    case SB_LINEUP:

-			VAL++;

-			break;

-    case SB_LINEDOWN:

-			VAL--;

-			break;

-    case SB_PAGEUP:

-			VAL += Step;

-			break;

-    case SB_PAGEDOWN:

-			VAL -= Step;

-			break;

-    case SB_THUMBTRACK:

-    case SB_THUMBPOSITION:

-		   VAL = -(LOWORD(lParam));

-			break;

-	}

-if (VAL > MAX)		VAL = MAX;

-if (VAL < MIN)		VAL = MIN;

-if (VAL != VAL2)

-    {

-    SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE);

-    ltoa(VAL, C, 10);

-//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);

-    }

-*(V) = VAL;

-}

-

-

-void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)

-{

-char  C[12];

-int   VAL;

-int   VAL2;

-int	Step = 100;

-if (MAX < 1000)	Step = 10;

-if (MAX < 100)		Step = MAX / 10;

-VAL = *(V);

-VAL2 = VAL;

-switch (wParam)

-    {

-    case SB_LINEUP:

-			VAL--;

-			break;

-    case SB_LINEDOWN:

-			VAL++;

-			break;

-    case SB_PAGEUP:

-			VAL -= Step;

-			break;

-    case SB_PAGEDOWN:

-			VAL += Step;

-			break;

-    case SB_THUMBTRACK:

-    case SB_THUMBPOSITION:

-		   VAL = (LOWORD(lParam));

-			break;

-	}

-if (VAL > MAX)		VAL = MAX;

-if (VAL < MIN)		VAL = MIN;

-if (VAL != VAL2)

-    {

-    SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE);

-    ltoa(VAL, C, 10);

-//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);

-    }

-*(V) = VAL;

-}

-

-

-/**********************************************************************/

-

-

-
\ No newline at end of file
diff --git a/test/martin_ship2/widget.def b/test/martin_ship2/widget.def
deleted file mode 100755
index 9a5296b..0000000
--- a/test/martin_ship2/widget.def
+++ /dev/null
@@ -1,23 +0,0 @@
-;**********************************************************************

-;*               Copyright (c) 1991 by TRG ELECTRONIK                 *

-;**********************************************************************

-

-

-NAME         WineTest

-DESCRIPTION  'Drink Inventry Controler'

-STUB         'WINSTUB.EXE'

-CODE         PRELOAD MOVEABLE DISCARDABLE

-DATA         PRELOAD MOVEABLE MULTIPLE

-EXETYPE      WINDOWS

-SEGMENTS

-       DRINK_TEXT  PRELOAD MOVEABLE DISCARDABLE

-

-HEAPSIZE     20000

-STACKSIZE    8192

-

-EXPORTS      WndProc             @1

-             About_Proc          @3

-

-

-

-
\ No newline at end of file
diff --git a/test/martin_ship2/widget.h b/test/martin_ship2/widget.h
deleted file mode 100755
index a0d9f01..0000000
--- a/test/martin_ship2/widget.h
+++ /dev/null
@@ -1,250 +0,0 @@
-/**********************************************************************

-*               Copyright (c) 1991 by TRG ELECTRONIK                 *

-**********************************************************************/

-

-#define szAppName "widgetClass"

-

-#define IDNULL         -1

-

-#define IDSCLOSE       20

-#define IDSOKCLOSE     21

-#define IDSSAVE        22

-#define IDSOKSAVE      23

-#define IDINFO         24

-#define IDSAVE         25

-#define IDDELETE       26

-#define IDNEW          27

-

-

-#define IDBUSER        30

-#define IDBUSER1       31

-#define IDBUSER2       32

-#define IDBUSER3       33

-#define IDBUSER4       34

-#define IDBUSER5       35

-#define IDBUSER6       36

-#define IDBUSER7       37

-#define IDBUSER8       38

-#define IDBUSER9       39

-

-#define IDDJOBNAME     50

-#define IDDPRINTER     51

-

-#define IDSETUP        60

-

-

-#define IDI_MKSICON    99

-

-/******************************************/

-

-#define MID_NEW        100

-#define MID_OPEN       101

-#define MID_SAVE       102

-#define MID_SAVEAS     103

-#define MID_PRINT      104

-#define MID_PRSETUP    105

-#define MID_STATUS     106

-#define MID_QUIT       107

-

-#define MID_CUT        121

-#define MID_COPY       122

-#define MID_PASTE      123

-#define MID_CLEAR      124

-#define MID_COPYTO     125

-#define MID_PASTEFROM  126

-

-#define MID_NEWPROD    140

-#define MID_NEWBEER    141

-#define MID_USERCFG    142

-

-#define MID_POREGIE    151

-#define MID_POBIERE    152

-#define MID_DAYSTOCK   153

-#define MID_RESERVE    154

-#define MID_COCKSALE   155

-#define MID_DRYSALE    156

-#define MID_COMPILE    157

-#define MID_RECETTES   158

-#define MID_HD         159

-#define MID_TESTPRN    160

-#define MID_INFODSK    161

-#define MID_SHARP      162

-#define MID_PASSWORD   163

-

-/******************************************/

-

-#define IDDTEXT        200

-#define IDDTXT1        201

-#define IDDTXT2        202

-#define IDDTXT3        203

-#define IDDTXT4        204

-#define IDDTXT5        205

-#define IDDTXT6        206

-#define IDDTXT7        207

-#define IDDTXT8        208

-#define IDDTXT9        209

-#define IDDTXT10       210

-#define IDDTXT11       211

-#define IDDTXT12       212

-#define IDDTXT13       213

-#define IDDTXT14       214

-#define IDDTXT15       215

-#define IDDTXT16       216

-#define IDDTXT17       217

-#define IDDTXT18       218

-#define IDDTXT19       219

-

-#define IDDBUTTON1     220

-#define IDDBUTTON2     221

-#define IDDBUTTON3     222

-#define IDDBUTTON4     223

-#define IDDBUTTON5     224

-#define IDDBUTTON6     225

-#define IDDBUTTON7     226

-#define IDDBUTTON8     227

-#define IDDBUTTON9     228

-#define IDDBUTTON10    229

-

-#define IDDCHKBOX1     240

-#define IDDCHKBOX2     241

-#define IDDCHKBOX3     242

-#define IDDCHKBOX4     243

-#define IDDCHKBOX5     244

-#define IDDCHKBOX6     245

-#define IDDCHKBOX7     246

-#define IDDCHKBOX8     247

-#define IDDCHKBOX9     248

-#define IDDCHKBOX10    249

-

-#define IDDSCROLL1     250

-#define IDDSCROLL2     251

-#define IDDSCROLL3     252

-#define IDDSCROLL4     253

-#define IDDSCROLL5     254

-#define IDDSCROLL6     255

-#define IDDSCROLL7     256

-#define IDDSCROLL8     257

-

-#define IDDSTR1        2000

-#define IDDSTR2        2001

-#define IDDSTR3        2002

-#define IDDSTR4        2003

-#define IDDSTR5        2004

-#define IDDSTR6        2005

-#define IDDSTR7        2006

-#define IDDSTR8        2007

-#define IDDSTR9        2008

-#define IDDSTR10       2009

-#define IDDSTR11       2010

-#define IDDSTR12       2011

-#define IDDSTR13       2012

-#define IDDSTR14       2013

-#define IDDSTR15       2014

-#define IDDSTR16       2015

-#define IDDSTR17       2016

-#define IDDSTR18       2017

-#define IDDSTR19       2018

-#define IDDSTR20       2019

-#define IDDSTR21       2020

-#define IDDSTR22       2021

-#define IDDSTR23       2022

-#define IDDSTR24       2023

-#define IDDSTR25       2024

-#define IDDSTR26       2025

-#define IDDSTR27       2026

-#define IDDSTR28       2027

-#define IDDSTR29       2028

-#define IDDSTR30       2029

-#define IDDSTR31       2030

-#define IDDSTR32       2031

-#define IDDSTR33       2032

-#define IDDSTR34       2033

-#define IDDSTR35       2034

-#define IDDSTR36       2035

-#define IDDSTR37       2036

-#define IDDSTR38       2037

-#define IDDSTR39       2038

-#define IDDSTR40       2039

-#define IDDSTR41       2040

-#define IDDSTR42       2041

-#define IDDSTR43       2042

-#define IDDSTR44       2043

-#define IDDSTR45       2044

-#define IDDSTR46       2045

-#define IDDSTR47       2046

-#define IDDSTR48       2047

-#define IDDSTR49       2048

-#define IDDSTR50       2049

-#define IDDSTR51       2050

-#define IDDSTR52       2051

-#define IDDSTR53       2052

-#define IDDSTR54       2053

-#define IDDSTR55       2054

-#define IDDSTR56       2055

-#define IDDSTR57       2056

-#define IDDSTR58       2057

-#define IDDSTR59       2058

-#define IDDSTR60       2059

-#define IDDSTR61       2060

-#define IDDSTR62       2061

-#define IDDSTR63       2062

-#define IDDSTR64       2063

-#define IDDSTR65       2064

-#define IDDSTR66       2065

-#define IDDSTR67       2066

-#define IDDSTR68       2067

-#define IDDSTR69       2068

-#define IDDSTR70       2069

-

-

-/******************************************/

-

-#define IDDDEFAULTS    1001

-#define IDDCHECKBOX    1002

-#define IDDNULL        1003

-#define IDDRBLEFT      1004

-#define IDDRBRIGHT     1005

-#define IDDRBCENTER    1006

-#define IDDLISTBOX     1007

-#define IDDSBH         1008

-#define IDDSBV         1009

-

-/******************************************/

-

-#define ABOUT_Dlg      2001

-#define NEW_Dlg        2002

-#define OPEN_Dlg       2003

-#define SAVE_Dlg       2004

-#define SAVEAS_Dlg     2005

-#define PRINT_Dlg      2006

-#define ABORT_Dlg      2007

-#define PRSETUP_Dlg    2008

-#define QUIT_Dlg       2009

-

-#define GETOBJ_Dlg     2020

-#define NEWPROD_Dlg    2021

-#define NEWBEER_Dlg    2022

-#define USERCFG_Dlg    2023

-#define POREGIE_Dlg    2024

-#define POBIERE_Dlg    2025

-#define PASSWORD_Dlg   2026

-#define TVQ_Dlg        2027

-

-#define LTEXTOK_Dlg    2070

-

-

-/******************************************/

-

-#define RED            0x000000FF

-#define GREEN          0x0000FF00

-#define BLUE           0x00FF0000

-#define CYAN           0x00FFFF00

-#define MAGENTA        0x00FF00FF

-#define BLACK          0x00000000

-#define WHITE          0x00FFFFFF

-#define GRAY           0x00808080

-#define LTGRAY         0x00C0C0C0

-#define DKGRAY         0x00404040

-

-

-
\ No newline at end of file
diff --git a/test/martin_ship2/widget.ic2 b/test/martin_ship2/widget.ic2
deleted file mode 100755
index 3e0e0d5..0000000
--- a/test/martin_ship2/widget.ic2
+++ /dev/null
Binary files differ
diff --git a/test/martin_ship2/widget.ic3 b/test/martin_ship2/widget.ic3
deleted file mode 100755
index db642dc..0000000
--- a/test/martin_ship2/widget.ic3
+++ /dev/null
Binary files differ
diff --git a/test/martin_ship2/widget.ico b/test/martin_ship2/widget.ico
deleted file mode 100755
index 824d52d..0000000
--- a/test/martin_ship2/widget.ico
+++ /dev/null
Binary files differ
diff --git a/test/martin_ship2/widget.rc b/test/martin_ship2/widget.rc
deleted file mode 100755
index 5a86c23..0000000
--- a/test/martin_ship2/widget.rc
+++ /dev/null
@@ -1,78 +0,0 @@
-/**********************************************************************

- *               Copyright (c) 1991 by TRG ELECTRONIK                 *

- *                                                                    *

- *                            widget.RC                               *

- * 		          widget RESSOURCES               	      *

- *                                                                    *

- **********************************************************************/

-

-#include <\BC\INCLUDE\WINDOWS.H>

-#include "widget.H"

-

-#define TABGRP      WS_TABSTOP | WS_GROUP

-#define LBSTYLES    WS_VSCROLL | WS_BORDER | WS_VISIBLE | LBS_SORT | TABGRP

-#define HSCROLL     WS_VISIBLE | SBS_HORZ | SBS_TOPALIGN    | TABGRP

-#define VSCROLL     WS_VISIBLE | SBS_VERT | SBS_LEFTALIGN   | TABGRP

-#define BLACKRECT   SS_BLACKRECT  | WS_VISIBLE | WS_GROUP

-#define WHITEFRAME  SS_WHITEFRAME | WS_VISIBLE | WS_GROUP

-

-

-ICON_1  ICON widget.ICO

-ICON_2  ICON widget.IC2

-ICON_3  ICON widget.IC3

-

-MENU_1 MENU

-BEGIN

-  POPUP "&File"

-  BEGIN

-    MENUITEM "&New",           MID_NEW

-    MENUITEM "&Open",          MID_OPEN

-    MENUITEM "&Save",          MID_SAVE

-    MENUITEM "Save &As",       MID_SAVEAS

-    MENUITEM SEPARATOR

-    MENUITEM "&Quit!",         MID_QUIT

-  END

-END

-

-

-

-

-ABOUT_Dlg DIALOG 100, 100, 154,  75

-STYLE WS_POPUP | WS_DLGFRAME

-BEGIN

-  ICON  "widget"                    -1,                                                       9,  23,   0,   0

-  ICON  "DKICON2"                    -1,                                                      30,  23,   0,   0

-  ICON  "DKICON3"                    -1,                                                      50,  23,   0,   0

-  CTEXT "About widget Inventory Controler"     -1,  0, 14,154, 8

-  CTEXT "Version 0.50"                        -1, 30, 34, 94, 8

-  CTEXT "Copyright © 1991, TRG Electronik"  -1,  0, 47,154, 9

-  DEFPUSHBUTTON "Ok"                        IDOK, 61, 59, 32, 14, WS_GROUP

-END

-

-

-LTEXTOK_Dlg DIALOG 100, 100, 300, 120

-STYLE  WS_POPUP | WS_DLGFRAME

-BEGIN

-  LTEXT "",                            IDDTXT1,   20, 15,118, 12

-  LTEXT "",                            IDDTXT2,   20, 30,118, 25

-  LTEXT "",                            IDDTXT3,   20, 45,118, 35

-  LTEXT "",                            IDDTXT3,   20, 60,118, 35

-  DEFPUSHBUTTON "OK",                  IDOK,     150, 85, 40, 14, TABGRP

-END

-

-

-STRINGTABLE

-BEGIN

-IDDSTR1,    "Wine Test Program"

-IDDSTR2,    ""

-IDDSTR3,    ""

-IDDSTR4,    ""

-IDDSTR5,    ""

-IDDSTR6,    ""

-IDDSTR7,    ""

-IDDSTR8,    ""

-IDDSTR9,    ""

-IDDSTR10,   ""

-END

-

-
\ No newline at end of file
diff --git a/test/martin_ship4/widget.c b/test/martin_ship4/widget.c
deleted file mode 100755
index 4d2dfcf..0000000
--- a/test/martin_ship4/widget.c
+++ /dev/null
@@ -1,649 +0,0 @@
-/**********************************************************************

- *               Copyright (c) 1991 by TRG ELECTRONIK                 *

- *                                                                    *

- *                             widget.C                               *

- *              widget Inventory Controler   PART # 1                 *

- *                                                                    *

- **********************************************************************/

-

-#include <WINDOWS.H>

-#include "STDIO.h"

-#include "STDLIB.h"

-#include "STDARG.h"

-#include "STRING.H"

-

-#include "widget.H"

-#include "widget.VAR"

-#include "widget.P"

-

-#define NoREF(a) a=a

-

-HWND		hWndBut;

-HWND		hWndChk;

-HWND		hWndRadio;

-HWND		hWndLBox;

-HWND		hWndLBox2;

-HWND		hWndLBox3;

-HWND		hWndLBox4;

-HWND		hWndScrol;

-HWND		hWndScro2;

-HWND		hWndScro3;

-HWND		hWndStat;

-HWND		hWndEdit;

-HWND		hWndCBox;

-int		x, y;

-

-HBRUSH	hREDBrush;

-HBRUSH	hGREENBrush;

-HBRUSH	hBLUEBrush;

-HBRUSH	hGRAYBrush;

-HBITMAP  hBitMap;

-HBITMAP  hBitMap2;

-HBITMAP  hBitMap3;

-BITMAP   BitMap;

-

-/**********************************************************************/

-

-

-int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,

-                   LPSTR lpszCmdLine,int nCmdShow)

-{

-WNDCLASS  wndClass;

-MSG       msg;

-HWND      hWnd;

-HDC       hDC;

-char      C[40];

-int       X;

-NoREF(lpszCmdLine);

-if ( !hPrevInstance )

-    {

-    wndClass.style           = CS_HREDRAW | CS_VREDRAW ;

-    wndClass.lpfnWndProc     = (WNDPROC)WndProc;

-    wndClass.cbClsExtra      = 0;

-    wndClass.cbWndExtra      = 0;

-    wndClass.hInstance       = hInstance;

-    wndClass.hIcon           = LoadIcon(hInstance,(LPSTR)"ICON_1");

-    wndClass.hCursor         = LoadCursor(NULL, IDC_ARROW );

-    wndClass.hbrBackground   = GetStockObject(WHITE_BRUSH );

-    wndClass.lpszMenuName    = szAppName;

-    wndClass.lpszClassName   = szAppName;

-    if (!RegisterClass(&wndClass))

-        return FALSE;

-    }

-hWnd = CreateWindow(szAppName, "widget test program",

-         WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE, 50, 50,

-         400, 500, NULL, NULL, hInstance, NULL);

-hWndMain = hWnd;

-hInst = hInstance;

-hDCMain = GetDC(hWndMain);

-hREDBrush    = CreateSOLIDBrush(0x000000FF);

-hGREENBrush  = CreateSOLIDBrush(0x00007F00);

-hBLUEBrush   = CreateSOLIDBrush(0x00FF0000);

-hGRAYBrush   = CreateSOLIDBrush(0x00C0C0C0);

-

-InitWidgets();

-

-while (GetMessage(&msg, NULL, 0, 0))

-    {

-    TranslateMessage(&msg );

-    DispatchMessage(&msg );

-    }

-DeleteObject(hREDBrush);

-DeleteObject(hGREENBrush);

-DeleteObject(hBLUEBrush);

-DeleteObject(hGRAYBrush);

-if (hBitMap != NULL) DeleteObject(hBitMap);

-if (hBitMap2 != NULL) DeleteObject(hBitMap2);

-if (hBitMap3 != NULL) DeleteObject(hBitMap3);

-ReleaseDC(hWndMain, hDC);

-return(0);

-}

-

-

-void InitWidgets()

-{

-hWndBut = CreateWindow("BUTTON", "Button #1",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON, 

-            230, 40, 80, 30, hWndMain, 1001, hInst, NULL);

-hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,

-				200, 150, 15, 100, hWndMain, 1004, hInst, NULL);

-hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,

-				50, 150, 100, 15, hWndMain, 1005, hInst, NULL);

-hWndScro3 = CreateWindow("SCROLLBAR", "Scroll #3",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_SIZEBOX,

-				50, 180, 25, 25, hWndMain, 1006, hInst, NULL);

-x = y = 25;

-SetVertScroll(NULL, hWndScrol, 25, 0, 50);

-SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE);

-SetScrollPos(hWndScro2, SB_CTL, 25, TRUE);

-hWndLBox = CreateWindow("LISTBOX", "",

-            WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,

-				230, 160, 150, 100, hWndMain, 1004, hInst, NULL);

-SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1");

-hWndStat = CreateWindow("STATIC", "Static #1",

-            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_LEFT, 

-            30, 120, 150, 20, hWndMain, 1011, hInst, NULL);

-SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Left Text");

-hWndCBox = CreateWindow("COMBOBOX", "Combo #1",

-		WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,

-		230, 270, 150, 100, hWndMain, 1060, hInst, NULL);

-SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");

-SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");

-SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #3");

-SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #4");

-SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #5");

-SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #6");

-}

-

-

-

-long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam)

-{

-int	ShiftState;

-LPDRAWITEMSTRUCT dis;

-HDC      hMemDC;

-HBRUSH	hBrush;

-char	C[128];

-ShiftState = GetKeyState(VK_SHIFT);

-switch(Message)

-    {

-    case WM_COMMAND:

-		  if (LOWORD(lParam) != 0)

-			   {

-		  		sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam);

-		  		TextOut(hDCMain, 25, 280, C, strlen(C));

-			   }

-        break;

-

-    case WM_KEYDOWN:

-		  sprintf(C, "WM_KEYDOWN !!!");

-		  TextOut(hDCMain, 25, 40, C, strlen(C));

-		  KeyDown(hWnd, Message, wParam);

-        break;

-

-    case WM_CHAR:

-		  sprintf(C, "WM_CHAR !!!");

-		  TextOut(hDCMain, 25, 50, C, strlen(C));

-        break;

-

-    case WM_CTLCOLOR:

-		  switch(HIWORD(lParam))

-			   {

-				case CTLCOLOR_SCROLLBAR:

-                return(hBLUEBrush);

-				case CTLCOLOR_LISTBOX:

-		          SetBkColor((HDC)wParam, 0x00C0C000);

-                SetTextColor((HDC)wParam, 0x00FF0000);

-                return(hGREENBrush);

-				case CTLCOLOR_STATIC:

-		          SetBkColor((HDC)wParam, 0x00C0C0C0);

-                SetTextColor((HDC)wParam, 0x0000FFFF);

-                return(hREDBrush);

-				}

-        return((HBRUSH)NULL);

-

-    case WM_LBUTTONDOWN:

-        break;

-

-    case WM_LBUTTONUP:

-        break;

-

-    case WM_RBUTTONDOWN:

-        break;

-

-    case WM_RBUTTONUP:

-        break;

-

-    case WM_MOUSEMOVE:

-        break;

-

-    case WM_VSCROLL:

-		  sprintf(C, "WM_VSCROLL %X %lX !!!", wParam, lParam);

-		  TextOut(hDCMain, 25, 380, C, strlen(C));

-		  Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50);

-        break;

-

-    case WM_HSCROLL:

-		  sprintf(C, "WM_HSCROLL %X %lX !!!", wParam, lParam);

-		  TextOut(hDCMain, 25, 380, C, strlen(C));

-		  Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50);

-        break;

-

-    case WM_DRAWITEM:

-		  sprintf(C, "WM_DRAWITEM %X %lX !!!", wParam, lParam);

-		  TextOut(hDCMain, 25, 380, C, strlen(C));

-		  if (lParam == 0L) break;

-		  if (wParam == 0) break;

-		  dis = (LPDRAWITEMSTRUCT)lParam;

-		  if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1062)) {

-				hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));

-				SelectObject(dis->hDC, hBrush);

-				FillRect(dis->hDC, &dis->rcItem, hBrush);

-				sprintf(C, "Item #%X", dis->itemID);

-			   if (dis->itemData == NULL) break;

-				TextOut(dis->hDC, dis->rcItem.left,

-					dis->rcItem.top, C, strlen(C));

-				}

-		  if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1063)) {

-				hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));

-				SelectObject(dis->hDC, hBrush);

-				FillRect(dis->hDC, &dis->rcItem, hBrush);

-			   if (dis->itemData == NULL) break;

-				TextOut(dis->hDC, dis->rcItem.left,	dis->rcItem.top,

-					(LPSTR)dis->itemData, lstrlen((LPSTR)dis->itemData));

-				}

-		  if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1064)) {

-				hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));

-				SelectObject(dis->hDC, hBrush);

-				FillRect(dis->hDC, &dis->rcItem, hBrush);

-				hMemDC = CreateCompatibleDC(dis->hDC);

-				SelectObject(hMemDC,hBitMap);

-				BitBlt(dis->hDC, dis->rcItem.left,	dis->rcItem.top,

-						BitMap.bmWidth, BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);

-				DeleteDC(hMemDC);

-				sprintf(C, "Item #%X", dis->itemID);

-				TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth,

-					dis->rcItem.top, C, strlen(C));

-//			   if (dis->itemData == NULL) break;

-//				TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth,

-//						dis->rcItem.top, (LPSTR)dis->itemData,

-//						lstrlen((LPSTR)dis->itemData));

-				}

-        break;

-

-    case WM_PAINT:

-        DoPaint(hWnd);

-        break;

-

-    case WM_DESTROY:

-        PostQuitMessage(0);

-        break;

-

-    default:

-        return DefWindowProc(hWnd, Message, wParam, lParam);

-    }

-return(0);

-}

-

-

-

-BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam)

-{

-WORD			wRet;

-UINT			uRet;

-DWORD			dwRet;

-HDC      hMemDC;

-char			C[128];

-char			C2[64];

-NoREF(hWnd);

-NoREF(Message);

-sprintf(C, "KeyDown %x !!!", wParam);

-TextOut(hDCMain, 25, 100, C, strlen(C));

-switch (wParam)

-    {

-    case VK_HOME:            /* 'HOME' KEY         */

-        break;

-    case VK_LEFT:            /* 'LEFT' CURSOR KEY  */

-        break;

-    case VK_RIGHT:           /* 'RIGHT' CURSOR KEY */

-        break;

-    case VK_UP:              /* 'UP' CURSOR KEY    */

-        break;

-    case VK_DOWN:            /* 'DOWN' CURSOR KEY  */

-        break;

-    case VK_PRIOR:           /* 'PGUP' CURSOR KEY  */

-        break;

-    case VK_NEXT:            /* 'PGDN' CURSOR KEY  */

-        break;

-    case '1':

-        break;

-    case '2':

-		  hWndStat = CreateWindow("STATIC", "Static #2",

-            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_CENTER, 

-            			30, 150, 150, 20, hWndMain, 1012, hInst, NULL);

-		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Center Text");

-        break;

-    case '3':

-		  hWndStat = CreateWindow("STATIC", "Static #3",

-            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 

-            			30, 180, 150, 20, hWndMain, 1013, hInst, NULL);

-		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Right Text");

-        break;

-    case '4':

-		  hWndStat = CreateWindow("STATIC", "Static #4",

-            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE, 

-            			30, 210, 150, 20, hWndMain, 1014, hInst, NULL);

-		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_SIMPLE");

-        break;

-    case '5':

-		  hWndStat = CreateWindow("STATIC", "Static #5",

-            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_GRAYRECT, 

-            			30, 240, 150, 20, hWndMain, 1015, hInst, NULL);

-		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_GRAYRECT");

-        break;

-    case 'A':

-		  hWndStat = CreateWindow("STATIC", "Static #6",

-            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_BLACKRECT, 

-            			30, 240, 150, 20, hWndMain, 1016, hInst, NULL);

-		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_BLACKRECT");

-        break;

-    case 'C':

-		  if (hBitMap2 == NULL) {

-		  		hBitMap2 = LoadBitmap(hInst, "LBICON");

-		  		GetObject(hBitMap2, sizeof(BITMAP), (LPSTR)&BitMap);

-				}

-		  hMemDC = CreateCompatibleDC(hDCMain);

-		  SelectObject(hMemDC, hBitMap2);

-		  BitBlt(hDCMain, 10, 10, BitMap.bmWidth,

-						BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);

-		  DeleteDC(hMemDC);

-		  sprintf(C, "DrawBitmap");

-		  TextOut(hDCMain, 25, 320, C, strlen(C));

-        break;

-    case 'D':

-		  if (hBitMap3 == NULL) {

-		  		hBitMap3 = LoadBitmap(hInst, MAKEINTRESOURCE(3333));

-		  		GetObject(hBitMap3, sizeof(BITMAP), (LPSTR)&BitMap);

-				}

-		  hMemDC = CreateCompatibleDC(hDCMain);

-		  SelectObject(hMemDC, hBitMap3);

-		  BitBlt(hDCMain, 80, 10, BitMap.bmWidth,

-						BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);

-		  DeleteDC(hMemDC);

-		  sprintf(C, "DrawBitmap");

-		  TextOut(hDCMain, 25, 320, C, strlen(C));

-        break;

-    case 'F':

-		  MoveWindow(hWnd, 10, 10, 500, 600, TRUE);

-        break;

-    case 'G':

-		  MoveWindow(hWndBut, 20, 20, 100, 20, TRUE);

-        break;

-    case 'H':

-		  WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L);

-        break;

-    case 'J':

-		  WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL);

-        break;

-    case 'K':

-        break;

-    case 'Q':

-		  hWndChk = CreateWindow("BUTTON", "CheckBox #1",

-                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX,

-						  30, 300, 120, 20, hWndMain, 1020, hInst, NULL);

-        break;

-    case 'W':

-		  wRet = SendMessage(hWndChk , BM_GETCHECK, 0, 0L);

-		  SendMessage(hWndChk , BM_SETCHECK, wRet, 0L);

-        break;

-    case 'E':

-        break;

-    case 'R':

-		  hWndRadio = CreateWindow("BUTTON", "RadioBut #1",

-                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON,

-						  230, 120, 120, 20, hWndMain, 1003, hInst, NULL);

-		  SendMessage(hWndRadio, BM_SETCHECK, TRUE, 0L);

-        break;

-    case 'T':

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item");

-        break;

-    case 'Y':

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5");

-		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6");

-		  SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L);

-		  SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6");

-		  wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6");

-		  sprintf(C, "LB_FINDSTRING returned #%u   ", wRet);

-		  TextOut(hDCMain, 25, 300, C, strlen(C));

-		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);

-		  sprintf(C, "LB_GETCURSEL returned #%u   ", wRet);

-		  TextOut(hDCMain, 25, 320, C, strlen(C));

-        break;

-    case 'U':

-		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);

-		  SendMessage(hWndLBox, LB_DELETESTRING, wRet, 0L);

-		  SendMessage(hWndLBox, LB_SETCURSEL, wRet, 0L);

-        break;

-    case 'I':

-		  SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L);

-        break;

-    case 'O':

-		  C2[0] = '\0';

-		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);

-		  SendMessage(hWndLBox, LB_GETTEXT, wRet, (DWORD)C2);

-		  sprintf(C, "LB_GETTEXT #%d returned '%s'   ", wRet, C2);

-		  TextOut(hDCMain, 25, 320, C, strlen(C));

-        break;

-    case 'P':

-		  SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*");

-        break;

-    case 'Z':

-		  ShowWindow(hWndScrol, SW_HIDE);

-        break;

-    case 'X':

-		  ShowWindow(hWndScrol, SW_SHOW);

-        break;

-     case 'V':

-		  MoveWindow(hWndScrol, 120, 150, 15, 60, TRUE);

-        break;

-     case 'B':

-		  hWndCBox = CreateWindow("COMBOBOX", "Combo #2",

-					WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWN,

-					30, 270, 150, 100, hWndMain, 1061, hInst, NULL);

-		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");

-		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");

-		  SendMessage(hWndCBox, CB_DIR, 0, (DWORD)"*.*");

-        break;

-     case 'N':

-		  hWndLBox2 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |

-					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY,

-//					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,

-					30, 300, 150, 60, hWndMain, 1062, hInst, NULL);

-		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #1");

-		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #2");

-		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #3");

-		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #4");

-		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #5");

-		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #6");

-        break;

-     case 'M':

-		  hWndLBox3 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |

-					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY,

-//					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,

-					230, 300, 150, 60, hWndMain, 1063, hInst, NULL);

-		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1");

-		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2");

-		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3");

-		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4");

-		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5");

-		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6");

-		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #7");

-		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 1, 10L);

-		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 2, 20L);

-		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 3, 30L);

-		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 4, 40L);

-		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 5, 50L);

-        break;

-     case 'L':

-		  hBitMap = LoadBitmap(hInst, MAKEINTRESOURCE(3333));

-		  GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&BitMap);

-		  hWndLBox4 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |

-					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,

-					230, 380, 150, 60, hWndMain, 1064, hInst, NULL);

-		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1");

-		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2");

-		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3");

-		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4");

-		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5");

-		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6");

-		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 1, 10L);

-		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 2, 20L);

-		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 3, 30L);

-		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 4, 40L);

-		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 5, 50L);

-        break;

-

-    case VK_F10:             /* 'F10' FUNCTION KEY */

-        break;

-    case VK_F11:             /* 'F11' FUNCTION KEY */

-        break;

-    }

-return(TRUE);

-}

-

-

-

-void DoPaint(HWND hWnd)

-{

-HDC         hDC;

-RECT        rect;

-PAINTSTRUCT ps;

-char   C[80];

-GetClientRect(hWnd, &rect);

-hDC = BeginPaint(hWnd, &ps);

-FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));

-InflateRect(&rect, -3, -3);

-FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));

-InflateRect(&rect, -10, -10);

-FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH));

-sprintf(C, "Wine Testing !!!");

-TextOut(hDC, 25, 25, C, strlen(C));

-ReleaseDC(hWnd,hDC);

-EndPaint(hWnd,&ps);

-}

-

-

-HBRUSH CreateLTGRAYBrush()

-{

-return(CreateSOLIDBrush(0x00C0C0C0));

-}

-

-

-

-HBRUSH CreateSOLIDBrush(COLORREF Color)

-{

-LOGBRUSH logGRAYBrush;

-logGRAYBrush.lbStyle = BS_SOLID;

-logGRAYBrush.lbColor = Color;

-logGRAYBrush.lbHatch = NULL;

-return(CreateBrushIndirect(&logGRAYBrush));

-}

-

-

-

-/**********************************************************************/

-

-

-void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)

-{

-char  C[12];

-SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE);

-SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE);

-itoa(VAL, C, 10);

-//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);

-}

-

-

-

-void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)

-{

-char  C[12];

-SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE);

-SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE);

-itoa(VAL, C, 10);

-//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);

-}

-

-

-

-void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)

-{

-char  C[12];

-int   VAL;

-int   VAL2;

-int	Step = 100;

-if (MAX < 1000)	Step = 10;

-if (MAX < 100)		Step = MAX / 10;

-VAL = *(V);

-VAL2 = VAL;

-switch (wParam)

-    {

-    case SB_LINEUP:

-			VAL++;

-			break;

-    case SB_LINEDOWN:

-			VAL--;

-			break;

-    case SB_PAGEUP:

-			VAL += Step;

-			break;

-    case SB_PAGEDOWN:

-			VAL -= Step;

-			break;

-    case SB_THUMBTRACK:

-    case SB_THUMBPOSITION:

-		   VAL = -(LOWORD(lParam));

-			break;

-	}

-if (VAL > MAX)		VAL = MAX;

-if (VAL < MIN)		VAL = MIN;

-if (VAL != VAL2)

-    {

-    SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE);

-    ltoa(VAL, C, 10);

-//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);

-    }

-*(V) = VAL;

-}

-

-

-void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)

-{

-char  C[12];

-int   VAL;

-int   VAL2;

-int	Step = 100;

-if (MAX < 1000)	Step = 10;

-if (MAX < 100)		Step = MAX / 10;

-VAL = *(V);

-VAL2 = VAL;

-switch (wParam)

-    {

-    case SB_LINEUP:

-			VAL--;

-			break;

-    case SB_LINEDOWN:

-			VAL++;

-			break;

-    case SB_PAGEUP:

-			VAL -= Step;

-			break;

-    case SB_PAGEDOWN:

-			VAL += Step;

-			break;

-    case SB_THUMBTRACK:

-    case SB_THUMBPOSITION:

-		   VAL = (LOWORD(lParam));

-			break;

-	}

-if (VAL > MAX)		VAL = MAX;

-if (VAL < MIN)		VAL = MIN;

-if (VAL != VAL2)

-    {

-    SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE);

-    ltoa(VAL, C, 10);

-//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);

-    }

-*(V) = VAL;

-}

-

-

-/**********************************************************************/

-

-

-
\ No newline at end of file
diff --git a/test/martin_ship4/widget.exe b/test/martin_ship4/widget.exe
deleted file mode 100755
index 91ecd00..0000000
--- a/test/martin_ship4/widget.exe
+++ /dev/null
Binary files differ
diff --git a/test/widget.exe b/test/widget.exe
index 89837d5..6afbf24 100755
--- a/test/widget.exe
+++ b/test/widget.exe
Binary files differ
diff --git a/windows/Makefile b/windows/Makefile
index 812bd34..0c5d34a 100644
--- a/windows/Makefile
+++ b/windows/Makefile
@@ -2,7 +2,7 @@
 
 OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \
     	clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \
-	defwnd.o defdlg.o dialog.o focus.o
+	defwnd.o defdlg.o dialog.o focus.o scroll.o
 
 default: windows.o
 
diff --git a/windows/dialog.c b/windows/dialog.c
index e60b62d..108c964 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -6,10 +6,9 @@
 
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
-#include <stdlib.h>
-
 #include "windows.h"
 #include "dialog.h"
+#include "prototypes.h"
 #include "win.h"
 
 
@@ -29,7 +28,7 @@
     
       /* Calculate the dialog base units */
 
-    if (!(hdc = GetDC( 0 ))) return FALSE;
+    if (!(hdc = GetDC(GetDesktopWindow()))) return FALSE;
     GetTextMetrics( hdc, &tm );
     ReleaseDC( 0, hdc );
     xBaseUnit = tm.tmAveCharWidth;
@@ -79,15 +78,17 @@
 /***********************************************************************
  *           DIALOG_ParseTemplate
  *
- * Fill a DLGTEMPLATE structure from the dialog template.
+ * Fill a DLGTEMPLATE structure from the dialog template, and return
+ * a pointer to the first control.
  */
-static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result )
+static DLGCONTROLHEADER * DIALOG_ParseTemplate( LPCSTR template,
+					        DLGTEMPLATE * result )
 {
-    int i;
     unsigned char * p = (unsigned char *)template;
  
     result->header = (DLGTEMPLATEHEADER *)p;
     p += 13;
+
     result->menuName = p;
     if (*p == 0xff) p += 3;
     else p += strlen(p) + 1;
@@ -104,18 +105,8 @@
 	result->pointSize = *(WORD *)p;	p += sizeof(WORD);
 	result->faceName = p;           p += strlen(p) + 1;
     }
-    result->controls = NULL;
-    if (!result->header->nbItems) return;
-    result->controls = (DLGCONTROL *) malloc( result->header->nbItems * sizeof(DLGCONTROL) );
-    if (!result->controls) return;
 
-    for (i = 0; i < result->header->nbItems; i++)
-    {
-	result->controls[i].header = (DLGCONTROLHEADER *)p;
-	p = (char *)DIALOG_GetControl( result->controls[i].header,
-				      &result->controls[i].class,
-				      &result->controls[i].text );	
-    }
+    return (DLGCONTROLHEADER *)p;
 }
 
 
@@ -125,9 +116,6 @@
 #ifdef DEBUG_DIALOG
 static void DIALOG_DisplayTemplate( DLGTEMPLATE * result )
 {
-    int i;
-    DLGCONTROL * ctrl = result->controls;
-    
     printf( "DIALOG %d, %d, %d, %d\n", result->header->x, result->header->y,
 	    result->header->cx, result->header->cy );
     printf( " STYLE %08x\n", result->header->style );
@@ -138,18 +126,6 @@
     else printf( " MENU '%s'\n", result->menuName );
     if (result->header->style & DS_SETFONT)
 	printf( " FONT %d,'%s'\n", result->pointSize, result->faceName );
-
-    printf( " BEGIN\n" );
-
-    for (i = 0; i < result->header->nbItems; i++, ctrl++)
-    {
-	printf( "   %s '%s' %d, %d, %d, %d, %d, %08x\n",
-	        ctrl->class, ctrl->text, ctrl->header->id,
-	        ctrl->header->x, ctrl->header->y, ctrl->header->cx,
-	        ctrl->header->cy, ctrl->header->style );
-    }
-    
-    printf( " END\n" );
 }
 #endif  /* DEBUG_DIALOG */
 
@@ -187,7 +163,7 @@
     else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param);
     FreeResource( hmem );
 #else
-    hmem = RSC_LoadResource( hInst, dlgTemplate, 0x8005, &size );
+    hmem = RSC_LoadResource( hInst, dlgTemplate, NE_RSCTYPE_DIALOG, &size );
     data = (LPCSTR) GlobalLock( hmem );
     hwnd = CreateDialogIndirectParam( hInst, data, owner, dlgProc, param );
     GlobalFree( hmem );
@@ -212,31 +188,39 @@
 HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
 			        HWND owner, FARPROC dlgProc, LPARAM param )
 {
-    HMENU hMenu = 0;
+    HMENU hMenu;
     HFONT hFont = 0;
     HWND hwnd;
     WND * wndPtr;
+    int i;
     DLGTEMPLATE template;
+    DLGCONTROLHEADER * header;
     DIALOGINFO * dlgInfo;
     WORD xUnit = xBaseUnit;
     WORD yUnit = yBaseUnit;
-    
-    if (!dlgTemplate) return 0;
-    DIALOG_ParseTemplate( dlgTemplate, &template );
 
+      /* Parse dialog template */
+
+    if (!dlgTemplate) return 0;
+    header = DIALOG_ParseTemplate( dlgTemplate, &template );
 #ifdef DEBUG_DIALOG
     DIALOG_DisplayTemplate( &template );
 #endif    
 
       /* Load menu */
 
-    if (template.menuName[0])
+    switch (template.menuName[0])
     {
-	if (template.menuName[0] != 0xff) 
-	    hMenu = LoadMenu( hInst, template.menuName );
-	else
-	    hMenu = LoadMenu( hInst, MAKEINTRESOURCE( template.menuName[1] +
+      case 0x00:
+	  hMenu = 0;
+	  break;
+      case 0xff:
+	  hMenu = LoadMenu( hInst, MAKEINTRESOURCE( template.menuName[1] +
 						   256*template.menuName[2] ));
+	  break;
+      default:
+	  hMenu = LoadMenu( hInst, template.menuName );
+	  break;
     }
 
       /* Create custom font if needed */
@@ -252,7 +236,7 @@
 	    HFONT oldFont;
 	    HDC hdc;
 
-	    hdc = GetDC( 0 );
+	    hdc = GetDC(GetDesktopWindow());
 	    oldFont = SelectObject( hdc, hFont );
 	    GetTextMetrics( hdc, &tm );
 	    SelectObject( hdc, oldFont );
@@ -261,11 +245,11 @@
 	    yUnit = tm.tmHeight;
 	}
     }
-
+    
       /* Create dialog main window */
 
     hwnd = CreateWindow( template.className, template.caption,
-			 template.header->style & ~WS_VISIBLE,
+			 template.header->style,
 			 template.header->x * xUnit / 4,
 			 template.header->y * yUnit / 8,
 			 template.header->cx * xUnit / 4,
@@ -276,27 +260,42 @@
     {
 	if (hFont) DeleteObject( hFont );
 	if (hMenu) DestroyMenu( hMenu );
-	if (template.controls) free( template.controls );
 	return 0;
     }
 
       /* Create control windows */
 
-    if (hwnd && template.header->nbItems)
+#ifdef DEBUG_DIALOG
+    printf( " BEGIN\n" );
+#endif	
+
+    for (i = 0; i < template.header->nbItems; i++)
     {
-	int i;
-	DLGCONTROL * ctrl = template.controls;
-	for (i = 0; i < template.header->nbItems; i++, ctrl++)
-	{
-	    CreateWindowEx( WS_EX_NOPARENTNOTIFY, 
-			    ctrl->class, ctrl->text, ctrl->header->style,
-			    ctrl->header->x * xUnit / 4,
-			    ctrl->header->y * yUnit / 8,
-			    ctrl->header->cx * xUnit / 4,
-			    ctrl->header->cy * yUnit / 8,
-			    hwnd, ctrl->header->id, hInst, NULL );
-	}
-    }
+	DLGCONTROLHEADER * next_header;
+	LPSTR class, text;
+	next_header = DIALOG_GetControl( header, &class, &text );
+
+#ifdef DEBUG_DIALOG
+	printf( "   %s '%s' %d, %d, %d, %d, %d, %08x\n",
+	        class, text, header->id, header->x, header->y, header->cx,
+	        header->cy, header->style );
+#endif
+	if ((strcmp(class, "STATIC") == 0) & ((header->style & SS_ICON) == SS_ICON)) {
+	    header->cx = 32;
+	    header->cy = 32;
+	    }
+	header->style |= WS_CHILD;
+	CreateWindowEx( WS_EX_NOPARENTNOTIFY, 
+		        class, text, header->style,
+		        header->x * xUnit / 4, header->y * yUnit / 8,
+		        header->cx * xUnit / 4, header->cy * yUnit / 8,
+		        hwnd, header->id, hInst, NULL );
+	header = next_header;
+    }    
+
+#ifdef DEBUG_DIALOG
+    printf( " END\n" );
+#endif	
     
       /* Initialise dialog extra data */
 
@@ -318,35 +317,24 @@
     if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ))
 	SetFocus( dlgInfo->hwndFocus );
 
-      /* Display dialog */
-
-    if (template.header->style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
-    
-    if (template.controls) free( template.controls );
     return hwnd;
 }
 
 
 /***********************************************************************
- *           DialogBox   (USER.87)
+ *           DIALOG_DoDialogBox
  */
-int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate,
-	       HWND owner, FARPROC dlgProc )
+static int DIALOG_DoDialogBox( HWND hwnd )
 {
-    HWND hwnd;
     WND * wndPtr;
     DIALOGINFO * dlgInfo;
     MSG msg;
     int retval;
 
-#ifdef DEBUG_DIALOG
-    printf( "DialogBox: %d,'%s',%d,%p\n", hInst, dlgTemplate, owner, dlgProc );
-#endif
-
-    hwnd = CreateDialog( hInst, dlgTemplate, owner, dlgProc );
-    if (!hwnd) return -1;
-    wndPtr = WIN_FindWndPtr( hwnd );
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1;
     dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
+    ShowWindow( hwnd, SW_SHOW );
+
     while (GetMessage (&msg, 0, 0, 0))
     {
 	if (!IsDialogMessage( hwnd, &msg))
@@ -363,6 +351,61 @@
 
 
 /***********************************************************************
+ *           DialogBox   (USER.87)
+ */
+int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate,
+	       HWND owner, FARPROC dlgProc )
+{
+    return DialogBoxParam( hInst, dlgTemplate, owner, dlgProc, 0 );
+}
+
+
+/***********************************************************************
+ *           DialogBoxParam   (USER.239)
+ */
+int DialogBoxParam( HINSTANCE hInst, LPCSTR dlgTemplate,
+		    HWND owner, FARPROC dlgProc, LPARAM param )
+{
+    HWND hwnd;
+    
+#ifdef DEBUG_DIALOG
+    printf( "DialogBoxParam: %d,'%s',%d,%p,%d\n",
+	    hInst, dlgTemplate, owner, dlgProc, param );
+#endif
+    hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param );
+    if (hwnd) return DIALOG_DoDialogBox( hwnd );
+    return -1;
+}
+
+
+/***********************************************************************
+ *           DialogBoxIndirect   (USER.218)
+ */
+int DialogBoxIndirect( HINSTANCE hInst, HANDLE dlgTemplate,
+		       HWND owner, FARPROC dlgProc )
+{
+    return DialogBoxIndirectParam( hInst, dlgTemplate, owner, dlgProc, 0 );
+}
+
+
+/***********************************************************************
+ *           DialogBoxIndirectParam   (USER.240)
+ */
+int DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate,
+			    HWND owner, FARPROC dlgProc, LPARAM param )
+{
+    HWND hwnd;
+    LPCSTR ptr;
+
+    if (!(ptr = GlobalLock( dlgTemplate ))) return -1;
+    hwnd = CreateDialogIndirectParam( hInst, ptr, owner, dlgProc, param );
+    GlobalUnlock( dlgTemplate );
+    if (hwnd) return DIALOG_DoDialogBox( hwnd );
+    return -1;
+}
+
+
+/***********************************************************************
  *           EndDialog   (USER.88)
  */
 void EndDialog( HWND hwnd, short retval )
diff --git a/windows/event.c b/windows/event.c
index f9c5e21..3130189 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -16,8 +16,7 @@
 
 
 #define NB_BUTTONS      3     /* Windows can handle 3 buttons */
-#define DBLCLICK_TIME   300   /* Max. time for a double click (milliseconds) */
-
+static WORD dblclick_time = 300; /* Max. time for a double click (milliseconds) */
 
   /* Event handlers */
 static void EVENT_expose();
@@ -191,7 +190,7 @@
     {  /* Check if double-click */
 	prevTime = lastClickTime[buttonNum];
 	lastClickTime[buttonNum] = event->time;
-	if (event->time - prevTime < DBLCLICK_TIME)
+	if (event->time - prevTime < dblclick_time)
 	{
 	    WND * wndPtr;
 	    CLASS * classPtr;
@@ -329,3 +328,24 @@
 
     captureWnd = 0;
 }
+
+/**********************************************************************
+ *		SetDoubleClickTime  (USER.20)
+ */
+void SetDoubleClickTime (WORD interval)
+{
+	if (interval == 0)
+		dblclick_time = 500;
+	else
+		dblclick_time = interval;
+}		
+
+/**********************************************************************
+ *		GetDoubleClickTime  (USER.21)
+ */
+WORD GetDoubleClickTime ()
+{
+	return ((WORD)dblclick_time);
+}		
+
+
diff --git a/windows/scroll.c b/windows/scroll.c
new file mode 100644
index 0000000..34d43fd
--- /dev/null
+++ b/windows/scroll.c
@@ -0,0 +1,171 @@
+/*
+ * Scroll windows and DCs
+ *
+ * Copyright  David W. Metcalfe, 1993
+ *
+ */
+
+static char Copyright[] = "Copyright  David W. Metcalfe, 1993";
+
+#include <stdlib.h>
+#include "windows.h"
+#include "gdi.h"
+
+static int RgnType;
+
+
+/*************************************************************************
+ *             ScrollWindow         (USER.61)
+ */
+
+void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect)
+{
+    HDC hdc;
+    HRGN hrgnUpdate;
+    RECT rc, cliprc;
+
+#ifdef DEBUG_SCROLL
+    printf("ScrollWindow: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", dx, dy,
+	   rect->left, rect->top, rect->right, rect->bottom);
+#endif
+
+    hdc = GetDC(hwnd);
+
+    if (rect == NULL)
+	GetWindowRect(hwnd, &rc);
+    else
+	CopyRect(&rc, rect);
+    if (clipRect == NULL)
+	GetWindowRect(hwnd, &cliprc);
+    else
+	CopyRect(&cliprc, clipRect);
+
+    hrgnUpdate = CreateRectRgn(0, 0, 0, 0);
+    ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL);
+    InvalidateRgn(hwnd, hrgnUpdate, TRUE);
+    ReleaseDC(hwnd, hdc);
+}
+
+
+/*************************************************************************
+ *             ScrollDC         (USER.221)
+ */
+
+BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT rc, LPRECT cliprc,
+	      HRGN hrgnUpdate, LPRECT rcUpdate)
+{
+    HRGN hrgnClip, hrgn1, hrgn2;
+    POINT src, dest;
+    short width, height;
+    DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
+
+#ifdef DEBUG_SCROLL
+    printf("ScrollDC: dx=%d, dy=%d, rc=%d,%d,%d,%d\n", dx, dy,
+	   rc->left, rc->top, rc->right, rc->bottom);
+#endif
+
+    if (rc == NULL)
+	return;
+
+    if (cliprc)
+    {
+	hrgnClip = CreateRectRgnIndirect(cliprc);
+	SelectClipRgn(hdc, hrgnClip);
+    }
+
+    if (dx > 0)
+    {
+	src.x = XDPTOLP(dc, rc->left);
+	dest.x = XDPTOLP(dc, rc->left + abs(dx));
+    }
+    else
+    {
+	src.x = XDPTOLP(dc, rc->left + abs(dx));
+	dest.x = XDPTOLP(dc, rc->left);
+    }
+    if (dy > 0)
+    {
+	src.y = YDPTOLP(dc, rc->top);
+	dest.y = YDPTOLP(dc, rc->top + abs(dy));
+    }
+    else
+    {
+	src.y = YDPTOLP(dc, rc->top + abs(dy));
+	dest.y = YDPTOLP(dc, rc->top);
+    }
+
+    width = rc->right - rc->left - abs(dx);
+    height = rc->bottom - rc->top - abs(dy);
+
+    if (!BitBlt(hdc, dest.x, dest.y, width, height, hdc, src.x, src.y, 
+		SRCCOPY))
+	return;
+
+    if (hrgnUpdate)
+    {
+	if (dx > 0)
+	    hrgn1 = CreateRectRgn(rc->left, rc->top, rc->left+dx, rc->bottom);
+	else if (dx < 0)
+	    hrgn1 = CreateRectRgn(rc->right+dx, rc->top, rc->right, 
+				  rc->bottom);
+	else
+	    hrgn1 = CreateRectRgn(0, 0, 0, 0);
+
+	if (dy > 0)
+	    hrgn2 = CreateRectRgn(rc->left, rc->top, rc->right, rc->top+dy);
+	else if (dy < 0)
+	    hrgn2 = CreateRectRgn(rc->left, rc->bottom+dy, rc->right, 
+				  rc->bottom);
+	else
+	    hrgn2 = CreateRectRgn(0, 0, 0, 0);
+
+	RgnType = CombineRgn(hrgnUpdate, hrgn1, hrgn2, RGN_OR);
+    }
+
+    if (rcUpdate)
+    {
+	SelectClipRgn(hdc, hrgnUpdate);
+	GetClipBox(hdc, rcUpdate);
+    }
+}
+
+
+/*************************************************************************
+ *             ScrollWindowEx       (USER.319)
+ */
+
+int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect,
+		   HRGN hrgnUpdate, LPRECT rcUpdate, WORD flags)
+{
+    HDC hdc;
+    RECT rc, cliprc;
+
+#ifdef DEBUG_SCROLL
+    printf("ScrollWindowEx: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", dx, dy,
+	   rect->left, rect->top, rect->right, rect->bottom);
+#endif
+
+    hdc = GetDC(hwnd);
+
+    if (rect == NULL)
+	GetWindowRect(hwnd, &rc);
+    else
+	CopyRect(&rc, rect);
+    if (clipRect == NULL)
+	GetWindowRect(hwnd, &cliprc);
+    else
+	CopyRect(&cliprc, clipRect);
+
+    ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate);
+
+    if (flags | SW_INVALIDATE)
+    {
+	InvalidateRgn(hwnd, hrgnUpdate, FALSE);
+
+	if (flags | SW_ERASE)
+	    SendMessage(hwnd, WM_ERASEBKGND, (WORD)hdc, (LONG)NULL);
+    }
+
+    ReleaseDC(hwnd, hdc);
+    return RgnType;
+}
diff --git a/windows/win.c b/windows/win.c
index 3e50a37..d7fe3a2 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -52,9 +52,11 @@
     WND * wndPtr;
     
     if (!hwnd) hwnd = firstWindow;
-    while (hwnd)
+    for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
     {
 	if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+	if (!wndPtr || !wndPtr->winWidget) continue;
+	if (!XtIsRealized( wndPtr->winWidget )) continue;
 	if (wndPtr->hrgnUpdate) return hwnd;
 	if (wndPtr->hwndChild)
 	{
@@ -62,7 +64,6 @@
 	    if ((child = WIN_FindWinToRepaint( wndPtr->hwndChild )))
 		return child;
 	}
-	hwnd = wndPtr->hwndNext;
     }
     return 0;
 }
@@ -122,8 +123,8 @@
     if (y == CW_USEDEFAULT) y = 0;
     if (width == CW_USEDEFAULT) width = 600;
     if (height == CW_USEDEFAULT) height = 400;
-    if (!width) width = 1;
-    if (!height) height = 1;
+    if (width == 0) width = 1;
+    if (height == 0) height = 1;
 
       /* Find the parent and class */
 
@@ -135,9 +136,10 @@
     }
     else if (style & WS_CHILD) return 0;  /* WS_CHILD needs a parent */
 
-    if (!(class = CLASS_FindClassByName( className, &classPtr )))
+    if (!(class = CLASS_FindClassByName( className, &classPtr ))) {
+	printf("CreateWindow BAD CLASSNAME '%s' !\n", className);
 	return 0;
-    
+	}    
       /* Create the window structure */
 
     hwnd = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra);
@@ -250,6 +252,8 @@
 						    formWidgetClass,
 						    wndPtr->shellWidget,
 						    NULL );
+/*	wndPtr->winWidget = wndPtr->compositeWidget; */
+	wndPtr->winWidget = wndPtr->shellWidget;
 	if (wndPtr->wIDmenu == 0)
 	{
 	    wndPtr->menuBarPtr = 
@@ -322,8 +326,13 @@
     if (wmcreate == -1)
     {
 	  /* Abort window creation */
+
+	if (parent) parentPtr->hwndChild = wndPtr->hwndNext;
+	else firstWindow = wndPtr->hwndNext;
 	if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
 	else XtDestroyWidget( wndPtr->winWidget );
+	if (wndPtr->hdc) DeleteDC( wndPtr->hdc );
+	classPtr->cWindows--;
 	USER_HEAP_FREE( hwnd );
 	return 0;
     }
@@ -446,28 +455,32 @@
 		      XtNwidth, &width,
 		      XtNheight, &height,
 		      NULL );
-	SendMessage( hwnd, WM_SIZE, SIZE_RESTORED, 
-		     (width & 0xffff) | (height << 16) );
-	SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 );
-/*
-	printf("ShowWindow(%X, %X); !\n", hwnd, cmd);
-*/
 	switch(cmd)
 	    {
 	    case SW_HIDE:
 		XtSetMappedWhenManaged(wndPtr->winWidget, FALSE);
+	    	wndPtr->dwStyle &= (WS_VISIBLE ^ 0xFFFFFFFL);
+		SendMessage( hwnd, WM_SHOWWINDOW, FALSE, 0 );
 		break;
-	    case SW_SHOWNA:
 	    case SW_SHOWMINNOACTIVE:
-	    case SW_SHOWNOACTIVATE:
+	    case SW_SHOWMINIMIZED:
 	    case SW_MINIMIZE:
+	    	wndPtr->dwStyle |= WS_ICONIC;
+	    	goto WINVisible;
+	    case SW_SHOWNA:
+	    case SW_SHOWNOACTIVATE:
 	    case SW_MAXIMIZE:
 	    case SW_SHOWMAXIMIZED:
-	    case SW_SHOWMINIMIZED:
 	    case SW_SHOW:
 	    case SW_NORMAL:
 	    case SW_SHOWNORMAL:
+	    	wndPtr->dwStyle &= (WS_ICONIC ^ 0xFFFFFFFL);
+WINVisible:
 		XtSetMappedWhenManaged(wndPtr->winWidget, TRUE);
+	    	wndPtr->dwStyle |= WS_VISIBLE;
+		SendMessage( hwnd, WM_SIZE, SIZE_RESTORED, 
+			(width & 0xffff) | (height << 16) );
+		SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 );
 		break;
 	    default:
 		break;
@@ -478,6 +491,42 @@
 
 
 /***********************************************************************
+ *           CloseWindow   (USER.43)
+ */
+void CloseWindow(HWND hWnd)
+{
+    WND * wndPtr = WIN_FindWndPtr(hWnd);
+    if (wndPtr->dwStyle & WS_CHILD) return;
+    ShowWindow(hWnd, SW_MINIMIZE);
+    PostMessage(hWnd, WM_CLOSE, 0, 0L);
+}
+
+ 
+ 
+/***********************************************************************
+ *           OpenIcon   (USER.44)
+ */
+BOOL OpenIcon(HWND hWnd)
+{
+    WND * wndPtr = WIN_FindWndPtr(hWnd);
+    if (!IsIconic(hWnd)) return FALSE;
+    ShowWindow(hWnd, SW_SHOWNORMAL);
+    return(TRUE);
+}
+
+ 
+ 
+/***********************************************************************
+ *           FindWindow   (USER.50)
+ */
+HWND FindWindow(LPSTR ClassMatch, LPSTR TitleMatch)
+{
+    return((HWND)NULL);
+}
+
+ 
+ 
+/***********************************************************************
  *           MoveWindow   (USER.56)
  */
 void MoveWindow(HWND hWnd, short x, short y, short w, short h, BOOL bRepaint)
@@ -508,7 +557,9 @@
 void UpdateWindow( HWND hwnd )
 {
     if (GetUpdateRect( hwnd, NULL, FALSE )) 
-	SendMessage( hwnd, WM_PAINT, 0, 0 );
+    {
+	if (IsWindowVisible( hwnd )) SendMessage( hwnd, WM_PAINT, 0, 0 );
+    }
 }
 
 /**********************************************************************
@@ -578,17 +629,17 @@
     WND * wndPtr = WIN_FindWndPtr( hWnd );
     if (wndPtr) 
     {
-	if ((wFlag & SWP_NOMOVE) == 0) {
+	if ((wFlag & SWP_NOMOVE) != SWP_NOMOVE) {
 	    wndPtr->rectClient.left   = x;
 	    wndPtr->rectClient.top    = y;
 	    XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y, NULL );
 	    }
-	if ((wFlag & SWP_NOSIZE) == 0) {
+	if ((wFlag & SWP_NOSIZE) != SWP_NOSIZE) {
 	    wndPtr->rectClient.right  = x + w;
 	    wndPtr->rectClient.bottom = y + h;
 	    XtVaSetValues(wndPtr->winWidget, XtNwidth, w, XtNheight, h, NULL );
 	    }
-	if ((wFlag & SWP_NOREDRAW) == 0) {
+	if ((wFlag & SWP_NOREDRAW) != SWP_NOREDRAW) {
 	    InvalidateRect(hWnd, NULL, TRUE);
 	    UpdateWindow(hWnd);
 	    }
@@ -597,8 +648,10 @@
 	if ((wFlag & SWP_SHOWWINDOW) == SWP_SHOWWINDOW) 
 	    ShowWindow(hWnd, SW_SHOW);
 /*
-	if ((wFlag & SWP_NOACTIVATE) == 0) 
+	if ((wFlag & SWP_NOACTIVATE) != SWP_NOACTIVATE) 
 	    SetActiveWindow(hWnd);
+	if ((wFlag & SWP_NOZORDER) != SWP_NOZORDER) 
+	    { }
 */
 	printf("SetWindowPos(%X, %X, %d, %d, %d, %d, %X); !\n", 
 		hWnd, hWndInsertAfter, x, y, w, h, wFlag);
@@ -695,16 +748,21 @@
 }
 
 
-/*****************************************************************
- *         GetParent              (USER.46)
+/***********************************************************************
+ *           IsIconic   (USER.31)
  */
-HWND GetParent(HWND hwnd)
+BOOL IsIconic(HWND hWnd)
 {
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-    return wndPtr->hwndParent;
+    WND * wndPtr; 
+    if (hWnd == 0) return(FALSE);
+    wndPtr = WIN_FindWndPtr(hWnd);
+    if (wndPtr == 0) return(FALSE);
+    if (wndPtr->dwStyle & WS_ICONIC) return(TRUE);
+    return(FALSE);
 }
 
-
+ 
+ 
 /*******************************************************************
  *         GetWindowText          (USER.36)
  */
@@ -733,6 +791,26 @@
 
 
 /*******************************************************************
+ *         IsWindow    (USER.47)
+ */
+BOOL IsWindow( HWND hwnd )
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    return (wndPtr->dwMagic == WND_MAGIC);
+}
+
+
+/*****************************************************************
+ *         GetParent              (USER.46)
+ */
+HWND GetParent(HWND hwnd)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+    return wndPtr->hwndParent;
+}
+
+
+/*******************************************************************
  *         IsChild    (USER.48)
  */
 BOOL IsChild( HWND parent, HWND child )
@@ -755,6 +833,23 @@
 }
 
 
+/***********************************************************************
+ *           IsWindowVisible   (USER.49)
+ */
+BOOL IsWindowVisible(HWND hWnd)
+{
+    WND * wndPtr; 
+    if (hWnd == 0) return(FALSE);
+    wndPtr = WIN_FindWndPtr(hWnd);
+    if (wndPtr == 0) return(FALSE);
+    if (wndPtr->dwStyle & WS_VISIBLE) {
+	if (XtIsRealized(wndPtr->winWidget))  return(TRUE);
+    	}
+    return(FALSE);
+}
+
+ 
+ 
 /*******************************************************************
  *         GetTopWindow    (USER.229)
  */